@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 4.67 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import e from"../../../../core/Handles.js";import"../../../../core/has.js";import{equals as t}from"../../../../core/lang.js";import{destroyMaybe as s}from"../../../../core/maybe.js";import{formatDecimal as i}from"../../../../core/quantityFormatUtils.js";import{watch as n,initial as l}from"../../../../core/reactiveUtils.js";import{pt2px as a}from"../../../../core/screenUtils.js";import{create as o}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{computeSpanningSegment as m,OffsetSegmentLocation as r,maxScreenLengthSquaredFromGeometry as f,offsetSegment as d}from"./lengthDimensionUtils.js";import{smallScreenLengthLineSizeFactor as c,minScreenLengthFontSizeFactor as h,labelMarginPx as u}from"./settings.js";import{LabelVisualElement as S}from"../../interactive/visualElements/LabelVisualElement.js";import{LineVisualElement as g}from"../../interactive/visualElements/LineVisualElement.js";import{MarkerVisualElement as p}from"../../interactive/visualElements/MarkerVisualElement.js";import{EuclideanSegment as v}from"../../interactive/visualElements/support/Segment.js";class b{set visible(e){for(const t of this._visualElements.values())t.attached=e}constructor(s){this.destroyed=!1,this._handles=new e,this._messages=null,this._labelSegment=new v;const{analysis:i,computation:o,view:m,messages:r,isDecoration:f}=s;this.analysis=i,this.computation=o,this.view=m,this._messages=r;const d=s.visible,c={view:m,attached:d,isDecoration:f},{fontSize:h,textColor:u,textBackgroundColor:b}=i.style;this._visualElements=new E({marker:new p(c,s.markerMaterial),dimension:new g(c,s.dimensionLineMaterial),startOffset:new g(c,s.offsetLineMaterial),endOffset:new g(c,s.offsetLineMaterial),dimensionSmall:new g(c,s.smallDimensionLineMaterial),startOffsetSmall:new g(c,s.smallOffsetLineMaterial),endOffsetSmall:new g(c,s.smallOffsetLineMaterial),label:new S({view:m,attached:d,distance:0,geometry:{type:"segment",sampleLocation:"center",segment:this._labelSegment,callout:!1},fontSize:a(h),textColor:u.clone(),backgroundColor:b.clone(),isDecoration:f})}),this._handles.add([n((()=>o.geometry),(e=>{this.updateCameraDependentElements(m.state.camera,e,i.style),null!=o.geometry&&this._updateLines(o.geometry)}),{...l,equals:t}),n((()=>o.length),(e=>this._updateLabelContent(e)),l)])}destroy(){this.destroyed=!0,this._handles=s(this._handles);for(const e of this._visualElements.values())e.destroy()}get testInfo(){}_updateLines(e){const t=m(y,r.Start,e.directSegment,e.dimensionSegment),s=m(_,r.End,e.directSegment,e.dimensionSegment),i=this._visualElements;i.marker.setGeometryFromSegment(e.dimensionSegment,e.primaryOffsetAxis),i.dimension.setGeometryFromSegment(e.dimensionSegment),i.startOffset.setGeometryFromSegment(t),i.endOffset.setGeometryFromSegment(s),i.dimensionSmall.setGeometryFromSegment(e.dimensionSegment),i.startOffsetSmall.setGeometryFromSegment(t),i.endOffsetSmall.setGeometryFromSegment(s)}updateCameraDependentElements(e,t,s){const i=this._visualElements;if(null==t){for(const e of i.values())e.visible=!1;return}const n=e.computeScreenPixelSizeAt(t.dimensionSegment.eval(.5,w)),l=f(t,n),o=l<(a(s.lineSize)*c)**2,m=!o;i.marker.visible=m,i.dimension.visible=m,i.startOffset.visible=m,i.endOffset.visible=m,i.dimensionSmall.visible=o,i.startOffsetSmall.visible=o,i.endOffsetSmall.visible=o;const r=a(s.fontSize)*h,{label:u}=i;if(u.visible=l>=r**2,!u.visible)return;const{dimensionSegment:S,primaryOffsetAxis:g}=t,{offset:p}=this.computation.dimension,v=(Math.sign(p)>=0?1:-1)*O(s)*n;d(this._labelSegment,S,g,v),u.updateLabelPosition()}updateLabelStyle(e){const{label:t}=this._visualElements;t.fontSize=a(e.fontSize),t.textColor=e.textColor,t.backgroundColor=e.textBackgroundColor}updateUnitsMessages(e){this._messages=e;const{length:t}=this.computation;this._updateLabelContent(t)}_updateLabelContent(e){const{label:t}=this._visualElements;null!=e&&null!=this._messages?t.text=i(this._messages,e,e.unit):t.text=""}}function O(e){return 1.5*a(e.fontSize)+u+a(e.lineSize/2)}const y=new v,_=new v,w=o();class E{constructor(e){this.marker=e.marker,this.dimension=e.dimension,this.startOffset=e.startOffset,this.endOffset=e.endOffset,this.dimensionSmall=e.dimensionSmall,this.startOffsetSmall=e.startOffsetSmall,this.endOffsetSmall=e.endOffsetSmall,this.label=e.label}values(){return[this.marker,this.dimension,this.startOffset,this.endOffset,this.dimensionSmall,this.startOffsetSmall,this.endOffsetSmall,this.label]}}export{E as LengthDimensionVisualElements,b as LengthDimensionVisualization};