@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 2 kB
JavaScript
import{PathTransformationCursor as e,getCoord2D as t,reversePath as n}from"../CIMCursor.js";import{CurveHelper as i}from"../CurveHelper.js";import{PlacementOnLineRelativeTo as s}from"../enums.js";const r=.001;class l{static local(){return null===l.instance&&(l.instance=new l),l.instance}execute(e,t,n,i,s){return new o(e,t,n)}}l.instance=null;class o extends e{constructor(e,t,n){super(e,!0,!0),this._curveHelper=new i,this._angleToLine=void 0===t.angleToLine||t.angleToLine,this._offset=void 0!==t.offset?t.offset*n:0,this._relativeTo=t.relativeTo,this._position=void 0!==t.startPointOffset?t.startPointOffset*n:0,this._epsilon=r*n}processPath(e){const i=this._position;if(this._relativeTo===s.SegmentMidpoint){for(this.iteratePath||(this._segmentCount=e.length,this._curSegment=1,this.iteratePath=!0);this._curSegment<this._segmentCount;){const n=this._curSegment;this._curSegment++;const i=e[n-1],s=e[n],r=this._curveHelper.calculateLength(i,s);if(r<this._epsilon)continue;const l=.5+this._position/r,[o,a]=this._curveHelper.getAngleCS(i,s,l),h=t(i,s,l);return this.internalPlacement.setTranslate(h[0]-this._offset*a,h[1]+this._offset*o),this._angleToLine&&this.internalPlacement.setRotateCS(o,a),this.internalPlacement}return this.iteratePath=!1,null}this._relativeTo===s.LineEnd&&n(e);const r=this.onLine(e,i);return this._relativeTo===s.LineEnd&&n(e),r}onLine(e,n){let i,r=!1;switch(this._relativeTo){case s.LineMiddle:default:i=this._curveHelper.calculatePathLength(e)/2+n;break;case s.LineBeginning:i=n;break;case s.LineEnd:i=n,r=!0}const l=e.length;let o,a=0,h=e[0];for(let s=1;s<l;++s){o=h,h=e[s];const n=this._curveHelper.calculateLength(o,h);if(a+n>i){const e=(i-a)/n,[s,l]=this._curveHelper.getAngleCS(o,h,e),c=t(o,h,e),u=r?-this._offset:this._offset;return this.internalPlacement.setTranslate(c[0]-u*l,c[1]+u*s),this._angleToLine&&(r?this.internalPlacement.setRotateCS(-s,-l):this.internalPlacement.setRotateCS(s,l)),this.internalPlacement}a+=n}return null}}export{l as PlacementOnLine};