@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 4.53 kB
JavaScript
import e from"../../../../core/Handles.js";import{equals as t}from"../../../../core/lang.js";import{isSome as s,destroyMaybe as i,isNone as n}from"../../../../core/maybe.js";import{formatDecimal as l}from"../../../../core/quantityFormatUtils.js";import{watch as a,initial as m}from"../../../../core/reactiveUtils.js";import{pt2px as o}from"../../../../core/screenUtils.js";import{c as r}from"../../../../chunks/vec3f64.js";import{computeSpanningSegment as f,OffsetSegmentLocation as d,maxScreenLengthSquaredFromGeometry as c,offsetSegment as h}from"./lengthDimensionUtils.js";import{settings 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 v}from"../../interactive/visualElements/MarkerVisualElement.js";import{EuclideanSegment as p}from"../../interactive/visualElements/support/Segment.js";class b{set visible(e){for(const t of this._visualElements.values())t.attached=e}constructor(i){this.destroyed=!1,this._handles=new e,this._messages=null,this._labelSegment=new p;const{analysis:n,computation:l,view:r,messages:f}=i;this.analysis=n,this.computation=l,this.view=r,this._messages=f;const d=i.visible,c={view:r,attached:d},{fontSize:h,textColor:u,textBackgroundColor:b}=n.style;this._visualElements=new L({marker:new v(c,i.markerMaterial),dimension:new g(c,i.dimensionLineMaterial),startOffset:new g(c,i.offsetLineMaterial),endOffset:new g(c,i.offsetLineMaterial),dimensionSmall:new g(c,i.smallDimensionLineMaterial),startOffsetSmall:new g(c,i.smallOffsetLineMaterial),endOffsetSmall:new g(c,i.smallOffsetLineMaterial),label:new S({view:r,attached:d,distance:0,geometry:{type:"segment",sampleLocation:"center",segment:this._labelSegment,callout:!1},fontSize:o(h),textColor:u.clone(),backgroundColor:b.clone()})}),this._handles.add([a((()=>l.geometry),(e=>{this.updateCameraDependentElements(r.state.camera,e,n.style),s(l.geometry)&&this._updateLines(l.geometry)}),{...m,equals:t}),a((()=>l.length),(e=>this._updateLabelContent(e)),m)])}destroy(){this.destroyed=!0,this._handles=i(this._handles);for(const e of this._visualElements.values())e.destroy()}get testInfo(){return{dimensionVisualElement:this._visualElements.dimension,label:this._visualElements.label}}_updateLines(e){const t=f(_,d.Start,e.directSegment,e.dimensionSegment),s=f(y,d.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(n(t)){for(const e of i.values())e.visible=!1;return}const l=e.computeScreenPixelSizeAt(t.dimensionSegment.eval(.5,E)),a=c(t,l),m=a<(o(s.lineSize)*u.smallScreenLengthLineSizeFactor)**2,r=!m;i.marker.visible=r,i.dimension.visible=r,i.startOffset.visible=r,i.endOffset.visible=r,i.dimensionSmall.visible=m,i.startOffsetSmall.visible=m,i.endOffsetSmall.visible=m;const f=o(s.fontSize)*u.labels.minScreenLengthFontSizeFactor,{label:d}=i;if(d.visible=a>=f**2,!d.visible)return;const{dimensionSegment:S,primaryOffsetAxis:g}=t,{offset:v}=this.computation.dimension,p=(Math.sign(v)>=0?1:-1)*O(s)*l;h(this._labelSegment,S,g,p),d.updateLabelPosition()}updateLabelStyle(e){const{label:t}=this._visualElements;t.fontSize=o(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;n(e)||n(this._messages)?t.text="":t.text=l(this._messages,e,e.unit)}}function O(e){return 1.5*o(e.fontSize)+u.labels.marginPx+o(e.lineSize/2)}const _=new p,y=new p,E=r();class L{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{L as LengthDimensionVisualElements,b as LengthDimensionVisualization};