UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 5.38 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{__decorate as t}from"tslib";import{watch as e,initial as o}from"../../../core/reactiveUtils.js";import{property as n,subclass as i}from"../../../core/accessorSupport/decorators.js";import s from"../../../geometry/Polyline.js";import{isPolygon as r}from"../../../geometry/support/typeUtils.js";import{getPaths as l}from"../../../geometry/support/curves/curveUtils.js";import{PolylinePlugin as a}from"./PolylinePlugin.js";import{knownFieldDisplayOrders as d}from"../support/types.js";import{screenDistance as p}from"../../interactive/snapping/snappingUtils.js";const u=5,c=Symbol("polygon-snap-to-close-constraint"),m=Symbol("polygon-area-measurement"),g=Symbol("polygon-area-field");let y=class extends a{constructor(){super(...arguments),this._autoCloseLineVisualId=Symbol("polygon-auto-close-on-commit"),this._defaultClosingLineVisualId=Symbol("polygon-default-close-on-cancel"),this.clickToCloseEnabled=!0}get _totalPreviewGeometry(){const{_session:t}=this;if(!t)return null;const e=t.lastPointAddedBySession?.partIndex,o=this._downstreamEditSession?.lastPointAddedBySession?.partIndex,n=e??o;if(!t||null==n)return null;const i=t?.getInformationAboutPoint(0,n),s=t?.getInformationAboutPoint(-1,n);return t?.generatePreviewGeometry({includeAutomaticConnection:!1,geometryType:"polygon",firstIncludedPoint:i,lastIncludedPoint:s})}get helpMessageKey(){const t=this._session?.lastPointAddedBySession;return t?null!=t.pointIndex&&t.pointIndex>0?"polygonTwoVertices":"polygonOneVertex":"polygonZeroVertices"}get test(){const{_autoCloseLineVisualId:t,_defaultClosingLineVisualId:e}=this;return{_autoCloseLineVisualId:t,_defaultClosingLineVisualId:e}}start(t){super.start(t),t.createConstraint(c,(t,e)=>this._snapToClosingVertex(t,e)),t.addOrUpdateVisual(this._autoCloseLineVisualId,{role:"outline",state:"active"}),t.addOrUpdateVisual(this._defaultClosingLineVisualId,{role:"outline",state:"idle"}),this.addHandles([e(()=>this._downstreamEditSession?.lastPointAddedBySession,t=>{if(!t||null==t.pointIndex)return this._context?.addOrUpdateVisual(this._autoCloseLineVisualId,{geometry:null}),void this._context?.addOrUpdateVisual(this._defaultClosingLineVisualId,{geometry:null});const e=this._session?.getInformationAboutPoint(t.pointIndex-1,t.partIndex),o=this._session?.getInformationAboutPoint(0,t.partIndex);if(t.point&&o?.point){const e=[t.point.x,t.point.y],n=[o.point.x,o.point.y],i=new s({spatialReference:t.point.spatialReference,paths:[[e,n]]});this._context?.addOrUpdateVisual(this._autoCloseLineVisualId,{geometry:i})}else this._context?.addOrUpdateVisual(this._autoCloseLineVisualId,{geometry:null});if(e?.point&&o?.point){const t=[e.point.x,e.point.y],n=[o.point.x,o.point.y],i=new s({spatialReference:o.point.spatialReference,paths:[[t,n]]});this._context?.addOrUpdateVisual(this._defaultClosingLineVisualId,{geometry:i})}else this._context?.addOrUpdateVisual(this._defaultClosingLineVisualId,{geometry:null})},o)],this._ownHandlesKey)}detachPlugin(t,e){const{_session:o}=this,n=o?.lastPointAddedBySession;if(!n||null==n.pointIndex)return;"complete"===e&&this._context?.setGlobalState("drawAtFixedElevation",!0);const i=o.getInformationAboutPoint(0,n.partIndex),s=o.getInformationAboutPoint(n.pointIndex-1,n.partIndex),r="2d"!==this._context?.getViewInformation()?.type;if("complete"===e&&this.clickToCloseEnabled&&(n.pointIndex>2||2===n.pointIndex&&n.curveInfo)&&(f(i?.point,n.point,r)||f(s?.point,n.point,r))){!n.curveInfo&&o?.eraseLastOperation(),this._context?.requestComplete()}else"complete"===e&&this._context?.requestBeginDownstreamPlugin(t.configuration,{cancelExisting:!1})}afterUndoRedo(){const t=this._session?.lastPointAddedBySession;this._context?.setGlobalState("drawAtFixedElevation",!!t||void 0)}_getCommittedGeometry(){return this._session?.generatePreviewGeometry({includeAutomaticConnection:!1,geometryType:"polygon"})}_setupGeometrySpecificTooltip(){this._context&&(this._areaField??=this._context.createMeasuredField({id:g,preset:"area",getMeasurementInput:()=>this._totalPreviewGeometry,measure:async(t,e)=>{if(!t||!r(t))return null;const o=l(t)?.at(-1);if(!o||o.length<2||!t.curveRings&&o.length<3)return null;const n=e.inputUnitInfos.area.unit;return this._context?.measureArea(t,m,"tooltip",n)},fieldProperties:{readOnly:!0,displayOrder:d.ShapeMeasurements}}))}_snapToClosingVertex(t,e){const{_session:o}=this;if("primary"!==e.handle.role||!o)return t;if(e.handle.dragging&&"capture-when-engaged"===e.handle.captureMode)return t;if(!o?.sessionIsOperatingOnSameGeometry(e.editSession))return t;const n=e.editSession?.lastPointAddedBySession;if(!n||null==n.pointIndex||n.pointIndex<2)return t;const i=o.getInformationAboutPoint(0,n.partIndex);if(!t||!i?.point)return t;const s=e.toScreen(t);if(!s)return t;const r=e.toScreen(i.point);if(!r)return t;if(p(s,r)<=u)return i.point;const l=o.getInformationAboutPoint(n.pointIndex-1,n.partIndex);if(!l?.point)return t;const a=e.toScreen(l.point);return a&&p(s,a)<=u?l.point:t}};function f(t,e,o){return t===e||null!=t&&null!=e&&t.x===e.x&&t.y===e.y&&(!o||t.z===e.z)}t([n()],y.prototype,"_areaField",void 0),t([n()],y.prototype,"_totalPreviewGeometry",null),t([n()],y.prototype,"clickToCloseEnabled",void 0),t([n()],y.prototype,"helpMessageKey",null),y=t([i("esri.views.draw.plugins.PolygonPlugin")],y);export{y as PolygonPlugin};