@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 8.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{_ as t}from"../../../../chunks/tslib.es6.js";import e from"../../../../core/Accessor.js";import{makeHandle as o,destroyHandle as i}from"../../../../core/handleUtils.js";import{deg2rad as s}from"../../../../core/mathUtils.js";import{abortMaybe as r,destroyMaybe as a}from"../../../../core/maybe.js";import{debounce as n}from"../../../../core/promiseUtils.js";import{initial as l,watch as d,syncAndInitial as c}from"../../../../core/reactiveUtils.js";import{getMetersPerUnitForSR as p}from"../../../../core/unitUtils.js";import{property as m}from"../../../../core/accessorSupport/decorators/property.js";import"../../../../core/has.js";import"../../../../core/Logger.js";import"../../../../core/RandomLCG.js";import{subclass as h}from"../../../../core/accessorSupport/decorators/subclass.js";import{fromRotation as _}from"../../../../core/libs/gl-matrix-2/math/mat2d.js";import{create as u}from"../../../../core/libs/gl-matrix-2/factories/mat2df64.js";import{set as g,transformMat2d as y}from"../../../../core/libs/gl-matrix-2/math/vec2.js";import{create as f}from"../../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{UpdatingHandles as v}from"../../../../core/support/UpdatingHandles.js";import{ControlPointOperations as T}from"../../interactive/editingTools/media/ControlPointOperations.js";import{ViewEventPriorities as b}from"../../../input/InputManager.js";import{KeyBindings as j,mediaKeys as w}from"../../../interactive/keybindings.js";import{acquire as M}from"../../../interactive/snapping/SnappingManagerPool.js";import{loadAutomaticAreaMeasurementUtils as E}from"../../../support/automaticAreaMeasurementUtils.js";import{loadAutomaticLengthMeasurementUtils as O}from"../../../support/automaticLengthMeasurementUtils.js";const P=Symbol(),S=Symbol(),A=1,H=10;let U=class extends e{get editSourcePoints(){return!!this.options?.reshapeOptions.editSourcePoints!==this._isEditSourcePointsToggled}get updating(){return this._updatingHandles.updating}get _preferredInteractionTool(){return this.options?.tool??"transform"}get _toolType(){switch(this._preferredInteractionTool){case"transform":return"transform-3d";case"reshape":return"reshape-3d"}}get _validatedSelectedElement(){const t=this.selectedElement;if(!t)return null;const{layer:{source:e}}=this;return e?"hasElement"in e?e.hasElement(t)?t:null:e===t?t:null:null}constructor(t){super(t),this.enabled=!1,this._isEditSourcePointsToggled=!1,this._updatingHandles=new v,this._isOpacityToggled=!1,this._factor=A,this._tool=null,this._object=null,this._createToolAbortController=null,this._onPointerMove=n((async t=>{const e=await this._updatingHandles.addPromise(this._findElementAtScreenPoint(t));this.destroyed||(this.removeHandles(S),e&&e!==this.selectedElement&&(this.view.cursor="pointer",this.addHandles(o((()=>this.view.cursor=null)),S)))})),this._tmpMat2=u(),this._tmpVec2=f()}destroy(){this._createToolAbortController=r(this._createToolAbortController)}initialize(){this.addHandles([i(this._updatingHandles),this._updatingHandles.add((()=>this.enabled),(t=>this._enableDisable(t)),l),this._updatingHandles.add((()=>this._preferredInteractionTool),(t=>this._preferredInteractionToolChanged(t)))])}_enableDisable(t){if(!t)return void this.removeHandles(P);this._dynamicImports();const{view:e}=this,i=new j;i.add(w.undo,(()=>{this._object?.operations?.undo(),this._object?.emit("modified-externally")})),i.add(w.redo,(()=>{this._object?.operations?.redo(),this._object?.emit("modified-externally")})),i.addToggle(w.preserveAspectRatio,(t=>{"transform-3d"===this._tool?.type&&(this._tool.preserveAspectRatio="key-down"===t.type)})),i.addToggle(w.editSourcePoints,(t=>{"reshape-3d"===this._tool?.type&&(this._isEditSourcePointsToggled="key-down"===t.type)})),i.addToggle(w.rotateIncrements,(t=>{"transform-3d"===this._tool?.type&&(this._tool.snapRotation="key-down"===t.type)})),i.add(w.toggleOpacity,(()=>{const t=this._object?.element;t&&(t.opacity*=this._isOpacityToggled?2:.5,this._isOpacityToggled=!this._isOpacityToggled)})),i.add(w.moveUp,(()=>this._move(0,this._factor))),i.add(w.moveDown,(()=>this._move(0,-this._factor))),i.add(w.moveRight,(()=>this._move(this._factor,0))),i.add(w.moveLeft,(()=>this._move(-this._factor,0))),i.addToggle(w.factorModifier,(t=>this._factor="key-down"===t.type?H:A)),this._isOpacityToggled=!1,this.addHandles([i.register(e,b.TOOL),o((()=>{this._isOpacityToggled&&this.selectedElement&&(this.selectedElement.opacity*=2,this._isOpacityToggled=!1)})),e.on("immediate-click",(t=>this._onClick(t)),b.TOOL),e.on("pointer-move",(t=>this._onPointerMove(t).catch((()=>{}))),b.TOOL),this._updatingHandles.add((()=>this._validatedSelectedElement),((t,e)=>{e&&t!==e&&this._isOpacityToggled&&(e.opacity*=2,this._isOpacityToggled=!1),this._selectedElementChanged(t)}),l),o((()=>{e.cursor=null,this._removeTool()}))],P)}async _onClick(t){await this._updatingHandles.addPromise(t.defer((async()=>{const e=await this._findElementAtScreenPoint(t);this.destroyed||(e&&t.stopPropagation(),this.selectedElement=e,this.selectedElement&&(this.view.cursor=null))})))}async _selectedElementChanged(t){t?.georeference?this._object?.element!==t&&await this._updatingHandles.addPromise(this._recreateTool()):this._removeTool()}async _recreateTool(){this._createToolAbortController=r(this._createToolAbortController),this._removeTool();const t=this._validatedSelectedElement;if(!t)return;const e=new AbortController;this._createToolAbortController=e;const{ManipulatedObject3DMediaElement:i,ExtentTransformTool:s,ReshapeTool3D:n,automaticAreaMeasurementUtils:l,automaticLengthMeasurementUtils:p}=await this._dynamicImports();if(e.signal.aborted)return;const{view:m,layer:h,_toolType:_}=this;switch(this._object=new i({view:m,layer:h,element:t,tool:this._preferredInteractionTool}),_){case"transform-3d":{this._tool=new s({view:m,object:this._object,automaticLengthMeasurementUtils:p});const t=m.inputManager;t.isModifierKeyDown(w.rotateIncrements.key)&&(this._tool.snapRotation=!0),t.isModifierKeyDown(w.preserveAspectRatio.key)&&(this._tool.preserveAspectRatio=!0)}break;case"reshape-3d":{const t=M(m),{snappingManager:e}=t;this._tool=new n({view:m,object:this._object,enableMidpoints:!1,enableZShape:!1,snappingManager:e,enableMoveObject:!1,autoHideManipulators:!0,enableDeleteVertices:!1,sketchOptions:{tooltips:{enabled:!0,inputEnabled:!0,visibleElements:{area:!1}}},automaticAreaMeasurementUtils:l,automaticLengthMeasurementUtils:p}),this.addHandles([t,d((()=>({editSourcePoints:this.editSourcePoints,operations:this._object?.operations})),(t=>{t.operations instanceof T&&(t.operations.editSourcePoints=t.editSourcePoints)}),c)],this._tool)}}this.addHandles([o((()=>{this._object=a(this._object),this._tool&&(m.tools.remove(this._tool),this._tool=null)}))],this._tool),m.addAndActivateTool(this._tool)}_preferredInteractionToolChanged(t){const{_tool:e}=this;if(!e)return;if(this._toolType!==e.type)return void this._updatingHandles.addPromise(this._recreateTool());const{_object:o}=this;o&&(o.tool=t)}async _dynamicImports(){const[{ManipulatedObject3DMediaElement:t},{ExtentTransformTool:e,ReshapeTool3D:o},i,s]=await Promise.all([import("../../interactive/editingTools/ManipulatedObject3DMediaElement.js"),import("../../interactive/editingTools.js"),await E(),await O()]);return{ManipulatedObject3DMediaElement:t,ExtentTransformTool:e,ReshapeTool3D:o,automaticAreaMeasurementUtils:i,automaticLengthMeasurementUtils:s}}async _findElementAtScreenPoint(t){const e=(await this.view.hitTest(t,{include:[this.layer]})).results[0];return"media"===e?.type?e.element:null}_removeTool(){this._tool&&this.removeHandles(this._tool)}_move(t,e){const{view:o,_object:i}=this,r=i?.operations;if(!r)return;const a=o.overlayPixelSizeInMapUnits(o.pointsOfInterest.focus.location)*p(o.spatialReference)/p(r.data.spatialReference),{_tmpMat2:n,_tmpVec2:l}=this,d=_(n,s(360-this.view.camera.heading)),c=g(l,a*t,a*e);y(c,c,d),r.move(c[0],c[1],0),i.emit("modified-externally")}};t([m({constructOnly:!0})],U.prototype,"view",void 0),t([m({constructOnly:!0})],U.prototype,"layer",void 0),t([m()],U.prototype,"selectedElement",void 0),t([m()],U.prototype,"enabled",void 0),t([m()],U.prototype,"options",void 0),t([m()],U.prototype,"editSourcePoints",null),t([m()],U.prototype,"_isEditSourcePointsToggled",void 0),t([m()],U.prototype,"updating",null),t([m()],U.prototype,"_preferredInteractionTool",null),t([m()],U.prototype,"_validatedSelectedElement",null),U=t([h("esri.views.3d.layers.support.MediaLayerInteraction")],U);export{U as MediaLayerInteraction};