UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 17.4 kB
import{_ as t}from"../../../../chunks/tslib.es6.js";import e from"../../../../Color.js";import"../../../../geometry.js";import{LengthDimensionMeasureType as i}from"../../../../analysis/dimensionUtils.js";import a from"../../../../analysis/LengthDimension.js";import{HandleOwner as n}from"../../../../core/HandleOwner.js";import s from"../../../../core/Handles.js";import{equals as o}from"../../../../core/lang.js";import{isNone as r,isSome as p,unwrapOr as l,destroyMaybe as u,applySome as d}from"../../../../core/maybe.js";import{memoize as c}from"../../../../core/memoize.js";import{ignoreAbortErrors as m}from"../../../../core/promiseUtils.js";import{watch as h,sync as g,syncAndInitial as f,initial as _,when as M}from"../../../../core/reactiveUtils.js";import{property as y}from"../../../../core/accessorSupport/decorators/property.js";import"../../../../core/accessorSupport/ensureType.js";import{subclass as v}from"../../../../core/accessorSupport/decorators/subclass.js";import{c as S}from"../../../../chunks/vec3f64.js";import{clonePoint as C}from"../../../../layers/graphics/hydratedFeatures.js";import{reapplyConstraint as b,LengthDimensionConstraint as w,applyConstraint as P,computeConstraint as O,constraintDependencies as D}from"./lengthDimensionConstraintUtils.js";import{LengthDimensionManipulators as j,createPointManipulator as H,pointManipulatorHandles as T,createOffsetManipulator as G,offsetManipulatorHandles as I,createOrientationManipulator as z,headingManipulatorHandles as x,rotationManipulatorHandles as V,createMeasureTypeManipulator as U,measureTypeManipulatorHandles as R,updateOffsetManipulatorTransform as k,updateHeadingManipulatorTransform as E,updateRotationManipulatorTransform as A,updateMeasureTypeManipulatorTransform as F,unfocusedOffsetWidth as L,focusedOffsetWidth as q,updateOrientationManipulator as B}from"./lengthDimensionManipulatorUtils.js";import{isValidComputation as N,arePointsVerticallyAligned as J,computeGeometryFromDimension as K,computationToGeometryDependencies as Q}from"./lengthDimensionUtils.js";import{settings as W}from"./settings.js";import{getRotateHeadingTexture as X}from"../Slice/images/Factory.js";import{SnappingVisualizer3D as Y}from"../../interactive/SnappingVisualizer3D.js";import{LineVisualElement as Z}from"../../interactive/visualElements/LineVisualElement.js";import{VerticesVisualElement as $}from"../../interactive/visualElements/VerticesVisualElement.js";import{RenderOccludedFlag as tt}from"../../webgl-engine/lib/Material.js";import{ImageMaterial as et}from"../../webgl-engine/materials/ImageMaterial.js";import{createStipplePatternSimple as it}from"../../webgl-engine/materials/lineStippleUtils.js";import{RibbonLineMaterial as at}from"../../webgl-engine/materials/RibbonLineMaterial.js";import{createCoordinateHelper as nt}from"../../../interactive/coordinateHelper.js";import{EditGeometry as st}from"../../../interactive/editGeometry/EditGeometry.js";import{EditGeometryOperations as ot}from"../../../interactive/editGeometry/EditGeometryOperations.js";import{acquire as rt}from"../../../interactive/snapping/SceneSnappingManagerPool.js";import{SnappingContext as pt}from"../../../interactive/snapping/SnappingContext.js";import{createSnapDragEventPipelineStep as lt}from"../../../interactive/snapping/SnappingDragPipelineStep.js";import{SnappingOperation as ut}from"../../../interactive/snapping/SnappingOperation.js";import{setupSnappingToggleHandles as dt}from"../../../interactive/snapping/snappingUtils.js";import ct from"../../../../geometry/Point.js";let mt=class extends n{constructor(t){super(t),this._stagedDimension=null,this._computationManipulators=new Map,this._computationHandles=new s,this._getSnappingContext=c((t=>new pt({elevationInfo:{mode:"absolute-height",offset:0},pointer:t,editGeometryOperations:new ot(new st("point",nt(!0,!1,this.view.spatialReference))),visualizer:new Y}))),this._snappingManagerResult=rt(t.view),this.addHandles(this._snappingManagerResult),this._unfocusedOffsetManipulatorMaterial=ht(),this._focusedOffsetManipulatorMaterial=ht(),this._thinOffsetManipulatorMaterial=ht(),this._thinOffsetManipulatorMaterial.setParameters({stipplePattern:it(2)}),this._constraintSnappingIndicator=new Z({view:t.view,attached:!0,width:1,color:e.toUnitRGBA(W.constraint.color),renderOccluded:tt.OccludeAndTransparent,stipplePattern:it(5)});const i=e.toUnitRGBA(W.disabledPointIndicator.color);i[3]*=W.disabledPointIndicator.opacity,this._stagedStartIndicator=new $({view:t.view,attached:!1,color:i,size:2*W.disabledPointIndicator.radius,elevationInfo:{mode:"absolute-height",offset:0},spatialReference:t.view.renderCoordsHelper.spatialReference,outlineSize:0,renderOccluded:tt.OccludeAndTransparent})}initialize(){this._snappingOperation=new ut({view:this.view}),this._orientationManipulatorTexture=X(this.view.toolViewManager.textures),this._orientationManipulatorMaterial=new et({transparent:!0,writeDepth:!1,textureId:this._orientationManipulatorTexture.texture.id,renderOccluded:tt.Opaque});const{computations:t}=this.analysisViewData;for(const e of t)this._addComputation(e);this.addHandles([t.on("after-add",(t=>this._addComputation(t.item))),t.on("after-remove",(t=>this._removeComputation(t.item)))]),this.addHandles([h((()=>({stagedPoint:this._snappingOperation.stagedPoint,stagedComputation:this._stagedComputation})),(({stagedPoint:t,stagedComputation:e})=>{if(r(e)||r(t))return;const i=C(t,new ct);this._applyPointUpdate(e,{endPoint:i})}),g),h((()=>({stagedDimension:this._stagedDimension,selectedComputation:this.analysisViewData.selectedComputation,firstGrabbedManipulator:this.firstGrabbedManipulator})),((t,e)=>{const{stagedDimension:i,selectedComputation:a,firstGrabbedManipulator:n}=t;if(i===e?.stagedDimension&&n===e?.firstGrabbedManipulator){for(const s of[a,e?.selectedComputation])if(p(s)){const e=this._computationManipulators.get(s);this._updateManipulators(s,e,t)}}else for(const[s,o]of this._computationManipulators)this._updateManipulators(s,o,t)}),f),h((()=>this.analysis.style.lineSize),(t=>{this._updateManipulatorStyle(t)}),_),h((()=>this.view.state.camera),(()=>{p(this._stagedComputation)&&this._updateStagedDimensionOffset(this._stagedComputation)})),h((()=>d(this._stagedComputation,(t=>{const e=t.elevationAlignedStartPoint,i=S();return p(e)&&this.view.renderCoordsHelper.toRenderCoords(e,i)?i:null}))),(t=>{p(t)?(this._stagedStartIndicator.vertices=[t],this._stagedStartIndicator.attached=!0):this._stagedStartIndicator.attached=!1}))]),this.addHandles(this._constraintHandles),this.addHandles(this._snappingIndicatorHandles),dt(this,(()=>{const t=this._activeComputation,e=this._stagedComputation;if(r(t)||p(e)){const t=l(this.view.inputManager.latestPointerType,"mouse"),e=this._getSnappingContext(t);this.updatingHandles.addPromise(m(this._snappingOperation.resnap(this._snappingManager,e)))}if(p(t)){const{start:e,end:i}=this._computationManipulators.get(t);if(e.grabbing||i.grabbing){const i=e.grabbing?"start":"end",a=this._computeConstraint(t);b(t,i,{constraint:a,view:this.view})}}}))}destroy(){this._snappingOperation=u(this._snappingOperation),this._computationHandles.destroy(),this._constraintSnappingIndicator.destroy(),this._stagedStartIndicator.destroy(),this._orientationManipulatorMaterial.dispose(),this._orientationManipulatorTexture.release()}get updating(){return this.updatingHandles.updating||this._snappingManager.updating}get firstGrabbedManipulator(){return this.parentTool.firstGrabbedManipulator}get hasGrabbedManipulators(){return this.parentTool.hasGrabbedManipulators}get snappingOptions(){return this._snappingManager.options}get _snappingManager(){return this._snappingManagerResult.snappingManager}get _activeComputation(){if(p(this._stagedComputation))return this._stagedComputation;const{selectedComputation:t}=this.analysisViewData;return this.hasGrabbedManipulators&&p(t)?t:null}get _stagedComputation(){const t=this._stagedDimension,e=this.analysisViewData.computations.at(-1);return r(t)||r(e)||e.dimension!==t?null:e}get _constraintHandles(){return[M((()=>this.analysisViewData.selectedComputation),(t=>{t.previousConstraint=this._computeConstraint(t)}),{...f,equals:o}),h((()=>{const t=this._activeComputation;if(r(t))return null;const{measureType:e,orientation:i}=t.dimension;return{measureType:e,orientation:i,computation:t}}),((t,e)=>{if(p(t)&&r(e)){const{measureType:e,orientation:a,computation:n}=t;switch(n.previousConstraint){case w.Horizontal:n.preConstraintProperties={measureType:i.Horizontal,orientation:0};break;case w.Vertical:n.preConstraintProperties={measureType:i.Vertical,orientation:0};break;case w.Direct:n.preConstraintProperties={measureType:i.Direct,orientation:a};break;default:n.preConstraintProperties={measureType:e,orientation:a}}}r(t)&&p(e)&&(e.computation.preConstraintProperties=null)}),g)]}get _snappingIndicatorHandles(){const t="snapping-indicator-event-handles";return[h((()=>({stagedComputation:this._stagedComputation,activeComputation:this._activeComputation})),(({stagedComputation:e,activeComputation:i})=>{const a=this._constraintSnappingIndicator;if(this.removeHandles(t),r(i))a.attached=!1;else if(i===e)a.attached=!0;else{const{start:e,end:n}=this._computationManipulators.get(i),s=()=>{a.attached=e.grabbing||n.grabbing};s(),this.addHandles([e.events.on("grab-changed",s),n.events.on("grab-changed",s)],t)}})),h((()=>{const t=this._activeComputation;return p(t)?{geometry:t.geometry,constraint:t.previousConstraint}:{}}),(({geometry:t,constraint:e})=>{const i=this._constraintSnappingIndicator;p(t)&&p(e)&&e!==w.Direct?(i.visible=!0,i.setGeometryFromSegment(t.directSegment)):i.visible=!1}))]}removeStaged(){return!!p(this._stagedDimension)&&(this.analysis.dimensions.remove(this._stagedDimension),this._stagedDimension=null,!0)}onDeactivate(){this.removeStaged(),this._resetSnappingState()}onClick(t){const{_stagedDimension:e}=this;if(r(e)){const e=this._onUnstagedClick(t);return this.analysis.dimensions.add(e),null}return this._onStagedClick(t),e}onPointerMove({mapPoint:t,pointerType:e}){if("touch"===e)return;const i=this._getSnappingContext(e);this.updatingHandles.addPromise(m(this._snappingOperation.snap({point:t},this._snappingManager,i)))}onManipulatorSelectionChanged(){if(p(this.analysisViewData.selectedComputation)){this._computationManipulators.get(this.analysisViewData.selectedComputation).offset.selected||(this.analysisViewData.selectedDimension=null)}}_onUnstagedClick({mapPoint:t,pointerType:e}){let n=t;if("mouse"===e){const i=this._getSnappingContext(e);n=this._snappingManager.update({point:t,context:i})}const s=new a({startPoint:C(n,new ct),endPoint:null,measureType:i.Horizontal});return this._stagedDimension=s,this._resetSnappingState(),s}_onStagedClick({mapPoint:t,pointerType:e}){const i=this._stagedComputation;if(r(i))return;let a=t;if("mouse"===e){const i=this._getSnappingContext(e);a=this._snappingManager.update({point:t,context:i})}const n=C(a,new ct);this._applyPointUpdate(i,{endPoint:n}),this._stagedDimension=null,this._resetSnappingState()}_resetSnappingState(){this._snappingManager.doneSnapping(),this._snappingOperation.abort(),this._snappingOperation.stagedPoint=null}_addComputation(t){if(this._computationManipulators.has(t))return;const e=this._setupPointManipulator(t,{isStart:!0}),a=this._setupPointManipulator(t,{isStart:!1}),n=this._setupOffsetManipulator(t),s=this._setupHeadingManipulator(t),o=this._setupRotationManipulator(t),r=this._setupMeasureTypeManipulator(t,i.Direct),p=this._setupMeasureTypeManipulator(t,i.Horizontal),l=this._setupMeasureTypeManipulator(t,i.Vertical),u=new j({start:e,end:a,offset:n,heading:s,rotation:o,direct:r,horizontal:p,vertical:l});this._setupComputationToManipulatorsSync(t,u),this._computationManipulators.set(t,u),this.manipulators.addMany(u.values())}_removeComputation(t){const e=this._computationManipulators.get(t);if(!r(e)){this._computationHandles.remove(t),this._computationManipulators.delete(t);for(const t of e.values())this.manipulators.remove(t)}}_setupComputationToManipulatorsSync(t,e){this._computationHandles.add([h((()=>t.geometry),(()=>this._updateManipulators(t,e)),{...f,equals:o})],t)}_setupPointManipulator(t,e){const{view:i}=this,{dimension:a}=t,n=H(i,{metadata:a}),s=T(n,{isStart:e.isStart,createSnappingPipelineStep:t=>lt({snappingContext:this._getSnappingContext(t),snappingManager:this._snappingManager,updatingHandles:this.updatingHandles}),dimension:a,onUpdate:e=>this._applyPointUpdate(t,e),view:i});return this._computationHandles.add(s,t),n}_setupOffsetManipulator(t){const{view:e}=this,i=G(e,{lineSizePt:this.analysis.style.lineSize,unfocusedMaterial:this._unfocusedOffsetManipulatorMaterial,focusedMaterial:this._focusedOffsetManipulatorMaterial,metadata:t.dimension}),a=I(i,{computation:t,view:e});return this._computationHandles.add(a,t),i}_setupHeadingManipulator(t){const{view:e}=this,i=z(e,{lineSizePt:this.analysis.style.lineSize,material:this._orientationManipulatorMaterial,metadata:t.dimension}),a=x(i,{computation:t,view:e});return this._computationHandles.add(a,t),i}_setupRotationManipulator(t){const{view:e}=this,i=z(e,{lineSizePt:this.analysis.style.lineSize,material:this._orientationManipulatorMaterial,metadata:t.dimension}),a=V(i,{computation:t,view:e});return this._computationHandles.add(a,t),i}_setupMeasureTypeManipulator(t,e){const{view:i}=this,a=U(i,{lineSizePt:this.analysis.style.lineSize,unfocusedMaterial:this._unfocusedOffsetManipulatorMaterial,focusedMaterial:this._focusedOffsetManipulatorMaterial,thinOffsetManipulatorMaterial:this._thinOffsetManipulatorMaterial,metadata:t.dimension}),n=R(a,{computation:t,manipulatorMeasureType:e,view:i});return this._computationHandles.add(n,t),a}_updateManipulators(t,e,a={stagedDimension:this._stagedDimension,selectedComputation:this.analysisViewData.selectedComputation,firstGrabbedManipulator:this.firstGrabbedManipulator}){const{stagedDimension:n,selectedComputation:s,firstGrabbedManipulator:o}=a,{start:l,end:u,offset:d,heading:c,rotation:m}=e,h=s===t,g=N(t),{dimension:f}=t;for(const i of e.values()){const t=g&&r(n)&&(r(o)||i===o);i===d?(i.available=t,i.selected=h):i.available=t&&h}if(!g)return;p(this._computeConstraint(t))?e.forEachMeasureTypeManipulator((t=>t.available=!1)):e.manipulatorForMeasureType(f.measureType).available=!1;for(const r of[c,m])f.measureType===i.Direct&&0!==f.offset||(r.available=!1);J(t)?m.available=!1:c.available=!1;const{geometry:_}=t;l.renderLocation=_.directSegment.startRenderSpace,u.renderLocation=_.directSegment.endRenderSpace;const{renderCoordsHelper:M}=this.view;k(d,_,M),c.available&&E(c,t,M),m.available&&A(m,t,M),e.forEachMeasureTypeManipulator(((e,i)=>{e.available&&F(e,t,i,M)}))}_updateManipulatorStyle(t){const e=L(t),i=q(t),a={lineSizePt:t,material:this._orientationManipulatorMaterial};for(const{offset:n,heading:s,rotation:o}of this._computationManipulators.values())n.radius=i/2,B(s,a),B(o,a);this._unfocusedOffsetManipulatorMaterial.setParameters({width:e}),this._focusedOffsetManipulatorMaterial.setParameters({width:i})}_applyPointUpdate(t,e){const{view:i}=this,a=Q(t);"startPoint"in e&&(a.elevationAlignedStartPoint=e.startPoint),"endPoint"in e&&(a.elevationAlignedEndPoint=e.endPoint);const n=K(a,i.renderCoordsHelper);if(r(n))return;const s=this._computeConstraint({...a,geometry:n});P(t,e,{...a,constraint:s,unconstrainedGeometry:n,view:i}),t===this._stagedComputation&&this._updateStagedDimensionOffset(t)}_updateStagedDimensionOffset(t){if(r(t.geometry))return;t.geometry.directSegment.eval(.5,gt);const e=this.view.state.camera.computeRenderPixelSizeAt(gt);t.dimension.offset=W.initialOffsetPx*e}_computeConstraint(t){return O(D(t,this._snappingManager.options),this.view)}get testInfo(){const t=t=>this.analysisViewData.computations.find((e=>e.dimension===t));return{disableManipulatorPartialOcclusion:()=>{this._stagedStartIndicator.renderOccluded=tt.Occlude,this.manipulators.forEach((({manipulator:t})=>{for(const{geometry:e}of t.renderObjects)e.material.setParameters({renderOccluded:tt.Occlude})}))},getManipulatorsForDimension:e=>this._computationManipulators.get(t(e)),getComputationForDimension:e=>t(e),getConstraintForDimension:e=>{const i=t(e);return p(i)?this._computeConstraint(i):null},stagedDimension:this._stagedDimension,stagedStartIndicator:this._stagedStartIndicator,constraintSnappingIndicator:this._constraintSnappingIndicator,snappingManager:this._snappingManager}}};function ht(){const{color:t,opacity:i}=W.offsetManipulator;return new at({color:[...e.toUnitRGB(t),i],width:1,renderOccluded:tt.OccludeAndTransparent,writeDepth:!1,hasPolygonOffset:!0})}t([y({constructOnly:!0})],mt.prototype,"analysis",void 0),t([y({constructOnly:!0})],mt.prototype,"analysisViewData",void 0),t([y({constructOnly:!0})],mt.prototype,"manipulators",void 0),t([y({constructOnly:!0})],mt.prototype,"parentTool",void 0),t([y({constructOnly:!0,nonNullable:!0})],mt.prototype,"view",void 0),t([y({readOnly:!0})],mt.prototype,"updating",null),t([y()],mt.prototype,"firstGrabbedManipulator",null),t([y()],mt.prototype,"hasGrabbedManipulators",null),t([y()],mt.prototype,"snappingOptions",null),t([y()],mt.prototype,"_stagedDimension",void 0),t([y()],mt.prototype,"_activeComputation",null),t([y()],mt.prototype,"_stagedComputation",null),mt=t([v("esri.views.3d.analysis.Dimension.LengthDimensionSubTool")],mt);const gt=S();export{mt as LengthDimensionSubTool};