rm-graphical-computing-node 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1 -1
- package/package.json +31 -31
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var bs=Object.create;var so=Object.defineProperty;var Ts=Object.getOwnPropertyDescriptor;var Ps=Object.getOwnPropertyNames;var Ss=Object.getPrototypeOf,Rs=Object.prototype.hasOwnProperty;var ke=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var zs=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ps(t))!Rs.call(e,o)&&o!==n&&so(e,o,{get:()=>t[o],enumerable:!(s=Ts(t,o))||s.enumerable});return e};var Vs=(e,t,n)=>(n=e!=null?bs(Ss(e)):{},zs(t||!e||!e.__esModule?so(n,"default",{value:e,enumerable:!0}):n,e));var Io=ke((qn,$n)=>{(function(e,t){typeof qn=="object"&&typeof $n<"u"?$n.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.RBush=t())})(qn,function(){"use strict";function e(d,x,w,P,S){t(d,x,w||0,P||d.length-1,S||s)}function t(d,x,w,P,S){for(;P>w;){if(P-w>600){var b=P-w+1,R=x-w+1,z=Math.log(b),V=.5*Math.exp(2*z/3),M=.5*Math.sqrt(z*V*(b-V)/b)*(R-b/2<0?-1:1),v=Math.max(w,Math.floor(x-R*V/b+M)),I=Math.min(P,Math.floor(x+(b-R)*V/b+M));t(d,x,v,I,S)}var D=d[x],B=w,_=P;for(n(d,w,x),S(d[P],D)>0&&n(d,w,P);B<_;){for(n(d,B,_),B++,_--;S(d[B],D)<0;)B++;for(;S(d[_],D)>0;)_--}S(d[w],D)===0?n(d,w,_):(_++,n(d,_,P)),_<=x&&(w=_+1),x<=_&&(P=_-1)}}function n(d,x,w){var P=d[x];d[x]=d[w],d[w]=P}function s(d,x){return d<x?-1:d>x?1:0}var o=function(x){x===void 0&&(x=9),this._maxEntries=Math.max(4,x),this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4)),this.clear()};o.prototype.all=function(){return this._all(this.data,[])},o.prototype.search=function(x){var w=this.data,P=[];if(!T(x,w))return P;for(var S=this.toBBox,b=[];w;){for(var R=0;R<w.children.length;R++){var z=w.children[R],V=w.leaf?S(z):z;T(x,V)&&(w.leaf?P.push(z):g(x,V)?this._all(z,P):b.push(z))}w=b.pop()}return P},o.prototype.collides=function(x){var w=this.data;if(!T(x,w))return!1;for(var P=[];w;){for(var S=0;S<w.children.length;S++){var b=w.children[S],R=w.leaf?this.toBBox(b):b;if(T(x,R)){if(w.leaf||g(x,R))return!0;P.push(b)}}w=P.pop()}return!1},o.prototype.load=function(x){if(!(x&&x.length))return this;if(x.length<this._minEntries){for(var w=0;w<x.length;w++)this.insert(x[w]);return this}var P=this._build(x.slice(),0,x.length-1,0);if(!this.data.children.length)this.data=P;else if(this.data.height===P.height)this._splitRoot(this.data,P);else{if(this.data.height<P.height){var S=this.data;this.data=P,P=S}this._insert(P,this.data.height-P.height-1,!0)}return this},o.prototype.insert=function(x){return x&&this._insert(x,this.data.height-1),this},o.prototype.clear=function(){return this.data=y([]),this},o.prototype.remove=function(x,w){if(!x)return this;for(var P=this.data,S=this.toBBox(x),b=[],R=[],z,V,M;P||b.length;){if(P||(P=b.pop(),V=b[b.length-1],z=R.pop(),M=!0),P.leaf){var v=r(x,P.children,w);if(v!==-1)return P.children.splice(v,1),b.push(P),this._condense(b),this}!M&&!P.leaf&&g(P,S)?(b.push(P),R.push(z),z=0,V=P,P=P.children[0]):V?(z++,P=V.children[z],M=!1):P=null}return this},o.prototype.toBBox=function(x){return x},o.prototype.compareMinX=function(x,w){return x.minX-w.minX},o.prototype.compareMinY=function(x,w){return x.minY-w.minY},o.prototype.toJSON=function(){return this.data},o.prototype.fromJSON=function(x){return this.data=x,this},o.prototype._all=function(x,w){for(var P=[];x;)x.leaf?w.push.apply(w,x.children):P.push.apply(P,x.children),x=P.pop();return w},o.prototype._build=function(x,w,P,S){var b=P-w+1,R=this._maxEntries,z;if(b<=R)return z=y(x.slice(w,P+1)),i(z,this.toBBox),z;S||(S=Math.ceil(Math.log(b)/Math.log(R)),R=Math.ceil(b/Math.pow(R,S-1))),z=y([]),z.leaf=!1,z.height=S;var V=Math.ceil(b/R),M=V*Math.ceil(Math.sqrt(R));p(x,w,P,M,this.compareMinX);for(var v=w;v<=P;v+=M){var I=Math.min(v+M-1,P);p(x,v,I,V,this.compareMinY);for(var D=v;D<=I;D+=V){var B=Math.min(D+V-1,I);z.children.push(this._build(x,D,B,S-1))}}return i(z,this.toBBox),z},o.prototype._chooseSubtree=function(x,w,P,S){for(;S.push(w),!(w.leaf||S.length-1===P);){for(var b=1/0,R=1/0,z=void 0,V=0;V<w.children.length;V++){var M=w.children[V],v=a(M),I=m(x,M)-v;I<R?(R=I,b=v<b?v:b,z=M):I===R&&v<b&&(b=v,z=M)}w=z||w.children[0]}return w},o.prototype._insert=function(x,w,P){var S=P?x:this.toBBox(x),b=[],R=this._chooseSubtree(S,this.data,w,b);for(R.children.push(x),f(R,S);w>=0&&b[w].children.length>this._maxEntries;)this._split(b,w),w--;this._adjustParentBBoxes(S,b,w)},o.prototype._split=function(x,w){var P=x[w],S=P.children.length,b=this._minEntries;this._chooseSplitAxis(P,b,S);var R=this._chooseSplitIndex(P,b,S),z=y(P.children.splice(R,P.children.length-R));z.height=P.height,z.leaf=P.leaf,i(P,this.toBBox),i(z,this.toBBox),w?x[w-1].children.push(z):this._splitRoot(P,z)},o.prototype._splitRoot=function(x,w){this.data=y([x,w]),this.data.height=x.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},o.prototype._chooseSplitIndex=function(x,w,P){for(var S,b=1/0,R=1/0,z=w;z<=P-w;z++){var V=l(x,0,z,this.toBBox),M=l(x,z,P,this.toBBox),v=h(V,M),I=a(V)+a(M);v<b?(b=v,S=z,R=I<R?I:R):v===b&&I<R&&(R=I,S=z)}return S||P-w},o.prototype._chooseSplitAxis=function(x,w,P){var S=x.leaf?this.compareMinX:u,b=x.leaf?this.compareMinY:E,R=this._allDistMargin(x,w,P,S),z=this._allDistMargin(x,w,P,b);R<z&&x.children.sort(S)},o.prototype._allDistMargin=function(x,w,P,S){x.children.sort(S);for(var b=this.toBBox,R=l(x,0,w,b),z=l(x,P-w,P,b),V=c(R)+c(z),M=w;M<P-w;M++){var v=x.children[M];f(R,x.leaf?b(v):v),V+=c(R)}for(var I=P-w-1;I>=w;I--){var D=x.children[I];f(z,x.leaf?b(D):D),V+=c(z)}return V},o.prototype._adjustParentBBoxes=function(x,w,P){for(var S=P;S>=0;S--)f(w[S],x)},o.prototype._condense=function(x){for(var w=x.length-1,P=void 0;w>=0;w--)x[w].children.length===0?w>0?(P=x[w-1].children,P.splice(P.indexOf(x[w]),1)):this.clear():i(x[w],this.toBBox)};function r(d,x,w){if(!w)return x.indexOf(d);for(var P=0;P<x.length;P++)if(w(d,x[P]))return P;return-1}function i(d,x){l(d,0,d.children.length,x,d)}function l(d,x,w,P,S){S||(S=y(null)),S.minX=1/0,S.minY=1/0,S.maxX=-1/0,S.maxY=-1/0;for(var b=x;b<w;b++){var R=d.children[b];f(S,d.leaf?P(R):R)}return S}function f(d,x){return d.minX=Math.min(d.minX,x.minX),d.minY=Math.min(d.minY,x.minY),d.maxX=Math.max(d.maxX,x.maxX),d.maxY=Math.max(d.maxY,x.maxY),d}function u(d,x){return d.minX-x.minX}function E(d,x){return d.minY-x.minY}function a(d){return(d.maxX-d.minX)*(d.maxY-d.minY)}function c(d){return d.maxX-d.minX+(d.maxY-d.minY)}function m(d,x){return(Math.max(x.maxX,d.maxX)-Math.min(x.minX,d.minX))*(Math.max(x.maxY,d.maxY)-Math.min(x.minY,d.minY))}function h(d,x){var w=Math.max(d.minX,x.minX),P=Math.max(d.minY,x.minY),S=Math.min(d.maxX,x.maxX),b=Math.min(d.maxY,x.maxY);return Math.max(0,S-w)*Math.max(0,b-P)}function g(d,x){return d.minX<=x.minX&&d.minY<=x.minY&&x.maxX<=d.maxX&&x.maxY<=d.maxY}function T(d,x){return x.minX<=d.maxX&&x.minY<=d.maxY&&x.maxX>=d.minX&&x.maxY>=d.minY}function y(d){return{children:d,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function p(d,x,w,P,S){for(var b=[x,w];b.length;)if(w=b.pop(),x=b.pop(),!(w-x<=P)){var R=x+Math.ceil((w-x)/P/2)*P;e(d,R,x,w,S),b.push(x,R,R,w)}}return o})});var Lo=ke((Xn,Yn)=>{(function(e,t){typeof Xn=="object"&&typeof Yn<"u"?Yn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.TinyQueue=t())})(Xn,function(){"use strict";var e=function(s,o){if(s===void 0&&(s=[]),o===void 0&&(o=t),this.data=s,this.length=this.data.length,this.compare=o,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};e.prototype.push=function(s){this.data.push(s),this.length++,this._up(this.length-1)},e.prototype.pop=function(){if(this.length!==0){var s=this.data[0],o=this.data.pop();return this.length--,this.length>0&&(this.data[0]=o,this._down(0)),s}},e.prototype.peek=function(){return this.data[0]},e.prototype._up=function(s){for(var o=this,r=o.data,i=o.compare,l=r[s];s>0;){var f=s-1>>1,u=r[f];if(i(l,u)>=0)break;r[s]=u,s=f}r[s]=l},e.prototype._down=function(s){for(var o=this,r=o.data,i=o.compare,l=this.length>>1,f=r[s];s<l;){var u=(s<<1)+1,E=r[u],a=u+1;if(a<this.length&&i(r[a],E)<0&&(u=a,E=r[a]),i(E,f)>=0)break;r[s]=E,s=u}r[s]=f};function t(n,s){return n<s?-1:n>s?1:0}return e})});var Fo=ke((Sf,Ao)=>{Ao.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=(o-s)/2,u=0,E=f-1;u<f;E=u++){var a=n[s+u*2+0],c=n[s+u*2+1],m=n[s+E*2+0],h=n[s+E*2+1],g=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;g&&(l=!l)}return l}});var No=ke((Rf,Oo)=>{Oo.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=o-s,u=0,E=f-1;u<f;E=u++){var a=n[u+s][0],c=n[u+s][1],m=n[E+s][0],h=n[E+s][1],g=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;g&&(l=!l)}return l}});var qo=ke((zf,wn)=>{var Wo=Fo(),jo=No();wn.exports=function(t,n,s,o){return n.length>0&&Array.isArray(n[0])?jo(t,n,s,o):Wo(t,n,s,o)};wn.exports.nested=jo;wn.exports.flat=Wo});var Xo=ke((bn,$o)=>{(function(e,t){typeof bn=="object"&&typeof $o<"u"?t(bn):typeof define=="function"&&define.amd?define(["exports"],t):t((e=e||self).predicates={})})(bn,function(e){"use strict";let n=33306690738754706e-32;function s(m,h,g,T,y){let p,d,x,w,P=h[0],S=T[0],b=0,R=0;S>P==S>-P?(p=P,P=h[++b]):(p=S,S=T[++R]);let z=0;if(b<m&&R<g)for(S>P==S>-P?(x=p-((d=P+p)-P),P=h[++b]):(x=p-((d=S+p)-S),S=T[++R]),p=d,x!==0&&(y[z++]=x);b<m&&R<g;)S>P==S>-P?(x=p-((d=p+P)-(w=d-p))+(P-w),P=h[++b]):(x=p-((d=p+S)-(w=d-p))+(S-w),S=T[++R]),p=d,x!==0&&(y[z++]=x);for(;b<m;)x=p-((d=p+P)-(w=d-p))+(P-w),P=h[++b],p=d,x!==0&&(y[z++]=x);for(;R<g;)x=p-((d=p+S)-(w=d-p))+(S-w),S=T[++R],p=d,x!==0&&(y[z++]=x);return p===0&&z!==0||(y[z++]=p),z}function o(m){return new Float64Array(m)}let r=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,f=o(4),u=o(8),E=o(12),a=o(16),c=o(4);e.orient2d=function(m,h,g,T,y,p){let d=(h-p)*(g-y),x=(m-y)*(T-p),w=d-x;if(d===0||x===0||d>0!=x>0)return w;let P=Math.abs(d+x);return Math.abs(w)>=r*P?w:-(function(S,b,R,z,V,M,v){let I,D,B,_,k,H,F,j,$,K,Y,tt,it,ct,ut,q,W,Z,wt=S-V,Ft=R-V,Nt=b-M,jt=z-M;k=(ut=(j=wt-(F=(H=134217729*wt)-(H-wt)))*(K=jt-($=(H=134217729*jt)-(H-jt)))-((ct=wt*jt)-F*$-j*$-F*K))-(Y=ut-(W=(j=Nt-(F=(H=134217729*Nt)-(H-Nt)))*(K=Ft-($=(H=134217729*Ft)-(H-Ft)))-((q=Nt*Ft)-F*$-j*$-F*K))),f[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),f[1]=it-(Y+k)+(k-q),k=(Z=tt+Y)-tt,f[2]=tt-(Z-k)+(Y-k),f[3]=Z;let Lt=(function(Bt,J){let ft=J[0];for(let Q=1;Q<Bt;Q++)ft+=J[Q];return ft})(4,f),Tt=i*v;if(Lt>=Tt||-Lt>=Tt||(I=S-(wt+(k=S-wt))+(k-V),B=R-(Ft+(k=R-Ft))+(k-V),D=b-(Nt+(k=b-Nt))+(k-M),_=z-(jt+(k=z-jt))+(k-M),I===0&&D===0&&B===0&&_===0)||(Tt=l*v+n*Math.abs(Lt),(Lt+=wt*_+jt*I-(Nt*B+Ft*D))>=Tt||-Lt>=Tt))return Lt;k=(ut=(j=I-(F=(H=134217729*I)-(H-I)))*(K=jt-($=(H=134217729*jt)-(H-jt)))-((ct=I*jt)-F*$-j*$-F*K))-(Y=ut-(W=(j=D-(F=(H=134217729*D)-(H-D)))*(K=Ft-($=(H=134217729*Ft)-(H-Ft)))-((q=D*Ft)-F*$-j*$-F*K))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(Z=tt+Y)-tt,c[2]=tt-(Z-k)+(Y-k),c[3]=Z;let It=s(4,f,4,c,u);k=(ut=(j=wt-(F=(H=134217729*wt)-(H-wt)))*(K=_-($=(H=134217729*_)-(H-_)))-((ct=wt*_)-F*$-j*$-F*K))-(Y=ut-(W=(j=Nt-(F=(H=134217729*Nt)-(H-Nt)))*(K=B-($=(H=134217729*B)-(H-B)))-((q=Nt*B)-F*$-j*$-F*K))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(Z=tt+Y)-tt,c[2]=tt-(Z-k)+(Y-k),c[3]=Z;let Pt=s(It,u,4,c,E);k=(ut=(j=I-(F=(H=134217729*I)-(H-I)))*(K=_-($=(H=134217729*_)-(H-_)))-((ct=I*_)-F*$-j*$-F*K))-(Y=ut-(W=(j=D-(F=(H=134217729*D)-(H-D)))*(K=B-($=(H=134217729*B)-(H-B)))-((q=D*B)-F*$-j*$-F*K))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(Z=tt+Y)-tt,c[2]=tt-(Z-k)+(Y-k),c[3]=Z;let bt=s(Pt,E,4,c,a);return a[bt-1]})(m,h,g,T,y,p,P)},e.orient2dfast=function(m,h,g,T,y,p){return(h-p)*(g-y)-(m-y)*(T-p)},Object.defineProperty(e,"__esModule",{value:!0})})});var Jo=ke((Vf,Kn)=>{"use strict";var Yo=Io(),Pn=Lo(),Mr=qo(),vr=Xo().orient2d;Pn.default&&(Pn=Pn.default);Kn.exports=Ko;Kn.exports.default=Ko;function Ko(e,t,n){t=Math.max(0,t===void 0?2:t),n=n||0;var s=Cr(e),o=new Yo(16);o.toBBox=function(p){return{minX:p[0],minY:p[1],maxX:p[0],maxY:p[1]}},o.compareMinX=function(p,d){return p[0]-d[0]},o.compareMinY=function(p,d){return p[1]-d[1]},o.load(e);for(var r=[],i=0,l;i<s.length;i++){var f=s[i];o.remove(f),l=Uo(f,l),r.push(l)}var u=new Yo(16);for(i=0;i<r.length;i++)u.insert(Gn(r[i]));for(var E=t*t,a=n*n;r.length;){var c=r.shift(),m=c.p,h=c.next.p,g=Zn(m,h);if(!(g<a)){var T=g/E;f=Hr(o,c.prev.p,m,h,c.next.next.p,T,u),f&&Math.min(Zn(f,m),Zn(f,h))<=T&&(r.push(c),r.push(Uo(f,c)),o.remove(f),u.remove(c),u.insert(Gn(c)),u.insert(Gn(c.next)))}}c=l;var y=[];do y.push(c.p),c=c.next;while(c!==l);return y.push(c.p),y}function Hr(e,t,n,s,o,r,i){for(var l=new Pn([],Br),f=e.data;f;){for(var u=0;u<f.children.length;u++){var E=f.children[u],a=f.leaf?Un(E,n,s):_r(n,s,E);a>r||l.push({node:E,dist:a})}for(;l.length&&!l.peek().node.children;){var c=l.pop(),m=c.node,h=Un(m,t,n),g=Un(m,s,o);if(c.dist<h&&c.dist<g&&Zo(n,m,i)&&Zo(s,m,i))return m}f=l.pop(),f&&(f=f.node)}return null}function Br(e,t){return e.dist-t.dist}function _r(e,t,n){if(Go(e,n)||Go(t,n))return 0;var s=Tn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.maxX,n.minY);if(s===0)return 0;var o=Tn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.minX,n.maxY);if(o===0)return 0;var r=Tn(e[0],e[1],t[0],t[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=Tn(e[0],e[1],t[0],t[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(s,o,r,i)}function Go(e,t){return e[0]>=t.minX&&e[0]<=t.maxX&&e[1]>=t.minY&&e[1]<=t.maxY}function Zo(e,t,n){for(var s=Math.min(e[0],t[0]),o=Math.min(e[1],t[1]),r=Math.max(e[0],t[0]),i=Math.max(e[1],t[1]),l=n.search({minX:s,minY:o,maxX:r,maxY:i}),f=0;f<l.length;f++)if(kr(l[f].p,l[f].next.p,e,t))return!1;return!0}function Ge(e,t,n){return vr(e[0],e[1],t[0],t[1],n[0],n[1])}function kr(e,t,n,s){return e!==s&&t!==n&&Ge(e,t,n)>0!=Ge(e,t,s)>0&&Ge(n,s,e)>0!=Ge(n,s,t)>0}function Gn(e){var t=e.p,n=e.next.p;return e.minX=Math.min(t[0],n[0]),e.minY=Math.min(t[1],n[1]),e.maxX=Math.max(t[0],n[0]),e.maxY=Math.max(t[1],n[1]),e}function Cr(e){for(var t=e[0],n=e[0],s=e[0],o=e[0],r=0;r<e.length;r++){var i=e[r];i[0]<t[0]&&(t=i),i[0]>s[0]&&(s=i),i[1]<n[1]&&(n=i),i[1]>o[1]&&(o=i)}var l=[t,n,s,o],f=l.slice();for(r=0;r<e.length;r++)Mr(e[r],l)||f.push(e[r]);return Ir(f)}function Uo(e,t){var n={p:e,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return t?(n.next=t.next,n.prev=t,t.next.prev=n,t.next=n):(n.prev=n,n.next=n),n}function Zn(e,t){var n=e[0]-t[0],s=e[1]-t[1];return n*n+s*s}function Un(e,t,n){var s=t[0],o=t[1],r=n[0]-s,i=n[1]-o;if(r!==0||i!==0){var l=((e[0]-s)*r+(e[1]-o)*i)/(r*r+i*i);l>1?(s=n[0],o=n[1]):l>0&&(s+=r*l,o+=i*l)}return r=e[0]-s,i=e[1]-o,r*r+i*i}function Tn(e,t,n,s,o,r,i,l){var f=n-e,u=s-t,E=i-o,a=l-r,c=e-o,m=t-r,h=f*f+u*u,g=f*E+u*a,T=E*E+a*a,y=f*c+u*m,p=E*c+a*m,d=h*T-g*g,x,w,P,S,b=d,R=d;d===0?(w=0,b=1,S=p,R=T):(w=g*p-T*y,S=h*p-g*y,w<0?(w=0,S=p,R=T):w>b&&(w=b,S=p+g,R=T)),S<0?(S=0,-y<0?w=0:-y>h?w=b:(w=-y,b=h)):S>R&&(S=R,-y+g<0?w=0:-y+g>h?w=b:(w=-y+g,b=h)),x=w===0?0:w/b,P=S===0?0:S/R;var z=(1-x)*e+x*n,V=(1-x)*t+x*s,M=(1-P)*o+P*i,v=(1-P)*r+P*l,I=M-z,D=v-V;return I*I+D*D}function Dr(e,t){return e[0]===t[0]?e[1]-t[1]:e[0]-t[0]}function Ir(e){e.sort(Dr);for(var t=[],n=0;n<e.length;n++){for(;t.length>=2&&Ge(t[t.length-2],t[t.length-1],e[n])<=0;)t.pop();t.push(e[n])}for(var s=[],o=e.length-1;o>=0;o--){for(;s.length>=2&&Ge(s[s.length-2],s[s.length-1],e[o])<=0;)s.pop();s.push(e[o])}return s.pop(),t.pop(),t.concat(s)}});import*as De from"three";import*as Ce from"three";var Ht=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),E=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*E,this.y=l*a*(1-u)+o*u+(f*s-i*r)*E,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*E,this}},ln=class{constructor(t=new Ht(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new Ht().subVectors(n,t),r=new Ht().subVectors(s,t),i=new Ht().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new Ht){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},rn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Bn=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new Ht(t.start.x,t.start.y,t.start.z),l=new Ht(t.end.x,t.end.y,t.end.z),f=new Ht(t.end.x,t.end.y,t.rooftopPz),u=new Ht(t.start.x,t.start.y,t.rooftopPz),E=[i,l,f,u];for(let S=0;S<E.length;S++)if(!this.isValidVector3(E[S]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${S}\u65E0\u6548:`,E[S]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,h=c/n,g=new Ht().subVectors(l,i).normalize(),T=i.x,y=i.y,p=i.z,d=g.x,x=g.y,w=g.z,P=(S,b)=>new Ht(T+d*S,y+x*S,p+w*S+b);for(let S=0;S<n;S++){let b=S*h,R=(S+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[P(V,b),P(M,b),P(M,R),P(V,R)],userData:{type:"wallSegment",row:S,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=rn(),l=[],f=new Map,u=1/0,E=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let v=this.getWorldVerticesNew(M.points);if(v.length<4)continue;let I=new Ht().add(v[0]).add(v[1]).add(v[2]).add(v[3]).multiplyScalar(.25);M.userData.center=I,M.vertices=v;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>E&&(E=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=rn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=rn()-i,this.printAnalysisResults(),this.results;let g=h.vertices[0],T=h.vertices[1],y=h.vertices[3],p=new Ht().subVectors(T,g).normalize(),d=new Ht().subVectors(y,g).normalize(),x=h.userData.width,w=h.userData.height,P=E-u+1,S=c-a+1,b=new ln;b.setFromCoplanarPoints(g,T,y);let R=new Ht,z=new Ht;for(let V=0;V<n.length;V+=3){let M=new Ht(n[V],n[V+1],n[V+2]),v=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(v))>s)continue;R.subVectors(v,g);let D=R.dot(p),B=R.dot(d),_=Math.ceil((D-s)/x-1),k=Math.floor((D+s)/x),H=Math.ceil((B-s)/w-1),F=Math.floor((B+s)/w);if(k<0||_>S-1||F<0||H>P-1)continue;let j=Math.max(0,_),$=Math.min(S-1,k),K=Math.max(0,H),Y=Math.min(P-1,F);for(let tt=K;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=$;ct++){let ut=a+ct,q=`row${it}_col${ut}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,v=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,I=v>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:v,hasPointsButNotEnough:v>0&&v<1};I?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=rn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,E,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Ht().subVectors(t,n),h=Math.abs(m.dot(r)),g=Math.abs(m.dot(i));if(h>u&&g>E)return!1;let T=new Ht().subVectors(t,o),y=T.dot(r),p=T.dot(i),d=y>=-a&&y<=l+a,x=p>=-a&&p<=f+a;return d&&x}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let E=`row${u.userData.row}_col${u.userData.col}`,a=r.has(E);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:E,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,E]of r){let a=i.get(E.row)?.get(E.col);if(a&&!a.visited){let c=[],m=[[E.row,E.col]],h=0;for(a.visited=!0;h<m.length;){let g=m[h++],T=g[0],y=g[1],p=`row${T}_col${y}`;r.has(p)&&c.push(r.get(p));for(let d of f){let x=T+d[0],w=y+d[1];if(i.has(x)&&i.get(x).has(w)){let P=i.get(x).get(w);!P.visited&&P.isEmpty&&(P.visited=!0,m.push([x,w]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,E)=>E.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},ro=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new Ce.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new Ce.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},Ms=(e,t)=>{let n=new Ht().copy(e.start).add(e.end).multiplyScalar(.5),s=new Ht().subVectors(new Ht(n.x,n.y,n.z+1),n).normalize(),o=new Ht(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new Ht().copy(n).add(o.clone().multiplyScalar(e.length)),i=new Ht().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new Ce.Vector3(r.x,r.y,r.z),end:new Ce.Vector3(i.x,i.y,i.z),center:new Ce.Vector3(n.x,n.y,n.z),direction:new Ce.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},io=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await _n(o,t,n)}},_n=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new ln().setFromCoplanarPoints(new Ht(e.start.x,e.start.y,e.start.z),new Ht(e.end.x,e.end.y,e.end.z),new Ht(e.start.x,e.start.y,e.rooftopPz)),o=new Ht(e.start.x,e.start.y,e.start.z).distanceTo(new Ht(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new Bn,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let E=i.highlightEmptySegments(u,null,null),a=[];if(E&&E.clusters)for(let h of E.clusters){let g=ro(h,n);g&&a.push(g)}let m=Ms(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],g=ro(i.results.existSegments,n);g&&h.push(g),e.existSegments=h}};var kt=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),E=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*E,this.y=l*a*(1-u)+o*u+(f*s-i*r)*E,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*E,this}},an=class{constructor(t=new kt(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new kt().subVectors(n,t),r=new kt().subVectors(s,t),i=new kt().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new kt){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},cn=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),kn=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new kt(t.start.x,t.start.y,t.start.z),l=new kt(t.end.x,t.end.y,t.end.z),f=new kt(t.end.x,t.end.y,t.rooftopPz),u=new kt(t.start.x,t.start.y,t.rooftopPz),E=[i,l,f,u];for(let S=0;S<E.length;S++)if(!this.isValidVector3(E[S]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${S}\u65E0\u6548:`,E[S]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,h=c/n,g=new kt().subVectors(l,i).normalize(),T=i.x,y=i.y,p=i.z,d=g.x,x=g.y,w=g.z,P=(S,b)=>new kt(T+d*S,y+x*S,p+w*S+b);for(let S=0;S<n;S++){let b=S*h,R=(S+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[P(V,b),P(M,b),P(M,R),P(V,R)],userData:{type:"wallSegment",row:S,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=cn(),l=[],f=new Map,u=1/0,E=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let v=this.getWorldVerticesNew(M.points);if(v.length<4)continue;let I=new kt().add(v[0]).add(v[1]).add(v[2]).add(v[3]).multiplyScalar(.25);M.userData.center=I,M.vertices=v;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>E&&(E=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results;let g=h.vertices[0],T=h.vertices[1],y=h.vertices[3],p=new kt().subVectors(T,g).normalize(),d=new kt().subVectors(y,g).normalize(),x=h.userData.width,w=h.userData.height,P=E-u+1,S=c-a+1,b=new an;b.setFromCoplanarPoints(g,T,y);let R=new kt,z=new kt;for(let V=0;V<n.length;V++){let M=n[V],v=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(v))>s)continue;R.subVectors(v,g);let D=R.dot(p),B=R.dot(d),_=Math.ceil((D-s)/x-1),k=Math.floor((D+s)/x),H=Math.ceil((B-s)/w-1),F=Math.floor((B+s)/w);if(k<0||_>S-1||F<0||H>P-1)continue;let j=Math.max(0,_),$=Math.min(S-1,k),K=Math.max(0,H),Y=Math.min(P-1,F);for(let tt=K;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=$;ct++){let ut=a+ct,q=`row${it}_col${ut}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,v=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,I=v>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:v,hasPointsButNotEnough:v>0&&v<1};I?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=cn()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,E,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new kt().subVectors(t,n),h=Math.abs(m.dot(r)),g=Math.abs(m.dot(i));if(h>u&&g>E)return!1;let T=new kt().subVectors(t,o),y=T.dot(r),p=T.dot(i),d=y>=-a&&y<=l+a,x=p>=-a&&p<=f+a;return d&&x}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let E=`row${u.userData.row}_col${u.userData.col}`,a=r.has(E);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:E,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,E]of r){let a=i.get(E.row)?.get(E.col);if(a&&!a.visited){let c=[],m=[[E.row,E.col]],h=0;for(a.visited=!0;h<m.length;){let g=m[h++],T=g[0],y=g[1],p=`row${T}_col${y}`;r.has(p)&&c.push(r.get(p));for(let d of f){let x=T+d[0],w=y+d[1];if(i.has(x)&&i.get(x).has(w)){let P=i.get(x).get(w);!P.visited&&P.isEmpty&&(P.visited=!0,m.push([x,w]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,E)=>E.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},lo=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new De.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new De.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},vs=(e,t)=>{let n=new kt().copy(e.start).add(e.end).multiplyScalar(.5),s=new kt().subVectors(new kt(n.x,n.y,n.z+1),n).normalize(),o=new kt(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new kt().copy(n).add(o.clone().multiplyScalar(e.length)),i=new kt().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new De.Vector3(r.x,r.y,r.z),end:new De.Vector3(i.x,i.y,i.z),center:new De.Vector3(n.x,n.y,n.z),direction:new De.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},Hs=(e,t=!0,n="three",s="xyz")=>{s=="xyz"?co(e,t,n):s=="array"&&_n(e,t,n)},Bs=(e,t=!0,n="three",s="xyz")=>{s=="xyz"?_s(e,t,n):s=="array"&&io(e,t,n)},_s=(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];co(o,t,n)}},co=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new an().setFromCoplanarPoints(new kt(e.start.x,e.start.y,e.start.z),new kt(e.end.x,e.end.y,e.end.z),new kt(e.start.x,e.start.y,e.rooftopPz)),o=new kt(e.start.x,e.start.y,e.start.z).distanceTo(new kt(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new kn,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let E=i.highlightEmptySegments(u,null,null),a=[];if(E&&E.clusters)for(let h of E.clusters){let g=lo(h,n);g&&a.push(g)}let m=vs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],g=lo(i.results.existSegments,n);g&&h.push(g),e.existSegments=h}};import*as C from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as O from"three";import{CSS2DObject as Li}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import Ee from"path";import{fileURLToPath as Ds}from"url";import fn from"path";import{fileURLToPath as ks}from"url";import{Vector3 as pi}from"three";var Cs=ks(import.meta.url),Cn=fn.dirname(Cs),gi=fn.resolve(Cn,"./data/lines.meta.json"),yi=fn.resolve(Cn,"./data/lines.bin"),Ei=fn.resolve(Cn,"./data/checks.bin");var Is=Ds(import.meta.url),Se=Ee.dirname(Is),Si=Ee.resolve(Se,"./data/lines.tmp.bin"),Ri=Ee.resolve(Se,"./data/checks.tmp.bin"),zi=Ee.resolve(Se,"./data/lines.new_points.tmp.bin"),Vi=Ee.resolve(Se,"./data/lines.new_points.bin"),Mi=Ee.resolve(Se,"./data/lines.meta.json"),vi=Ee.resolve(Se,"./data/lines.bin"),Hi=Ee.resolve(Se,"./data/checks.bin"),Bi=Ee.resolve(Se,"./data/lines.exist_segments.bin"),_i=Ee.resolve(Se,"./data/lines.exist_segments.tmp.bin");import{Vector3 as Ls}from"three";var un=class{points=[];_tempArr=[0,0,0];constructor(t){}initPoints(t){this.points=t}getPointByIndex(t,n){let s=t*3;return n.x=this.points[s],n.y=this.points[s+1],n.z=this.points[s+2],n}getPointArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(t,n){n.length=0,n.push(t*3),n.push(t*3+1),n.push(t*3+2)}pointsToVector3Arr(t){let n=[];for(let s=0;s<t.length/3;s++)n.push(new Ls(t[s*3],t[s*3+1],t[s*3+2]));return n}vector3ArrToPoints(t){let n=[];for(let s=0;s<t.length;s++)n.push(t[s].x,t[s].y,t[s].z);return n}vector3ArrToFloat32Array(t){return new Float32Array(t.flatMap(s=>[s.x,s.y,s.z]))}clsoe(){this.points=[]}};var fo=(e,t,n)=>{let s=new O.LineBasicMaterial({color:"#0011ff"}),o=[];o.push(e),o.push(t);let r=new O.BufferGeometry;r.setFromPoints(o),r.rotateX(-Math.PI/2),n.add(new O.Line(r,s))},xe=(e,t,n,s,o=1e-8)=>{let r=t.x-e.x,i=t.y-e.y,l=s.x-n.x,f=s.y-n.y,u=r*f-i*l;if(Math.abs(u)<o)return null;let E=((n.x-e.x)*f-(n.y-e.y)*l)/u,a=((n.x-e.x)*i-(n.y-e.y)*r)/u;return E<-o||E>1+o||a<-o||a>1+o?null:{point:new O.Vector3(e.x+E*r,e.y+E*i,e.z)}},uo=(e,t,n={})=>{let{fontSize:s=36,fontFamily:o="sans-serif",backgroundColor:r="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:f=256}=n,E=document.createElement("canvas").getContext("2d");E.font=`bold ${s}px ${o}`;let c=E.measureText(e).width,m=Math.min(c+l*2,f),h=s+l*2,g=document.createElement("canvas");g.width=m,g.height=h;let T=g.getContext("2d");T.fillStyle=r,T.fillRect(0,0,m,h),T.fillStyle=i,T.font=`bold ${s}px ${o}`,T.textAlign="center",T.textBaseline="middle",c>f-l*2?As(T,e,m/2,h/2,f,s):T.fillText(e,m/2,h/2);let y=new O.CanvasTexture(g),p=new O.SpriteMaterial({map:y,depthTest:!1,transparent:!0}),d=new O.Sprite(p);d.position.set(t.x,t.y,t.z);let x=.005;return d.scale.set(m*x,h*x,1),d};function As(e,t,n,s,o,r){let i=t.split(""),l="",f=r*1.2,u=s;for(let E=0;E<i.length;E++){let a=l+i[E];e.measureText(a).width>o&&E>0?(e.fillText(l,n,u),l=i[E],u+=f):l=a}e.fillText(l,n,u)}var Kt=(e,t,n=.01)=>{let s=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(s<1e-10||o<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let r={x:e.x/s,y:e.y/s,z:e.z/s},i={x:t.x/o,y:t.y/o,z:t.z/o},l=r.x*i.x+r.y*i.y+r.z*i.z;l=Math.max(-1,Math.min(1,l));let f=Math.acos(Math.abs(l)),u=f<=n;return{parallel:u,sameDirection:u?l>0:null,angle:f}};var ho=(e,t,n,s)=>{if(t<1e-4||n<1e-4)return{};let o=e,r=[];if(s&&s.length&&(r=s.map(P=>P.clone())),!o||o.length<4)return{};let i=new O.Vector3().subVectors(o[1],o[0]).normalize(),l=new O.Vector3().subVectors(o[3],o[0]).normalize(),f=i.clone().cross(l).normalize(),u=1/0,E=-1/0,a=1/0,c=-1/0;for(let P of o){let S=P.dot(i),b=P.dot(l);S<u&&(u=S),S>E&&(E=S),b<a&&(a=b),b>c&&(c=b)}let m=o[0].dot(f),h=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),g=i.clone().multiplyScalar(E).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),T=i.clone().multiplyScalar(E).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),y=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),p=[h,g,T,y],d=Kt(new O.Vector3().subVectors(h,g),new O.Vector3(0,0,1));d&&d.parallel&&(p=[h,y,T,g]);let x=0;if(s.length>0){let P=new O.Vector3().subVectors(p[1],p[0]).normalize(),S=P.clone().negate(),b=new O.Vector3().subVectors(p[3],p[0]).normalize(),R=b.clone().negate(),z=p[0].distanceTo(p[1]),V=p[0].distanceTo(p[3]),M=z/t,v=V/n,I=.001;for(let D=0;D<M;D++){let B=p[0],_=0;for(let k=0;k<v;k++){let H=B.clone().addScaledVector(P,t),F=H.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),$=new O.Vector3().add(B).add(H).add(F).add(j).multiplyScalar(.25);for(let K=0;K<r.length;K++)if(r[K].distanceTo($)<I){_++;break}B=j}if(_>=v/2)break;x+=_,p[0]=p[0].addScaledVector(P,t),p[3]=p[3].addScaledVector(P,t)}z=p[0].distanceTo(p[1]),M=z/t;for(let D=0;D<M;D++){let B=p[1],_=0;for(let k=0;k<v;k++){let H=B.clone().addScaledVector(S,t),F=H.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),$=new O.Vector3().add(B).add(H).add(F).add(j).multiplyScalar(.25);for(let K=0;K<r.length;K++)if(r[K].distanceTo($)<I){_++;break}B=j}if(_>=v/2)break;x+=_,p[1]=p[1].addScaledVector(S,t),p[2]=p[2].addScaledVector(S,t)}z=p[0].distanceTo(p[1]),M=z/t;for(let D=0;D<v;D++){let B=p[3],_=0;for(let k=0;k<M;k++){let H=B.clone().addScaledVector(P,t),F=H.clone().addScaledVector(R,n),j=B.clone().addScaledVector(R,n),$=new O.Vector3().add(B).add(H).add(F).add(j).multiplyScalar(.25);for(let K=0;K<r.length;K++)if(r[K].distanceTo($)<I){_++;break}B=H}if(_>=M/2)break;x+=_,p[2]=p[2].addScaledVector(R,n),p[3]=p[3].addScaledVector(R,n)}}let w=p[0].distanceTo(p[1])*p[0].distanceTo(p[3]);return{facePoints:p,boxArea:w,totalInPlaneNum:x}},Yt=(e,t,n,s,o=O.MathUtils.degToRad(8))=>{let r=new O.Vector3,i=new O.Vector3;r.subVectors(new O.Vector3(t.x,t.y,0),new O.Vector3(e.x,e.y,0)).normalize(),i.subVectors(new O.Vector3(s.x,s.y,0),new O.Vector3(n.x,n.y,0)).normalize();let l=r.dot(i),f=Math.acos(Math.min(Math.abs(l),1)),u=1-Math.min(f/o,1),E=l>0?"same":"opposite";return{parallelism:u,angle:f,angleDeg:O.MathUtils.radToDeg(f),isParallel:f<o,direction:E,vectors:{v1:r,v2:i}}},se=(e,t,n,s)=>{let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=o.length(),l=r.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};o.normalize(),r.normalize();let f=Math.abs(o.dot(r)),u=Math.min(1,Math.max(0,f)),E=Math.acos(u),a=O.MathUtils.radToDeg(E),c=1-u,m=1e-6;return{rate:c,percent:`${(c*100).toFixed(2)}%`,angle:a,isPerpendicular:Math.abs(a-90)<.01,isParallel:a<.01}},qt=(e,t,n=!1)=>new O.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),ye=(e,t,n,s,o={})=>{let{parallelAngleMax:r=O.MathUtils.degToRad(10),collinearAngleMax:i=O.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:f=.01}=o,u=new O.Vector3().subVectors(t,e),E=new O.Vector3().subVectors(s,n),a=u.clone().normalize(),c=E.clone().normalize(),m=O.MathUtils.clamp(a.dot(c),-1,1),h=Math.acos(Math.abs(m)),g=O.MathUtils.radToDeg(h);if(h>r)return{type:"not_parallel",angleDeg:g,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&c.negate();let T=new O.Vector3().addVectors(a,c).normalize(),y=new O.Vector3().addVectors(e,t).multiplyScalar(.5),p=ao(n,y,a),d=ao(s,y,a),x=(p+d)/2,w=Math.max(p,d),P=e.dot(T),S=t.dot(T),b=n.dot(T),R=s.dot(T),z=Math.min(P,S),V=Math.max(P,S),M=Math.min(b,R),v=Math.max(b,R),I=V-z,D=v-M,B=Math.min(I,D),_=Math.min(V,v)-Math.max(z,M),k=_<0?-_:0,H=_>0?_:0,F=B>0?H/B:0,j=Fs(e,t,n,s),$=h<=i&&x<l,K;return $?K=F>.5?"collinear_overlap":"collinear_gap":h<=r&&(K="parallel_offset"),{type:K,angleDeg:g,avgPerpendicularDistance:x,maxPerpendicularDistance:w,gap:k,overlap:H,closestDistance:j}};function ao(e,t,n){let s=new O.Vector3().subVectors(e,t),o=s.dot(n),r=n.clone().multiplyScalar(o);return new O.Vector3().subVectors(s,r).length()}function Fs(e,t,n,s){let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=new O.Vector3().subVectors(n,e),l=o.dot(o),f=o.dot(r),u=r.dot(r),E=o.dot(i),a=r.dot(i),c=l*u-f*f,m,h;c<1e-10?(m=0,h=u!==0?a/u:0):(m=(f*a-u*E)/c,h=(l*a-f*E)/c),m=O.MathUtils.clamp(m,0,1),h=u!==0?O.MathUtils.clamp((f*m+a)/u,0,1):0,m=l!==0?O.MathUtils.clamp((f*h-E)/l,0,1):0;let g=e.clone().add(o.clone().multiplyScalar(m)),T=n.clone().add(r.clone().multiplyScalar(h));return g.distanceTo(T)}var hn=e=>{let t=999999,n=-999999;for(let s=0;s<e.length;s++)e[s].z>n&&(n=e[s].z),e[s].z<t&&(t=e[s].z);return{minZ:t,maxZ:n}},Je=(e,t,n)=>{let s=new O.Plane,o=new O.Vector3(e.x,e.y,e.z),r=new O.Vector3(t.x,t.y,t.z),i=new O.Vector3(t.x,t.y,t.z+5);s.setFromCoplanarPoints(o,r,i);let l=[],f=[];n.forEach(T=>{let y=new O.Vector3;s.projectPoint(T,y),f.push(y.clone()),y.z=o.z,l.push(y)});let u=new O.Vector3,E=new O.Vector3;s.projectPoint(o,u),s.projectPoint(r,E);let a=new O.Line3(u,E),c=[],m=[],h=[],g=new O.Vector3;return l.forEach((T,y)=>{a.closestPointToPoint(T,!0,g).distanceTo(T)<.001?(c.push(n[y]),m.push(f[y])):h.push(T)}),{newOriginalPoints:c,newProjectPoints:h,newOnLinePoints:m}},mo=(e,t,n)=>{function s(o,r,i,l,f,u,E,a,c){let m=new O.Line3(o,r),h=new Map,g=new O.Vector3,T=o.clone(),y=r.clone(),p=0;for(;;){let d=new Map,x=0;for(let w=0;w<c.checkResults.length;w++)if(!(c.checkResults[w].allCenterPoints.length/a*100<1))for(let S=0;S<c.checkResults[w].allCenterPoints.length;S++){if(h.has(w)&&h.get(w).removePtsIndex.includes(S))continue;let b=c.checkResults[w].allCenterPoints[S];b=new O.Vector3(b.x,b.y,b.z);let R=m.closestPointToPoint(b,!0,g),z=b.distanceTo(R);Math.abs(z-f)<.01&&(x++,d.has(w)?d.get(w).removePtsIndex.push(S):d.set(w,{index:w,removePtsIndex:[S]}))}if(p==E){o=T,r=y;break}if(x<u/20*19||x==0){d.clear(),E-p<5&&(o=T,r=y,h.clear());break}else{p++;for(let[w,P]of d)h.has(w)?h.get(w).removePtsIndex.push(...P.removePtsIndex):h.set(w,P);d.clear(),o=o.addScaledVector(i,l),r=r.addScaledVector(i,l),m.set(o,r)}}if(h.size>0&&p!=E)for(let[d,x]of h){let w=[],P=[];for(let S=0;S<c.checkResults[d].allCenterPoints.length;S++)x.removePtsIndex.includes(S)||(w.push(c.checkResults[d].allCenterPoints[S]),P.push(c.checkResults[d].originalVertices[S]));c.checkResults[d].allCenterPoints=w,c.checkResults[d].originalVertices=P}}for(let o=0;o<e.length;o++){let r=e[o];if(r.length<.5)continue;let i=-1,l=-1,f=t.readLineById(r.id);if(f.checkResults=t.getLineCheckReultsById(r.id),f.originalPoints=t.getOriginalPointsById(r.id),r.originalPoints=f.originalPoints,r.checkResults=f.checkResults,f=null,!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let D=r.checkResults[0].originalVertices[0],[B,_,k,H]=D;B=new O.Vector3(B.x,B.y,B.z),_=new O.Vector3(_.x,_.y,_.z),k=new O.Vector3(k.x,k.y,k.z),H=new O.Vector3(H.x,H.y,H.z),i=B.distanceTo(_),l=B.distanceTo(H);let F=new O.Vector3().subVectors(B,_).normalize(),j=Kt(F,new O.Vector3(0,0,1));j&&j.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let u=new O.Vector3(r.start.x,r.start.y,r.start.z),E=new O.Vector3(r.end.x,r.end.y,r.end.z),a=u.distanceTo(E),c=r.rooftopPz-r.start.z,m=Math.ceil(a/i),h=Math.ceil(c/l),g=u.clone(),T=E.clone(),y=T.clone().add(new O.Vector3(0,0,c)),p=g.clone().add(new O.Vector3(0,0,c)),d=new O.Vector3().subVectors(T,g).normalize(),x=d.clone().negate(),P=new O.Vector3().subVectors(y,g).normalize().clone().negate(),S=i/2,b=l/2,R=a*c,z=i*l,V=R/z;s(g,p,d,i,S,h,m,V,r),s(T,y,x,i,S,h,m,V,r),r.start=g,r.end=T;let{newOriginalPoints:M}=Je(g,T,r.originalPoints);r.originalPoints=M;let I=new un().vector3ArrToFloat32Array(r.originalPoints);n.stageReplacePoints(r.id,I),r.checkResults=null,r.originalPoints=null}n.commit()},$t=(e,t)=>new O.Vector3(e.x,e.y,0).distanceTo(new O.Vector3(t.x,t.y,0)),Dn=(e,t,n=1e-6)=>{let s=new O.Vector3;return e.closestPointToPoint(t,!0,s),s.distanceTo(t)<n},Oe=e=>{let t=0,n=[];for(let s=0;s<e.length;s++)for(let o=s+1;o<e.length;o++){let r=e[s].distanceTo(e[o]);r>t&&(t=r,n=[e[s],e[o]])}return n},st=(e,t,n=.03)=>Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.z-t.z)<n;var po=()=>{let e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${e}${t}${n}`};var In=(e,t=.001)=>{let n=new Map,s=[];for(let o of e){let r=Math.round(o.x/t),i=Math.round(o.y/t),l=Math.round(o.z/t),f=`${r},${i},${l}`;n.has(f)||(n.set(f,!0),s.push(o))}return s},go=e=>{let t=e.center,n=e.halfSize,o=e.rotation.elements,r=new O.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),i=new O.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),l=new O.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z);function f(E,a,c){return t.clone().addScaledVector(r,E).addScaledVector(i,a).addScaledVector(l,c)}return[f(-1,-1,-1),f(1,-1,-1),f(1,1,-1),f(-1,1,-1),f(-1,-1,1),f(1,-1,1),f(1,1,1),f(-1,1,1)]},Ln=(e,t)=>{let n=e[0],s=e[1],o=e[2],r=e[3],i=new O.Vector3().subVectors(s,n),l=new O.Vector3().subVectors(r,n),f=i.length(),u=l.length();i.normalize(),l.normalize();let E=new O.Vector3(0,0,1),c=new O.Vector3().add(n).add(s).add(o).add(r).multiplyScalar(.25).clone().addScaledVector(E,t/2),m=new O.BoxGeometry(f,u,t),h=new O.Matrix4;return h.makeBasis(i,l,E),h.setPosition(c),m.applyMatrix4(h),m.computeVertexNormals(),m};import*as Xt from"three";var Os=(e,t)=>{console.log("lines",e);for(let n=0;n<e.length;n++){let s=e[n],o=[];s.originalPoints.forEach(d=>{let x=new Xt.Vector3(d.x,d.y,0),w=!1;for(let P=0;P<o.length;P++)if(st(x,o[P],.01)){w=!0;break}w||o.push(x)});let r=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(s.length)))),i=1,l=new Xt.Vector3(s.start.x,s.start.y,s.start.z),f=new Xt.Vector3(s.end.x,s.end.y,s.end.z),u=new Xt.Vector3().subVectors(f,l).normalize(),E=u.clone().cross(new Xt.Vector3(0,0,1)).normalize(),a=E.clone().negate(),c=[],m=[],h=s.length/r;console.log(h);for(let d=0;d<r;d++){let x=[];x.push(l.clone().addScaledVector(E,i)),x.push(x[0].clone().addScaledVector(u,h)),x.push(x[1].clone().addScaledVector(a,i*2)),x.push(l.clone().addScaledVector(a,h));let w=[];for(let P=0;P<o.length;P++)c.includes(P)||Ws(o[P],x)&&(c.push(P),w.push(o[P]));w.length>0&&m.push(js(w)),l=l.addScaledVector(u,h)}let g=new Float32Array(o.length*3);o.forEach((d,x)=>{g[x*3]=d.x,g[x*3+1]=d.y,g[x*3+2]=d.z});let T=new Xt.BufferGeometry;T.setAttribute("position",new Xt.BufferAttribute(g,3)),T.rotateX(-Math.PI/2),t.add(new Xt.Points(T,new Xt.PointsMaterial({color:po(),size:.02})));let[y,p]=Ys(m,{plane:"xy",trimRatio:0});fo(y,p,t)}};function yo(e,t="xy"){if(t==="xy")return{x:e.x,y:e.y};if(t==="xz")return{x:e.x,y:e.z};if(t==="yz")return{x:e.y,y:e.z};throw new Error(`Unsupported plane: ${t}`)}function Ns(e,t,n){let s=t.x-e.x,o=t.y-e.y,r=n.x-e.x,i=n.y-e.y;return s*i-o*r}function Ws(e,t,n="xy"){if(!t||t.length!==4)throw new Error("rectPoints must contain 4 points");let s=yo(e,n),o=t.map(l=>yo(l,n)),r=!1,i=!1;for(let l=0;l<4;l++){let f=o[l],u=o[(l+1)%4],E=Ns(f,u,s);if(E>1e-9&&(r=!0),E<-1e-9&&(i=!0),r&&i)return!1}return!0}function js(e){if(!e||e.length===0)return null;let t=new Xt.Vector3(0,0,0);for(let n of e)Array.isArray(n)?(t.x+=n[0],t.y+=n[1],t.z+=n[2]):(t.x+=n.x,t.y+=n.y,t.z+=n.z);return t.divideScalar(e.length),t}function qs(e){return e instanceof Xt.Vector3?e.clone():Array.isArray(e)?new Xt.Vector3(e[0],e[1],e[2]):new Xt.Vector3(e.x,e.y,e.z)}function $s(e,t="xy"){let n=qs(e);if(t==="xy")return{x:n.x,y:n.y,up:n.z};if(t==="xz")return{x:n.x,y:n.z,up:n.y};if(t==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${t}`)}function Eo(e,t,n,s="xy"){if(s==="xy")return new Xt.Vector3(e,t,n);if(s==="xz")return new Xt.Vector3(e,n,t);if(s==="yz")return new Xt.Vector3(n,e,t);throw new Error(`Unsupported plane: ${s}`)}function Xs(e,t,n){if(Math.abs(t)<1e-12)return e>=n?{x:1,y:0}:{x:0,y:1};let o=e+n,r=e*n-t*t,i=Math.sqrt(Math.max(0,o*o*.25-r)),l=o*.5+i,f=t,u=l-e,E=Math.hypot(f,u);return E<1e-12?{x:1,y:0}:{x:f/E,y:u/E}}function Ys(e,t={}){let{plane:n="xy",trimRatio:s=0}=t;if(!e||e.length<2)return null;let o=e.map(_=>$s(_,n)),r=0,i=0,l=0;for(let _ of o)r+=_.x,i+=_.y,l+=_.up;r/=o.length,i/=o.length,l/=o.length;let f=0,u=0,E=0;for(let _ of o){let k=_.x-r,H=_.y-i;f+=k*k,u+=k*H,E+=H*H}f/=o.length,u/=o.length,E/=o.length;let a=Xs(f,u,E),c={x:-a.y,y:a.x},m=[];for(let _ of o){let k=_.x-r,H=_.y-i,F=k*a.x+H*a.y,j=k*c.x+H*c.y;m.push({s:F,t:j,up:_.up})}m.sort((_,k)=>_.s-k.s);let h=m.length,g=Math.floor(h*s),T=Math.ceil(h*(1-s))-1;g=Math.max(0,Math.min(h-1,g)),T=Math.max(0,Math.min(h-1,T));let y=m[g],p=m[T],d=(()=>{let _=m.map(H=>H.t).sort((H,F)=>H-F),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),x=(()=>{let _=m.map(H=>H.up).sort((H,F)=>H-F),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),w=y.s,P=p.s,S=d,b=d,R=x,z=x,V=r+a.x*w+c.x*S,M=i+a.y*w+c.y*S,v=r+a.x*P+c.x*b,I=i+a.y*P+c.y*b,D=Eo(V,M,R,n),B=Eo(v,I,z,n);return[D,B]}import We from"path";import*as lt from"fs";import{fileURLToPath as Gs}from"url";import{Vector3 as Ne}from"three";var Zs=Gs(import.meta.url),tn=We.dirname(Zs),Qe=We.resolve(tn,"./data/lines.meta.json"),An=We.resolve(tn,"./data/lines.bin"),Fn=We.resolve(tn,"./data/checks.bin"),xo=We.resolve(tn,"./data/lines.new_points.bin"),On=We.resolve(tn,"./data/lines.exist_segments.bin");function bo(e){let t=[],n=0,s=0,o=0,r=lt.openSync(An,"w"),i=lt.openSync(Fn,"w"),l=lt.openSync(On,"w");try{for(let u of e){let E=Buffer.alloc(u.originalPoints.length*12),a=new Float32Array(E.buffer,E.byteOffset);for(let h=0,g=0;h<u.originalPoints.length;h++,g+=3){let T=u.originalPoints[h];a[g]=T.x,a[g+1]=T.y,a[g+2]=T.z}lt.writeSync(r,E,0,E.length,n);let c=null;if(Array.isArray(u.checkResults)&&u.checkResults.length>0){let h=[];for(let g of u.checkResults){let T=wo(g);lt.writeSync(i,T,0,T.length,s),h.push({offset:s,byteLength:T.length,faceCount:g.originalVertices.length,centerCount:g.allCenterPoints.length}),s+=T.length}c={checkResults:h}}let m=null;if(Array.isArray(u.existSegments)&&u.existSegments.length>0){let h=[];for(let g of u.existSegments){let T=wo(cr);lt.writeSync(l,T,0,T.length,o),h.push({offset:o,byteLength:T.length,faceCount:g.originalVertices.length,centerCount:(g.allCenterPoints||[]).length}),o+=T.length}m={existSegments:h}}t.push({id:u.id,pointCount:u.originalPoints.length,offset:n,...c||{},...m||{},hasNewOriginalPoints:!1}),n+=E.length,u.originalPoints=null,u.checkResults=null,u.existSegments=null}lt.closeSync(r),lt.closeSync(i),lt.closeSync(l);let f=Qe+".tmp";lt.writeFileSync(f,JSON.stringify(t,null,2)),lt.renameSync(f,Qe),console.log("\u2705 writeFile \u5B8C\u6210\uFF08\u542B existSegments\uFF09")}catch(f){try{lt.closeSync(r)}catch{}try{lt.closeSync(i)}catch{}try{lt.closeSync(l)}catch{}throw f}}var dn=class{constructor(t){this.lineStates=new Map;for(let n of t)this.lineStates.set(n.id,n);this.meta=JSON.parse(lt.readFileSync(Qe,"utf-8")),this.fdRead=lt.openSync(An,"r"),this.checkFdRead=lt.openSync(Fn,"r"),this.existSegmentsFdRead=lt.existsSync(On)?lt.openSync(On,"r"):null,this.newPointsFdRead=lt.existsSync(xo)?lt.openSync(xo,"r"):null,this.fdWrite=lt.openSync(An,"a"),this.checkFdWrite=lt.openSync(Fn,"a"),this.dataEnd=lt.fstatSync(this.fdWrite).size,this.checkEnd=lt.fstatSync(this.checkFdWrite).size}readLine(t){let n=this.meta[t];if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}*iterate(){for(let t=0;t<this.meta.length;t++)yield this.readLine(t)}readLineById(t){let n=this.meta.find(u=>u.id===t);if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}getLineCheckReultsById(t){let n=this.meta.find(f=>f.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=n.checkResults?n.checkResults.map(f=>this.createCheckResultView(f,"checkResults")):[],r=[],i=[],l=[];for(let f of o){for(let u=0;u<f.faceCount;u++){let E=f.getFace(u);i.push(E);let a=f.getCenter(u);l.push(a)}r.push({originalVertices:i,allCenterPoints:l})}return r}getLineExistSegmentsById(t){let n=this.meta.find(E=>E.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.existSegments&&n.existSegments.length>0?n.existSegments.map(E=>this.createCheckResultView(E)):[],l=[],f=[],u=[];for(let E of i){for(let a=0;a<E.faceCount;a++){let c=E.getFace(a);f.push(c);let m=E.getCenter(a);u.push(m)}l.push({originalVertices:f,allCenterPoints:u})}return l}getOriginalPointsById(t){let n=this.meta.find(f=>f.id===t);if(!n||!this.lineStates.get(n.id))return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=[],l=r;for(let f=0;f<l.length;f+=3)i.push(new Ne(l[f],l[f+1],l[f+2]));return i}replaceOriginalPoints(t,n){let s=this.meta.find(l=>l.id===t);if(!s)throw new Error(`line ${t} not found`);let o=Buffer.alloc(n.length*12);new Float32Array(o.buffer,o.byteOffset).set(n);let i=this.dataEnd;lt.writeSync(this.fdWrite,o,0,o.length,i),this.dataEnd+=o.length,s.pointCount=n.length/3,s.offset=i}replaceAllCheckResults(t,n){let s=this.meta.find(u=>u.id===t);if(!s)throw new Error(`line ${t} not found`);let o=[],r=0,i=n.map(u=>{let E=Us(u.originalVertices,u.allCenterPoints||[]);return r+=E.length,E}),f=this.checkEnd;for(let u=0;u<i.length;u++){let E=i[u];lt.writeSync(this.checkFdWrite,E,0,E.length,f),o.push({offset:f,byteLength:E.length,faceCount:n[u].originalVertices.length,centerCount:(n[u].allCenterPoints||[]).length}),f+=E.length}this.checkEnd+=r,s.checkResults=o}flushMeta(){let t=Qe+".tmp";lt.writeFileSync(t,JSON.stringify(this.meta,null,2)),lt.renameSync(t,Qe)}createCheckResultView(t,n){let s=null,o=null,r=()=>{if(s)return;s=Buffer.alloc(t.byteLength);let f=n==="checkResults"?this.checkFdRead:this.existSegmentsFdRead;lt.readSync(f,s,0,t.byteLength,t.offset),o=new Float32Array(s.buffer,s.byteOffset)},i=f=>f*12,l=f=>t.faceCount*12+f*3;return{getFace(f){r();let u=i(f);return[new Ne(o[u],o[u+1],o[u+2]),new Ne(o[u+3],o[u+4],o[u+5]),new Ne(o[u+6],o[u+7],o[u+8]),new Ne(o[u+9],o[u+10],o[u+11])]},getCenter(f){r();let u=l(f);return new Ne(o[u],o[u+1],o[u+2])},faceCount:t.faceCount,centerCount:t.centerCount}}close(){lt.closeSync(this.fdRead),lt.closeSync(this.checkFdRead),this.existSegmentsFdRead&<.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&<.closeSync(this.newPointsFdRead),lt.closeSync(this.fdWrite),lt.closeSync(this.checkFdWrite),this.lineStates.clear()}};function wo(e){let{originalVertices:t,allCenterPoints:n}=e,s=t.length*4*3+n.length*3,o=Buffer.alloc(s*4),r=new Float32Array(o.buffer,o.byteOffset),i=0;for(let l of t)for(let f of l)r[i++]=f.x,r[i++]=f.y,r[i++]=f.z;for(let l of n)r[i++]=l.x,r[i++]=l.y,r[i++]=l.z;return o}function Us(e,t){let n=e.length*4*3+t.length*3,s=Buffer.alloc(n*4),o=new Float32Array(s.buffer,s.byteOffset),r=0;for(let i of e)for(let l of i)o[r++]=l.x,o[r++]=l.y,o[r++]=l.z;for(let i of t)o[r++]=i.x,o[r++]=i.y,o[r++]=i.z;return s}import{randomUUID as Ks}from"crypto";function Js(e){for(let t of e)t.id=Ks()}var Qs=async(e,t,n,s,o)=>{if(mo(e,s,o),e.length<=0||t.length<=0)return e;n||(n=[]);for(let y of e){let p=[],d=s.readLineById(y.id);if(d.checkResults=s.getLineCheckReultsById(y.id),y.checkResults=d.checkResults,!(!y.checkResults||y.checkResults.length<=0)){for(let x=0;x<y.checkResults.length;x++){let R=function(v){for(;b[v]!==v;)b[v]=b[b[v]],v=b[v];return v},w=y.checkResults[x];if(!w.originalVertices||w.originalVertices.length==0)continue;let P=[];w.originalVertices.forEach(v=>{let I=[];v.forEach(D=>{I.push(new C.Vector3(D.x,D.y,D.z))}),P.push(I)});let S=P.length,b=Array.from({length:S},(v,I)=>I);for(let v=0;v<S;v++)for(let I=v+1;I<S;I++){let D=P[v],B=P[I];if(D.some(k=>B.some(H=>k.equals(H)))){let k=R(v),H=R(I);k!==H&&(b[k]=H)}}let z=new Map,V=-1,M=-1;for(let v=0;v<S;v++){let I=R(v);z.has(I)||z.set(I,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let D=z.get(I),[B,_,k,H]=P[v],F=new C.Vector3().add(B).add(_).add(k).add(H).multiplyScalar(.25);if(D.points.push(...P[v]),D.area+=B.distanceTo(_)*B.distanceTo(H),D.originalVertices.push(P[v]),D.index=x,D.centerPts.push(F),V==-1||M==-1){let j=new C.Vector3().subVectors(B,_).normalize();M=B.distanceTo(H),V=B.distanceTo(_);let $=Kt(j,new C.Vector3(0,0,1));$&&$.parallel&&([M,V]=[V,M])}D.gridWidth=V,D.gridHeight=M}p.push(...z.values())}y.checkResults=null,y.mergeCheckRegion=p}}let r=[];for(let y=0;y<n.length;y++){let p=n[y];if(p.isFindBeam=!1,p.category=="door"){let d=[];p.coordinatesByArea.coordinates.forEach(b=>{d.push(new C.Vector3(b.x,b.y,b.z))}),d[0].equals(d[d.length-1])&&d.pop();let x=d[0].distanceTo(d[1]),w=d[0].distanceTo(d[3]);w>x&&([x,w]=[w,x],d=[d[0],d[3],d[2],d[1]]);let P=qt(d[0],d[3],!0),S=qt(d[1],d[2],!0);r.push({doorStartPt:P,doorEndPt:S,boxPoints:d,minZ:p.coordinatesByArea.heightData.minZ,maxZ:p.coordinatesByArea.heightData.maxZ,index:y,isFind:!1,inWall:!1})}}for(let y=0;y<r.length;y++){let p=r[y];for(let d=0;d<e.length;d++){if(e[d].length<.5)continue;let x=[],w=qt(e[d].start,e[d].end,!0);x.push(w),x.push(qt(w,e[d].start,!0)),x.push(qt(w,e[d].end,!0));let P=!1,S=p.boxPoints.length;for(let b=0;b<x.length;b++){let R=x[b].x,z=x[b].y;for(let V=0,M=S-1;V<S;M=V++){let v=p.boxPoints[V].x,I=p.boxPoints[V].y,D=p.boxPoints[M].x,B=p.boxPoints[M].y;I>z!=B>z&&R<(D-v)*(z-I)/(B-I)+v&&(P=!P)}if(P)break}if(P){let b=new C.Vector3(e[d].start.x,e[d].start.y,0),R=new C.Vector3(e[d].end.x,e[d].end.y,0),z=p.doorStartPt.distanceTo(p.doorEndPt),V=b.distanceTo(R),M=Yt(p.doorStartPt,p.doorEndPt,b,R);if(Math.abs(V-z)<.5&&M&&M.angleDeg<15){p.doorStartPt=new C.Vector3(e[d].start.x,e[d].start.y,0),p.doorEndPt=new C.Vector3(e[d].end.x,e[d].end.y,0);break}else if(Math.abs(V-z)>1.3&&M&&M.angleDeg<15){let v=ye(p.doorStartPt,p.doorEndPt,b,R,{parallelAngleMax:C.MathUtils.degToRad(15)}),I=p.doorStartPt.distanceTo(b),D=p.doorStartPt.distanceTo(R),B=p.doorEndPt.distanceTo(b),_=p.doorEndPt.distanceTo(R),k=I<.2||D<.2||B<.2||_<.2;if(v&&v.type=="collinear_overlap"&&v.maxPerpendicularDistance<.1&&!k){p.inWall=!0;break}else{let H=new C.Line3(b,R),F=H.closestPointToPoint(p.doorStartPt,!0,new C.Vector3),j=H.closestPointToPoint(p.doorEndPt,!0,new C.Vector3),$=F.distanceTo(p.doorStartPt),K=j.distanceTo(p.doorEndPt);if($<.1||K<.1){p.inWall=!0;break}}}}else continue}}let i=0,l=[],f=[],u=[],E=[],a=.15;for(let y=0;y<e.length;y++){let p=e[y];if(p.noDetection)continue;let d=s.readLineById(p.id);if(d.originalPoints=s.getOriginalPointsById(p.id),d.checkResults=s.getLineCheckReultsById(p.id),p.originalPoints=d.originalPoints,p.checkResults=d.checkResults,d=null,p.doorAndBeamData=[],p.doorAndBeamIdToCheckResults=[],!p.mergeCheckRegion||p.mergeCheckRegion.length==0)continue;p.completePointAreaPercentage=-1;let x=new C.Box3;x.setFromPoints(p.originalPoints);let w=x.max.z,P=x.min.z,S=new C.Vector3(p.start.x,p.start.y,p.start.z),b=new C.Vector3(p.end.x,p.end.y,p.end.z),R=p.rooftopPz-p.start.z,z=0;for(let M of p.mergeCheckRegion){let{facePoints:v,boxArea:I,totalInPlaneNum:D}=ho(M.points,M.gridWidth,M.gridHeight,M.centerPts);if(!v||v.length<=0)continue;let B=v[0].distanceTo(v[1]),_=v[0].distanceTo(v[3]),k=M.gridHeight*(_/M.gridHeight/3*2)+M.gridHeight/2,H=new C.Vector3(v[0].x,v[0].y,v[0].z+k),F=new C.Vector3(v[1].x,v[1].y,v[1].z+k),j=new C.Line3(H,F),$=[],K=new C.Vector3;M.points.forEach(q=>{j.closestPointToPoint(q,!0,K).distanceTo(q)<M.gridHeight+.01&&$.push(q)});let Y=[],tt=[];for(;;){let q=[];for(let W=0;W<$.length;W++)tt.includes(W)||q.length==0&&(q.push($[W]),tt.push(W));for(let W=0;W<$.length;W++)if(!tt.includes(W)){for(let Z=0;Z<q.length;Z++)if($[W].distanceTo(q[Z])<M.gridWidth+.01){q.push($[W]),tt.push(W),W=-1;break}}if(q.length==0)break;Y.push(q)}let it=[];for(let q=0;q<Y.length;q++){let W={lineSt:new C.Vector3,lineEd:new C.Vector3,facePoints:[]},Z=Oe(Y[q]);Array.isArray(Z)&&Z.length==2&&(W.lineSt=Z[0],W.lineEd=Z[1],W.facePoints.push(new C.Vector3(Z[0].x,Z[0].y,v[0].z)),W.facePoints.push(new C.Vector3(Z[1].x,Z[1].y,v[0].z)),W.facePoints.push(new C.Vector3(Z[1].x,Z[1].y,v[2].z)),W.facePoints.push(new C.Vector3(Z[0].x,Z[0].y,v[2].z)),it.push(W))}z+=M.area;let ct=0;if(D!=0&&(ct=M.gridHeight*M.gridWidth*D),(M.area-ct)/I*100>70&&it.length==1||it.length>1)for(let q=0;q<it.length;q++){let W=it[q],Z=W.facePoints[0].distanceTo(W.facePoints[1]),wt=W.facePoints[0].distanceTo(W.facePoints[3]),Ft=Z/p.length*100,Nt=p.rooftopPz-W.facePoints[2].z;if(wt<1.5||w<W.facePoints[2].z||Nt>R/3*2)continue;let jt=!1,Lt=!1,Tt=!1,It=new C.Vector3(0,0,0),Pt=new C.Vector3(0,0,0),bt=!1,Bt=[],J=W.facePoints[2].clone(),ft=W.facePoints[3].clone(),Q=W.facePoints[0].clone(),U=W.facePoints[1].clone(),de=!1,Et=-1;if(Math.abs(W.facePoints[0].z-p.start.z)<.25){let re=!1;for(let et=0;et<t.length;et++){let Vt=et+1;if(Vt>=t.length)continue;let Ot=new C.Vector3(t[et].x,t[et].y,t[et].z),nt=new C.Vector3(t[Vt].x,t[Vt].y,t[Vt].z);if(xe(new C.Vector3(Ot.x,Ot.y,0),new C.Vector3(nt.x,nt.y,0),new C.Vector3(W.facePoints[0].x,W.facePoints[0].y,0),new C.Vector3(W.facePoints[1].x,W.facePoints[1].y,0),.1)!=null){re=!0;break}}let{newOriginalPoints:Te}=Je(Q,U,p.originalPoints),St=[],ie=[];if(Te.forEach(et=>{et.z>=J.z?St.push(et):et.z<=Q.z&&ie.push(et)}),St.length<20)continue;let G=p.rooftopPz-J.z,me=J.clone();me.z+=G;let He=J.distanceTo(ft),Be=new C.Vector3().subVectors(ft,J).normalize(),Ze=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(He)))),_e=He/Ze,pe=[],Ae=[];for(let et=0;et<Ze;et++)pe.push(new C.Vector3(J.x,J.y,J.z+G/5).addScaledVector(Be,_e*et)),pe.push(new C.Vector3(me.x,me.y,me.z-G/5).addScaledVector(Be,_e*et));let Fe=pe.length;for(let et=0;et<St.length;et++)for(let Vt=0;Vt<pe.length;Vt++)if(new C.Vector3(St[et].x,St[et].y,St[et].z).distanceTo(pe[Vt])<.05){Ae.push(pe[Vt]),pe.splice(Vt,1);break}if(Ae.length/Fe<.5)continue;if(Z>.17&&p.length>.5){let et=$t(S,Q),Vt=$t(S,U),Ot=$t(b,Q),nt=$t(b,U),L=.15,xt=10;if(et<L||Vt<L)if(St.length>10){let gt=new C.Vector3(p.start.x,p.start.y,0),rt=new C.Vector3(p.end.x,p.end.y,0),dt=new C.Vector3().subVectors(gt,rt).normalize(),Ct=new C.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let X=0;X<e.length;X++){if(X==y)continue;let ht=new C.Vector3(e[X].start.x,e[X].start.y,0),ot=new C.Vector3(e[X].end.x,e[X].end.y,0),Rt=xe(gt,rt,ht,ot,.1),Mt=se(gt,rt,ht,ot);if(Rt!=null){if(Mt&&Mt.angle>85){let vt=Rt.point.distanceTo(gt),_t=Rt.point.distanceTo(rt);if(vt<.3){at=!0,mt=1/0,At=-1;break}}continue}if(Mt&&Mt.angle>85){let _t=new C.Line3(ht,ot).closestPointToPoint(gt,!0,Ct),Dt=Yt(gt,rt,_t,gt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt,xt),Ut=rt.clone().addScaledVector(dt.clone().negate(),xt),oe=new C.Vector3().subVectors(ot,ht).normalize(),te=ht.clone().addScaledVector(oe.clone().negate(),.03),Pe=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,te,Pe);if(le==null)continue;let Qt=gt.distanceTo(le.point);Qt<mt&&(mt=Qt,At=X)}else if(Mt&&Mt.angle<5){let vt=new C.Vector3(Q.x,Q.y,0),_t=new C.Vector3(U.x,U.y,0),Dt=$t(vt,ht),ne=$t(vt,ot),Ut=$t(_t,ht),oe=$t(_t,ot),te=Yt(gt,rt,ht,vt),Pe=!1,le=s.readLineById(e[X].id);if(le.checkResults=s.getLineCheckReultsById(e[X].id),e[X].checkResults=le.checkResults,le=null,e[X].checkResults){for(let Qt=0;Qt<e[X].checkResults.length;Qt++){let Ke=[];for(let ce=0;ce<e[X].checkResults[Qt].allCenterPoints.length;ce++)Ke.push(new C.Vector3(e[X].checkResults[Qt].allCenterPoints[ce].x,e[X].checkResults[Qt].allCenterPoints[ce].y,0));let ge=Oe(Ke);if(ge.length==2){let ce=$t(vt,ge[0]),Mn=$t(vt,ge[1]),vn=$t(_t,ge[0]),Hn=$t(_t,ge[1]);if(ce<.2||Mn<.2||vn<.2||Hn<.2){Pe=!0;break}}}e[X].checkResults=null}if(te&&te.direction=="same"&&!Pe&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(p.length-Z>.2||p.length-Z<.02)&&mt<Z*2)e[At].length>.25&&Z+mt>.5&&(de=!0,et<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),U=U.addScaledVector(dt,mt)));else{if(!pt&&!at&&p.length-Z>.1)continue;if(!pt&&!at&&p.length-Z<.1&&p.length<1.8)continue}}else continue;if(Ot<L||nt<L)if(St.length>10){let gt=new C.Vector3(p.start.x,p.start.y,0),rt=new C.Vector3(p.end.x,p.end.y,0),dt=new C.Vector3().subVectors(rt,gt).normalize(),Ct=new C.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let X=0;X<e.length;X++){if(X==y)continue;let ht=new C.Vector3(e[X].start.x,e[X].start.y,0),ot=new C.Vector3(e[X].end.x,e[X].end.y,0),Rt=xe(gt,rt,ht,ot,.03),Mt=se(gt,rt,ht,ot);if(Rt!=null){if(Mt&&Mt.angle>85){let vt=Rt.point.distanceTo(gt);if(Rt.point.distanceTo(rt)<.3){at=!0,mt=1/0,At=-1;break}}continue}if(Mt&&Mt.angle>85){let _t=new C.Line3(ht,ot).closestPointToPoint(rt,!0,Ct),Dt=Yt(rt,gt,_t,rt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt.clone().negate(),xt),Ut=rt.clone().addScaledVector(dt,xt),oe=new C.Vector3().subVectors(ot,ht).normalize(),te=ht.clone().addScaledVector(oe.clone().negate(),.03),Pe=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,te,Pe);if(le==null)continue;let Qt=rt.distanceTo(le.point);Qt<mt&&(mt=Qt,At=X)}else if(Mt&&Mt.angle<5){let vt=new C.Vector3(Q.x,Q.y,0),_t=new C.Vector3(U.x,U.y,0),Dt=$t(vt,ht),ne=$t(vt,ot),Ut=$t(_t,ht),oe=$t(_t,ot),te=Yt(rt,gt,ht,vt),Pe=!1,le=s.readLineById(e[X].id);if(le.checkResults=s.getLineCheckReultsById(e[X].id),e[X].checkResults=le.checkResults,le=null,e[X].checkResults){for(let Qt=0;Qt<e[X].checkResults.length;Qt++){let Ke=[];for(let ce=0;ce<e[X].checkResults[Qt].allCenterPoints.length;ce++)Ke.push(new C.Vector3(e[X].checkResults[Qt].allCenterPoints[ce].x,e[X].checkResults[Qt].allCenterPoints[ce].y,0));let ge=Oe(Ke);if(ge.length==2){let ce=$t(vt,ge[0]),Mn=$t(vt,ge[1]),vn=$t(_t,ge[0]),Hn=$t(_t,ge[1]);if(ce<.2||Mn<.2||vn<.2||Hn<.2){Pe=!0;break}}}e[X].checkResults=null}if(te&&te.direction=="same"&&!Pe&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(p.length-Z>.2||p.length-Z<.02)&&mt<Z*2)e[At].length>.25&&Z+mt>.5&&(de=!0,Ot<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),U=U.addScaledVector(dt,mt)));else{if(!pt&&!at&&p.length-Z>.1)continue;if(!pt&&!at&&p.length-Z<.1&&p.length<1.8)continue}}else continue;Z=ft.distanceTo(J)}if(Ft<85&&Z>.3||Z>.7&&wt>R-R/2){if(!p.isLine2){if(Z<3.5)for(let et=0;et<r.length;et++){let Vt=new C.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new C.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new C.Vector3(W.facePoints[0].x,W.facePoints[0].y,0),L=new C.Vector3(W.facePoints[1].x,W.facePoints[1].y,0),xt=W.facePoints[2].z<r[et].maxZ||Math.abs(W.facePoints[2].z-r[et].maxZ)<.3,gt=Math.abs(W.facePoints[2].z-r[et].maxZ)>.2;if(xt){let rt=ye(Vt.clone(),Ot.clone(),nt.clone(),L.clone(),{distanceThreshold:2});if(rt&&rt.type=="collinear_gap"){let dt=qt(Vt,Ot),Ct=new C.Line3(new C.Vector3(p.start.x,p.start.y,0),new C.Vector3(p.end.x,p.end.y,0)),mt=new C.Vector3,At=Ct.closestPointToPoint(dt,!0,mt);if(dt.distanceTo(At)<.15){let at=nt.distanceTo(Vt),X=L.distanceTo(Vt);if(at>.25&&X>.25){let Rt=nt.distanceTo(Ot),Mt=L.distanceTo(Ot);if(Rt>.2&&Mt>.2)continue}Lt=!0,bt=!0,Bt.push(r[et].index),r[et].isFind=!0,Et=et,Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0;let ht=new C.Vector3().subVectors(nt,L).normalize(),ot=Vt.distanceTo(Ot)-rt.overlap;X<at&&ht.negate(),at>X?(J=W.facePoints[2].clone().addScaledVector(ht,ot),ft=W.facePoints[3].clone(),Q=ft.clone(),U=J.clone(),Q.z=U.z=W.facePoints[0].z):(J=W.facePoints[2].clone(),ft=W.facePoints[3].clone().addScaledVector(ht,ot),Q=ft.clone(),U=J.clone(),Q.z=U.z=W.facePoints[0].z)}}else if(rt&&rt.type=="collinear_overlap"&&rt.maxPerpendicularDistance<.35){let dt=nt.distanceTo(L),Ct=Ot.distanceTo(Vt);if(Math.abs(dt-rt.overlap)<.25||Math.abs(Ct-rt.overlap)<.25){if(Ct>dt&&Math.abs(Ct-rt.overlap)>1){let mt=nt.distanceTo(Vt),At=nt.distanceTo(Ot),pt=L.distanceTo(Vt),at=L.distanceTo(Ot),X=mt<At?mt:At,ht=pt<at?pt:at,ot=new C.Vector3().subVectors(nt,L).normalize(),Rt=Ct-rt.overlap;X<ht?(ot.negate(),J=W.facePoints[2].clone().addScaledVector(ot,Rt),ft=W.facePoints[3].clone(),Q=ft.clone(),U=J.clone(),Q.z=U.z=W.facePoints[0].z):(J=W.facePoints[2].clone(),ft=W.facePoints[3].clone().addScaledVector(ot,Rt),Q=ft.clone(),U=J.clone(),Q.z=U.z=W.facePoints[0].z)}Z>1.5&&(Lt=!0,bt=!0,Bt.push(r[et].index),r[et].isFind=!0,Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Et=et)}}}}if(!bt&&Z<1.5)for(let et=0;et<r.length;et++){if(r[et].inWall)continue;let Vt=new C.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new C.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new C.Vector3(ft.x,ft.y,0),L=new C.Vector3(J.x,J.y,0),xt=new C.Vector3().subVectors(Vt,Ot).normalize(),gt=new C.Vector3().subVectors(nt,L).normalize(),rt=.25,dt=Vt.clone().addScaledVector(xt,rt),Ct=Ot.clone().addScaledVector(xt.clone().negate(),rt),mt=nt.clone().addScaledVector(gt,rt),At=L.clone().addScaledVector(gt.clone().negate(),rt);if(Yt(dt,Ct,mt,At).isParallel)continue;let at=xe(dt,Ct,mt,At),X=!0,ht=Vt.distanceTo(nt),ot=Vt.distanceTo(L),Rt=Ot.distanceTo(nt),Mt=Ot.distanceTo(L);if((ht<a||ot<a||Rt<a||Mt<a||at)&&X){let _t=new C.Line3(nt,L);if(ht<a||Rt<a)if(It=nt.clone(),ht<a){let Dt=_t.closestPointToPoint(Ot,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=_t.closestPointToPoint(Vt,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Vt,Dt).normalize()}else if(ot<a||Mt<a)if(It=L.clone(),ot<a){let Dt=_t.closestPointToPoint(Ot,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=_t.closestPointToPoint(Vt,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Vt,Dt).normalize()}else if(at){let Dt=at.point.distanceTo(nt),ne=at.point.distanceTo(L),Ut=at.point.distanceTo(dt),oe=at.point.distanceTo(Ct);if(Dt<ne?It=nt.clone():It=L.clone(),Ut<oe){let te=_t.closestPointToPoint(Ct,!1,new C.Vector3);Pt=new C.Vector3().subVectors(Ct,te).normalize()}else{let te=_t.closestPointToPoint(dt,!1,new C.Vector3);Pt=new C.Vector3().subVectors(dt,te).normalize()}}Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Lt=!0,r[et].isFind=!0,Et=et}}}(Lt||re||Math.abs(wt-R)>.1&&wt>R/3&&Z>.3)&&(jt=!0)}}if(jt){{let nt=new C.Vector3().subVectors(Q,U),L=new C.Vector3().subVectors(U,Q),xt=1/0,gt=1/0,rt=Q.clone(),dt=U.clone(),Ct=[],mt=[],At=new C.Line3(J,ft),pt=new C.Vector3,at=999999;if(p.originalPoints.forEach(X=>{if(X.z-Q.z<wt/2+.1&&X.z-Q.z>wt/2-.1&&Ct.push(X),X.z>J.z){let ht=At.closestPointToPoint(X,!0,pt),ot=new C.Vector3().subVectors(ht,J),Rt=new C.Vector3().subVectors(ht,ft),Mt=Kt(nt,Rt),vt=Kt(L,ot);Mt&&Mt.parallel&&!Mt.sameDirection&&vt&&vt.parallel&&!vt.sameDirection&&mt.push(X)}}),Ct.length>0){let{newProjectPoints:X}=Je(Q,U,Ct);for(let ht of X)ht.z=Q.z;X.forEach(ht=>{let ot=new C.Vector3(ht.x,ht.y,Q.z),Rt=new C.Vector3().subVectors(ot,U),Mt=new C.Vector3().subVectors(ot,Q),vt=Kt(nt,Mt),_t=Kt(L,Rt);if(vt&&vt.parallel&&vt.sameDirection){let Dt=ot.distanceTo(Q);Dt<xt&&(xt=Dt,rt=ot)}else if(_t&&_t.parallel&&_t.sameDirection){let Dt=ot.distanceTo(U);Dt<gt&&(gt=Dt,dt=ot)}})}if(rt.equals(Q)||(Q=rt,ft=new C.Vector3(Q.x,Q.y,ft.z)),dt.equals(U)||(U=dt,J=new C.Vector3(U.x,U.y,J.z)),mt.length>10){let{newOnLinePoints:X}=Je(ft,J,mt);for(let ht=0;ht<X.length;ht++){let Rt=At.closestPointToPoint(X[ht],!0,pt).distanceTo(X[ht]);Rt>.02&&at>Rt&&(at=Rt)}J.z+=at,ft.z+=at,wt+=at}}let re=!1;for(let nt=0;nt<u.length;nt++){let L=ye(u[nt].start,u[nt].end,Q,U);L&&L.type=="collinear_overlap"&&L.maxPerpendicularDistance<.07&&(re=!0)}if(re){Et!=-1&&(Tt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1));continue}let Te=U.distanceTo(Q);if(Te<.4&&!Lt||Te<.3&&Lt)continue;f.includes(y)||f.push(y);let St="",ie=Lt?"singleDoor":"";ie=bt?"pullOutDoor":ie;let G={id:i,beamStart:J,beamEnd:ft,beamHeight:p.rooftopPz-J.z,doorStart:Q,doorEnd:U,doorHeight:wt,nearId:-1,type:St,isExtend:de,isDoor:Lt,isPullOutDoor:bt,pcbDoorIndexs:Bt,beamNearWallVec:new C.Vector3(0,0,0),doorType:ie,doorOpenEndPoint:It,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(G.beamHeight<.1)continue;let me=1/0,He=!1,Be=new C.Vector3,Ze=new C.Vector3,_e=-1,pe=-1,Ae=-1,Fe=!1,Ue=!1;if(!He){let nt=new C.Line3(Q.clone(),U.clone()),L=-1;for(let xt=0;xt<e.length;xt++){if(e[xt].length<.5||xt==y)continue;let gt=new C.Vector3(e[xt].start.x,e[xt].start.y,e[xt].start.z),rt=new C.Vector3(e[xt].end.x,e[xt].end.y,e[xt].end.z),dt=ye(gt,rt,Q,U),Ct=Yt(gt,rt,Q,U);if(dt&&dt.maxPerpendicularDistance<.5){if(Ct&&Ct.isParallel){let ot=new C.Line3(gt,rt),Rt=new C.Vector3(Q.x,Q.y,gt.z),Mt=ot.closestPointToPoint(Rt,!0,new C.Vector3),vt=se(Mt,Rt,Q,U);vt&&vt.angle>85&&(G.beamNearWallVec=new C.Vector3().subVectors(Mt,Rt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&Z>1?Ue=!0:Ue=!1)}let mt=[],At=s.readLineById(e[xt].id);At.originalPoints=s.getOriginalPointsById(e[xt].id),e[xt].originalPoints=At.originalPoints,At=null,e[xt].originalPoints.forEach(ot=>{ot.z>Q.z+.2&&ot.z<Q.z+wt/2&&mt.push(new C.Vector3(ot.x,ot.y,Q.z))}),e[xt].originalPoints=null;let pt=new C.Vector3,at=[],X=[];for(let ot=0;ot<mt.length;ot++){let Rt=nt.closestPointToPoint(mt[ot],!0,pt);Rt.distanceTo(mt[ot])<.15&&(at.push(mt[ot]),X.push(Rt.clone()))}for(let ot=0;ot<X.length;ot++)Dn(nt,X[ot])&&at.push(X[ot]);if(at=X,at=In(at),at.length<150)continue;let ht=Oe(at);if(ht.length==2){let ot=ht[0].distanceTo(ht[1]);if(Math.abs(ot-nt.distance())<.3){L=dt.maxPerpendicularDistance;let Rt=new C.Line3(gt,rt),Mt=new C.Vector3(Q.x,Q.y,gt.z),vt=Rt.closestPointToPoint(Mt,!0,new C.Vector3);if(G.beamNearWallVec=new C.Vector3().subVectors(vt,Mt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&Z>1)Ue=!0,Fe=!0;else if(re=!0,Et!=-1&&(Tt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1)),pe!=-1&&Ae!=-1){let _t=e[pe].doorAndBeamData[Ae];_t.nearId=-1}break}}if(re)break}else dt&&dt.type=="collinear_overlap"&&dt.maxPerpendicularDistance>.3&&dt.maxPerpendicularDistance<.7&&(Fe=!0)}if(re){if(Z<1.5||L<.08)continue;Fe=!0}}let et=!1;if(_e!=-1)for(let nt=0;nt<E.length&&!(E[nt].length==1&&(E[nt][0].id==i?(E[nt].push({id:_e,beamStart:Be,beamEnd:Ze}),et=!0):E[nt][0].id==_e&&(E[nt].push({id:i,beamStart:J,beamEnd:ft}),et=!0),et));nt++);et||E.push([{id:i,beamStart:J,beamEnd:ft}]);let Vt=G.doorStart.distanceTo(G.doorEnd),Ot=hn(p.originalPoints);if(G.lineIsOnlyBeam=Ot.minZ>p.start.z&&Ot.minZ-p.start.z>1,Lt?St="door":Vt>1.5||de?St="beam":St=Fe&&Vt>1?"beam":"hole",St!="beam"&&e[y].isLine2)continue;G.type=St,G.wallBelowBeam=Ue;for(let nt=0;nt<l.length;nt++){let L=e[l[nt].linesIndex].doorAndBeamData[l[nt].doorIndex];if(L.nearId!=-1||G.type=="beam"&&L.type!="beam"||G.type!="beam"&&L.type=="beam")continue;let xt=Yt(J.clone(),ft.clone(),L.beamStart.clone(),L.beamEnd.clone());if(xt&&xt.isParallel){let gt=J.distanceTo(ft),rt=L.beamStart.distanceTo(L.beamEnd),dt=new C.Line3(J.clone(),ft.clone());dt.start.z=0,dt.end.z=0;let Ct=qt(L.beamStart,L.beamEnd,!0);rt>gt&&(dt.start=new C.Vector3(L.beamStart.x,L.beamStart.y,0),dt.end=new C.Vector3(L.beamEnd.x,L.beamEnd.y,0),Ct=qt(J,ft,!0));let mt=new C.Vector3,At=dt.closestPointToPoint(Ct,!0,mt),pt=At.distanceTo(Ct),at=new C.Vector3().subVectors(Ct,At).normalize(),X=at.clone().negate(),ht=Ct.clone().addScaledVector(X,pt+.1),ot=xe(dt.start,dt.end,Ct,ht),Rt=!Lt&&!L.isDoor&&(gt>rt*2||rt>gt*2);if(pt<.4&&ot!=null&&!Rt){let Mt=!1;for(let Ut=0;Ut<p.doorAndBeamData.length;Ut++)if(p.doorAndBeamData[Ut].id==L.id){Mt=!0;break}if(Mt)continue;L.nearId=i,G.nearId=L.id;let vt=.8;(L.isDoor||G.isDoor)&&(L.isDoor=!0,G.isDoor=!0),L.doorType!=""?G.doorType=L.doorType:G.doorType!=""&&(L.doorType=G.doorType),L.isPullOutDoor?G.isPullOutDoor=!0:G.isPullOutDoor&&(L.isPullOutDoor=!0);let _t=Bt.some(Ut=>L.pcbDoorIndexs.includes(Ut)),Dt=!1,ne=!1;if(G.type=="beam"&&L.type=="beam"){let Ut=s.readLineById(e[l[nt].linesIndex].id);Ut.originalPoints=s.getOriginalPointsById(e[l[nt].linesIndex].id),e[l[nt].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let oe=hn(e[l[nt].linesIndex].originalPoints),te=hn(p.originalPoints);e[l[nt].linesIndex].originalPoints=null,oe.minZ>e[l[nt].linesIndex].start.z&&oe.minZ-e[l[nt].linesIndex].start.z>1&&te.minZ>p.start.z&&te.minZ-p.start.z>1&&(Dt=gt>rt,ne=gt<rt,rt>gt&&(G.isExtend=!0),gt>rt&&(e[l[nt].linesIndex].isExtend=!0))}gt<rt&&!ne||Dt?(Dt&&(X=X.negate(),at=at.negate()),gt>vt&&!L.isPullOutDoor?(L.beamStart=J.clone().addScaledVector(X,pt),L.beamEnd=ft.clone().addScaledVector(X,pt),L.doorStart=Q.clone().addScaledVector(X,pt),L.doorEnd=U.clone().addScaledVector(X,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):!bt||bt&&L.isPullOutDoor&&_t?(G.beamStart=L.beamStart.clone().addScaledVector(at,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(at,pt),G.doorStart=L.doorStart.clone().addScaledVector(at,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(at,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):(L.beamStart=J.clone().addScaledVector(X,pt),L.beamEnd=ft.clone().addScaledVector(X,pt),L.doorStart=Q.clone().addScaledVector(X,pt),L.doorEnd=U.clone().addScaledVector(X,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone())):(gt>rt&&!Dt||ne)&&(ne&&(X=X.negate(),at=at.negate()),rt>vt&&!bt?(G.beamStart=L.beamStart.clone().addScaledVector(X,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(X,pt),G.doorStart=L.doorStart.clone().addScaledVector(X,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(X,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):!L.isPullOutDoor||bt&&L.isPullOutDoor&&_t?(L.beamStart=J.clone().addScaledVector(at,pt),L.beamEnd=ft.clone().addScaledVector(at,pt),L.doorStart=Q.clone().addScaledVector(at,pt),L.doorEnd=U.clone().addScaledVector(at,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):(G.beamStart=L.beamStart.clone().addScaledVector(X,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(X,pt),G.doorStart=L.doorStart.clone().addScaledVector(X,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(X,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone())),_e=G.nearId,Be=L.beamStart.clone(),Ze=L.beamEnd.clone(),He=!0,pe=l[nt].linesIndex,Ae=l[nt].doorIndex;break}}}if(G.nearId!=-1&&St=="hole"){let nt=!1;for(let L=0;L<e.length;L++)if(e[L].doorAndBeamData){for(let xt=0;xt<e[L].doorAndBeamData.length;xt++)if(e[L].doorAndBeamData[xt].nearId==i&&e[L].doorAndBeamData[xt].type=="beam"){e[L].doorAndBeamData[xt].type=St,nt=!0;break}if(nt)break}}if(p.doorAndBeamIdToCheckResults.push([M.index,i]),p.doorAndBeamData.push(G),l.push({linesIndex:y,doorIndex:p.doorAndBeamData.length-1}),u.push({start:Q,end:U}),i++,bt&&Z<2)break}}}let V=p.length*(p.rooftopPz-p.start.z);p.completePointAreaPercentage=z/V*100,p.checkResults=null,p.originalPoints=null}if(f.length>1)for(let y=0;y<f.length;y++){let p=[];for(let d=0;d<e[f[y]].doorAndBeamData.length;d++){let x=!1;if(e[f[y]].doorAndBeamData[d].type==="beam"&&(e[f[y]].doorAndBeamData[d].beamNearWallVec.x==0&&e[f[y]].doorAndBeamData[d].beamNearWallVec.y==0&&e[f[y]].doorAndBeamData[d].beamNearWallVec.z==0&&e[f[y]].doorAndBeamData[d].nearId==-1||!e[f[y]].doorAndBeamData[d].wallBelowBeam&&e[f[y]].doorAndBeamData[d].nearId==-1)&&(e[f[y]].doorAndBeamData[d].lineIsOnlyBeam?x=!0:e[f[y]].doorAndBeamData[d].type="hole"),!x){let w=e[f[y]].doorAndBeamData[d].doorStart.clone(),P=e[f[y]].doorAndBeamData[d].doorEnd.clone();w.z=P.z=0;let S=w.distanceTo(P);for(let b=0;b<f.length;b++)if(y!=b)for(let R=0;R<e[f[b]].doorAndBeamData.length;R++){let z=e[f[b]].doorAndBeamData[R].doorStart.clone(),V=e[f[b]].doorAndBeamData[R].doorEnd.clone();z.z=V.z=0;let M=z.distanceTo(V),v=ye(w,P,z,V);if(v.type=="collinear_overlap"&&v.maxPerpendicularDistance<.2){let I=new C.Line3(z,V),D=qt(w,P),B=I.closestPointToPoint(D,!0,new C.Vector3),_=D.distanceTo(B);if(Math.abs(S-v.overlap)<.1&&_<.04){e[f[b]].doorAndBeamData[R].nearId==e[f[y]].doorAndBeamData[d].id&&(e[f[b]].doorAndBeamData[R].nearId=-1),x=!0;break}}}}if(x){for(let w=0;w<e[f[y]].doorAndBeamIdToCheckResults.length;w++)if(e[f[y]].doorAndBeamIdToCheckResults[1]==e[f[y]].doorAndBeamData[d].id){e[f[y]].doorAndBeamIdToCheckResults.splice(w,1);break}}x||p.push(e[f[y]].doorAndBeamData[d])}p.length!=e[f[y]].doorAndBeamData.length&&(e[f[y]].doorAndBeamData=p)}let c=.65,m=2,h=[],g=[];for(let y=0;y<r.length;y++){if(r[y].isFind||r[y].inWall)continue;let p=new C.Vector3(r[y].doorStartPt.x,r[y].doorStartPt.y,0),d=new C.Vector3(r[y].doorEndPt.x,r[y].doorEndPt.y,0),x=new C.Vector3().subVectors(p,d).normalize();for(let w=0;w<e.length;w++){if(e[w].length<.7||e[w].completePointAreaPercentage>60)continue;let P=new C.Vector3(e[w].start.x,e[w].start.y,0),S=new C.Vector3(e[w].end.x,e[w].end.y,0),b=new C.Vector3().subVectors(P,S).normalize(),R=.3,z=p.clone().addScaledVector(x,R),V=d.clone().addScaledVector(x.clone().negate(),R),M=P.clone().addScaledVector(b,R),v=S.clone().addScaledVector(b.clone().negate(),R),I=xe(z,V,M,v),D=Yt(z,V,M,v),B=p.distanceTo(P)>d.distanceTo(P)?d:p,_=B.distanceTo(P),k=B.distanceTo(S);if((_<a||k<a)&&D&&!D.isParallel){let F=p.distanceTo(P),j=p.distanceTo(S),$=F<j?P:S,K=!1;for(let Y=0;Y<e.length;Y++){if(Y==w||h.includes(Y)||e[Y].length<.7)continue;let tt=new C.Vector3(e[Y].start.x,e[Y].start.y,0),it=new C.Vector3(e[Y].end.x,e[Y].end.y,0),ct=new C.Vector3().subVectors(tt,it).normalize(),ut=ct.clone().negate(),q=tt.clone().addScaledVector(ct,5),W=it.clone().addScaledVector(ut,5),Z=se(P,S,tt,it),wt=ye(P,S,tt,it),Ft=xe(P,S,q,W),Nt=!0;if(Ft!=null&&(Nt=Ft.point.distanceTo(P)<a||Ft.point.distanceTo(S)<a),(Z&&Z.angle>85||wt&&wt.type=="collinear_gap")&&Nt){let jt=new C.Line3(P,S),Lt=new C.Vector3,Tt=jt.closestPointToPoint(tt,!0,Lt),It=jt.closestPointToPoint(it,!0,Lt),Pt=Tt.distanceTo(tt),bt=It.distanceTo(it),Bt,J;if(Pt>bt&&bt>c)Bt=it,J=It;else if(Pt<bt&&Pt>c)Bt=tt,J=Tt;else continue;if(Pt=$.distanceTo(tt),bt=$.distanceTo(it),Pt>m&&bt>m)continue;let ft=Yt(Bt,J,tt,it),Q=Yt(Bt,J,z,V);if(Q&&Q.isParallel||!ft||!ft.isParallel)continue;let U=ye(p,d,Bt,J);if(U&&U.type=="collinear_overlap"&&U.maxPerpendicularDistance<.2)continue;Bt.z=J.z=e[Y].start.z;let de=!1;for(let St=0;St<g.length;St++){let ie=ye(g[St].start,g[St].end,Bt,J);if(ie&&ie.type=="collinear_overlap"&&ie.maxPerpendicularDistance<.2){de=!0;break}}if(de)continue;for(let St=0;St<e.length;St++){if(e[St].length<.5)continue;let ie=new C.Vector3(e[St].start.x,e[St].start.y,e[St].start.z),G=new C.Vector3(e[St].end.x,e[St].end.y,e[St].end.z),me=ye(ie,G,Bt,J);if(me&&me.type=="collinear_overlap"&&me.maxPerpendicularDistance<.1){de=!0;break}}if(de)continue;g.push({start:Bt,end:J}),h.push(Y);let Et=e[Y].rooftopPz-e[Y].start.z,re=e[w].rooftopPz-e[w].start.z,Te=Et<re?Et:re;e[Y].doorAndBeamData||(e[Y].doorAndBeamData=[]),e[Y].doorAndBeamData.push({id:i,beamStart:Bt,beamEnd:J,beamHeight:Te,doorStart:Bt,doorEnd:J,doorHeight:Te,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new C.Vector3(0,0,0)}),n[r[y].index].isFindBeam=!0,n[r[y].index].isFindOnlyDoor=!0,E.push([{id:i,beamStart:Bt,beamEnd:J}]),i++,K=!0;break}}if(K)break}}}let T=[];for(let y=0;y<e.length;y++)e[y].isLine2||T.push(e[y]),e[y].isLine2&&e[y].doorAndBeamData.length!=0&&T.push(e[y]);return e.length=0,e.push(...T),{lines:e,beamGroup:E}},tr=async e=>{Js(e),bo(e);let t=new dn(e);for(let n=0;n<e.length;n++){let s=e[n],o=new C.Vector3(s.start.x,s.start.y,s.start.z),r=new C.Vector3(s.end.x,s.end.y,s.end.z),i=new C.Line3(o.clone(),r.clone()),l=-1;for(let f=0;f<s.doorAndBeamData.length;f++){let u=s.doorAndBeamData[f],E=u.doorHeight;u.isRebuild=!1;let a=!1,c=!1;if(!(u.nearId!=-1||u.type!="beam")){for(let m=0;m<e.length;m++){if(e[m].length<.5||m==n)continue;let h=new C.Vector3(e[m].start.x,e[m].start.y,e[m].start.z),g=new C.Vector3(e[m].end.x,e[m].end.y,e[m].end.z),T=ye(h,g,o,r),y=Yt(h,g,o,r);if(T&&T.maxPerpendicularDistance<.5){if(y&&y.isParallel){let b=new C.Line3(h,g),R=new C.Vector3(o.x,o.y,h.z),z=b.closestPointToPoint(R,!0,new C.Vector3),V=se(z,R,o,r);V&&V.angle>85&&(u.beamNearWallVec=new C.Vector3().subVectors(z,R).normalize())}let p=[],d=t.readLineById(e[m].id);d.originalPoints=t.getOriginalPointsById(e[m].id),e[m].originalPoints=d.originalPoints,d=null,e[m].originalPoints.forEach(b=>{b.z>o.z+.2&&b.z<o.z+E/2&&p.push(new C.Vector3(b.x,b.y,o.z))}),e[m].originalPoints=null;let x=new C.Vector3,w=[],P=[];for(let b=0;b<p.length;b++){let R=i.closestPointToPoint(p[b],!0,x);R.distanceTo(p[b])<.15&&(w.push(p[b]),P.push(R.clone()))}for(let b=0;b<P.length;b++)Dn(i,P[b])&&w.push(P[b]);if(w=P,w=In(w),w.length<150)continue;let S=Oe(w);if(S.length==2){let b=S[0].distanceTo(S[1]);if(Math.abs(b-i.distance())<.3){l=T.maxPerpendicularDistance;let R=new C.Line3(h,g),z=new C.Vector3(o.x,o.y,h.z),V=R.closestPointToPoint(z,!0,new C.Vector3);u.beamNearWallVec=new C.Vector3().subVectors(V,z).normalize(),u.beamStart.z>e[m].rooftopPz-.03&&length>1?c=!0:a=!0;break}}if(a)break}else T&&T.type=="collinear_overlap"&&T.maxPerpendicularDistance>.3&&T.maxPerpendicularDistance<.7&&(c=!0)}if(a){if(length<1.8||l<.2)continue;c=!0}c||(u.isRebuild=!0)}}}t.close()};import*as yt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var To=(e,t={})=>{let n=t.eps??1e-6,s=t.project??(y=>({x:y.x,y:y.z})),o=t.skipSplit??!1,r=t.insideAreaSign??"positive",i=o?e.map((y,p)=>({start:mn(y.start),end:mn(y.end),uuid:y.uuid,sourceIndex:p,sourceSegment:y})):er(e,s,n),l=[],f=new Map;function u(y){let p=Math.round(y.x/n),d=Math.round(y.y/n);return`${p},${d}`}function E(y){let p=u(y);if(f.has(p))return f.get(p);let d=l.length;return l.push({id:d,x:y.x,y:y.y}),f.set(p,d),d}let a=[],c=new Map;for(let y of i){let p=s(y.start),d=s(y.end);if(Po(p,d)<n*n)continue;let x=E(p),w=E(d);if(x===w)continue;let P=x<w?`${x}_${w}`:`${w}_${x}`;if(c.has(P))continue;let S=a.length;a.push({id:S,a:x,b:w,uuid:y.uuid,sourceIndex:y.sourceIndex,sourceSegment:y.sourceSegment||y}),c.set(P,S)}let m=[],h=Array.from({length:l.length},()=>[]);function g(y,p,d,x,w){let P=l[y],S=l[p],b=m.length,R=Math.atan2(S.y-P.y,S.x-P.x),z={id:b,from:y,to:p,twin:null,next:null,angle:R,edgeId:d,uuid:x,sourceIndex:w,visited:!1};return m.push(z),h[y].push(b),b}for(let y of a){let p=g(y.a,y.b,y.id,y.uuid,y.sourceIndex),d=g(y.b,y.a,y.id,y.uuid,y.sourceIndex);m[p].twin=d,m[d].twin=p}for(let y of h)y.sort((p,d)=>m[p].angle-m[d].angle);for(let y of m){let p=h[y.to],d=y.twin,x=p.indexOf(d);if(x===-1)continue;let w=(x-1+p.length)%p.length;y.next=p[w]}let T=[];for(let y of m){if(y.visited)continue;let p=[],d=[],x=y.id,w=0,P=m.length+10;for(;;){let M=m[x];if(!M||M.visited)break;if(M.visited=!0,p.push(x),d.push(M.from),x=M.next,w++,w>P){console.warn("\u534A\u8FB9\u904D\u5386\u5F02\u5E38\uFF0C\u53EF\u80FD\u5B58\u5728\u975E\u5E73\u9762\u56FE\u3001\u91CD\u590D\u7EBF\u3001\u60AC\u6302\u7EBF\u6216\u810F\u6570\u636E");break}}if(p.length<3)continue;let S=d.map(M=>l[M]),b=or(S),R=!1;if(r==="positive"?R=b>n:R=b<-n,!R)continue;let z=p.map(M=>m[M].uuid),V=p.map(M=>m[M].sourceIndex);T.push({uuids:z,area:Math.abs(b),lineIndexes:V})}return T};function er(e,t,n=1e-6){let s=[];for(let o=0;o<e.length;o++){let r=e[o],i=t(r.start),l=t(r.end),f=[{t:0,point:mn(r.start)},{t:1,point:mn(r.end)}];for(let E=0;E<e.length;E++){if(o===E)continue;let a=e[E],c=t(a.start),m=t(a.end),h=nr(i,l,c,m,n);h&&h.t>n&&h.t<1-n&&f.push({t:h.t,point:sr(r.start,r.end,h.t)})}f.sort((E,a)=>E.t-a.t);let u=[];for(let E of f)(u.length===0||Math.abs(E.t-u[u.length-1].t)>n)&&u.push(E);for(let E=0;E<u.length-1;E++){let a=u[E].point,c=u[E+1].point,m=t(a),h=t(c);Po(m,h)<n*n||s.push({start:a,end:c,uuid:r.uuid,sourceIndex:o,sourceSegment:r})}}return s}function nr(e,t,n,s,o=1e-6){let r={x:t.x-e.x,y:t.y-e.y},i={x:s.x-n.x,y:s.y-n.y},l={x:n.x-e.x,y:n.y-e.y},f=Nn(r,i);if(Math.abs(f)<o)return null;let u=Nn(l,i)/f,E=Nn(l,r)/f;return u>=-o&&u<=1+o&&E>=-o&&E<=1+o?{t:u,u:E,point:{x:e.x+u*r.x,y:e.y+u*r.y}}:null}function Nn(e,t){return e.x*t.y-e.y*t.x}function Po(e,t){let n=e.x-t.x,s=e.y-t.y;return n*n+s*s}function or(e){let t=0;for(let n=0;n<e.length;n++){let s=e[n],o=e[(n+1)%e.length];t+=s.x*o.y-o.x*s.y}return t/2}function sr(e,t,n){return e&&typeof e.clone=="function"&&typeof e.lerp=="function"?e.clone().lerp(t,n):{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n,z:e.z!==void 0&&t.z!==void 0?e.z+(t.z-e.z)*n:void 0}}function mn(e){return e&&typeof e.clone=="function"?e.clone():{x:e.x,y:e.y,z:e.z}}var rr=(e,t)=>{if(!e||e.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},s=new Set,o=.1,r=1.2,i=.15,l=2,f=80,u=95;if(!e[0].uuid){let c=1e4;for(let m=0;m<e.length;m++)e[m].uuid=c++}let E=[];for(let c=0;c<e.length;c++)E.push({start:e[c].start,end:e[c].end,uuid:e[c].uuid});let a=To(E,{eps:1e-5,returnDetail:!0,project:c=>({x:c.x,y:c.y})});for(let c=0;c<a.length;c++){if(a[c].uuids.length<4||a[c].area<i||a[c].area>l)continue;let m=!1;for(let h=0;h<a[c].lineIndexes.length;h++){let g=e[a[c].lineIndexes[h]].length;if(g<o||g>r)break;let T=new yt.Vector3(e[a[c].lineIndexes[h]].start.x,e[a[c].lineIndexes[h]].start.y,e[a[c].lineIndexes[h]].start.z),y=new yt.Vector3(e[a[c].lineIndexes[h]].end.x,e[a[c].lineIndexes[h]].end.y,e[a[c].lineIndexes[h]].end.z),p=!1,d=new yt.Vector3(0,0,0);for(let x=h+1;x<a[c].lineIndexes.length;x++){let w=e[a[c].lineIndexes[x]].length;if(w<o||w>r)break;let P=new yt.Vector3(e[a[c].lineIndexes[x]].start.x,e[a[c].lineIndexes[x]].start.y,e[a[c].lineIndexes[x]].start.z),S=new yt.Vector3(e[a[c].lineIndexes[x]].end.x,e[a[c].lineIndexes[x]].end.y,e[a[c].lineIndexes[x]].end.z),b=Yt(T,y,P,S);if(b&&b.isParallel){if(g+w>r){p=!0;break}g+=w;let z=st(T,P),V=st(T,S),M=st(y,P),v=st(y,S);z?(T=y.clone(),y=S.clone()):V?(T=y.clone(),y=P.clone()):M?y=S.clone():v&&(y=P.clone());continue}let R=se(T,y,P,S);if(!R||R.angle<f||R.angle>u){p=!0;break}for(let z=x+1;z<a[c].lineIndexes.length;z++){let V=e[a[c].lineIndexes[z]].length;if(V<o||V>r)break;let M=new yt.Vector3(e[a[c].lineIndexes[z]].start.x,e[a[c].lineIndexes[z]].start.y,e[a[c].lineIndexes[z]].start.z),v=new yt.Vector3(e[a[c].lineIndexes[z]].end.x,e[a[c].lineIndexes[z]].end.y,e[a[c].lineIndexes[z]].end.z),I=Yt(P,S,M,v);if(I&&I.isParallel){if(w+V>r){p=!0;break}w+=V;let B=st(P,M),_=st(P,v),k=st(S,M),H=st(S,v);B?(P=S.clone(),S=v.clone()):_?(P=S.clone(),S=M.clone()):k?S=v.clone():H&&(S=M.clone());continue}let D=se(P,S,M,v);if(!D||D.angle<f||D.angle>u){p=!0;break}for(let B=z+1;B<a[c].lineIndexes.length;B++){let _=e[a[c].lineIndexes[B]].length;if(_<o||_>r)break;let k=new yt.Vector3(e[a[c].lineIndexes[B]].start.x,e[a[c].lineIndexes[B]].start.y,e[a[c].lineIndexes[B]].start.z),H=new yt.Vector3(e[a[c].lineIndexes[B]].end.x,e[a[c].lineIndexes[B]].end.y,e[a[c].lineIndexes[B]].end.z),F=Yt(M,v,k,H);if(F&&F.isParallel){if(V+_>r){p=!0;break}V+=_;let it=st(M,k),ct=st(M,H),ut=st(v,k),q=st(v,H);it?(M=v.clone(),v=H.clone()):ct?(M=v.clone(),v=k.clone()):ut?v=H.clone():q&&(v=k.clone());continue}let j=se(M,v,k,H);if(!j||j.angle<f||j.angle>u){p=!0;break}let $=st(k,T),K=st(k,y),Y=st(H,T),tt=st(H,y);if($||K||Y||tt)m=!0;else for(let it=B+1;it<a[c].lineIndexes.length;it++){let ct=e[a[c].lineIndexes[it]].length;if(ct<o||ct>r)break;let ut=new yt.Vector3(e[a[c].lineIndexes[it]].start.x,e[a[c].lineIndexes[it]].start.y,e[a[c].lineIndexes[it]].start.z),q=new yt.Vector3(e[a[c].lineIndexes[it]].end.x,e[a[c].lineIndexes[it]].end.y,e[a[c].lineIndexes[it]].end.z),W=Yt(k,H,ut,q);if(W&&W.isParallel){if(_+ct>r){p=!0;break}_+=ct;let Z=st(k,ut),wt=st(k,q),Ft=st(H,ut),Nt=st(H,q);if(Z)k=H.clone(),H=q.clone();else if(wt)k=H.clone(),H=ut.clone();else if(Ft)H=q.clone();else if(Nt)H=ut.clone();else continue;if($=st(k,T),K=st(k,y),Y=st(H,T),tt=st(H,y),$||K||Y||tt){m=!0;break}}}break}if(p)break}if(p)break}if(p)break}m&&n.rectangles.push(a[c].uuids)}for(let c=0;c<e.length;c++){let m=e[c].length;if(s.has(e[c].uuid)||m<o||m>r)continue;let h={uuids:[],missingEdge:{start:new yt.Vector3,end:new yt.Vector3}},g=new yt.Vector3(e[c].start.x,e[c].start.y,e[c].start.z),T=new yt.Vector3(e[c].end.x,e[c].end.y,e[c].end.z),y=!0,p=!0;for(let w=0;w<e.length;w++){if(w==c)continue;let P=new yt.Vector3(e[w].start.x,e[w].start.y,e[w].start.z),S=new yt.Vector3(e[w].end.x,e[w].end.y,e[w].end.z),b=st(P,g),R=st(S,g),z=st(P,T),V=st(S,T);if(b||R?y=!1:(z||V)&&(p=!1),!y&&!p)break}if(!y&&!p)continue;let d=new yt.Vector3;y||([g,T]=[T,g]),d=new yt.Vector3().subVectors(T,g).normalize();let x=d.clone().negate();for(let w=0;w<e.length;w++){let P=e[w].length;if(w==c||s.has(w)||P<o||P>r)continue;let S=new yt.Vector3(e[w].start.x,e[w].start.y,e[w].start.z),b=new yt.Vector3(e[w].end.x,e[w].end.y,e[w].end.z),R=se(g,T,S,b);if(!R||R.angle<85)continue;let z=st(S,T),V=st(b,T);if(!z&&!V)continue;let M=new yt.Vector3,v=new yt.Vector3;z?(M=S.clone(),v=b.clone()):(M=b.clone(),v=S.clone());for(let I=0;I<e.length;I++){let D=e[I].length;if(I==c||I==w||s.has(I)||D<o||D>r)continue;let B=new yt.Vector3(e[I].start.x,e[I].start.y,e[I].start.z),_=new yt.Vector3(e[I].end.x,e[I].end.y,e[I].end.z),k=se(S,b,B,_);if(!k||k.angle<85)continue;let H=st(B,v),F=st(_,v);if(!H&&!F)continue;let j=new yt.Vector3,$=new yt.Vector3;H?(j=B.clone(),$=_.clone()):(j=_.clone(),$=B.clone());let K=new yt.Vector3().subVectors($,j).normalize(),Y=Kt(x,K,.1);if(!Y||!Y.parallel||!Y.sameDirection)continue;let tt=!0,it=!0;for(let ut=0;ut<e.length;ut++){if(ut==I)continue;let q=new yt.Vector3(e[ut].start.x,e[ut].start.y,e[ut].start.z),W=new yt.Vector3(e[ut].end.x,e[ut].end.y,e[ut].end.z),Z=st(q,B),wt=st(W,B),Ft=st(q,_),Nt=st(W,_);if(Z||wt?tt=!1:(Ft||Nt)&&(it=!1),!tt&&!it)break}if(!tt&&!it)continue;let ct=m*P;if(!(ct<i||ct>l)){h.uuids=[e[c].uuid,e[w].uuid,e[I].uuid],h.missingEdge.start=$,h.missingEdge.end=g;break}}if(h.uuids.length==3)break}h.uuids.length==3&&(h.uuids.forEach(w=>s.add(w)),n.threeEdgeRect.push(h))}return n};import*as A from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zt=11102230246251565e-32,Gt=134217729,en=(3+8*zt)*zt;function Ie(e,t,n,s,o){let r,i,l,f,u=t[0],E=s[0],a=0,c=0;E>u==E>-u?(r=u,u=t[++a]):(r=E,E=s[++c]);let m=0;if(a<e&&c<n)for(E>u==E>-u?(i=u+r,l=r-(i-u),u=t[++a]):(i=E+r,l=r-(i-E),E=s[++c]),r=i,l!==0&&(o[m++]=l);a<e&&c<n;)E>u==E>-u?(i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a]):(i=r+E,f=i-r,l=r-(i-f)+(E-f),E=s[++c]),r=i,l!==0&&(o[m++]=l);for(;a<e;)i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a],r=i,l!==0&&(o[m++]=l);for(;c<n;)i=r+E,f=i-r,l=r-(i-f)+(E-f),E=s[++c],r=i,l!==0&&(o[m++]=l);return(r!==0||m===0)&&(o[m++]=r),m}function nn(e,t){let n=t[0];for(let s=1;s<e;s++)n+=t[s];return n}function N(e){return new Float64Array(e)}var ir=(3+16*zt)*zt,lr=(2+12*zt)*zt,ar=(9+64*zt)*zt*zt,je=N(4),So=N(8),Ro=N(12),zo=N(16),ee=N(4);function fr(e,t,n,s,o,r,i){let l,f,u,E,a,c,m,h,g,T,y,p,d,x,w,P,S,b,R=e-o,z=n-o,V=t-r,M=s-r;x=R*M,c=Gt*R,m=c-(c-R),h=R-m,c=Gt*M,g=c-(c-M),T=M-g,w=h*T-(x-m*g-h*g-m*T),P=V*z,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*z,g=c-(c-z),T=z-g,S=h*T-(P-m*g-h*g-m*T),y=w-S,a=w-y,je[0]=w-(y+a)+(a-S),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,je[1]=d-(y+a)+(a-P),b=p+y,a=b-p,je[2]=p-(b-a)+(y-a),je[3]=b;let v=nn(4,je),I=lr*i;if(v>=I||-v>=I||(a=e-R,l=e-(R+a)+(a-o),a=n-z,u=n-(z+a)+(a-o),a=t-V,f=t-(V+a)+(a-r),a=s-M,E=s-(M+a)+(a-r),l===0&&f===0&&u===0&&E===0)||(I=ar*i+en*Math.abs(v),v+=R*E+M*l-(V*u+z*f),v>=I||-v>=I))return v;x=l*M,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*M,g=c-(c-M),T=M-g,w=h*T-(x-m*g-h*g-m*T),P=f*z,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*z,g=c-(c-z),T=z-g,S=h*T-(P-m*g-h*g-m*T),y=w-S,a=w-y,ee[0]=w-(y+a)+(a-S),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let D=Ie(4,je,4,ee,So);x=R*E,c=Gt*R,m=c-(c-R),h=R-m,c=Gt*E,g=c-(c-E),T=E-g,w=h*T-(x-m*g-h*g-m*T),P=V*u,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*u,g=c-(c-u),T=u-g,S=h*T-(P-m*g-h*g-m*T),y=w-S,a=w-y,ee[0]=w-(y+a)+(a-S),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let B=Ie(D,So,4,ee,Ro);x=l*E,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*E,g=c-(c-E),T=E-g,w=h*T-(x-m*g-h*g-m*T),P=f*u,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*u,g=c-(c-u),T=u-g,S=h*T-(P-m*g-h*g-m*T),y=w-S,a=w-y,ee[0]=w-(y+a)+(a-S),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let _=Ie(B,Ro,4,ee,zo);return zo[_-1]}function qe(e,t,n,s,o,r){let i=(t-r)*(n-o),l=(e-o)*(s-r),f=i-l,u=Math.abs(i+l);return Math.abs(f)>=ir*u?f:-fr(e,t,n,s,o,r,u)}var $l=(7+56*zt)*zt,Xl=(3+28*zt)*zt,Yl=(26+288*zt)*zt*zt,Gl=N(4),Zl=N(4),Ul=N(4),Kl=N(4),Jl=N(4),Ql=N(4),tc=N(4),ec=N(4),nc=N(4),oc=N(8),sc=N(8),rc=N(8),ic=N(4),lc=N(8),cc=N(8),ac=N(16),fc=N(12),uc=N(192),hc=N(192);var pc=(10+96*zt)*zt,gc=(4+48*zt)*zt,yc=(44+576*zt)*zt*zt,Ec=N(4),xc=N(4),wc=N(4),bc=N(4),Tc=N(4),Pc=N(4),Sc=N(4),Rc=N(4),zc=N(8),Vc=N(8),Mc=N(8),vc=N(8),Hc=N(8),Bc=N(8),_c=N(8),kc=N(8),Cc=N(8),Dc=N(4),Ic=N(4),Lc=N(4),Ac=N(8),Fc=N(16),Oc=N(16),Nc=N(16),Wc=N(32),jc=N(32),qc=N(48),$c=N(64),Xc=N(1152),Yc=N(1152);var Kc=(16+224*zt)*zt,Jc=(5+72*zt)*zt,Qc=(71+1408*zt)*zt*zt,ta=N(4),ea=N(4),na=N(4),oa=N(4),sa=N(4),ra=N(4),ia=N(4),la=N(4),ca=N(4),aa=N(4),fa=N(24),ua=N(24),ha=N(24),da=N(24),ma=N(24),pa=N(24),ga=N(24),ya=N(24),Ea=N(24),xa=N(24),wa=N(1152),ba=N(1152),Ta=N(1152),Pa=N(1152),Sa=N(1152),Ra=N(2304),za=N(2304),Va=N(3456),Ma=N(5760),va=N(8),Ha=N(8),Ba=N(8),_a=N(16),ka=N(24),Ca=N(48),Da=N(48),Ia=N(96),La=N(192),Aa=N(384),Fa=N(384),Oa=N(384),Na=N(768);var Wa=N(96),ja=N(96),qa=N(96),$a=N(1152);var Mo=Math.pow(2,-52),pn=new Uint32Array(512),Xe=class e{static from(t,n=gr,s=yr){let o=t.length,r=new Float64Array(o*2);for(let i=0;i<o;i++){let l=t[i];r[2*i]=n(l),r[2*i+1]=s(l)}return new e(r)}constructor(t){let n=t.length>>1;if(n>0&&typeof t[0]!="number")throw new Error("Expected coords to contain numbers.");this.coords=t;let s=Math.max(2*n-5,0);this._triangles=new Uint32Array(s*3),this._halfedges=new Int32Array(s*3),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.trianglesLen=0,this._cx=0,this._cy=0,this._hullStart=0,this.hull=this._triangles,this.triangles=this._triangles,this.halfedges=this._halfedges,this.update()}update(){let{coords:t,_hullPrev:n,_hullNext:s,_hullTri:o,_hullHash:r}=this,i=t.length>>1,l=1/0,f=1/0,u=-1/0,E=-1/0;for(let R=0;R<i;R++){let z=t[2*R],V=t[2*R+1];z<l&&(l=z),V<f&&(f=V),z>u&&(u=z),V>E&&(E=V),this._ids[R]=R}let a=(l+u)/2,c=(f+E)/2,m=0,h=0,g=0;for(let R=0,z=1/0;R<i;R++){let V=Wn(a,c,t[2*R],t[2*R+1]);V<z&&(m=R,z=V)}let T=t[2*m],y=t[2*m+1];for(let R=0,z=1/0;R<i;R++){if(R===m)continue;let V=Wn(T,y,t[2*R],t[2*R+1]);V<z&&V>0&&(h=R,z=V)}let p=t[2*h],d=t[2*h+1],x=1/0;for(let R=0;R<i;R++){if(R===m||R===h)continue;let z=mr(T,y,p,d,t[2*R],t[2*R+1]);z<x&&(g=R,x=z)}let w=t[2*g],P=t[2*g+1];if(x===1/0){for(let V=0;V<i;V++)this._dists[V]=t[2*V]-t[0]||t[2*V+1]-t[1];$e(this._ids,this._dists,0,i-1);let R=new Uint32Array(i),z=0;for(let V=0,M=-1/0;V<i;V++){let v=this._ids[V],I=this._dists[v];I>M&&(R[z++]=v,M=I)}this.hull=R.subarray(0,z),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if(qe(T,y,p,d,w,P)<0){let R=h,z=p,V=d;h=g,p=w,d=P,g=R,w=z,P=V}let S=pr(T,y,p,d,w,P);this._cx=S.x,this._cy=S.y;for(let R=0;R<i;R++)this._dists[R]=Wn(t[2*R],t[2*R+1],S.x,S.y);$e(this._ids,this._dists,0,i-1),this._hullStart=m;let b=3;s[m]=n[g]=h,s[h]=n[m]=g,s[g]=n[h]=m,o[m]=0,o[h]=1,o[g]=2,r.fill(-1),r[this._hashKey(T,y)]=m,r[this._hashKey(p,d)]=h,r[this._hashKey(w,P)]=g,this.trianglesLen=0,this._addTriangle(m,h,g,-1,-1,-1);for(let R=0,z=0,V=0;R<this._ids.length;R++){let M=this._ids[R],v=t[2*M],I=t[2*M+1];if(R>0&&Math.abs(v-z)<=Mo&&Math.abs(I-V)<=Mo||(z=v,V=I,M===m||M===h||M===g))continue;let D=0;for(let F=0,j=this._hashKey(v,I);F<this._hashSize&&(D=r[(j+F)%this._hashSize],!(D!==-1&&D!==s[D]));F++);D=n[D];let B=D,_;for(;_=s[B],qe(v,I,t[2*B],t[2*B+1],t[2*_],t[2*_+1])>=0;)if(B=_,B===D){B=-1;break}if(B===-1)continue;let k=this._addTriangle(B,M,s[B],-1,-1,o[B]);o[M]=this._legalize(k+2),o[B]=k,b++;let H=s[B];for(;_=s[H],qe(v,I,t[2*H],t[2*H+1],t[2*_],t[2*_+1])<0;)k=this._addTriangle(H,M,_,o[M],-1,o[H]),o[M]=this._legalize(k+2),s[H]=H,b--,H=_;if(B===D)for(;_=n[B],qe(v,I,t[2*_],t[2*_+1],t[2*B],t[2*B+1])<0;)k=this._addTriangle(_,M,B,-1,o[B],o[_]),this._legalize(k+2),o[_]=k,s[B]=B,b--,B=_;this._hullStart=n[M]=B,s[B]=n[H]=M,s[M]=H,r[this._hashKey(v,I)]=M,r[this._hashKey(t[2*B],t[2*B+1])]=B}this.hull=new Uint32Array(b);for(let R=0,z=this._hullStart;R<b;R++)this.hull[R]=z,z=s[z];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(t,n){return Math.floor(hr(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){let{_triangles:n,_halfedges:s,coords:o}=this,r=0,i=0;for(;;){let l=s[t],f=t-t%3;if(i=f+(t+2)%3,l===-1){if(r===0)break;t=pn[--r];continue}let u=l-l%3,E=f+(t+1)%3,a=u+(l+2)%3,c=n[i],m=n[t],h=n[E],g=n[a];if(dr(o[2*c],o[2*c+1],o[2*m],o[2*m+1],o[2*h],o[2*h+1],o[2*g],o[2*g+1])){n[t]=g,n[l]=c;let y=s[a];if(y===-1){let d=this._hullStart;do{if(this._hullTri[d]===a){this._hullTri[d]=t;break}d=this._hullPrev[d]}while(d!==this._hullStart)}this._link(t,y),this._link(l,s[i]),this._link(i,a);let p=u+(l+1)%3;r<pn.length&&(pn[r++]=p)}else{if(r===0)break;t=pn[--r]}}return i}_link(t,n){this._halfedges[t]=n,n!==-1&&(this._halfedges[n]=t)}_addTriangle(t,n,s,o,r,i){let l=this.trianglesLen;return this._triangles[l]=t,this._triangles[l+1]=n,this._triangles[l+2]=s,this._link(l,o),this._link(l+1,r),this._link(l+2,i),this.trianglesLen+=3,l}};function hr(e,t){let n=e/(Math.abs(e)+Math.abs(t));return(t>0?3-n:1+n)/4}function Wn(e,t,n,s){let o=e-n,r=t-s;return o*o+r*r}function dr(e,t,n,s,o,r,i,l){let f=e-i,u=t-l,E=n-i,a=s-l,c=o-i,m=r-l,h=f*f+u*u,g=E*E+a*a,T=c*c+m*m;return f*(a*T-g*m)-u*(E*T-g*c)+h*(E*m-a*c)<0}function mr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,E=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=(u*E-l*a)*c,h=(i*a-f*E)*c;return m*m+h*h}function pr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,E=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=e+(u*E-l*a)*c,h=t+(i*a-f*E)*c;return{x:m,y:h}}function $e(e,t,n,s){if(s-n<=20)for(let o=n+1;o<=s;o++){let r=e[o],i=t[r],l=o-1;for(;l>=n&&t[e[l]]>i;)e[l+1]=e[l--];e[l+1]=r}else{let o=n+s>>1,r=n+1,i=s;on(e,o,r),t[e[n]]>t[e[s]]&&on(e,n,s),t[e[r]]>t[e[s]]&&on(e,r,s),t[e[n]]>t[e[r]]&&on(e,n,r);let l=e[r],f=t[l];for(;;){do r++;while(t[e[r]]<f);do i--;while(t[e[i]]>f);if(i<r)break;on(e,r,i)}e[n+1]=e[i],e[i]=l,s-r+1>=i-n?($e(e,t,r,s),$e(e,t,n,i-1)):($e(e,t,n,i-1),$e(e,t,r,s))}}function on(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function gr(e){return e[0]}function yr(e){return e[1]}var fe=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,s){t=+t,n=+n,s=+s;let o=t+s,r=n;if(s<0)throw new Error("negative radius");this._x1===null?this._+=`M${o},${r}`:(Math.abs(this._x1-o)>1e-6||Math.abs(this._y1-r)>1e-6)&&(this._+="L"+o+","+r),s&&(this._+=`A${s},${s},0,1,1,${t-s},${n}A${s},${s},0,1,1,${this._x1=o},${this._y1=r}`)}rect(t,n,s,o){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+s}v${+o}h${-s}Z`}value(){return this._||null}};var ze=class{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}};var sn=class{constructor(t,[n,s,o,r]=[0,0,960,500]){if(!((o=+o)>=(n=+n))||!((r=+r)>=(s=+s)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(t.points.length*2),this.vectors=new Float64Array(t.points.length*2),this.xmax=o,this.xmin=n,this.ymax=r,this.ymin=s,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:t,hull:n,triangles:s},vectors:o}=this,r,i,l=this.circumcenters=this._circumcenters.subarray(0,s.length/3*2);for(let g=0,T=0,y=s.length,p,d;g<y;g+=3,T+=2){let x=s[g]*2,w=s[g+1]*2,P=s[g+2]*2,S=t[x],b=t[x+1],R=t[w],z=t[w+1],V=t[P],M=t[P+1],v=R-S,I=z-b,D=V-S,B=M-b,_=(v*B-I*D)*2;if(Math.abs(_)<1e-9){if(r===void 0){r=i=0;for(let H of n)r+=t[H*2],i+=t[H*2+1];r/=n.length,i/=n.length}let k=1e9*Math.sign((r-S)*B-(i-b)*D);p=(S+V)/2-k*B,d=(b+M)/2+k*D}else{let k=1/_,H=v*v+I*I,F=D*D+B*B;p=S+(B*H-I*F)*k,d=b+(v*F-D*H)*k}l[T]=p,l[T+1]=d}let f=n[n.length-1],u,E=f*4,a,c=t[2*f],m,h=t[2*f+1];o.fill(0);for(let g=0;g<n.length;++g)f=n[g],u=E,a=c,m=h,E=f*4,c=t[2*f],h=t[2*f+1],o[u+2]=o[E]=m-h,o[u+3]=o[E+1]=c-a}render(t){let n=t==null?t=new fe:void 0,{delaunay:{halfedges:s,inedges:o,hull:r},circumcenters:i,vectors:l}=this;if(r.length<=1)return null;for(let E=0,a=s.length;E<a;++E){let c=s[E];if(c<E)continue;let m=Math.floor(E/3)*2,h=Math.floor(c/3)*2,g=i[m],T=i[m+1],y=i[h],p=i[h+1];this._renderSegment(g,T,y,p,t)}let f,u=r[r.length-1];for(let E=0;E<r.length;++E){f=u,u=r[E];let a=Math.floor(o[u]/3)*2,c=i[a],m=i[a+1],h=f*4,g=this._project(c,m,l[h+2],l[h+3]);g&&this._renderSegment(c,m,g[0],g[1],t)}return n&&n.value()}renderBounds(t){let n=t==null?t=new fe:void 0;return t.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(t,n){let s=n==null?n=new fe:void 0,o=this._clip(t);if(o===null||!o.length)return;n.moveTo(o[0],o[1]);let r=o.length;for(;o[0]===o[r-2]&&o[1]===o[r-1]&&r>1;)r-=2;for(let i=2;i<r;i+=2)(o[i]!==o[i-2]||o[i+1]!==o[i-1])&&n.lineTo(o[i],o[i+1]);return n.closePath(),s&&s.value()}*cellPolygons(){let{delaunay:{points:t}}=this;for(let n=0,s=t.length/2;n<s;++n){let o=this.cellPolygon(n);o&&(o.index=n,yield o)}}cellPolygon(t){let n=new ze;return this.renderCell(t,n),n.value()}_renderSegment(t,n,s,o,r){let i,l=this._regioncode(t,n),f=this._regioncode(s,o);l===0&&f===0?(r.moveTo(t,n),r.lineTo(s,o)):(i=this._clipSegment(t,n,s,o,l,f))&&(r.moveTo(i[0],i[1]),r.lineTo(i[2],i[3]))}contains(t,n,s){return n=+n,n!==n||(s=+s,s!==s)?!1:this.delaunay._step(t,n,s)===t}*neighbors(t){let n=this._clip(t);if(n)for(let s of this.delaunay.neighbors(t)){let o=this._clip(s);if(o){t:for(let r=0,i=n.length;r<i;r+=2)for(let l=0,f=o.length;l<f;l+=2)if(n[r]===o[l]&&n[r+1]===o[l+1]&&n[(r+2)%i]===o[(l+f-2)%f]&&n[(r+3)%i]===o[(l+f-1)%f]){yield s;break t}}}}_cell(t){let{circumcenters:n,delaunay:{inedges:s,halfedges:o,triangles:r}}=this,i=s[t];if(i===-1)return null;let l=[],f=i;do{let u=Math.floor(f/3);if(l.push(n[u*2],n[u*2+1]),f=f%3===2?f-2:f+1,r[f]!==t)break;f=o[f]}while(f!==i&&f!==-1);return l}_clip(t){if(t===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let n=this._cell(t);if(n===null)return null;let{vectors:s}=this,o=t*4;return this._simplify(s[o]||s[o+1]?this._clipInfinite(t,n,s[o],s[o+1],s[o+2],s[o+3]):this._clipFinite(t,n))}_clipFinite(t,n){let s=n.length,o=null,r,i,l=n[s-2],f=n[s-1],u,E=this._regioncode(l,f),a,c=0;for(let m=0;m<s;m+=2)if(r=l,i=f,l=n[m],f=n[m+1],u=E,E=this._regioncode(l,f),u===0&&E===0)a=c,c=0,o?o.push(l,f):o=[l,f];else{let h,g,T,y,p;if(u===0){if((h=this._clipSegment(r,i,l,f,u,E))===null)continue;[g,T,y,p]=h}else{if((h=this._clipSegment(l,f,r,i,E,u))===null)continue;[y,p,g,T]=h,a=c,c=this._edgecode(g,T),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(g,T):o=[g,T]}a=c,c=this._edgecode(y,p),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(y,p):o=[y,p]}if(o)a=c,c=this._edgecode(o[0],o[1]),a&&c&&this._edge(t,a,c,o,o.length);else if(this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return o}_clipSegment(t,n,s,o,r,i){let l=r<i;for(l&&([t,n,s,o,r,i]=[s,o,t,n,i,r]);;){if(r===0&&i===0)return l?[s,o,t,n]:[t,n,s,o];if(r&i)return null;let f,u,E=r||i;E&8?(f=t+(s-t)*(this.ymax-n)/(o-n),u=this.ymax):E&4?(f=t+(s-t)*(this.ymin-n)/(o-n),u=this.ymin):E&2?(u=n+(o-n)*(this.xmax-t)/(s-t),f=this.xmax):(u=n+(o-n)*(this.xmin-t)/(s-t),f=this.xmin),r?(t=f,n=u,r=this._regioncode(t,n)):(s=f,o=u,i=this._regioncode(s,o))}}_clipInfinite(t,n,s,o,r,i){let l=Array.from(n),f;if((f=this._project(l[0],l[1],s,o))&&l.unshift(f[0],f[1]),(f=this._project(l[l.length-2],l[l.length-1],r,i))&&l.push(f[0],f[1]),l=this._clipFinite(t,l))for(let u=0,E=l.length,a,c=this._edgecode(l[E-2],l[E-1]);u<E;u+=2)a=c,c=this._edgecode(l[u],l[u+1]),a&&c&&(u=this._edge(t,a,c,l,u),E=l.length);else this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(l=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return l}_edge(t,n,s,o,r){for(;n!==s;){let i,l;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,l=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,l=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,l=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,l=this.ymin;break}(o[r]!==i||o[r+1]!==l)&&this.contains(t,i,l)&&(o.splice(r,0,i,l),r+=2)}return r}_project(t,n,s,o){let r=1/0,i,l,f;if(o<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/o)<r&&(f=this.ymin,l=t+(r=i)*s)}else if(o>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/o)<r&&(f=this.ymax,l=t+(r=i)*s)}if(s>0){if(t>=this.xmax)return null;(i=(this.xmax-t)/s)<r&&(l=this.xmax,f=n+(r=i)*o)}else if(s<0){if(t<=this.xmin)return null;(i=(this.xmin-t)/s)<r&&(l=this.xmin,f=n+(r=i)*o)}return[l,f]}_edgecode(t,n){return(t===this.xmin?1:t===this.xmax?2:0)|(n===this.ymin?4:n===this.ymax?8:0)}_regioncode(t,n){return(t<this.xmin?1:t>this.xmax?2:0)|(n<this.ymin?4:n>this.ymax?8:0)}_simplify(t){if(t&&t.length>4){for(let n=0;n<t.length;n+=2){let s=(n+2)%t.length,o=(n+4)%t.length;(t[n]===t[s]&&t[s]===t[o]||t[n+1]===t[s+1]&&t[s+1]===t[o+1])&&(t.splice(s,2),n-=2)}t.length||(t=null)}return t}};var Er=2*Math.PI,Ye=Math.pow;function xr(e){return e[0]}function wr(e){return e[1]}function br(e){let{triangles:t,coords:n}=e;for(let s=0;s<t.length;s+=3){let o=2*t[s],r=2*t[s+1],i=2*t[s+2];if((n[i]-n[o])*(n[r+1]-n[o+1])-(n[r]-n[o])*(n[i+1]-n[o+1])>1e-10)return!1}return!0}function Tr(e,t,n){return[e+Math.sin(e+t)*n,t+Math.cos(e-t)*n]}var Ve=class e{static from(t,n=xr,s=wr,o){return new e("length"in t?Pr(t,n,s,o):Float64Array.from(Sr(t,n,s,o)))}constructor(t){this._delaunator=new Xe(t),this.inedges=new Int32Array(t.length/2),this._hullIndex=new Int32Array(t.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let t=this._delaunator,n=this.points;if(t.hull&&t.hull.length>2&&br(t)){this.collinear=Int32Array.from({length:n.length/2},(c,m)=>m).sort((c,m)=>n[2*c]-n[2*m]||n[2*c+1]-n[2*m+1]);let f=this.collinear[0],u=this.collinear[this.collinear.length-1],E=[n[2*f],n[2*f+1],n[2*u],n[2*u+1]],a=1e-8*Math.hypot(E[3]-E[1],E[2]-E[0]);for(let c=0,m=n.length/2;c<m;++c){let h=Tr(n[2*c],n[2*c+1],a);n[2*c]=h[0],n[2*c+1]=h[1]}this._delaunator=new Xe(n)}else delete this.collinear;let s=this.halfedges=this._delaunator.halfedges,o=this.hull=this._delaunator.hull,r=this.triangles=this._delaunator.triangles,i=this.inedges.fill(-1),l=this._hullIndex.fill(-1);for(let f=0,u=s.length;f<u;++f){let E=r[f%3===2?f-2:f+1];(s[f]===-1||i[E]===-1)&&(i[E]=f)}for(let f=0,u=o.length;f<u;++f)l[o[f]]=f;o.length<=2&&o.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=o[0],i[o[0]]=1,o.length===2&&(i[o[1]]=0,this.triangles[1]=o[1],this.triangles[2]=o[1]))}voronoi(t){return new sn(this,t)}*neighbors(t){let{inedges:n,hull:s,_hullIndex:o,halfedges:r,triangles:i,collinear:l}=this;if(l){let a=l.indexOf(t);a>0&&(yield l[a-1]),a<l.length-1&&(yield l[a+1]);return}let f=n[t];if(f===-1)return;let u=f,E=-1;do{if(yield E=i[u],u=u%3===2?u-2:u+1,i[u]!==t)return;if(u=r[u],u===-1){let a=s[(o[t]+1)%s.length];a!==E&&(yield a);return}}while(u!==f)}find(t,n,s=0){if(t=+t,t!==t||(n=+n,n!==n))return-1;let o=s,r;for(;(r=this._step(s,t,n))>=0&&r!==s&&r!==o;)s=r;return r}_step(t,n,s){let{inedges:o,hull:r,_hullIndex:i,halfedges:l,triangles:f,points:u}=this;if(o[t]===-1||!u.length)return(t+1)%(u.length>>1);let E=t,a=Ye(n-u[t*2],2)+Ye(s-u[t*2+1],2),c=o[t],m=c;do{let h=f[m],g=Ye(n-u[h*2],2)+Ye(s-u[h*2+1],2);if(g<a&&(a=g,E=h),m=m%3===2?m-2:m+1,f[m]!==t)break;if(m=l[m],m===-1){if(m=r[(i[t]+1)%r.length],m!==h&&Ye(n-u[m*2],2)+Ye(s-u[m*2+1],2)<a)return m;break}}while(m!==c);return E}render(t){let n=t==null?t=new fe:void 0,{points:s,halfedges:o,triangles:r}=this;for(let i=0,l=o.length;i<l;++i){let f=o[i];if(f<i)continue;let u=r[i]*2,E=r[f]*2;t.moveTo(s[u],s[u+1]),t.lineTo(s[E],s[E+1])}return this.renderHull(t),n&&n.value()}renderPoints(t,n){n===void 0&&(!t||typeof t.moveTo!="function")&&(n=t,t=null),n=n==null?2:+n;let s=t==null?t=new fe:void 0,{points:o}=this;for(let r=0,i=o.length;r<i;r+=2){let l=o[r],f=o[r+1];t.moveTo(l+n,f),t.arc(l,f,n,0,Er)}return s&&s.value()}renderHull(t){let n=t==null?t=new fe:void 0,{hull:s,points:o}=this,r=s[0]*2,i=s.length;t.moveTo(o[r],o[r+1]);for(let l=1;l<i;++l){let f=2*s[l];t.lineTo(o[f],o[f+1])}return t.closePath(),n&&n.value()}hullPolygon(){let t=new ze;return this.renderHull(t),t.value()}renderTriangle(t,n){let s=n==null?n=new fe:void 0,{points:o,triangles:r}=this,i=r[t*=3]*2,l=r[t+1]*2,f=r[t+2]*2;return n.moveTo(o[i],o[i+1]),n.lineTo(o[l],o[l+1]),n.lineTo(o[f],o[f+1]),n.closePath(),s&&s.value()}*trianglePolygons(){let{triangles:t}=this;for(let n=0,s=t.length/3;n<s;++n)yield this.trianglePolygon(n)}trianglePolygon(t){let n=new ze;return this.renderTriangle(t,n),n.value()}};function Pr(e,t,n,s){let o=e.length,r=new Float64Array(o*2);for(let i=0;i<o;++i){let l=e[i];r[i*2]=t.call(s,l,i,e),r[i*2+1]=n.call(s,l,i,e)}return r}function*Sr(e,t,n,s){let o=0;for(let r of e)yield t.call(s,r,o,e),yield n.call(s,r,o,e),++o}function jn(e,t,n,s){let o,r;n<s?(o=n,r=s):(o=s,r=n);let i=o*t+r;e.set(i,(e.get(i)||0)+1)}function vo(e,t,n){let s=e.get(t);s===void 0&&(s=[],e.set(t,s)),s.push(n)}function Re(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let g=0;g<e.length;g++){let T=e[g],y=`${T[0]}_${T[1]}`;t.has(y)||(t.add(y),n.push(T))}let s=n.length;if(s<3)return[];let o=new Float64Array(s*2);for(let g=0,T=0;g<s;g++){let y=n[g];o[T++]=y[0],o[T++]=y[1]}let r=new Ve(o),{triangles:i}=r;if(!i.length)return[];let l=new Map;for(let g=0;g<i.length;g+=3){let T=i[g],y=i[g+1],p=i[g+2],d=T*2,x=y*2,w=p*2,P=o[d],S=o[d+1],b=o[x],R=o[x+1],z=o[w],V=o[w+1],M=P-b,v=S-R,I=P-z,D=S-V,B=b-z,_=R-V,k=B*B+_*_,H=I*I+D*D,F=M*M+v*v,j=(b-P)*(V-S)-(z-P)*(R-S);if(j===0)continue;let $=j*j,Y=P===0||b===0||z===0?$:4*$;k*H*F<=Y&&(jn(l,s,T,y),jn(l,s,y,p),jn(l,s,p,T))}if(!l.size)return[];let f=new Map,u=0,E=-1;for(let[g,T]of l){if(T!==1)continue;let y=Math.floor(g/s),p=g-y*s;E===-1&&(E=y),vo(f,y,p),vo(f,p,y),u++}if(u===0)return[];let a=[],c=new Uint8Array(s),m=E,h=-1;do{a.push(n[m]),c[m]=1;let g=f.get(m)||[],T=-1;for(let y=0;y<g.length;y++){let p=g[y];if(p!==h&&!c[p]){T=p;break}}if(T===-1)for(let y=0;y<g.length;y++){let p=g[y];if(p!==h){T=p;break}}if(T===-1)break;h=m,m=T}while(m!==E&&a.length<=u+1);return a.length>0&&a.push(a[0]),a}import*as Wt from"three";import{OBB as jr}from"three/examples/jsm/math/OBB.js";var Zt=63710088e-1,Bo={centimeters:Zt*100,centimetres:Zt*100,degrees:360/(2*Math.PI),feet:Zt*3.28084,inches:Zt*39.37,kilometers:Zt/1e3,kilometres:Zt/1e3,meters:Zt,metres:Zt,miles:Zt/1609.344,millimeters:Zt*1e3,millimetres:Zt*1e3,nauticalmiles:Zt/1852,radians:1,yards:Zt*1.0936};function _o(e,t,n={}){let s={type:"Feature"};return(n.id===0||n.id)&&(s.id=n.id),n.bbox&&(s.bbox=n.bbox),s.properties=t||{},s.geometry=e,s}function gn(e,t,n={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!Ho(e[0])||!Ho(e[1]))throw new Error("coordinates must contain numbers");return _o({type:"Point",coordinates:e},t,n)}function yn(e,t,n={}){for(let o of e){if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(o[o.length-1].length!==o[0].length)throw new Error("First and last Position are not equivalent.");for(let r=0;r<o[o.length-1].length;r++)if(o[o.length-1][r]!==o[0][r])throw new Error("First and last Position are not equivalent.")}return _o({type:"Polygon",coordinates:e},t,n)}function Rr(e,t="kilometers"){let n=Bo[t];if(!n)throw new Error(t+" units is invalid");return e*n}function zr(e,t="kilometers"){let n=Bo[t];if(!n)throw new Error(t+" units is invalid");return e/n}function En(e){return e%(2*Math.PI)*180/Math.PI}function ue(e){return e%360*Math.PI/180}function xn(e,t="kilometers",n="kilometers"){if(!(e>=0))throw new Error("length must be a positive number");return Rr(zr(e,t),n)}function Ho(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function ko(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function we(e,t,n){if(e!==null)for(var s,o,r,i,l,f,u,E=0,a=0,c,m=e.type,h=m==="FeatureCollection",g=m==="Feature",T=h?e.features.length:1,y=0;y<T;y++){u=h?e.features[y].geometry:g?e.geometry:e,c=u?u.type==="GeometryCollection":!1,l=c?u.geometries.length:1;for(var p=0;p<l;p++){var d=0,x=0;if(i=c?u.geometries[p]:u,i!==null){f=i.coordinates;var w=i.type;switch(E=n&&(w==="Polygon"||w==="MultiPolygon")?1:0,w){case null:break;case"Point":if(t(f,a,y,d,x)===!1)return!1;a++,d++;break;case"LineString":case"MultiPoint":for(s=0;s<f.length;s++){if(t(f[s],a,y,d,x)===!1)return!1;a++,w==="MultiPoint"&&d++}w==="LineString"&&d++;break;case"Polygon":case"MultiLineString":for(s=0;s<f.length;s++){for(o=0;o<f[s].length-E;o++){if(t(f[s][o],a,y,d,x)===!1)return!1;a++}w==="MultiLineString"&&d++,w==="Polygon"&&x++}w==="Polygon"&&d++;break;case"MultiPolygon":for(s=0;s<f.length;s++){for(x=0,o=0;o<f[s].length;o++){for(r=0;r<f[s][o].length-E;r++){if(t(f[s][o][r],a,y,d,x)===!1)return!1;a++}x++}d++}break;case"GeometryCollection":for(s=0;s<i.geometries.length;s++)if(we(i.geometries[s],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Co(e){var t=[];return we(e,function(n){t.push(n)}),t}function Vr(e,t){var n,s,o,r,i,l,f,u,E,a,c=0,m=e.type==="FeatureCollection",h=e.type==="Feature",g=m?e.features.length:1;for(n=0;n<g;n++){for(l=m?e.features[n].geometry:h?e.geometry:e,u=m?e.features[n].properties:h?e.properties:{},E=m?e.features[n].bbox:h?e.bbox:void 0,a=m?e.features[n].id:h?e.id:void 0,f=l?l.type==="GeometryCollection":!1,i=f?l.geometries.length:1,o=0;o<i;o++){if(r=f?l.geometries[o]:l,r===null){if(t(null,c,u,E,a)===!1)return!1;continue}switch(r.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(t(r,c,u,E,a)===!1)return!1;break}case"GeometryCollection":{for(s=0;s<r.geometries.length;s++)if(t(r.geometries[s],c,u,E,a)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}c++}}function Do(e,t,n){var s=n;return Vr(e,function(o,r,i,l,f){r===0&&n===void 0?s=o:s=t(s,o,r,i,l,f)}),s}var Qo=Vs(Jo(),1);function ts(e,t={}){t.concavity=t.concavity||1/0;let n=[];if(we(e,o=>{n.push([o[0],o[1]])}),!n.length)return null;let s=(0,Qo.default)(n,t.concavity);return s.length>3?yn([s]):null}function Sn(e,t={}){let n=0,s=0,o=0;return we(e,function(r){n+=r[0],s+=r[1],o++},!0),gn([n/o,s/o],t.properties)}function ae(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function es(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function os(e,t,n={}){let s;return n.final?s=ns(ae(t),ae(e)):s=ns(ae(e),ae(t)),s>180?-(360-s):s}function ns(e,t){let n=ue(e[1]),s=ue(t[1]),o=ue(t[0]-e[0]);o>Math.PI&&(o-=2*Math.PI),o<-Math.PI&&(o+=2*Math.PI);let r=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(o,r);return(En(i)+360)%360}function ss(e,t,n={}){let s=ae(e),o=ae(t);o[0]+=o[0]-s[0]>180?-360:s[0]-o[0]>180?360:0;let r=Lr(s,o);return xn(r,"meters",n.units)}function Lr(e,t,n){n=n===void 0?Zt:Number(n);let s=n,o=e[1]*Math.PI/180,r=t[1]*Math.PI/180,i=r-o,l=Math.abs(t[0]-e[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),u=Math.abs(f)>1e-11?i/f:Math.cos(o);return Math.sqrt(i*i+u*u*l*l)*s}function rs(e,t,n,s={}){let o=t<0,r=xn(Math.abs(t),s.units,"meters");o&&(r=-Math.abs(r));let i=ae(e),l=Ar(i,r,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,gn(l,s.properties)}function Ar(e,t,n,s){s=s===void 0?Zt:Number(s);let o=t/s,r=e[0]*Math.PI/180,i=ue(e[1]),l=ue(n),f=o*Math.cos(l),u=i+f;Math.abs(u)>Math.PI/2&&(u=u>0?Math.PI-u:-Math.PI-u);let E=Math.log(Math.tan(u/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),a=Math.abs(E)>1e-11?f/E:Math.cos(i),c=o*Math.sin(l)/a;return[((r+c)*180/Math.PI+540)%360-180,u*180/Math.PI]}function is(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return ls(e);case"FeatureCollection":return Fr(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Jn(e);default:throw new Error("unknown GeoJSON type")}}function ls(e){let t={type:"Feature"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:t[n]=e[n]}}),t.properties=cs(e.properties),e.geometry==null?t.geometry=null:t.geometry=Jn(e.geometry),t}function cs(e){let t={};return e&&Object.keys(e).forEach(n=>{let s=e[n];typeof s=="object"?s===null?t[n]=null:Array.isArray(s)?t[n]=s.map(o=>o):t[n]=cs(s):t[n]=s}),t}function Fr(e){let t={type:"FeatureCollection"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"features":return;default:t[n]=e[n]}}),t.features=e.features.map(n=>ls(n)),t}function Jn(e){let t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(n=>Jn(n)),t):(t.coordinates=as(e.coordinates),t)}function as(e){let t=e;return typeof t[0]!="object"?t.slice():t.map(n=>as(n))}function Qn(e,t,n){if(n=n||{},!ko(n))throw new Error("options is invalid");let s=n.pivot,o=n.mutate;if(!e)throw new Error("geojson is required");if(t==null||isNaN(t))throw new Error("angle is required");if(t===0)return e;let r=s??Sn(e);return(o===!1||o===void 0)&&(e=is(e)),we(e,function(i){let f=os(r,i)+t,u=ss(r,i),E=es(rs(r,u,f));i[0]=E[0],i[1]=E[1]}),e}function to(e,t,n={}){if(n.final===!0)return Or(e,t);let s=ae(e),o=ae(t),r=ue(s[0]),i=ue(o[0]),l=ue(s[1]),f=ue(o[1]),u=Math.sin(i-r)*Math.cos(f),E=Math.cos(l)*Math.sin(f)-Math.sin(l)*Math.cos(f)*Math.cos(i-r);return En(Math.atan2(u,E))}function Or(e,t){let n=to(t,e);return n=(n+180)%360,n}function fs(e,t={}){if(e.bbox!=null&&t.recompute!==!0)return e.bbox;let n=[1/0,1/0,-1/0,-1/0];return we(e,s=>{n[0]>s[0]&&(n[0]=s[0]),n[1]>s[1]&&(n[1]=s[1]),n[2]<s[0]&&(n[2]=s[0]),n[3]<s[1]&&(n[3]=s[1])}),n}function us(e,t={}){let n=Number(e[0]),s=Number(e[1]),o=Number(e[2]),r=Number(e[3]);if(e.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,s];return yn([[i,[o,s],[o,r],[n,r],i]],t.properties,{bbox:e,id:t.id})}function hs(e){return us(fs(e))}function ps(e){return Do(e,(t,n)=>t+Nr(n),0)}function Nr(e){let t=0,n;switch(e.type){case"Polygon":return ds(e.coordinates);case"MultiPolygon":for(n=0;n<e.coordinates.length;n++)t+=ds(e.coordinates[n]);return t;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function ds(e){let t=0;if(e&&e.length>0){t+=Math.abs(ms(e[0]));for(let n=1;n<e.length;n++)t-=Math.abs(ms(e[n]))}return t}var Wr=Zt*Zt/2,eo=Math.PI/180;function ms(e){let t=e.length-1;if(t<=2)return 0;let n=0,s=0;for(;s<t;){let o=e[s],r=e[s+1===t?0:s+1],i=e[s+2>=t?(s+2)%t:s+2],l=o[0]*eo,f=r[1]*eo,u=i[0]*eo;n+=(u-l)*Math.sin(f),s++}return n*Wr}function gs(e){let t=ts(e);if(!t)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=Sn(t),s=Co(t),o=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<s.length-1;i++){let l=to(s[i],s[i+1]),f=Qn(t,-1*l,{pivot:n}),u=hs(f),E=ps(u);E<o&&(o=E,r=Qn(u,l,{pivot:n}))}return r}function ys(e,t){let n=t[0]-e[0],s=t[1]-e[1];return Math.sqrt(n*n+s*s)}function qr(e){let t=1/0,n=-1/0,s=1/0,o=-1/0;for(let[r,i]of e)r<t&&(t=r),r>n&&(n=r),i<s&&(s=i),i>o&&(o=i);return[(n+t)*.5,(o+s)*.5]}var zn=class e extends jr{getBoxMesh(){Me.identity(),Me.setFromMatrix3(this.rotation),Me.decompose(Rn,Le,new Wt.Vector3);let t=this.halfSize.clone().multiplyScalar(2),n=new Wt.Mesh(new Wt.BoxGeometry(t.x,t.y,t.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(Le),n}getBoxEdge(t=16776960){let n=this.getBoxMesh();Xr.setFromObject(n);let s=new Wt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new Wt.LineSegments(s,new Wt.LineBasicMaterial({color:t,toneMapped:!1}))}toJson(){return Me.identity(),Me.setFromMatrix3(this.rotation),Me.decompose(Rn,Le,new Wt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:Le.toArray()}}static from(t,n,s,o=new e){if(s instanceof Wt.Euler)Le.setFromEuler(s);else if(s instanceof Wt.Quaternion)Le.copy(s);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return Me.compose(n,Le,$r),o.center.copy(n),o.halfSize.copy(t.multiplyScalar(.5)),o.rotation.setFromMatrix4(Me),o}static fromByPath2D(t,n,s,o=new e){let r=gs({type:"Polygon",coordinates:[t.map(m=>[m.x,m.y])]});if(!r)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=r.geometry.coordinates[0],l=ys(i[0],i[1]),f=ys(i[1],i[2]),u=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Rn.set(l,f,s),Es.set(0,0,u);let[E,a]=qr(i);return n.x=E,n.y=a,this.from(Rn,n,Es,o)}},Me=new Wt.Matrix4,Le=new Wt.Quaternion,Es=new Wt.Euler,$r=new Wt.Vector3(1,1,1),Rn=new Wt.Vector3,Xr=new Wt.Box3;import"three";function Yr(e,t,n=.005,s=.2){if(!e.length||!t.length)return 0;let o=Math.max(n,.03),r=n*n,i=new Map,l=(a,c,m)=>`${Math.floor(a/o)},${Math.floor(c/o)},${Math.floor(m/o)}`;for(let a of t){let c=l(a.x,a.y,a.z);i.has(c)||i.set(c,[]),i.get(c).push(a)}let f=0,u=Math.ceil(n/o)+1,E=[];for(let a=-u;a<=u;a++)for(let c=-u;c<=u;c++)for(let m=-u;m<=u;m++)a*a+c*c+m*m<=u*u&&E.push([a,c,m]);for(let a of e){let c=Math.floor(a.x/o),m=Math.floor(a.y/o),h=Math.floor(a.z/o),g=!1;for(let[T,y,p]of E){let d=`${c+T},${m+y},${h+p}`;if(i.has(d)){for(let x of i.get(d))if(a.distanceToSquared(x)<r){g=!0;break}if(g)break}}if(g&&(f++,f/e.length>s))return f/e.length}return f/e.length}function ve(e,t,n=.5){let s=0,o=0;for(let r of e)if(t.containsPoint(r)&&(s++,o=s/e.length,o>n))break;return o}function no(e,t,n,s){if(e.intersectsOBB(t))return!0;{let r=Jt(e,s),i=Jt(t,n);if(r||i)return!0}return!1}function oo(e,t){let n=new A.Vector3,s=new A.Vector3;e.getSize(n),t.getSize(s);let o=n.x*n.y*n.z,r=s.x*s.y*s.z;return o>r?1:o<r?-1:0}function Jt(e,t){let n=!0;for(let s=0;s<t.length;s++)if(!e.containsPoint(t[s])){n=!1;break}return n}function he(e){if(e.length===0)return{x:0,y:0,z:0,h:0};let t=0,n=0,s=-1/0,o=1/0;for(let r of e)t+=r.x,n+=r.y,s=Math.max(s,r.z),o=Math.min(o,r.z);return{x:t/e.length,y:n/e.length,z:0,maxz:s,minz:o,h:s-o}}function be(e,t,n,s){let o=[];for(let i=0;i<e.length;i++)o.push(new A.Vector3(e[i][0],e[i][1],0));if(o.length==0)return null;let r=zn.fromByPath2D(o,t,n);return r.center.z=s,r}var Gr=(e,t)=>{let n=new A.Group,s=new A.MeshStandardMaterial({color:16737792,side:A.DoubleSide});for(let o=0;o<e.length;o++){let r=[];for(let g=0;g<e[o].path.length;g++)r.push(new A.Vector3(e[o].path[g][0],e[o].path[g][1],0));if(r.length==0)continue;n.add(e[o].obb.getBoxEdge());let i=new A.BufferGeometry;i.setFromPoints(r);let l="green",f=new A.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),u=new A.Line(i,f);u.position.z=e[o].maxz,n.add(u);let E=e[o].obb.center.clone(),a=uo(e[o].type,E),c=e[o].stairBottomPt1.clone(),m=e[o].stairBottomPt2.clone();for(let g=0;g<e[o].stairStepNum;g++){let T=[c,m];T.push(m.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth)),T.push(c.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth));let y=Ln(T,e[o].stairStepHeight),p=new A.Mesh(y,s);n.add(p),c=c.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),c=c.addScaledVector(new A.Vector3(0,0,1),e[o].stairStepHeight),m=m.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),m=m.addScaledVector(new A.Vector3(0,0,1),e[o].stairStepHeight)}if(e[o].rectPt1.x!=0&&e[o].rectPt1.y!=0){let g=[e[o].stairBottomPt1,e[o].stairBottomPt2,e[o].rectPt2,e[o].rectPt1],T=Ln(g,e[o].stairStepHeight),y=new A.Mesh(T,s);n.add(y)}let h=new A.MeshBasicMaterial({color:16776960});for(let g=0;g<e[o].stairBottom1BalconyRailing.length;g++){let T=new A.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),y=new A.Mesh(T,h);y.position.set(e[o].stairBottom1BalconyRailing[g].x,e[o].stairBottom1BalconyRailing[g].z+e[o].balconyRailingHeight/2,-e[o].stairBottom1BalconyRailing[g].y),t.add(y)}for(let g=0;g<e[o].stairBottom2BalconyRailing.length;g++){let T=new A.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),y=new A.Mesh(T,h);y.position.set(e[o].stairBottom2BalconyRailing[g].x,e[o].stairBottom2BalconyRailing[g].z+e[o].balconyRailingHeight/2,-e[o].stairBottom2BalconyRailing[g].y),t.add(y)}}return n},Zr=(e,t)=>{if(e.length==0)return[];t||(t=e[0].averagePz);let n=[],s=new Map;for(let r=0;r<e.length;r++){let i=e[r].points.map(y=>[y.x,y.y]),l=e[r].obj_id;l=l.replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing").replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/roof/g,"Ceiling");let f=l.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],u=l.indexOf("_")+1,E=l.lastIndexOf("_"),a=l.substring(u,E);if(a.includes("top")&&(u=a.indexOf("top")+4,a=a.substring(u,E)),a.includes("left")&&(u=a.indexOf("left")+5,a=a.substring(u,E)),a.includes("right")&&(u=a.indexOf("right")+6,a=a.substring(u,E)),a.includes("front")&&(u=a.indexOf("front")+6,a=a.substring(u,E)),a==="wall"||a==="stair guardrail")continue;let c=[];for(let y=0;y<e[r].points.length;y++)c.push(new A.Vector3(e[r].points[y].x,e[r].points[y].y,e[r].points[y].z));let m=-99999;if(a==="floor"){let y=new Map;for(let d=0;d<e[r].points.length;d++){let x=e[r].points[d].z;if(x=Math.floor(x*10)/10,y.has(x)){let w=y.get(x);w.num+=1,w.points.push(e[r].points[d]),y.set(x,w)}else y.set(x,{num:1,points:[e[r].points[d]]})}let p=[...y.entries()].reduce((d,x)=>x[1].num>d[1].num?x:d);i=[],i=p[1].points.map(d=>[d.x,d.y]),c=[],c=p[1].points.map(d=>new A.Vector3(d.x,d.y,d.z)),m=p[0]}let h=he(c),g={points:c,path:Re(i),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:e[r].obj_id,type:a,averagePz:t,obb:null,isDel:!1,obj_id:l,positionArr:[e[r].position]};if(g.obb=be(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let T=-1;for(let y=0;y<n.length;y++)if(n[y].type==a){T=y;break}T!=-1?n[T].array.push(g):n.push({type:a,array:[g]})}for(let r=0;r<n.length;r++){let i=n[r].array,l=new Set,f=[];for(let E=0;E<i.length;E++){if(i[E].obb==null||l.has(E))continue;let a={...i[E],obb:i[E].obb.clone()};for(let c=E+1;c<i.length;c++){if(i[c].obb==null||l.has(c))continue;let m=a.obb.intersectsOBB(i[c].obb,.01);if(m||(m=ni(a.obb,i[c].obb)),m){l.add(c);for(let T=0;T<i[c].points.length;T++)(i[c].points[T].z>t&&i[c].points[T].z-t>.1||a.type=="floor"||a.type=="Staircase")&&a.points.push(i[c].points[T]);let h=a.points.map(T=>[T.x,T.y]);a.path=Re(h);let g=he(a.points);a.h=g.h,a.minz=g.minz,a.maxz=g.maxz,a.center={x:g.x,y:g.y,z:g.z},a.obb=be(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...i[c].positionArr),c=E}}a.path.length>i[E].path.length&&(l.add(E),f.push(a))}let u=[];for(let E=0;E<i.length;E++)l.has(E)||u.push(i[E]);u.push(...f),n[r].array=u}for(let r=0;r<n.length;r++){let i=n[r].type;if(i==="people"||i==="floor")continue;let l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].obb,E=l[f].minz,a=l[f].maxz,c=l[f].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let m=new A.Vector3;u.getSize(m);let h=[m.x,m.y,m.z],g=0;for(let T of h)if(T<.2&&(g++,g===2)){l[f].isDel=!0;break}}if(!l[f].isDel)for(let m=r+1;m<n.length;m++){let h=n[m].type;if(h==="people")continue;let g=n[m].array;for(let T=0;T<g.length;T++){if(g[T].isDel)continue;let y=g[T].obb,p=g[T].minz,d=g[T].maxz;if(u.intersectsOBB(y)){let x=ve(g[T].points,u),w=ve(l[f].points,y),P=oo(u,y);if(w>=.5&&P==-1&&i!=="Staircase"&&h!=="Staircase"){l[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(h==="balcony railing"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="balcony railing"&&no(u,y,l[f].points,g[T].points)&&(Math.abs(E-p)<.1||Math.abs(p-c)>.3)){g[T].isDel=!0;continue}if(h==="door"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}if(h==="window sill")continue}else if(i==="balcony railing"){if(h==="window"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="window"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="window"&&no(u,y,l[f].points,g[T].points)&&(Math.abs(E-p)<.1||Math.abs(E-c)>.3)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="Staircase"&&u.intersectsOBB(y)){l[f].isDel=!0;break}}else if(i==="door"){if(h==="window"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="window"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(y,l[f].points)){l[f].isDel=!0;break}}else if(i==="window sill"){if(h==="window")continue;if(h==="floor"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}}else if(i==="Staircase"){if(h==="balcony railing"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&u.intersectsOBB(y)){g[T].isDel=!0;continue}}let S=!1,b=[],R=[],z=l[f].points,V=g[T].points;if(z.length>V.length?(S=!0,b=z,R=V):(b=V,R=z),Yr(R,b,.03,.5)>.5)if(S)g[T].isDel=!0;else{l[f].isDel=!0;break}else if(no(u,y,l[f].points,g[T].points)){let v=oo(u,y);if(v===1||v===0){if(h==="switch"||h==="Staircase")continue;z.length>V.length?ve(R,u)>=.5&&(g[T].isDel=!0):ve(b,u)>=.5&&(g[T].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(z.length>V.length){if(ve(b,y)>=.5){l[f].isDel=!0;break}}else if(ve(R,y)>=.5){l[f].isDel=!0;break}}}}}}if(l[f].isDel)break}}}for(let r=0;r<n.length;r++){let i=n[r].type,l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].maxz,E=l[f].minz,a=i==="switch"?.1:.3;if(Math.abs(u-t)<a&&i!="floor"){l[f].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let c=Math.abs(u-t),m=Math.abs(E-t);(i==="tv"&&m<1.6||i!=="window"&&c<1.6)&&(l[f].isDel=!0),i==="window"&&c<1&&(l[f].isDel=!0),i==="door"&&m>1&&(l[f].isDel=!0)}if(i==="chair"){let c=new A.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1||c.z<.2)&&(l[f].isDel=!0)}if(i==="balcony railing"&&(Math.abs(u-E)<.4&&(l[f].isDel=!0),(E<t&&Math.abs(E-t)>1||E>t&&Math.abs(E-t)>1)&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="people"&&(Math.abs(u-E)<1&&(l[f].isDel=!0),E>t&&E-t>.3&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="floor"){let c=new A.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1)&&(l[f].isDel=!0)}i==="stair guardrail"&&l[f].points.length<100&&(l[f].isDel=!0)}}for(let r=0;r<n.length;r++)n[r].array=n[r].array.filter(i=>!i.isDel);let o=[];for(let r=0;r<n.length;r++){let i=n[r].array;for(let l=0;l<i.length;l++)o.push({obbBox:i[l].obb,box:new A.Box3().setFromPoints(i[l].points),category:i[l].type,center:{x:i[l].center.x,y:i[l].center.y,z:(i[l].minz+i[l].maxz)/2},name:i[l].obj_id,obj_id:i[l].obj_id,pcdPoints:i[l].points,positionArr:i[l].positionArr})}return o},Ur=e=>{if(e.length==0)return[];let t=[],n=new Map;for(let o=0;o<e.length;o++){let r=e[o].points.map(T=>[T.x,T.y]),i=e[o].obj_id;i=i.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor");let l=i.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],f=i.indexOf("_")+1,u=i.lastIndexOf("_"),E=i.substring(f,u);if(E!=="floor")continue;let a=[];for(let T=0;T<e[o].points.length;T++)a.push(new A.Vector3(e[o].points[T].x,e[o].points[T].y,e[o].points[T].z));let c=-99999;if(E==="floor"){let T=new Map;for(let p=0;p<e[o].points.length;p++){let d=e[o].points[p].z;if(d=Math.floor(d*10)/10,T.has(d)){let x=T.get(d);x.num+=1,x.points.push(e[o].points[p]),T.set(d,x)}else T.set(d,{num:1,points:[e[o].points[p]]})}let y=[...T.entries()].reduce((p,d)=>d[1].num>p[1].num?d:p);r=[],r=y[1].points.map(p=>[p.x,p.y]),a=[],a=y[1].points.map(p=>new A.Vector3(p.x,p.y,p.z)),c=y[0]}let m=he(a),h={points:a,path:Re(r),h:m.h,minz:m.minz,maxz:m.maxz,center:{x:m.x,y:m.y,z:m.z},obj_id:e[o].obj_id,type:E,obb:null,isDel:!1,obj_id:i,positionArr:[e[o].position]};if(h.obb=be(h.path,h.center,h.h,(h.maxz+h.minz)/2),h.obb==null)continue;let g=-1;for(let T=0;T<t.length;T++)if(t[T].type==E){g=T;break}if(g!=-1?t[g].array.push(h):t.push({type:E,array:[h]}),E=="floor"&&c!=-99999)if(n.has(c)){let T=n.get(c);T.num+=h.points.length,T.datas.push(h),n.set(c,T)}else n.set(c,{num:h.points.length,datas:[h]})}for(let o=0;o<t.length;o++){let r=t[o].array,i=[],l=[];for(let u=0;u<r.length;u++){if(r[u].obb==null||i.includes(u))continue;let E={...r[u],obb:r[u].obb.clone()};for(let a=u+1;a<r.length;a++){if(r[a].obb==null||i.includes(a))continue;if(E.obb.intersectsOBB(r[a].obb)){i.push(a);for(let g=0;g<r[a].points.length;g++)E.points.push(r[a].points[g]);let m=E.points.map(g=>[g.x,g.y]);E.path=Re(m);let h=he(E.points);E.h=h.h,E.minz=h.minz,E.maxz=h.maxz,E.center={x:h.x,y:h.y,z:h.z},E.obb=be(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.positionArr.push(...r[a].positionArr),a=u}}E.path.length>r[u].path.length&&(i.push(u),l.push(E))}let f=[];for(let u=0;u<r.length;u++)i.includes(u)||f.push(r[u]);f.push(...l),t[o].array=f}for(let o=0;o<t.length;o++){let r=t[o].type,i=t[o].array;for(let l=0;l<i.length;l++)r==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let o=0;o<t.length;o++)t[o].array=t[o].array.filter(r=>!r.isDel);let s=[];for(let o=0;o<t.length;o++){let r=t[o].array;for(let i=0;i<r.length;i++)s.push({obbBox:r[i].obb,box:new A.Box3().setFromPoints(r[i].points),category:r[i].type,center:{x:r[i].center.x,y:r[i].center.y,z:(r[i].minz+r[i].maxz)/2},name:r[i].obj_id,obj_id:r[i].obj_id,pcdPoints:r[i].points,positionArr:r[i].positionArr})}return s},Kr=(e,t)=>{if(!e||!e.splitFloorProjectsResults||!e.trajectoryResults)return[];let n=e.splitFloorProjectsResults,s=e.trajectoryResults,o=new Map;for(let c=0;c<s.length;c++){let m=s[c].floor;o.has(m)?o.get(m).push(s[c]):o.set(m,[s[c]])}let r=new Map,i=[];for(let c=0;c<n.length;c++){let m=[],h=n[c];for(let g=0;g<h.length;g++){let T=h[g].points.map(R=>[R.x,R.y]),y=h[g].obj_id;y=y.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing");let p=y.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=y.indexOf("_")+1,x=y.lastIndexOf("_"),w=y.substring(d,x);if(w.includes("top")&&(d=w.indexOf("top")+4,w=w.substring(d,x)),w.includes("left")&&(d=w.indexOf("left")+5,w=w.substring(d,x)),w.includes("right")&&(d=w.indexOf("right")+6,w=w.substring(d,x)),w.includes("front")&&(d=w.indexOf("front")+6,w=w.substring(d,x)),w!=="Staircase"&&w!=="balcony railing")continue;let P=[];for(let R=0;R<h[g].points.length;R++)P.push(new A.Vector3(h[g].points[R].x,h[g].points[R].y,h[g].points[R].z));let S=he(P),b={points:P,path:Re(T),h:S.h,minz:S.minz,maxz:S.maxz,center:{x:S.x,y:S.y,z:S.z},obj_id:h[g].obj_id,type:w,averagePz:0,obb:null,isDel:!1,obj_id:y,positionArr:[h[g].position],aabbBox:new A.Box3().setFromPoints(P)};b.obb=be(b.path,b.center,b.h,(b.maxz+b.minz)/2),b.obb!=null&&(w=="Staircase"?m.push(b):w=="balcony railing"&&i.push(b))}r.set(c+1,m)}let l=[];for(let[c,m]of r){let h={floor:c,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},g=o.get(c);if(!g){h.otherTrajectoryResults=m,l.push(h);continue}let T=[],y=[],p=[];for(let d=0;d<g.length;d++){let x=[];for(let P=0;P<g[d].points.length;P++){let S=[new A.Vector3(g[d].points[P].x,g[d].points[P].y,g[d].points[P].z)];S.push(S[0].clone().addScaledVector(new A.Vector3(0,0,-1),2));let b=new A.Box3().setFromPoints(S);x.push(b)}let w=[];for(let P=0;P<m.length;P++)for(let S=0;S<x.length;S++)!p.includes(P)&&m[P].aabbBox.intersectsBox(x[S])&&(p.push(P),w.push(m[P]));w.length>0&&y.push(w)}for(let d=0;d<m.length;d++)p.includes(d)||T.push(m[d]);h.findTrajectoryResults=y,h.otherTrajectoryResults=T,l.push(h)}function f(c,m){let h=c,g=[],T=[];for(let p=0;p<c.length;p++){if(c[p].obb==null||g.includes(p))continue;let d={...c[p],obb:c[p].obb.clone()};for(let x=p+1;x<c.length;x++){if(c[x].obb==null||g.includes(x))continue;if(d.obb.intersectsOBB(c[x].obb)||m){g.push(x);for(let b=0;b<c[x].points.length;b++)d.points.push(c[x].points[b]);let P=d.points.map(b=>[b.x,b.y]);d.path=Re(P);let S=he(d.points);d.h=S.h,d.minz=S.minz,d.maxz=S.maxz,d.center={x:S.x,y:S.y,z:S.z},d.obb=be(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...c[x].positionArr),x=p}}d.path.length>c[p].path.length&&(g.push(p),T.push(d))}let y=[];for(let p=0;p<c.length;p++)g.includes(p)||y.push(c[p]);return y.push(...T),c=y,c}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++)l[c].findTrajectoryResults[m]=f(l[c].findTrajectoryResults[m],!0);l[c].otherTrajectoryResults=f(l[c].otherTrajectoryResults,!1)}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++){for(let h=0;h<l[c].findTrajectoryResults[m].length;h++){let g=xs(l[c].findTrajectoryResults[m][h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),T=ws(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(T.keep.length==0){l[c].findTrajectoryResults[m][h].isDel=!0;continue}l[c].findTrajectoryResults[m][h].points=T.keep;let y=l[c].findTrajectoryResults[m][h].points.map(d=>[d.x,d.y]);l[c].findTrajectoryResults[m][h].path=Re(y);let p=he(l[c].findTrajectoryResults[m][h].points);l[c].findTrajectoryResults[m][h].h=p.h,l[c].findTrajectoryResults[m][h].minz=p.minz,l[c].findTrajectoryResults[m][h].maxz=p.maxz,l[c].findTrajectoryResults[m][h].center={x:p.x,y:p.y,z:p.z},l[c].findTrajectoryResults[m][h].obb=be(l[c].findTrajectoryResults[m][h].path,l[c].findTrajectoryResults[m][h].center,l[c].findTrajectoryResults[m][h].h,(l[c].findTrajectoryResults[m][h].maxz+l[c].findTrajectoryResults[m][h].minz)/2)}l[c].findTrajectoryResults[m]=l[c].findTrajectoryResults[m].filter(h=>!h.isDel)}for(let m=0;m<l[c].otherTrajectoryResults.length;m++){let h=xs(l[c].otherTrajectoryResults[m].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),g=ws(h.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(g.keep.length==0){l[c].otherTrajectoryResults[m].isDel=!0;continue}l[c].otherTrajectoryResults[m].points=g.keep;let T=l[c].otherTrajectoryResults[m].points.map(p=>[p.x,p.y]);l[c].otherTrajectoryResults[m].path=Re(T);let y=he(l[c].otherTrajectoryResults[m].points);l[c].otherTrajectoryResults[m].h=y.h,l[c].otherTrajectoryResults[m].minz=y.minz,l[c].otherTrajectoryResults[m].maxz=y.maxz,l[c].otherTrajectoryResults[m].center={x:y.x,y:y.y,z:y.z},l[c].otherTrajectoryResults[m].obb=be(l[c].otherTrajectoryResults[m].path,l[c].otherTrajectoryResults[m].center,l[c].otherTrajectoryResults[m].h,(l[c].otherTrajectoryResults[m].maxz+l[c].otherTrajectoryResults[m].minz)/2)}l[c].otherTrajectoryResults.filter(m=>!m.isDel)}function u(c){for(let m=0;m<c.length;m++){let h=c[m].obb;for(let g=m+1;g<c.length;g++){let T=c[g].obb;if(!c[g].isDel){if(h.intersectsOBB(T)){let y=ve(c[g].points,h),p=ve(c[m].points,T),d=oo(h,T);if(y>=.5&&(d==1||d==0)&&(c[g].isDel=!0),p>=.5&&d==-1){c[m].isDel=!0;break}}if(c[m].isDel)break}}}return c=c.filter(m=>!m.isDel),c}for(let c=0;c<l.length;c++){let m=[];for(let h=0;h<l[c].findTrajectoryResults.length;h++)m.push(...l[c].findTrajectoryResults[h]);m.push(...l[c].otherTrajectoryResults),l[c].lastTrajectoryResults=u(m)}function E(c){let m=[];if(c.length>0){let h=.3,g=.5,T=.5,y=.2;for(let p=0;p<c.length;p++){let d=c[p].obb.halfSize.clone().multiplyScalar(2),x=c[p].points,w=d.x,P=d.y,S=d.z;if(w>P&&([w,P]=[P,w]),w<g||P<h||S<T)continue;let b=go(c[p].obb);if(b.length!=8)continue;let R=new A.Line3(b[0],b[1]),z=new A.Line3(b[1],b[2]),V=new A.Line3(b[2],b[3]),M=new A.Line3(b[3],b[0]),v=new A.Line3(b[4],b[5]),I=new A.Line3(b[5],b[6]),D=new A.Line3(b[6],b[7]),B=new A.Line3(b[7],b[4]),_=[],k=[],H=[],F=[],j=[],$=[],K=[],Y=[];for(let Et=0;Et<x.length;Et++){let re=R.closestPointToPoint(x[Et],!0,new A.Vector3),Te=z.closestPointToPoint(x[Et],!0,new A.Vector3),St=V.closestPointToPoint(x[Et],!0,new A.Vector3),ie=M.closestPointToPoint(x[Et],!0,new A.Vector3),G=v.closestPointToPoint(x[Et],!0,new A.Vector3),me=I.closestPointToPoint(x[Et],!0,new A.Vector3),He=D.closestPointToPoint(x[Et],!0,new A.Vector3),Be=B.closestPointToPoint(x[Et],!0,new A.Vector3);re.distanceTo(x[Et])<y&&_.push(x[Et]),Te.distanceTo(x[Et])<y&&k.push(x[Et]),St.distanceTo(x[Et])<y&&H.push(x[Et]),ie.distanceTo(x[Et])<y&&F.push(x[Et]),G.distanceTo(x[Et])<y&&j.push(x[Et]),me.distanceTo(x[Et])<y&&$.push(x[Et]),He.distanceTo(x[Et])<y&&K.push(x[Et]),Be.distanceTo(x[Et])<y&&Y.push(x[Et])}let tt=b[0].distanceTo(b[1]),it=b[1].distanceTo(b[2]),ct=b[2].distanceTo(b[3]),ut=b[3].distanceTo(b[0]),q=new A.Vector3,W=new A.Vector3,Z=new A.Vector3,wt=new A.Vector3;Math.abs(tt-w)<.01?_.length>H.length?(q=b[0].clone(),W=b[1].clone(),Z=new A.Vector3().subVectors(W,q).normalize(),wt=new A.Vector3().subVectors(b[2],b[1]).normalize()):(q=b[2].clone(),W=b[3].clone(),Z=new A.Vector3().subVectors(W,q).normalize(),wt=new A.Vector3().subVectors(b[0],b[3]).normalize()):k.length>F.length?(q=b[1].clone(),W=b[2].clone(),Z=new A.Vector3().subVectors(W,q).normalize(),wt=new A.Vector3().subVectors(b[3],b[2]).normalize()):(q=b[3].clone(),W=b[0].clone(),Z=new A.Vector3().subVectors(W,q).normalize(),wt=new A.Vector3().subVectors(b[1],b[0]).normalize());let Ft=b[4].distanceTo(b[5]),Nt=b[5].distanceTo(b[6]),jt=b[6].distanceTo(b[7]),Lt=b[7].distanceTo(b[4]),Tt=new A.Vector3,It=new A.Vector3,Pt=new A.Vector3(q.x,q.y,b[4].z),bt=new A.Vector3(W.x,W.y,b[4].z);(st(b[4],Pt)||st(b[4],bt))&&(st(b[5],Pt)||st(b[5],bt))?(Tt=b[6].clone(),It=b[7].clone()):(st(b[5],Pt)||st(b[5],bt))&&(st(b[6],Pt)||st(b[6],bt))?(Tt=b[7].clone(),It=b[4].clone()):(st(b[6],Pt)||st(b[6],bt))&&(st(b[7],Pt)||st(b[7],bt))?(Tt=b[4].clone(),It=b[5].clone()):(st(b[7],Pt)||st(b[7],bt))&&(st(b[4],Pt)||st(b[4],bt))&&(Tt=b[5].clone(),It=b[6].clone());let Bt=q.distanceTo(W),J=Tt.distanceTo(It),ft=new A.Vector3().subVectors(new A.Vector3(q.x,q.y,Tt.z),q).normalize();if(Math.abs(Bt-J)>.01||Math.abs(Bt-w)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",Bt,J,w);continue}let Q=Math.sqrt(Bt*Bt+J*J),U=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q)))),de={stairStepHeight:S/U,stairStepWidth:P/U,staitWidth:w,stairLength:P,stairHeigth:S,stairStepNum:U,stairBottomPt1:q,stairBottomPt2:W,stairTopPt1:Tt,stairTopPt2:It,vecStepLength:Z,vecStepWidth:wt,vecStepHeight:ft,path:c[p].path,obb:c[p].obb,maxz:c[p].maxz,points:c[p].points,rectPt1:new A.Vector3(0,0,0),rectPt2:new A.Vector3(0,0,0)};m.push(de)}}return m}let a=[];for(let c=0;c<l.length;c++)a.push(...E(l[c].lastTrajectoryResults));for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=m.clone(),p=h.clone(),d=g.clone(),x=T.clone();y.z=p.z=d.z=x.z=0;let w=qt(m,h,!0),P=qt(g,T,!0),S=qt(w,P),b=new A.Vector3().subVectors(w,S).normalize(),R=new A.Vector3().subVectors(P,S).normalize(),z=w.distanceTo(P),V=!1,M=!1;for(let v=0;v<a.length;v++){if(c==v)continue;let I=a[v].stairTopPt1.clone(),D=a[v].stairTopPt2.clone(),B=a[v].stairBottomPt1.clone(),_=a[v].stairBottomPt2.clone(),k=new A.Vector3().subVectors(I,D).normalize(),H=new A.Vector3().subVectors(B,_).normalize(),F=I.clone(),j=D.clone(),$=B.clone(),K=_.clone();F.z=j.z=$.z=K.z=0;let Y=qt(I,D,!0),tt=qt(B,_,!0),it=Y.distanceTo(tt),ct=Yt(w,P,Y,tt),ut=!1;if(ct&&ct.isParallel&&I.z<=g.z&&g.z-I.z<.3){ut=!0,M=!0;let q=F.addScaledVector(k.clone().negate(),100),W=j.addScaledVector(k,100),Z=$.addScaledVector(H.clone().negate(),100),wt=K.addScaledVector(H,100),Ft=new A.Line3(q,W),Nt=new A.Line3(Z,wt),jt=Ft.closestPointToPoint(S,!0,new A.Vector3),Lt=Nt.closestPointToPoint(S,!0,new A.Vector3),Tt=new A.Vector3().subVectors(jt,S),It=new A.Vector3().subVectors(Lt,S),Pt=Tt.length(),bt=It.length();It=It.normalize(),Tt=Tt.normalize();let Bt=Kt(b,Tt,.1),J=Kt(R,Tt,.1),ft=Kt(R,It,.1),Q=Kt(b,It,.1);if(Bt&&Bt.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}else if(J&&J.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}if(ft&&ft.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}else if(Q&&Q.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}}else if(ct&&ct.isParallel&&m.z<B.z&&B.z-m.z<.2){ut=!0,V=!0;let q=F.addScaledVector(k.clone().negate(),100),W=j.addScaledVector(k,100),Z=$.addScaledVector(H.clone().negate(),100),wt=K.addScaledVector(H,100),Ft=new A.Line3(q,W),Nt=new A.Line3(Z,wt),jt=Ft.closestPointToPoint(S,!1,new A.Vector3),Lt=Nt.closestPointToPoint(S,!1,new A.Vector3),Tt=new A.Vector3().subVectors(jt,S),It=new A.Vector3().subVectors(Lt,S),Pt=Tt.length(),bt=It.length();It=It.normalize(),Tt=Tt.normalize();let Bt=Kt(b,Tt,.1),J=Kt(R,Tt,.1),ft=Kt(R,It,.1),Q=Kt(b,It,.1);if(Bt&&Bt.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}else if(J&&J.sameDirection&&Pt>z/2){let U=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(R,U),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(R,U)}if(ft&&ft.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}else if(Q&&Q.sameDirection&&bt>z/2){let U=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,U),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,U)}a[c].stairTopPt1.z=a[c].stairTopPt2.z=B.z}if(ut&&(m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=m.clone(),p=h.clone(),d=g.clone(),x=T.clone(),y.z=p.z=d.z=x.z=0,w=qt(m,h,!0),P=qt(g,T,!0),S=qt(w,P),b=new A.Vector3().subVectors(w,S).normalize(),R=new A.Vector3().subVectors(P,S).normalize(),z=w.distanceTo(P)),M&&V)break}if(M||V){let v=a[c].stairTopPt1.clone(),I=a[c].stairTopPt2.clone(),D=a[c].stairBottomPt1.clone(),B=a[c].stairBottomPt2.clone(),_=qt(v,I,!0),k=qt(D,B,!0),H=_.distanceTo(k),F=a[c].stairTopPt1.distanceTo(a[c].stairTopPt2),j=a[c].stairBottomPt1.distanceTo(a[c].stairBottomPt2),$=Math.sqrt(F*F+j*j),K=Math.round(Math.max(5,Math.min(350,10*Math.sqrt($))));a[c].stairStepNum=K,a[c].stairHeigth=a[c].stairTopPt1.z-a[c].stairBottomPt1.z,a[c].stairStepHeight=a[c].stairHeigth/a[c].stairStepNum,a[c].stairStepWidth=H/a[c].stairStepNum}}for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1,h=a[c].stairTopPt2,g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=new A.Vector3(m.x,m.y,g.z),p=a[c].vecStepWidth;for(let d=0;d<a.length;d++){if(c==d)continue;let x=a[d].stairTopPt1,w=a[d].stairTopPt2,P=a[d].stairBottomPt1.clone(),S=a[d].stairBottomPt2.clone(),b=new A.Vector3(x.x,x.y,P.z),R=a[d].vecStepWidth;if(Math.abs(m.z-P.z)<.3&&P.z>g.z&&a[c].obb.intersectsOBB(a[d].obb)){let z=se(y,g,b,P);if(z&&z.angle>75){let V=P.distanceTo(m),M=P.distanceTo(h),v=S.distanceTo(m),I=S.distanceTo(h),D=m.clone(),B=D.clone().addScaledVector(p,a[d].staitWidth),_=new A.Vector3().subVectors(h,m).normalize(),k=m.distanceTo(h),H=D.clone().addScaledVector(_,k),F=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),$=B.clone().addScaledVector(_,a[d].stairLength),K=V;(K>M||K>I)&&(K=M,D=h.clone(),B=D.clone().addScaledVector(p,a[d].staitWidth),_=new A.Vector3().subVectors(m,h).normalize(),k=m.distanceTo(h),H=D.clone().addScaledVector(_,k),F=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),$=B.clone().addScaledVector(_,a[d].stairLength));let Y=new A.Vector3().subVectors(j,H).normalize(),tt=j.distanceTo(H);j.z=$.z=a[d].maxz,a[d].stairBottomPt1=H,a[d].stairBottomPt2=F,a[d].stairTopPt1=j,a[d].stairTopPt2=$,a[d].rectPt1=D,a[d].rectPt2=B;let it=H.distanceTo(F),ct=j.distanceTo($),ut=Math.sqrt(tt*tt+a[d].stairHeigth*a[d].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ut))));a[d].stairStepNum=q,a[d].stairHeigth=j.z-H.z,a[d].stairStepHeight=a[d].stairHeigth/a[d].stairStepNum,a[d].stairStepWidth=tt/a[d].stairStepNum,a[d].vecStepLength=_.clone().negate(),a[d].vecStepWidth=Y;break}}}}return Jr(a,i,t),a},Jr=(e,t,n)=>{if(!e||e.length<=0||!t||t.length<=0)return;let s=1.5,o=0;for(let r=0;r<e.length;r++){e[r].stairBottom1BalconyRailing=[],e[r].stairBottom2BalconyRailing=[],e[r].balconyRailingHeight=0;let i=e[r].stairBottomPt1.clone(),l=e[r].stairBottomPt2.clone(),f=e[r].stairBottomPt1.clone(),u=e[r].stairBottomPt2.clone(),E=new A.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(E,.05),l=l.addScaledVector(E.clone().negate(),.05);let a=[],c=[];for(let m=0;m<e[r].stairStepNum;m++){let h=[i,f];h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth));let g=h.map(w=>[w.x,w.y]);h.push(new A.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new A.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new A.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new A.Vector3(h[0].x,h[0].y,h[0].z+s));let T=he(h),y=be(g,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),p=[],d=!1,x=0;for(let w=0;w<t.length;w++)if(y.intersectsOBB(t[w].obb)){for(let P=0;P<t[w].points.length&&!(y.containsPoint(t[w].points[P])&&(m==0&&p.push(t[w].points[P]),t[w].points[P].z>i.z&&t[w].points[P].z-i.z<1&&(x++,x>10&&m!=0)));P++);if(x>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=he(p).maxz),d){let w=qt(h[1],h[2]);w.z+=e[r].stairStepHeight,a.push(w)}h=[],h=[l,u],h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),g=h.map(w=>[w.x,w.y]),h.push(new A.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new A.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new A.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new A.Vector3(h[0].x,h[0].y,h[0].z+s)),T=he(h),y=be(g,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),p=[],d=!1;for(let w=0;w<t.length;w++)if(y.intersectsOBB(t[w].obb)){let P=0;for(let S=0;S<t[w].points.length&&!(y.containsPoint(t[w].points[S])&&(m==0&&p.push(t[w].points[S]),t[w].points[S].z>i.z&&t[w].points[S].z-i.z<1&&(P++,P>10&&m!=0)));S++);if(P>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=he(p).maxz),d){let w=qt(h[1],h[2]);w.z+=e[r].stairStepHeight,c.push(w)}i=i.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),i=i.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),l=l.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),l=l.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),f=f.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),f=f.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),u=u.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),u=u.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight)}a.length>e[r].stairStepNum-3&&(e[r].stairBottom1BalconyRailing=a),c.length>e[r].stairStepNum-3&&(e[r].stairBottom2BalconyRailing=c),e[r].balconyRailingHeight=o}};function xs(e,t={}){let{binCount:n=80,minBinPoints:s=5,sideK:o=3,zK:r=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:f=3,lowerZScale:u=1,upperZScale:E=1}=t;if(!e||e.length===0)return[];let a=e.map((H,F)=>({index:F,x:H.x,y:H.y,z:H.z,raw:H})),c=0,m=0;for(let H of a)c+=H.x,m+=H.y;c/=a.length,m/=a.length;let h=0,g=0,T=0;for(let H of a){let F=H.x-c,j=H.y-m;h+=F*F,g+=F*j,T+=j*j}h/=a.length,g/=a.length,T/=a.length;let y=h+T,p=Math.sqrt((h-T)*(h-T)+4*g*g),d=(y+p)/2,x,w;Math.abs(g)>1e-8?(x=d-T,w=g):h>=T?(x=1,w=0):(x=0,w=1);let P=Math.sqrt(x*x+w*w)||1;x/=P,w/=P;let S=-w,b=x,R=1/0,z=-1/0,V=a.map(H=>{let F=H.x-c,j=H.y-m,$=F*x+j*w,K=F*S+j*b;return R=Math.min(R,$),z=Math.max(z,$),{...H,t:$,side:K}}),v=(z-R||1)/n,I=new Map;for(let H of V){let F=Math.floor((H.t-R)/v);F<0&&(F=0),F>=n&&(F=n-1),I.has(F)||I.set(F,[]),I.get(F).push(H)}let D=new Map;for(let[H,F]of I){if(F.length<s)continue;let j=F.map(q=>q.side).sort((q,W)=>q-W),$=F.map(q=>q.z).sort((q,W)=>q-W),K=Vn(j),Y=Vn($),tt=Vn(j.map(q=>Math.abs(q-K)).sort((q,W)=>q-W)),it=Vn($.map(q=>Math.abs(q-Y)).sort((q,W)=>q-W)),ct=Math.max(i,tt*1.4826*o),ut=Math.max(l,it*1.4826*r);D.set(H,{sideMedian:K,zMedian:Y,sideRange:ct,zRange:ut})}function B(H){if(D.has(H))return D.get(H);for(let F=1;F<=f;F++){if(D.has(H-F))return D.get(H-F);if(D.has(H+F))return D.get(H+F)}return null}let _=[],k=[];for(let H of V){let F=Math.floor((H.t-R)/v);F<0&&(F=0),F>=n&&(F=n-1);let j=B(F);if(!j){k.push(H.raw);continue}let $=Math.abs(H.side-j.sideMedian)<=j.sideRange,K=j.zMedian-j.zRange*u,Y=j.zMedian+j.zRange*E,tt=H.z>=K&&H.z<=Y;$&&tt?_.push(H.raw):k.push(H.raw)}return{keep:_,removed:k,debug:{meanX:c,meanY:m,dirX:x,dirY:w,sideX:S,sideY:b,minT:R,maxT:z,binSize:v,stats:D}}}function Vn(e){if(e.length===0)return 0;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]}function Qr(e,t){let n=new Map;for(let s=0;s<e.length;s++){let o=e[s],r=Math.floor(o.x/t),i=Math.floor(o.y/t),l=Math.floor(o.z/t),f=`${r},${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(s)}return n}function ti(e,t,n,s,o){let r=e[n],i=Math.floor(r.x/s),l=Math.floor(r.y/s),f=Math.floor(r.z/s),u=[];for(let E=-1;E<=1;E++)for(let a=-1;a<=1;a++)for(let c=-1;c<=1;c++){let m=`${i+E},${l+a},${f+c}`,h=t.get(m);if(h)for(let g of h){if(g===n)continue;let T=e[g],y=r.x-T.x,p=r.y-T.y,d=r.z-T.z;y*y+p*p+d*d<=o&&u.push(g)}}return u}function ws(e,t={}){let{radius:n=.35,minClusterSize:s=20,lowPercent:o=.35}=t,r=ei(e,{radius:n}),i=e.map(E=>E.z).sort((E,a)=>E-a),l=i[Math.floor(i.length*o)],f=[],u=[];for(let E of r.clusters){let a=E.map(h=>r.points[h]),c=a.reduce((h,g)=>h+g.z,0)/a.length;a.length<s&&c<=l?u.push(...a.map(h=>h.raw)):f.push(...a.map(h=>h.raw))}return{keep:f,removed:u}}function ei(e,t={}){let{radius:n=.35}=t,s=e.map((f,u)=>({index:u,x:f.x,y:f.y,z:f.z,raw:f})),o=Qr(s,n),r=n*n,i=new Array(s.length).fill(!1),l=[];for(let f=0;f<s.length;f++){if(i[f])continue;let u=[],E=[f];for(i[f]=!0;E.length>0;){let a=E.shift();u.push(a);let c=ti(s,o,a,n,r);for(let m of c)i[m]||(i[m]=!0,E.push(m))}l.push(u)}return{points:s,clusters:l}}function ni(e,t,n=1e-6){let s=oi(t);for(let o of s)if(!si(e,o,n))return!1;return!0}function oi(e){let t=e.center,n=e.halfSize,s=e.rotation.elements,o=new A.Vector3(s[0],s[1],s[2]).multiplyScalar(n.x),r=new A.Vector3(s[3],s[4],s[5]).multiplyScalar(n.y),i=new A.Vector3(s[6],s[7],s[8]).multiplyScalar(n.z),l=[];for(let f of[-1,1])for(let u of[-1,1])for(let E of[-1,1]){let a=t.clone().addScaledVector(o,f).addScaledVector(r,u).addScaledVector(i,E);l.push(a)}return l}function si(e,t,n=1e-6){let s=new A.Vector3().subVectors(t,e.center),o=e.rotation.elements,r=e.halfSize,i=new A.Vector3(o[0],o[1],o[2]),l=new A.Vector3(o[3],o[4],o[5]),f=new A.Vector3(o[6],o[7],o[8]),u=s.dot(i),E=s.dot(l),a=s.dot(f);return Math.abs(u)<=r.x+n&&Math.abs(E)<=r.y+n&&Math.abs(a)<=r.z+n}function ri(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function ii(e,t,n,s,o,r){let i=Math.hypot(n-o,s-r),l=Math.hypot(e-o,t-r),f=Math.hypot(e-n,t-s),u=Math.abs((n-e)*(r-t)-(o-e)*(s-t))/2;return u===0?1/0:i*l*f/(4*u)}function li(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let h of e){let g=`${h[0]}_${h[1]}`;t.has(g)||(t.add(g),n.push(h))}if(n.length<3)return[];let s=new Ve(Float64Array.from(n.flat())),{triangles:o}=s;if(!o.length)return[];let r=new Map,i=(h,g)=>h<g?`${h}_${g}`:`${g}_${h}`;for(let h=0;h<o.length;h+=3){let g=o[h],T=o[h+1],y=o[h+2],[p,d]=n[g],[x,w]=n[T],[P,S]=n[y],b=ii(p,d,x,w,P,S),R=ri(n,g,T,y);if(b<=1/R)for(let[z,V]of[[g,T],[T,y],[y,g]]){let M=i(z,V);r.set(M,(r.get(M)||0)+1)}}let l=[];for(let[h,g]of r)g===1&&l.push(h.split("_").map(Number));if(!l.length)return[];let f=new Map;for(let[h,g]of l)(f.get(h)||f.set(h,[]).get(h)).push(g),(f.get(g)||f.set(g,[]).get(g)).push(h);let u=l[0][0],E=[],a=new Set,c=u,m=-1;do{E.push(n[c]),a.add(c);let h=f.get(c)||[],g=h.find(T=>T!==m&&!a.has(T));if(g===void 0&&(g=h.find(T=>T!==m)),g===void 0)break;m=c,c=g}while(c!==u&&E.length<=l.length+1);return E.length>0&&E.push(E[0]),E}export{tr as checkBeamIsReasonable,li as computeContour,Gr as drawStaircase,Qs as getBeamLine,rr as getColLine,Bs as getLineCheckResults,Ur as getMergeFloorMeaning,Zr as getMergeMeaning,Hs as getOneLineCheckResults,Kr as getStaircase,Os as updateStEdPoint};
|
|
1
|
+
var Ts=Object.create;var ro=Object.defineProperty;var Ps=Object.getOwnPropertyDescriptor;var Rs=Object.getOwnPropertyNames;var Ss=Object.getPrototypeOf,zs=Object.prototype.hasOwnProperty;var Ce=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vs=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Rs(t))!zs.call(e,o)&&o!==n&&ro(e,o,{get:()=>t[o],enumerable:!(s=Ps(t,o))||s.enumerable});return e};var Ms=(e,t,n)=>(n=e!=null?Ts(Ss(e)):{},Vs(t||!e||!e.__esModule?ro(n,"default",{value:e,enumerable:!0}):n,e));var Lo=Ce(($n,Xn)=>{(function(e,t){typeof $n=="object"&&typeof Xn<"u"?Xn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.RBush=t())})($n,function(){"use strict";function e(d,x,w,P,R){t(d,x,w||0,P||d.length-1,R||s)}function t(d,x,w,P,R){for(;P>w;){if(P-w>600){var b=P-w+1,S=x-w+1,z=Math.log(b),V=.5*Math.exp(2*z/3),M=.5*Math.sqrt(z*V*(b-V)/b)*(S-b/2<0?-1:1),H=Math.max(w,Math.floor(x-S*V/b+M)),C=Math.min(P,Math.floor(x+(b-S)*V/b+M));t(d,x,H,C,R)}var D=d[x],B=w,_=P;for(n(d,w,x),R(d[P],D)>0&&n(d,w,P);B<_;){for(n(d,B,_),B++,_--;R(d[B],D)<0;)B++;for(;R(d[_],D)>0;)_--}R(d[w],D)===0?n(d,w,_):(_++,n(d,_,P)),_<=x&&(w=_+1),x<=_&&(P=_-1)}}function n(d,x,w){var P=d[x];d[x]=d[w],d[w]=P}function s(d,x){return d<x?-1:d>x?1:0}var o=function(x){x===void 0&&(x=9),this._maxEntries=Math.max(4,x),this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4)),this.clear()};o.prototype.all=function(){return this._all(this.data,[])},o.prototype.search=function(x){var w=this.data,P=[];if(!T(x,w))return P;for(var R=this.toBBox,b=[];w;){for(var S=0;S<w.children.length;S++){var z=w.children[S],V=w.leaf?R(z):z;T(x,V)&&(w.leaf?P.push(z):g(x,V)?this._all(z,P):b.push(z))}w=b.pop()}return P},o.prototype.collides=function(x){var w=this.data;if(!T(x,w))return!1;for(var P=[];w;){for(var R=0;R<w.children.length;R++){var b=w.children[R],S=w.leaf?this.toBBox(b):b;if(T(x,S)){if(w.leaf||g(x,S))return!0;P.push(b)}}w=P.pop()}return!1},o.prototype.load=function(x){if(!(x&&x.length))return this;if(x.length<this._minEntries){for(var w=0;w<x.length;w++)this.insert(x[w]);return this}var P=this._build(x.slice(),0,x.length-1,0);if(!this.data.children.length)this.data=P;else if(this.data.height===P.height)this._splitRoot(this.data,P);else{if(this.data.height<P.height){var R=this.data;this.data=P,P=R}this._insert(P,this.data.height-P.height-1,!0)}return this},o.prototype.insert=function(x){return x&&this._insert(x,this.data.height-1),this},o.prototype.clear=function(){return this.data=y([]),this},o.prototype.remove=function(x,w){if(!x)return this;for(var P=this.data,R=this.toBBox(x),b=[],S=[],z,V,M;P||b.length;){if(P||(P=b.pop(),V=b[b.length-1],z=S.pop(),M=!0),P.leaf){var H=r(x,P.children,w);if(H!==-1)return P.children.splice(H,1),b.push(P),this._condense(b),this}!M&&!P.leaf&&g(P,R)?(b.push(P),S.push(z),z=0,V=P,P=P.children[0]):V?(z++,P=V.children[z],M=!1):P=null}return this},o.prototype.toBBox=function(x){return x},o.prototype.compareMinX=function(x,w){return x.minX-w.minX},o.prototype.compareMinY=function(x,w){return x.minY-w.minY},o.prototype.toJSON=function(){return this.data},o.prototype.fromJSON=function(x){return this.data=x,this},o.prototype._all=function(x,w){for(var P=[];x;)x.leaf?w.push.apply(w,x.children):P.push.apply(P,x.children),x=P.pop();return w},o.prototype._build=function(x,w,P,R){var b=P-w+1,S=this._maxEntries,z;if(b<=S)return z=y(x.slice(w,P+1)),i(z,this.toBBox),z;R||(R=Math.ceil(Math.log(b)/Math.log(S)),S=Math.ceil(b/Math.pow(S,R-1))),z=y([]),z.leaf=!1,z.height=R;var V=Math.ceil(b/S),M=V*Math.ceil(Math.sqrt(S));p(x,w,P,M,this.compareMinX);for(var H=w;H<=P;H+=M){var C=Math.min(H+M-1,P);p(x,H,C,V,this.compareMinY);for(var D=H;D<=C;D+=V){var B=Math.min(D+V-1,C);z.children.push(this._build(x,D,B,R-1))}}return i(z,this.toBBox),z},o.prototype._chooseSubtree=function(x,w,P,R){for(;R.push(w),!(w.leaf||R.length-1===P);){for(var b=1/0,S=1/0,z=void 0,V=0;V<w.children.length;V++){var M=w.children[V],H=a(M),C=m(x,M)-H;C<S?(S=C,b=H<b?H:b,z=M):C===S&&H<b&&(b=H,z=M)}w=z||w.children[0]}return w},o.prototype._insert=function(x,w,P){var R=P?x:this.toBBox(x),b=[],S=this._chooseSubtree(R,this.data,w,b);for(S.children.push(x),f(S,R);w>=0&&b[w].children.length>this._maxEntries;)this._split(b,w),w--;this._adjustParentBBoxes(R,b,w)},o.prototype._split=function(x,w){var P=x[w],R=P.children.length,b=this._minEntries;this._chooseSplitAxis(P,b,R);var S=this._chooseSplitIndex(P,b,R),z=y(P.children.splice(S,P.children.length-S));z.height=P.height,z.leaf=P.leaf,i(P,this.toBBox),i(z,this.toBBox),w?x[w-1].children.push(z):this._splitRoot(P,z)},o.prototype._splitRoot=function(x,w){this.data=y([x,w]),this.data.height=x.height+1,this.data.leaf=!1,i(this.data,this.toBBox)},o.prototype._chooseSplitIndex=function(x,w,P){for(var R,b=1/0,S=1/0,z=w;z<=P-w;z++){var V=l(x,0,z,this.toBBox),M=l(x,z,P,this.toBBox),H=h(V,M),C=a(V)+a(M);H<b?(b=H,R=z,S=C<S?C:S):H===b&&C<S&&(S=C,R=z)}return R||P-w},o.prototype._chooseSplitAxis=function(x,w,P){var R=x.leaf?this.compareMinX:u,b=x.leaf?this.compareMinY:E,S=this._allDistMargin(x,w,P,R),z=this._allDistMargin(x,w,P,b);S<z&&x.children.sort(R)},o.prototype._allDistMargin=function(x,w,P,R){x.children.sort(R);for(var b=this.toBBox,S=l(x,0,w,b),z=l(x,P-w,P,b),V=c(S)+c(z),M=w;M<P-w;M++){var H=x.children[M];f(S,x.leaf?b(H):H),V+=c(S)}for(var C=P-w-1;C>=w;C--){var D=x.children[C];f(z,x.leaf?b(D):D),V+=c(z)}return V},o.prototype._adjustParentBBoxes=function(x,w,P){for(var R=P;R>=0;R--)f(w[R],x)},o.prototype._condense=function(x){for(var w=x.length-1,P=void 0;w>=0;w--)x[w].children.length===0?w>0?(P=x[w-1].children,P.splice(P.indexOf(x[w]),1)):this.clear():i(x[w],this.toBBox)};function r(d,x,w){if(!w)return x.indexOf(d);for(var P=0;P<x.length;P++)if(w(d,x[P]))return P;return-1}function i(d,x){l(d,0,d.children.length,x,d)}function l(d,x,w,P,R){R||(R=y(null)),R.minX=1/0,R.minY=1/0,R.maxX=-1/0,R.maxY=-1/0;for(var b=x;b<w;b++){var S=d.children[b];f(R,d.leaf?P(S):S)}return R}function f(d,x){return d.minX=Math.min(d.minX,x.minX),d.minY=Math.min(d.minY,x.minY),d.maxX=Math.max(d.maxX,x.maxX),d.maxY=Math.max(d.maxY,x.maxY),d}function u(d,x){return d.minX-x.minX}function E(d,x){return d.minY-x.minY}function a(d){return(d.maxX-d.minX)*(d.maxY-d.minY)}function c(d){return d.maxX-d.minX+(d.maxY-d.minY)}function m(d,x){return(Math.max(x.maxX,d.maxX)-Math.min(x.minX,d.minX))*(Math.max(x.maxY,d.maxY)-Math.min(x.minY,d.minY))}function h(d,x){var w=Math.max(d.minX,x.minX),P=Math.max(d.minY,x.minY),R=Math.min(d.maxX,x.maxX),b=Math.min(d.maxY,x.maxY);return Math.max(0,R-w)*Math.max(0,b-P)}function g(d,x){return d.minX<=x.minX&&d.minY<=x.minY&&x.maxX<=d.maxX&&x.maxY<=d.maxY}function T(d,x){return x.minX<=d.maxX&&x.minY<=d.maxY&&x.maxX>=d.minX&&x.maxY>=d.minY}function y(d){return{children:d,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function p(d,x,w,P,R){for(var b=[x,w];b.length;)if(w=b.pop(),x=b.pop(),!(w-x<=P)){var S=x+Math.ceil((w-x)/P/2)*P;e(d,S,x,w,R),b.push(x,S,S,w)}}return o})});var Ao=Ce((Yn,Gn)=>{(function(e,t){typeof Yn=="object"&&typeof Gn<"u"?Gn.exports=t():typeof define=="function"&&define.amd?define(t):(e=e||self,e.TinyQueue=t())})(Yn,function(){"use strict";var e=function(s,o){if(s===void 0&&(s=[]),o===void 0&&(o=t),this.data=s,this.length=this.data.length,this.compare=o,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};e.prototype.push=function(s){this.data.push(s),this.length++,this._up(this.length-1)},e.prototype.pop=function(){if(this.length!==0){var s=this.data[0],o=this.data.pop();return this.length--,this.length>0&&(this.data[0]=o,this._down(0)),s}},e.prototype.peek=function(){return this.data[0]},e.prototype._up=function(s){for(var o=this,r=o.data,i=o.compare,l=r[s];s>0;){var f=s-1>>1,u=r[f];if(i(l,u)>=0)break;r[s]=u,s=f}r[s]=l},e.prototype._down=function(s){for(var o=this,r=o.data,i=o.compare,l=this.length>>1,f=r[s];s<l;){var u=(s<<1)+1,E=r[u],a=u+1;if(a<this.length&&i(r[a],E)<0&&(u=a,E=r[a]),i(E,f)>=0)break;r[s]=E,s=u}r[s]=f};function t(n,s){return n<s?-1:n>s?1:0}return e})});var Oo=Ce((Sf,Fo)=>{Fo.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=(o-s)/2,u=0,E=f-1;u<f;E=u++){var a=n[s+u*2+0],c=n[s+u*2+1],m=n[s+E*2+0],h=n[s+E*2+1],g=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;g&&(l=!l)}return l}});var Wo=Ce((zf,No)=>{No.exports=function(t,n,s,o){var r=t[0],i=t[1],l=!1;s===void 0&&(s=0),o===void 0&&(o=n.length);for(var f=o-s,u=0,E=f-1;u<f;E=u++){var a=n[u+s][0],c=n[u+s][1],m=n[E+s][0],h=n[E+s][1],g=c>i!=h>i&&r<(m-a)*(i-c)/(h-c)+a;g&&(l=!l)}return l}});var $o=Ce((Vf,Tn)=>{var jo=Oo(),qo=Wo();Tn.exports=function(t,n,s,o){return n.length>0&&Array.isArray(n[0])?qo(t,n,s,o):jo(t,n,s,o)};Tn.exports.nested=qo;Tn.exports.flat=jo});var Yo=Ce((Pn,Xo)=>{(function(e,t){typeof Pn=="object"&&typeof Xo<"u"?t(Pn):typeof define=="function"&&define.amd?define(["exports"],t):t((e=e||self).predicates={})})(Pn,function(e){"use strict";let n=33306690738754706e-32;function s(m,h,g,T,y){let p,d,x,w,P=h[0],R=T[0],b=0,S=0;R>P==R>-P?(p=P,P=h[++b]):(p=R,R=T[++S]);let z=0;if(b<m&&S<g)for(R>P==R>-P?(x=p-((d=P+p)-P),P=h[++b]):(x=p-((d=R+p)-R),R=T[++S]),p=d,x!==0&&(y[z++]=x);b<m&&S<g;)R>P==R>-P?(x=p-((d=p+P)-(w=d-p))+(P-w),P=h[++b]):(x=p-((d=p+R)-(w=d-p))+(R-w),R=T[++S]),p=d,x!==0&&(y[z++]=x);for(;b<m;)x=p-((d=p+P)-(w=d-p))+(P-w),P=h[++b],p=d,x!==0&&(y[z++]=x);for(;S<g;)x=p-((d=p+R)-(w=d-p))+(R-w),R=T[++S],p=d,x!==0&&(y[z++]=x);return p===0&&z!==0||(y[z++]=p),z}function o(m){return new Float64Array(m)}let r=33306690738754716e-32,i=22204460492503146e-32,l=11093356479670487e-47,f=o(4),u=o(8),E=o(12),a=o(16),c=o(4);e.orient2d=function(m,h,g,T,y,p){let d=(h-p)*(g-y),x=(m-y)*(T-p),w=d-x;if(d===0||x===0||d>0!=x>0)return w;let P=Math.abs(d+x);return Math.abs(w)>=r*P?w:-(function(R,b,S,z,V,M,H){let C,D,B,_,k,v,A,j,$,Z,Y,tt,it,ct,ut,q,W,U,wt=R-V,Ft=S-V,Nt=b-M,jt=z-M;k=(ut=(j=wt-(A=(v=134217729*wt)-(v-wt)))*(Z=jt-($=(v=134217729*jt)-(v-jt)))-((ct=wt*jt)-A*$-j*$-A*Z))-(Y=ut-(W=(j=Nt-(A=(v=134217729*Nt)-(v-Nt)))*(Z=Ft-($=(v=134217729*Ft)-(v-Ft)))-((q=Nt*Ft)-A*$-j*$-A*Z))),f[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),f[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,f[2]=tt-(U-k)+(Y-k),f[3]=U;let Lt=(function(Bt,J){let ft=J[0];for(let Q=1;Q<Bt;Q++)ft+=J[Q];return ft})(4,f),Tt=i*H;if(Lt>=Tt||-Lt>=Tt||(C=R-(wt+(k=R-wt))+(k-V),B=S-(Ft+(k=S-Ft))+(k-V),D=b-(Nt+(k=b-Nt))+(k-M),_=z-(jt+(k=z-jt))+(k-M),C===0&&D===0&&B===0&&_===0)||(Tt=l*H+n*Math.abs(Lt),(Lt+=wt*_+jt*C-(Nt*B+Ft*D))>=Tt||-Lt>=Tt))return Lt;k=(ut=(j=C-(A=(v=134217729*C)-(v-C)))*(Z=jt-($=(v=134217729*jt)-(v-jt)))-((ct=C*jt)-A*$-j*$-A*Z))-(Y=ut-(W=(j=D-(A=(v=134217729*D)-(v-D)))*(Z=Ft-($=(v=134217729*Ft)-(v-Ft)))-((q=D*Ft)-A*$-j*$-A*Z))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,c[2]=tt-(U-k)+(Y-k),c[3]=U;let It=s(4,f,4,c,u);k=(ut=(j=wt-(A=(v=134217729*wt)-(v-wt)))*(Z=_-($=(v=134217729*_)-(v-_)))-((ct=wt*_)-A*$-j*$-A*Z))-(Y=ut-(W=(j=Nt-(A=(v=134217729*Nt)-(v-Nt)))*(Z=B-($=(v=134217729*B)-(v-B)))-((q=Nt*B)-A*$-j*$-A*Z))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,c[2]=tt-(U-k)+(Y-k),c[3]=U;let Pt=s(It,u,4,c,E);k=(ut=(j=C-(A=(v=134217729*C)-(v-C)))*(Z=_-($=(v=134217729*_)-(v-_)))-((ct=C*_)-A*$-j*$-A*Z))-(Y=ut-(W=(j=D-(A=(v=134217729*D)-(v-D)))*(Z=B-($=(v=134217729*B)-(v-B)))-((q=D*B)-A*$-j*$-A*Z))),c[0]=ut-(Y+k)+(k-W),k=(it=ct-((tt=ct+Y)-(k=tt-ct))+(Y-k))-(Y=it-q),c[1]=it-(Y+k)+(k-q),k=(U=tt+Y)-tt,c[2]=tt-(U-k)+(Y-k),c[3]=U;let bt=s(Pt,E,4,c,a);return a[bt-1]})(m,h,g,T,y,p,P)},e.orient2dfast=function(m,h,g,T,y,p){return(h-p)*(g-y)-(m-y)*(T-p)},Object.defineProperty(e,"__esModule",{value:!0})})});var Qo=Ce((Mf,Jn)=>{"use strict";var Go=Lo(),Sn=Ao(),vr=$o(),Hr=Yo().orient2d;Sn.default&&(Sn=Sn.default);Jn.exports=Jo;Jn.exports.default=Jo;function Jo(e,t,n){t=Math.max(0,t===void 0?2:t),n=n||0;var s=Dr(e),o=new Go(16);o.toBBox=function(p){return{minX:p[0],minY:p[1],maxX:p[0],maxY:p[1]}},o.compareMinX=function(p,d){return p[0]-d[0]},o.compareMinY=function(p,d){return p[1]-d[1]},o.load(e);for(var r=[],i=0,l;i<s.length;i++){var f=s[i];o.remove(f),l=Ko(f,l),r.push(l)}var u=new Go(16);for(i=0;i<r.length;i++)u.insert(Zn(r[i]));for(var E=t*t,a=n*n;r.length;){var c=r.shift(),m=c.p,h=c.next.p,g=Un(m,h);if(!(g<a)){var T=g/E;f=Br(o,c.prev.p,m,h,c.next.next.p,T,u),f&&Math.min(Un(f,m),Un(f,h))<=T&&(r.push(c),r.push(Ko(f,c)),o.remove(f),u.remove(c),u.insert(Zn(c)),u.insert(Zn(c.next)))}}c=l;var y=[];do y.push(c.p),c=c.next;while(c!==l);return y.push(c.p),y}function Br(e,t,n,s,o,r,i){for(var l=new Sn([],_r),f=e.data;f;){for(var u=0;u<f.children.length;u++){var E=f.children[u],a=f.leaf?Kn(E,n,s):kr(n,s,E);a>r||l.push({node:E,dist:a})}for(;l.length&&!l.peek().node.children;){var c=l.pop(),m=c.node,h=Kn(m,t,n),g=Kn(m,s,o);if(c.dist<h&&c.dist<g&&Uo(n,m,i)&&Uo(s,m,i))return m}f=l.pop(),f&&(f=f.node)}return null}function _r(e,t){return e.dist-t.dist}function kr(e,t,n){if(Zo(e,n)||Zo(t,n))return 0;var s=Rn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.maxX,n.minY);if(s===0)return 0;var o=Rn(e[0],e[1],t[0],t[1],n.minX,n.minY,n.minX,n.maxY);if(o===0)return 0;var r=Rn(e[0],e[1],t[0],t[1],n.maxX,n.minY,n.maxX,n.maxY);if(r===0)return 0;var i=Rn(e[0],e[1],t[0],t[1],n.minX,n.maxY,n.maxX,n.maxY);return i===0?0:Math.min(s,o,r,i)}function Zo(e,t){return e[0]>=t.minX&&e[0]<=t.maxX&&e[1]>=t.minY&&e[1]<=t.maxY}function Uo(e,t,n){for(var s=Math.min(e[0],t[0]),o=Math.min(e[1],t[1]),r=Math.max(e[0],t[0]),i=Math.max(e[1],t[1]),l=n.search({minX:s,minY:o,maxX:r,maxY:i}),f=0;f<l.length;f++)if(Cr(l[f].p,l[f].next.p,e,t))return!1;return!0}function Ze(e,t,n){return Hr(e[0],e[1],t[0],t[1],n[0],n[1])}function Cr(e,t,n,s){return e!==s&&t!==n&&Ze(e,t,n)>0!=Ze(e,t,s)>0&&Ze(n,s,e)>0!=Ze(n,s,t)>0}function Zn(e){var t=e.p,n=e.next.p;return e.minX=Math.min(t[0],n[0]),e.minY=Math.min(t[1],n[1]),e.maxX=Math.max(t[0],n[0]),e.maxY=Math.max(t[1],n[1]),e}function Dr(e){for(var t=e[0],n=e[0],s=e[0],o=e[0],r=0;r<e.length;r++){var i=e[r];i[0]<t[0]&&(t=i),i[0]>s[0]&&(s=i),i[1]<n[1]&&(n=i),i[1]>o[1]&&(o=i)}var l=[t,n,s,o],f=l.slice();for(r=0;r<e.length;r++)vr(e[r],l)||f.push(e[r]);return Lr(f)}function Ko(e,t){var n={p:e,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return t?(n.next=t.next,n.prev=t,t.next.prev=n,t.next=n):(n.prev=n,n.next=n),n}function Un(e,t){var n=e[0]-t[0],s=e[1]-t[1];return n*n+s*s}function Kn(e,t,n){var s=t[0],o=t[1],r=n[0]-s,i=n[1]-o;if(r!==0||i!==0){var l=((e[0]-s)*r+(e[1]-o)*i)/(r*r+i*i);l>1?(s=n[0],o=n[1]):l>0&&(s+=r*l,o+=i*l)}return r=e[0]-s,i=e[1]-o,r*r+i*i}function Rn(e,t,n,s,o,r,i,l){var f=n-e,u=s-t,E=i-o,a=l-r,c=e-o,m=t-r,h=f*f+u*u,g=f*E+u*a,T=E*E+a*a,y=f*c+u*m,p=E*c+a*m,d=h*T-g*g,x,w,P,R,b=d,S=d;d===0?(w=0,b=1,R=p,S=T):(w=g*p-T*y,R=h*p-g*y,w<0?(w=0,R=p,S=T):w>b&&(w=b,R=p+g,S=T)),R<0?(R=0,-y<0?w=0:-y>h?w=b:(w=-y,b=h)):R>S&&(R=S,-y+g<0?w=0:-y+g>h?w=b:(w=-y+g,b=h)),x=w===0?0:w/b,P=R===0?0:R/S;var z=(1-x)*e+x*n,V=(1-x)*t+x*s,M=(1-P)*o+P*i,H=(1-P)*r+P*l,C=M-z,D=H-V;return C*C+D*D}function Ir(e,t){return e[0]===t[0]?e[1]-t[1]:e[0]-t[0]}function Lr(e){e.sort(Ir);for(var t=[],n=0;n<e.length;n++){for(;t.length>=2&&Ze(t[t.length-2],t[t.length-1],e[n])<=0;)t.pop();t.push(e[n])}for(var s=[],o=e.length-1;o>=0;o--){for(;s.length>=2&&Ze(s[s.length-2],s[s.length-1],e[o])<=0;)s.pop();s.push(e[o])}return s.pop(),t.pop(),t.concat(s)}});import*as Ie from"three";import*as De from"three";var Ht=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),E=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*E,this.y=l*a*(1-u)+o*u+(f*s-i*r)*E,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*E,this}},cn=class{constructor(t=new Ht(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new Ht().subVectors(n,t),r=new Ht().subVectors(s,t),i=new Ht().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new Ht){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},ln=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),_n=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new Ht(t.start.x,t.start.y,t.start.z),l=new Ht(t.end.x,t.end.y,t.end.z),f=new Ht(t.end.x,t.end.y,t.rooftopPz),u=new Ht(t.start.x,t.start.y,t.rooftopPz),E=[i,l,f,u];for(let R=0;R<E.length;R++)if(!this.isValidVector3(E[R]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${R}\u65E0\u6548:`,E[R]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,h=c/n,g=new Ht().subVectors(l,i).normalize(),T=i.x,y=i.y,p=i.z,d=g.x,x=g.y,w=g.z,P=(R,b)=>new Ht(T+d*R,y+x*R,p+w*R+b);for(let R=0;R<n;R++){let b=R*h,S=(R+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[P(V,b),P(M,b),P(M,S),P(V,S)],userData:{type:"wallSegment",row:R,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=ln(),l=[],f=new Map,u=1/0,E=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let H=this.getWorldVerticesNew(M.points);if(H.length<4)continue;let C=new Ht().add(H[0]).add(H[1]).add(H[2]).add(H[3]).multiplyScalar(.25);M.userData.center=C,M.vertices=H;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>E&&(E=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=ln()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=ln()-i,this.printAnalysisResults(),this.results;let g=h.vertices[0],T=h.vertices[1],y=h.vertices[3],p=new Ht().subVectors(T,g).normalize(),d=new Ht().subVectors(y,g).normalize(),x=h.userData.width,w=h.userData.height,P=E-u+1,R=c-a+1,b=new cn;b.setFromCoplanarPoints(g,T,y);let S=new Ht,z=new Ht;for(let V=0;V<n.length;V+=3){let M=new Ht(n[V],n[V+1],n[V+2]),H=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(H))>s)continue;S.subVectors(H,g);let D=S.dot(p),B=S.dot(d),_=Math.ceil((D-s)/x-1),k=Math.floor((D+s)/x),v=Math.ceil((B-s)/w-1),A=Math.floor((B+s)/w);if(k<0||_>R-1||A<0||v>P-1)continue;let j=Math.max(0,_),$=Math.min(R-1,k),Z=Math.max(0,v),Y=Math.min(P-1,A);for(let tt=Z;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=$;ct++){let ut=a+ct,q=`row${it}_col${ut}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,H=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,C=H>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:H,hasPointsButNotEnough:H>0&&H<1};C?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=ln()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,E,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new Ht().subVectors(t,n),h=Math.abs(m.dot(r)),g=Math.abs(m.dot(i));if(h>u&&g>E)return!1;let T=new Ht().subVectors(t,o),y=T.dot(r),p=T.dot(i),d=y>=-a&&y<=l+a,x=p>=-a&&p<=f+a;return d&&x}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let E=`row${u.userData.row}_col${u.userData.col}`,a=r.has(E);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:E,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,E]of r){let a=i.get(E.row)?.get(E.col);if(a&&!a.visited){let c=[],m=[[E.row,E.col]],h=0;for(a.visited=!0;h<m.length;){let g=m[h++],T=g[0],y=g[1],p=`row${T}_col${y}`;r.has(p)&&c.push(r.get(p));for(let d of f){let x=T+d[0],w=y+d[1];if(i.has(x)&&i.get(x).has(w)){let P=i.get(x).get(w);!P.visited&&P.isEmpty&&(P.visited=!0,m.push([x,w]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,E)=>E.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},io=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new De.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new De.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},vs=(e,t)=>{let n=new Ht().copy(e.start).add(e.end).multiplyScalar(.5),s=new Ht().subVectors(new Ht(n.x,n.y,n.z+1),n).normalize(),o=new Ht(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new Ht().copy(n).add(o.clone().multiplyScalar(e.length)),i=new Ht().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new De.Vector3(r.x,r.y,r.z),end:new De.Vector3(i.x,i.y,i.z),center:new De.Vector3(n.x,n.y,n.z),direction:new De.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},lo=async(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];await kn(o,t,n)}},kn=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new cn().setFromCoplanarPoints(new Ht(e.start.x,e.start.y,e.start.z),new Ht(e.end.x,e.end.y,e.end.z),new Ht(e.start.x,e.start.y,e.rooftopPz)),o=new Ht(e.start.x,e.start.y,e.start.z).distanceTo(new Ht(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new _n,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let E=i.highlightEmptySegments(u,null,null),a=[];if(E&&E.clusters)for(let h of E.clusters){let g=io(h,n);g&&a.push(g)}let m=vs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],g=io(i.results.existSegments,n);g&&h.push(g),e.existSegments=h}};var kt=class e{constructor(t=0,n=0,s=0){this.x=t,this.y=n,this.z=s}set(t,n,s){return this.x=t,this.y=n,this.z=s,this}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}clone(){return new e(this.x,this.y,this.z)}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}crossVectors(t,n){let s=t.x,o=t.y,r=t.z,i=n.x,l=n.y,f=n.z;return this.x=o*f-r*l,this.y=r*i-s*f,this.z=s*l-o*i,this}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}normalize(){let t=this.length();return t>0&&(this.x/=t,this.y/=t,this.z/=t),this}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let n=this.x-t.x,s=this.y-t.y,o=this.z-t.z;return n*n+s*s+o*o}toArray(){return[this.x,this.y,this.z]}fromArray(t,n=0){return this.x=t[n],this.y=t[n+1],this.z=t[n+2],this}applyAxisAngle(t,n){let s=this.x,o=this.y,r=this.z,i=t.x,l=t.y,f=t.z,u=Math.cos(n),E=Math.sin(n),a=i*s+l*o+f*r;return this.x=i*a*(1-u)+s*u+(-f*o+l*r)*E,this.y=l*a*(1-u)+o*u+(f*s-i*r)*E,this.z=f*a*(1-u)+r*u+(-l*s+i*o)*E,this}},fn=class{constructor(t=new kt(1,0,0),n=0){this.normal=t,this.constant=n}set(t,n){return this.normal.copy(t),this.constant=n,this}setFromNormalAndCoplanarPoint(t,n){return this.normal.copy(t),this.constant=-n.dot(this.normal),this}setFromCoplanarPoints(t,n,s){let o=new kt().subVectors(n,t),r=new kt().subVectors(s,t),i=new kt().crossVectors(o,r).normalize();return this.normal.copy(i),this.constant=-t.dot(this.normal),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}projectPoint(t,n=new kt){let s=this.distanceToPoint(t);return n.copy(t),n.x-=this.normal.x*s,n.y-=this.normal.y*s,n.z-=this.normal.z*s,n}},an=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),Cn=class{constructor(){this.results=null,this.clusterResults=null}initLimits1(t,n){let s,o;return t<.3?s=5:t<.5?s=8:t<.8?s=10:t<1?s=15:t<2?s=30:t<3?s=35:t<4?s=40:t<5?s=45:t<6?s=50:t<7?s=60:t<8.5?s=70:t<10?s=80:t<15?s=100:t<20?s=120:t<25?s=140:t<30?s=160:t<35?s=180:t<40?s=200:t<45?s=230:t<50?s=250:s=350,n<1?o=30:n<2?o=40:n<2.5?o=45:n<3?o=60:n<3.6?o=70:o=80,{horizontalSubdivisions:s,verticalSubdivisions:o}}initLimits2(t,n){let r=Math.round(Math.max(5,Math.min(350,t/.08))),i=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:r,verticalSubdivisions:i}}initLimits3(t,n){let s;t<2?s=.06:t<10?s=.1:s=.15;let o=Math.round(Math.max(5,Math.min(350,t/s))),r=Math.round(Math.max(30,Math.min(80,n/.06)));return{horizontalSubdivisions:o,verticalSubdivisions:r}}initLimits4(t,n){let s=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(t)))),o=Math.round(Math.max(30,Math.min(80,20*Math.sqrt(n))));return{horizontalSubdivisions:s,verticalSubdivisions:o}}createSubdividedWallPlane(t,n,s,o=null){let r=[];if(!t||!t.start||!t.end||isNaN(t.rooftopPz))return r;let i=new kt(t.start.x,t.start.y,t.start.z),l=new kt(t.end.x,t.end.y,t.end.z),f=new kt(t.end.x,t.end.y,t.rooftopPz),u=new kt(t.start.x,t.start.y,t.rooftopPz),E=[i,l,f,u];for(let R=0;R<E.length;R++)if(!this.isValidVector3(E[R]))return console.error(`\u5899\u4F53\u57FA\u7840\u70B9${R}\u65E0\u6548:`,E[R]),r;let a=i.distanceTo(l),c=Math.abs(t.rooftopPz-t.start.z);if(a===0||c===0)return console.error("\u5899\u4F53\u5BBD\u5EA6\u6216\u9AD8\u5EA6\u4E3A0"),console.log("line.rooftopPz",t.rooftopPz),console.log("bottomLeft",i),console.log("bottomRight",l),console.log(t.length),r;let m=a/s,h=c/n,g=new kt().subVectors(l,i).normalize(),T=i.x,y=i.y,p=i.z,d=g.x,x=g.y,w=g.z,P=(R,b)=>new kt(T+d*R,y+x*R,p+w*R+b);for(let R=0;R<n;R++){let b=R*h,S=(R+1)*h;for(let z=0;z<s;z++){let V=z*m,M=(z+1)*m;r.push({points:[P(V,b),P(M,b),P(M,S),P(V,S)],userData:{type:"wallSegment",row:R,col:z,width:m,height:h}})}}return r}analyzePointDistribution(t,n,s=.01,o={}){let r=o.projectPlane||null;this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],existSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:s,analysisTime:null};let i=an(),l=[],f=new Map,u=1/0,E=-1/0,a=1/0,c=-1/0;for(let V=0;V<t.length;V++){let M=t[V];if(M.userData&&M.userData.type==="wallSegment"){let H=this.getWorldVerticesNew(M.points);if(H.length<4)continue;let C=new kt().add(H[0]).add(H[1]).add(H[2]).add(H[3]).multiplyScalar(.25);M.userData.center=C,M.vertices=H;let D=M.userData.row,B=M.userData.col,_=`row${D}_col${B}`;l.push(M),f.set(_,M),D<u&&(u=D),D>E&&(E=D),B<a&&(a=B),B>c&&(c=B)}}if(this.results.totalSegments=l.length,l.length===0)return this.results.analysisTime=an()-i,this.printAnalysisResults(),this.results;let m=`row${u}_col${a}`,h=f.get(m)||l[0];if(!h||!h.vertices||h.vertices.length<4)return this.results.analysisTime=an()-i,this.printAnalysisResults(),this.results;let g=h.vertices[0],T=h.vertices[1],y=h.vertices[3],p=new kt().subVectors(T,g).normalize(),d=new kt().subVectors(y,g).normalize(),x=h.userData.width,w=h.userData.height,P=E-u+1,R=c-a+1,b=new fn;b.setFromCoplanarPoints(g,T,y);let S=new kt,z=new kt;for(let V=0;V<n.length;V++){let M=n[V],H=r?r.projectPoint(M,z):M;if(Math.abs(b.distanceToPoint(H))>s)continue;S.subVectors(H,g);let D=S.dot(p),B=S.dot(d),_=Math.ceil((D-s)/x-1),k=Math.floor((D+s)/x),v=Math.ceil((B-s)/w-1),A=Math.floor((B+s)/w);if(k<0||_>R-1||A<0||v>P-1)continue;let j=Math.max(0,_),$=Math.min(R-1,k),Z=Math.max(0,v),Y=Math.min(P-1,A);for(let tt=Z;tt<=Y;tt++){let it=u+tt;for(let ct=j;ct<=$;ct++){let ut=a+ct,q=`row${it}_col${ut}`;f.has(q)&&(this.results.pointsInSegments.has(q)||this.results.pointsInSegments.set(q,[V]))}}}for(let V of l){let M=`row${V.userData.row}_col${V.userData.col}`,H=this.results.pointsInSegments.has(M)?this.results.pointsInSegments.get(M).length:0,C=H>=1,D={row:V.userData.row,col:V.userData.col,width:V.userData.width,height:V.userData.height,segmentKey:M,vertices:V.vertices,center:V.userData.center,mesh:V,pointCount:H,hasPointsButNotEnough:H>0&&H<1};C?(this.results.segmentsWithPoints++,this.results.existSegments.push(D)):(this.results.segmentsWithoutPoints++,this.results.missingSegments.push(D))}return this.results.analysisTime=an()-i,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(t,n,s,o,r,i,l,f,u,E,a){if(Math.abs(s.distanceToPoint(t))>a)return!1;let m=new kt().subVectors(t,n),h=Math.abs(m.dot(r)),g=Math.abs(m.dot(i));if(h>u&&g>E)return!1;let T=new kt().subVectors(t,o),y=T.dot(r),p=T.dot(i),d=y>=-a&&y<=l+a,x=p>=-a&&p<=f+a;return d&&x}getWorldVerticesNew(t){return t}highlightEmptySegments(t,n=null,s=null,o=1){if(!this.results)return console.warn("\u8BF7\u5148\u8FD0\u884C\u5206\u6790\u51FD\u6570"),null;let r=new Map,i=new Map;for(let u of this.results.missingSegments)r.set(u.segmentKey,u),i.has(u.row)||i.set(u.row,new Map),i.get(u.row).set(u.col,{segmentKey:u.segmentKey,isEmpty:!0,visited:!1});for(let u of t)if(u.userData&&u.userData.type==="wallSegment"){let E=`row${u.userData.row}_col${u.userData.col}`,a=r.has(E);i.has(u.userData.row)||i.set(u.userData.row,new Map),i.get(u.userData.row).has(u.userData.col)||i.get(u.userData.row).set(u.userData.col,{segmentKey:E,isEmpty:a,visited:!1})}let l=[],f=[[0,1],[1,0],[0,-1],[-1,0]];for(let[u,E]of r){let a=i.get(E.row)?.get(E.col);if(a&&!a.visited){let c=[],m=[[E.row,E.col]],h=0;for(a.visited=!0;h<m.length;){let g=m[h++],T=g[0],y=g[1],p=`row${T}_col${y}`;r.has(p)&&c.push(r.get(p));for(let d of f){let x=T+d[0],w=y+d[1];if(i.has(x)&&i.get(x).has(w)){let P=i.get(x).get(w);!P.visited&&P.isEmpty&&(P.visited=!0,m.push([x,w]))}}}c.length>=o&&l.push(c)}}return this.clusterResults={clusters:l.sort((u,E)=>E.length-u.length),totalClusters:l.length},this.clusterResults}getClusterInfo(){if(!this.clusterResults)return null;let t=this.clusterResults.clusters.map(n=>n.length);return{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((n,s)=>({clusterIndex:s,size:n.length,segments:n.map(o=>o.segmentKey)})),largestCluster:t.length?Math.max(...t):0,smallestCluster:t.length?Math.min(...t):0}}printAnalysisResults(){if(!this.results){console.warn("\u6CA1\u6709\u53EF\u7528\u7684\u5206\u6790\u7ED3\u679C");return}}isValidVector3(t){return t&&!isNaN(t.x)&&!isNaN(t.y)&&!isNaN(t.z)&&isFinite(t.x)&&isFinite(t.y)&&isFinite(t.z)}},co=(e,t)=>{let n={},s=[],o=[];if(!e||e.length===0)return n.originalVertices=s,n.allCenterPoints=o,n;if(t=="xyz")for(let r of e){o.push({x:r.center.x,y:r.center.y,z:r.center.z});let i=[];for(let l=0;l<r.vertices.length;l++)i.push({x:r.vertices[l].x,y:r.vertices[l].y,z:r.vertices[l].z});s.push(i)}else if(t=="three")for(let r of e){o.push(new Ie.Vector3(r.center.x,r.center.y,r.center.z));let i=[];for(let l=0;l<r.vertices.length;l++)i.push(new Ie.Vector3(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z));s.push(i)}else if(t=="array")for(let r of e){o.push(r.center.x),o.push(r.center.y),o.push(r.center.z);let i=[];for(let l=0;l<r.vertices.length;l++)i.push(r.vertices[l].x,r.vertices[l].y,r.vertices[l].z);s.push(i)}return n.originalVertices=s,n.allCenterPoints=o,n},Hs=(e,t)=>{let n=new kt().copy(e.start).add(e.end).multiplyScalar(.5),s=new kt().subVectors(new kt(n.x,n.y,n.z+1),n).normalize(),o=new kt(e.direction.x,e.direction.y,0);o.applyAxisAngle(s,Math.PI/2);let r=new kt().copy(n).add(o.clone().multiplyScalar(e.length)),i=new kt().copy(n).sub(o.clone().multiplyScalar(e.length));if(n.z=e.start.z,r.z=e.start.z,i.z=e.start.z,t=="three")return{start:new Ie.Vector3(r.x,r.y,r.z),end:new Ie.Vector3(i.x,i.y,i.z),center:new Ie.Vector3(n.x,n.y,n.z),direction:new Ie.Vector3(o.x,o.y,o.z)};if(t=="xyz")return{start:{x:r.x,y:r.y,z:r.z},end:{x:i.x,y:i.y,z:i.z},center:{x:n.x,y:n.y,z:n.z},direction:{x:o.x,y:o.y,z:o.z}};if(t=="array")return{start:[r.x,r.y,r.z],end:[i.x,i.y,i.z],center:[n.x,n.y,n.z],direction:[o.x,o.y,o.z]}},Bs=(e,t=!0,n="three",s="xyz")=>{s=="xyz"?ao(e,t,n):s=="array"&&kn(e,t,n)},_s=(e,t=!0,n="three",s="xyz")=>{s=="xyz"?ks(e,t,n):s=="array"&&lo(e,t,n)},ks=(e,t=!0,n="three")=>{for(let s=0;s<e.length;s++){let o=e[s];ao(o,t,n)}},ao=(e,t=!0,n="three")=>{if((e.isBayWindow||e.isWindow||e.isBalconyRailing)&&t)return;let s=new fn().setFromCoplanarPoints(new kt(e.start.x,e.start.y,e.start.z),new kt(e.end.x,e.end.y,e.end.z),new kt(e.start.x,e.start.y,e.rooftopPz)),o=new kt(e.start.x,e.start.y,e.start.z).distanceTo(new kt(e.end.x,e.end.y,e.end.z)),r=Math.abs(e.rooftopPz-e.start.z),i=new Cn,{horizontalSubdivisions:l,verticalSubdivisions:f}=i.initLimits4(o,r),u=i.createSubdividedWallPlane(e,f,l,null);i.analyzePointDistribution(u,e.originalPoints,.01,{projectPlane:s});let E=i.highlightEmptySegments(u,null,null),a=[];if(E&&E.clusters)for(let h of E.clusters){let g=co(h,n);g&&a.push(g)}let m=Hs(e,n).direction;if(e.checkResults=a,e.verticalDirection=m,e.saveExistSegments){let h=[],g=co(i.results.existSegments,n);g&&h.push(g),e.existSegments=h}};import*as I from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";import*as O from"three";import{CSS2DObject as Ai}from"three/examples/jsm/renderers/CSS2DRenderer.js";import"three/examples/jsm/utils/BufferGeometryUtils.js";import Ee from"path";import{fileURLToPath as Is}from"url";import un from"path";import{fileURLToPath as Cs}from"url";import{Vector3 as gi}from"three";var Ds=Cs(import.meta.url),Dn=un.dirname(Ds),yi=un.resolve(Dn,"./data/lines.meta.json"),Ei=un.resolve(Dn,"./data/lines.bin"),xi=un.resolve(Dn,"./data/checks.bin");var Ls=Is(import.meta.url),Se=Ee.dirname(Ls),Si=Ee.resolve(Se,"./data/lines.tmp.bin"),zi=Ee.resolve(Se,"./data/checks.tmp.bin"),Vi=Ee.resolve(Se,"./data/lines.new_points.tmp.bin"),Mi=Ee.resolve(Se,"./data/lines.new_points.bin"),vi=Ee.resolve(Se,"./data/lines.meta.json"),Hi=Ee.resolve(Se,"./data/lines.bin"),Bi=Ee.resolve(Se,"./data/checks.bin"),_i=Ee.resolve(Se,"./data/lines.exist_segments.bin"),ki=Ee.resolve(Se,"./data/lines.exist_segments.tmp.bin");import{Vector3 as As}from"three";var hn=class{points=[];_tempArr=[0,0,0];constructor(t){}initPoints(t){this.points=t}getPointByIndex(t,n){let s=t*3;return n.x=this.points[s],n.y=this.points[s+1],n.z=this.points[s+2],n}getPointArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1],this.points[n+2]]}getPoint2ArrByIndex(t){let n=t*3;return[this.points[n],this.points[n+1]]}getIndexsByIndex(t,n){n.length=0,n.push(t*3),n.push(t*3+1),n.push(t*3+2)}pointsToVector3Arr(t){let n=[];for(let s=0;s<t.length/3;s++)n.push(new As(t[s*3],t[s*3+1],t[s*3+2]));return n}vector3ArrToPoints(t){let n=[];for(let s=0;s<t.length;s++)n.push(t[s].x,t[s].y,t[s].z);return n}vector3ArrToFloat32Array(t){return new Float32Array(t.flatMap(s=>[s.x,s.y,s.z]))}clsoe(){this.points=[]}};var uo=(e,t,n)=>{let s=new O.LineBasicMaterial({color:"#0011ff"}),o=[];o.push(e),o.push(t);let r=new O.BufferGeometry;r.setFromPoints(o),r.rotateX(-Math.PI/2),n.add(new O.Line(r,s))},xe=(e,t,n,s,o=1e-8)=>{let r=t.x-e.x,i=t.y-e.y,l=s.x-n.x,f=s.y-n.y,u=r*f-i*l;if(Math.abs(u)<o)return null;let E=((n.x-e.x)*f-(n.y-e.y)*l)/u,a=((n.x-e.x)*i-(n.y-e.y)*r)/u;return E<-o||E>1+o||a<-o||a>1+o?null:{point:new O.Vector3(e.x+E*r,e.y+E*i,e.z)}},ho=(e,t,n={})=>{let{fontSize:s=36,fontFamily:o="sans-serif",backgroundColor:r="rgba(0,0,0,0)",textColor:i="#ffffff",padding:l=10,maxWidth:f=256}=n,E=document.createElement("canvas").getContext("2d");E.font=`bold ${s}px ${o}`;let c=E.measureText(e).width,m=Math.min(c+l*2,f),h=s+l*2,g=document.createElement("canvas");g.width=m,g.height=h;let T=g.getContext("2d");T.fillStyle=r,T.fillRect(0,0,m,h),T.fillStyle=i,T.font=`bold ${s}px ${o}`,T.textAlign="center",T.textBaseline="middle",c>f-l*2?Fs(T,e,m/2,h/2,f,s):T.fillText(e,m/2,h/2);let y=new O.CanvasTexture(g),p=new O.SpriteMaterial({map:y,depthTest:!1,transparent:!0}),d=new O.Sprite(p);d.position.set(t.x,t.y,t.z);let x=.005;return d.scale.set(m*x,h*x,1),d};function Fs(e,t,n,s,o,r){let i=t.split(""),l="",f=r*1.2,u=s;for(let E=0;E<i.length;E++){let a=l+i[E];e.measureText(a).width>o&&E>0?(e.fillText(l,n,u),l=i[E],u+=f):l=a}e.fillText(l,n,u)}var Kt=(e,t,n=.01)=>{let s=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),o=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(s<1e-10||o<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let r={x:e.x/s,y:e.y/s,z:e.z/s},i={x:t.x/o,y:t.y/o,z:t.z/o},l=r.x*i.x+r.y*i.y+r.z*i.z;l=Math.max(-1,Math.min(1,l));let f=Math.acos(Math.abs(l)),u=f<=n;return{parallel:u,sameDirection:u?l>0:null,angle:f}};var mo=(e,t,n,s)=>{if(t<1e-4||n<1e-4)return{};let o=e,r=[];if(s&&s.length&&(r=s.map(P=>P.clone())),!o||o.length<4)return{};let i=new O.Vector3().subVectors(o[1],o[0]).normalize(),l=new O.Vector3().subVectors(o[3],o[0]).normalize(),f=i.clone().cross(l).normalize(),u=1/0,E=-1/0,a=1/0,c=-1/0;for(let P of o){let R=P.dot(i),b=P.dot(l);R<u&&(u=R),R>E&&(E=R),b<a&&(a=b),b>c&&(c=b)}let m=o[0].dot(f),h=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),g=i.clone().multiplyScalar(E).add(l.clone().multiplyScalar(a)).add(f.clone().multiplyScalar(m)),T=i.clone().multiplyScalar(E).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),y=i.clone().multiplyScalar(u).add(l.clone().multiplyScalar(c)).add(f.clone().multiplyScalar(m)),p=[h,g,T,y],d=Kt(new O.Vector3().subVectors(h,g),new O.Vector3(0,0,1));d&&d.parallel&&(p=[h,y,T,g]);let x=0;if(s.length>0){let P=new O.Vector3().subVectors(p[1],p[0]).normalize(),R=P.clone().negate(),b=new O.Vector3().subVectors(p[3],p[0]).normalize(),S=b.clone().negate(),z=p[0].distanceTo(p[1]),V=p[0].distanceTo(p[3]),M=z/t,H=V/n,C=.001;for(let D=0;D<M;D++){let B=p[0],_=0;for(let k=0;k<H;k++){let v=B.clone().addScaledVector(P,t),A=v.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),$=new O.Vector3().add(B).add(v).add(A).add(j).multiplyScalar(.25);for(let Z=0;Z<r.length;Z++)if(r[Z].distanceTo($)<C){_++;break}B=j}if(_>=H/2)break;x+=_,p[0]=p[0].addScaledVector(P,t),p[3]=p[3].addScaledVector(P,t)}z=p[0].distanceTo(p[1]),M=z/t;for(let D=0;D<M;D++){let B=p[1],_=0;for(let k=0;k<H;k++){let v=B.clone().addScaledVector(R,t),A=v.clone().addScaledVector(b,n),j=B.clone().addScaledVector(b,n),$=new O.Vector3().add(B).add(v).add(A).add(j).multiplyScalar(.25);for(let Z=0;Z<r.length;Z++)if(r[Z].distanceTo($)<C){_++;break}B=j}if(_>=H/2)break;x+=_,p[1]=p[1].addScaledVector(R,t),p[2]=p[2].addScaledVector(R,t)}z=p[0].distanceTo(p[1]),M=z/t;for(let D=0;D<H;D++){let B=p[3],_=0;for(let k=0;k<M;k++){let v=B.clone().addScaledVector(P,t),A=v.clone().addScaledVector(S,n),j=B.clone().addScaledVector(S,n),$=new O.Vector3().add(B).add(v).add(A).add(j).multiplyScalar(.25);for(let Z=0;Z<r.length;Z++)if(r[Z].distanceTo($)<C){_++;break}B=v}if(_>=M/2)break;x+=_,p[2]=p[2].addScaledVector(S,n),p[3]=p[3].addScaledVector(S,n)}}let w=p[0].distanceTo(p[1])*p[0].distanceTo(p[3]);return{facePoints:p,boxArea:w,totalInPlaneNum:x}},Yt=(e,t,n,s,o=O.MathUtils.degToRad(8))=>{let r=new O.Vector3,i=new O.Vector3;r.subVectors(new O.Vector3(t.x,t.y,0),new O.Vector3(e.x,e.y,0)).normalize(),i.subVectors(new O.Vector3(s.x,s.y,0),new O.Vector3(n.x,n.y,0)).normalize();let l=r.dot(i),f=Math.acos(Math.min(Math.abs(l),1)),u=1-Math.min(f/o,1),E=l>0?"same":"opposite";return{parallelism:u,angle:f,angleDeg:O.MathUtils.radToDeg(f),isParallel:f<o,direction:E,vectors:{v1:r,v2:i}}},se=(e,t,n,s)=>{let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=o.length(),l=r.length();if(i===0||l===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};o.normalize(),r.normalize();let f=Math.abs(o.dot(r)),u=Math.min(1,Math.max(0,f)),E=Math.acos(u),a=O.MathUtils.radToDeg(E),c=1-u,m=1e-6;return{rate:c,percent:`${(c*100).toFixed(2)}%`,angle:a,isPerpendicular:Math.abs(a-90)<.01,isParallel:a<.01}},qt=(e,t,n=!1)=>new O.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),ye=(e,t,n,s,o={})=>{let{parallelAngleMax:r=O.MathUtils.degToRad(10),collinearAngleMax:i=O.MathUtils.degToRad(7),distanceThreshold:l=2,overlapThreshold:f=.01}=o,u=new O.Vector3().subVectors(t,e),E=new O.Vector3().subVectors(s,n),a=u.clone().normalize(),c=E.clone().normalize(),m=O.MathUtils.clamp(a.dot(c),-1,1),h=Math.acos(Math.abs(m)),g=O.MathUtils.radToDeg(h);if(h>r)return{type:"not_parallel",angleDeg:g,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&c.negate();let T=new O.Vector3().addVectors(a,c).normalize(),y=new O.Vector3().addVectors(e,t).multiplyScalar(.5),p=fo(n,y,a),d=fo(s,y,a),x=(p+d)/2,w=Math.max(p,d),P=e.dot(T),R=t.dot(T),b=n.dot(T),S=s.dot(T),z=Math.min(P,R),V=Math.max(P,R),M=Math.min(b,S),H=Math.max(b,S),C=V-z,D=H-M,B=Math.min(C,D),_=Math.min(V,H)-Math.max(z,M),k=_<0?-_:0,v=_>0?_:0,A=B>0?v/B:0,j=Os(e,t,n,s),$=h<=i&&x<l,Z;return $?Z=A>.5?"collinear_overlap":"collinear_gap":h<=r&&(Z="parallel_offset"),{type:Z,angleDeg:g,avgPerpendicularDistance:x,maxPerpendicularDistance:w,gap:k,overlap:v,closestDistance:j}};function fo(e,t,n){let s=new O.Vector3().subVectors(e,t),o=s.dot(n),r=n.clone().multiplyScalar(o);return new O.Vector3().subVectors(s,r).length()}function Os(e,t,n,s){let o=new O.Vector3().subVectors(t,e),r=new O.Vector3().subVectors(s,n),i=new O.Vector3().subVectors(n,e),l=o.dot(o),f=o.dot(r),u=r.dot(r),E=o.dot(i),a=r.dot(i),c=l*u-f*f,m,h;c<1e-10?(m=0,h=u!==0?a/u:0):(m=(f*a-u*E)/c,h=(l*a-f*E)/c),m=O.MathUtils.clamp(m,0,1),h=u!==0?O.MathUtils.clamp((f*m+a)/u,0,1):0,m=l!==0?O.MathUtils.clamp((f*h-E)/l,0,1):0;let g=e.clone().add(o.clone().multiplyScalar(m)),T=n.clone().add(r.clone().multiplyScalar(h));return g.distanceTo(T)}var dn=e=>{let t=999999,n=-999999;for(let s=0;s<e.length;s++)e[s].z>n&&(n=e[s].z),e[s].z<t&&(t=e[s].z);return{minZ:t,maxZ:n}},Qe=(e,t,n)=>{let s=new O.Plane,o=new O.Vector3(e.x,e.y,e.z),r=new O.Vector3(t.x,t.y,t.z),i=new O.Vector3(t.x,t.y,t.z+5);s.setFromCoplanarPoints(o,r,i);let l=[],f=[];n.forEach(T=>{let y=new O.Vector3;s.projectPoint(T,y),f.push(y.clone()),y.z=o.z,l.push(y)});let u=new O.Vector3,E=new O.Vector3;s.projectPoint(o,u),s.projectPoint(r,E);let a=new O.Line3(u,E),c=[],m=[],h=[],g=new O.Vector3;return l.forEach((T,y)=>{a.closestPointToPoint(T,!0,g).distanceTo(T)<.001?(c.push(n[y]),m.push(f[y])):h.push(T)}),{newOriginalPoints:c,newProjectPoints:h,newOnLinePoints:m}},po=(e,t,n)=>{function s(o,r,i,l,f,u,E,a,c){let m=new O.Line3(o,r),h=new Map,g=new O.Vector3,T=o.clone(),y=r.clone(),p=0;for(;;){let d=new Map,x=0;for(let w=0;w<c.checkResults.length;w++)if(!(c.checkResults[w].allCenterPoints.length/a*100<1))for(let R=0;R<c.checkResults[w].allCenterPoints.length;R++){if(h.has(w)&&h.get(w).removePtsIndex.includes(R))continue;let b=c.checkResults[w].allCenterPoints[R];b=new O.Vector3(b.x,b.y,b.z);let S=m.closestPointToPoint(b,!0,g),z=b.distanceTo(S);Math.abs(z-f)<.01&&(x++,d.has(w)?d.get(w).removePtsIndex.push(R):d.set(w,{index:w,removePtsIndex:[R]}))}if(p==E){o=T,r=y;break}if(x<u/20*19||x==0){d.clear(),E-p<5&&(o=T,r=y,h.clear());break}else{p++;for(let[w,P]of d)h.has(w)?h.get(w).removePtsIndex.push(...P.removePtsIndex):h.set(w,P);d.clear(),o=o.addScaledVector(i,l),r=r.addScaledVector(i,l),m.set(o,r)}}if(h.size>0&&p!=E)for(let[d,x]of h){let w=[],P=[];for(let R=0;R<c.checkResults[d].allCenterPoints.length;R++)x.removePtsIndex.includes(R)||(w.push(c.checkResults[d].allCenterPoints[R]),P.push(c.checkResults[d].originalVertices[R]));c.checkResults[d].allCenterPoints=w,c.checkResults[d].originalVertices=P}}for(let o=0;o<e.length;o++){let r=e[o];if(r.length<.5)continue;let i=-1,l=-1,f=t.readLineById(r.id);f.checkResults=t.getLineCheckReultsById(r.id),f.originalPoints=t.getOriginalPointsById(r.id),r.originalPoints=f.originalPoints,r.checkResults=f.checkResults,r.checkResults.allCenterPoints=[],f=null;for(let D=0;D<r.checkResults.length;D++)for(let B=0;B<r.checkResults[D].originalVertices.length;B++){let _=mn(r.checkResults[D].originalVertices[B]);r.checkResults.allCenterPoints.push(_)}if(!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let D=r.checkResults[0].originalVertices[0],[B,_,k,v]=D;B=new O.Vector3(B.x,B.y,B.z),_=new O.Vector3(_.x,_.y,_.z),k=new O.Vector3(k.x,k.y,k.z),v=new O.Vector3(v.x,v.y,v.z),i=B.distanceTo(_),l=B.distanceTo(v);let A=new O.Vector3().subVectors(B,_).normalize(),j=Kt(A,new O.Vector3(0,0,1));j&&j.parallel&&([l,i]=[i,l])}if(i<0||l<0)continue;let u=new O.Vector3(r.start.x,r.start.y,r.start.z),E=new O.Vector3(r.end.x,r.end.y,r.end.z),a=u.distanceTo(E),c=r.rooftopPz-r.start.z,m=Math.ceil(a/i),h=Math.ceil(c/l),g=u.clone(),T=E.clone(),y=T.clone().add(new O.Vector3(0,0,c)),p=g.clone().add(new O.Vector3(0,0,c)),d=new O.Vector3().subVectors(T,g).normalize(),x=d.clone().negate(),P=new O.Vector3().subVectors(y,g).normalize().clone().negate(),R=i/2,b=l/2,S=a*c,z=i*l,V=S/z;s(g,p,d,i,R,h,m,V,r),s(T,y,x,i,R,h,m,V,r),r.start=g,r.end=T;let{newOriginalPoints:M}=Qe(g,T,r.originalPoints);r.originalPoints=M,n.stageReplaceCheckResults(r.id,r.checkResults);let C=new hn().vector3ArrToFloat32Array(r.originalPoints);n.stageReplacePoints(r.id,C),r.checkResults=null,r.originalPoints=null}n.commit()},$t=(e,t)=>new O.Vector3(e.x,e.y,0).distanceTo(new O.Vector3(t.x,t.y,0)),In=(e,t,n=1e-6)=>{let s=new O.Vector3;return e.closestPointToPoint(t,!0,s),s.distanceTo(t)<n},Ne=e=>{let t=0,n=[];for(let s=0;s<e.length;s++)for(let o=s+1;o<e.length;o++){let r=e[s].distanceTo(e[o]);r>t&&(t=r,n=[e[s],e[o]])}return n},st=(e,t,n=.03)=>Math.abs(e.x-t.x)<n&&Math.abs(e.y-t.y)<n&&Math.abs(e.z-t.z)<n;var go=()=>{let e=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),t=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0"),n=Math.floor(Math.random()*75+180).toString(16).padStart(2,"0");return`#${e}${t}${n}`};var Ln=(e,t=.001)=>{let n=new Map,s=[];for(let o of e){let r=Math.round(o.x/t),i=Math.round(o.y/t),l=Math.round(o.z/t),f=`${r},${i},${l}`;n.has(f)||(n.set(f,!0),s.push(o))}return s},yo=e=>{let t=e.center,n=e.halfSize,o=e.rotation.elements,r=new O.Vector3(o[0],o[1],o[2]).multiplyScalar(n.x),i=new O.Vector3(o[3],o[4],o[5]).multiplyScalar(n.y),l=new O.Vector3(o[6],o[7],o[8]).multiplyScalar(n.z);function f(E,a,c){return t.clone().addScaledVector(r,E).addScaledVector(i,a).addScaledVector(l,c)}return[f(-1,-1,-1),f(1,-1,-1),f(1,1,-1),f(-1,1,-1),f(-1,-1,1),f(1,-1,1),f(1,1,1),f(-1,1,1)]},An=(e,t)=>{let n=e[0],s=e[1],o=e[2],r=e[3],i=new O.Vector3().subVectors(s,n),l=new O.Vector3().subVectors(r,n),f=i.length(),u=l.length();i.normalize(),l.normalize();let E=new O.Vector3(0,0,1),c=new O.Vector3().add(n).add(s).add(o).add(r).multiplyScalar(.25).clone().addScaledVector(E,t/2),m=new O.BoxGeometry(f,u,t),h=new O.Matrix4;return h.makeBasis(i,l,E),h.setPosition(c),m.applyMatrix4(h),m.computeVertexNormals(),m},mn=e=>{if(!e||e.length===0)return null;let t=new O.Vector3(0,0,0);for(let n of e)Array.isArray(n)?(t.x+=n[0],t.y+=n[1],t.z+=n[2]):(t.x+=n.x,t.y+=n.y,t.z+=n.z);return t.divideScalar(e.length),t};import*as Xt from"three";var Ns=(e,t)=>{console.log("lines",e);for(let n=0;n<e.length;n++){let s=e[n],o=[];s.originalPoints.forEach(d=>{let x=new Xt.Vector3(d.x,d.y,0),w=!1;for(let P=0;P<o.length;P++)if(st(x,o[P],.01)){w=!0;break}w||o.push(x)});let r=Math.round(Math.max(5,Math.min(350,20*Math.sqrt(s.length)))),i=1,l=new Xt.Vector3(s.start.x,s.start.y,s.start.z),f=new Xt.Vector3(s.end.x,s.end.y,s.end.z),u=new Xt.Vector3().subVectors(f,l).normalize(),E=u.clone().cross(new Xt.Vector3(0,0,1)).normalize(),a=E.clone().negate(),c=[],m=[],h=s.length/r;console.log(h);for(let d=0;d<r;d++){let x=[];x.push(l.clone().addScaledVector(E,i)),x.push(x[0].clone().addScaledVector(u,h)),x.push(x[1].clone().addScaledVector(a,i*2)),x.push(l.clone().addScaledVector(a,h));let w=[];for(let P=0;P<o.length;P++)c.includes(P)||js(o[P],x)&&(c.push(P),w.push(o[P]));w.length>0&&m.push(qs(w)),l=l.addScaledVector(u,h)}let g=new Float32Array(o.length*3);o.forEach((d,x)=>{g[x*3]=d.x,g[x*3+1]=d.y,g[x*3+2]=d.z});let T=new Xt.BufferGeometry;T.setAttribute("position",new Xt.BufferAttribute(g,3)),T.rotateX(-Math.PI/2),t.add(new Xt.Points(T,new Xt.PointsMaterial({color:go(),size:.02})));let[y,p]=Gs(m,{plane:"xy",trimRatio:0});uo(y,p,t)}};function Eo(e,t="xy"){if(t==="xy")return{x:e.x,y:e.y};if(t==="xz")return{x:e.x,y:e.z};if(t==="yz")return{x:e.y,y:e.z};throw new Error(`Unsupported plane: ${t}`)}function Ws(e,t,n){let s=t.x-e.x,o=t.y-e.y,r=n.x-e.x,i=n.y-e.y;return s*i-o*r}function js(e,t,n="xy"){if(!t||t.length!==4)throw new Error("rectPoints must contain 4 points");let s=Eo(e,n),o=t.map(l=>Eo(l,n)),r=!1,i=!1;for(let l=0;l<4;l++){let f=o[l],u=o[(l+1)%4],E=Ws(f,u,s);if(E>1e-9&&(r=!0),E<-1e-9&&(i=!0),r&&i)return!1}return!0}function qs(e){if(!e||e.length===0)return null;let t=new Xt.Vector3(0,0,0);for(let n of e)Array.isArray(n)?(t.x+=n[0],t.y+=n[1],t.z+=n[2]):(t.x+=n.x,t.y+=n.y,t.z+=n.z);return t.divideScalar(e.length),t}function $s(e){return e instanceof Xt.Vector3?e.clone():Array.isArray(e)?new Xt.Vector3(e[0],e[1],e[2]):new Xt.Vector3(e.x,e.y,e.z)}function Xs(e,t="xy"){let n=$s(e);if(t==="xy")return{x:n.x,y:n.y,up:n.z};if(t==="xz")return{x:n.x,y:n.z,up:n.y};if(t==="yz")return{x:n.y,y:n.z,up:n.x};throw new Error(`Unsupported plane: ${t}`)}function xo(e,t,n,s="xy"){if(s==="xy")return new Xt.Vector3(e,t,n);if(s==="xz")return new Xt.Vector3(e,n,t);if(s==="yz")return new Xt.Vector3(n,e,t);throw new Error(`Unsupported plane: ${s}`)}function Ys(e,t,n){if(Math.abs(t)<1e-12)return e>=n?{x:1,y:0}:{x:0,y:1};let o=e+n,r=e*n-t*t,i=Math.sqrt(Math.max(0,o*o*.25-r)),l=o*.5+i,f=t,u=l-e,E=Math.hypot(f,u);return E<1e-12?{x:1,y:0}:{x:f/E,y:u/E}}function Gs(e,t={}){let{plane:n="xy",trimRatio:s=0}=t;if(!e||e.length<2)return null;let o=e.map(_=>Xs(_,n)),r=0,i=0,l=0;for(let _ of o)r+=_.x,i+=_.y,l+=_.up;r/=o.length,i/=o.length,l/=o.length;let f=0,u=0,E=0;for(let _ of o){let k=_.x-r,v=_.y-i;f+=k*k,u+=k*v,E+=v*v}f/=o.length,u/=o.length,E/=o.length;let a=Ys(f,u,E),c={x:-a.y,y:a.x},m=[];for(let _ of o){let k=_.x-r,v=_.y-i,A=k*a.x+v*a.y,j=k*c.x+v*c.y;m.push({s:A,t:j,up:_.up})}m.sort((_,k)=>_.s-k.s);let h=m.length,g=Math.floor(h*s),T=Math.ceil(h*(1-s))-1;g=Math.max(0,Math.min(h-1,g)),T=Math.max(0,Math.min(h-1,T));let y=m[g],p=m[T],d=(()=>{let _=m.map(v=>v.t).sort((v,A)=>v-A),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),x=(()=>{let _=m.map(v=>v.up).sort((v,A)=>v-A),k=Math.floor(_.length/2);return _.length%2===0?(_[k-1]+_[k])*.5:_[k]})(),w=y.s,P=p.s,R=d,b=d,S=x,z=x,V=r+a.x*w+c.x*R,M=i+a.y*w+c.y*R,H=r+a.x*P+c.x*b,C=i+a.y*P+c.y*b,D=xo(V,M,S,n),B=xo(H,C,z,n);return[D,B]}import je from"path";import*as lt from"fs";import{fileURLToPath as Zs}from"url";import{Vector3 as We}from"three";var Us=Zs(import.meta.url),en=je.dirname(Us),tn=je.resolve(en,"./data/lines.meta.json"),Fn=je.resolve(en,"./data/lines.bin"),On=je.resolve(en,"./data/checks.bin"),wo=je.resolve(en,"./data/lines.new_points.bin"),Nn=je.resolve(en,"./data/lines.exist_segments.bin");function To(e){let t=[],n=0,s=0,o=0,r=lt.openSync(Fn,"w"),i=lt.openSync(On,"w"),l=lt.openSync(Nn,"w");try{for(let u of e){let E=Buffer.alloc(u.originalPoints.length*12),a=new Float32Array(E.buffer,E.byteOffset);for(let h=0,g=0;h<u.originalPoints.length;h++,g+=3){let T=u.originalPoints[h];a[g]=T.x,a[g+1]=T.y,a[g+2]=T.z}lt.writeSync(r,E,0,E.length,n);let c=null;if(Array.isArray(u.checkResults)&&u.checkResults.length>0){let h=[];for(let g of u.checkResults){let T=bo(g);lt.writeSync(i,T,0,T.length,s),h.push({offset:s,byteLength:T.length,faceCount:g.originalVertices.length,centerCount:g.allCenterPoints.length}),s+=T.length}c={checkResults:h}}let m=null;if(Array.isArray(u.existSegments)&&u.existSegments.length>0){let h=[];for(let g of u.existSegments){let T=bo(cr);lt.writeSync(l,T,0,T.length,o),h.push({offset:o,byteLength:T.length,faceCount:g.originalVertices.length,centerCount:(g.allCenterPoints||[]).length}),o+=T.length}m={existSegments:h}}t.push({id:u.id,pointCount:u.originalPoints.length,offset:n,...c||{},...m||{},hasNewOriginalPoints:!1}),n+=E.length,u.originalPoints=null,u.checkResults=null,u.existSegments=null}lt.closeSync(r),lt.closeSync(i),lt.closeSync(l);let f=tn+".tmp";lt.writeFileSync(f,JSON.stringify(t,null,2)),lt.renameSync(f,tn),console.log("\u2705 writeFile \u5B8C\u6210\uFF08\u542B existSegments\uFF09")}catch(f){try{lt.closeSync(r)}catch{}try{lt.closeSync(i)}catch{}try{lt.closeSync(l)}catch{}throw f}}var pn=class{constructor(t){this.lineStates=new Map;for(let n of t)this.lineStates.set(n.id,n);this.meta=JSON.parse(lt.readFileSync(tn,"utf-8")),this.fdRead=lt.openSync(Fn,"r"),this.checkFdRead=lt.openSync(On,"r"),this.existSegmentsFdRead=lt.existsSync(Nn)?lt.openSync(Nn,"r"):null,this.newPointsFdRead=lt.existsSync(wo)?lt.openSync(wo,"r"):null,this.fdWrite=lt.openSync(Fn,"a"),this.checkFdWrite=lt.openSync(On,"a"),this.dataEnd=lt.fstatSync(this.fdWrite).size,this.checkEnd=lt.fstatSync(this.checkFdWrite).size}readLine(t){let n=this.meta[t];if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}*iterate(){for(let t=0;t<this.meta.length;t++)yield this.readLine(t)}readLineById(t){let n=this.meta.find(u=>u.id===t);if(!n)return null;let s=this.lineStates.get(n.id);if(!s)return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.checkResults?n.checkResults.map(u=>this.createCheckResultView(u,"checkResults")):[],l=n.existSegments&&n.existSegments.length>0?n.existSegments.map(u=>this.createCheckResultView(u)):[],f=null;if(n.hasNewOriginalPoints&&this.newPointsFdRead&&typeof n.newPointsOffset=="number"&&n.newPointsCount>0){let u=Buffer.alloc(n.newPointsCount*12);lt.readSync(this.newPointsFdRead,u,0,u.length,n.newPointsOffset),f=new Float32Array(u.buffer,u.byteOffset,n.newPointsCount*3)}return{...s,originalPoints:r,checkResults:i,existSegments:l,new_originalPoints:f}}getLineCheckReultsById(t){let n=this.meta.find(i=>i.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=n.checkResults?n.checkResults.map(i=>this.createCheckResultView(i,"checkResults")):[],r=[];for(let i of o){let l=[],f=[];for(let u=0;u<i.faceCount;u++){let E=i.getFace(u);l.push(E);let a=i.getCenter(u);f.push(a)}r.push({originalVertices:l,allCenterPoints:f})}return r}getLineExistSegmentsById(t){let n=this.meta.find(f=>f.id===t);if(!n)return[];if(!this.lineStates.get(n.id))return[];let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=n.existSegments&&n.existSegments.length>0?n.existSegments.map(f=>this.createCheckResultView(f)):[],l=[];for(let f of i){let u=[],E=[];for(let a=0;a<f.faceCount;a++){let c=f.getFace(a);u.push(c);let m=f.getCenter(a);E.push(m)}l.push({originalVertices:u,allCenterPoints:E})}return l}getOriginalPointsById(t){let n=this.meta.find(f=>f.id===t);if(!n||!this.lineStates.get(n.id))return null;let o=Buffer.alloc(n.pointCount*12);lt.readSync(this.fdRead,o,0,o.length,n.offset);let r=new Float32Array(o.buffer,o.byteOffset,n.pointCount*3),i=[],l=r;for(let f=0;f<l.length;f+=3)i.push(new We(l[f],l[f+1],l[f+2]));return i}replaceOriginalPoints(t,n){let s=this.meta.find(l=>l.id===t);if(!s)throw new Error(`line ${t} not found`);let o=Buffer.alloc(n.length*12);new Float32Array(o.buffer,o.byteOffset).set(n);let i=this.dataEnd;lt.writeSync(this.fdWrite,o,0,o.length,i),this.dataEnd+=o.length,s.pointCount=n.length/3,s.offset=i}replaceAllCheckResults(t,n){let s=this.meta.find(u=>u.id===t);if(!s)throw new Error(`line ${t} not found`);let o=[],r=0,i=n.map(u=>{let E=Ks(u.originalVertices,u.allCenterPoints||[]);return r+=E.length,E}),f=this.checkEnd;for(let u=0;u<i.length;u++){let E=i[u];lt.writeSync(this.checkFdWrite,E,0,E.length,f),o.push({offset:f,byteLength:E.length,faceCount:n[u].originalVertices.length,centerCount:(n[u].allCenterPoints||[]).length}),f+=E.length}this.checkEnd+=r,s.checkResults=o}flushMeta(){let t=tn+".tmp";lt.writeFileSync(t,JSON.stringify(this.meta,null,2)),lt.renameSync(t,tn)}createCheckResultView(t,n){let s=null,o=null,r=()=>{if(s)return;s=Buffer.alloc(t.byteLength);let f=n==="checkResults"?this.checkFdRead:this.existSegmentsFdRead;lt.readSync(f,s,0,t.byteLength,t.offset),o=new Float32Array(s.buffer,s.byteOffset)},i=f=>f*12,l=f=>t.faceCount*12+f*3;return{getFace(f){r();let u=i(f);return[new We(o[u],o[u+1],o[u+2]),new We(o[u+3],o[u+4],o[u+5]),new We(o[u+6],o[u+7],o[u+8]),new We(o[u+9],o[u+10],o[u+11])]},getCenter(f){r();let u=l(f);return new We(o[u],o[u+1],o[u+2])},faceCount:t.faceCount,centerCount:t.centerCount}}close(){lt.closeSync(this.fdRead),lt.closeSync(this.checkFdRead),this.existSegmentsFdRead&<.closeSync(this.existSegmentsFdRead),this.newPointsFdRead&<.closeSync(this.newPointsFdRead),lt.closeSync(this.fdWrite),lt.closeSync(this.checkFdWrite),this.lineStates.clear()}};function bo(e){let{originalVertices:t,allCenterPoints:n}=e,s=t.length*4*3+n.length*3,o=Buffer.alloc(s*4),r=new Float32Array(o.buffer,o.byteOffset),i=0;for(let l of t)for(let f of l)r[i++]=f.x,r[i++]=f.y,r[i++]=f.z;for(let l of n)r[i++]=l.x,r[i++]=l.y,r[i++]=l.z;return o}function Ks(e,t){let n=e.length*4*3+t.length*3,s=Buffer.alloc(n*4),o=new Float32Array(s.buffer,s.byteOffset),r=0;for(let i of e)for(let l of i)o[r++]=l.x,o[r++]=l.y,o[r++]=l.z;for(let i of t)o[r++]=i.x,o[r++]=i.y,o[r++]=i.z;return s}import{randomUUID as Js}from"crypto";function Qs(e){for(let t of e)t.id=Js()}var tr=async(e,t,n,s,o)=>{if(po(e,s,o),e.length<=0||t.length<=0)return e;n||(n=[]);for(let y of e){let p=[],d=s.readLineById(y.id);if(d.checkResults=s.getLineCheckReultsById(y.id),y.checkResults=d.checkResults,!(!y.checkResults||y.checkResults.length<=0)){for(let x=0;x<y.checkResults.length;x++){let S=function(C){for(;b[C]!==C;)b[C]=b[b[C]],C=b[C];return C},w=y.checkResults[x];if(!w.originalVertices||w.originalVertices.length==0)continue;let P=[];w.originalVertices.forEach(C=>{let D=[];C.forEach(B=>{D.push(new I.Vector3(B.x,B.y,B.z))}),P.push(D)});let R=P.length,b=Array.from({length:R},(C,D)=>D);for(let C=0;C<R;C++)for(let D=C+1;D<R;D++){let B=P[C],_=P[D];if(B.some(v=>_.some(A=>v.equals(A)))){let v=S(C),A=S(D);v!==A&&(b[v]=A)}}let z=new Map,V=-1,M=-1;for(let C=0;C<R;C++){let D=S(C);z.has(D)||z.set(D,{points:[],area:0,index:-1,gridWidth:-1,gridHeight:-1,centerPts:[],facePoints:[],boxArea:-1,totalInPlaneNum:-1});let B=z.get(D),[_,k,v,A]=P[C],j=new I.Vector3().add(_).add(k).add(v).add(A).multiplyScalar(.25);if(B.points.push(...P[C]),B.area+=_.distanceTo(k)*_.distanceTo(A),B.index=x,B.centerPts.push(j),V==-1||M==-1){let $=new I.Vector3().subVectors(_,k).normalize();M=_.distanceTo(A),V=_.distanceTo(k);let Z=Kt($,new I.Vector3(0,0,1));Z&&Z.parallel&&([M,V]=[V,M])}B.gridWidth=V,B.gridHeight=M}let H=z.values();for(let C of z.values()){let{facePoints:D,boxArea:B,totalInPlaneNum:_}=mo(C.points,C.gridWidth,C.gridHeight,C.centerPts);C.centerPts=null,C.facePoints=D,C.boxArea=B,C.totalInPlaneNum=_}p.push(...H)}y.checkResults=null,y.mergeCheckRegion=p}}let r=[];for(let y=0;y<n.length;y++){let p=n[y];if(p.isFindBeam=!1,p.category=="door"){let d=[];p.coordinatesByArea.coordinates.forEach(b=>{d.push(new I.Vector3(b.x,b.y,b.z))}),d[0].equals(d[d.length-1])&&d.pop();let x=d[0].distanceTo(d[1]),w=d[0].distanceTo(d[3]);w>x&&([x,w]=[w,x],d=[d[0],d[3],d[2],d[1]]);let P=qt(d[0],d[3],!0),R=qt(d[1],d[2],!0);r.push({doorStartPt:P,doorEndPt:R,boxPoints:d,minZ:p.coordinatesByArea.heightData.minZ,maxZ:p.coordinatesByArea.heightData.maxZ,index:y,isFind:!1,inWall:!1})}}for(let y=0;y<r.length;y++){let p=r[y];for(let d=0;d<e.length;d++){if(e[d].length<.5)continue;let x=[],w=qt(e[d].start,e[d].end,!0);x.push(w),x.push(qt(w,e[d].start,!0)),x.push(qt(w,e[d].end,!0));let P=!1,R=p.boxPoints.length;for(let b=0;b<x.length;b++){let S=x[b].x,z=x[b].y;for(let V=0,M=R-1;V<R;M=V++){let H=p.boxPoints[V].x,C=p.boxPoints[V].y,D=p.boxPoints[M].x,B=p.boxPoints[M].y;C>z!=B>z&&S<(D-H)*(z-C)/(B-C)+H&&(P=!P)}if(P)break}if(P){let b=new I.Vector3(e[d].start.x,e[d].start.y,0),S=new I.Vector3(e[d].end.x,e[d].end.y,0),z=p.doorStartPt.distanceTo(p.doorEndPt),V=b.distanceTo(S),M=Yt(p.doorStartPt,p.doorEndPt,b,S);if(Math.abs(V-z)<.5&&M&&M.angleDeg<15){p.doorStartPt=new I.Vector3(e[d].start.x,e[d].start.y,0),p.doorEndPt=new I.Vector3(e[d].end.x,e[d].end.y,0);break}else if(Math.abs(V-z)>1.3&&M&&M.angleDeg<15){let H=ye(p.doorStartPt,p.doorEndPt,b,S,{parallelAngleMax:I.MathUtils.degToRad(15)}),C=p.doorStartPt.distanceTo(b),D=p.doorStartPt.distanceTo(S),B=p.doorEndPt.distanceTo(b),_=p.doorEndPt.distanceTo(S),k=C<.2||D<.2||B<.2||_<.2;if(H&&H.type=="collinear_overlap"&&H.maxPerpendicularDistance<.1&&!k){p.inWall=!0;break}else{let v=new I.Line3(b,S),A=v.closestPointToPoint(p.doorStartPt,!0,new I.Vector3),j=v.closestPointToPoint(p.doorEndPt,!0,new I.Vector3),$=A.distanceTo(p.doorStartPt),Z=j.distanceTo(p.doorEndPt);if($<.1||Z<.1){p.inWall=!0;break}}}}else continue}}let i=0,l=[],f=[],u=[],E=[],a=.15;for(let y=0;y<e.length;y++){let p=e[y];if(p.noDetection)continue;let d=s.readLineById(p.id);if(d.originalPoints=s.getOriginalPointsById(p.id),d.checkResults=s.getLineCheckReultsById(p.id),p.originalPoints=d.originalPoints,p.checkResults=d.checkResults,d=null,p.doorAndBeamData=[],p.doorAndBeamIdToCheckResults=[],!p.mergeCheckRegion||p.mergeCheckRegion.length==0)continue;p.completePointAreaPercentage=-1;let x=new I.Box3;x.setFromPoints(p.originalPoints);let w=x.max.z,P=x.min.z,R=new I.Vector3(p.start.x,p.start.y,p.start.z),b=new I.Vector3(p.end.x,p.end.y,p.end.z),S=p.rooftopPz-p.start.z,z=0;for(let M of p.mergeCheckRegion){let H=M.facePoints,C=M.boxArea,D=M.totalInPlaneNum;if(!H||H.length<=0)continue;let B=H[0].distanceTo(H[1]),_=H[0].distanceTo(H[3]),k=M.gridHeight*(_/M.gridHeight/3*2)+M.gridHeight/2,v=new I.Vector3(H[0].x,H[0].y,H[0].z+k),A=new I.Vector3(H[1].x,H[1].y,H[1].z+k),j=new I.Line3(v,A),$=[],Z=new I.Vector3;M.points.forEach(q=>{j.closestPointToPoint(q,!0,Z).distanceTo(q)<M.gridHeight+.01&&$.push(q)});let Y=[],tt=[];for(;;){let q=[];for(let W=0;W<$.length;W++)tt.includes(W)||q.length==0&&(q.push($[W]),tt.push(W));for(let W=0;W<$.length;W++)if(!tt.includes(W)){for(let U=0;U<q.length;U++)if($[W].distanceTo(q[U])<M.gridWidth+.01){q.push($[W]),tt.push(W),W=-1;break}}if(q.length==0)break;Y.push(q)}let it=[];for(let q=0;q<Y.length;q++){let W={lineSt:new I.Vector3,lineEd:new I.Vector3,facePoints:[]},U=Ne(Y[q]);Array.isArray(U)&&U.length==2&&(W.lineSt=U[0],W.lineEd=U[1],W.facePoints.push(new I.Vector3(U[0].x,U[0].y,H[0].z)),W.facePoints.push(new I.Vector3(U[1].x,U[1].y,H[0].z)),W.facePoints.push(new I.Vector3(U[1].x,U[1].y,H[2].z)),W.facePoints.push(new I.Vector3(U[0].x,U[0].y,H[2].z)),it.push(W))}z+=M.area;let ct=0;if(D!=0&&(ct=M.gridHeight*M.gridWidth*D),(M.area-ct)/C*100>70&&it.length==1||it.length>1)for(let q=0;q<it.length;q++){let W=it[q],U=W.facePoints[0].distanceTo(W.facePoints[1]),wt=W.facePoints[0].distanceTo(W.facePoints[3]),Ft=U/p.length*100,Nt=p.rooftopPz-W.facePoints[2].z;if(wt<1.5||w<W.facePoints[2].z||Nt>S/3*2)continue;let jt=!1,Lt=!1,Tt=!1,It=new I.Vector3(0,0,0),Pt=new I.Vector3(0,0,0),bt=!1,Bt=[],J=W.facePoints[2].clone(),ft=W.facePoints[3].clone(),Q=W.facePoints[0].clone(),K=W.facePoints[1].clone(),he=!1,Et=-1;if(Math.abs(W.facePoints[0].z-p.start.z)<.25){let re=!1;for(let et=0;et<t.length;et++){let Vt=et+1;if(Vt>=t.length)continue;let Ot=new I.Vector3(t[et].x,t[et].y,t[et].z),nt=new I.Vector3(t[Vt].x,t[Vt].y,t[Vt].z);if(xe(new I.Vector3(Ot.x,Ot.y,0),new I.Vector3(nt.x,nt.y,0),new I.Vector3(W.facePoints[0].x,W.facePoints[0].y,0),new I.Vector3(W.facePoints[1].x,W.facePoints[1].y,0),.1)!=null){re=!0;break}}let{newOriginalPoints:Te}=Qe(Q,K,p.originalPoints),Rt=[],ie=[];if(Te.forEach(et=>{et.z>=J.z?Rt.push(et):et.z<=Q.z&&ie.push(et)}),Rt.length<20)continue;let G=p.rooftopPz-J.z,de=J.clone();de.z+=G;let Be=J.distanceTo(ft),_e=new I.Vector3().subVectors(ft,J).normalize(),Ue=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Be)))),ke=Be/Ue,me=[],Fe=[];for(let et=0;et<Ue;et++)me.push(new I.Vector3(J.x,J.y,J.z+G/5).addScaledVector(_e,ke*et)),me.push(new I.Vector3(de.x,de.y,de.z-G/5).addScaledVector(_e,ke*et));let Oe=me.length;for(let et=0;et<Rt.length;et++)for(let Vt=0;Vt<me.length;Vt++)if(new I.Vector3(Rt[et].x,Rt[et].y,Rt[et].z).distanceTo(me[Vt])<.05){Fe.push(me[Vt]),me.splice(Vt,1);break}if(Fe.length/Oe<.5)continue;if(U>.17&&p.length>.5){let et=$t(R,Q),Vt=$t(R,K),Ot=$t(b,Q),nt=$t(b,K),L=.15,xt=10;if(et<L||Vt<L)if(Rt.length>10){let gt=new I.Vector3(p.start.x,p.start.y,0),rt=new I.Vector3(p.end.x,p.end.y,0),dt=new I.Vector3().subVectors(gt,rt).normalize(),Ct=new I.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let X=0;X<e.length;X++){if(X==y)continue;let ht=new I.Vector3(e[X].start.x,e[X].start.y,0),ot=new I.Vector3(e[X].end.x,e[X].end.y,0),St=xe(gt,rt,ht,ot,.1),Mt=se(gt,rt,ht,ot);if(St!=null){if(Mt&&Mt.angle>85){let vt=St.point.distanceTo(gt),_t=St.point.distanceTo(rt);if(vt<.3){at=!0,mt=1/0,At=-1;break}}continue}if(Mt&&Mt.angle>85){let _t=new I.Line3(ht,ot).closestPointToPoint(gt,!0,Ct),Dt=Yt(gt,rt,_t,gt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt,xt),Ut=rt.clone().addScaledVector(dt.clone().negate(),xt),oe=new I.Vector3().subVectors(ot,ht).normalize(),Qt=ht.clone().addScaledVector(oe.clone().negate(),.03),Pe=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,Qt,Pe);if(le==null)continue;let te=gt.distanceTo(le.point);te<mt&&(mt=te,At=X)}else if(Mt&&Mt.angle<5){let vt=new I.Vector3(Q.x,Q.y,0),_t=new I.Vector3(K.x,K.y,0),Dt=$t(vt,ht),ne=$t(vt,ot),Ut=$t(_t,ht),oe=$t(_t,ot),Qt=Yt(gt,rt,ht,vt),Pe=!1,le=s.readLineById(e[X].id);if(le.checkResults=s.getLineCheckReultsById(e[X].id),e[X].checkResults=le.checkResults,le=null,e[X].checkResults){for(let te=0;te<e[X].checkResults.length;te++){let Je=[];for(let ge=0;ge<e[X].checkResults[te].originalVertices.length;ge++){let Re=mn(e[X].checkResults[te].originalVertices[ge]);Re.z=0,Je.push(Re)}let pe=Ne(Je);if(pe.length==2){let ge=$t(vt,pe[0]),Re=$t(vt,pe[1]),Hn=$t(_t,pe[0]),Bn=$t(_t,pe[1]);if(ge<.2||Re<.2||Hn<.2||Bn<.2){Pe=!0;break}}}e[X].checkResults=null}if(Qt&&Qt.direction=="same"&&!Pe&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(p.length-U>.2||p.length-U<.02)&&mt<U*2)e[At].length>.25&&U+mt>.5&&(he=!0,et<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),K=K.addScaledVector(dt,mt)));else{if(!pt&&!at&&p.length-U>.1)continue;if(!pt&&!at&&p.length-U<.1&&p.length<1.8)continue}}else continue;if(Ot<L||nt<L)if(Rt.length>10){let gt=new I.Vector3(p.start.x,p.start.y,0),rt=new I.Vector3(p.end.x,p.end.y,0),dt=new I.Vector3().subVectors(rt,gt).normalize(),Ct=new I.Vector3,mt=1/0,At=-1,pt=!1,at=!1;for(let X=0;X<e.length;X++){if(X==y)continue;let ht=new I.Vector3(e[X].start.x,e[X].start.y,0),ot=new I.Vector3(e[X].end.x,e[X].end.y,0),St=xe(gt,rt,ht,ot,.03),Mt=se(gt,rt,ht,ot);if(St!=null){if(Mt&&Mt.angle>85){let vt=St.point.distanceTo(gt);if(St.point.distanceTo(rt)<.3){at=!0,mt=1/0,At=-1;break}}continue}if(Mt&&Mt.angle>85){let _t=new I.Line3(ht,ot).closestPointToPoint(rt,!0,Ct),Dt=Yt(rt,gt,_t,rt);if(!Dt||Dt.direction!="same")continue;let ne=gt.clone().addScaledVector(dt.clone().negate(),xt),Ut=rt.clone().addScaledVector(dt,xt),oe=new I.Vector3().subVectors(ot,ht).normalize(),Qt=ht.clone().addScaledVector(oe.clone().negate(),.03),Pe=ot.clone().addScaledVector(oe,.03),le=xe(ne,Ut,Qt,Pe);if(le==null)continue;let te=rt.distanceTo(le.point);te<mt&&(mt=te,At=X)}else if(Mt&&Mt.angle<5){let vt=new I.Vector3(Q.x,Q.y,0),_t=new I.Vector3(K.x,K.y,0),Dt=$t(vt,ht),ne=$t(vt,ot),Ut=$t(_t,ht),oe=$t(_t,ot),Qt=Yt(rt,gt,ht,vt),Pe=!1,le=s.readLineById(e[X].id);if(le.checkResults=s.getLineCheckReultsById(e[X].id),e[X].checkResults=le.checkResults,le=null,e[X].checkResults){for(let te=0;te<e[X].checkResults.length;te++){let Je=[];for(let ge=0;ge<e[X].checkResults[te].originalVertices.length;ge++){let Re=mn(e[X].checkResults[te].originalVertices[ge]);Re.z=0,Je.push(Re)}let pe=Ne(Je);if(pe.length==2){let ge=$t(vt,pe[0]),Re=$t(vt,pe[1]),Hn=$t(_t,pe[0]),Bn=$t(_t,pe[1]);if(ge<.2||Re<.2||Hn<.2||Bn<.2){Pe=!0;break}}}e[X].checkResults=null}if(Qt&&Qt.direction=="same"&&!Pe&&(Dt<.1||ne<.1||Ut<.1||oe<.1)){pt=!0,mt=1/0,At=-1;break}}}if(mt!=1/0&&mt<2&&(p.length-U>.2||p.length-U<.02)&&mt<U*2)e[At].length>.25&&U+mt>.5&&(he=!0,Ot<L?(ft=ft.addScaledVector(dt,mt),Q=Q.addScaledVector(dt,mt)):(J=J.addScaledVector(dt,mt),K=K.addScaledVector(dt,mt)));else{if(!pt&&!at&&p.length-U>.1)continue;if(!pt&&!at&&p.length-U<.1&&p.length<1.8)continue}}else continue;U=ft.distanceTo(J)}if(Ft<85&&U>.3||U>.7&&wt>S-S/2){if(!p.isLine2){if(U<3.5)for(let et=0;et<r.length;et++){let Vt=new I.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new I.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new I.Vector3(W.facePoints[0].x,W.facePoints[0].y,0),L=new I.Vector3(W.facePoints[1].x,W.facePoints[1].y,0),xt=W.facePoints[2].z<r[et].maxZ||Math.abs(W.facePoints[2].z-r[et].maxZ)<.3,gt=Math.abs(W.facePoints[2].z-r[et].maxZ)>.2;if(xt){let rt=ye(Vt.clone(),Ot.clone(),nt.clone(),L.clone(),{distanceThreshold:2});if(rt&&rt.type=="collinear_gap"){let dt=qt(Vt,Ot),Ct=new I.Line3(new I.Vector3(p.start.x,p.start.y,0),new I.Vector3(p.end.x,p.end.y,0)),mt=new I.Vector3,At=Ct.closestPointToPoint(dt,!0,mt);if(dt.distanceTo(At)<.15){let at=nt.distanceTo(Vt),X=L.distanceTo(Vt);if(at>.25&&X>.25){let St=nt.distanceTo(Ot),Mt=L.distanceTo(Ot);if(St>.2&&Mt>.2)continue}Lt=!0,bt=!0,Bt.push(r[et].index),r[et].isFind=!0,Et=et,Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0;let ht=new I.Vector3().subVectors(nt,L).normalize(),ot=Vt.distanceTo(Ot)-rt.overlap;X<at&&ht.negate(),at>X?(J=W.facePoints[2].clone().addScaledVector(ht,ot),ft=W.facePoints[3].clone(),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z):(J=W.facePoints[2].clone(),ft=W.facePoints[3].clone().addScaledVector(ht,ot),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z)}}else if(rt&&rt.type=="collinear_overlap"&&rt.maxPerpendicularDistance<.35){let dt=nt.distanceTo(L),Ct=Ot.distanceTo(Vt);if(Math.abs(dt-rt.overlap)<.25||Math.abs(Ct-rt.overlap)<.25){if(Ct>dt&&Math.abs(Ct-rt.overlap)>1){let mt=nt.distanceTo(Vt),At=nt.distanceTo(Ot),pt=L.distanceTo(Vt),at=L.distanceTo(Ot),X=mt<At?mt:At,ht=pt<at?pt:at,ot=new I.Vector3().subVectors(nt,L).normalize(),St=Ct-rt.overlap;X<ht?(ot.negate(),J=W.facePoints[2].clone().addScaledVector(ot,St),ft=W.facePoints[3].clone(),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z):(J=W.facePoints[2].clone(),ft=W.facePoints[3].clone().addScaledVector(ot,St),Q=ft.clone(),K=J.clone(),Q.z=K.z=W.facePoints[0].z)}U>1.5&&(Lt=!0,bt=!0,Bt.push(r[et].index),r[et].isFind=!0,Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Et=et)}}}}if(!bt&&U<1.5)for(let et=0;et<r.length;et++){if(r[et].inWall)continue;let Vt=new I.Vector3(r[et].doorStartPt.x,r[et].doorStartPt.y,0),Ot=new I.Vector3(r[et].doorEndPt.x,r[et].doorEndPt.y,0),nt=new I.Vector3(ft.x,ft.y,0),L=new I.Vector3(J.x,J.y,0),xt=new I.Vector3().subVectors(Vt,Ot).normalize(),gt=new I.Vector3().subVectors(nt,L).normalize(),rt=.25,dt=Vt.clone().addScaledVector(xt,rt),Ct=Ot.clone().addScaledVector(xt.clone().negate(),rt),mt=nt.clone().addScaledVector(gt,rt),At=L.clone().addScaledVector(gt.clone().negate(),rt);if(Yt(dt,Ct,mt,At).isParallel)continue;let at=xe(dt,Ct,mt,At),X=!0,ht=Vt.distanceTo(nt),ot=Vt.distanceTo(L),St=Ot.distanceTo(nt),Mt=Ot.distanceTo(L);if((ht<a||ot<a||St<a||Mt<a||at)&&X){let _t=new I.Line3(nt,L);if(ht<a||St<a)if(It=nt.clone(),ht<a){let Dt=_t.closestPointToPoint(Ot,!1,new I.Vector3);Pt=new I.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=_t.closestPointToPoint(Vt,!1,new I.Vector3);Pt=new I.Vector3().subVectors(Vt,Dt).normalize()}else if(ot<a||Mt<a)if(It=L.clone(),ot<a){let Dt=_t.closestPointToPoint(Ot,!1,new I.Vector3);Pt=new I.Vector3().subVectors(Ot,Dt).normalize()}else{let Dt=_t.closestPointToPoint(Vt,!1,new I.Vector3);Pt=new I.Vector3().subVectors(Vt,Dt).normalize()}else if(at){let Dt=at.point.distanceTo(nt),ne=at.point.distanceTo(L),Ut=at.point.distanceTo(dt),oe=at.point.distanceTo(Ct);if(Dt<ne?It=nt.clone():It=L.clone(),Ut<oe){let Qt=_t.closestPointToPoint(Ct,!1,new I.Vector3);Pt=new I.Vector3().subVectors(Ct,Qt).normalize()}else{let Qt=_t.closestPointToPoint(dt,!1,new I.Vector3);Pt=new I.Vector3().subVectors(dt,Qt).normalize()}}Tt=n[r[et].index].isFindBeam,n[r[et].index].isFindBeam=!0,Lt=!0,r[et].isFind=!0,Et=et}}}(Lt||re||Math.abs(wt-S)>.1&&wt>S/3&&U>.3)&&(jt=!0)}}if(jt){{let nt=new I.Vector3().subVectors(Q,K),L=new I.Vector3().subVectors(K,Q),xt=1/0,gt=1/0,rt=Q.clone(),dt=K.clone(),Ct=[],mt=[],At=new I.Line3(J,ft),pt=new I.Vector3,at=999999;if(p.originalPoints.forEach(X=>{if(X.z-Q.z<wt/2+.1&&X.z-Q.z>wt/2-.1&&Ct.push(X),X.z>J.z){let ht=At.closestPointToPoint(X,!0,pt),ot=new I.Vector3().subVectors(ht,J),St=new I.Vector3().subVectors(ht,ft),Mt=Kt(nt,St),vt=Kt(L,ot);Mt&&Mt.parallel&&!Mt.sameDirection&&vt&&vt.parallel&&!vt.sameDirection&&mt.push(X)}}),Ct.length>0){let{newProjectPoints:X}=Qe(Q,K,Ct);for(let ht of X)ht.z=Q.z;X.forEach(ht=>{let ot=new I.Vector3(ht.x,ht.y,Q.z),St=new I.Vector3().subVectors(ot,K),Mt=new I.Vector3().subVectors(ot,Q),vt=Kt(nt,Mt),_t=Kt(L,St);if(vt&&vt.parallel&&vt.sameDirection){let Dt=ot.distanceTo(Q);Dt<xt&&(xt=Dt,rt=ot)}else if(_t&&_t.parallel&&_t.sameDirection){let Dt=ot.distanceTo(K);Dt<gt&&(gt=Dt,dt=ot)}})}if(rt.equals(Q)||(Q=rt,ft=new I.Vector3(Q.x,Q.y,ft.z)),dt.equals(K)||(K=dt,J=new I.Vector3(K.x,K.y,J.z)),mt.length>10){let{newOnLinePoints:X}=Qe(ft,J,mt);for(let ht=0;ht<X.length;ht++){let St=At.closestPointToPoint(X[ht],!0,pt).distanceTo(X[ht]);St>.02&&at>St&&(at=St)}J.z+=at,ft.z+=at,wt+=at}}let re=!1;for(let nt=0;nt<u.length;nt++){let L=ye(u[nt].start,u[nt].end,Q,K);L&&L.type=="collinear_overlap"&&L.maxPerpendicularDistance<.07&&(re=!0)}if(re){Et!=-1&&(Tt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1));continue}let Te=K.distanceTo(Q);if(Te<.4&&!Lt||Te<.3&&Lt)continue;f.includes(y)||f.push(y);let Rt="",ie=Lt?"singleDoor":"";ie=bt?"pullOutDoor":ie;let G={id:i,beamStart:J,beamEnd:ft,beamHeight:p.rooftopPz-J.z,doorStart:Q,doorEnd:K,doorHeight:wt,nearId:-1,type:Rt,isExtend:he,isDoor:Lt,isPullOutDoor:bt,pcbDoorIndexs:Bt,beamNearWallVec:new I.Vector3(0,0,0),doorType:ie,doorOpenEndPoint:It,doorOpenVector:Pt,lineIsOnlyBeam:!1};if(G.beamHeight<.1)continue;let de=1/0,Be=!1,_e=new I.Vector3,Ue=new I.Vector3,ke=-1,me=-1,Fe=-1,Oe=!1,Ke=!1;if(!Be){let nt=new I.Line3(Q.clone(),K.clone()),L=-1;for(let xt=0;xt<e.length;xt++){if(e[xt].length<.5||xt==y)continue;let gt=new I.Vector3(e[xt].start.x,e[xt].start.y,e[xt].start.z),rt=new I.Vector3(e[xt].end.x,e[xt].end.y,e[xt].end.z),dt=ye(gt,rt,Q,K),Ct=Yt(gt,rt,Q,K);if(dt&&dt.maxPerpendicularDistance<.5){if(Ct&&Ct.isParallel){let ot=new I.Line3(gt,rt),St=new I.Vector3(Q.x,Q.y,gt.z),Mt=ot.closestPointToPoint(St,!0,new I.Vector3),vt=se(Mt,St,Q,K);vt&&vt.angle>85&&(G.beamNearWallVec=new I.Vector3().subVectors(Mt,St).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&U>1?Ke=!0:Ke=!1)}let mt=[],At=s.readLineById(e[xt].id);At.originalPoints=s.getOriginalPointsById(e[xt].id),e[xt].originalPoints=At.originalPoints,At=null,e[xt].originalPoints.forEach(ot=>{ot.z>Q.z+.2&&ot.z<Q.z+wt/2&&mt.push(new I.Vector3(ot.x,ot.y,Q.z))}),e[xt].originalPoints=null;let pt=new I.Vector3,at=[],X=[];for(let ot=0;ot<mt.length;ot++){let St=nt.closestPointToPoint(mt[ot],!0,pt);St.distanceTo(mt[ot])<.15&&(at.push(mt[ot]),X.push(St.clone()))}for(let ot=0;ot<X.length;ot++)In(nt,X[ot])&&at.push(X[ot]);if(at=X,at=Ln(at),at.length<150)continue;let ht=Ne(at);if(ht.length==2){let ot=ht[0].distanceTo(ht[1]);if(Math.abs(ot-nt.distance())<.3){L=dt.maxPerpendicularDistance;let St=new I.Line3(gt,rt),Mt=new I.Vector3(Q.x,Q.y,gt.z),vt=St.closestPointToPoint(Mt,!0,new I.Vector3);if(G.beamNearWallVec=new I.Vector3().subVectors(vt,Mt).normalize(),G.beamStart.z>e[xt].rooftopPz-.03&&U>1)Ke=!0,Oe=!0;else if(re=!0,Et!=-1&&(Tt||(n[r[Et].index].isFindBeam=!1,r[Et].isFind=!1)),me!=-1&&Fe!=-1){let _t=e[me].doorAndBeamData[Fe];_t.nearId=-1}break}}if(re)break}else dt&&dt.type=="collinear_overlap"&&dt.maxPerpendicularDistance>.3&&dt.maxPerpendicularDistance<.7&&(Oe=!0)}if(re){if(U<1.5||L<.08)continue;Oe=!0}}let et=!1;if(ke!=-1)for(let nt=0;nt<E.length&&!(E[nt].length==1&&(E[nt][0].id==i?(E[nt].push({id:ke,beamStart:_e,beamEnd:Ue}),et=!0):E[nt][0].id==ke&&(E[nt].push({id:i,beamStart:J,beamEnd:ft}),et=!0),et));nt++);et||E.push([{id:i,beamStart:J,beamEnd:ft}]);let Vt=G.doorStart.distanceTo(G.doorEnd),Ot=dn(p.originalPoints);if(G.lineIsOnlyBeam=Ot.minZ>p.start.z&&Ot.minZ-p.start.z>1,Lt?Rt="door":Vt>1.5||he?Rt="beam":Rt=Oe&&Vt>1?"beam":"hole",Rt!="beam"&&e[y].isLine2)continue;G.type=Rt,G.wallBelowBeam=Ke;for(let nt=0;nt<l.length;nt++){let L=e[l[nt].linesIndex].doorAndBeamData[l[nt].doorIndex];if(L.nearId!=-1||G.type=="beam"&&L.type!="beam"||G.type!="beam"&&L.type=="beam")continue;let xt=Yt(J.clone(),ft.clone(),L.beamStart.clone(),L.beamEnd.clone());if(xt&&xt.isParallel){let gt=J.distanceTo(ft),rt=L.beamStart.distanceTo(L.beamEnd),dt=new I.Line3(J.clone(),ft.clone());dt.start.z=0,dt.end.z=0;let Ct=qt(L.beamStart,L.beamEnd,!0);rt>gt&&(dt.start=new I.Vector3(L.beamStart.x,L.beamStart.y,0),dt.end=new I.Vector3(L.beamEnd.x,L.beamEnd.y,0),Ct=qt(J,ft,!0));let mt=new I.Vector3,At=dt.closestPointToPoint(Ct,!0,mt),pt=At.distanceTo(Ct),at=new I.Vector3().subVectors(Ct,At).normalize(),X=at.clone().negate(),ht=Ct.clone().addScaledVector(X,pt+.1),ot=xe(dt.start,dt.end,Ct,ht),St=!Lt&&!L.isDoor&&(gt>rt*2||rt>gt*2);if(pt<.4&&ot!=null&&!St){let Mt=!1;for(let Ut=0;Ut<p.doorAndBeamData.length;Ut++)if(p.doorAndBeamData[Ut].id==L.id){Mt=!0;break}if(Mt)continue;L.nearId=i,G.nearId=L.id;let vt=.8;(L.isDoor||G.isDoor)&&(L.isDoor=!0,G.isDoor=!0),L.doorType!=""?G.doorType=L.doorType:G.doorType!=""&&(L.doorType=G.doorType),L.isPullOutDoor?G.isPullOutDoor=!0:G.isPullOutDoor&&(L.isPullOutDoor=!0);let _t=Bt.some(Ut=>L.pcbDoorIndexs.includes(Ut)),Dt=!1,ne=!1;if(G.type=="beam"&&L.type=="beam"){let Ut=s.readLineById(e[l[nt].linesIndex].id);Ut.originalPoints=s.getOriginalPointsById(e[l[nt].linesIndex].id),e[l[nt].linesIndex].originalPoints=Ut.originalPoints,Ut=null;let oe=dn(e[l[nt].linesIndex].originalPoints),Qt=dn(p.originalPoints);e[l[nt].linesIndex].originalPoints=null,oe.minZ>e[l[nt].linesIndex].start.z&&oe.minZ-e[l[nt].linesIndex].start.z>1&&Qt.minZ>p.start.z&&Qt.minZ-p.start.z>1&&(Dt=gt>rt,ne=gt<rt,rt>gt&&(G.isExtend=!0),gt>rt&&(e[l[nt].linesIndex].isExtend=!0))}gt<rt&&!ne||Dt?(Dt&&(X=X.negate(),at=at.negate()),gt>vt&&!L.isPullOutDoor?(L.beamStart=J.clone().addScaledVector(X,pt),L.beamEnd=ft.clone().addScaledVector(X,pt),L.doorStart=Q.clone().addScaledVector(X,pt),L.doorEnd=K.clone().addScaledVector(X,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):!bt||bt&&L.isPullOutDoor&&_t?(G.beamStart=L.beamStart.clone().addScaledVector(at,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(at,pt),G.doorStart=L.doorStart.clone().addScaledVector(at,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(at,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):(L.beamStart=J.clone().addScaledVector(X,pt),L.beamEnd=ft.clone().addScaledVector(X,pt),L.doorStart=Q.clone().addScaledVector(X,pt),L.doorEnd=K.clone().addScaledVector(X,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone())):(gt>rt&&!Dt||ne)&&(ne&&(X=X.negate(),at=at.negate()),rt>vt&&!bt?(G.beamStart=L.beamStart.clone().addScaledVector(X,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(X,pt),G.doorStart=L.doorStart.clone().addScaledVector(X,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(X,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone()):!L.isPullOutDoor||bt&&L.isPullOutDoor&&_t?(L.beamStart=J.clone().addScaledVector(at,pt),L.beamEnd=ft.clone().addScaledVector(at,pt),L.doorStart=Q.clone().addScaledVector(at,pt),L.doorEnd=K.clone().addScaledVector(at,pt),L.doorHeight=G.doorHeight,L.beamStart.z=L.beamEnd.z=L.doorStart.z+L.doorHeight,L.doorOpenEndPoint=G.doorOpenEndPoint.clone(),L.doorOpenVector=G.doorOpenVector.clone()):(G.beamStart=L.beamStart.clone().addScaledVector(X,pt),G.beamEnd=L.beamEnd.clone().addScaledVector(X,pt),G.doorStart=L.doorStart.clone().addScaledVector(X,pt),G.doorEnd=L.doorEnd.clone().addScaledVector(X,pt),G.doorHeight=L.doorHeight,G.beamStart.z=G.beamEnd.z=G.doorStart.z+G.doorHeight,G.doorOpenEndPoint=L.doorOpenEndPoint.clone(),G.doorOpenVector=L.doorOpenVector.clone())),ke=G.nearId,_e=L.beamStart.clone(),Ue=L.beamEnd.clone(),Be=!0,me=l[nt].linesIndex,Fe=l[nt].doorIndex;break}}}if(G.nearId!=-1&&Rt=="hole"){let nt=!1;for(let L=0;L<e.length;L++)if(e[L].doorAndBeamData){for(let xt=0;xt<e[L].doorAndBeamData.length;xt++)if(e[L].doorAndBeamData[xt].nearId==i&&e[L].doorAndBeamData[xt].type=="beam"){e[L].doorAndBeamData[xt].type=Rt,nt=!0;break}if(nt)break}}if(p.doorAndBeamIdToCheckResults.push([M.index,i]),p.doorAndBeamData.push(G),l.push({linesIndex:y,doorIndex:p.doorAndBeamData.length-1}),u.push({start:Q,end:K}),i++,bt&&U<2)break}}}let V=p.length*(p.rooftopPz-p.start.z);p.completePointAreaPercentage=z/V*100,p.checkResults=null,p.originalPoints=null,p.mergeCheckRegion=null}if(f.length>1)for(let y=0;y<f.length;y++){let p=[];for(let d=0;d<e[f[y]].doorAndBeamData.length;d++){let x=!1;if(e[f[y]].doorAndBeamData[d].type==="beam"&&(e[f[y]].doorAndBeamData[d].beamNearWallVec.x==0&&e[f[y]].doorAndBeamData[d].beamNearWallVec.y==0&&e[f[y]].doorAndBeamData[d].beamNearWallVec.z==0&&e[f[y]].doorAndBeamData[d].nearId==-1||!e[f[y]].doorAndBeamData[d].wallBelowBeam&&e[f[y]].doorAndBeamData[d].nearId==-1)&&(e[f[y]].doorAndBeamData[d].lineIsOnlyBeam?x=!0:e[f[y]].doorAndBeamData[d].type="hole"),!x){let w=e[f[y]].doorAndBeamData[d].doorStart.clone(),P=e[f[y]].doorAndBeamData[d].doorEnd.clone();w.z=P.z=0;let R=w.distanceTo(P);for(let b=0;b<f.length;b++)if(y!=b)for(let S=0;S<e[f[b]].doorAndBeamData.length;S++){let z=e[f[b]].doorAndBeamData[S].doorStart.clone(),V=e[f[b]].doorAndBeamData[S].doorEnd.clone();z.z=V.z=0;let M=z.distanceTo(V),H=ye(w,P,z,V);if(H.type=="collinear_overlap"&&H.maxPerpendicularDistance<.2){let C=new I.Line3(z,V),D=qt(w,P),B=C.closestPointToPoint(D,!0,new I.Vector3),_=D.distanceTo(B);if(Math.abs(R-H.overlap)<.1&&_<.04){e[f[b]].doorAndBeamData[S].nearId==e[f[y]].doorAndBeamData[d].id&&(e[f[b]].doorAndBeamData[S].nearId=-1),x=!0;break}}}}if(x){for(let w=0;w<e[f[y]].doorAndBeamIdToCheckResults.length;w++)if(e[f[y]].doorAndBeamIdToCheckResults[1]==e[f[y]].doorAndBeamData[d].id){e[f[y]].doorAndBeamIdToCheckResults.splice(w,1);break}}x||p.push(e[f[y]].doorAndBeamData[d])}p.length!=e[f[y]].doorAndBeamData.length&&(e[f[y]].doorAndBeamData=p)}let c=.65,m=2,h=[],g=[];for(let y=0;y<r.length;y++){if(r[y].isFind||r[y].inWall)continue;let p=new I.Vector3(r[y].doorStartPt.x,r[y].doorStartPt.y,0),d=new I.Vector3(r[y].doorEndPt.x,r[y].doorEndPt.y,0),x=new I.Vector3().subVectors(p,d).normalize();for(let w=0;w<e.length;w++){if(e[w].length<.7||e[w].completePointAreaPercentage>60)continue;let P=new I.Vector3(e[w].start.x,e[w].start.y,0),R=new I.Vector3(e[w].end.x,e[w].end.y,0),b=new I.Vector3().subVectors(P,R).normalize(),S=.3,z=p.clone().addScaledVector(x,S),V=d.clone().addScaledVector(x.clone().negate(),S),M=P.clone().addScaledVector(b,S),H=R.clone().addScaledVector(b.clone().negate(),S),C=xe(z,V,M,H),D=Yt(z,V,M,H),B=p.distanceTo(P)>d.distanceTo(P)?d:p,_=B.distanceTo(P),k=B.distanceTo(R);if((_<a||k<a)&&D&&!D.isParallel){let A=p.distanceTo(P),j=p.distanceTo(R),$=A<j?P:R,Z=!1;for(let Y=0;Y<e.length;Y++){if(Y==w||h.includes(Y)||e[Y].length<.7)continue;let tt=new I.Vector3(e[Y].start.x,e[Y].start.y,0),it=new I.Vector3(e[Y].end.x,e[Y].end.y,0),ct=new I.Vector3().subVectors(tt,it).normalize(),ut=ct.clone().negate(),q=tt.clone().addScaledVector(ct,5),W=it.clone().addScaledVector(ut,5),U=se(P,R,tt,it),wt=ye(P,R,tt,it),Ft=xe(P,R,q,W),Nt=!0;if(Ft!=null&&(Nt=Ft.point.distanceTo(P)<a||Ft.point.distanceTo(R)<a),(U&&U.angle>85||wt&&wt.type=="collinear_gap")&&Nt){let jt=new I.Line3(P,R),Lt=new I.Vector3,Tt=jt.closestPointToPoint(tt,!0,Lt),It=jt.closestPointToPoint(it,!0,Lt),Pt=Tt.distanceTo(tt),bt=It.distanceTo(it),Bt,J;if(Pt>bt&&bt>c)Bt=it,J=It;else if(Pt<bt&&Pt>c)Bt=tt,J=Tt;else continue;if(Pt=$.distanceTo(tt),bt=$.distanceTo(it),Pt>m&&bt>m)continue;let ft=Yt(Bt,J,tt,it),Q=Yt(Bt,J,z,V);if(Q&&Q.isParallel||!ft||!ft.isParallel)continue;let K=ye(p,d,Bt,J);if(K&&K.type=="collinear_overlap"&&K.maxPerpendicularDistance<.2)continue;Bt.z=J.z=e[Y].start.z;let he=!1;for(let Rt=0;Rt<g.length;Rt++){let ie=ye(g[Rt].start,g[Rt].end,Bt,J);if(ie&&ie.type=="collinear_overlap"&&ie.maxPerpendicularDistance<.2){he=!0;break}}if(he)continue;for(let Rt=0;Rt<e.length;Rt++){if(e[Rt].length<.5)continue;let ie=new I.Vector3(e[Rt].start.x,e[Rt].start.y,e[Rt].start.z),G=new I.Vector3(e[Rt].end.x,e[Rt].end.y,e[Rt].end.z),de=ye(ie,G,Bt,J);if(de&&de.type=="collinear_overlap"&&de.maxPerpendicularDistance<.1){he=!0;break}}if(he)continue;g.push({start:Bt,end:J}),h.push(Y);let Et=e[Y].rooftopPz-e[Y].start.z,re=e[w].rooftopPz-e[w].start.z,Te=Et<re?Et:re;e[Y].doorAndBeamData||(e[Y].doorAndBeamData=[]),e[Y].doorAndBeamData.push({id:i,beamStart:Bt,beamEnd:J,beamHeight:Te,doorStart:Bt,doorEnd:J,doorHeight:Te,nearId:-1,type:"onlyDoor",isDoor:!0,beamNearWallVec:new I.Vector3(0,0,0)}),n[r[y].index].isFindBeam=!0,n[r[y].index].isFindOnlyDoor=!0,E.push([{id:i,beamStart:Bt,beamEnd:J}]),i++,Z=!0;break}}if(Z)break}}}let T=[];for(let y=0;y<e.length;y++)e[y].isLine2||T.push(e[y]),e[y].isLine2&&e[y].doorAndBeamData.length!=0&&T.push(e[y]);return e.length=0,e.push(...T),{lines:e,beamGroup:E}},er=async e=>{Qs(e),To(e);let t=new pn(e);for(let n=0;n<e.length;n++){let s=e[n],o=new I.Vector3(s.start.x,s.start.y,s.start.z),r=new I.Vector3(s.end.x,s.end.y,s.end.z),i=new I.Line3(o.clone(),r.clone()),l=-1;for(let f=0;f<s.doorAndBeamData.length;f++){let u=s.doorAndBeamData[f],E=u.doorHeight;u.isRebuild=!1;let a=!1,c=!1;if(!(u.nearId!=-1||u.type!="beam")){for(let m=0;m<e.length;m++){if(e[m].length<.5||m==n)continue;let h=new I.Vector3(e[m].start.x,e[m].start.y,e[m].start.z),g=new I.Vector3(e[m].end.x,e[m].end.y,e[m].end.z),T=ye(h,g,o,r),y=Yt(h,g,o,r);if(T&&T.maxPerpendicularDistance<.5){if(y&&y.isParallel){let b=new I.Line3(h,g),S=new I.Vector3(o.x,o.y,h.z),z=b.closestPointToPoint(S,!0,new I.Vector3),V=se(z,S,o,r);V&&V.angle>85&&(u.beamNearWallVec=new I.Vector3().subVectors(z,S).normalize())}let p=[],d=t.readLineById(e[m].id);d.originalPoints=t.getOriginalPointsById(e[m].id),e[m].originalPoints=d.originalPoints,d=null,e[m].originalPoints.forEach(b=>{b.z>o.z+.2&&b.z<o.z+E/2&&p.push(new I.Vector3(b.x,b.y,o.z))}),e[m].originalPoints=null;let x=new I.Vector3,w=[],P=[];for(let b=0;b<p.length;b++){let S=i.closestPointToPoint(p[b],!0,x);S.distanceTo(p[b])<.15&&(w.push(p[b]),P.push(S.clone()))}for(let b=0;b<P.length;b++)In(i,P[b])&&w.push(P[b]);if(w=P,w=Ln(w),w.length<150)continue;let R=Ne(w);if(R.length==2){let b=R[0].distanceTo(R[1]);if(Math.abs(b-i.distance())<.3){l=T.maxPerpendicularDistance;let S=new I.Line3(h,g),z=new I.Vector3(o.x,o.y,h.z),V=S.closestPointToPoint(z,!0,new I.Vector3);u.beamNearWallVec=new I.Vector3().subVectors(V,z).normalize(),u.beamStart.z>e[m].rooftopPz-.03&&length>1?c=!0:a=!0;break}}if(a)break}else T&&T.type=="collinear_overlap"&&T.maxPerpendicularDistance>.3&&T.maxPerpendicularDistance<.7&&(c=!0)}if(a){if(length<1.8||l<.2)continue;c=!0}c||(u.isRebuild=!0)}}}t.close()};import*as yt from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var Po=(e,t={})=>{let n=t.eps??1e-6,s=t.project??(y=>({x:y.x,y:y.z})),o=t.skipSplit??!1,r=t.insideAreaSign??"positive",i=o?e.map((y,p)=>({start:gn(y.start),end:gn(y.end),uuid:y.uuid,sourceIndex:p,sourceSegment:y})):nr(e,s,n),l=[],f=new Map;function u(y){let p=Math.round(y.x/n),d=Math.round(y.y/n);return`${p},${d}`}function E(y){let p=u(y);if(f.has(p))return f.get(p);let d=l.length;return l.push({id:d,x:y.x,y:y.y}),f.set(p,d),d}let a=[],c=new Map;for(let y of i){let p=s(y.start),d=s(y.end);if(Ro(p,d)<n*n)continue;let x=E(p),w=E(d);if(x===w)continue;let P=x<w?`${x}_${w}`:`${w}_${x}`;if(c.has(P))continue;let R=a.length;a.push({id:R,a:x,b:w,uuid:y.uuid,sourceIndex:y.sourceIndex,sourceSegment:y.sourceSegment||y}),c.set(P,R)}let m=[],h=Array.from({length:l.length},()=>[]);function g(y,p,d,x,w){let P=l[y],R=l[p],b=m.length,S=Math.atan2(R.y-P.y,R.x-P.x),z={id:b,from:y,to:p,twin:null,next:null,angle:S,edgeId:d,uuid:x,sourceIndex:w,visited:!1};return m.push(z),h[y].push(b),b}for(let y of a){let p=g(y.a,y.b,y.id,y.uuid,y.sourceIndex),d=g(y.b,y.a,y.id,y.uuid,y.sourceIndex);m[p].twin=d,m[d].twin=p}for(let y of h)y.sort((p,d)=>m[p].angle-m[d].angle);for(let y of m){let p=h[y.to],d=y.twin,x=p.indexOf(d);if(x===-1)continue;let w=(x-1+p.length)%p.length;y.next=p[w]}let T=[];for(let y of m){if(y.visited)continue;let p=[],d=[],x=y.id,w=0,P=m.length+10;for(;;){let M=m[x];if(!M||M.visited)break;if(M.visited=!0,p.push(x),d.push(M.from),x=M.next,w++,w>P){console.warn("\u534A\u8FB9\u904D\u5386\u5F02\u5E38\uFF0C\u53EF\u80FD\u5B58\u5728\u975E\u5E73\u9762\u56FE\u3001\u91CD\u590D\u7EBF\u3001\u60AC\u6302\u7EBF\u6216\u810F\u6570\u636E");break}}if(p.length<3)continue;let R=d.map(M=>l[M]),b=sr(R),S=!1;if(r==="positive"?S=b>n:S=b<-n,!S)continue;let z=p.map(M=>m[M].uuid),V=p.map(M=>m[M].sourceIndex);T.push({uuids:z,area:Math.abs(b),lineIndexes:V})}return T};function nr(e,t,n=1e-6){let s=[];for(let o=0;o<e.length;o++){let r=e[o],i=t(r.start),l=t(r.end),f=[{t:0,point:gn(r.start)},{t:1,point:gn(r.end)}];for(let E=0;E<e.length;E++){if(o===E)continue;let a=e[E],c=t(a.start),m=t(a.end),h=or(i,l,c,m,n);h&&h.t>n&&h.t<1-n&&f.push({t:h.t,point:rr(r.start,r.end,h.t)})}f.sort((E,a)=>E.t-a.t);let u=[];for(let E of f)(u.length===0||Math.abs(E.t-u[u.length-1].t)>n)&&u.push(E);for(let E=0;E<u.length-1;E++){let a=u[E].point,c=u[E+1].point,m=t(a),h=t(c);Ro(m,h)<n*n||s.push({start:a,end:c,uuid:r.uuid,sourceIndex:o,sourceSegment:r})}}return s}function or(e,t,n,s,o=1e-6){let r={x:t.x-e.x,y:t.y-e.y},i={x:s.x-n.x,y:s.y-n.y},l={x:n.x-e.x,y:n.y-e.y},f=Wn(r,i);if(Math.abs(f)<o)return null;let u=Wn(l,i)/f,E=Wn(l,r)/f;return u>=-o&&u<=1+o&&E>=-o&&E<=1+o?{t:u,u:E,point:{x:e.x+u*r.x,y:e.y+u*r.y}}:null}function Wn(e,t){return e.x*t.y-e.y*t.x}function Ro(e,t){let n=e.x-t.x,s=e.y-t.y;return n*n+s*s}function sr(e){let t=0;for(let n=0;n<e.length;n++){let s=e[n],o=e[(n+1)%e.length];t+=s.x*o.y-o.x*s.y}return t/2}function rr(e,t,n){return e&&typeof e.clone=="function"&&typeof e.lerp=="function"?e.clone().lerp(t,n):{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n,z:e.z!==void 0&&t.z!==void 0?e.z+(t.z-e.z)*n:void 0}}function gn(e){return e&&typeof e.clone=="function"?e.clone():{x:e.x,y:e.y,z:e.z}}var ir=(e,t)=>{if(!e||e.length<=0)return;let n={rectangles:[],threeEdgeRect:[]},s=new Set,o=.1,r=1.2,i=.15,l=2,f=80,u=95;if(!e[0].uuid){let c=1e4;for(let m=0;m<e.length;m++)e[m].uuid=c++}let E=[];for(let c=0;c<e.length;c++)E.push({start:e[c].start,end:e[c].end,uuid:e[c].uuid});let a=Po(E,{eps:1e-5,returnDetail:!0,project:c=>({x:c.x,y:c.y})});for(let c=0;c<a.length;c++){if(a[c].uuids.length<4||a[c].area<i||a[c].area>l)continue;let m=!1;for(let h=0;h<a[c].lineIndexes.length;h++){let g=e[a[c].lineIndexes[h]].length;if(g<o||g>r)break;let T=new yt.Vector3(e[a[c].lineIndexes[h]].start.x,e[a[c].lineIndexes[h]].start.y,e[a[c].lineIndexes[h]].start.z),y=new yt.Vector3(e[a[c].lineIndexes[h]].end.x,e[a[c].lineIndexes[h]].end.y,e[a[c].lineIndexes[h]].end.z),p=!1,d=new yt.Vector3(0,0,0);for(let x=h+1;x<a[c].lineIndexes.length;x++){let w=e[a[c].lineIndexes[x]].length;if(w<o||w>r)break;let P=new yt.Vector3(e[a[c].lineIndexes[x]].start.x,e[a[c].lineIndexes[x]].start.y,e[a[c].lineIndexes[x]].start.z),R=new yt.Vector3(e[a[c].lineIndexes[x]].end.x,e[a[c].lineIndexes[x]].end.y,e[a[c].lineIndexes[x]].end.z),b=Yt(T,y,P,R);if(b&&b.isParallel){if(g+w>r){p=!0;break}g+=w;let z=st(T,P),V=st(T,R),M=st(y,P),H=st(y,R);z?(T=y.clone(),y=R.clone()):V?(T=y.clone(),y=P.clone()):M?y=R.clone():H&&(y=P.clone());continue}let S=se(T,y,P,R);if(!S||S.angle<f||S.angle>u){p=!0;break}for(let z=x+1;z<a[c].lineIndexes.length;z++){let V=e[a[c].lineIndexes[z]].length;if(V<o||V>r)break;let M=new yt.Vector3(e[a[c].lineIndexes[z]].start.x,e[a[c].lineIndexes[z]].start.y,e[a[c].lineIndexes[z]].start.z),H=new yt.Vector3(e[a[c].lineIndexes[z]].end.x,e[a[c].lineIndexes[z]].end.y,e[a[c].lineIndexes[z]].end.z),C=Yt(P,R,M,H);if(C&&C.isParallel){if(w+V>r){p=!0;break}w+=V;let B=st(P,M),_=st(P,H),k=st(R,M),v=st(R,H);B?(P=R.clone(),R=H.clone()):_?(P=R.clone(),R=M.clone()):k?R=H.clone():v&&(R=M.clone());continue}let D=se(P,R,M,H);if(!D||D.angle<f||D.angle>u){p=!0;break}for(let B=z+1;B<a[c].lineIndexes.length;B++){let _=e[a[c].lineIndexes[B]].length;if(_<o||_>r)break;let k=new yt.Vector3(e[a[c].lineIndexes[B]].start.x,e[a[c].lineIndexes[B]].start.y,e[a[c].lineIndexes[B]].start.z),v=new yt.Vector3(e[a[c].lineIndexes[B]].end.x,e[a[c].lineIndexes[B]].end.y,e[a[c].lineIndexes[B]].end.z),A=Yt(M,H,k,v);if(A&&A.isParallel){if(V+_>r){p=!0;break}V+=_;let it=st(M,k),ct=st(M,v),ut=st(H,k),q=st(H,v);it?(M=H.clone(),H=v.clone()):ct?(M=H.clone(),H=k.clone()):ut?H=v.clone():q&&(H=k.clone());continue}let j=se(M,H,k,v);if(!j||j.angle<f||j.angle>u){p=!0;break}let $=st(k,T),Z=st(k,y),Y=st(v,T),tt=st(v,y);if($||Z||Y||tt)m=!0;else for(let it=B+1;it<a[c].lineIndexes.length;it++){let ct=e[a[c].lineIndexes[it]].length;if(ct<o||ct>r)break;let ut=new yt.Vector3(e[a[c].lineIndexes[it]].start.x,e[a[c].lineIndexes[it]].start.y,e[a[c].lineIndexes[it]].start.z),q=new yt.Vector3(e[a[c].lineIndexes[it]].end.x,e[a[c].lineIndexes[it]].end.y,e[a[c].lineIndexes[it]].end.z),W=Yt(k,v,ut,q);if(W&&W.isParallel){if(_+ct>r){p=!0;break}_+=ct;let U=st(k,ut),wt=st(k,q),Ft=st(v,ut),Nt=st(v,q);if(U)k=v.clone(),v=q.clone();else if(wt)k=v.clone(),v=ut.clone();else if(Ft)v=q.clone();else if(Nt)v=ut.clone();else continue;if($=st(k,T),Z=st(k,y),Y=st(v,T),tt=st(v,y),$||Z||Y||tt){m=!0;break}}}break}if(p)break}if(p)break}if(p)break}m&&n.rectangles.push(a[c].uuids)}for(let c=0;c<e.length;c++){let m=e[c].length;if(s.has(e[c].uuid)||m<o||m>r)continue;let h={uuids:[],missingEdge:{start:new yt.Vector3,end:new yt.Vector3}},g=new yt.Vector3(e[c].start.x,e[c].start.y,e[c].start.z),T=new yt.Vector3(e[c].end.x,e[c].end.y,e[c].end.z),y=!0,p=!0;for(let w=0;w<e.length;w++){if(w==c)continue;let P=new yt.Vector3(e[w].start.x,e[w].start.y,e[w].start.z),R=new yt.Vector3(e[w].end.x,e[w].end.y,e[w].end.z),b=st(P,g),S=st(R,g),z=st(P,T),V=st(R,T);if(b||S?y=!1:(z||V)&&(p=!1),!y&&!p)break}if(!y&&!p)continue;let d=new yt.Vector3;y||([g,T]=[T,g]),d=new yt.Vector3().subVectors(T,g).normalize();let x=d.clone().negate();for(let w=0;w<e.length;w++){let P=e[w].length;if(w==c||s.has(w)||P<o||P>r)continue;let R=new yt.Vector3(e[w].start.x,e[w].start.y,e[w].start.z),b=new yt.Vector3(e[w].end.x,e[w].end.y,e[w].end.z),S=se(g,T,R,b);if(!S||S.angle<85)continue;let z=st(R,T),V=st(b,T);if(!z&&!V)continue;let M=new yt.Vector3,H=new yt.Vector3;z?(M=R.clone(),H=b.clone()):(M=b.clone(),H=R.clone());for(let C=0;C<e.length;C++){let D=e[C].length;if(C==c||C==w||s.has(C)||D<o||D>r)continue;let B=new yt.Vector3(e[C].start.x,e[C].start.y,e[C].start.z),_=new yt.Vector3(e[C].end.x,e[C].end.y,e[C].end.z),k=se(R,b,B,_);if(!k||k.angle<85)continue;let v=st(B,H),A=st(_,H);if(!v&&!A)continue;let j=new yt.Vector3,$=new yt.Vector3;v?(j=B.clone(),$=_.clone()):(j=_.clone(),$=B.clone());let Z=new yt.Vector3().subVectors($,j).normalize(),Y=Kt(x,Z,.1);if(!Y||!Y.parallel||!Y.sameDirection)continue;let tt=!0,it=!0;for(let ut=0;ut<e.length;ut++){if(ut==C)continue;let q=new yt.Vector3(e[ut].start.x,e[ut].start.y,e[ut].start.z),W=new yt.Vector3(e[ut].end.x,e[ut].end.y,e[ut].end.z),U=st(q,B),wt=st(W,B),Ft=st(q,_),Nt=st(W,_);if(U||wt?tt=!1:(Ft||Nt)&&(it=!1),!tt&&!it)break}if(!tt&&!it)continue;let ct=m*P;if(!(ct<i||ct>l)){h.uuids=[e[c].uuid,e[w].uuid,e[C].uuid],h.missingEdge.start=$,h.missingEdge.end=g;break}}if(h.uuids.length==3)break}h.uuids.length==3&&(h.uuids.forEach(w=>s.add(w)),n.threeEdgeRect.push(h))}return n};import*as F from"three";import"three/examples/jsm/utils/BufferGeometryUtils.js";var zt=11102230246251565e-32,Gt=134217729,nn=(3+8*zt)*zt;function Le(e,t,n,s,o){let r,i,l,f,u=t[0],E=s[0],a=0,c=0;E>u==E>-u?(r=u,u=t[++a]):(r=E,E=s[++c]);let m=0;if(a<e&&c<n)for(E>u==E>-u?(i=u+r,l=r-(i-u),u=t[++a]):(i=E+r,l=r-(i-E),E=s[++c]),r=i,l!==0&&(o[m++]=l);a<e&&c<n;)E>u==E>-u?(i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a]):(i=r+E,f=i-r,l=r-(i-f)+(E-f),E=s[++c]),r=i,l!==0&&(o[m++]=l);for(;a<e;)i=r+u,f=i-r,l=r-(i-f)+(u-f),u=t[++a],r=i,l!==0&&(o[m++]=l);for(;c<n;)i=r+E,f=i-r,l=r-(i-f)+(E-f),E=s[++c],r=i,l!==0&&(o[m++]=l);return(r!==0||m===0)&&(o[m++]=r),m}function on(e,t){let n=t[0];for(let s=1;s<e;s++)n+=t[s];return n}function N(e){return new Float64Array(e)}var lr=(3+16*zt)*zt,ar=(2+12*zt)*zt,fr=(9+64*zt)*zt*zt,qe=N(4),So=N(8),zo=N(12),Vo=N(16),ee=N(4);function ur(e,t,n,s,o,r,i){let l,f,u,E,a,c,m,h,g,T,y,p,d,x,w,P,R,b,S=e-o,z=n-o,V=t-r,M=s-r;x=S*M,c=Gt*S,m=c-(c-S),h=S-m,c=Gt*M,g=c-(c-M),T=M-g,w=h*T-(x-m*g-h*g-m*T),P=V*z,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*z,g=c-(c-z),T=z-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,qe[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,qe[1]=d-(y+a)+(a-P),b=p+y,a=b-p,qe[2]=p-(b-a)+(y-a),qe[3]=b;let H=on(4,qe),C=ar*i;if(H>=C||-H>=C||(a=e-S,l=e-(S+a)+(a-o),a=n-z,u=n-(z+a)+(a-o),a=t-V,f=t-(V+a)+(a-r),a=s-M,E=s-(M+a)+(a-r),l===0&&f===0&&u===0&&E===0)||(C=fr*i+nn*Math.abs(H),H+=S*E+M*l-(V*u+z*f),H>=C||-H>=C))return H;x=l*M,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*M,g=c-(c-M),T=M-g,w=h*T-(x-m*g-h*g-m*T),P=f*z,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*z,g=c-(c-z),T=z-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,ee[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let D=Le(4,qe,4,ee,So);x=S*E,c=Gt*S,m=c-(c-S),h=S-m,c=Gt*E,g=c-(c-E),T=E-g,w=h*T-(x-m*g-h*g-m*T),P=V*u,c=Gt*V,m=c-(c-V),h=V-m,c=Gt*u,g=c-(c-u),T=u-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,ee[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let B=Le(D,So,4,ee,zo);x=l*E,c=Gt*l,m=c-(c-l),h=l-m,c=Gt*E,g=c-(c-E),T=E-g,w=h*T-(x-m*g-h*g-m*T),P=f*u,c=Gt*f,m=c-(c-f),h=f-m,c=Gt*u,g=c-(c-u),T=u-g,R=h*T-(P-m*g-h*g-m*T),y=w-R,a=w-y,ee[0]=w-(y+a)+(a-R),p=x+y,a=p-x,d=x-(p-a)+(y-a),y=d-P,a=d-y,ee[1]=d-(y+a)+(a-P),b=p+y,a=b-p,ee[2]=p-(b-a)+(y-a),ee[3]=b;let _=Le(B,zo,4,ee,Vo);return Vo[_-1]}function $e(e,t,n,s,o,r){let i=(t-r)*(n-o),l=(e-o)*(s-r),f=i-l,u=Math.abs(i+l);return Math.abs(f)>=lr*u?f:-ur(e,t,n,s,o,r,u)}var Xl=(7+56*zt)*zt,Yl=(3+28*zt)*zt,Gl=(26+288*zt)*zt*zt,Zl=N(4),Ul=N(4),Kl=N(4),Jl=N(4),Ql=N(4),tc=N(4),ec=N(4),nc=N(4),oc=N(4),sc=N(8),rc=N(8),ic=N(8),lc=N(4),cc=N(8),ac=N(8),fc=N(16),uc=N(12),hc=N(192),dc=N(192);var gc=(10+96*zt)*zt,yc=(4+48*zt)*zt,Ec=(44+576*zt)*zt*zt,xc=N(4),wc=N(4),bc=N(4),Tc=N(4),Pc=N(4),Rc=N(4),Sc=N(4),zc=N(4),Vc=N(8),Mc=N(8),vc=N(8),Hc=N(8),Bc=N(8),_c=N(8),kc=N(8),Cc=N(8),Dc=N(8),Ic=N(4),Lc=N(4),Ac=N(4),Fc=N(8),Oc=N(16),Nc=N(16),Wc=N(16),jc=N(32),qc=N(32),$c=N(48),Xc=N(64),Yc=N(1152),Gc=N(1152);var Jc=(16+224*zt)*zt,Qc=(5+72*zt)*zt,ta=(71+1408*zt)*zt*zt,ea=N(4),na=N(4),oa=N(4),sa=N(4),ra=N(4),ia=N(4),la=N(4),ca=N(4),aa=N(4),fa=N(4),ua=N(24),ha=N(24),da=N(24),ma=N(24),pa=N(24),ga=N(24),ya=N(24),Ea=N(24),xa=N(24),wa=N(24),ba=N(1152),Ta=N(1152),Pa=N(1152),Ra=N(1152),Sa=N(1152),za=N(2304),Va=N(2304),Ma=N(3456),va=N(5760),Ha=N(8),Ba=N(8),_a=N(8),ka=N(16),Ca=N(24),Da=N(48),Ia=N(48),La=N(96),Aa=N(192),Fa=N(384),Oa=N(384),Na=N(384),Wa=N(768);var ja=N(96),qa=N(96),$a=N(96),Xa=N(1152);var vo=Math.pow(2,-52),yn=new Uint32Array(512),Ye=class e{static from(t,n=yr,s=Er){let o=t.length,r=new Float64Array(o*2);for(let i=0;i<o;i++){let l=t[i];r[2*i]=n(l),r[2*i+1]=s(l)}return new e(r)}constructor(t){let n=t.length>>1;if(n>0&&typeof t[0]!="number")throw new Error("Expected coords to contain numbers.");this.coords=t;let s=Math.max(2*n-5,0);this._triangles=new Uint32Array(s*3),this._halfedges=new Int32Array(s*3),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.trianglesLen=0,this._cx=0,this._cy=0,this._hullStart=0,this.hull=this._triangles,this.triangles=this._triangles,this.halfedges=this._halfedges,this.update()}update(){let{coords:t,_hullPrev:n,_hullNext:s,_hullTri:o,_hullHash:r}=this,i=t.length>>1,l=1/0,f=1/0,u=-1/0,E=-1/0;for(let S=0;S<i;S++){let z=t[2*S],V=t[2*S+1];z<l&&(l=z),V<f&&(f=V),z>u&&(u=z),V>E&&(E=V),this._ids[S]=S}let a=(l+u)/2,c=(f+E)/2,m=0,h=0,g=0;for(let S=0,z=1/0;S<i;S++){let V=jn(a,c,t[2*S],t[2*S+1]);V<z&&(m=S,z=V)}let T=t[2*m],y=t[2*m+1];for(let S=0,z=1/0;S<i;S++){if(S===m)continue;let V=jn(T,y,t[2*S],t[2*S+1]);V<z&&V>0&&(h=S,z=V)}let p=t[2*h],d=t[2*h+1],x=1/0;for(let S=0;S<i;S++){if(S===m||S===h)continue;let z=pr(T,y,p,d,t[2*S],t[2*S+1]);z<x&&(g=S,x=z)}let w=t[2*g],P=t[2*g+1];if(x===1/0){for(let V=0;V<i;V++)this._dists[V]=t[2*V]-t[0]||t[2*V+1]-t[1];Xe(this._ids,this._dists,0,i-1);let S=new Uint32Array(i),z=0;for(let V=0,M=-1/0;V<i;V++){let H=this._ids[V],C=this._dists[H];C>M&&(S[z++]=H,M=C)}this.hull=S.subarray(0,z),this.triangles=new Uint32Array(0),this.halfedges=new Int32Array(0);return}if($e(T,y,p,d,w,P)<0){let S=h,z=p,V=d;h=g,p=w,d=P,g=S,w=z,P=V}let R=gr(T,y,p,d,w,P);this._cx=R.x,this._cy=R.y;for(let S=0;S<i;S++)this._dists[S]=jn(t[2*S],t[2*S+1],R.x,R.y);Xe(this._ids,this._dists,0,i-1),this._hullStart=m;let b=3;s[m]=n[g]=h,s[h]=n[m]=g,s[g]=n[h]=m,o[m]=0,o[h]=1,o[g]=2,r.fill(-1),r[this._hashKey(T,y)]=m,r[this._hashKey(p,d)]=h,r[this._hashKey(w,P)]=g,this.trianglesLen=0,this._addTriangle(m,h,g,-1,-1,-1);for(let S=0,z=0,V=0;S<this._ids.length;S++){let M=this._ids[S],H=t[2*M],C=t[2*M+1];if(S>0&&Math.abs(H-z)<=vo&&Math.abs(C-V)<=vo||(z=H,V=C,M===m||M===h||M===g))continue;let D=0;for(let A=0,j=this._hashKey(H,C);A<this._hashSize&&(D=r[(j+A)%this._hashSize],!(D!==-1&&D!==s[D]));A++);D=n[D];let B=D,_;for(;_=s[B],$e(H,C,t[2*B],t[2*B+1],t[2*_],t[2*_+1])>=0;)if(B=_,B===D){B=-1;break}if(B===-1)continue;let k=this._addTriangle(B,M,s[B],-1,-1,o[B]);o[M]=this._legalize(k+2),o[B]=k,b++;let v=s[B];for(;_=s[v],$e(H,C,t[2*v],t[2*v+1],t[2*_],t[2*_+1])<0;)k=this._addTriangle(v,M,_,o[M],-1,o[v]),o[M]=this._legalize(k+2),s[v]=v,b--,v=_;if(B===D)for(;_=n[B],$e(H,C,t[2*_],t[2*_+1],t[2*B],t[2*B+1])<0;)k=this._addTriangle(_,M,B,-1,o[B],o[_]),this._legalize(k+2),o[_]=k,s[B]=B,b--,B=_;this._hullStart=n[M]=B,s[B]=n[v]=M,s[M]=v,r[this._hashKey(H,C)]=M,r[this._hashKey(t[2*B],t[2*B+1])]=B}this.hull=new Uint32Array(b);for(let S=0,z=this._hullStart;S<b;S++)this.hull[S]=z,z=s[z];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(t,n){return Math.floor(dr(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){let{_triangles:n,_halfedges:s,coords:o}=this,r=0,i=0;for(;;){let l=s[t],f=t-t%3;if(i=f+(t+2)%3,l===-1){if(r===0)break;t=yn[--r];continue}let u=l-l%3,E=f+(t+1)%3,a=u+(l+2)%3,c=n[i],m=n[t],h=n[E],g=n[a];if(mr(o[2*c],o[2*c+1],o[2*m],o[2*m+1],o[2*h],o[2*h+1],o[2*g],o[2*g+1])){n[t]=g,n[l]=c;let y=s[a];if(y===-1){let d=this._hullStart;do{if(this._hullTri[d]===a){this._hullTri[d]=t;break}d=this._hullPrev[d]}while(d!==this._hullStart)}this._link(t,y),this._link(l,s[i]),this._link(i,a);let p=u+(l+1)%3;r<yn.length&&(yn[r++]=p)}else{if(r===0)break;t=yn[--r]}}return i}_link(t,n){this._halfedges[t]=n,n!==-1&&(this._halfedges[n]=t)}_addTriangle(t,n,s,o,r,i){let l=this.trianglesLen;return this._triangles[l]=t,this._triangles[l+1]=n,this._triangles[l+2]=s,this._link(l,o),this._link(l+1,r),this._link(l+2,i),this.trianglesLen+=3,l}};function dr(e,t){let n=e/(Math.abs(e)+Math.abs(t));return(t>0?3-n:1+n)/4}function jn(e,t,n,s){let o=e-n,r=t-s;return o*o+r*r}function mr(e,t,n,s,o,r,i,l){let f=e-i,u=t-l,E=n-i,a=s-l,c=o-i,m=r-l,h=f*f+u*u,g=E*E+a*a,T=c*c+m*m;return f*(a*T-g*m)-u*(E*T-g*c)+h*(E*m-a*c)<0}function pr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,E=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=(u*E-l*a)*c,h=(i*a-f*E)*c;return m*m+h*h}function gr(e,t,n,s,o,r){let i=n-e,l=s-t,f=o-e,u=r-t,E=i*i+l*l,a=f*f+u*u,c=.5/(i*u-l*f),m=e+(u*E-l*a)*c,h=t+(i*a-f*E)*c;return{x:m,y:h}}function Xe(e,t,n,s){if(s-n<=20)for(let o=n+1;o<=s;o++){let r=e[o],i=t[r],l=o-1;for(;l>=n&&t[e[l]]>i;)e[l+1]=e[l--];e[l+1]=r}else{let o=n+s>>1,r=n+1,i=s;sn(e,o,r),t[e[n]]>t[e[s]]&&sn(e,n,s),t[e[r]]>t[e[s]]&&sn(e,r,s),t[e[n]]>t[e[r]]&&sn(e,n,r);let l=e[r],f=t[l];for(;;){do r++;while(t[e[r]]<f);do i--;while(t[e[i]]>f);if(i<r)break;sn(e,r,i)}e[n+1]=e[i],e[i]=l,s-r+1>=i-n?(Xe(e,t,r,s),Xe(e,t,n,i-1)):(Xe(e,t,n,i-1),Xe(e,t,r,s))}}function sn(e,t,n){let s=e[t];e[t]=e[n],e[n]=s}function yr(e){return e[0]}function Er(e){return e[1]}var ae=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,s){t=+t,n=+n,s=+s;let o=t+s,r=n;if(s<0)throw new Error("negative radius");this._x1===null?this._+=`M${o},${r}`:(Math.abs(this._x1-o)>1e-6||Math.abs(this._y1-r)>1e-6)&&(this._+="L"+o+","+r),s&&(this._+=`A${s},${s},0,1,1,${t-s},${n}A${s},${s},0,1,1,${this._x1=o},${this._y1=r}`)}rect(t,n,s,o){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+s}v${+o}h${-s}Z`}value(){return this._||null}};var Ve=class{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}};var rn=class{constructor(t,[n,s,o,r]=[0,0,960,500]){if(!((o=+o)>=(n=+n))||!((r=+r)>=(s=+s)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(t.points.length*2),this.vectors=new Float64Array(t.points.length*2),this.xmax=o,this.xmin=n,this.ymax=r,this.ymin=s,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:t,hull:n,triangles:s},vectors:o}=this,r,i,l=this.circumcenters=this._circumcenters.subarray(0,s.length/3*2);for(let g=0,T=0,y=s.length,p,d;g<y;g+=3,T+=2){let x=s[g]*2,w=s[g+1]*2,P=s[g+2]*2,R=t[x],b=t[x+1],S=t[w],z=t[w+1],V=t[P],M=t[P+1],H=S-R,C=z-b,D=V-R,B=M-b,_=(H*B-C*D)*2;if(Math.abs(_)<1e-9){if(r===void 0){r=i=0;for(let v of n)r+=t[v*2],i+=t[v*2+1];r/=n.length,i/=n.length}let k=1e9*Math.sign((r-R)*B-(i-b)*D);p=(R+V)/2-k*B,d=(b+M)/2+k*D}else{let k=1/_,v=H*H+C*C,A=D*D+B*B;p=R+(B*v-C*A)*k,d=b+(H*A-D*v)*k}l[T]=p,l[T+1]=d}let f=n[n.length-1],u,E=f*4,a,c=t[2*f],m,h=t[2*f+1];o.fill(0);for(let g=0;g<n.length;++g)f=n[g],u=E,a=c,m=h,E=f*4,c=t[2*f],h=t[2*f+1],o[u+2]=o[E]=m-h,o[u+3]=o[E+1]=c-a}render(t){let n=t==null?t=new ae:void 0,{delaunay:{halfedges:s,inedges:o,hull:r},circumcenters:i,vectors:l}=this;if(r.length<=1)return null;for(let E=0,a=s.length;E<a;++E){let c=s[E];if(c<E)continue;let m=Math.floor(E/3)*2,h=Math.floor(c/3)*2,g=i[m],T=i[m+1],y=i[h],p=i[h+1];this._renderSegment(g,T,y,p,t)}let f,u=r[r.length-1];for(let E=0;E<r.length;++E){f=u,u=r[E];let a=Math.floor(o[u]/3)*2,c=i[a],m=i[a+1],h=f*4,g=this._project(c,m,l[h+2],l[h+3]);g&&this._renderSegment(c,m,g[0],g[1],t)}return n&&n.value()}renderBounds(t){let n=t==null?t=new ae:void 0;return t.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),n&&n.value()}renderCell(t,n){let s=n==null?n=new ae:void 0,o=this._clip(t);if(o===null||!o.length)return;n.moveTo(o[0],o[1]);let r=o.length;for(;o[0]===o[r-2]&&o[1]===o[r-1]&&r>1;)r-=2;for(let i=2;i<r;i+=2)(o[i]!==o[i-2]||o[i+1]!==o[i-1])&&n.lineTo(o[i],o[i+1]);return n.closePath(),s&&s.value()}*cellPolygons(){let{delaunay:{points:t}}=this;for(let n=0,s=t.length/2;n<s;++n){let o=this.cellPolygon(n);o&&(o.index=n,yield o)}}cellPolygon(t){let n=new Ve;return this.renderCell(t,n),n.value()}_renderSegment(t,n,s,o,r){let i,l=this._regioncode(t,n),f=this._regioncode(s,o);l===0&&f===0?(r.moveTo(t,n),r.lineTo(s,o)):(i=this._clipSegment(t,n,s,o,l,f))&&(r.moveTo(i[0],i[1]),r.lineTo(i[2],i[3]))}contains(t,n,s){return n=+n,n!==n||(s=+s,s!==s)?!1:this.delaunay._step(t,n,s)===t}*neighbors(t){let n=this._clip(t);if(n)for(let s of this.delaunay.neighbors(t)){let o=this._clip(s);if(o){t:for(let r=0,i=n.length;r<i;r+=2)for(let l=0,f=o.length;l<f;l+=2)if(n[r]===o[l]&&n[r+1]===o[l+1]&&n[(r+2)%i]===o[(l+f-2)%f]&&n[(r+3)%i]===o[(l+f-1)%f]){yield s;break t}}}}_cell(t){let{circumcenters:n,delaunay:{inedges:s,halfedges:o,triangles:r}}=this,i=s[t];if(i===-1)return null;let l=[],f=i;do{let u=Math.floor(f/3);if(l.push(n[u*2],n[u*2+1]),f=f%3===2?f-2:f+1,r[f]!==t)break;f=o[f]}while(f!==i&&f!==-1);return l}_clip(t){if(t===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let n=this._cell(t);if(n===null)return null;let{vectors:s}=this,o=t*4;return this._simplify(s[o]||s[o+1]?this._clipInfinite(t,n,s[o],s[o+1],s[o+2],s[o+3]):this._clipFinite(t,n))}_clipFinite(t,n){let s=n.length,o=null,r,i,l=n[s-2],f=n[s-1],u,E=this._regioncode(l,f),a,c=0;for(let m=0;m<s;m+=2)if(r=l,i=f,l=n[m],f=n[m+1],u=E,E=this._regioncode(l,f),u===0&&E===0)a=c,c=0,o?o.push(l,f):o=[l,f];else{let h,g,T,y,p;if(u===0){if((h=this._clipSegment(r,i,l,f,u,E))===null)continue;[g,T,y,p]=h}else{if((h=this._clipSegment(l,f,r,i,E,u))===null)continue;[y,p,g,T]=h,a=c,c=this._edgecode(g,T),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(g,T):o=[g,T]}a=c,c=this._edgecode(y,p),a&&c&&this._edge(t,a,c,o,o.length),o?o.push(y,p):o=[y,p]}if(o)a=c,c=this._edgecode(o[0],o[1]),a&&c&&this._edge(t,a,c,o,o.length);else if(this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return o}_clipSegment(t,n,s,o,r,i){let l=r<i;for(l&&([t,n,s,o,r,i]=[s,o,t,n,i,r]);;){if(r===0&&i===0)return l?[s,o,t,n]:[t,n,s,o];if(r&i)return null;let f,u,E=r||i;E&8?(f=t+(s-t)*(this.ymax-n)/(o-n),u=this.ymax):E&4?(f=t+(s-t)*(this.ymin-n)/(o-n),u=this.ymin):E&2?(u=n+(o-n)*(this.xmax-t)/(s-t),f=this.xmax):(u=n+(o-n)*(this.xmin-t)/(s-t),f=this.xmin),r?(t=f,n=u,r=this._regioncode(t,n)):(s=f,o=u,i=this._regioncode(s,o))}}_clipInfinite(t,n,s,o,r,i){let l=Array.from(n),f;if((f=this._project(l[0],l[1],s,o))&&l.unshift(f[0],f[1]),(f=this._project(l[l.length-2],l[l.length-1],r,i))&&l.push(f[0],f[1]),l=this._clipFinite(t,l))for(let u=0,E=l.length,a,c=this._edgecode(l[E-2],l[E-1]);u<E;u+=2)a=c,c=this._edgecode(l[u],l[u+1]),a&&c&&(u=this._edge(t,a,c,l,u),E=l.length);else this.contains(t,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(l=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return l}_edge(t,n,s,o,r){for(;n!==s;){let i,l;switch(n){case 5:n=4;continue;case 4:n=6,i=this.xmax,l=this.ymin;break;case 6:n=2;continue;case 2:n=10,i=this.xmax,l=this.ymax;break;case 10:n=8;continue;case 8:n=9,i=this.xmin,l=this.ymax;break;case 9:n=1;continue;case 1:n=5,i=this.xmin,l=this.ymin;break}(o[r]!==i||o[r+1]!==l)&&this.contains(t,i,l)&&(o.splice(r,0,i,l),r+=2)}return r}_project(t,n,s,o){let r=1/0,i,l,f;if(o<0){if(n<=this.ymin)return null;(i=(this.ymin-n)/o)<r&&(f=this.ymin,l=t+(r=i)*s)}else if(o>0){if(n>=this.ymax)return null;(i=(this.ymax-n)/o)<r&&(f=this.ymax,l=t+(r=i)*s)}if(s>0){if(t>=this.xmax)return null;(i=(this.xmax-t)/s)<r&&(l=this.xmax,f=n+(r=i)*o)}else if(s<0){if(t<=this.xmin)return null;(i=(this.xmin-t)/s)<r&&(l=this.xmin,f=n+(r=i)*o)}return[l,f]}_edgecode(t,n){return(t===this.xmin?1:t===this.xmax?2:0)|(n===this.ymin?4:n===this.ymax?8:0)}_regioncode(t,n){return(t<this.xmin?1:t>this.xmax?2:0)|(n<this.ymin?4:n>this.ymax?8:0)}_simplify(t){if(t&&t.length>4){for(let n=0;n<t.length;n+=2){let s=(n+2)%t.length,o=(n+4)%t.length;(t[n]===t[s]&&t[s]===t[o]||t[n+1]===t[s+1]&&t[s+1]===t[o+1])&&(t.splice(s,2),n-=2)}t.length||(t=null)}return t}};var xr=2*Math.PI,Ge=Math.pow;function wr(e){return e[0]}function br(e){return e[1]}function Tr(e){let{triangles:t,coords:n}=e;for(let s=0;s<t.length;s+=3){let o=2*t[s],r=2*t[s+1],i=2*t[s+2];if((n[i]-n[o])*(n[r+1]-n[o+1])-(n[r]-n[o])*(n[i+1]-n[o+1])>1e-10)return!1}return!0}function Pr(e,t,n){return[e+Math.sin(e+t)*n,t+Math.cos(e-t)*n]}var Me=class e{static from(t,n=wr,s=br,o){return new e("length"in t?Rr(t,n,s,o):Float64Array.from(Sr(t,n,s,o)))}constructor(t){this._delaunator=new Ye(t),this.inedges=new Int32Array(t.length/2),this._hullIndex=new Int32Array(t.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let t=this._delaunator,n=this.points;if(t.hull&&t.hull.length>2&&Tr(t)){this.collinear=Int32Array.from({length:n.length/2},(c,m)=>m).sort((c,m)=>n[2*c]-n[2*m]||n[2*c+1]-n[2*m+1]);let f=this.collinear[0],u=this.collinear[this.collinear.length-1],E=[n[2*f],n[2*f+1],n[2*u],n[2*u+1]],a=1e-8*Math.hypot(E[3]-E[1],E[2]-E[0]);for(let c=0,m=n.length/2;c<m;++c){let h=Pr(n[2*c],n[2*c+1],a);n[2*c]=h[0],n[2*c+1]=h[1]}this._delaunator=new Ye(n)}else delete this.collinear;let s=this.halfedges=this._delaunator.halfedges,o=this.hull=this._delaunator.hull,r=this.triangles=this._delaunator.triangles,i=this.inedges.fill(-1),l=this._hullIndex.fill(-1);for(let f=0,u=s.length;f<u;++f){let E=r[f%3===2?f-2:f+1];(s[f]===-1||i[E]===-1)&&(i[E]=f)}for(let f=0,u=o.length;f<u;++f)l[o[f]]=f;o.length<=2&&o.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=o[0],i[o[0]]=1,o.length===2&&(i[o[1]]=0,this.triangles[1]=o[1],this.triangles[2]=o[1]))}voronoi(t){return new rn(this,t)}*neighbors(t){let{inedges:n,hull:s,_hullIndex:o,halfedges:r,triangles:i,collinear:l}=this;if(l){let a=l.indexOf(t);a>0&&(yield l[a-1]),a<l.length-1&&(yield l[a+1]);return}let f=n[t];if(f===-1)return;let u=f,E=-1;do{if(yield E=i[u],u=u%3===2?u-2:u+1,i[u]!==t)return;if(u=r[u],u===-1){let a=s[(o[t]+1)%s.length];a!==E&&(yield a);return}}while(u!==f)}find(t,n,s=0){if(t=+t,t!==t||(n=+n,n!==n))return-1;let o=s,r;for(;(r=this._step(s,t,n))>=0&&r!==s&&r!==o;)s=r;return r}_step(t,n,s){let{inedges:o,hull:r,_hullIndex:i,halfedges:l,triangles:f,points:u}=this;if(o[t]===-1||!u.length)return(t+1)%(u.length>>1);let E=t,a=Ge(n-u[t*2],2)+Ge(s-u[t*2+1],2),c=o[t],m=c;do{let h=f[m],g=Ge(n-u[h*2],2)+Ge(s-u[h*2+1],2);if(g<a&&(a=g,E=h),m=m%3===2?m-2:m+1,f[m]!==t)break;if(m=l[m],m===-1){if(m=r[(i[t]+1)%r.length],m!==h&&Ge(n-u[m*2],2)+Ge(s-u[m*2+1],2)<a)return m;break}}while(m!==c);return E}render(t){let n=t==null?t=new ae:void 0,{points:s,halfedges:o,triangles:r}=this;for(let i=0,l=o.length;i<l;++i){let f=o[i];if(f<i)continue;let u=r[i]*2,E=r[f]*2;t.moveTo(s[u],s[u+1]),t.lineTo(s[E],s[E+1])}return this.renderHull(t),n&&n.value()}renderPoints(t,n){n===void 0&&(!t||typeof t.moveTo!="function")&&(n=t,t=null),n=n==null?2:+n;let s=t==null?t=new ae:void 0,{points:o}=this;for(let r=0,i=o.length;r<i;r+=2){let l=o[r],f=o[r+1];t.moveTo(l+n,f),t.arc(l,f,n,0,xr)}return s&&s.value()}renderHull(t){let n=t==null?t=new ae:void 0,{hull:s,points:o}=this,r=s[0]*2,i=s.length;t.moveTo(o[r],o[r+1]);for(let l=1;l<i;++l){let f=2*s[l];t.lineTo(o[f],o[f+1])}return t.closePath(),n&&n.value()}hullPolygon(){let t=new Ve;return this.renderHull(t),t.value()}renderTriangle(t,n){let s=n==null?n=new ae:void 0,{points:o,triangles:r}=this,i=r[t*=3]*2,l=r[t+1]*2,f=r[t+2]*2;return n.moveTo(o[i],o[i+1]),n.lineTo(o[l],o[l+1]),n.lineTo(o[f],o[f+1]),n.closePath(),s&&s.value()}*trianglePolygons(){let{triangles:t}=this;for(let n=0,s=t.length/3;n<s;++n)yield this.trianglePolygon(n)}trianglePolygon(t){let n=new Ve;return this.renderTriangle(t,n),n.value()}};function Rr(e,t,n,s){let o=e.length,r=new Float64Array(o*2);for(let i=0;i<o;++i){let l=e[i];r[i*2]=t.call(s,l,i,e),r[i*2+1]=n.call(s,l,i,e)}return r}function*Sr(e,t,n,s){let o=0;for(let r of e)yield t.call(s,r,o,e),yield n.call(s,r,o,e),++o}function qn(e,t,n,s){let o,r;n<s?(o=n,r=s):(o=s,r=n);let i=o*t+r;e.set(i,(e.get(i)||0)+1)}function Ho(e,t,n){let s=e.get(t);s===void 0&&(s=[],e.set(t,s)),s.push(n)}function ze(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let g=0;g<e.length;g++){let T=e[g],y=`${T[0]}_${T[1]}`;t.has(y)||(t.add(y),n.push(T))}let s=n.length;if(s<3)return[];let o=new Float64Array(s*2);for(let g=0,T=0;g<s;g++){let y=n[g];o[T++]=y[0],o[T++]=y[1]}let r=new Me(o),{triangles:i}=r;if(!i.length)return[];let l=new Map;for(let g=0;g<i.length;g+=3){let T=i[g],y=i[g+1],p=i[g+2],d=T*2,x=y*2,w=p*2,P=o[d],R=o[d+1],b=o[x],S=o[x+1],z=o[w],V=o[w+1],M=P-b,H=R-S,C=P-z,D=R-V,B=b-z,_=S-V,k=B*B+_*_,v=C*C+D*D,A=M*M+H*H,j=(b-P)*(V-R)-(z-P)*(S-R);if(j===0)continue;let $=j*j,Y=P===0||b===0||z===0?$:4*$;k*v*A<=Y&&(qn(l,s,T,y),qn(l,s,y,p),qn(l,s,p,T))}if(!l.size)return[];let f=new Map,u=0,E=-1;for(let[g,T]of l){if(T!==1)continue;let y=Math.floor(g/s),p=g-y*s;E===-1&&(E=y),Ho(f,y,p),Ho(f,p,y),u++}if(u===0)return[];let a=[],c=new Uint8Array(s),m=E,h=-1;do{a.push(n[m]),c[m]=1;let g=f.get(m)||[],T=-1;for(let y=0;y<g.length;y++){let p=g[y];if(p!==h&&!c[p]){T=p;break}}if(T===-1)for(let y=0;y<g.length;y++){let p=g[y];if(p!==h){T=p;break}}if(T===-1)break;h=m,m=T}while(m!==E&&a.length<=u+1);return a.length>0&&a.push(a[0]),a}import*as Wt from"three";import{OBB as qr}from"three/examples/jsm/math/OBB.js";var Zt=63710088e-1,_o={centimeters:Zt*100,centimetres:Zt*100,degrees:360/(2*Math.PI),feet:Zt*3.28084,inches:Zt*39.37,kilometers:Zt/1e3,kilometres:Zt/1e3,meters:Zt,metres:Zt,miles:Zt/1609.344,millimeters:Zt*1e3,millimetres:Zt*1e3,nauticalmiles:Zt/1852,radians:1,yards:Zt*1.0936};function ko(e,t,n={}){let s={type:"Feature"};return(n.id===0||n.id)&&(s.id=n.id),n.bbox&&(s.bbox=n.bbox),s.properties=t||{},s.geometry=e,s}function En(e,t,n={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!Bo(e[0])||!Bo(e[1]))throw new Error("coordinates must contain numbers");return ko({type:"Point",coordinates:e},t,n)}function xn(e,t,n={}){for(let o of e){if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(o[o.length-1].length!==o[0].length)throw new Error("First and last Position are not equivalent.");for(let r=0;r<o[o.length-1].length;r++)if(o[o.length-1][r]!==o[0][r])throw new Error("First and last Position are not equivalent.")}return ko({type:"Polygon",coordinates:e},t,n)}function zr(e,t="kilometers"){let n=_o[t];if(!n)throw new Error(t+" units is invalid");return e*n}function Vr(e,t="kilometers"){let n=_o[t];if(!n)throw new Error(t+" units is invalid");return e/n}function wn(e){return e%(2*Math.PI)*180/Math.PI}function fe(e){return e%360*Math.PI/180}function bn(e,t="kilometers",n="kilometers"){if(!(e>=0))throw new Error("length must be a positive number");return zr(Vr(e,t),n)}function Bo(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function Co(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function we(e,t,n){if(e!==null)for(var s,o,r,i,l,f,u,E=0,a=0,c,m=e.type,h=m==="FeatureCollection",g=m==="Feature",T=h?e.features.length:1,y=0;y<T;y++){u=h?e.features[y].geometry:g?e.geometry:e,c=u?u.type==="GeometryCollection":!1,l=c?u.geometries.length:1;for(var p=0;p<l;p++){var d=0,x=0;if(i=c?u.geometries[p]:u,i!==null){f=i.coordinates;var w=i.type;switch(E=n&&(w==="Polygon"||w==="MultiPolygon")?1:0,w){case null:break;case"Point":if(t(f,a,y,d,x)===!1)return!1;a++,d++;break;case"LineString":case"MultiPoint":for(s=0;s<f.length;s++){if(t(f[s],a,y,d,x)===!1)return!1;a++,w==="MultiPoint"&&d++}w==="LineString"&&d++;break;case"Polygon":case"MultiLineString":for(s=0;s<f.length;s++){for(o=0;o<f[s].length-E;o++){if(t(f[s][o],a,y,d,x)===!1)return!1;a++}w==="MultiLineString"&&d++,w==="Polygon"&&x++}w==="Polygon"&&d++;break;case"MultiPolygon":for(s=0;s<f.length;s++){for(x=0,o=0;o<f[s].length;o++){for(r=0;r<f[s][o].length-E;r++){if(t(f[s][o][r],a,y,d,x)===!1)return!1;a++}x++}d++}break;case"GeometryCollection":for(s=0;s<i.geometries.length;s++)if(we(i.geometries[s],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function Do(e){var t=[];return we(e,function(n){t.push(n)}),t}function Mr(e,t){var n,s,o,r,i,l,f,u,E,a,c=0,m=e.type==="FeatureCollection",h=e.type==="Feature",g=m?e.features.length:1;for(n=0;n<g;n++){for(l=m?e.features[n].geometry:h?e.geometry:e,u=m?e.features[n].properties:h?e.properties:{},E=m?e.features[n].bbox:h?e.bbox:void 0,a=m?e.features[n].id:h?e.id:void 0,f=l?l.type==="GeometryCollection":!1,i=f?l.geometries.length:1,o=0;o<i;o++){if(r=f?l.geometries[o]:l,r===null){if(t(null,c,u,E,a)===!1)return!1;continue}switch(r.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":{if(t(r,c,u,E,a)===!1)return!1;break}case"GeometryCollection":{for(s=0;s<r.geometries.length;s++)if(t(r.geometries[s],c,u,E,a)===!1)return!1;break}default:throw new Error("Unknown Geometry Type")}}c++}}function Io(e,t,n){var s=n;return Mr(e,function(o,r,i,l,f){r===0&&n===void 0?s=o:s=t(s,o,r,i,l,f)}),s}var ts=Ms(Qo(),1);function es(e,t={}){t.concavity=t.concavity||1/0;let n=[];if(we(e,o=>{n.push([o[0],o[1]])}),!n.length)return null;let s=(0,ts.default)(n,t.concavity);return s.length>3?xn([s]):null}function zn(e,t={}){let n=0,s=0,o=0;return we(e,function(r){n+=r[0],s+=r[1],o++},!0),En([n/o,s/o],t.properties)}function ce(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function ns(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function ss(e,t,n={}){let s;return n.final?s=os(ce(t),ce(e)):s=os(ce(e),ce(t)),s>180?-(360-s):s}function os(e,t){let n=fe(e[1]),s=fe(t[1]),o=fe(t[0]-e[0]);o>Math.PI&&(o-=2*Math.PI),o<-Math.PI&&(o+=2*Math.PI);let r=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),i=Math.atan2(o,r);return(wn(i)+360)%360}function rs(e,t,n={}){let s=ce(e),o=ce(t);o[0]+=o[0]-s[0]>180?-360:s[0]-o[0]>180?360:0;let r=Ar(s,o);return bn(r,"meters",n.units)}function Ar(e,t,n){n=n===void 0?Zt:Number(n);let s=n,o=e[1]*Math.PI/180,r=t[1]*Math.PI/180,i=r-o,l=Math.abs(t[0]-e[0])*Math.PI/180;l>Math.PI&&(l-=2*Math.PI);let f=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),u=Math.abs(f)>1e-11?i/f:Math.cos(o);return Math.sqrt(i*i+u*u*l*l)*s}function is(e,t,n,s={}){let o=t<0,r=bn(Math.abs(t),s.units,"meters");o&&(r=-Math.abs(r));let i=ce(e),l=Fr(i,r,n);return l[0]+=l[0]-i[0]>180?-360:i[0]-l[0]>180?360:0,En(l,s.properties)}function Fr(e,t,n,s){s=s===void 0?Zt:Number(s);let o=t/s,r=e[0]*Math.PI/180,i=fe(e[1]),l=fe(n),f=o*Math.cos(l),u=i+f;Math.abs(u)>Math.PI/2&&(u=u>0?Math.PI-u:-Math.PI-u);let E=Math.log(Math.tan(u/2+Math.PI/4)/Math.tan(i/2+Math.PI/4)),a=Math.abs(E)>1e-11?f/E:Math.cos(i),c=o*Math.sin(l)/a;return[((r+c)*180/Math.PI+540)%360-180,u*180/Math.PI]}function ls(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return cs(e);case"FeatureCollection":return Or(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Qn(e);default:throw new Error("unknown GeoJSON type")}}function cs(e){let t={type:"Feature"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"properties":case"geometry":return;default:t[n]=e[n]}}),t.properties=as(e.properties),e.geometry==null?t.geometry=null:t.geometry=Qn(e.geometry),t}function as(e){let t={};return e&&Object.keys(e).forEach(n=>{let s=e[n];typeof s=="object"?s===null?t[n]=null:Array.isArray(s)?t[n]=s.map(o=>o):t[n]=as(s):t[n]=s}),t}function Or(e){let t={type:"FeatureCollection"};return Object.keys(e).forEach(n=>{switch(n){case"type":case"features":return;default:t[n]=e[n]}}),t.features=e.features.map(n=>cs(n)),t}function Qn(e){let t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(n=>Qn(n)),t):(t.coordinates=fs(e.coordinates),t)}function fs(e){let t=e;return typeof t[0]!="object"?t.slice():t.map(n=>fs(n))}function to(e,t,n){if(n=n||{},!Co(n))throw new Error("options is invalid");let s=n.pivot,o=n.mutate;if(!e)throw new Error("geojson is required");if(t==null||isNaN(t))throw new Error("angle is required");if(t===0)return e;let r=s??zn(e);return(o===!1||o===void 0)&&(e=ls(e)),we(e,function(i){let f=ss(r,i)+t,u=rs(r,i),E=ns(is(r,u,f));i[0]=E[0],i[1]=E[1]}),e}function eo(e,t,n={}){if(n.final===!0)return Nr(e,t);let s=ce(e),o=ce(t),r=fe(s[0]),i=fe(o[0]),l=fe(s[1]),f=fe(o[1]),u=Math.sin(i-r)*Math.cos(f),E=Math.cos(l)*Math.sin(f)-Math.sin(l)*Math.cos(f)*Math.cos(i-r);return wn(Math.atan2(u,E))}function Nr(e,t){let n=eo(t,e);return n=(n+180)%360,n}function us(e,t={}){if(e.bbox!=null&&t.recompute!==!0)return e.bbox;let n=[1/0,1/0,-1/0,-1/0];return we(e,s=>{n[0]>s[0]&&(n[0]=s[0]),n[1]>s[1]&&(n[1]=s[1]),n[2]<s[0]&&(n[2]=s[0]),n[3]<s[1]&&(n[3]=s[1])}),n}function hs(e,t={}){let n=Number(e[0]),s=Number(e[1]),o=Number(e[2]),r=Number(e[3]);if(e.length===6)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");let i=[n,s];return xn([[i,[o,s],[o,r],[n,r],i]],t.properties,{bbox:e,id:t.id})}function ds(e){return hs(us(e))}function gs(e){return Io(e,(t,n)=>t+Wr(n),0)}function Wr(e){let t=0,n;switch(e.type){case"Polygon":return ms(e.coordinates);case"MultiPolygon":for(n=0;n<e.coordinates.length;n++)t+=ms(e.coordinates[n]);return t;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}function ms(e){let t=0;if(e&&e.length>0){t+=Math.abs(ps(e[0]));for(let n=1;n<e.length;n++)t-=Math.abs(ps(e[n]))}return t}var jr=Zt*Zt/2,no=Math.PI/180;function ps(e){let t=e.length-1;if(t<=2)return 0;let n=0,s=0;for(;s<t;){let o=e[s],r=e[s+1===t?0:s+1],i=e[s+2>=t?(s+2)%t:s+2],l=o[0]*no,f=r[1]*no,u=i[0]*no;n+=(u-l)*Math.sin(f),s++}return n*jr}function ys(e){let t=es(e);if(!t)throw new Error("Can't calculate smallestSurroundingRectangleByArea for given geometry");let n=zn(t),s=Do(t),o=Number.MAX_SAFE_INTEGER,r=null;for(let i=0;i<s.length-1;i++){let l=eo(s[i],s[i+1]),f=to(t,-1*l,{pivot:n}),u=ds(f),E=gs(u);E<o&&(o=E,r=to(u,l,{pivot:n}))}return r}function Es(e,t){let n=t[0]-e[0],s=t[1]-e[1];return Math.sqrt(n*n+s*s)}function $r(e){let t=1/0,n=-1/0,s=1/0,o=-1/0;for(let[r,i]of e)r<t&&(t=r),r>n&&(n=r),i<s&&(s=i),i>o&&(o=i);return[(n+t)*.5,(o+s)*.5]}var Mn=class e extends qr{getBoxMesh(){ve.identity(),ve.setFromMatrix3(this.rotation),ve.decompose(Vn,Ae,new Wt.Vector3);let t=this.halfSize.clone().multiplyScalar(2),n=new Wt.Mesh(new Wt.BoxGeometry(t.x,t.y,t.z));return n.position.copy(this.center),n.rotation.setFromQuaternion(Ae),n}getBoxEdge(t=16776960){let n=this.getBoxMesh();Yr.setFromObject(n);let s=new Wt.EdgesGeometry(n.geometry.clone().applyMatrix4(n.matrixWorld));return new Wt.LineSegments(s,new Wt.LineBasicMaterial({color:t,toneMapped:!1}))}toJson(){return ve.identity(),ve.setFromMatrix3(this.rotation),ve.decompose(Vn,Ae,new Wt.Vector3),{size:this.halfSize.toArray(),center:this.center.toArray(),quaternion:Ae.toArray()}}static from(t,n,s,o=new e){if(s instanceof Wt.Euler)Ae.setFromEuler(s);else if(s instanceof Wt.Quaternion)Ae.copy(s);else throw new Error("\u4F20\u5165\u7684\u65CB\u8F6C\u4E0D\u662F\u6B27\u62C9\u89D2\u6216\u8005\u56DB\u5143\u6570");return ve.compose(n,Ae,Xr),o.center.copy(n),o.halfSize.copy(t.multiplyScalar(.5)),o.rotation.setFromMatrix4(ve),o}static fromByPath2D(t,n,s,o=new e){let r=ys({type:"Polygon",coordinates:[t.map(m=>[m.x,m.y])]});if(!r)throw new Error("2d obb \u83B7\u53D6\u5931\u8D25");let i=r.geometry.coordinates[0],l=Es(i[0],i[1]),f=Es(i[1],i[2]),u=Math.atan2(i[1][1]-i[0][1],i[1][0]-i[0][0]);Vn.set(l,f,s),xs.set(0,0,u);let[E,a]=$r(i);return n.x=E,n.y=a,this.from(Vn,n,xs,o)}},ve=new Wt.Matrix4,Ae=new Wt.Quaternion,xs=new Wt.Euler,Xr=new Wt.Vector3(1,1,1),Vn=new Wt.Vector3,Yr=new Wt.Box3;import"three";function Gr(e,t,n=.005,s=.2){if(!e.length||!t.length)return 0;let o=Math.max(n,.03),r=n*n,i=new Map,l=(a,c,m)=>`${Math.floor(a/o)},${Math.floor(c/o)},${Math.floor(m/o)}`;for(let a of t){let c=l(a.x,a.y,a.z);i.has(c)||i.set(c,[]),i.get(c).push(a)}let f=0,u=Math.ceil(n/o)+1,E=[];for(let a=-u;a<=u;a++)for(let c=-u;c<=u;c++)for(let m=-u;m<=u;m++)a*a+c*c+m*m<=u*u&&E.push([a,c,m]);for(let a of e){let c=Math.floor(a.x/o),m=Math.floor(a.y/o),h=Math.floor(a.z/o),g=!1;for(let[T,y,p]of E){let d=`${c+T},${m+y},${h+p}`;if(i.has(d)){for(let x of i.get(d))if(a.distanceToSquared(x)<r){g=!0;break}if(g)break}}if(g&&(f++,f/e.length>s))return f/e.length}return f/e.length}function He(e,t,n=.5){let s=0,o=0;for(let r of e)if(t.containsPoint(r)&&(s++,o=s/e.length,o>n))break;return o}function oo(e,t,n,s){if(e.intersectsOBB(t))return!0;{let r=Jt(e,s),i=Jt(t,n);if(r||i)return!0}return!1}function so(e,t){let n=new F.Vector3,s=new F.Vector3;e.getSize(n),t.getSize(s);let o=n.x*n.y*n.z,r=s.x*s.y*s.z;return o>r?1:o<r?-1:0}function Jt(e,t){let n=!0;for(let s=0;s<t.length;s++)if(!e.containsPoint(t[s])){n=!1;break}return n}function ue(e){if(e.length===0)return{x:0,y:0,z:0,h:0};let t=0,n=0,s=-1/0,o=1/0;for(let r of e)t+=r.x,n+=r.y,s=Math.max(s,r.z),o=Math.min(o,r.z);return{x:t/e.length,y:n/e.length,z:0,maxz:s,minz:o,h:s-o}}function be(e,t,n,s){let o=[];for(let i=0;i<e.length;i++)o.push(new F.Vector3(e[i][0],e[i][1],0));if(o.length==0)return null;let r=Mn.fromByPath2D(o,t,n);return r.center.z=s,r}var Zr=(e,t)=>{let n=new F.Group,s=new F.MeshStandardMaterial({color:16737792,side:F.DoubleSide});for(let o=0;o<e.length;o++){let r=[];for(let g=0;g<e[o].path.length;g++)r.push(new F.Vector3(e[o].path[g][0],e[o].path[g][1],0));if(r.length==0)continue;n.add(e[o].obb.getBoxEdge());let i=new F.BufferGeometry;i.setFromPoints(r);let l="green",f=new F.LineBasicMaterial({color:l,depthTest:!1,depthWrite:!1}),u=new F.Line(i,f);u.position.z=e[o].maxz,n.add(u);let E=e[o].obb.center.clone(),a=ho(e[o].type,E),c=e[o].stairBottomPt1.clone(),m=e[o].stairBottomPt2.clone();for(let g=0;g<e[o].stairStepNum;g++){let T=[c,m];T.push(m.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth)),T.push(c.clone().addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth));let y=An(T,e[o].stairStepHeight),p=new F.Mesh(y,s);n.add(p),c=c.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),c=c.addScaledVector(new F.Vector3(0,0,1),e[o].stairStepHeight),m=m.addScaledVector(e[o].vecStepWidth,e[o].stairStepWidth),m=m.addScaledVector(new F.Vector3(0,0,1),e[o].stairStepHeight)}if(e[o].rectPt1.x!=0&&e[o].rectPt1.y!=0){let g=[e[o].stairBottomPt1,e[o].stairBottomPt2,e[o].rectPt2,e[o].rectPt1],T=An(g,e[o].stairStepHeight),y=new F.Mesh(T,s);n.add(y)}let h=new F.MeshBasicMaterial({color:16776960});for(let g=0;g<e[o].stairBottom1BalconyRailing.length;g++){let T=new F.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),y=new F.Mesh(T,h);y.position.set(e[o].stairBottom1BalconyRailing[g].x,e[o].stairBottom1BalconyRailing[g].z+e[o].balconyRailingHeight/2,-e[o].stairBottom1BalconyRailing[g].y),t.add(y)}for(let g=0;g<e[o].stairBottom2BalconyRailing.length;g++){let T=new F.CylinderGeometry(.03,.03,e[o].balconyRailingHeight,32),y=new F.Mesh(T,h);y.position.set(e[o].stairBottom2BalconyRailing[g].x,e[o].stairBottom2BalconyRailing[g].z+e[o].balconyRailingHeight/2,-e[o].stairBottom2BalconyRailing[g].y),t.add(y)}}return n},Ur=(e,t)=>{if(e.length==0)return[];t||(t=e[0].averagePz);let n=[],s=new Map;for(let r=0;r<e.length;r++){let i=e[r].points.map(y=>[y.x,y.y]),l=e[r].obj_id;l=l.replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing").replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/roof/g,"Ceiling");let f=l.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],u=l.indexOf("_")+1,E=l.lastIndexOf("_"),a=l.substring(u,E);if(a.includes("top")&&(u=a.indexOf("top")+4,a=a.substring(u,E)),a.includes("left")&&(u=a.indexOf("left")+5,a=a.substring(u,E)),a.includes("right")&&(u=a.indexOf("right")+6,a=a.substring(u,E)),a.includes("front")&&(u=a.indexOf("front")+6,a=a.substring(u,E)),a==="wall"||a==="stair guardrail")continue;let c=[];for(let y=0;y<e[r].points.length;y++)c.push(new F.Vector3(e[r].points[y].x,e[r].points[y].y,e[r].points[y].z));let m=-99999;if(a==="floor"){let y=new Map;for(let d=0;d<e[r].points.length;d++){let x=e[r].points[d].z;if(x=Math.floor(x*10)/10,y.has(x)){let w=y.get(x);w.num+=1,w.points.push(e[r].points[d]),y.set(x,w)}else y.set(x,{num:1,points:[e[r].points[d]]})}let p=[...y.entries()].reduce((d,x)=>x[1].num>d[1].num?x:d);i=[],i=p[1].points.map(d=>[d.x,d.y]),c=[],c=p[1].points.map(d=>new F.Vector3(d.x,d.y,d.z)),m=p[0]}let h=ue(c),g={points:c,path:ze(i),h:h.h,minz:h.minz,maxz:h.maxz,center:{x:h.x,y:h.y,z:h.z},obj_id:e[r].obj_id,type:a,averagePz:t,obb:null,isDel:!1,obj_id:l,positionArr:[e[r].position]};if(g.obb=be(g.path,g.center,g.h,(g.maxz+g.minz)/2),g.obb==null)continue;let T=-1;for(let y=0;y<n.length;y++)if(n[y].type==a){T=y;break}T!=-1?n[T].array.push(g):n.push({type:a,array:[g]})}for(let r=0;r<n.length;r++){let i=n[r].array,l=new Set,f=[];for(let E=0;E<i.length;E++){if(i[E].obb==null||l.has(E))continue;let a={...i[E],obb:i[E].obb.clone()};for(let c=E+1;c<i.length;c++){if(i[c].obb==null||l.has(c))continue;let m=a.obb.intersectsOBB(i[c].obb,.01);if(m||(m=oi(a.obb,i[c].obb)),m){l.add(c);for(let T=0;T<i[c].points.length;T++)(i[c].points[T].z>t&&i[c].points[T].z-t>.1||a.type=="floor"||a.type=="Staircase")&&a.points.push(i[c].points[T]);let h=a.points.map(T=>[T.x,T.y]);a.path=ze(h);let g=ue(a.points);a.h=g.h,a.minz=g.minz,a.maxz=g.maxz,a.center={x:g.x,y:g.y,z:g.z},a.obb=be(a.path,a.center,a.h,(a.maxz+a.minz)/2),a.positionArr.push(...i[c].positionArr),c=E}}a.path.length>i[E].path.length&&(l.add(E),f.push(a))}let u=[];for(let E=0;E<i.length;E++)l.has(E)||u.push(i[E]);u.push(...f),n[r].array=u}for(let r=0;r<n.length;r++){let i=n[r].type;if(i==="people"||i==="floor")continue;let l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].obb,E=l[f].minz,a=l[f].maxz,c=l[f].averagePz;if(i==="window"||i==="door"||i==="tv"||i==="chair"||i==="cabinet"||i==="table"){let m=new F.Vector3;u.getSize(m);let h=[m.x,m.y,m.z],g=0;for(let T of h)if(T<.2&&(g++,g===2)){l[f].isDel=!0;break}}if(!l[f].isDel)for(let m=r+1;m<n.length;m++){let h=n[m].type;if(h==="people")continue;let g=n[m].array;for(let T=0;T<g.length;T++){if(g[T].isDel)continue;let y=g[T].obb,p=g[T].minz,d=g[T].maxz;if(u.intersectsOBB(y)){let x=He(g[T].points,u),w=He(l[f].points,y),P=so(u,y);if(w>=.5&&P==-1&&i!=="Staircase"&&h!=="Staircase"){l[f].isDel=!0;break}if(i!=="wall"&&i!=="floor"&&i!=="roof"){if(i==="window"){if(h==="balcony railing"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="balcony railing"&&oo(u,y,l[f].points,g[T].points)&&(Math.abs(E-p)<.1||Math.abs(p-c)>.3)){g[T].isDel=!0;continue}if(h==="door"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}if(h==="window sill")continue}else if(i==="balcony railing"){if(h==="window"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="window"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="window"&&oo(u,y,l[f].points,g[T].points)&&(Math.abs(E-p)<.1||Math.abs(E-c)>.3)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="Staircase"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="Staircase"&&u.intersectsOBB(y)){l[f].isDel=!0;break}}else if(i==="door"){if(h==="window"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="window"&&Jt(y,l[f].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(u,g[T].points)){l[f].isDel=!0;break}if(h==="window sill"&&Jt(y,l[f].points)){l[f].isDel=!0;break}}else if(i==="window sill"){if(h==="window")continue;if(h==="floor"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="door"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}}else if(i==="Staircase"){if(h==="balcony railing"&&Jt(u,g[T].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&Jt(y,l[f].points)){g[T].isDel=!0;continue}if(h==="balcony railing"&&u.intersectsOBB(y)){g[T].isDel=!0;continue}}let R=!1,b=[],S=[],z=l[f].points,V=g[T].points;if(z.length>V.length?(R=!0,b=z,S=V):(b=V,S=z),Gr(S,b,.03,.5)>.5)if(R)g[T].isDel=!0;else{l[f].isDel=!0;break}else if(oo(u,y,l[f].points,g[T].points)){let H=so(u,y);if(H===1||H===0){if(h==="switch"||h==="Staircase")continue;z.length>V.length?He(S,u)>=.5&&(g[T].isDel=!0):He(b,u)>=.5&&(g[T].isDel=!0)}else{if(i==="switch"||i==="Staircase")continue;if(z.length>V.length){if(He(b,y)>=.5){l[f].isDel=!0;break}}else if(He(S,y)>=.5){l[f].isDel=!0;break}}}}}}if(l[f].isDel)break}}}for(let r=0;r<n.length;r++){let i=n[r].type,l=n[r].array;for(let f=0;f<l.length;f++){let u=l[f].maxz,E=l[f].minz,a=i==="switch"?.1:.3;if(Math.abs(u-t)<a&&i!="floor"){l[f].isDel=!0;continue}if(i==="window"||i==="door"||i==="tv"){let c=Math.abs(u-t),m=Math.abs(E-t);(i==="tv"&&m<1.6||i!=="window"&&c<1.6)&&(l[f].isDel=!0),i==="window"&&c<1&&(l[f].isDel=!0),i==="door"&&m>1&&(l[f].isDel=!0)}if(i==="chair"){let c=new F.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1||c.z<.2)&&(l[f].isDel=!0)}if(i==="balcony railing"&&(Math.abs(u-E)<.4&&(l[f].isDel=!0),(E<t&&Math.abs(E-t)>1||E>t&&Math.abs(E-t)>1)&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="people"&&(Math.abs(u-E)<1&&(l[f].isDel=!0),E>t&&E-t>.3&&(l[f].isDel=!0),u<t&&(l[f].isDel=!0)),i==="floor"){let c=new F.Vector3;l[f].obb.getSize(c),(c.x<.1||c.y<.1)&&(l[f].isDel=!0)}i==="stair guardrail"&&l[f].points.length<100&&(l[f].isDel=!0)}}for(let r=0;r<n.length;r++)n[r].array=n[r].array.filter(i=>!i.isDel);let o=[];for(let r=0;r<n.length;r++){let i=n[r].array;for(let l=0;l<i.length;l++)o.push({obbBox:i[l].obb,box:new F.Box3().setFromPoints(i[l].points),category:i[l].type,center:{x:i[l].center.x,y:i[l].center.y,z:(i[l].minz+i[l].maxz)/2},name:i[l].obj_id,obj_id:i[l].obj_id,pcdPoints:i[l].points,positionArr:i[l].positionArr})}return o},Kr=e=>{if(e.length==0)return[];let t=[],n=new Map;for(let o=0;o<e.length;o++){let r=e[o].points.map(T=>[T.x,T.y]),i=e[o].obj_id;i=i.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor");let l=i.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],f=i.indexOf("_")+1,u=i.lastIndexOf("_"),E=i.substring(f,u);if(E!=="floor")continue;let a=[];for(let T=0;T<e[o].points.length;T++)a.push(new F.Vector3(e[o].points[T].x,e[o].points[T].y,e[o].points[T].z));let c=-99999;if(E==="floor"){let T=new Map;for(let p=0;p<e[o].points.length;p++){let d=e[o].points[p].z;if(d=Math.floor(d*10)/10,T.has(d)){let x=T.get(d);x.num+=1,x.points.push(e[o].points[p]),T.set(d,x)}else T.set(d,{num:1,points:[e[o].points[p]]})}let y=[...T.entries()].reduce((p,d)=>d[1].num>p[1].num?d:p);r=[],r=y[1].points.map(p=>[p.x,p.y]),a=[],a=y[1].points.map(p=>new F.Vector3(p.x,p.y,p.z)),c=y[0]}let m=ue(a),h={points:a,path:ze(r),h:m.h,minz:m.minz,maxz:m.maxz,center:{x:m.x,y:m.y,z:m.z},obj_id:e[o].obj_id,type:E,obb:null,isDel:!1,obj_id:i,positionArr:[e[o].position]};if(h.obb=be(h.path,h.center,h.h,(h.maxz+h.minz)/2),h.obb==null)continue;let g=-1;for(let T=0;T<t.length;T++)if(t[T].type==E){g=T;break}if(g!=-1?t[g].array.push(h):t.push({type:E,array:[h]}),E=="floor"&&c!=-99999)if(n.has(c)){let T=n.get(c);T.num+=h.points.length,T.datas.push(h),n.set(c,T)}else n.set(c,{num:h.points.length,datas:[h]})}for(let o=0;o<t.length;o++){let r=t[o].array,i=[],l=[];for(let u=0;u<r.length;u++){if(r[u].obb==null||i.includes(u))continue;let E={...r[u],obb:r[u].obb.clone()};for(let a=u+1;a<r.length;a++){if(r[a].obb==null||i.includes(a))continue;if(E.obb.intersectsOBB(r[a].obb)){i.push(a);for(let g=0;g<r[a].points.length;g++)E.points.push(r[a].points[g]);let m=E.points.map(g=>[g.x,g.y]);E.path=ze(m);let h=ue(E.points);E.h=h.h,E.minz=h.minz,E.maxz=h.maxz,E.center={x:h.x,y:h.y,z:h.z},E.obb=be(E.path,E.center,E.h,(E.maxz+E.minz)/2),E.positionArr.push(...r[a].positionArr),a=u}}E.path.length>r[u].path.length&&(i.push(u),l.push(E))}let f=[];for(let u=0;u<r.length;u++)i.includes(u)||f.push(r[u]);f.push(...l),t[o].array=f}for(let o=0;o<t.length;o++){let r=t[o].type,i=t[o].array;for(let l=0;l<i.length;l++)r==="floor"&&i[l].points.length<500&&(i[l].isDel=!0)}for(let o=0;o<t.length;o++)t[o].array=t[o].array.filter(r=>!r.isDel);let s=[];for(let o=0;o<t.length;o++){let r=t[o].array;for(let i=0;i<r.length;i++)s.push({obbBox:r[i].obb,box:new F.Box3().setFromPoints(r[i].points),category:r[i].type,center:{x:r[i].center.x,y:r[i].center.y,z:(r[i].minz+r[i].maxz)/2},name:r[i].obj_id,obj_id:r[i].obj_id,pcdPoints:r[i].points,positionArr:r[i].positionArr})}return s},Jr=(e,t)=>{if(!e||!e.splitFloorProjectsResults||!e.trajectoryResults)return[];let n=e.splitFloorProjectsResults,s=e.trajectoryResults,o=new Map;for(let c=0;c<s.length;c++){let m=s[c].floor;o.has(m)?o.get(m).push(s[c]):o.set(m,[s[c]])}let r=new Map,i=[];for(let c=0;c<n.length;c++){let m=[],h=n[c];for(let g=0;g<h.length;g++){let T=h[g].points.map(S=>[S.x,S.y]),y=h[g].obj_id;y=y.replace(/the floor of the house/g,"floor").replace(/the outdoor floor/g,"floor").replace(/calcony railing/g,"balcony railing").replace(/glass balcony railing/g,"balcony railing").replace(/metal balcony railing/g,"balcony railing").replace(/temporary construction guardrail/g,"balcony railing");let p=y.split("_").slice(1,3).join("_").split(".")[0].split("_")[0],d=y.indexOf("_")+1,x=y.lastIndexOf("_"),w=y.substring(d,x);if(w.includes("top")&&(d=w.indexOf("top")+4,w=w.substring(d,x)),w.includes("left")&&(d=w.indexOf("left")+5,w=w.substring(d,x)),w.includes("right")&&(d=w.indexOf("right")+6,w=w.substring(d,x)),w.includes("front")&&(d=w.indexOf("front")+6,w=w.substring(d,x)),w!=="Staircase"&&w!=="balcony railing")continue;let P=[];for(let S=0;S<h[g].points.length;S++)P.push(new F.Vector3(h[g].points[S].x,h[g].points[S].y,h[g].points[S].z));let R=ue(P),b={points:P,path:ze(T),h:R.h,minz:R.minz,maxz:R.maxz,center:{x:R.x,y:R.y,z:R.z},obj_id:h[g].obj_id,type:w,averagePz:0,obb:null,isDel:!1,obj_id:y,positionArr:[h[g].position],aabbBox:new F.Box3().setFromPoints(P)};b.obb=be(b.path,b.center,b.h,(b.maxz+b.minz)/2),b.obb!=null&&(w=="Staircase"?m.push(b):w=="balcony railing"&&i.push(b))}r.set(c+1,m)}let l=[];for(let[c,m]of r){let h={floor:c,findTrajectoryResults:[],otherTrajectoryResults:[],lastTrajectoryResults:[]},g=o.get(c);if(!g){h.otherTrajectoryResults=m,l.push(h);continue}let T=[],y=[],p=[];for(let d=0;d<g.length;d++){let x=[];for(let P=0;P<g[d].points.length;P++){let R=[new F.Vector3(g[d].points[P].x,g[d].points[P].y,g[d].points[P].z)];R.push(R[0].clone().addScaledVector(new F.Vector3(0,0,-1),2));let b=new F.Box3().setFromPoints(R);x.push(b)}let w=[];for(let P=0;P<m.length;P++)for(let R=0;R<x.length;R++)!p.includes(P)&&m[P].aabbBox.intersectsBox(x[R])&&(p.push(P),w.push(m[P]));w.length>0&&y.push(w)}for(let d=0;d<m.length;d++)p.includes(d)||T.push(m[d]);h.findTrajectoryResults=y,h.otherTrajectoryResults=T,l.push(h)}function f(c,m){let h=c,g=[],T=[];for(let p=0;p<c.length;p++){if(c[p].obb==null||g.includes(p))continue;let d={...c[p],obb:c[p].obb.clone()};for(let x=p+1;x<c.length;x++){if(c[x].obb==null||g.includes(x))continue;if(d.obb.intersectsOBB(c[x].obb)||m){g.push(x);for(let b=0;b<c[x].points.length;b++)d.points.push(c[x].points[b]);let P=d.points.map(b=>[b.x,b.y]);d.path=ze(P);let R=ue(d.points);d.h=R.h,d.minz=R.minz,d.maxz=R.maxz,d.center={x:R.x,y:R.y,z:R.z},d.obb=be(d.path,d.center,d.h,(d.maxz+d.minz)/2),d.positionArr.push(...c[x].positionArr),x=p}}d.path.length>c[p].path.length&&(g.push(p),T.push(d))}let y=[];for(let p=0;p<c.length;p++)g.includes(p)||y.push(c[p]);return y.push(...T),c=y,c}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++)l[c].findTrajectoryResults[m]=f(l[c].findTrajectoryResults[m],!0);l[c].otherTrajectoryResults=f(l[c].otherTrajectoryResults,!1)}for(let c=0;c<l.length;c++){for(let m=0;m<l[c].findTrajectoryResults.length;m++){for(let h=0;h<l[c].findTrajectoryResults[m].length;h++){let g=ws(l[c].findTrajectoryResults[m][h].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),T=bs(g.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(T.keep.length==0){l[c].findTrajectoryResults[m][h].isDel=!0;continue}l[c].findTrajectoryResults[m][h].points=T.keep;let y=l[c].findTrajectoryResults[m][h].points.map(d=>[d.x,d.y]);l[c].findTrajectoryResults[m][h].path=ze(y);let p=ue(l[c].findTrajectoryResults[m][h].points);l[c].findTrajectoryResults[m][h].h=p.h,l[c].findTrajectoryResults[m][h].minz=p.minz,l[c].findTrajectoryResults[m][h].maxz=p.maxz,l[c].findTrajectoryResults[m][h].center={x:p.x,y:p.y,z:p.z},l[c].findTrajectoryResults[m][h].obb=be(l[c].findTrajectoryResults[m][h].path,l[c].findTrajectoryResults[m][h].center,l[c].findTrajectoryResults[m][h].h,(l[c].findTrajectoryResults[m][h].maxz+l[c].findTrajectoryResults[m][h].minz)/2)}l[c].findTrajectoryResults[m]=l[c].findTrajectoryResults[m].filter(h=>!h.isDel)}for(let m=0;m<l[c].otherTrajectoryResults.length;m++){let h=ws(l[c].otherTrajectoryResults[m].points,{binCount:100,minBinPoints:5,sideK:2.2,zK:2.2,minSideRange:.2,minZRange:.2,lowerZScale:.4,upperZScale:1.8}),g=bs(h.keep,{radius:.1,minClusterSize:50,lowPercent:.45});if(g.keep.length==0){l[c].otherTrajectoryResults[m].isDel=!0;continue}l[c].otherTrajectoryResults[m].points=g.keep;let T=l[c].otherTrajectoryResults[m].points.map(p=>[p.x,p.y]);l[c].otherTrajectoryResults[m].path=ze(T);let y=ue(l[c].otherTrajectoryResults[m].points);l[c].otherTrajectoryResults[m].h=y.h,l[c].otherTrajectoryResults[m].minz=y.minz,l[c].otherTrajectoryResults[m].maxz=y.maxz,l[c].otherTrajectoryResults[m].center={x:y.x,y:y.y,z:y.z},l[c].otherTrajectoryResults[m].obb=be(l[c].otherTrajectoryResults[m].path,l[c].otherTrajectoryResults[m].center,l[c].otherTrajectoryResults[m].h,(l[c].otherTrajectoryResults[m].maxz+l[c].otherTrajectoryResults[m].minz)/2)}l[c].otherTrajectoryResults.filter(m=>!m.isDel)}function u(c){for(let m=0;m<c.length;m++){let h=c[m].obb;for(let g=m+1;g<c.length;g++){let T=c[g].obb;if(!c[g].isDel){if(h.intersectsOBB(T)){let y=He(c[g].points,h),p=He(c[m].points,T),d=so(h,T);if(y>=.5&&(d==1||d==0)&&(c[g].isDel=!0),p>=.5&&d==-1){c[m].isDel=!0;break}}if(c[m].isDel)break}}}return c=c.filter(m=>!m.isDel),c}for(let c=0;c<l.length;c++){let m=[];for(let h=0;h<l[c].findTrajectoryResults.length;h++)m.push(...l[c].findTrajectoryResults[h]);m.push(...l[c].otherTrajectoryResults),l[c].lastTrajectoryResults=u(m)}function E(c){let m=[];if(c.length>0){let h=.3,g=.5,T=.5,y=.2;for(let p=0;p<c.length;p++){let d=c[p].obb.halfSize.clone().multiplyScalar(2),x=c[p].points,w=d.x,P=d.y,R=d.z;if(w>P&&([w,P]=[P,w]),w<g||P<h||R<T)continue;let b=yo(c[p].obb);if(b.length!=8)continue;let S=new F.Line3(b[0],b[1]),z=new F.Line3(b[1],b[2]),V=new F.Line3(b[2],b[3]),M=new F.Line3(b[3],b[0]),H=new F.Line3(b[4],b[5]),C=new F.Line3(b[5],b[6]),D=new F.Line3(b[6],b[7]),B=new F.Line3(b[7],b[4]),_=[],k=[],v=[],A=[],j=[],$=[],Z=[],Y=[];for(let Et=0;Et<x.length;Et++){let re=S.closestPointToPoint(x[Et],!0,new F.Vector3),Te=z.closestPointToPoint(x[Et],!0,new F.Vector3),Rt=V.closestPointToPoint(x[Et],!0,new F.Vector3),ie=M.closestPointToPoint(x[Et],!0,new F.Vector3),G=H.closestPointToPoint(x[Et],!0,new F.Vector3),de=C.closestPointToPoint(x[Et],!0,new F.Vector3),Be=D.closestPointToPoint(x[Et],!0,new F.Vector3),_e=B.closestPointToPoint(x[Et],!0,new F.Vector3);re.distanceTo(x[Et])<y&&_.push(x[Et]),Te.distanceTo(x[Et])<y&&k.push(x[Et]),Rt.distanceTo(x[Et])<y&&v.push(x[Et]),ie.distanceTo(x[Et])<y&&A.push(x[Et]),G.distanceTo(x[Et])<y&&j.push(x[Et]),de.distanceTo(x[Et])<y&&$.push(x[Et]),Be.distanceTo(x[Et])<y&&Z.push(x[Et]),_e.distanceTo(x[Et])<y&&Y.push(x[Et])}let tt=b[0].distanceTo(b[1]),it=b[1].distanceTo(b[2]),ct=b[2].distanceTo(b[3]),ut=b[3].distanceTo(b[0]),q=new F.Vector3,W=new F.Vector3,U=new F.Vector3,wt=new F.Vector3;Math.abs(tt-w)<.01?_.length>v.length?(q=b[0].clone(),W=b[1].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[2],b[1]).normalize()):(q=b[2].clone(),W=b[3].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[0],b[3]).normalize()):k.length>A.length?(q=b[1].clone(),W=b[2].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[3],b[2]).normalize()):(q=b[3].clone(),W=b[0].clone(),U=new F.Vector3().subVectors(W,q).normalize(),wt=new F.Vector3().subVectors(b[1],b[0]).normalize());let Ft=b[4].distanceTo(b[5]),Nt=b[5].distanceTo(b[6]),jt=b[6].distanceTo(b[7]),Lt=b[7].distanceTo(b[4]),Tt=new F.Vector3,It=new F.Vector3,Pt=new F.Vector3(q.x,q.y,b[4].z),bt=new F.Vector3(W.x,W.y,b[4].z);(st(b[4],Pt)||st(b[4],bt))&&(st(b[5],Pt)||st(b[5],bt))?(Tt=b[6].clone(),It=b[7].clone()):(st(b[5],Pt)||st(b[5],bt))&&(st(b[6],Pt)||st(b[6],bt))?(Tt=b[7].clone(),It=b[4].clone()):(st(b[6],Pt)||st(b[6],bt))&&(st(b[7],Pt)||st(b[7],bt))?(Tt=b[4].clone(),It=b[5].clone()):(st(b[7],Pt)||st(b[7],bt))&&(st(b[4],Pt)||st(b[4],bt))&&(Tt=b[5].clone(),It=b[6].clone());let Bt=q.distanceTo(W),J=Tt.distanceTo(It),ft=new F.Vector3().subVectors(new F.Vector3(q.x,q.y,Tt.z),q).normalize();if(Math.abs(Bt-J)>.01||Math.abs(Bt-w)>.01){console.log("\u4E0A\u4E0B\u957F\u5EA6\u4E0D\u4E00\u81F4,\u6216\u4E0E\u5BBD\u4E0D\u4E00\u81F4",Bt,J,w);continue}let Q=Math.sqrt(Bt*Bt+J*J),K=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(Q)))),he={stairStepHeight:R/K,stairStepWidth:P/K,staitWidth:w,stairLength:P,stairHeigth:R,stairStepNum:K,stairBottomPt1:q,stairBottomPt2:W,stairTopPt1:Tt,stairTopPt2:It,vecStepLength:U,vecStepWidth:wt,vecStepHeight:ft,path:c[p].path,obb:c[p].obb,maxz:c[p].maxz,points:c[p].points,rectPt1:new F.Vector3(0,0,0),rectPt2:new F.Vector3(0,0,0)};m.push(he)}}return m}let a=[];for(let c=0;c<l.length;c++)a.push(...E(l[c].lastTrajectoryResults));for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=m.clone(),p=h.clone(),d=g.clone(),x=T.clone();y.z=p.z=d.z=x.z=0;let w=qt(m,h,!0),P=qt(g,T,!0),R=qt(w,P),b=new F.Vector3().subVectors(w,R).normalize(),S=new F.Vector3().subVectors(P,R).normalize(),z=w.distanceTo(P),V=!1,M=!1;for(let H=0;H<a.length;H++){if(c==H)continue;let C=a[H].stairTopPt1.clone(),D=a[H].stairTopPt2.clone(),B=a[H].stairBottomPt1.clone(),_=a[H].stairBottomPt2.clone(),k=new F.Vector3().subVectors(C,D).normalize(),v=new F.Vector3().subVectors(B,_).normalize(),A=C.clone(),j=D.clone(),$=B.clone(),Z=_.clone();A.z=j.z=$.z=Z.z=0;let Y=qt(C,D,!0),tt=qt(B,_,!0),it=Y.distanceTo(tt),ct=Yt(w,P,Y,tt),ut=!1;if(ct&&ct.isParallel&&C.z<=g.z&&g.z-C.z<.3){ut=!0,M=!0;let q=A.addScaledVector(k.clone().negate(),100),W=j.addScaledVector(k,100),U=$.addScaledVector(v.clone().negate(),100),wt=Z.addScaledVector(v,100),Ft=new F.Line3(q,W),Nt=new F.Line3(U,wt),jt=Ft.closestPointToPoint(R,!0,new F.Vector3),Lt=Nt.closestPointToPoint(R,!0,new F.Vector3),Tt=new F.Vector3().subVectors(jt,R),It=new F.Vector3().subVectors(Lt,R),Pt=Tt.length(),bt=It.length();It=It.normalize(),Tt=Tt.normalize();let Bt=Kt(b,Tt,.1),J=Kt(S,Tt,.1),ft=Kt(S,It,.1),Q=Kt(b,It,.1);if(Bt&&Bt.sameDirection&&Pt>z/2){let K=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}else if(J&&J.sameDirection&&Pt>z/2){let K=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}if(ft&&ft.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}else if(Q&&Q.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}}else if(ct&&ct.isParallel&&m.z<B.z&&B.z-m.z<.2){ut=!0,V=!0;let q=A.addScaledVector(k.clone().negate(),100),W=j.addScaledVector(k,100),U=$.addScaledVector(v.clone().negate(),100),wt=Z.addScaledVector(v,100),Ft=new F.Line3(q,W),Nt=new F.Line3(U,wt),jt=Ft.closestPointToPoint(R,!1,new F.Vector3),Lt=Nt.closestPointToPoint(R,!1,new F.Vector3),Tt=new F.Vector3().subVectors(jt,R),It=new F.Vector3().subVectors(Lt,R),Pt=Tt.length(),bt=It.length();It=It.normalize(),Tt=Tt.normalize();let Bt=Kt(b,Tt,.1),J=Kt(S,Tt,.1),ft=Kt(S,It,.1),Q=Kt(b,It,.1);if(Bt&&Bt.sameDirection&&Pt>z/2){let K=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}else if(J&&J.sameDirection&&Pt>z/2){let K=Pt-z/2;a[c].stairBottomPt1=a[c].stairBottomPt1.addScaledVector(S,K),a[c].stairBottomPt2=a[c].stairBottomPt2.addScaledVector(S,K)}if(ft&&ft.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}else if(Q&&Q.sameDirection&&bt>z/2){let K=bt-z/2;a[c].stairTopPt1=a[c].stairTopPt1.addScaledVector(b,K),a[c].stairTopPt2=a[c].stairTopPt2.addScaledVector(b,K)}a[c].stairTopPt1.z=a[c].stairTopPt2.z=B.z}if(ut&&(m=a[c].stairTopPt1.clone(),h=a[c].stairTopPt2.clone(),g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=m.clone(),p=h.clone(),d=g.clone(),x=T.clone(),y.z=p.z=d.z=x.z=0,w=qt(m,h,!0),P=qt(g,T,!0),R=qt(w,P),b=new F.Vector3().subVectors(w,R).normalize(),S=new F.Vector3().subVectors(P,R).normalize(),z=w.distanceTo(P)),M&&V)break}if(M||V){let H=a[c].stairTopPt1.clone(),C=a[c].stairTopPt2.clone(),D=a[c].stairBottomPt1.clone(),B=a[c].stairBottomPt2.clone(),_=qt(H,C,!0),k=qt(D,B,!0),v=_.distanceTo(k),A=a[c].stairTopPt1.distanceTo(a[c].stairTopPt2),j=a[c].stairBottomPt1.distanceTo(a[c].stairBottomPt2),$=Math.sqrt(A*A+j*j),Z=Math.round(Math.max(5,Math.min(350,10*Math.sqrt($))));a[c].stairStepNum=Z,a[c].stairHeigth=a[c].stairTopPt1.z-a[c].stairBottomPt1.z,a[c].stairStepHeight=a[c].stairHeigth/a[c].stairStepNum,a[c].stairStepWidth=v/a[c].stairStepNum}}for(let c=0;c<a.length;c++){let m=a[c].stairTopPt1,h=a[c].stairTopPt2,g=a[c].stairBottomPt1.clone(),T=a[c].stairBottomPt2.clone(),y=new F.Vector3(m.x,m.y,g.z),p=a[c].vecStepWidth;for(let d=0;d<a.length;d++){if(c==d)continue;let x=a[d].stairTopPt1,w=a[d].stairTopPt2,P=a[d].stairBottomPt1.clone(),R=a[d].stairBottomPt2.clone(),b=new F.Vector3(x.x,x.y,P.z),S=a[d].vecStepWidth;if(Math.abs(m.z-P.z)<.3&&P.z>g.z&&a[c].obb.intersectsOBB(a[d].obb)){let z=se(y,g,b,P);if(z&&z.angle>75){let V=P.distanceTo(m),M=P.distanceTo(h),H=R.distanceTo(m),C=R.distanceTo(h),D=m.clone(),B=D.clone().addScaledVector(p,a[d].staitWidth),_=new F.Vector3().subVectors(h,m).normalize(),k=m.distanceTo(h),v=D.clone().addScaledVector(_,k),A=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),$=B.clone().addScaledVector(_,a[d].stairLength),Z=V;(Z>M||Z>C)&&(Z=M,D=h.clone(),B=D.clone().addScaledVector(p,a[d].staitWidth),_=new F.Vector3().subVectors(m,h).normalize(),k=m.distanceTo(h),v=D.clone().addScaledVector(_,k),A=B.clone().addScaledVector(_,k),j=D.clone().addScaledVector(_,a[d].stairLength),$=B.clone().addScaledVector(_,a[d].stairLength));let Y=new F.Vector3().subVectors(j,v).normalize(),tt=j.distanceTo(v);j.z=$.z=a[d].maxz,a[d].stairBottomPt1=v,a[d].stairBottomPt2=A,a[d].stairTopPt1=j,a[d].stairTopPt2=$,a[d].rectPt1=D,a[d].rectPt2=B;let it=v.distanceTo(A),ct=j.distanceTo($),ut=Math.sqrt(tt*tt+a[d].stairHeigth*a[d].stairHeigth),q=Math.round(Math.max(5,Math.min(350,10*Math.sqrt(ut))));a[d].stairStepNum=q,a[d].stairHeigth=j.z-v.z,a[d].stairStepHeight=a[d].stairHeigth/a[d].stairStepNum,a[d].stairStepWidth=tt/a[d].stairStepNum,a[d].vecStepLength=_.clone().negate(),a[d].vecStepWidth=Y;break}}}}return Qr(a,i,t),a},Qr=(e,t,n)=>{if(!e||e.length<=0||!t||t.length<=0)return;let s=1.5,o=0;for(let r=0;r<e.length;r++){e[r].stairBottom1BalconyRailing=[],e[r].stairBottom2BalconyRailing=[],e[r].balconyRailingHeight=0;let i=e[r].stairBottomPt1.clone(),l=e[r].stairBottomPt2.clone(),f=e[r].stairBottomPt1.clone(),u=e[r].stairBottomPt2.clone(),E=new F.Vector3().subVectors(l,i).normalize();i=i.addScaledVector(E,.05),l=l.addScaledVector(E.clone().negate(),.05);let a=[],c=[];for(let m=0;m<e[r].stairStepNum;m++){let h=[i,f];h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth));let g=h.map(w=>[w.x,w.y]);h.push(new F.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new F.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new F.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new F.Vector3(h[0].x,h[0].y,h[0].z+s));let T=ue(h),y=be(g,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),p=[],d=!1,x=0;for(let w=0;w<t.length;w++)if(y.intersectsOBB(t[w].obb)){for(let P=0;P<t[w].points.length&&!(y.containsPoint(t[w].points[P])&&(m==0&&p.push(t[w].points[P]),t[w].points[P].z>i.z&&t[w].points[P].z-i.z<1&&(x++,x>10&&m!=0)));P++);if(x>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=ue(p).maxz),d){let w=qt(h[1],h[2]);w.z+=e[r].stairStepHeight,a.push(w)}h=[],h=[l,u],h.push(h[1].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),h.push(h[0].clone().addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth)),g=h.map(w=>[w.x,w.y]),h.push(new F.Vector3(h[3].x,h[3].y,h[3].z+s)),h.push(new F.Vector3(h[2].x,h[2].y,h[2].z+s)),h.push(new F.Vector3(h[1].x,h[1].y,h[1].z+s)),h.push(new F.Vector3(h[0].x,h[0].y,h[0].z+s)),T=ue(h),y=be(g,{x:T.x,y:T.y,z:T.z},T.h,(T.maxz+T.minz)/2),p=[],d=!1;for(let w=0;w<t.length;w++)if(y.intersectsOBB(t[w].obb)){let P=0;for(let R=0;R<t[w].points.length&&!(y.containsPoint(t[w].points[R])&&(m==0&&p.push(t[w].points[R]),t[w].points[R].z>i.z&&t[w].points[R].z-i.z<1&&(P++,P>10&&m!=0)));R++);if(P>10&&(d=!0),m!=0&&d)break}if(o==0&&(o=ue(p).maxz),d){let w=qt(h[1],h[2]);w.z+=e[r].stairStepHeight,c.push(w)}i=i.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),i=i.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),l=l.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),l=l.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),f=f.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),f=f.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight),u=u.addScaledVector(e[r].vecStepWidth,e[r].stairStepWidth),u=u.addScaledVector(e[r].vecStepHeight,e[r].stairStepHeight)}a.length>e[r].stairStepNum-3&&(e[r].stairBottom1BalconyRailing=a),c.length>e[r].stairStepNum-3&&(e[r].stairBottom2BalconyRailing=c),e[r].balconyRailingHeight=o}};function ws(e,t={}){let{binCount:n=80,minBinPoints:s=5,sideK:o=3,zK:r=3,minSideRange:i=.2,minZRange:l=.2,maxSearchBins:f=3,lowerZScale:u=1,upperZScale:E=1}=t;if(!e||e.length===0)return[];let a=e.map((v,A)=>({index:A,x:v.x,y:v.y,z:v.z,raw:v})),c=0,m=0;for(let v of a)c+=v.x,m+=v.y;c/=a.length,m/=a.length;let h=0,g=0,T=0;for(let v of a){let A=v.x-c,j=v.y-m;h+=A*A,g+=A*j,T+=j*j}h/=a.length,g/=a.length,T/=a.length;let y=h+T,p=Math.sqrt((h-T)*(h-T)+4*g*g),d=(y+p)/2,x,w;Math.abs(g)>1e-8?(x=d-T,w=g):h>=T?(x=1,w=0):(x=0,w=1);let P=Math.sqrt(x*x+w*w)||1;x/=P,w/=P;let R=-w,b=x,S=1/0,z=-1/0,V=a.map(v=>{let A=v.x-c,j=v.y-m,$=A*x+j*w,Z=A*R+j*b;return S=Math.min(S,$),z=Math.max(z,$),{...v,t:$,side:Z}}),H=(z-S||1)/n,C=new Map;for(let v of V){let A=Math.floor((v.t-S)/H);A<0&&(A=0),A>=n&&(A=n-1),C.has(A)||C.set(A,[]),C.get(A).push(v)}let D=new Map;for(let[v,A]of C){if(A.length<s)continue;let j=A.map(q=>q.side).sort((q,W)=>q-W),$=A.map(q=>q.z).sort((q,W)=>q-W),Z=vn(j),Y=vn($),tt=vn(j.map(q=>Math.abs(q-Z)).sort((q,W)=>q-W)),it=vn($.map(q=>Math.abs(q-Y)).sort((q,W)=>q-W)),ct=Math.max(i,tt*1.4826*o),ut=Math.max(l,it*1.4826*r);D.set(v,{sideMedian:Z,zMedian:Y,sideRange:ct,zRange:ut})}function B(v){if(D.has(v))return D.get(v);for(let A=1;A<=f;A++){if(D.has(v-A))return D.get(v-A);if(D.has(v+A))return D.get(v+A)}return null}let _=[],k=[];for(let v of V){let A=Math.floor((v.t-S)/H);A<0&&(A=0),A>=n&&(A=n-1);let j=B(A);if(!j){k.push(v.raw);continue}let $=Math.abs(v.side-j.sideMedian)<=j.sideRange,Z=j.zMedian-j.zRange*u,Y=j.zMedian+j.zRange*E,tt=v.z>=Z&&v.z<=Y;$&&tt?_.push(v.raw):k.push(v.raw)}return{keep:_,removed:k,debug:{meanX:c,meanY:m,dirX:x,dirY:w,sideX:R,sideY:b,minT:S,maxT:z,binSize:H,stats:D}}}function vn(e){if(e.length===0)return 0;let t=Math.floor(e.length/2);return e.length%2===0?(e[t-1]+e[t])/2:e[t]}function ti(e,t){let n=new Map;for(let s=0;s<e.length;s++){let o=e[s],r=Math.floor(o.x/t),i=Math.floor(o.y/t),l=Math.floor(o.z/t),f=`${r},${i},${l}`;n.has(f)||n.set(f,[]),n.get(f).push(s)}return n}function ei(e,t,n,s,o){let r=e[n],i=Math.floor(r.x/s),l=Math.floor(r.y/s),f=Math.floor(r.z/s),u=[];for(let E=-1;E<=1;E++)for(let a=-1;a<=1;a++)for(let c=-1;c<=1;c++){let m=`${i+E},${l+a},${f+c}`,h=t.get(m);if(h)for(let g of h){if(g===n)continue;let T=e[g],y=r.x-T.x,p=r.y-T.y,d=r.z-T.z;y*y+p*p+d*d<=o&&u.push(g)}}return u}function bs(e,t={}){let{radius:n=.35,minClusterSize:s=20,lowPercent:o=.35}=t,r=ni(e,{radius:n}),i=e.map(E=>E.z).sort((E,a)=>E-a),l=i[Math.floor(i.length*o)],f=[],u=[];for(let E of r.clusters){let a=E.map(h=>r.points[h]),c=a.reduce((h,g)=>h+g.z,0)/a.length;a.length<s&&c<=l?u.push(...a.map(h=>h.raw)):f.push(...a.map(h=>h.raw))}return{keep:f,removed:u}}function ni(e,t={}){let{radius:n=.35}=t,s=e.map((f,u)=>({index:u,x:f.x,y:f.y,z:f.z,raw:f})),o=ti(s,n),r=n*n,i=new Array(s.length).fill(!1),l=[];for(let f=0;f<s.length;f++){if(i[f])continue;let u=[],E=[f];for(i[f]=!0;E.length>0;){let a=E.shift();u.push(a);let c=ei(s,o,a,n,r);for(let m of c)i[m]||(i[m]=!0,E.push(m))}l.push(u)}return{points:s,clusters:l}}function oi(e,t,n=1e-6){let s=si(t);for(let o of s)if(!ri(e,o,n))return!1;return!0}function si(e){let t=e.center,n=e.halfSize,s=e.rotation.elements,o=new F.Vector3(s[0],s[1],s[2]).multiplyScalar(n.x),r=new F.Vector3(s[3],s[4],s[5]).multiplyScalar(n.y),i=new F.Vector3(s[6],s[7],s[8]).multiplyScalar(n.z),l=[];for(let f of[-1,1])for(let u of[-1,1])for(let E of[-1,1]){let a=t.clone().addScaledVector(o,f).addScaledVector(r,u).addScaledVector(i,E);l.push(a)}return l}function ri(e,t,n=1e-6){let s=new F.Vector3().subVectors(t,e.center),o=e.rotation.elements,r=e.halfSize,i=new F.Vector3(o[0],o[1],o[2]),l=new F.Vector3(o[3],o[4],o[5]),f=new F.Vector3(o[6],o[7],o[8]),u=s.dot(i),E=s.dot(l),a=s.dot(f);return Math.abs(u)<=r.x+n&&Math.abs(E)<=r.y+n&&Math.abs(a)<=r.z+n}function ii(e,t,n,s){return 1+(e[t][0]===0||e[n][0]===0||e[s][0]===0?1:0)}function li(e,t,n,s,o,r){let i=Math.hypot(n-o,s-r),l=Math.hypot(e-o,t-r),f=Math.hypot(e-n,t-s),u=Math.abs((n-e)*(r-t)-(o-e)*(s-t))/2;return u===0?1/0:i*l*f/(4*u)}function ci(e){if(!e||e.length<3)return[];let t=new Set,n=[];for(let h of e){let g=`${h[0]}_${h[1]}`;t.has(g)||(t.add(g),n.push(h))}if(n.length<3)return[];let s=new Me(Float64Array.from(n.flat())),{triangles:o}=s;if(!o.length)return[];let r=new Map,i=(h,g)=>h<g?`${h}_${g}`:`${g}_${h}`;for(let h=0;h<o.length;h+=3){let g=o[h],T=o[h+1],y=o[h+2],[p,d]=n[g],[x,w]=n[T],[P,R]=n[y],b=li(p,d,x,w,P,R),S=ii(n,g,T,y);if(b<=1/S)for(let[z,V]of[[g,T],[T,y],[y,g]]){let M=i(z,V);r.set(M,(r.get(M)||0)+1)}}let l=[];for(let[h,g]of r)g===1&&l.push(h.split("_").map(Number));if(!l.length)return[];let f=new Map;for(let[h,g]of l)(f.get(h)||f.set(h,[]).get(h)).push(g),(f.get(g)||f.set(g,[]).get(g)).push(h);let u=l[0][0],E=[],a=new Set,c=u,m=-1;do{E.push(n[c]),a.add(c);let h=f.get(c)||[],g=h.find(T=>T!==m&&!a.has(T));if(g===void 0&&(g=h.find(T=>T!==m)),g===void 0)break;m=c,c=g}while(c!==u&&E.length<=l.length+1);return E.length>0&&E.push(E[0]),E}export{er as checkBeamIsReasonable,ci as computeContour,Zr as drawStaircase,tr as getBeamLine,ir as getColLine,_s as getLineCheckResults,Kr as getMergeFloorMeaning,Ur as getMergeMeaning,Bs as getOneLineCheckResults,Jr as getStaircase,Ns as updateStEdPoint};
|
package/package.json
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "rm-graphical-computing-node",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "墙体/梁线/点云语义计算库(依赖 Python 与 three.js)",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.mjs",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": "./dist/index.mjs"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist/",
|
|
12
|
-
"requirements.txt"
|
|
13
|
-
],
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "node build.mjs",
|
|
16
|
-
"prepublishOnly": "node build.mjs",
|
|
17
|
-
"dev": "nodemon server.mjs",
|
|
18
|
-
"start": "node server.mjs"
|
|
19
|
-
},
|
|
20
|
-
"dependencies": {
|
|
21
|
-
"d3-delaunay": "^6.0.4",
|
|
22
|
-
"geojson-minimum-bounding-rectangle": "^2.0.3",
|
|
23
|
-
"rm-point-cloud-calculation": "^1.0.4",
|
|
24
|
-
"three": "^0.184.0"
|
|
25
|
-
},
|
|
26
|
-
"devDependencies": {
|
|
27
|
-
"esbuild": "^0.28.0",
|
|
28
|
-
"express": "^5.2.1",
|
|
29
|
-
"nodemon": "^3.1.14"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "rm-graphical-computing-node",
|
|
3
|
+
"version": "1.0.10",
|
|
4
|
+
"description": "墙体/梁线/点云语义计算库(依赖 Python 与 three.js)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.mjs",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.mjs"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/",
|
|
12
|
+
"requirements.txt"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "node build.mjs",
|
|
16
|
+
"prepublishOnly": "node build.mjs",
|
|
17
|
+
"dev": "nodemon server.mjs",
|
|
18
|
+
"start": "node server.mjs"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"d3-delaunay": "^6.0.4",
|
|
22
|
+
"geojson-minimum-bounding-rectangle": "^2.0.3",
|
|
23
|
+
"rm-point-cloud-calculation": "^1.0.4",
|
|
24
|
+
"three": "^0.184.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"esbuild": "^0.28.0",
|
|
28
|
+
"express": "^5.2.1",
|
|
29
|
+
"nodemon": "^3.1.14"
|
|
30
|
+
}
|
|
31
|
+
}
|