UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 7.55 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{__decorate as t}from"tslib";import e from"../../../core/Accessor.js";import n from"../../../core/Logger.js";import{memoize as i}from"../../../core/memoize.js";import{ignoreAbortErrors as o}from"../../../core/promiseUtils.js";import{valueInUnit as s}from"../../../core/quantity.js";import{createScreenPoint as r}from"../../../core/screenUtils.js";import{property as a,subclass as p}from"../../../core/accessorSupport/decorators.js";import{fromArray as l,create as u}from"../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{normalize as g}from"../../../core/libs/gl-matrix-2/math/vec2.js";import c from"../../../geometry/Point.js";import{pointEquals as d}from"../../../layers/graphics/dehydratedFeatureComparison.js";import{makeDehydratedPoint as h}from"../../../layers/graphics/dehydratedPoint.js";import{getPolylineOrPolygonConstraint as f,getPointConstraint as m,pointToConstraintSpace as S,constraintSpaceToPoint as y}from"../../interactive/sketch/constraintUtils.js";import{SnappingContext as P}from"../../interactive/snapping/SnappingContext.js";import{SnappingOperation as v}from"../../interactive/snapping/SnappingOperation.js";let M=class extends e{constructor(t){super(t),this._snappingOperation=null,this.role="primary",this.captureMode="capture-always",this.defaultCaptureMode="capture-always",this.snappingEnabled=!0,this.selfSnappingEnabled=!0,this.editSession=null,this.outputMapPositionOfDragStart=null,this.selectedSnappingResult=null,this.screenPosition=null,this.inputMapPosition=null,this.drawToolDragging=!1,this.manipulatorDragging=!1,this._getSnappingContext=i((t,e,n,i,o,s)=>n?new P({elevationInfo:i,pointer:t,vertexHandle:e,editGeometryOperations:n,visualizer:o,suppressSelfSnapping:!s}):null)}get grabbable(){return"grabbable-object"===this.captureMode}get following(){const{captureMode:t}=this;return"capture-always"===t||"capture-when-engaged"===t}get outputMapPosition(){return this._get("outputMapPosition")}set outputMapPosition(t){const e=this._get("outputMapPosition");t&&e&&d(t,e)||this._set("outputMapPosition",t)}get dragging(){return this.drawToolDragging||this.manipulatorDragging}get firstPointZ(){const t=this.editSession?.lastPointAddedBySession;if(!t)return null;const e=this.editSession?.getInformationAboutPoint(0,t.partIndex);return e?.point.hasZ?e.point.z:null}async moveTo(t,e){const{snappingManager:n,skipSnapping:i,surfaceManager:s,pointerType:r,editGeometryOperations:a,snappingVisualizer:p}=e,l=this._getSnappingContext(r??"mouse",this.editSession?.endVertex,a,s?.elevationInfo,p,this.selfSnappingEnabled),u=this._ensureSnappingOperation(e);t&&(this.screenPosition=t);const g=this.screenPosition;if(!g)return null;const f=e.surfaceManager?.screenToMap(g,{firstPointZ:this.firstPointZ});if(this.inputMapPosition=f,this.selectedSnappingResult=null,!n||!f||!l||i||!this.snappingEnabled)return this.selectedSnappingResult=void 0,this.outputMapPosition=this._finalizeSnappingAndConstraintResult(null,f,e);const m=h(f.x,f.y,f.z,f?.spatialReference),S=u.snap({point:m},n,l);return o(S.then(()=>{const t=u.stagedPoint;return d(this.selectedSnappingResult,t)||(this.selectedSnappingResult=new c({...t})),this.outputMapPosition=this._finalizeSnappingAndConstraintResult(this.selectedSnappingResult,f,e)}))}async moveDeltaRelativeToScreen(t,e,n){const{inputMapPosition:i,screenPosition:o,firstPointZ:s}=this;if(!i)return null;const a=n.surfaceManager?n.surfaceManager.mapToScreen(i,{firstPointZ:s}):o;if(!a)return null;const p=r(a.x+t,a.y+e);return this.moveTo(p,n)}async noteDragStart(t,e){if(this.drawToolDragging=!0,e.skipSnapping||!this.snappingEnabled)return null;const{snappingManager:i,surfaceManager:s,pointerType:r,editGeometryOperations:a,snappingVisualizer:p}=e,l=this._getSnappingContext(r??"mouse",this.editSession?.endVertex,a,s?.elevationInfo,p,this.selfSnappingEnabled),u=this._ensureSnappingOperation(e),g=s?.screenToMap(t,{firstPointZ:this.firstPointZ});if(this.outputMapPositionOfDragStart=null,i&&l&&g){const t=u.snap({point:h(g.x,g.y,g.z,g?.spatialReference)},i,l);return o(t.then(()=>{const t=u.stagedPoint?new c({...u.stagedPoint}):null;return this.outputMapPositionOfDragStart=this._finalizeSnappingAndConstraintResult(t,g,e)})).catch(t=>(n.getLogger(this).error("drawtool:handle:snapping-failed",t),null))}return this.outputMapPositionOfDragStart=g,null}async noteDragEnd(t,e){return this.moveTo(t,e).finally(()=>this.drawToolDragging=!1)}async moveDeltaRelativeToSketchSegment(t,e){const n=this.editSession?.endVertex?.leftSegment?.leftVertex?.pos,{firstPointZ:i}=this,o=this.inputMapPosition?e.surfaceManager?.mapToScreen(this.inputMapPosition,{firstPointZ:i})??this.screenPosition:this.screenPosition;if(!n||!o)return null;const s=e.editGeometryOperations?.data?.coordinateHelper.vectorToPoint(n);if(!s)return null;const r=e.surfaceManager?.mapToScreen(s,{firstPointZ:i});if(!r)return null;const a=[o.x-r.x,o.y-r.y],p=g(u(),l(a)),[c,d]=[p[0]*t,p[1]*t];return this.moveDeltaRelativeToScreen(c,d,e)}refreshConstraint(t){const e=this.outputMapPosition??this.inputMapPosition;return this.outputMapPosition=this._finalizeSnappingAndConstraintResult(null,e,t)}_finalizeSnappingAndConstraintResult(t,e,n){const i=t??e;return this._ensureZ(this._applyTooltipConstraints(i,n),n)}_applyTooltipConstraints(t,e){let n=t;const i=e.tooltipManager?.getConstraints(this);if(!i&&!e.interactiveHandleManager?.customConstraints)return n;if(!n)return n;const o=e.interactiveHandleManager?.customConstraints,r=e.editGeometryOperations?.data?.coordinateHelper;if(!r)return n;if(o&&this.editSession&&n){const t={handle:this,editSession:this.editSession,toScreen:t=>e.surfaceManager?.mapToScreen(t,{firstPointZ:this.firstPointZ})??null};for(const e of o)n=e(n,t)||n}const a=this.editSession?.endVertex,p=a?.leftSegment?.leftVertex,l=p?.leftSegment?.leftVertex,u=p&&r.vectorToPoint(p.pos),g=l&&r.vectorToPoint(l.pos);if(!i)return n;const d=(u||g)&&"primary"===this.role?f(u,g,i):m(i);if(!n||!i||!d)return n;const{context:h}=i,P=S(n,h),v=P?d.closestTo(P):void 0;if(!v)return n;const M=y(v,n,h),x="2d"===e.surfaceManager?.view?.type||"absolute-height"!==h.elevationInfo.mode,T=i.elevation,{hasZ:b,metersPerVerticalUnit:Z}=e.surfaceManager??{};if(null!=M&&x&&null!=T&&b&&Z&&(M.z=s(T,"meters")/Z),!M)return null;return new c({x:M.x,y:M.y,z:M.z,hasM:M.hasM,hasZ:M.hasZ,m:M.m,spatialReference:M.spatialReference})}_ensureZ(t,e){return t&&e.hasZ?(null!=t.z&&t.hasZ||(t.z=e.defaultZ??0,t.hasZ=!0),t):t}_ensureSnappingOperation({view:t}){return this._snappingOperation??=new v({view:t})}};t([a()],M.prototype,"_snappingOperation",void 0),t([a()],M.prototype,"role",void 0),t([a()],M.prototype,"name",void 0),t([a()],M.prototype,"captureMode",void 0),t([a()],M.prototype,"defaultCaptureMode",void 0),t([a()],M.prototype,"grabbable",null),t([a()],M.prototype,"following",null),t([a()],M.prototype,"snappingEnabled",void 0),t([a()],M.prototype,"selfSnappingEnabled",void 0),t([a()],M.prototype,"editSession",void 0),t([a()],M.prototype,"outputMapPosition",null),t([a()],M.prototype,"outputMapPositionOfDragStart",void 0),t([a()],M.prototype,"selectedSnappingResult",void 0),t([a()],M.prototype,"screenPosition",void 0),t([a()],M.prototype,"inputMapPosition",void 0),t([a()],M.prototype,"dragging",null),t([a()],M.prototype,"drawToolDragging",void 0),t([a()],M.prototype,"manipulatorDragging",void 0),t([a({readOnly:!0})],M.prototype,"firstPointZ",null),M=t([p("esri.views.draw.support.InteractiveHandle")],M);export{M as InteractiveHandle};