@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 6.61 kB
JavaScript
import"../../../../core/has.js";import e from"../../../../core/Logger.js";import{isNone as t,isSome as r,applySome as n}from"../../../../core/maybe.js";import{a}from"../../../../chunks/vec2f64.js";import{s as c,l}from"../../../../chunks/vec3.js";import{f as o,c as s}from"../../../../chunks/vec3f64.js";import{f as i}from"../../../../chunks/vec4f64.js";import{create as f,center as m,height as p}from"../../../../geometry/support/aaBoundingBox.js";import{getGraphics3DSymbol as h}from"./graphicSymbolUtils.js";import{HUDMaterial as b}from"../../webgl-engine/materials/HUDMaterial.js";const u=e.getLogger("esri.views.3d.layers.graphics.labelPlacement");function g(e){const r=C(e);if(t(r))return null;const n=O(e,r);if(t(n))return null;const c=n.anchor,l=!!r.hasLabelVerticalOffset;return w({anchor:c,verticalOffset:r.verticalOffset,screenOffset:a(),centerOffset:i(0,0,0,-1),centerOffsetUnits:"world",translation:s(),elevationOffset:0,hasLabelVerticalOffset:l},n,e)}function O(e,t){if(t.anchor)return t;const r=e.labelClass.labelPlacement,n=x[r],a=n||P(e);return r&&!n&&u.warnOncePerTick(`the requested label placement '${r}' is currently unsupported in SceneView.`),v(a,e)}function d(e){const t=e.graphics3DGraphic.graphics3DSymbol,n=h(t);return r(n)?n.symbol.symbolLayers.getItemAt(0):null}function v(e,n){const a=n.graphics3DGraphic.graphic.geometry;if(t(a))return null;if(r(n.disablePlacement)){return n.labelClass.labelPlacement?(u.warnOncePerTick(y(e.placement,n.disablePlacement.logEntityDescription)),P(n)):e}const c=a.type;switch(c){case"polyline":case"polygon":case"extent":case"multipoint":if(n.labelClass.labelPlacement)return u.warnOncePerTick(y(e.placement,`'${c}' geometries`)),P(n);break;case"point":case"mesh":return e}return e}function y(e,t){return`the requested label placement '${e}' is currently unsupported for ${t} in SceneView.`}function P(e){const n=e.graphics3DGraphic.graphic.geometry;if(t(n))return null;switch(n.type){case"polyline":case"extent":case"multipoint":return{placement:"center-center",normalizedOffset:null,anchor:"center"};case"polygon":{const t=d(e);return r(t)&&"extrude"===t.type?x["above-center"]:{placement:"center-center",normalizedOffset:null,anchor:"center"}}case"point":case"mesh":return x["above-center"];default:return}}function w(e,r,n){const a=n.graphics3DGraphic.graphic.geometry;if(t(a))return null;switch(a.type){case"point":z(e,r,n);break;case"polygon":L(e,r,n);break;case"mesh":D(e,r,n.graphics3DGraphic.layers[0])}return e}function L(e,n,a){const l=d(a);if(!t(l))switch(l.type){case"extrude":{const t=a.graphics3DGraphic.layers[0];r(t)?(t.getBoundingBoxObjectSpace($),m($,e.translation),e.translation[2]=p($)/2):c(e.translation,0,0,0),D(e,n,t);break}}}function z(e,n,a){const l=d(a);if(t(l))return;const o=a.graphics3DGraphic.layers[0];switch(r(o)?o.getCenterObjectSpace(e.translation):c(e.translation,0,0,0),l.type){case"icon":case"text":j(e,n,a,o);break;case"object":D(e,n,o)}}function j(e,t,n,a){const{graphics3DGraphic:c}=n,l=r(a)?a.getScreenSize():null;if(!c.isDraped&&r(l)){const r=S(n);B[0]=l[0]/2*(t.normalizedOffset[0]-r[0]),B[1]=l[1]/2*(t.normalizedOffset[1]-r[1]),e.screenOffset[0]=B[0],e.hasLabelVerticalOffset?(e.centerOffset[1]=B[1],e.centerOffsetUnits="screen"):e.screenOffset[1]=B[1]}else e.hasLabelVerticalOffset||"center"===e.anchor||(x[n.labelClass.labelPlacement]&&u.warnOncePerTick(`the requested placement '${t.placement}' is currently unsupported for draped graphics`),e.anchor="center")}function S(e,t=T){const{graphics3DGraphic:n}=e,a=n.layers[0],c=r(a)?a.stageObject.geometries[0].material:null;if(c&&c instanceof b){const e=c.parameters.anchorPosition;t[0]=2*(e[0]-.5),t[1]=2*(e[1]-.5)}else t[0]=0,t[1]=0;return t}function D(e,t,n){const a=r(n)?n.getBoundingBoxObjectSpace($):$,c=o(a[3]-a[0],a[4]-a[1],a[5]-a[2]),s=Math.sqrt(c[0]*c[0]+c[1]*c[1]);e.centerOffset[0]=s/2*t.normalizedOffset[0];const i=e.translation[2],f=c[2]/2*t.normalizedOffset[1];e.translation[2]=0,e.elevationOffset=i+f;const m=l(c);e.centerOffset[2]=m/2*t.normalizedOffset[2]}function k(e){return"above-center"===e}function C(e){const a=e.labelClass.labelPlacement,{labelSymbol:c,graphics3DGraphic:l}=e,o=h(l.graphics3DSymbol),s=n(o,(e=>"point-3d"===e.symbol.type?e.symbol:null)),i=x[a]||P(e);return r(s)&&s.supportsCallout()&&s.hasVisibleVerticalOffset()&&!l.isDraped?{placement:null,hasLabelVerticalOffset:!1,verticalOffset:V(s.verticalOffset),anchor:null,normalizedOffset:null}:c&&c.hasVisibleVerticalOffset()&&(t(s)||!s.supportsCallout()||!s.verticalOffset||l.isDraped)?k(i.placement)?{placement:"above-center",verticalOffset:V(c.verticalOffset),anchor:"bottom",normalizedOffset:[0,i.normalizedOffset[1],0],hasLabelVerticalOffset:!0}:(u.errorOncePerTick("Callouts and vertical offset on labels are currently only supported with 'above-center' label placement (not with "+a+" placement)"),null):{placement:null,verticalOffset:null,anchor:null,normalizedOffset:null,hasLabelVerticalOffset:!1}}function V(e){const{screenLength:t,minWorldLength:r,maxWorldLength:n}=e;return{screenLength:t,minWorldLength:r,maxWorldLength:n}}const x={"above-center":{placement:"above-center",normalizedOffset:[0,1,0],anchor:"bottom"},"above-left":{placement:"above-left",normalizedOffset:[-1,1,0],anchor:"bottom-right"},"above-right":{placement:"above-right",normalizedOffset:[1,1,0],anchor:"bottom-left"},"below-center":{placement:"below-center",normalizedOffset:[0,-1,2],anchor:"top"},"below-left":{placement:"below-left",normalizedOffset:[-1,-1,0],anchor:"top-right"},"below-right":{placement:"below-right",normalizedOffset:[1,-1,0],anchor:"top-left"},"center-center":{placement:"center-center",normalizedOffset:[0,0,1],anchor:"center"},"center-left":{placement:"center-left",normalizedOffset:[-1,0,0],anchor:"right"},"center-right":{placement:"center-right",normalizedOffset:[1,0,0],anchor:"left"}},G={"above-center":["default","esriServerPointLabelPlacementAboveCenter"],"above-left":["esriServerPointLabelPlacementAboveLeft"],"above-right":["esriServerPointLabelPlacementAboveRight"],"below-center":["esriServerPointLabelPlacementBelowCenter"],"below-left":["esriServerPointLabelPlacementBelowLeft"],"below-right":["esriServerPointLabelPlacementBelowRight"],"center-center":["esriServerPointLabelPlacementCenterCenter"],"center-left":["esriServerPointLabelPlacementCenterLeft"],"center-right":["esriServerPointLabelPlacementCenterRight"]};for(const q in G){const e=G[q],t=x[q];e.forEach((e=>{x[e]=t}))}Object.freeze&&(Object.freeze(x),Object.keys(x).forEach((e=>{Object.freeze(x[e]),Object.freeze(x[e].normalizedOffset)})));const B=[0,0],T=[0,0],$=f();export{g as get};