UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) • 17.7 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{__decorate as t}from"tslib";import e from"../../../../analysis/LengthDimension.js";import i from"../../../../core/Accessor.js";import a from"../../../../core/Handles.js";import{destroyHandle as n,handlesGroup as s}from"../../../../core/handleUtils.js";import"../../../../core/has.js";import{equals as o}from"../../../../core/lang.js";import{mapCollection as r}from"../../../../core/mapCollectionUtils.js";import{releaseMaybe as p,destroyMaybe as l}from"../../../../core/maybe.js";import{memoize as u}from"../../../../core/memoize.js";import{ignoreAbortErrors as d}from"../../../../core/promiseUtils.js";import{watch as c,initial as m,sync as h,syncAndInitial as g,when as f}from"../../../../core/reactiveUtils.js";import{property as _,subclass as M}from"../../../../core/accessorSupport/decorators.js";import{create as v}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{UpdatingHandles as y}from"../../../../core/support/UpdatingHandles.js";import S from"../../../../geometry/Point.js";import{clonePoint as C}from"../../../../layers/graphics/hydratedFeatures.js";import{reapplyConstraint as w,applyConstraint as b,computeConstraint as P,constraintDependencies as O}from"./lengthDimensionConstraintUtils.js";import{LengthDimensionManipulators as D,LengthDimensionPointManipulator as H,pointManipulatorHandles as T,createOffsetManipulator as j,offsetManipulatorHandles as x,LineOfSightOrientationManipulator as G,headingManipulatorHandles as z,rotationManipulatorHandles as U,createMeasureTypeManipulator as R,measureTypeManipulatorHandles as I,updateOffsetManipulatorTransform as V,updateHeadingManipulatorTransform as A,updateRotationManipulatorTransform as E,updateMeasureTypeManipulatorTransform as k,unfocusedOffsetWidth as L,focusedOffsetWidth as F}from"./lengthDimensionManipulatorUtils.js";import{isValidComputation as q,arePointsVerticallyAligned as B,computationToGeometryDependencies as N,computeGeometryFromDimension as J}from"./lengthDimensionUtils.js";import{disabledPointColor as K,pointRadius as Q,getTransparentAccentColor as W,getContrastColor as X,initialOffsetPx as Y}from"./settings.js";import{getRotateHeadingTexture as Z}from"../images/Factory.js";import{SnappingVisualizer3D as $}from"../../interactive/SnappingVisualizer3D.js";import{LineVisualElement as tt}from"../../interactive/visualElements/LineVisualElement.js";import{VerticesVisualElement as et}from"../../interactive/visualElements/VerticesVisualElement.js";import{ImageMaterial as it}from"../../webgl-engine/materials/ImageMaterial.js";import{createStipplePatternSimple as at}from"../../webgl-engine/materials/lineStippleUtils.js";import{RibbonLineMaterial as nt}from"../../webgl-engine/materials/RibbonLineMaterial.js";import{createCoordinateHelper as st}from"../../../interactive/coordinateHelper.js";import{EditGeometry as ot}from"../../../interactive/editGeometry/EditGeometry.js";import{EditGeometryOperations as rt}from"../../../interactive/editGeometry/EditGeometryOperations.js";import{SnappingContext as pt}from"../../../interactive/snapping/SnappingContext.js";import{createSnapDragEventPipelineStep as lt}from"../../../interactive/snapping/SnappingDragPipelineStep.js";import{acquire as ut}from"../../../interactive/snapping/SnappingManagerPool.js";import{SnappingOperation as dt}from"../../../interactive/snapping/SnappingOperation.js";import{setupSnappingToggleHandles as ct}from"../../../interactive/snapping/snappingUtils.js";let mt=class extends i{constructor(t){super(t),this._stagedDimension=null,this._snappingManagerResult=null,this._computationManipulators=new Map,this._computationHandles=new a,this._updatingHandles=new y,this._getSnappingContext=u(t=>new pt({elevationInfo:{mode:"absolute-height",offset:0},pointer:t,editGeometryOperations:new rt(new ot("point",st(!0,!1,this.view.spatialReference)),this.view.state.viewingMode),visualizer:new $}));const{view:e}=t;this._unfocusedOffsetManipulatorMaterial=this._createOffsetManipulatorMaterial(e),this._focusedOffsetManipulatorMaterial=this._createOffsetManipulatorMaterial(e),this._thinOffsetManipulatorMaterial=this._createOffsetManipulatorMaterial(e),this._thinOffsetManipulatorMaterial.setParameters({stipplePattern:at(2)}),this._constraintSnappingIndicator=new tt({view:e,attached:!0,width:1,renderOccluded:4,stipplePattern:at(5),isDecoration:!0});const i=K.toUnitRGBA();this._stagedStartIndicator=new et({view:e,attached:!1,elevationInfo:{mode:"absolute-height",offset:0},spatialReference:t.view.renderCoordsHelper.spatialReference,color:i,size:2*Q,outlineSize:0,renderOccluded:4,isDecoration:!0})}initialize(){const{view:t}=this;this._snappingOperation=new dt({view:t});const e=W(t.effectiveTheme),i=X(t.effectiveTheme),a=!t.stage?.renderView.renderingContext.driverTest.svgPremultipliesAlpha.result;this._textureHandle=Z(t.stage.textures,{accentColor:e,contrastColor:i,preMultiplyAlpha:a}),this._orientationManipulatorMaterial=new it({draped:!1,managedTexture:this._textureHandle.managedTexture,writeDepth:!1,renderOccluded:16,isDecoration:!0});const s=r(()=>this.analysisViewData.computations,({computation:t})=>this._createManipulators(t));this.addHandles([c(()=>({accentColor:W(t.effectiveTheme),contrastColor:X(t.effectiveTheme)}),({accentColor:e,contrastColor:i})=>{const n=this._textureHandle;this._textureHandle=Z(t.stage.textures,{accentColor:e,contrastColor:i,preMultiplyAlpha:a}),this._orientationManipulatorMaterial.setParameters({managedTexture:this._textureHandle.managedTexture}),n?.release();const s=e.toUnitRGBA();this._unfocusedOffsetManipulatorMaterial.setParameters({color:s}),this._focusedOffsetManipulatorMaterial.setParameters({color:s}),this._thinOffsetManipulatorMaterial.setParameters({color:s}),this._constraintSnappingIndicator.color=s},m),n(s),c(()=>({stagedPoint:this._snappingOperation.stagedPoint,stagedComputation:this._stagedComputation}),({stagedPoint:t,stagedComputation:e})=>{if(null==e||null==t)return;const i=C(t,new S);this._applyPointUpdate(e,{endPoint:i})},h),c(()=>({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(null!=s){const e=this._computationManipulators.get(s);null!=e&&this._updateManipulators(s,e,t)}}else for(const[s,o]of this._computationManipulators)this._updateManipulators(s,o,t)},g),c(()=>this.analysis.style.lineSize,t=>this._updateManipulatorStyle(t),m),c(()=>this.view.state.camera,()=>{null!=this._stagedComputation&&this._updateStagedDimensionOffset(this._stagedComputation)}),c(()=>{const t=this._stagedComputation;if(!t)return null;const e=t.elevationAlignedStartPoint,i=v();return null!=e&&this.view.renderCoordsHelper.toRenderCoords(e,i)?i:null},t=>{null!=t?(this._stagedStartIndicator.vertices=[t],this._stagedStartIndicator.attached=!0):this._stagedStartIndicator.attached=!1})]),this.addHandles(this._constraintHandles),this.addHandles(this._snappingIndicatorHandles),ct(this,()=>{const t=this._activeComputation,e=this._stagedComputation;if(null==t||null!=e){const t=this.view.inputManager.latestPointerInfo?.type??"mouse",e=this._getSnappingContext(t);this._updatingHandles.addPromise(d(this._snappingOperation.snapAgainNearPreviousMapPoint(this._ensureSnappingManager(),e)))}if(null!=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);w(t,i,{constraint:a,view:this.view})}}})}destroy(){this._textureHandle=p(this._textureHandle),this._snappingOperation=l(this._snappingOperation),this._computationHandles.destroy(),this._constraintSnappingIndicator.destroy(),this._stagedStartIndicator.destroy(),this._orientationManipulatorMaterial.dispose()}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}_ensureSnappingManager(){return this._snappingManagerResult||(this._snappingManagerResult=ut(this.view),this.addHandles(this._snappingManagerResult)),this._snappingManagerResult.snappingManager}get _activeComputation(){if(null!=this._stagedComputation)return this._stagedComputation;const{selectedComputation:t}=this.analysisViewData;return this.hasGrabbedManipulators&&null!=t?t:null}get _stagedComputation(){const t=this._stagedDimension,e=this.analysisViewData.computations.at(-1)?.computation;return null==t||null==e||e.dimension!==t?null:e}get _constraintHandles(){return[f(()=>this.analysisViewData.selectedComputation,t=>{t.previousConstraint=this._computeConstraint(t)},{...g,equals:o}),c(()=>{const t=this._activeComputation;if(null==t)return null;const{measureType:e,orientation:i}=t.dimension;return{measureType:e,orientation:i,computation:t}},(t,e)=>{if(null!=t&&null==e){const{measureType:e,orientation:i,computation:a}=t;switch(a.previousConstraint){case 0:a.preConstraintProperties={measureType:"horizontal",orientation:0};break;case 1:a.preConstraintProperties={measureType:"vertical",orientation:0};break;case 2:a.preConstraintProperties={measureType:"direct",orientation:i};break;default:a.preConstraintProperties={measureType:e,orientation:i}}}null==t&&null!=e&&(e.computation.preConstraintProperties=null)},h)]}get _snappingIndicatorHandles(){const t="snapping-indicator-event-handles";return[c(()=>({stagedComputation:this._stagedComputation,activeComputation:this._activeComputation}),({stagedComputation:e,activeComputation:i})=>{const a=this._constraintSnappingIndicator;if(this.removeHandles(t),null!=i)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)}else a.attached=!1}),c(()=>{const t=this._activeComputation;return null!=t?{geometry:t.geometry,constraint:t.previousConstraint}:{}},({geometry:t,constraint:e})=>{const i=this._constraintSnappingIndicator;null!=t&&null!=e&&2!==e?(i.visible=!0,i.setGeometryFromSegment(t.directSegment)):i.visible=!1})]}removeStaged(){return null!=this._stagedDimension&&(this.analysis.dimensions.remove(this._stagedDimension),this._stagedDimension=null,!0)}onDeactivate(){this.removeStaged(),this._resetSnappingState()}onClick(t){const{_stagedDimension:e}=this;if(null==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(d(this._snappingOperation.snap({point:t},this._ensureSnappingManager(),i)))}onManipulatorSelectionChanged(){if(null!=this.analysisViewData.selectedComputation){this._computationManipulators.get(this.analysisViewData.selectedComputation).offset.selected||(this.analysisViewData.selectedDimension=null)}}_onUnstagedClick({mapPoint:t,pointerType:i}){let a=t;if("mouse"===i){const e=this._getSnappingContext(i);a=this._ensureSnappingManager().update({point:t,context:e})}const n=new e({startPoint:C(a,new S),endPoint:null,measureType:"horizontal"});return this._stagedDimension=n,this._resetSnappingState(),n}_onStagedClick({mapPoint:t,pointerType:e}){const i=this._stagedComputation;if(null==i)return;let a=t;if("mouse"===e){const i=this._getSnappingContext(e);a=this._ensureSnappingManager().update({point:t,context:i})}const n=C(a,new S);this._applyPointUpdate(i,{endPoint:n}),this._stagedDimension=null,this._resetSnappingState()}_resetSnappingState(){this._ensureSnappingManager().doneSnapping(),this._snappingOperation.abort(),this._snappingOperation.stagedPoint=null}_createManipulators(t){const e=this._setupPointManipulator(t,{isStart:!0}),i=this._setupPointManipulator(t,{isStart:!1}),a=this._setupOffsetManipulator(t),n=this._setupHeadingManipulator(t),o=this._setupRotationManipulator(t),r=this._setupMeasureTypeManipulator(t,"direct"),p=this._setupMeasureTypeManipulator(t,"horizontal"),l=this._setupMeasureTypeManipulator(t,"vertical"),u=new D({start:e,end:i,offset:a,heading:n,rotation:o,direct:r,horizontal:p,vertical:l});this._setupComputationToManipulatorsSync(t,u),this._computationManipulators.set(t,u),this.manipulators.addMany(u.values());const d=s(u.values().map(t=>t.events.on("focus-changed",()=>{u.values().some(t=>t.focused)&&this._resetSnappingState()})));return{manipulators:u,remove:()=>{d.remove(),this._computationHandles.remove(t),this._computationManipulators.delete(t);for(const t of u.values())this.manipulators.remove(t)}}}_setupComputationToManipulatorsSync(t,e){this._computationHandles.add([c(()=>t.geometry,()=>this._updateManipulators(t,e),{...g,equals:o})],t)}_setupPointManipulator(t,e){const{view:i}=this,{dimension:a}=t,n=new 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=j(e,{lineSizePt:this.analysis.style.lineSize,unfocusedMaterial:this._unfocusedOffsetManipulatorMaterial,focusedMaterial:this._focusedOffsetManipulatorMaterial,metadata:t.dimension}),a=x(i,{computation:t,view:e});return this._computationHandles.add(a,t),i}_setupHeadingManipulator(t){const{view:e}=this,i=new G(e,{lineSizePt:this.analysis.style.lineSize,material:this._orientationManipulatorMaterial,metadata:t.dimension}),a=z(i,{computation:t,view:e});return this._computationHandles.add(a,t),i}_setupRotationManipulator(t){const{view:e}=this,i=new G(e,{lineSizePt:this.analysis.style.lineSize,material:this._orientationManipulatorMaterial,metadata:t.dimension}),a=U(i,{computation:t,view:e});return this._computationHandles.add(a,t),i}_setupMeasureTypeManipulator(t,e){const{view:i}=this,a=R(i,{lineSizePt:this.analysis.style.lineSize,unfocusedMaterial:this._unfocusedOffsetManipulatorMaterial,focusedMaterial:this._focusedOffsetManipulatorMaterial,thinOffsetManipulatorMaterial:this._thinOffsetManipulatorMaterial,metadata:t.dimension}),n=I(a,{computation:t,manipulatorMeasureType:e,view:i});return this._computationHandles.add(n,t),a}_updateManipulators(t,e,i={stagedDimension:this._stagedDimension,selectedComputation:this.analysisViewData.selectedComputation,firstGrabbedManipulator:this.firstGrabbedManipulator}){const{stagedDimension:a,selectedComputation:n,firstGrabbedManipulator:s}=i,{start:o,end:r,offset:p,heading:l,rotation:u}=e,d=n===t,c=q(t),{dimension:m}=t;for(const f of e.values()){const t=c&&null==a&&(null==s||f===s);f===p?(f.available=t,f.selected=d):f.available=t&&d}if(!c)return;null!=this._computeConstraint(t)?e.forEachMeasureTypeManipulator(t=>t.available=!1):e.manipulatorForMeasureType(m.measureType).available=!1;for(const f of[l,u])"direct"===m.measureType&&0!==m.offset||(f.available=!1);B(t)?u.available=!1:l.available=!1;const{geometry:h}=t;o.renderLocation=h.directSegment.startRenderSpace,r.renderLocation=h.directSegment.endRenderSpace;const{renderCoordsHelper:g}=this.view;V(p,h,g),l.available&&A(l,t,g),u.available&&E(u,t,g),e.forEachMeasureTypeManipulator((e,i)=>{e.available&&k(e,t,i,g)})}_updateManipulatorStyle(t){const e=L(t),i=F(t),a={lineSizePt:t,material:this._orientationManipulatorMaterial};for(const{offset:n,heading:s,rotation:o}of this._computationManipulators.values())n.radius=i/2,s.update(a),o.update(a);this._unfocusedOffsetManipulatorMaterial.setParameters({width:e}),this._focusedOffsetManipulatorMaterial.setParameters({width:i})}_applyPointUpdate(t,e){const{view:i}=this,a=N(t);"startPoint"in e&&(a.elevationAlignedStartPoint=e.startPoint),"endPoint"in e&&(a.elevationAlignedEndPoint=e.endPoint);const n=J(a,i.renderCoordsHelper);if(null==n)return;const s=this._computeConstraint({...a,geometry:n});b(t,e,{...a,constraint:s,unconstrainedGeometry:n,view:i}),t===this._stagedComputation&&this._updateStagedDimensionOffset(t)}_updateStagedDimensionOffset(t){if(null==t.geometry)return;t.geometry.directSegment.eval(.5,ht);const{state:e,renderCoordsHelper:i}=this.view,a=e.camera.computeScreenPixelSizeAt(ht);t.dimension.offset=Y*a*i.unitInMeters}_computeConstraint(t){return P(O(t,this._ensureSnappingManager().options),this.view)}_createOffsetManipulatorMaterial(t){return new nt({width:1,renderOccluded:4,writeDepth:!1,hasPolygonOffset:!0,isDecoration:!0},t.state.isGlobal)}get test(){}};t([_({constructOnly:!0})],mt.prototype,"analysis",void 0),t([_({constructOnly:!0})],mt.prototype,"analysisViewData",void 0),t([_({constructOnly:!0})],mt.prototype,"manipulators",void 0),t([_({constructOnly:!0})],mt.prototype,"parentTool",void 0),t([_({constructOnly:!0,nonNullable:!0})],mt.prototype,"view",void 0),t([_({readOnly:!0})],mt.prototype,"updating",null),t([_()],mt.prototype,"firstGrabbedManipulator",null),t([_()],mt.prototype,"hasGrabbedManipulators",null),t([_()],mt.prototype,"snappingOptions",null),t([_()],mt.prototype,"_stagedDimension",void 0),t([_()],mt.prototype,"_snappingManager",null),t([_()],mt.prototype,"_activeComputation",null),t([_()],mt.prototype,"_stagedComputation",null),t([_()],mt.prototype,"_snappingManagerResult",void 0),mt=t([M("esri.views.3d.analysis.Dimension.LengthDimensionSubTool")],mt);const ht=v();export{mt as LengthDimensionSubTool};