@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 10.6 kB
JavaScript
import{_ as t}from"../../../../../chunks/tslib.es6.js";import i from"../../../../../core/Collection.js";import e from"../../../../../core/Evented.js";import{HandleOwnerMixin as o}from"../../../../../core/HandleOwner.js";import{makeHandle as a}from"../../../../../core/handleUtils.js";import{destroyMaybe as n,isNone as s,unwrap as r,isSome as p}from"../../../../../core/maybe.js";import{scale as l,zeroMeters as c}from"../../../../../core/quantityUtils.js";import{watch as h,syncAndInitial as u}from"../../../../../core/reactiveUtils.js";import{property as m}from"../../../../../core/accessorSupport/decorators/property.js";import"../../../../../core/accessorSupport/ensureType.js";import"../../../../../core/arrayUtils.js";import{subclass as d}from"../../../../../core/accessorSupport/decorators/subclass.js";import{makeDehydratedPoint as g}from"../../../../../layers/graphics/dehydratedFeatures.js";import{getGraphicEffectiveElevationInfo as v,getConvertedElevation as f}from"../../../../../support/elevationInfoUtils.js";import{getGraphicAttachmentOrigin as M}from"../../manipulatorUtils.js";import{SnappingVisualizer3D as y}from"../../SnappingVisualizer3D.js";import{SupportedGraphicResult as _}from"../isSupportedGraphicUtils.js";import{canMoveZ as w}from"../manipulatorUtils.js";import{createVisualElements as j}from"../visualElementUtils.js";import{DISC_RADIUS as b}from"../manipulations/config.js";import{ManipulationType as x,MoveManipulation as S}from"../manipulations/MoveManipulation.js";import{shapeOrientation as E,axisConstrainedDragSign as O}from"../manipulations/moveUtils.js";import{MoveXYGraphicManipulation as T}from"../manipulations/MoveXYGraphicManipulation.js";import{isSupportedGraphic as D}from"./isSupportedGraphic.js";import{OutlineVisualElement as X}from"../../visualElements/OutlineVisualElement.js";import{GraphicState as A}from"../../../layers/graphics/GraphicState.js";import{dragGraphicMany as z,resetGraphicMany as Y}from"../../../../interactive/dragEventPipeline.js";import{InteractiveToolBase as G}from"../../../../interactive/InteractiveToolBase.js";import{EditGeometryOperations as P}from"../../../../interactive/editGeometry/EditGeometryOperations.js";import U from"../../../../interactive/sketch/SketchTooltipOptions.js";import{SnappingContext as k}from"../../../../interactive/snapping/SnappingContext.js";import{createSnapDragEventPipelineStep as R}from"../../../../interactive/snapping/SnappingDragPipelineStep.js";import{Tooltip as I}from"../../../../interactive/tooltip/Tooltip.js";import{TranslateGraphicTooltipInfo as H,TranslateGraphicZTooltipInfo as Z,TranslateGraphicXYTooltipInfo as C}from"../../../../interactive/tooltip/TranslateTooltipInfos.js";import{autoHorizontalDistanceByElevationModeBetweenPoints as V}from"../../../../support/automaticLengthMeasurementUtils.js";import{verticalSignedDistanceBetweenPoints as F}from"../../../../support/euclideanLengthMeasurementUtils.js";class L{constructor(t){this.allGraphics=t,this.type="graphic-move-start"}}class N{constructor(t,i,e){this.dx=t,this.dy=i,this.allGraphics=e,this.type="graphic-move"}}class q{constructor(t){this.allGraphics=t,this.type="graphic-move-stop"}}let B=class extends(o(e.EventedMixin(G))){constructor(t){super(t),this.graphics=new i,this.enableZ=!0,this.tooltipOptions=new U,this.type="move-3d",this._tooltip=null}initialize(){const{graphics:t,view:i}=this;this.addHandles([t.on("change",(()=>this._refreshManipulators())),h((()=>this.tooltipOptions.enabled),(t=>{this._tooltip=t?new I({view:i}):n(this._tooltip)}),u)]),this._refreshManipulators(),this.finishToolCreation()}destroy(){this._tooltip=n(this._tooltip),this._moveManipulation=n(this._moveManipulation),this.graphics.removeAll(),this._set("view",null)}get updating(){return this.updatingHandles.updating}reset(){}_refreshManipulators(){this.handles.removeAll(),this._moveManipulation?.destroy(),this.manipulators.removeAll();const t=this.graphics.toArray().filter((t=>D(t)===_.SUPPORTED)).map((t=>new J(t)));t.length&&(this._createManipulators(t),this._createVisualElements(t),this.handles.add(t.map((t=>this.view.trackGraphicState(t.state)))),this._updateMoveManipulation(t))}_createManipulators(t){for(const i of t){const e=i.state;i.manipulationXY=new T({tool:this,view:this.view,graphicState:e}),i.manipulationXY.forEachManipulator((t=>this.handles.add([t.events.on("immediate-click",(t=>{this.emit("immediate-click",{...t,graphic:e.graphic}),t.stopPropagation()})),t.events.on("grab-changed",(({action:t})=>{const{tooltipOptions:i,_tooltip:e}=this;s(e)||("start"===t?e.info=new H({tooltipOptions:i}):e.clear())}))]))),this.handles.add(i.manipulationXY.createDragPipeline(((i,e,o,a)=>this._buildDragEventPipeline(t,x.XY,i,e,o,a))))}this._createMoveManipulation(t)}_createMoveManipulation(t){const i=new S({tool:this,view:this.view,snapToScene:!1,xyAvailable:!0,xyAxisAvailable:!0,zAvailable:!0,radius:1===t.length?S.radiusForSymbol(t[0].graphic.symbol):b});this._moveManipulation=i,i.elevationInfo={mode:"absolute-height",offset:0},i.forEachManipulator((t=>{this.handles.add(t.events.on("immediate-click",(e=>{i.zManipulation.hasManipulator(t)||1!==this.graphics.length||this.emit("immediate-click",{...e,graphic:this.graphics.getItemAt(0)}),e.stopPropagation()})))}));const e=i=>e=>{this.handles.add(e.events.on("focus-changed",(({action:e})=>{const o=this._tooltip;s(o)||("focus"===e?this._updateMoveTooltip(t,i):o.clear())})))};this._moveManipulation.xyManipulation.forEachManipulator(e(x.XY)),this._moveManipulation.xyAxisManipulation.forEachManipulator(e(x.XY_AXIS)),this._moveManipulation.zManipulation.forEachManipulator(e(x.Z));const o=()=>this._updateMoveManipulation(t);for(const n of t)this.handles.add([n.state.on("changed",o),h((()=>n.state.displaying),o)]);const a=t[t.length-1];this.handles.add(a.state.on("changed",(()=>this._updateMoveManipulationAngle(a)))),this.handles.add(i.createDragPipeline(((i,e,o,a,n)=>this._buildDragEventPipeline(t,i,e,o,a,n)),v(a.graphic),r(a.graphic.geometry).spatialReference,a.graphic)),this._updateMoveManipulationAngle(a)}_createVisualElements(t){for(const i of t){const e=i.graphic,o=j({view:this.view,graphic:e,forEachManipulator:t=>{i.manipulationXY?.forEachManipulator(t),this._moveManipulation.forEachManipulator(t)},onManipulatorsChanged:()=>a()});s(o)||(i.geometryRepresentation=o.visualElement,i.geometryRepresentation instanceof X&&this.handles.add([i.geometryRepresentation.events.on("attachment-origin-changed",(()=>{i.state.isDraped||this._updateMoveManipulation(t)})),h((()=>i.state.isDraped),(()=>this._updateMoveManipulation(t)))]),this.handles.add(o))}}_updateMoveManipulationAngle(t){this._moveManipulation.angle=E(t.graphic.geometry)}_updateMoveManipulation(t){const i=g(0,0,0,this.view.spatialReference);let e=0,o=!1;const a=this._moveManipulation;for(const n of t){if(!n.state.displaying)continue;const t=n.state.graphic;this.enableZ&&w(t)&&(o=!0);const a=n.geometryRepresentation instanceof X&&!n.state.isDraped?n.geometryRepresentation.attachmentOrigin:M(this.view,t);if(p(a)){const{x:t,y:o,z:n}=a;i.x+=t,i.y+=o,n&&(i.z??(i.z=0),i.z+=n),e++}}e>0?(i.x/=e,i.y/=e,i.z??(i.z=0),i.z/=e,a.location=i,a.xyManipulation.available=!0,a.xyAxisManipulation.available=!0,a.zManipulation.available=o):a.available=!1}_buildDragEventPipeline(t,i,e,o,a,n){const s=[],r=[];let p=null,l=null;const c=()=>{for(const t of s)t.dragging=!1;s.length=0,r.length=0,p=null,l=null,this._moveManipulation.interactive=!0};if(1===t.length&&i===x.XY){const i=t[0].graphic;({steps:o,cancel:a}=this._buildSnappingPipelineSteps(i,v(i),o,a,n))}return a=a.next((t=>l?.(t))).next((()=>(this.emit("graphic-move-stop",new q(r)),this.destroyed||c(),null))),{steps:o=o.next((i=>{if("start"===i.action){s.length=0,r.length=0;for(const i of t)i.dragging||!i.manipulationXY?.hasManipulator(e)&&i.manipulationXY?.grabbing||(s.push(i),r.push(i.graphic),i.dragging=!0);if(0!==r.length&&(this._moveManipulation.interactive=!1,p=z(r,this.view.state.viewingMode),l=Y(r),this.emit("graphic-move-start",new L(r)),this.destroyed))return null}return 0!==r.length?i:null})).next((t=>p?.(t))).next((e=>(this._updateMoveTooltip(t,i,e),e))).next((t=>{switch(t.action){case"start":case"update":if(t.translationX||t.translationY||t.translationZ){const i=this.view.toScreen(t.mapStart),e=this.view.toScreen(t.mapEnd),o=e.x-i.x,a=e.y-i.y;if(this.emit("graphic-move",new N(o,a,r)),this.destroyed)return null}break;case"end":if(this.emit("graphic-move-stop",new q(r)),this.destroyed)return null;c()}return null})),cancel:a}}_updateMoveTooltip(t,i,e){const{tooltipOptions:o,_tooltip:a}=this;if(s(a))return;a.clear();const n=0===t.length?"absolute-height":t[0].state.isDraped?"on-the-ground":"absolute-height";switch(i){case x.XY:a.info=new H({tooltipOptions:o}),this._updateMoveTooltipDistance(a.info,e,((t,i)=>V(t,i,n)));break;case x.XY_AXIS:a.info=new C({tooltipOptions:o}),this._updateMoveTooltipDistance(a.info,e,((t,i)=>{const o=V(t,i,n);return l(o,O(e))}));break;case x.Z:a.info=new Z({tooltipOptions:o}),this._updateMoveTooltipDistance(a.info,e,F)}}_updateMoveTooltipDistance(t,i,e){if(p(i)&&"end"!==i.action){const{mapStart:o,mapEnd:a}=i,n=e(o,a);t.distance=p(n)?n:c}}_buildSnappingPipelineSteps(t,i,e,o,a){const n=t.geometry;if(s(n)||"point"!==n.type&&"mesh"!==n.type)return{steps:e,cancel:o};const r=("point"===n.type?n:n.anchor).clone(),p=new k({elevationInfo:i,pointer:a,editGeometryOperations:P.fromGeometry(r,this.view.state.viewingMode),visualizer:new y,excludeFeature:t}),l=this.snappingManager,{snappingStep:c,cancelSnapping:h}=R({snappingContext:p,snappingManager:l,updatingHandles:this.updatingHandles});return o=o.next(h),{steps:e=e.next((i=>{r.z=f(this.view,r,v(t),{mode:"absolute-height",offset:0});return{...i,snapOrigin:p.coordinateHelper.pointToVector(r)}})).next(...c),cancel:o}}get test(){return{tooltip:this._tooltip}}};t([m({constructOnly:!0,nonNullable:!0})],B.prototype,"view",void 0),t([m()],B.prototype,"graphics",void 0),t([m({constructOnly:!0,nonNullable:!0})],B.prototype,"enableZ",void 0),t([m({constructOnly:!0,type:U})],B.prototype,"tooltipOptions",void 0),t([m({constructOnly:!0})],B.prototype,"snappingManager",void 0),t([m()],B.prototype,"type",void 0),t([m()],B.prototype,"updating",null),B=t([d("esri.views.3d.interactive.editingTools.graphicMove3D.GraphicMoveTool")],B);class J{constructor(t){this.geometryRepresentation=null,this.manipulationXY=null,this.dragging=!1,this.state=new A({graphic:t})}get graphic(){return this.state.graphic}}export{N as GraphicMoveEvent,L as GraphicMoveStartEvent,q as GraphicMoveStopEvent,B as GraphicMoveTool};