@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 15.8 kB
JavaScript
import{isPoint as s,isMultipoint as t,isPolyline as i,isPolygon as h}from"../../../geometry/support/jsonUtils.js";import{setId as e}from"../CIMCursor.js";import{GeometricEffectControlMeasureLineRule as r}from"../enums.js";class _{static local(){return null===_.instance&&(_.instance=new _),_.instance}execute(s,t,i,h,e){return new c(s,t,i)}}_.instance=null;class c{constructor(s,t,i){this._defaultPointSize=20,this._inputGeometries=s,this._geomUnitsPerPoint=i,this._rule=t.rule??r.FullGeometry,this._defaultSize=this._defaultPointSize*i}next(){let e;for(;e=this._inputGeometries.next();){let r;if(s(e)?r=this._processGeom([[[e.x,e.y]]]):t(e)?r=this._processGeom([e.points]):i(e)?r=this._processGeom(e.paths):h(e)&&(r=this._processGeom(e.rings)),r&&r.length)return{paths:r}}return null}_clone(s){return[s[0],s[1]]}_mid(s,t){return[(s[0]+t[0])/2,(s[1]+t[1])/2]}_mix(s,t,i,h){return[s[0]*t+i[0]*h,s[1]*t+i[1]*h]}_add(s,t){return[s[0]+t[0],s[1]+t[1]]}_add2(s,t,i){return[s[0]+t,s[1]+i]}_sub(s,t){return[s[0]-t[0],s[1]-t[1]]}_dist(s,t){return Math.sqrt((s[0]-t[0])*(s[0]-t[0])+(s[1]-t[1])*(s[1]-t[1]))}_norm(s){return Math.sqrt(s[0]*s[0]+s[1]*s[1])}_normalize(s,t=1){const i=t/this._norm(s);s[0]*=i,s[1]*=i}_leftPerpendicular(s){const t=-s[1],i=s[0];s[0]=t,s[1]=i}_leftPerp(s){return[-s[1],s[0]]}_rightPerpendicular(s){const t=s[1],i=-s[0];s[0]=t,s[1]=i}_rightPerp(s){return[s[1],-s[0]]}_dotProduct(s,t){return s[0]*t[0]+s[1]*t[1]}_crossProduct(s,t){return s[0]*t[1]-s[1]*t[0]}_rotateDirect(s,t,i){const h=s[0]*t-s[1]*i,e=s[0]*i+s[1]*t;s[0]=h,s[1]=e}_makeCtrlPt(s){const t=[s[0],s[1]];return e(t,1),t}_addAngledTicks(s,t,i,h){const e=this._sub(i,t);this._normalize(e);const r=this._crossProduct(e,this._sub(h,t));let _;_=r>0?this._rightPerp(e):this._leftPerp(e);const c=Math.abs(r)/2,u=[];u.push([t[0]+(_[0]-e[0])*c,t[1]+(_[1]-e[1])*c]),u.push(t),u.push(i),u.push([i[0]+(_[0]+e[0])*c,i[1]+(_[1]+e[1])*c]),s.push(u)}_addBezier2(s,t,i,h,e){if(0==e--)return void s.push(h);const r=this._mid(t,i),_=this._mid(i,h),c=this._mid(r,_);this._addBezier2(s,t,r,c,e),this._addBezier2(s,c,_,h,e)}_addBezier3(s,t,i,h,e,r){if(0==r--)return void s.push(e);const _=this._mid(t,i),c=this._mid(i,h),u=this._mid(h,e),o=this._mid(_,c),n=this._mid(c,u),a=this._mid(o,n);this._addBezier3(s,t,_,o,a,r),this._addBezier3(s,a,n,u,e,r)}_add90DegArc(s,t,i,h,e){const r=e??this._crossProduct(this._sub(i,t),this._sub(h,t))>0,_=this._mid(t,i),c=this._sub(_,t);r?this._leftPerpendicular(c):this._rightPerpendicular(c),_[0]+=c[0],_[1]+=c[1],this._addBezier3(s,t,this._mix(t,.33333,_,.66667),this._mix(i,.33333,_,.66667),i,4)}_addArrow(s,t,i){const h=t[0],e=t[1],r=t[t.length-1],_=this._sub(h,e);this._normalize(_);const c=this._crossProduct(_,this._sub(r,e)),u=.5*c,o=this._leftPerp(_),n=[r[0]-o[0]*c,r[1]-o[1]*c],a=t.length-1,p=[];p.push(i?[-o[0],-o[1]]:o);let l=[-_[0],-_[1]];for(let d=1;d<a-1;d++){const s=this._sub(t[d+1],t[d]);this._normalize(s);const i=this._dotProduct(s,l),h=this._crossProduct(s,l),e=Math.sqrt((1+i)/2),r=this._sub(s,l);this._normalize(r),r[0]/=e,r[1]/=e,p.push(h<0?[-r[0],-r[1]]:r),l=s}p.push(this._rightPerp(l));for(let d=p.length-1;d>0;d--)s.push([t[d][0]+p[d][0]*u,t[d][1]+p[d][1]*u]);s.push([n[0]+p[0][0]*u,n[1]+p[0][1]*u]),s.push([n[0]+p[0][0]*c,n[1]+p[0][1]*c]),s.push(h),s.push([n[0]-p[0][0]*c,n[1]-p[0][1]*c]),s.push([n[0]-p[0][0]*u,n[1]-p[0][1]*u]);for(let d=1;d<p.length;d++)s.push([t[d][0]-p[d][0]*u,t[d][1]-p[d][1]*u])}_cp2(s,t,i){return s.length>=2?s[1]:this._add2(s[0],t*this._defaultSize,i*this._defaultSize)}_cp3(s,t,i,h){if(s.length>=3)return s[2];const e=this._mix(s[0],1-i,t,i),r=this._sub(t,s[0]);return this._normalize(r),this._rightPerpendicular(r),[e[0]+r[0]*h*this._defaultSize,e[1]+r[1]*h*this._defaultSize]}_arrowPath(s){if(s.length>2)return s;const t=s[0],i=this._cp2(s,-4,0),h=this._sub(t,i);this._normalize(h);const e=this._rightPerp(h);return[t,i,[t[0]+(e[0]-h[0])*this._defaultSize,t[1]+(e[1]-h[1])*this._defaultSize]]}_arrowLastSeg(s){const t=s[0],i=this._cp2(s,-4,0);let h;if(s.length>=3)h=s[s.length-1];else{const s=this._sub(t,i);this._normalize(s);const e=this._rightPerp(s);h=[t[0]+(e[0]-s[0])*this._defaultSize,t[1]+(e[1]-s[1])*this._defaultSize]}return[i,h]}_processGeom(s){if(!s)return null;const t=[];for(const i of s){if(!i||0===i.length)continue;const s=i.length;let h=i[0];switch(this._rule){case r.PerpendicularFromFirstSegment:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,4),r=[];r.push(e),r.push(this._mid(h,s)),t.push(r);break}case r.ReversedFirstSegment:{const s=this._cp2(i,0,-1);t.push([s,h]);break}case r.PerpendicularToSecondSegment:{const s=this._cp2(i,-4,1),e=this._cp3(i,s,.882353,-1.94),r=[];r.push(this._mid(s,e)),r.push(h),t.push(r);break}case r.SecondSegmentWithTicks:{const s=this._cp2(i,-4,1),e=this._cp3(i,s,.882353,-1.94),r=this._sub(e,s);let _;_=this._crossProduct(r,this._sub(h,s))>0?this._rightPerp(_):this._leftPerp(r);const c=[];c.push([s[0]+(_[0]-r[0])/3,s[1]+(_[1]-r[1])/3]),c.push(s),c.push(e),c.push([e[0]+(_[0]+r[0])/3,e[1]+(_[1]+r[1])/3]),t.push(c);break}case r.DoublePerpendicular:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,3),r=this._mid(h,s),_=this._sub(r,e);this._normalize(_);const c=this._crossProduct(_,this._sub(h,e));this._leftPerpendicular(_);const u=[];u.push(h),u.push([e[0]+_[0]*c,e[1]+_[1]*c]),t.push(u);const o=[];o.push([e[0]-_[0]*c,e[1]-_[1]*c]),o.push(s),t.push(o);break}case r.OppositeToFirstSegment:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,3),r=this._mid(h,s),_=this._sub(r,e);this._normalize(_);const c=this._crossProduct(_,this._sub(h,e));this._leftPerpendicular(_);const u=[];u.push([e[0]+_[0]*c,e[1]+_[1]*c]),u.push([e[0]-_[0]*c,e[1]-_[1]*c]),t.push(u);break}case r.TriplePerpendicular:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,4),r=this._mid(h,s),_=this._sub(r,e);this._normalize(_);const c=this._crossProduct(_,this._sub(h,e));this._leftPerpendicular(_);const u=[];u.push([e[0]+_[0]*c*.8,e[1]+_[1]*c*.8]),u.push([r[0]+.8*(h[0]-r[0]),r[1]+.8*(h[1]-r[1])]),t.push(u),t.push([e,r]);const o=[];o.push([e[0]-_[0]*c*.8,e[1]-_[1]*c*.8]),o.push([r[0]+.8*(s[0]-r[0]),r[1]+.8*(s[1]-r[1])]),t.push(o);break}case r.HalfCircleFirstSegment:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,4),r=this._mid(h,s);let _=this._sub(s,h);const c=Math.cos(Math.PI/18),u=Math.sin(Math.PI/18),o=Math.sqrt((1+c)/2),n=Math.sqrt((1-c)/2),a=[];let p;this._crossProduct(_,this._sub(e,h))>0?(a.push(h),_=this._sub(h,r),p=s):(a.push(s),_=this._sub(s,r),p=h),this._rotateDirect(_,o,n),_[0]/=o,_[1]/=o;for(let t=1;t<=18;t++)a.push(this._add(r,_)),this._rotateDirect(_,c,u);a.push(p),t.push(a);break}case r.HalfCircleSecondSegment:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,1,-1);let r=this._sub(h,s);this._normalize(r);const _=this._crossProduct(r,this._sub(e,s))/2;this._leftPerpendicular(r);const c=[s[0]+r[0]*_,s[1]+r[1]*_];r=this._sub(s,c);const u=Math.cos(Math.PI/18);let o=Math.sin(Math.PI/18);_>0&&(o=-o);const n=[s];for(let t=1;t<=18;t++)this._rotateDirect(r,u,o),n.push(this._add(c,r));t.push(n);break}case r.HalfCircleExtended:{const e=this._cp2(i,0,-2),r=this._cp3(i,e,1,-1);let _;if(s>=4)_=i[3];else{const s=this._sub(h,e);_=this._add(r,s)}const c=this._dist(e,r)/2/.75,u=this._sub(e,h);this._normalize(u,c);const o=this._sub(r,_);this._normalize(o,c);const n=[_,r];t.push(n);const a=[this._clone(r)];this._addBezier3(a,r,this._add(r,o),this._add(e,u),e,4),a.push(h),t.push(a);break}case r.OpenCircle:{const s=this._cp2(i,-2,0),e=this._sub(s,h),r=Math.cos(Math.PI/18),_=-Math.sin(Math.PI/18),c=[s];for(let t=1;t<=33;t++)this._rotateDirect(e,r,_),c.push(this._add(h,e));t.push(c);break}case r.CoverageEdgesWithTicks:{const e=this._cp2(i,0,-1);let r,_;if(s>=3)r=i[2];else{const s=this._sub(e,h),t=this._leftPerp(s);r=[h[0]+t[0]-.25*s[0],h[1]+t[1]-.25*s[1]]}if(s>=4)_=i[3];else{const s=this._mid(h,e),t=this._sub(h,e);this._normalize(t),this._leftPerpendicular(t);const i=this._crossProduct(t,this._sub(r,s));this._rightPerpendicular(t),_=[r[0]+t[0]*i*2,r[1]+t[1]*i*2]}const c=this._sub(e,h);let u,o;u=this._crossProduct(c,this._sub(r,h))>0?this._rightPerp(c):this._leftPerp(c),o=[],o.push(r),o.push(h),o.push([h[0]+(u[0]-c[0])/3,h[1]+(u[1]-c[1])/3]),t.push(o),u=this._crossProduct(c,this._sub(_,e))>0?this._rightPerp(u):this._leftPerp(c),o=[],o.push([e[0]+(u[0]+c[0])/3,e[1]+(u[1]+c[1])/3]),o.push(e),o.push(_),t.push(o);break}case r.GapExtentWithDoubleTicks:{const e=this._cp2(i,0,2),r=this._cp3(i,e,0,1);let _;if(s>=4)_=i[3];else{const s=this._sub(e,h);_=this._add(r,s)}this._addAngledTicks(t,h,e,this._mid(r,_)),this._addAngledTicks(t,r,_,this._mid(h,e));break}case r.GapExtentMidline:{const e=this._cp2(i,2,0),r=this._cp3(i,e,0,1);let _;if(s>=4)_=i[3];else{const s=this._sub(e,h);_=this._add(r,s)}const c=[];c.push(this._mid(h,r)),c.push(this._mid(e,_)),t.push(c);break}case r.Chevron:{const e=this._cp2(i,-1,-1);let r;if(s>=3)r=i[2];else{const s=this._sub(e,h);this._leftPerpendicular(s),r=this._add(h,s)}t.push([e,this._makeCtrlPt(h),r]);break}case r.PerpendicularWithArc:{const s=this._cp2(i,0,-2),e=this._cp3(i,s,.5,-1);let r=this._sub(s,h);const _=this._norm(r);r[0]/=_,r[1]/=_;const c=this._crossProduct(r,this._sub(e,h));let u=this._dotProduct(r,this._sub(e,h));u<.05*_?u=.05*_:u>.95*_&&(u=.95*_);const o=[h[0]+r[0]*u,h[1]+r[1]*u];this._leftPerpendicular(r);let n=[];n.push([o[0]-r[0]*c,o[1]-r[1]*c]),n.push([o[0]+r[0]*c,o[1]+r[1]*c]),t.push(n);const a=[s[0]+r[0]*c,s[1]+r[1]*c];r=this._sub(s,a);const p=Math.cos(Math.PI/18);let l=Math.sin(Math.PI/18);c<0&&(l=-l),n=[h,s];for(let t=1;t<=9;t++)this._rotateDirect(r,p,l),n.push(this._add(a,r));t.push(n);break}case r.ClosedHalfCircle:{const s=this._cp2(i,2,0),e=this._mid(h,s),r=this._sub(s,e),_=Math.cos(Math.PI/18),c=Math.sin(Math.PI/18),u=[h,s];for(let t=1;t<=18;t++)this._rotateDirect(r,_,c),u.push(this._add(e,r));t.push(u);break}case r.TripleParallelExtended:{const s=this._cp2(i,0,-2),r=this._cp3(i,s,1,-2),_=this._mid(h,s),c=this._sub(r,s);this._normalize(c);const u=Math.abs(this._crossProduct(c,this._sub(_,s)))/2,o=this._dist(s,r),n=[s,h];n.push([h[0]+c[0]*o*.5,h[1]+c[1]*o*.5]),t.push(n);const a=[];a.push([_[0]-c[0]*u,_[1]-c[1]*u]),a.push([_[0]+c[0]*o*.375,_[1]+c[1]*o*.375]),e(a[a.length-1],1),a.push([_[0]+c[0]*o*.75,_[1]+c[1]*o*.75]),t.push(a);const p=[s,r];t.push(p);break}case r.ParallelWithTicks:{const s=this._cp2(i,3,0),e=this._cp3(i,s,.5,-1),r=this._sub(e,s);this._normalize(r);const _=this._crossProduct(r,this._sub(e,h));this._leftPerpendicular(r),this._addAngledTicks(t,h,s,e),this._addAngledTicks(t,this._mix(h,1,r,_),this._mix(s,1,r,_),this._mid(h,s));break}case r.Parallel:{const s=this._cp2(i,3,0),e=this._cp3(i,s,.5,-1),r=this._sub(s,h);this._normalize(r);const _=this._leftPerp(r),c=this._crossProduct(r,this._sub(e,h));let u=[h,s];t.push(u),u=[],u.push([h[0]+_[0]*c,h[1]+_[1]*c]),u.push([s[0]+_[0]*c,s[1]+_[1]*c]),t.push(u);break}case r.PerpendicularToFirstSegment:{const s=this._cp2(i,3,0),e=this._cp3(i,s,.5,-1),r=this._mid(h,s),_=this._sub(s,h);this._normalize(_);const c=this._crossProduct(_,this._sub(e,h));this._leftPerpendicular(_);const u=[];u.push([r[0]-_[0]*c*.25,r[1]-_[1]*c*.25]),u.push([r[0]+_[0]*c*1.25,r[1]+_[1]*c*1.25]),t.push(u);break}case r.ParallelOffset:{const s=this._cp2(i,3,0),e=this._cp3(i,s,.5,-1),r=this._sub(s,h);this._normalize(r);const _=this._crossProduct(r,this._sub(e,h));this._leftPerpendicular(r);const c=[];c.push([h[0]-r[0]*_,h[1]-r[1]*_]),c.push([s[0]-r[0]*_,s[1]-r[1]*_]),t.push(c);const u=[];u.push([h[0]+r[0]*_,h[1]+r[1]*_]),u.push([s[0]+r[0]*_,s[1]+r[1]*_]),t.push(u);break}case r.OffsetOpposite:{const s=this._cp2(i,3,0),e=this._cp3(i,s,.5,-1),r=this._sub(s,h);this._normalize(r);const _=this._crossProduct(r,this._sub(e,h));this._leftPerpendicular(r);const c=[];c.push([h[0]-r[0]*_,h[1]-r[1]*_]),c.push([s[0]-r[0]*_,s[1]-r[1]*_]),t.push(c);break}case r.OffsetSame:{const s=this._cp2(i,3,0),e=this._cp3(i,s,.5,-1),r=this._sub(s,h);this._normalize(r);const _=this._crossProduct(r,this._sub(e,h));this._leftPerpendicular(r);const c=[];c.push([h[0]+r[0]*_,h[1]+r[1]*_]),c.push([s[0]+r[0]*_,s[1]+r[1]*_]),t.push(c);break}case r.CircleWithArc:{let r=this._cp2(i,3,0);const _=this._cp3(i,r,.5,-1);let c,u;if(s>=4)c=i[3],u=this._crossProduct(this._sub(c,r),this._sub(_,r))>0;else{c=r,u=this._crossProduct(this._sub(c,h),this._sub(_,h))>0;const s=24*this._geomUnitsPerPoint,t=this._sub(c,h);this._normalize(t,s);const i=Math.sqrt(2)/2;this._rotateDirect(t,i,u?i:-i),r=this._add(h,t)}const o=this._sub(r,h),n=Math.cos(Math.PI/18),a=Math.sin(Math.PI/18),p=[r];for(let s=1;s<=36;s++)this._rotateDirect(o,n,a),p.push(this._add(h,o));this._add90DegArc(p,r,c,_,u),e(p[p.length-8],1),t.push(p);break}case r.DoubleJog:{let e,r,_=this._cp2(i,-3,1);if(e=s>=3?i[2]:this._add(h,this._sub(h,_)),s>=4)r=i[3];else{const s=h;h=_,r=e;const t=this._dist(h,s),i=this._dist(r,s);let c=30*this._geomUnitsPerPoint;.5*t<c&&(c=.5*t),.5*i<c&&(c=.5*i),_=this._mix(h,c/t,s,(t-c)/t),e=this._mix(r,c/i,s,(i-c)/i)}const c=this._mid(h,_),u=this._mid(r,e),o=this._dist(h,_),n=this._dist(e,r);let a=Math.min(o,n)/8;a=Math.min(a,24*this._geomUnitsPerPoint);const p=Math.cos(Math.PI/4);let l=this._sub(h,_);this._normalize(l,a),this._crossProduct(l,this._sub(r,_))>0?this._rotateDirect(l,p,-p):this._rotateDirect(l,p,p);let d=[];d.push(_),d.push(this._add(c,l)),d.push(this._sub(c,l)),d.push(h),t.push(d),l=this._sub(r,e),this._normalize(l,a),this._crossProduct(l,this._sub(h,e))<0?this._rotateDirect(l,p,p):this._rotateDirect(l,p,-p),d=[],d.push(e),d.push(this._add(u,l)),d.push(this._sub(u,l)),d.push(r),t.push(d);break}case r.PerpendicularOffset:{const s=this._cp2(i,-4,1),e=this._cp3(i,s,.882353,-1.94),r=this._sub(e,s);this._crossProduct(r,this._sub(h,s))>0?this._rightPerpendicular(r):this._leftPerpendicular(r);const _=[r[0]/8,r[1]/8],c=this._sub(this._mid(s,e),_);t.push([c,h]);break}case r.LineExcludingLastSegment:{const s=this._arrowPath(i),h=[];let e=s.length-2;for(;e--;)h.push(s[e]);t.push(h);break}case r.MultivertexArrow:{const s=this._arrowPath(i),h=[];this._addArrow(h,s,!1),t.push(h);break}case r.CrossedArrow:{const s=this._arrowPath(i),h=[];this._addArrow(h,s,!0),t.push(h);break}case r.ChevronArrow:{const[s,e]=this._arrowLastSeg(i),r=10*this._geomUnitsPerPoint,_=this._sub(h,s);this._normalize(_);const c=this._crossProduct(_,this._sub(e,s)),u=this._leftPerp(_),o=[e[0]-u[0]*c*2,e[1]-u[1]*c*2],n=[];n.push([e[0]+_[0]*r,e[1]+_[1]*r]),n.push(h),n.push([o[0]+_[0]*r,o[1]+_[1]*r]),t.push(n);break}case r.ChevronArrowOffset:{const[s,e]=this._arrowLastSeg(i),r=this._sub(h,s);this._normalize(r);const _=this._crossProduct(r,this._sub(e,s));this._leftPerpendicular(r);const c=[e[0]-r[0]*_,e[1]-r[1]*_],u=[];u.push([c[0]+r[0]*_*.5,c[1]+r[1]*_*.5]),u.push(this._mid(c,h)),u.push([c[0]-r[0]*_*.5,c[1]-r[1]*_*.5]),t.push(u);break}case r.PartialFirstSegment:{const[s,e]=this._arrowLastSeg(i),r=this._sub(h,s);this._normalize(r);const _=this._crossProduct(r,this._sub(e,s));this._leftPerpendicular(r);const c=[e[0]-r[0]*_,e[1]-r[1]*_];t.push([s,c]);break}case r.Arch:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,1),r=this._sub(h,s),_=this._mix(e,1,r,.55),c=this._mix(e,1,r,-.55),u=[h];this._addBezier2(u,h,_,e,4),this._addBezier2(u,e,c,s,4),t.push(u);break}case r.CurvedParallelTicks:{const s=this._cp2(i,-4,1),e=this._cp3(i,s,.882353,-1.94),r=this._sub(e,s);this._crossProduct(r,this._sub(h,s))>0?this._rightPerpendicular(r):this._leftPerpendicular(r);const _=[r[0]/8,r[1]/8],c=this._sub(this._mid(s,e),_),u=this._sub(this._mix(s,.75,e,.25),_),o=this._sub(this._mix(s,.25,e,.75),_),n=[s];this._addBezier2(n,s,u,c,3),this._addBezier2(n,c,o,e,3),t.push(n);for(let i=0;i<8;i++){const s=n[2*i+1],h=[this._clone(s)];h.push(this._add(s,[r[0]/4,r[1]/4])),t.push(h)}break}case r.Arc90Degrees:{const s=this._cp2(i,0,-1),e=this._cp3(i,s,.5,1),r=[s];this._add90DegArc(r,s,h,e),t.push(r);break}case r.FullGeometry:default:t.push(i)}}return t}}export{_ as EffectControlMeasureLine};