rm-graphical-computing 1.0.29 → 1.0.31

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.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`three`);c=s(c);function l(e,t=!1){let n=e[0].index!==null,r=new Set(Object.keys(e[0].attributes)),i=new Set(Object.keys(e[0].morphAttributes)),a={},o={},s=e[0].morphTargetsRelative,l=new c.BufferGeometry,d=0;for(let c=0;c<e.length;++c){let u=e[c],f=0;if(n!==(u.index!==null))return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.`),null;for(let e in u.attributes){if(!r.has(e))return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. All geometries must have compatible attributes; make sure "`+e+`" attribute exists among all geometries, or in none of them.`),null;a[e]===void 0&&(a[e]=[]),a[e].push(u.attributes[e]),f++}if(f!==r.size)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. Make sure all geometries have the same number of attributes.`),null;if(s!==u.morphTargetsRelative)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. .morphTargetsRelative must be consistent throughout all geometries.`),null;for(let e in u.morphAttributes){if(!i.has(e))return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. .morphAttributes must be consistent throughout all geometries.`),null;o[e]===void 0&&(o[e]=[]),o[e].push(u.morphAttributes[e])}if(t){let e;if(n)e=u.index.count;else if(u.attributes.position!==void 0)e=u.attributes.position.count;else return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. The geometry must have either an index or a position attribute`),null;l.addGroup(d,e,c),d+=e}}if(n){let t=0,n=[];for(let r=0;r<e.length;++r){let i=e[r].index;for(let e=0;e<i.count;++e)n.push(i.getX(e)+t);t+=e[r].attributes.position.count}l.setIndex(n)}for(let e in a){let t=u(a[e]);if(!t)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the `+e+` attribute.`),null;l.setAttribute(e,t)}for(let e in o){let t=o[e][0].length;if(t===0)break;l.morphAttributes=l.morphAttributes||{},l.morphAttributes[e]=[];for(let n=0;n<t;++n){let t=[];for(let r=0;r<o[e].length;++r)t.push(o[e][r][n]);let r=u(t);if(!r)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the `+e+` morphAttribute.`),null;l.morphAttributes[e].push(r)}}return l}function u(e){let t,n,r,i=-1,a=0;for(let o=0;o<e.length;++o){let s=e[o];if(t===void 0&&(t=s.array.constructor),t!==s.array.constructor)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.`),null;if(n===void 0&&(n=s.itemSize),n!==s.itemSize)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.`),null;if(r===void 0&&(r=s.normalized),r!==s.normalized)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.`),null;if(i===-1&&(i=s.gpuType),i!==s.gpuType)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.`),null;a+=s.count*n}let o=new t(a),s=new c.BufferAttribute(o,n,r),l=0;for(let t=0;t<e.length;++t){let r=e[t];if(r.isInterleavedBufferAttribute){let e=l/n;for(let t=0,i=r.count;t<i;t++)for(let i=0;i<n;i++){let n=r.getComponent(t,i);s.setComponent(t+e,i,n)}}else o.set(r.array,l);l+=r.count*n}return i!==void 0&&(s.gpuType=i),s}var d=class extends c.Object3D{constructor(e=document.createElement(`div`)){super(),this.isCSS2DObject=!0,this.element=e,this.element.style.position=`absolute`,this.element.style.userSelect=`none`,this.element.setAttribute(`draggable`,!1),this.center=new c.Vector2(.5,.5),this.addEventListener(`removed`,function(){this.traverse(function(e){e.element&&e.element instanceof e.element.ownerDocument.defaultView.Element&&e.element.parentNode!==null&&e.element.remove()})})}copy(e,t){return super.copy(e,t),this.element=e.element.cloneNode(!0),this.center=e.center,this}};new c.Vector3,new c.Matrix4,new c.Matrix4,new c.Vector3,new c.Vector3;var f=(e,t,n,r,i=1e-8)=>{let a=t.x-e.x,o=t.y-e.y,s=r.x-n.x,l=r.y-n.y,u=a*l-o*s;if(Math.abs(u)<i)return null;let d=((n.x-e.x)*l-(n.y-e.y)*s)/u,f=((n.x-e.x)*o-(n.y-e.y)*a)/u;return d<-i||d>1+i||f<-i||f>1+i?null:{point:new c.Vector3(e.x+d*a,e.y+d*o,e.z)}},p=(e,t,n={})=>{let{fontSize:r=36,fontFamily:i=`sans-serif`,backgroundColor:a=`rgba(0,0,0,0)`,textColor:o=`#ffffff`,padding:s=10,maxWidth:l=256}=n,u=document.createElement(`canvas`).getContext(`2d`);u.font=`bold ${r}px ${i}`;let d=u.measureText(e).width,f=Math.min(d+s*2,l),p=r+s*2,h=document.createElement(`canvas`);h.width=f,h.height=p;let g=h.getContext(`2d`);g.fillStyle=a,g.fillRect(0,0,f,p),g.fillStyle=o,g.font=`bold ${r}px ${i}`,g.textAlign=`center`,g.textBaseline=`middle`,d>l-s*2?m(g,e,f/2,p/2,l,r):g.fillText(e,f/2,p/2);let _=new c.CanvasTexture(h),v=new c.SpriteMaterial({map:_,depthTest:!1,transparent:!0}),y=new c.Sprite(v);y.position.set(t.x,t.y,t.z);let b=.005;return y.scale.set(f*b,p*b,1),y};function m(e,t,n,r,i,a){let o=t.split(``),s=``,c=a*1.2,l=r;for(let t=0;t<o.length;t++){let r=s+o[t];e.measureText(r).width>i&&t>0?(e.fillText(s,n,l),s=o[t],l+=c):s=r}e.fillText(s,n,l)}var h=(e,t,n=.01)=>{let r=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),i=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(r<1e-10||i<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let a={x:e.x/r,y:e.y/r,z:e.z/r},o={x:t.x/i,y:t.y/i,z:t.z/i},s=a.x*o.x+a.y*o.y+a.z*o.z;s=Math.max(-1,Math.min(1,s));let c=Math.acos(Math.abs(s)),l=c<=n;return{parallel:l,sameDirection:l?s>0:null,angle:c}};function g(e,t){let n=new c.BufferGeometry,r=[],i=[];e.forEach(e=>r.push(e.x,e.y,e.z)),t.forEach(e=>r.push(e.x,e.y,e.z)),i.push(0,2,1,0,3,2),i.push(4,5,6,4,6,7),i.push(0,1,5,0,5,4),i.push(1,2,6,1,6,5),i.push(2,3,7,2,7,6),i.push(3,0,4,3,4,7),n.setAttribute(`position`,new c.Float32BufferAttribute(r,3)),n.setIndex(i),n.computeVertexNormals();let a=new c.MeshBasicMaterial({color:`green`,transparent:!0,opacity:.5,side:c.DoubleSide});return new c.Mesh(n,a)}var _=class{constructor(e={}){this.config={value:e.value||`0.0000m`,position:e.position||new c.Vector3(0,0,0),style:{fontFamily:e.style?.fontFamily||`Arial, sans-serif`,fontSize:e.style?.fontSize||`16px`,fontWeight:e.style?.fontWeight||`normal`,fontStyle:e.style?.fontStyle||`normal`},backgroundOpacity:e.backgroundOpacity||.7},this.label=null,this.labelElement=null,this.createLabel()}createLabel(){return this.labelElement=document.createElement(`div`),this.labelElement.textContent=this.config.value,this.applyBlackWhiteStyle(),this.label=new d(this.labelElement),this.label.position.copy(this.config.position),this.label}applyBlackWhiteStyle(){let e=this.labelElement.style,t=this.config;e.fontFamily=t.style.fontFamily,e.fontSize=t.style.fontSize,e.fontWeight=t.style.fontWeight,e.fontStyle=t.style.fontStyle,e.color=`#FFFFFF`,e.textShadow=`0 1px 2px rgba(0, 0, 0, 0.5)`,e.backgroundColor=`rgba(0, 0, 0, ${t.backgroundOpacity})`,e.padding=`6px 12px`,e.borderRadius=`4px`,e.position=`absolute`,e.whiteSpace=`nowrap`,e.userSelect=`none`,e.pointerEvents=`none`,e.zIndex=`1000`,e.textAlign=`center`,e.lineHeight=`1.2`}updateValue(e){this.labelElement&&(this.labelElement.textContent=e)}updatePosition(e){this.label&&this.label.position.copy(e)}updateFontStyle(e){if(this.labelElement){let t=this.labelElement.style;e.fontFamily&&(t.fontFamily=e.fontFamily),e.fontSize&&(t.fontSize=e.fontSize),e.fontWeight&&(t.fontWeight=e.fontWeight),e.fontStyle&&(t.fontStyle=e.fontStyle)}}getLabel(){return this.label}getLabelElement(){return this.labelElement}dispose(){this.labelElement&&this.labelElement.parentNode&&this.labelElement.parentNode.removeChild(this.labelElement),this.label=null,this.labelElement=null}},v=e=>{let t=new c.Group;if(e&&e.length){let n=`green.red.pink.white.azure.yellow.bisque.grey.blanchedalmond.blue.blueviolet.brown.burlywood.cadetblue.chartreuse.chocolate.coral.cornflowerblue.cornsilk.crimson.cyan.darkblue.darkcyan.darkgoldenrod.darkgray.darkgreen.darkgrey.darkkhaki.darkmagenta.darkolivegreen.darkorange.darkorchid.darkred.darksalmon.darkseagreen.darkslateblue.darkslategray.darkslategrey.darkturquoise.darkviolet.deeppink.deepskyblue.dimgray.dimgrey.dodgerblue.firebrick.floralwhite.forestgreen.fuchsia.gainsboro.ghostwhite.gold.goldenrod.gray.aliceblue.greenyellow.black.honeydew.hotpink.indianred.indigo.ivory.khaki.lavender.lavenderblush.lawngreen.lemonchiffon.lightblue.lightcoral.lightcyan.lightgoldenrodyellow.lightgray.lightgreen.lightgrey.lightpink.lightsalmon.lightseagreen.lightskyblue.lightslategray.lightslategrey.lightsteelblue.lightyellow.lime.limegreen.linen.magenta.maroon.mediumaquamarine.mediumblue.mediumorchid.mediumpurple.mediumseagreen.mediumslateblue.mediumspringgreen.mediumturquoise.mediumvioletred.midnightblue.mintcream.mistyrose.moccasin.navajowhite.navy.oldlace.olive.olivedrab.orange.orangered.orchid.palegoldenrod.palegreen.paleturquoise.palevioletred.papayawhip.peachpuff.peru.pink.plum.powderblue.purple.rebeccapurple.yellow.rosybrown.royalblue.saddlebrown.salmon.sandybrown.seagreen.seashell.sienna.silver.skyblue.slateblue.slategray.slategrey.snow.springgreen.steelblue.tan.teal.thistle.tomato.turquoise.violet.wheat.white.whitesmoke.yellow.yellowgreen`.split(`.`);e.forEach((e,r)=>{let i=n[r],a=new c.Group,{pcdPoints:o,category:s,name:l,center:u,box:d,obbBox:f,contour:p,nline:m,coordinatesByWidth:h,coordinatesByArea:v}=e,y=o.length;if(s!=`door`)return;s===`balcony railing`&&console.log(`pcdObj`,e);let b=new c.Box3(new c.Vector3(d.min.x,d.min.y,d.min.z),new c.Vector3(d.max.x,d.max.y,d.max.z)),x=new c.Box3Helper(b,i);a.add(x);let S=new _({value:l,position:new c.Vector3(u.x,u.y,u.z)}).getLabel();a.add(S);let C=new c.InstancedMesh(new c.SphereGeometry(.007,8,8),new c.MeshBasicMaterial({color:i}),y);a.add(C);let w=new c.Matrix4,T=0;if(o.forEach(e=>{w.setPosition(e.x,e.y,e.z),C.setMatrixAt(T,w),T++}),C.instanceMatrix.needsUpdate=!0,m){let e=new c.BufferGeometry;e.setFromPoints([new c.Vector3(m.start.x,m.start.y,m.start.z),new c.Vector3(m.end.x,m.end.y,m.end.z)]);let t=new c.LineBasicMaterial({color:`red`,depthTest:!1,depthWrite:!1});new c.Line(e,t);let n=new c.Vector3().copy(new c.Vector3(m.start.x,m.start.y,m.start.z)).add(new c.Vector3(m.end.x,m.end.y,m.end.z)).multiplyScalar(.5),r=new c.Vector3(m.centerDir.x,m.centerDir.y,m.centerDir.z);new c.ArrowHelper(r,n,1,`red`)}if(p){let e=[];p.forEach((t,n)=>{e.push(new c.Vector3(t.x,t.y,t.z))});let n=new c.BufferGeometry;n.setFromPoints(e);let r=new c.LineBasicMaterial({color:`yellow`,depthTest:!1,depthWrite:!1}),i=new c.Line(n,r);t.add(i)}if(v){let e=[],n=[];v.coordinates.forEach((t,r)=>{e.push(new c.Vector3(t.x,t.y,t.z)),n.length<4&&n.push(new c.Vector3(t.x,t.y,t.z))});let r=new c.BufferGeometry;r.setFromPoints(e);let i=new c.LineBasicMaterial({color:`green`,depthTest:!1,depthWrite:!1}),a=new c.Line(r,i);t.add(a);let o=g(n.map(e=>new c.Vector3(e.x,e.y,v.heightData.minZ)),n.map(e=>new c.Vector3(e.x,e.y,e.z)));t.add(o);let[s,l,u]=e,d=s.distanceTo(l),f=new c.Vector3().copy(s).add(l).multiplyScalar(.5);new _({value:String(d.toFixed(3)),position:f}).getLabel();let p=l.distanceTo(u),m=new c.Vector3().copy(l).add(u).multiplyScalar(.5);new _({value:String(p.toFixed(3)),position:m}).getLabel()}if(f){let e=new c.BoxGeometry(f.size.x,f.size.y,f.size.z),n=new c.LineBasicMaterial({color:i,linewidth:2}),r=new c.EdgesGeometry(e),a=new c.LineSegments(r,n),o=new Vector3(f.center.x,f.center.y,f.center.z),s=new Quaternion(f.rotation.x,f.rotation.y,f.rotation.z,f.rotation.w);a.position.copy(o),a.quaternion.copy(s),t.add(a)}})}return t},y=(e,t,n,r)=>{let i=e,a=[];if(r&&r.length&&(a=r.map(e=>e.clone())),!i||i.length<4)return{};let o=new c.Vector3().subVectors(i[1],i[0]).normalize(),s=new c.Vector3().subVectors(i[3],i[0]).normalize(),l=o.clone().cross(s).normalize(),u=1/0,d=-1/0,f=1/0,p=-1/0;for(let e of i){let t=e.dot(o),n=e.dot(s);t<u&&(u=t),t>d&&(d=t),n<f&&(f=n),n>p&&(p=n)}let m=i[0].dot(l),g=o.clone().multiplyScalar(u).add(s.clone().multiplyScalar(f)).add(l.clone().multiplyScalar(m)),_=o.clone().multiplyScalar(d).add(s.clone().multiplyScalar(f)).add(l.clone().multiplyScalar(m)),v=o.clone().multiplyScalar(d).add(s.clone().multiplyScalar(p)).add(l.clone().multiplyScalar(m)),y=o.clone().multiplyScalar(u).add(s.clone().multiplyScalar(p)).add(l.clone().multiplyScalar(m)),b=[g,_,v,y],x=h(new c.Vector3().subVectors(g,_),new c.Vector3(0,0,1));x&&x.parallel&&(b=[g,y,v,_]);let S=0;if(r.length>0){let e=new c.Vector3().subVectors(b[1],b[0]).normalize(),r=e.clone().negate(),i=new c.Vector3().subVectors(b[3],b[0]).normalize(),o=i.clone().negate(),s=b[0].distanceTo(b[1]),l=b[0].distanceTo(b[3]),u=s/t,d=l/n,f=.001;for(let r=0;r<u;r++){let r=b[0],o=0;for(let s=0;s<d;s++){let s=r.clone().addScaledVector(e,t),l=s.clone().addScaledVector(i,n),u=r.clone().addScaledVector(i,n),d=new c.Vector3().add(r).add(s).add(l).add(u).multiplyScalar(.25);for(let e=0;e<a.length;e++)if(a[e].distanceTo(d)<f){o++;break}r=u}if(o>=d/2)break;S+=o,b[0]=b[0].addScaledVector(e,t),b[3]=b[3].addScaledVector(e,t)}s=b[0].distanceTo(b[1]),u=s/t;for(let e=0;e<u;e++){let e=b[1],o=0;for(let s=0;s<d;s++){let s=e.clone().addScaledVector(r,t),l=s.clone().addScaledVector(i,n),u=e.clone().addScaledVector(i,n),d=new c.Vector3().add(e).add(s).add(l).add(u).multiplyScalar(.25);for(let e=0;e<a.length;e++)if(a[e].distanceTo(d)<f){o++;break}e=u}if(o>=d/2)break;S+=o,b[1]=b[1].addScaledVector(r,t),b[2]=b[2].addScaledVector(r,t)}s=b[0].distanceTo(b[1]),u=s/t;for(let r=0;r<d;r++){let r=b[3],i=0;for(let s=0;s<u;s++){let s=r.clone().addScaledVector(e,t),l=s.clone().addScaledVector(o,n),u=r.clone().addScaledVector(o,n),d=new c.Vector3().add(r).add(s).add(l).add(u).multiplyScalar(.25);for(let e=0;e<a.length;e++)if(a[e].distanceTo(d)<f){i++;break}r=s}if(i>=u/2)break;S+=i,b[2]=b[2].addScaledVector(o,n),b[3]=b[3].addScaledVector(o,n)}}let C=b[0].distanceTo(b[1])*b[0].distanceTo(b[3]);return{facePoints:b,boxArea:C,totalInPlaneNum:S}},b=(e,t,n,r,i=c.MathUtils.degToRad(8))=>{let a=new c.Vector3,o=new c.Vector3;a.subVectors(new c.Vector3(t.x,t.y,0),new c.Vector3(e.x,e.y,0)).normalize(),o.subVectors(new c.Vector3(r.x,r.y,0),new c.Vector3(n.x,n.y,0)).normalize();let s=a.dot(o),l=Math.acos(Math.min(Math.abs(s),1)),u=1-Math.min(l/i,1),d=s>0?`same`:`opposite`;return{parallelism:u,angle:l,angleDeg:c.MathUtils.radToDeg(l),isParallel:l<i,direction:d,vectors:{v1:a,v2:o}}},x=(e,t,n,r)=>{let i=new c.Vector3().subVectors(t,e),a=new c.Vector3().subVectors(r,n),o=i.length(),s=a.length();if(o===0||s===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};i.normalize(),a.normalize();let l=Math.abs(i.dot(a)),u=Math.min(1,Math.max(0,l)),d=Math.acos(u),f=c.MathUtils.radToDeg(d),p=1-u;return{rate:p,percent:`${(p*100).toFixed(2)}%`,angle:f,isPerpendicular:Math.abs(f-90)<.01,isParallel:f<.01}},S=(e,t,n=!1)=>new c.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),C=(e,t,n,r,i={})=>{let{parallelAngleMax:a=c.MathUtils.degToRad(10),collinearAngleMax:o=c.MathUtils.degToRad(7),distanceThreshold:s=2,overlapThreshold:l=.01}=i,u=new c.Vector3().subVectors(t,e),d=new c.Vector3().subVectors(r,n),f=u.clone().normalize(),p=d.clone().normalize(),m=c.MathUtils.clamp(f.dot(p),-1,1),h=Math.acos(Math.abs(m)),g=c.MathUtils.radToDeg(h);if(h>a)return{type:`not_parallel`,angleDeg:g,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&p.negate();let _=new c.Vector3().addVectors(f,p).normalize(),v=new c.Vector3().addVectors(e,t).multiplyScalar(.5),y=w(n,v,f),b=w(r,v,f),x=(y+b)/2,S=Math.max(y,b),C=e.dot(_),E=t.dot(_),D=n.dot(_),O=r.dot(_),k=Math.min(C,E),A=Math.max(C,E),j=Math.min(D,O),M=Math.max(D,O),N=A-k,P=M-j,F=Math.min(N,P),I=Math.min(A,M)-Math.max(k,j),L=I<0?-I:0,R=I>0?I:0,z=F>0?R/F:0,B=T(e,t,n,r),V=h<=o&&x<s,H;return V?H=z>.5?`collinear_overlap`:`collinear_gap`:h<=a&&(H=`parallel_offset`),{type:H,angleDeg:g,avgPerpendicularDistance:x,maxPerpendicularDistance:S,gap:L,overlap:R,closestDistance:B}};function w(e,t,n){let r=new c.Vector3().subVectors(e,t),i=r.dot(n),a=n.clone().multiplyScalar(i);return new c.Vector3().subVectors(r,a).length()}function T(e,t,n,r){let i=new c.Vector3().subVectors(t,e),a=new c.Vector3().subVectors(r,n),o=new c.Vector3().subVectors(n,e),s=i.dot(i),l=i.dot(a),u=a.dot(a),d=i.dot(o),f=a.dot(o),p=s*u-l*l,m,h;p<1e-10?(m=0,h=u===0?0:f/u):(m=(l*f-u*d)/p,h=(s*f-l*d)/p),m=c.MathUtils.clamp(m,0,1),h=u===0?0:c.MathUtils.clamp((l*m+f)/u,0,1),m=s===0?0:c.MathUtils.clamp((l*h-d)/s,0,1);let g=e.clone().add(i.clone().multiplyScalar(m)),_=n.clone().add(a.clone().multiplyScalar(h));return g.distanceTo(_)}var E=(e,t,n,r=.05,i=.02)=>{let[a,o,s,l]=e,u=new c.Vector3().subVectors(o,a),d=new c.Vector3().subVectors(l,a),f=new c.Vector3().crossVectors(u,d).normalize(),p=u.length(),m=d.length(),h=u.clone().normalize(),g=d.clone().normalize(),_=n-r,v=n+r,y=new c.Vector3,b=[],x=Math.ceil(p/i),S=Math.ceil(m/i),C=p/x,w=m/S,T=new Uint8Array(x*S);for(let e=0;e<t.length;e++){y.subVectors(t[e],a);let n=Math.abs(y.dot(f));if(n<_||n>v)continue;let r=y.dot(h),i=y.dot(g);if(r<0||r>p||i<0||i>m)continue;b.push(new c.Vector3(t[e].x,t[e].y,t[e].z));let o=Math.min(Math.floor(r/C),x-1),s=Math.min(Math.floor(i/w),S-1);T[s*x+o]=1}let E=0;for(let e=0;e<T.length;e++)T[e]&&E++;let D=x*S,O=p*m,k=E==0||D==0?0:E/D*O;return{filteredPoints:b,coveragePercent:E==0||D==0?0:E/D*100,quadArea:O,coveredArea:k}},D=(e,t)=>Math.round(Math.max(5,Math.min(350,t*Math.sqrt(e)))),O=e=>{let t=new c.Vector3(e.start.x,e.start.y,e.start.z),n=new c.Vector3(e.end.x,e.end.y,e.end.z),r=t.distanceTo(n),i=e.rooftopPz-e.start.z,a=D(r,100),o=D(i,70),s=i/o,l=new Map;for(let e=0;e<o;e++)l.set((e+1)*s,{count:0,minZ:1/0,maxZ:-1/0});let u=new c.Line3(t,n),d=e.originalPoints,f=new c.Vector3;for(let e=0;e<d.length;e++){let t=d[e],n=u.closestPointToPoint(t,!0,f).distanceTo(t),r=Math.floor(n/s);if(r<o){let e=l.get((r+1)*s);e.count++,t.z<e.minZ&&(e.minZ=t.z),t.z>e.maxZ&&(e.maxZ=t.z)}}let p,m,h=a/2;for(let[e,t]of l)if(t.count>=h){p=t.minZ;break}for(let[e,t]of[...l.entries()].reverse())if(t.count>=h){m=t.maxZ;break}return{minZ:p,maxZ:m}},k=(e,t,n)=>{let r=new c.Plane,i=new c.Vector3(e.x,e.y,e.z),a=new c.Vector3(t.x,t.y,t.z),o=new c.Vector3(t.x,t.y,t.z+5);r.setFromCoplanarPoints(i,a,o);let s=[];n.forEach(e=>{let t=new c.Vector3;r.projectPoint(e,t),t.z=i.z,s.push(t)});let l=new c.Vector3,u=new c.Vector3;r.projectPoint(i,l),r.projectPoint(a,u);let d=new c.Line3(l,u),f=[],p=[],m=new c.Vector3;return s.forEach((e,t)=>{d.closestPointToPoint(e,!0,m).distanceTo(e)<.001?f.push(n[t]):p.push(e)}),{newOriginalPoints:f,newProjectPoints:p}},A=e=>{function t(e,t,n,r,i,a,o,s,l){let u=new c.Line3(e,t),d=new Map,f=new c.Vector3,p=e.clone(),m=t.clone(),h=0;for(;;){let g=new Map,_=0;for(let e=0;e<l.checkResults.length;e++)if(!(l.checkResults[e].allCenterPoints.length/s*100<1))for(let t=0;t<l.checkResults[e].allCenterPoints.length;t++){if(d.has(e)&&d.get(e).removePtsIndex.includes(t))continue;let n=l.checkResults[e].allCenterPoints[t];n=new c.Vector3(n.x,n.y,n.z);let r=u.closestPointToPoint(n,!0,f),a=n.distanceTo(r);Math.abs(a-i)<.01&&(_++,g.has(e)?g.get(e).removePtsIndex.push(t):g.set(e,{index:e,removePtsIndex:[t]}))}if(h==o){e=p,t=m;break}if(_<a/20*18||_==0){g.clear(),o-h<5&&(e=p,t=m,d.clear());break}else{h++;for(let[e,t]of g)d.has(e)?d.get(e).removePtsIndex.push(...t.removePtsIndex):d.set(e,t);g.clear(),e=e.addScaledVector(n,r),t=t.addScaledVector(n,r),u.set(e,t)}}if(d.size>0&&h!=o)for(let[e,t]of d){let n=[],r=[];for(let i=0;i<l.checkResults[e].allCenterPoints.length;i++)t.removePtsIndex.includes(i)||(n.push(l.checkResults[e].allCenterPoints[i]),r.push(l.checkResults[e].originalVertices[i]));l.checkResults[e].allCenterPoints=n,l.checkResults[e].originalVertices=r}}for(let n=0;n<e.length;n++){let r=e[n];if(r.length<.5)continue;let i=-1,a=-1;if(!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let[e,t,n,o]=r.checkResults[0].originalVertices[0];e=new c.Vector3(e.x,e.y,e.z),t=new c.Vector3(t.x,t.y,t.z),n=new c.Vector3(n.x,n.y,n.z),o=new c.Vector3(o.x,o.y,o.z),i=e.distanceTo(t),a=e.distanceTo(o);let s=h(new c.Vector3().subVectors(e,t).normalize(),new c.Vector3(0,0,1));s&&s.parallel&&([a,i]=[i,a])}if(i<0||a<0)continue;let o=new c.Vector3(r.start.x,r.start.y,r.start.z),s=new c.Vector3(r.end.x,r.end.y,r.end.z),l=o.distanceTo(s),u=r.rooftopPz-r.start.z,d=Math.ceil(l/i),f=Math.ceil(u/a),p=o.clone(),m=s.clone(),g=m.clone().add(new c.Vector3(0,0,u)),_=p.clone().add(new c.Vector3(0,0,u)),v=new c.Vector3().subVectors(m,p).normalize(),y=v.clone().negate();new c.Vector3().subVectors(g,p).normalize().clone().negate();let b=i/2;a/2;let x=l*u/(i*a);t(p,_,v,i,b,f,d,x,r),t(m,g,y,i,b,f,d,x,r),r.start=p,r.end=m;let{newOriginalPoints:S}=k(p,m,r.originalPoints);r.originalPoints=S}},j=(e,t)=>new c.Vector3(e.x,e.y,0).distanceTo(new c.Vector3(t.x,t.y,0)),M=(e,t,n=1e-6)=>{let r=new c.Vector3;return e.closestPointToPoint(t,!0,r),r.distanceTo(t)<n},N=e=>{let t=0,n=[];for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++){let a=e[r].distanceTo(e[i]);a>t&&(t=a,n=[e[r],e[i]])}return n},P=(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,F=e=>{let t=[];e.children.forEach(e=>{e.type==`GridHelper`||e.type==`DirectionalLight`||e.type==`AmbientLight`||t.push(e)}),t.forEach(t=>{e.remove(t),I(t)})};function I(e){for(;e.children&&e.children.length>0;){let t=e.children[0];e.remove(t),I(t)}e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>L(e)):L(e.material))}function L(e){for(let t of Object.keys(e)){let n=e[t];n&&typeof n==`object`&&typeof n.dispose==`function`&&n.dispose()}e.dispose()}var R=class{results;clusterResults;constructor(){this.results=null}initLimits1(e,t){let n,r;return n=e<.3?5:e<.5?8:e<.8?10:e<1?15:e<2?30:e<3?35:e<4?40:e<5?45:e<6?50:e<7?60:e<8.5?70:e<10?80:e<15?100:e<20?120:e<25?140:e<30?160:e<35?180:e<40?200:e<45?230:e<50?250:350,t<1?r=30:t<2?r=40:t<2.5?r=45:t<3?r=60:t<3.6?r=70:t<4&&(r=80),{horizontalSubdivisions:n,verticalSubdivisions:r}}initLimits2(e,t){return{horizontalSubdivisions:Math.round(Math.max(5,Math.min(350,e/.08))),verticalSubdivisions:Math.round(Math.max(30,Math.min(80,t/.06)))}}initLimits4(e,t){return{horizontalSubdivisions:Math.round(Math.max(5,Math.min(350,65*Math.sqrt(e))))*1,verticalSubdivisions:Math.round(Math.max(30,Math.min(80,15*Math.sqrt(t))))*1}}initLimits3(e,t){let n;return n=e<2?.06:e<10?.1:.15,{horizontalSubdivisions:Math.round(Math.max(5,Math.min(350,e/n))),verticalSubdivisions:Math.round(Math.max(30,Math.min(80,t/.06)))}}createWallPlaneMeshFromFourPoints(e,t,n,r,i,a,o=16777215){let s=[e,t,n,r];for(let e=0;e<s.length;e++)this.isValidVector3(s[e])||(console.error(`点${e+1}包含无效数据:`,s[e]),s[e]=new c.Vector3(e,0,e));let l=new c.BufferGeometry,u=new Float32Array([s[0].x,s[0].y,s[0].z,s[1].x,s[1].y,s[1].z,s[2].x,s[2].y,s[2].z,s[3].x,s[3].y,s[3].z]),d=[0,1,2,0,2,3],f=new Float32Array([0,0,1,0,1,1,0,1]);l.setAttribute(`position`,new c.BufferAttribute(u,3)),l.setAttribute(`uv`,new c.BufferAttribute(f,2)),l.setIndex(d),l.computeVertexNormals();let p=new c.Mesh(l,i),m=new c.EdgesGeometry(l),h=new c.LineSegments(m,new c.LineBasicMaterial({color:o}));return a.add(h),p}createSubdividedWallPlane(e,t,n,r,i){let a=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return a;let o=new c.Vector3(e.start.x,e.start.y,e.start.z),s=new c.Vector3(e.end.x,e.end.y,e.end.z),l=[o,s,new c.Vector3(e.end.x,e.end.y,e.rooftopPz),new c.Vector3(e.start.x,e.start.y,e.rooftopPz)];for(let e=0;e<l.length;e++)if(!this.isValidVector3(l[e]))return console.error(`墙体基础点${e}无效:`,l[e]),a;let u=o.distanceTo(s),d=Math.abs(e.rooftopPz-e.start.z);if(u===0||d===0)return console.error(`墙体宽度或高度为0`),console.log(`line.rooftopPz`,e.rooftopPz),console.log(`bottomLeft`,o),console.log(`bottomRight`,s),console.log(e.length),a;let f=u/n,p=d/t,m=new c.Vector3().subVectors(s,o).normalize(),h=new c.Vector3(0,0,1);for(let e=0;e<t;e++)for(let t=0;t<n;t++)try{let n={points:[new c.Vector3().copy(o).add(m.clone().multiplyScalar(t*f)).add(h.clone().multiplyScalar(e*p)),new c.Vector3().copy(o).add(m.clone().multiplyScalar((t+1)*f)).add(h.clone().multiplyScalar(e*p)),new c.Vector3().copy(o).add(m.clone().multiplyScalar((t+1)*f)).add(h.clone().multiplyScalar((e+1)*p)),new c.Vector3().copy(o).add(m.clone().multiplyScalar(t*f)).add(h.clone().multiplyScalar((e+1)*p))],userData:{}};n.userData={type:`wallSegment`,row:e,col:t,originalMaterial:r,width:f,height:p},a.push(n)}catch(n){console.error(`创建墙体小平面(${e}, ${t})时出错:`,n)}return a}calculateMinRequiredPoints(e){let t=Math.floor(Math.log1p(e)*.5);return Math.max(1,t)}calculateExpectedDensity(e){return e<1?10:e<4?5:2}evaluateSegmentByArea(e,t,n,r){if(t===0)return!1;let i=e.area,a=e.minRequiredPoints,o=e.expectedDensity,s=t/Math.max(i,.001),c=t>=a,l=s>=o*.3,u=!0;return i<.5&&t>0&&(u=this.checkSmallAreaDistribution(e,n,r)),c&&l&&u}checkSmallAreaDistribution(e,t,n){if(t.length<2)return!0;let r=t.map(e=>n[e]);e.bounds;let i=e.center,a=0,o=Math.sqrt(e.area)*.3;return r.forEach(e=>{e.distanceTo(i)<=o&&a++}),a/r.length>=.3}getFailureReason(e,t){let n=e.area,r=e.minRequiredPoints,i=e.expectedDensity,a=t/Math.max(n,.001),o=[];return t===0?o.push(`无点`):(t<r&&o.push(`点数不足: ${t}/${r}`),a<i*.3&&o.push(`密度不足: ${a.toFixed(2)}/${i.toFixed(2)}`),n<.5&&t>0&&(this.checkSmallAreaDistribution(e,[],[])||o.push(`小平面分布不均`))),o.length>0?o.join(`, `):`未知原因`}calculateMedian(e){let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==0?(t[n-1]+t[n])/2:t[n]}isPointInBoundingBox(e,t,n=.1){return e.x>=t.min[0]-n&&e.x<=t.max[0]+n&&e.y>=t.min[1]-n&&e.y<=t.max[1]+n&&e.z>=t.min[2]-n&&e.z<=t.max[2]+n}getSegmentPlane(e){let t=e.geometry;if(!t||!t.attributes.position)return null;let n=t.attributes.position;if(n.count<3)return null;let r=new c.Vector3().fromBufferAttribute(n,0),i=new c.Vector3().fromBufferAttribute(n,1),a=new c.Vector3().fromBufferAttribute(n,2);r.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld),a.applyMatrix4(e.matrixWorld);let o=new c.Plane;return o.setFromCoplanarPoints(r,i,a),o}analyzePointDistribution(e,t,n=.01){this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:n,analysisTime:null};let r=performance.now(),i=[];e.forEach(e=>{if(e.userData&&e.userData.type===`wallSegment`){let t=this.getWorldVerticesNew(e.points);if(t.length<4)return;let n=new c.Vector3().add(t[0]).add(t[1]).add(t[2]).add(t[3]).multiplyScalar(.25);e.userData.center=n,e.vertices=t,i.push(e)}}),this.results.totalSegments=i.length;for(let e of i){if(e.vertices.length<4)continue;let r=e.userData.center,i=`row${e.userData.row}_col${e.userData.col}`,[a,o,s,l]=e.vertices,u=new c.Vector3().subVectors(o,a).normalize(),d=new c.Vector3().subVectors(l,a).normalize(),f=a.distanceTo(o),p=a.distanceTo(l),m=new c.Plane;m.setFromCoplanarPoints(a,o,l);let h=f/2,g=p/2;for(let e=0;e<t.length;e++)this.isPointInWallSegmentOptimized(t[e],r,m,a,u,d,f,p,h,g,n)&&(this.results.pointsInSegments.has(i)||this.results.pointsInSegments.set(i,[]),this.results.pointsInSegments.get(i).push(e))}return i.forEach(e=>{let t=`row${e.userData.row}_col${e.userData.col}`,n=this.results.pointsInSegments.has(t)?this.results.pointsInSegments.get(t).length:0;n>=1?this.results.segmentsWithPoints++:(this.results.segmentsWithoutPoints++,this.results.missingSegments.push({row:e.userData.row,col:e.userData.col,width:e.userData.width,height:e.userData.height,segmentKey:t,vertices:e.vertices,center:e.userData.center,mesh:e,pointCount:n,hasPointsButNotEnough:n>0&&n<1}))}),this.results.analysisTime=performance.now()-r,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,t,n,r,i,a,o,s,l,u,d){if(Math.abs(n.distanceToPoint(e))>d)return!1;let f=new c.Vector3().subVectors(e,t),p=Math.abs(f.dot(i)),m=Math.abs(f.dot(a));if(p>l&&m>u)return!1;let h=new c.Vector3().subVectors(e,r),g=h.dot(i),_=h.dot(a),v=g>=-d&&g<=o+d,y=_>=-d&&_<=s+d;return v&&y}isPointInWallSegment(e,t,n,r=.1){if(!e.geometry)return!1;try{let i=this.getWorldVertices(e);return i.length<4?!1:this.isPointInRotatedWall(i,t,n,r)}catch(e){return console.error(`判断点是否在墙体平面内时出错:`,e),!1}}isPointInRotatedWall(e,t,n,r=.1){let[i,a,o,s]=e,l=new c.Plane;if(l.setFromCoplanarPoints(i,a,s),Math.abs(l.distanceToPoint(t))>r)return!1;let u=new c.Vector3().subVectors(a,i).normalize(),d=new c.Vector3().subVectors(s,i).normalize();new c.Vector3().crossVectors(u,d).normalize();let f=new c.Vector3().subVectors(t,i),p=f.dot(u),m=f.dot(d),h=i.distanceTo(a),g=i.distanceTo(s),_=p>=-r&&p<=h+r,v=m>=-r&&m<=g+r;return _&&v&&n.distanceTo(t)<h/2&&n.distanceTo(t)<g/2}getWorldVertices(e){if(e._cachedWorldVertices&&e.matrixWorld.equals(e._cachedMatrixWorld))return e._cachedWorldVertices;let t=e.geometry.getAttribute(`position`),n=[];for(let r=0;r<Math.min(4,t.count);r++){let i=new c.Vector3;i.fromBufferAttribute(t,r),i.applyMatrix4(e.matrixWorld),n.push(i)}return e._cachedWorldVertices=n,e._cachedMatrixWorld=e.matrixWorld.clone(),n}getWorldVerticesNew(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n].clone();t.push(r)}return t}getWallSegmentBounds(e){if(!e.geometry)return null;let t=e.geometry.getAttribute(`position`),n=new c.Box3;for(let r=0;r<t.count;r++){let i=new c.Vector3;i.fromBufferAttribute(t,r),i.applyMatrix4(e.matrixWorld),n.expandByPoint(i)}return{min:n.min.toArray(),max:n.max.toArray(),center:n.getCenter(new c.Vector3).toArray(),size:n.getSize(new c.Vector3).toArray()}}highlightEmptySegments(e,t,n,r=1){if(!this.results){console.warn(`请先运行分析函数`);return}let i=new Map,a=new Map;this.results.missingSegments.forEach(e=>{i.set(e.segmentKey,e),a.has(e.row)||a.set(e.row,new Map),a.get(e.row).set(e.col,{segmentKey:e.segmentKey,isEmpty:!0,visited:!1})}),e.forEach(e=>{if(e.userData&&e.userData.type===`wallSegment`){let t=`row${e.userData.row}_col${e.userData.col}`,n=i.has(t);a.has(e.userData.row)||a.set(e.userData.row,new Map),a.get(e.userData.row).has(e.userData.col)||a.get(e.userData.row).set(e.userData.col,{segmentKey:t,isEmpty:n,visited:!1})}});let o=[],s=[[0,1],[1,0],[0,-1],[-1,0]];for(let[e,t]of i){let e=a.get(t.row)?.get(t.col);if(e&&!e.visited){let n=[],c=[[t.row,t.col]];for(e.visited=!0;c.length>0;){let[e,t]=c.shift(),r=`row${e}_col${t}`;i.has(r)&&n.push(i.get(r));for(let[n,r]of s){let i=e+n,o=t+r;if(a.has(i)&&a.get(i).has(o)){let e=a.get(i).get(o);!e.visited&&e.isEmpty&&(e.visited=!0,c.push([i,o]))}}}n.length>=r&&o.push(n)}}let c=this.createClusterMaterials(o.length),l=[];return this.clusterResults={clusters:o.sort((e,t)=>t.length-e.length),highlightedMeshes:l,clusterMaterials:c,totalClusters:o.length,totalHighlighted:l.length},this.clusterResults}calculateBoundaryRegularity(e,t,n,r,i){let a=0,o=0,s=t,c=!0;for(let t=r;t<=i;t++)e.has(s)&&e.get(s).has(t)?o++:c=!1;c&&a++;let l=n,u=!0;for(let t=r;t<=i;t++)e.has(l)&&e.get(l).has(t)?o++:u=!1;u&&a++;let d=r,f=!0;for(let r=t;r<=n;r++)e.has(r)&&e.get(r).has(d)?o++:f=!1;f&&a++;let p=i,m=!0;for(let r=t;r<=n;r++)e.has(r)&&e.get(r).has(p)?o++:m=!1;return m&&a++,a/4}calculateClusterQualityScore(e){let t=1/Math.max(1,e.aspectRatio);return e.compactness*.4+e.boundaryRegularity*.4+t*.2}calculateStrictClusterBounds(e){if(e.length===0)return{width:0,height:0};let t=[];if(e.forEach(e=>{e.vertices&&e.vertices.length>0&&t.push(...e.vertices)}),t.length===0){let t=[...new Set(e.map(e=>e.row))];return{width:[...new Set(e.map(e=>e.col))].length*(e[0].bounds?.width||1),height:t.length*(e[0].bounds?.height||1)}}let n=Math.min(...t.map(e=>e.x)),r=Math.max(...t.map(e=>e.x)),i=Math.min(...t.map(e=>e.y)),a=Math.max(...t.map(e=>e.y)),o=Math.min(...t.map(e=>e.z)),s=Math.max(...t.map(e=>e.z));return{width:Math.abs(r-n),height:Math.max(Math.abs(a-i),Math.abs(s-o))}}createClusterMaterials(e){let t=[],n=[16711935,65535,16753920,16738740,9055202,3329330,`lavenderblush`,`lawngreen`,`lemonchiffon`,`lightblue`,`lightcoral`];for(let r=0;r<e;r++){let e=n[r%n.length],i=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.6,side:c.DoubleSide});t.push(i)}return t}clearHighlights(e){this.clusterResults&&this.clusterResults.highlightedMeshes&&(this.clusterResults.highlightedMeshes.forEach(t=>{e.remove(t),t.material&&t.material.dispose()}),this.results&&this.results.segmentDetails&&this.results.segmentDetails.forEach((e,t)=>{e.mesh&&e.mesh.userData.originalMaterial&&(e.mesh.material=e.mesh.userData.originalMaterial)}),this.clusterResults.highlightedMeshes=[])}getClusterInfo(){return this.clusterResults?{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((e,t)=>({clusterIndex:t,size:e.length,segments:e.map(e=>e.segmentKey)})),largestCluster:Math.max(...this.clusterResults.clusters.map(e=>e.length)),smallestCluster:Math.min(...this.clusterResults.clusters.map(e=>e.length))}:null}restoreOriginalMaterials(e){let t=0;e.traverse(e=>{e.userData&&e.userData.originalMaterial&&(e.material=e.userData.originalMaterial,delete e.userData.originalMaterial,t++)}),console.log(`恢复了 ${t} 个平面的原始材质`)}createDebugHelpers(e){let t=new c.Group;return e.traverse(e=>{if(e.userData&&e.userData.type===`wallSegment`){let n=this.getWorldVertices(e);if(n.length<4)return;let r=new c.Vector3().add(n[0]).add(n[1]).add(n[2]).add(n[3]).multiplyScalar(.25),i=new c.Vector3().subVectors(n[1],n[0]).normalize(),a=new c.Vector3().subVectors(n[3],n[0]).normalize(),o=new c.Vector3().crossVectors(i,a).normalize(),s=new c.ArrowHelper(o,r,.3,16711680),l=new c.ArrowHelper(i,r,.2,65280),u=new c.ArrowHelper(a,r,.2,255);t.add(s),t.add(l),t.add(u)}}),t}printAnalysisResults(){if(!this.results){console.warn(`没有可用的分析结果`);return}this.results.missingSegments.length>0&&this.results.missingSegments.forEach(e=>{}),this.results.pointsInSegments.forEach((e,t)=>{})}isValidVector3(e){return e&&!isNaN(e.x)&&!isNaN(e.y)&&!isNaN(e.z)&&isFinite(e.x)&&isFinite(e.y)&&isFinite(e.z)}mergeWallGroupMeshes(e){let t=[];if(e.traverse(e=>{e.isMesh&&e.geometry&&t.push(e)}),t.length===0)return null;try{let e=t.map(e=>e.geometry);e.forEach((e,n)=>{e.applyMatrix4(t[n].matrixWorld)});let n=l(e),r=t[0].material.clone(),i=new c.Mesh(n,r);return i.name=`mergedWalls`,i}catch(e){return console.error(`合并网格时出错:`,e),null}}},z=e=>{let t={},n=[],r=[],i=[];return e[0].width,e[0].height,e.forEach(e=>{r.push(...e.vertices),i.push(e.center),n.push(e.vertices)}),t.originalVertices=n,t.allCenterPoints=i,t},B=e=>{let t=new c.Vector3().copy(e.start).add(e.end).multiplyScalar(.5),n=new c.Vector3().subVectors(new c.Vector3(t.x,t.y,t.z+1),t).normalize(),r=new c.Vector3(e.direction.x,e.direction.y,0);r.applyAxisAngle(n,Math.PI/2);let i=new c.Vector3().copy(t).add(r.clone().multiplyScalar(e.length)),a=new c.Vector3().copy(t).sub(r.clone().multiplyScalar(e.length));return t.z=e.start.z,i.z=e.start.z,a.z=e.start.z,{start:i,end:a,center:t,direction:r}},V=(e,t,n=!0)=>{let r=[];if(!e)return[];for(let i=0;i<e.length;i++){let a=e[i];if(!a)continue;let o=new c.Vector3(a.start.x,a.start.y,a.start.z);o.applyEuler(new c.Euler(-Math.PI/2,0,0));let s=new c.Vector3(a.end.x,a.end.y,a.end.z);if(s.applyEuler(new c.Euler(-Math.PI/2,0,0)),t.add(p(String(i),new c.Vector3((o.x+s.x)/2,(o.y+s.y)/2,(o.z+s.z)/2))),(a.isBayWindow||a.isWindow)&&n)continue;let l=new c.Plane().setFromCoplanarPoints(new c.Vector3(a.start.x,a.start.y,a.start.z),new c.Vector3(a.end.x,a.end.y,a.end.z),new c.Vector3(a.start.x,a.start.y,a.rooftopPz)),u=[];a.originalPoints.forEach((e,t)=>{let n=new c.Vector3;l.projectPoint(e,n),u.push(n)});let d=new c.Vector3(a.start.x,a.start.y,a.start.z).distanceTo(new c.Vector3(a.end.x,a.end.y,a.end.z)),f=Math.abs(a.rooftopPz-a.start.z),m=new c.MeshBasicMaterial({color:`red`,side:c.DoubleSide,wireframe:!1,transparent:!0,opacity:.5}),h=new c.Group,g=new R,{horizontalSubdivisions:_,verticalSubdivisions:v}=g.initLimits4(d,f),y=g.createSubdividedWallPlane(a,v,_,m,h);g.analyzePointDistribution(y,u,.01);let b=new c.MeshBasicMaterial({color:`black`,transparent:!0,opacity:.8,side:c.DoubleSide}),x=g.highlightEmptySegments(y,b,h),S=[];for(let e of x.clusters){let t=z(e);t&&S.push(t)}let C=B(a).direction;a.checkResults=S,a.verticalDirection=C,a.originaIndex=i,r.push(a)}return r},H=async(e,t,n,r)=>{F(r);let i=await fetch(e);if(!i)return;let a=await i.json(),o=new c.Group,s=new c.Group,u=new c.Group,d=new c.Group,f=new c.Group,m=new c.Group,h=new c.Group;for(let e=0;e<a.length;e++){let t=a[e];if(!t)continue;let n=new c.Vector3(t.start.x,t.start.y,t.start.z);n.applyEuler(new c.Euler(-Math.PI/2,0,0));let r=new c.Vector3(t.end.x,t.end.y,t.end.z);r.applyEuler(new c.Euler(-Math.PI/2,0,0)),h.add(p(String(e),new c.Vector3((n.x+r.x)/2,(n.y+r.y)/2,(n.z+r.z)/2)))}a.sort((e,t)=>e.originalIndex-t.originalIndex),console.log(`lins`,a);let g=await fetch(t);if(!g)return;let _=await g.json(),y=Array.isArray(_)?_:Object.values(_),b=await fetch(n);if(console.log(`respcd`,b),!b)return;let x=await b.json(),S=0;for(let e=0;e<x.length;e++){let t=x[e];if(t.isFindBeam=!1,t.category==`door`){let e=new c.Vector3(t.center.x,t.center.y,t.center.z);e.applyEuler(new c.Euler(-Math.PI/2,0,0)),h.add(p(`door:${S}`,e)),S++}}r.add(h),console.time();let{beamGroup:C}=await U(a,y,x,r);console.timeEnd(),console.log(`beamGroup`,C);let w=new c.MeshBasicMaterial({color:`#cffd00`,transparent:!0,opacity:.4,side:c.DoubleSide}),T=new c.MeshBasicMaterial({color:`#ff0000`,transparent:!0,opacity:.4,side:c.DoubleSide}),E=new c.MeshBasicMaterial({color:`#e100ff`,transparent:!0,opacity:.4,side:c.DoubleSide}),D=new c.MeshBasicMaterial({color:`#0400ff`,transparent:!0,opacity:.4,side:c.DoubleSide}),O=new c.LineBasicMaterial({color:`#cffd00`}),k=[];for(let e=0;e<a.length;e++){let t=a[e];if(t.checkResults)for(let e of t.checkResults)for(let t of e.originalVertices){let[e,n,r,i]=t,a=new c.BufferGeometry,o=new Float32Array([e.x,e.y,e.z,n.x,n.y,n.z,r.x,r.y,r.z,i.x,i.y,i.z]);a.setAttribute(`position`,new c.BufferAttribute(o,3)),a.setIndex([0,1,2,0,2,3]),a.computeVertexNormals();let s=new c.EdgesGeometry(a,1);k.push(s)}}if(k.length>0){let e=l(k,!1);e.rotateX(-Math.PI/2),o.add(new c.LineSegments(e,O)),o.visible=!1,r.add(o),k.forEach(e=>e.dispose())}let A=new c.PointsMaterial({color:65535,size:.01}),j=[];for(let e of a){if(!e.originalPoints||e.originalPoints.length===0)continue;let t=new Float32Array(e.originalPoints.length*3);e.originalPoints.forEach((e,n)=>{t[n*3]=e.x,t[n*3+1]=e.y,t[n*3+2]=e.z});let n=new c.BufferGeometry;n.setAttribute(`position`,new c.BufferAttribute(t,3)),j.push(n);let r=[];r.push(new c.Vector3(e.start.x,e.start.y,e.start.z)),r.push(new c.Vector3(e.end.x,e.end.y,e.end.z));let i=new c.BufferGeometry;i.setFromPoints(r),i.rotateX(-Math.PI/2),f.add(new c.Line(i,O))}if(j.length>0){let e=l(j,!1);e.rotateX(-Math.PI/2),s.add(new c.Points(e,A)),r.add(s),j.forEach(e=>e.dispose())}f.visible=!1,r.add(f);let M=[],N=[],P=new c.LineBasicMaterial({color:`#f30606`}),I=new c.MeshBasicMaterial({color:`#071ac4`});for(let e=0;e<y.length;e++){let t=new c.SphereGeometry(.05);t.translate(y[e].x,y[e].y,y[e].z);let n=[],r=new c.Vector3(y[e].x,y[e].y,y[e].z),i=new c.Quaternion(y[e].qx,y[e].qy,y[e].qz,y[e].qw),a=new c.Vector3(0,0,-1).applyQuaternion(i),o=r.clone().addScaledVector(a,.001);n.push(r),n.push(o);let s=new c.BufferGeometry;s.setFromPoints(n),N.push(s),M.push(t)}if(M.length>0){let e=l(M,!1);e.rotateX(-Math.PI/2),u.add(new c.Mesh(e,I)),M.forEach(e=>e.dispose())}if(N.length>0){let e=l(N,!1);e.rotateX(-Math.PI/2),u.add(new c.Line(e,P)),N.forEach(e=>e.dispose())}return r.add(u),d.add(v(x)),d.rotateX(-Math.PI/2),r.add(d),console.log(`jsonpcdData`,x),a.forEach(e=>{e.doorAndBeamData&&e.doorAndBeamData.length>0&&(e.doorAndBeamData.forEach(e=>{if(e.beamStart){let t=new c.BufferGeometry,n=new Float32Array([e.beamStart.x,e.beamStart.y,e.beamStart.z,e.beamEnd.x,e.beamEnd.y,e.beamEnd.z,e.beamEnd.x,e.beamEnd.y,e.beamEnd.z+e.beamHeight,e.beamStart.x,e.beamStart.y,e.beamStart.z+e.beamHeight]);t.setAttribute(`position`,new c.BufferAttribute(n,3)),t.setIndex([0,1,2,0,2,3]),t.computeVertexNormals(),t.rotateX(-Math.PI/2),m.add(new c.Mesh(t,w))}let t=new c.BufferGeometry,n=new Float32Array([e.doorStart.x,e.doorStart.y,e.doorStart.z,e.doorEnd.x,e.doorEnd.y,e.doorEnd.z,e.doorEnd.x,e.doorEnd.y,e.doorEnd.z+e.doorHeight,e.doorStart.x,e.doorStart.y,e.doorStart.z+e.doorHeight]);t.setAttribute(`position`,new c.BufferAttribute(n,3)),t.setIndex([0,1,2,0,2,3]),t.computeVertexNormals(),t.rotateX(-Math.PI/2),e.isDoor?m.add(new c.Mesh(t,D)):e.type==`beam`?m.add(new c.Mesh(t,E)):m.add(new c.Mesh(t,T));let r=`id:${e.id},Nid:${e.nearId}`,i=new c.Vector3((e.doorStart.x+e.doorEnd.x)/2,(e.doorStart.y+e.doorEnd.y)/2,e.doorStart.z+e.doorHeight);i.applyEuler(new c.Euler(-Math.PI/2,0,0)),m.add(p(r,i))}),r.add(m))}),{checkResultGroup:o,pointCloudGroup:s,runData:u,pcdGroup:d,pointLineGroup:f,beamDoorGroup:m,lineIndexGroup:h}},U=async(e,t,n,r)=>{if(A(e,r),e.length<=0||t.length<=0)return e;n||=[];for(let t of e){let e=[];if(!(!t.checkResults||t.checkResults.length<=0)){for(let n=0;n<t.checkResults.length;n++){let r=t.checkResults[n];if(r.isDoor=!1,!r.originalVertices||r.originalVertices.length==0)continue;let i=[];r.originalVertices.forEach(e=>{let t=[];e.forEach(e=>{t.push(new c.Vector3(e.x,e.y,e.z))}),i.push(t)});let a=i.length,o=Array.from({length:a},(e,t)=>t);function s(e){for(;o[e]!==e;)o[e]=o[o[e]],e=o[e];return e}for(let e=0;e<a;e++)for(let t=e+1;t<a;t++){let n=i[e],r=i[t];if(n.some(e=>r.some(t=>e.equals(t)))){let n=s(e),r=s(t);n!==r&&(o[n]=r)}}let l=new Map,u=-1,d=-1;for(let e=0;e<a;e++){let t=s(e);l.has(t)||l.set(t,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let r=l.get(t),[a,o,f,p]=i[e],m=new c.Vector3().add(a).add(o).add(f).add(p).multiplyScalar(.25);if(r.points.push(...i[e]),r.area+=a.distanceTo(o)*a.distanceTo(p),r.originalVertices.push(i[e]),r.index=n,r.centerPts.push(m),u==-1||d==-1){let e=new c.Vector3().subVectors(a,o).normalize();d=a.distanceTo(p),u=a.distanceTo(o);let t=h(e,new c.Vector3(0,0,1));t&&t.parallel&&([d,u]=[u,d])}r.gridWidth=u,r.gridHeight=d}e.push(...l.values())}t.mergeCheckRegion=e}}let i=new Map;for(let t of e){let e=t.rooftopPz-t.start.z,n=Math.floor(t.rooftopPz-t.start.z);i.has(n)?i.set(n,{num:i.get(n).num+1,totalHeight:i.get(n).totalHeight+e}):i.set(n,{num:1,totalHeight:e})}let a=[...i.entries()].reduce((e,t)=>t[1].num>e[1].num?t:e),o=a[0];a[1].totalHeight/a[1].num;let s=[];for(let e=0;e<n.length;e++){let t=n[e];if(t.isFindBeam=!1,t.category==`door`){let n=[];t.coordinatesByArea.coordinates.forEach(e=>{n.push(new c.Vector3(e.x,e.y,e.z))}),n[0].equals(n[n.length-1])&&n.pop();let r=n[0].distanceTo(n[1]),i=n[0].distanceTo(n[3]);i>r&&([r,i]=[i,r],n=[n[0],n[3],n[2],n[1]]);let a=S(n[0],n[3],!0),o=S(n[1],n[2],!0);s.push({doorStartPt:a,doorEndPt:o,boxPoints:n,minZ:t.coordinatesByArea.heightData.minZ,maxZ:t.coordinatesByArea.heightData.maxZ,index:e,isFind:!1,inWall:!1})}}for(let t=0;t<s.length;t++){let n=s[t];for(let t=0;t<e.length;t++){if(e[t].length<.5)continue;let r=[],i=S(e[t].start,e[t].end,!0);r.push(i),r.push(S(i,e[t].start,!0)),r.push(S(i,e[t].end,!0));let a=!1,o=n.boxPoints.length;for(let e=0;e<r.length;e++){let t=r[e].x,i=r[e].y;for(let e=0,r=o-1;e<o;r=e++){let o=n.boxPoints[e].x,s=n.boxPoints[e].y,c=n.boxPoints[r].x,l=n.boxPoints[r].y;s>i!=l>i&&t<(c-o)*(i-s)/(l-s)+o&&(a=!a)}if(a)break}if(a){let r=new c.Vector3(e[t].start.x,e[t].start.y,0),i=new c.Vector3(e[t].end.x,e[t].end.y,0),a=n.doorStartPt.distanceTo(n.doorEndPt),o=r.distanceTo(i),s=b(n.doorStartPt,n.doorEndPt,r,i);if(Math.abs(o-a)<.5&&s&&s.isParallel){n.doorStartPt=new c.Vector3(e[t].start.x,e[t].start.y,0),n.doorEndPt=new c.Vector3(e[t].end.x,e[t].end.y,0);break}else if(Math.abs(o-a)>1.3&&s&&s.isParallel){let e=C(n.doorStartPt,n.doorEndPt,r,i),t=n.doorStartPt.distanceTo(r),a=n.doorStartPt.distanceTo(i),o=n.doorEndPt.distanceTo(r),s=n.doorEndPt.distanceTo(i),c=t<.2||a<.2||o<.2||s<.2;if(e&&e.type==`collinear_overlap`&&e.maxPerpendicularDistance<.1&&!c){n.inWall=!0;break}}}else continue}}let l=0,u=[],d=[],p=[],m=[],g=.2;for(let r=0;r<e.length;r++){let i=e[r];if(!i.mergeCheckRegion||i.mergeCheckRegion.length==0)continue;i.doorAndBeamData=[],i.completePointAreaPercentage=-1;let a=new c.Box3;a.setFromPoints(i.originalPoints);let _=a.max.z,v=a.min.z,w=new c.Vector3(i.start.x,i.start.y,i.start.z),T=new c.Vector3(i.end.x,i.end.y,i.end.z),E=i.rooftopPz-i.start.z;if(E<o-.5||E>o+2)continue;let D=0;for(let a of i.mergeCheckRegion){let{facePoints:o,boxArea:O,totalInPlaneNum:A}=y(a.points,a.gridWidth,a.gridHeight,a.centerPts);if(!o||o.length<=0)continue;o[0].distanceTo(o[1]);let P=o[0].distanceTo(o[3]),F=a.gridHeight*(P/a.gridHeight/3*2)+a.gridHeight/2,I=new c.Vector3(o[0].x,o[0].y,o[0].z+F),L=new c.Vector3(o[1].x,o[1].y,o[1].z+F),R=new c.Line3(I,L),z=[],B=new c.Vector3;a.points.forEach(e=>{R.closestPointToPoint(e,!0,B).distanceTo(e)<a.gridHeight+.01&&z.push(e)});let V=[],H=[];for(;;){let e=[];for(let t=0;t<z.length;t++)H.includes(t)||e.length==0&&(e.push(z[t]),H.push(t));for(let t=0;t<z.length;t++)if(!H.includes(t)){for(let n=0;n<e.length;n++)if(z[t].distanceTo(e[n])<a.gridWidth+.01){e.push(z[t]),H.push(t),t=-1;break}}if(e.length==0)break;V.push(e)}let U=[];for(let e=0;e<V.length;e++){let t={lineSt:new c.Vector3,lineEd:new c.Vector3,facePoints:[]},n=N(V[e]);Array.isArray(n)&&n.length==2&&(t.lineSt=n[0],t.lineEd=n[1],t.facePoints.push(new c.Vector3(n[0].x,n[0].y,o[0].z)),t.facePoints.push(new c.Vector3(n[1].x,n[1].y,o[0].z)),t.facePoints.push(new c.Vector3(n[1].x,n[1].y,o[2].z)),t.facePoints.push(new c.Vector3(n[0].x,n[0].y,o[2].z)),U.push(t))}D+=a.area;let W=0;if(A!=0&&(W=a.gridHeight*a.gridWidth*A),(a.area-W)/O*100>70&&U.length==1||U.length>1)for(let o=0;o<U.length;o++){let y=U[o],D=y.facePoints[0].distanceTo(y.facePoints[1]),O=y.facePoints[0].distanceTo(y.facePoints[3]),A=D/i.length*100,P=i.rooftopPz-y.facePoints[2].z;if(O<1.5||_<y.facePoints[2].z||P>E/3*2)continue;let F=!1,I=!1,L=!1,R=[],z=y.facePoints[2].clone(),B=y.facePoints[3].clone(),V=y.facePoints[0].clone(),H=y.facePoints[1].clone(),W=!1,G=-1;if(Math.abs(y.facePoints[0].z-i.start.z)<.25){if(D>.25&&i.length>.5){let t=j(w,V),n=j(w,H),a=j(T,V),o=j(T,H),s=.1;if(t<s||n<s){let{newOriginalPoints:n}=k(V,H,i.originalPoints),a=[],o=[];if(n.forEach(e=>{e.z>=z.z?a.push(e):e.z<=V.z&&o.push(e)}),a.length>10){let n=new c.Vector3(i.start.x,i.start.y,0),a=new c.Vector3(i.end.x,i.end.y,0),o=new c.Vector3().subVectors(n,a).normalize(),l=new c.Vector3,u=1/0,d=-1;for(let t=0;t<e.length;t++){if(t==r)continue;let i=new c.Vector3(e[t].start.x,e[t].start.y,0),s=new c.Vector3(e[t].end.x,e[t].end.y,0),p=f(n,a,i,s),m=x(n,a,i,s);if(p!=null){if(m&&m.angle>85){let e=p.point.distanceTo(n);if(p.point.distanceTo(a),e<.1){u=1/0,d=-1;break}}continue}if(m&&m.angle>85){let e=b(n,a,new c.Line3(i,s).closestPointToPoint(n,!0,l),n);if(!e||e.direction!=`same`)continue;let r=n.clone().addScaledVector(o,10),p=a.clone().addScaledVector(o.clone().negate(),10),m=new c.Vector3().subVectors(s,i).normalize(),h=f(r,p,i.clone().addScaledVector(m.clone().negate(),.03),s.clone().addScaledVector(m,.03));if(h==null)continue;let g=n.distanceTo(h.point);g<u&&(u=g,d=t)}else if(m&&m.angle<5){let e=j(n,i),t=j(n,s),r=j(a,i),o=j(a,s);if(e<.08||t<.08||r<.08||o<.08){u=1/0,d=-1;break}}}if(u!=1/0&&u<2)e[d].length>.3&&D+u>.5&&(W=!0,t<s?(B=B.addScaledVector(o,u),V=V.addScaledVector(o,u)):(z=z.addScaledVector(o,u),H=H.addScaledVector(o,u)));else{let n=.05,i=w.clone().addScaledVector(o,n),a=w.clone().addScaledVector(o.clone().negate(),n);i.z=a.z=0;let l=!1;for(let d=0;d<e.length;d++){if(d==r)continue;let p=new c.Vector3(e[d].start.x,e[d].start.y,0),m=new c.Vector3(e[d].end.x,e[d].end.y,0),h=new c.Vector3().subVectors(m,p).normalize();p=p.clone().addScaledVector(h.clone().negate(),n),m=m.clone().addScaledVector(h,n);let g=f(i,a,p,m);if(g){g.point.z=w.z;let e=g.point.distanceTo(w);if(g.point.distanceTo(T)<e)continue;u>e&&(u=e),l=!0}if(l)break;u!=1/0&&u<2&&(t<s?(B=B.addScaledVector(o.clone().negate(),u),V=V.addScaledVector(o.clone().negate(),u)):(z=z.addScaledVector(o.clone().negate(),u),H=H.addScaledVector(o.clone().negate(),u)))}if(!l)continue}}else continue}else if(a<s||o<s){let{newOriginalPoints:t}=k(V,H,i.originalPoints),n=[],o=[];if(t.forEach(e=>{e.z>=z.z?n.push(e):e.z<=V.z&&o.push(e)}),n.length>10){let t=new c.Vector3(i.start.x,i.start.y,0),n=new c.Vector3(i.end.x,i.end.y,0),o=new c.Vector3().subVectors(n,t).normalize(),l=new c.Vector3,u=1/0,d=-1;for(let i=0;i<e.length;i++){if(i==r)continue;let a=new c.Vector3(e[i].start.x,e[i].start.y,0),s=new c.Vector3(e[i].end.x,e[i].end.y,0),p=f(t,n,a,s),m=x(t,n,a,s);if(p!=null){if(m&&m.angle>85&&(p.point.distanceTo(t),p.point.distanceTo(n)<.1)){u=1/0,d=-1;break}continue}if(m&&m.angle>85){let e=b(n,t,new c.Line3(a,s).closestPointToPoint(n,!0,l),n);if(!e||e.direction!=`same`)continue;let r=t.clone().addScaledVector(o.clone().negate(),10),p=n.clone().addScaledVector(o,10),m=new c.Vector3().subVectors(s,a).normalize(),h=f(r,p,a.clone().addScaledVector(m.clone().negate(),.03),s.clone().addScaledVector(m,.03));if(h==null)continue;let g=n.distanceTo(h.point);g<u&&(u=g,d=i)}else if(m&&m.angle<5){let e=j(t,a),r=j(t,s),i=j(n,a),o=j(n,s);if(e<.08||r<.08||i<.08||o<.08){u=1/0,d=-1;break}}}if(u!=1/0&&u<2)e[d].length>.3&&D+u>.5&&(W=!0,a<s?(B=B.addScaledVector(o,u),V=V.addScaledVector(o,u)):(z=z.addScaledVector(o,u),H=H.addScaledVector(o,u)));else{let t=.05,n=T.clone().addScaledVector(o,t),i=w.clone();n.z=i.z=0;let l=!1;for(let a=0;a<e.length;a++){if(a==r)continue;let o=new c.Vector3(e[a].start.x,e[a].start.y,0),s=new c.Vector3(e[a].end.x,e[a].end.y,0),d=new c.Vector3().subVectors(s,o).normalize();o=o.clone().addScaledVector(d.clone().negate(),t),s=s.clone().addScaledVector(d,t);let p=f(n,i,o,s);if(p){p.point.z=T.z;let e=p.point.distanceTo(T);if(p.point.distanceTo(w)<e)continue;u>e&&(u=e),l=!0}}if(!l)continue;u!=1/0&&u<2&&(a<s?(B=B.addScaledVector(o.clone().negate(),u),V=V.addScaledVector(o.clone().negate(),u)):(z=z.addScaledVector(o.clone().negate(),u),H=H.addScaledVector(o.clone().negate(),u)))}}else continue}D=B.distanceTo(z)}if(A<85&&D>.4||D>.7&&O>E-E/3){let e=!1;for(let n=0;n<t.length;n++){let r=n+1;if(r>=t.length)continue;let i=new c.Vector3(t[n].x,t[n].y,t[n].z),a=new c.Vector3(t[r].x,t[r].y,t[r].z);if(f(new c.Vector3(i.x,i.y,0),new c.Vector3(a.x,a.y,0),new c.Vector3(y.facePoints[0].x,y.facePoints[0].y,0),new c.Vector3(y.facePoints[1].x,y.facePoints[1].y,0),.1)!=null){e=!0;break}}for(let e=0;e<s.length;e++){let t=new c.Vector3(s[e].doorStartPt.x,s[e].doorStartPt.y,0),r=new c.Vector3(s[e].doorEndPt.x,s[e].doorEndPt.y,0),a=new c.Vector3(y.facePoints[0].x,y.facePoints[0].y,0),o=new c.Vector3(y.facePoints[1].x,y.facePoints[1].y,0),l=y.facePoints[2].z<s[e].maxZ||Math.abs(y.facePoints[2].z-s[e].maxZ)<.3;if(Math.abs(y.facePoints[2].z-s[e].maxZ),l){let l=C(t.clone(),r.clone(),a.clone(),o.clone(),{distanceThreshold:2});if(l&&l.type==`collinear_gap`){let u=S(t,r),d=new c.Line3(new c.Vector3(i.start.x,i.start.y,0),new c.Vector3(i.end.x,i.end.y,0)),f=new c.Vector3,p=d.closestPointToPoint(u,!0,f);if(u.distanceTo(p)<.15){let i=a.distanceTo(t),u=o.distanceTo(t);if(i>.25&&u>.25){let e=a.distanceTo(r),t=o.distanceTo(r);if(e>.2&&t>.2)continue}I=!0,L=!0,R.push(s[e].index),s[e].isFind=!0,G=e,n[s[e].index].isFindBeam=!0;let d=new c.Vector3().subVectors(a,o).normalize(),f=t.distanceTo(r)-l.overlap;u<i&&d.negate(),i>u?(z=y.facePoints[2].clone().addScaledVector(d,f),B=y.facePoints[3].clone(),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z):(z=y.facePoints[2].clone(),B=y.facePoints[3].clone().addScaledVector(d,f),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z)}}else if(l&&l.type==`collinear_overlap`&&l.maxPerpendicularDistance<.35){let i=a.distanceTo(o),u=r.distanceTo(t);if(Math.abs(i-l.overlap)<.25||Math.abs(u-l.overlap)<.25){if(u>i&&Math.abs(u-l.overlap)>1){let e=a.distanceTo(t),n=a.distanceTo(r),i=o.distanceTo(t),s=o.distanceTo(r),d=e<n?e:n,f=i<s?i:s,p=new c.Vector3().subVectors(a,o).normalize(),m=u-l.overlap;d<f?(p.negate(),z=y.facePoints[2].clone().addScaledVector(p,m),B=y.facePoints[3].clone(),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z):(z=y.facePoints[2].clone(),B=y.facePoints[3].clone().addScaledVector(p,m),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z)}I=!0,L=!0,R.push(s[e].index),s[e].isFind=!0,n[s[e].index].isFindBeam=!0,G=e}}}}if(!L)for(let e=0;e<s.length;e++){if(s[e].inWall)continue;let t=new c.Vector3(s[e].doorStartPt.x,s[e].doorStartPt.y,0),r=new c.Vector3(s[e].doorEndPt.x,s[e].doorEndPt.y,0),i=new c.Vector3(y.facePoints[0].x,y.facePoints[0].y,0),a=new c.Vector3(y.facePoints[1].x,y.facePoints[1].y,0),o=new c.Vector3().subVectors(t,r).normalize(),l=new c.Vector3().subVectors(i,a).normalize(),u=.2,d=f(t.clone().addScaledVector(o,u),r.clone().addScaledVector(o.clone().negate(),u),i.clone().addScaledVector(l,u),a.clone().addScaledVector(l.clone().negate(),u)),p=y.facePoints[2].z<s[e].maxZ||Math.abs(y.facePoints[2].z-s[e].maxZ)<.3,m=t.distanceTo(i),h=t.distanceTo(a),_=r.distanceTo(i),v=r.distanceTo(a);(m<g||h<g||_<g||v<g||d)&&p&&(n[s[e].index].isFindBeam=!0,I=!0,s[e].isFind=!0,G=e)}(I||e||Math.abs(O-E)>.1&&O>E/2&&D>.4&&Math.abs(v-i.start.z)<.4)&&(F=!0)}}if(F){let t=!1;for(let e=0;e<p.length;e++){let n=C(p[e].start,p[e].end,V,H);if(n&&n.type==`collinear_overlap`&&n.maxPerpendicularDistance<.01){t=!0;break}}if(t){G!=-1&&(n[s[G].index].isFindBeam=!1,s[G].isFind=!1);continue}p.push({start:V,end:H});{let e=new c.Vector3().subVectors(V,H),t=new c.Vector3().subVectors(H,V),n=1/0,r=1/0,a=V.clone(),o=H.clone(),s=[];if(i.originalPoints.forEach(e=>{e.z-V.z<O/2+.1&&e.z-V.z>O/2-.1&&s.push(e)}),s.length>0){let{newProjectPoints:i}=k(V,H,s);for(let e of i)e.z=V.z;i.forEach(i=>{let s=new c.Vector3(i.x,i.y,V.z),l=new c.Vector3().subVectors(s,H),u=h(e,new c.Vector3().subVectors(s,V)),d=h(t,l);if(u&&u.parallel&&u.sameDirection){let e=s.distanceTo(V);e<n&&(n=e,a=s)}else if(d&&d.parallel&&d.sameDirection){let e=s.distanceTo(H);e<r&&(r=e,o=s)}})}a.equals(V)||(V=a,B=new c.Vector3(V.x,V.y,B.z)),o.equals(H)||(H=o,z=new c.Vector3(H.x,H.y,z.z))}d.includes(r)||d.push(r),i.checkResults[a.index].isDoor=!0;let o=``,g={id:l,beamStart:z,beamEnd:B,beamHeight:i.rooftopPz-y.facePoints[2].z,doorStart:V,doorEnd:H,doorHeight:O,nearId:-1,type:o,isExtend:W,isDoor:I,isPullOutDoor:L,pcbDoorIndexs:R},_=!1,v=new c.Vector3,x=new c.Vector3,w=-1;for(let t=0;t<u.length;t++){let n=e[u[t].linesIndex].doorAndBeamData[u[t].doorIndex];if(n.nearId!=-1)continue;let r=b(z.clone(),B.clone(),n.beamStart.clone(),n.beamEnd.clone());if(r&&r.isParallel){let e=z.distanceTo(B),t=n.beamStart.distanceTo(n.beamEnd),r=new c.Line3(z.clone(),B.clone());r.start.z=0,r.end.z=0;let i=S(n.beamStart,n.beamEnd,!0);t>e&&(r.start=new c.Vector3(n.beamStart.x,n.beamStart.y,0),r.end=new c.Vector3(n.beamEnd.x,n.beamEnd.y,0),i=S(z,B,!0));let a=new c.Vector3,o=r.closestPointToPoint(i,!0,a),s=o.distanceTo(i),u=new c.Vector3().subVectors(i,o).normalize(),d=u.clone().negate(),p=i.clone().addScaledVector(d,s+.1),m=f(r.start,r.end,i,p),h=!I&&!n.isDoor&&(e>t*2||t>e*2);if(s<.4&&m!=null&&!h){n.nearId=l,g.nearId=n.id;let r=.8;(n.isDoor||g.isDoor)&&(n.isDoor=!0,g.isDoor=!0);let i=R.some(e=>n.pcbDoorIndexs.includes(e));e<t?e>r&&!n.isPullOutDoor?(n.beamStart=z.clone().addScaledVector(d,s),n.beamEnd=B.clone().addScaledVector(d,s),n.doorStart=V.clone().addScaledVector(d,s),n.doorEnd=H.clone().addScaledVector(d,s),n.doorHeight=g.doorHeight,n.beamStart.z=n.beamEnd.z=n.doorStart.z+n.doorHeight):!L||L&&n.isPullOutDoor&&i?(g.beamStart=n.beamStart.clone().addScaledVector(u,s),g.beamEnd=n.beamEnd.clone().addScaledVector(u,s),g.doorStart=n.doorStart.clone().addScaledVector(u,s),g.doorEnd=n.doorEnd.clone().addScaledVector(u,s),g.doorHeight=n.doorHeight,g.beamStart.z=g.beamEnd.z=g.doorStart.z+g.doorHeight):(n.beamStart=z.clone().addScaledVector(d,s),n.beamEnd=B.clone().addScaledVector(d,s),n.doorStart=V.clone().addScaledVector(d,s),n.doorEnd=H.clone().addScaledVector(d,s),n.doorHeight=g.doorHeight,n.beamStart.z=n.beamEnd.z=n.doorStart.z+n.doorHeight):e>t&&(t>r&&!L?(g.beamStart=n.beamStart.clone().addScaledVector(d,s),g.beamEnd=n.beamEnd.clone().addScaledVector(d,s),g.doorStart=n.doorStart.clone().addScaledVector(d,s),g.doorEnd=n.doorEnd.clone().addScaledVector(d,s),g.doorHeight=n.doorHeight,g.beamStart.z=g.beamEnd.z=g.doorStart.z+g.doorHeight):!n.isPullOutDoor||L&&n.isPullOutDoor&&i?(n.beamStart=z.clone().addScaledVector(u,s),n.beamEnd=B.clone().addScaledVector(u,s),n.doorStart=V.clone().addScaledVector(u,s),n.doorEnd=H.clone().addScaledVector(u,s),n.doorHeight=g.doorHeight,n.beamStart.z=n.beamEnd.z=n.doorStart.z+n.doorHeight):(g.beamStart=n.beamStart.clone().addScaledVector(d,s),g.beamEnd=n.beamEnd.clone().addScaledVector(d,s),g.doorStart=n.doorStart.clone().addScaledVector(d,s),g.doorEnd=n.doorEnd.clone().addScaledVector(d,s),g.doorHeight=n.doorHeight,g.beamStart.z=g.beamEnd.z=g.doorStart.z+g.doorHeight)),w=g.nearId,v=n.beamStart.clone(),x=n.beamEnd.clone(),_=!0;break}}}let T=!1;if(!_){let i=new c.Line3(V.clone(),H.clone());for(let a=0;a<e.length;a++){if(e[a].length<.5||a==r)continue;let o=C(new c.Vector3(e[a].start.x,e[a].start.y,e[a].start.z),new c.Vector3(e[a].end.x,e[a].end.y,e[a].end.z),V,H);if(o&&o.maxPerpendicularDistance<.3){for(let r=0;r<e[a].checkResults.length;r++){let r=[];e[a].originalPoints.forEach(e=>{e.z>V.z&&e.z<V.z+O/2&&r.push(new c.Vector3(e.x,e.y,V.z))});let o=new c.Vector3,l=[],u=[];for(let e=0;e<r.length;e++){let t=i.closestPointToPoint(r[e],!0,o);t.distanceTo(r[e])<.15&&(l.push(r[e]),u.push(t.clone()))}for(let e=0;e<u.length;e++)M(i,u[e])&&l.push(u[e]);if(l=u,l.length<500)continue;let d=N(l);if(d.length==2){let e=d[0].distanceTo(d[1]);if(Math.abs(e-i.distance())<.3){t=!0,G!=-1&&(n[s[G].index].isFindBeam=!1,s[G].isFind=!1);break}}}if(t)break}else o&&o.type==`collinear_overlap`&&o.maxPerpendicularDistance>.3&&o.maxPerpendicularDistance<.7&&(T=!0)}if(t)continue}let E=!1;if(w!=-1)for(let e=0;e<m.length&&!(m[e].length==1&&(m[e][0].id==l?(m[e].push({id:w,beamStart:v,beamEnd:x}),E=!0):m[e][0].id==w&&(m[e].push({id:l,beamStart:z,beamEnd:B}),E=!0),E));e++);E||m.push([{id:l,beamStart:z,beamEnd:B}]);let A=g.doorStart.distanceTo(g.doorEnd);if(console.log(`id:`,l,r,A),o=I?`door`:A>1.8||T&&A>1?`beam`:`hole`,g.type=o,g.nearId!=-1&&o==`hole`){let t=!1;for(let n=0;n<e.length;n++)if(e[n].doorAndBeamData){for(let r=0;r<e[n].doorAndBeamData.length;r++)if(e[n].doorAndBeamData[r].nearId==l&&e[n].doorAndBeamData[r].type==`beam`){e[n].doorAndBeamData[r].type=o,t=!0;break}if(t)break}}if(i.doorAndBeamData.push(g),u.push({linesIndex:r,doorIndex:i.doorAndBeamData.length-1}),l++,L&&D<2)break}}}let O=i.length*(i.rooftopPz-i.start.z);i.completePointAreaPercentage=D/O*100}if(d.length>1)for(let t=0;t<d.length;t++){let n=[];for(let r=0;r<e[d[t]].doorAndBeamData.length;r++){let i=e[d[t]].doorAndBeamData[r].doorStart.clone(),a=e[d[t]].doorAndBeamData[r].doorEnd.clone();i.z=a.z=0;let o=i.distanceTo(a),s=!1;for(let n=0;n<d.length;n++)if(t!=n)for(let t=0;t<e[d[n]].doorAndBeamData.length;t++){let r=e[d[n]].doorAndBeamData[t].doorStart.clone(),l=e[d[n]].doorAndBeamData[t].doorEnd.clone();r.z=l.z=0,r.distanceTo(l);let u=C(i,a,r,l);if(u.type==`collinear_overlap`&&u.maxPerpendicularDistance<.2){let e=new c.Line3(r,l),t=S(i,a),n=e.closestPointToPoint(t,!0,new c.Vector3),d=t.distanceTo(n);if(Math.abs(o-u.overlap)<.1&&d<.04){s=!0;break}}}s||n.push(e[d[t]].doorAndBeamData[r])}n.length!=e[d[t]].doorAndBeamData.length&&(e[d[t]].doorAndBeamData=n)}let _=.65,v=[],w=[];for(let t=0;t<s.length;t++){if(s[t].isFind)continue;let r=new c.Vector3(s[t].doorStartPt.x,s[t].doorStartPt.y,0),i=new c.Vector3(s[t].doorEndPt.x,s[t].doorEndPt.y,0),a=new c.Vector3().subVectors(r,i).normalize();for(let o=0;o<e.length;o++){if(e[o].length<.7||e[o].completePointAreaPercentage>60)continue;let u=new c.Vector3(e[o].start.x,e[o].start.y,0),d=new c.Vector3(e[o].end.x,e[o].end.y,0),p=new c.Vector3().subVectors(u,d).normalize(),h=.3,y=r.clone().addScaledVector(a,h),S=i.clone().addScaledVector(a.clone().negate(),h),T=u.clone().addScaledVector(p,h),E=d.clone().addScaledVector(p.clone().negate(),h);f(y,S,T,E);let D=b(y,S,T,E),O=r.distanceTo(u)>i.distanceTo(u)?i:r,k=O.distanceTo(u),A=O.distanceTo(d);if((k<g||A<g)&&D&&!D.isParallel){let a=r.distanceTo(u)<r.distanceTo(d)?u:d,p=!1;for(let h=0;h<e.length;h++){if(h==o||v.includes(h)||e[h].length<.7)continue;let y=new c.Vector3(e[h].start.x,e[h].start.y,0),S=new c.Vector3(e[h].end.x,e[h].end.y,0),T=new c.Vector3().subVectors(y,S).normalize(),E=T.clone().negate(),D=y.clone().addScaledVector(T,5),O=S.clone().addScaledVector(E,5),k=x(u,d,y,S),A=C(u,d,y,S),j=f(u,d,D,O),M=!0;if(j!=null&&(M=j.point.distanceTo(u)<g||j.point.distanceTo(d)<g),(k&&k.angle>85||A&&A.type==`collinear_gap`)&&M){let f=new c.Line3(u,d),g=new c.Vector3,x=f.closestPointToPoint(y,!0,g),T=f.closestPointToPoint(S,!0,g),E=x.distanceTo(y),D=T.distanceTo(S),O,k;if(E>D&&D>_)O=S,k=T;else if(E<D&&E>_)O=y,k=x;else continue;if(E=a.distanceTo(y),D=a.distanceTo(S),E>2&&D>2)continue;let A=b(O,k,y,S);if(!A||!A.isParallel)continue;let j=C(r,i,O,k);if(j&&j.type==`collinear_overlap`&&j.maxPerpendicularDistance<.2)continue;O.z=k.z=e[h].start.z;let M=!1;for(let e=0;e<w.length;e++){let t=C(w[e].start,w[e].end,O,k);if(t&&t.type==`collinear_overlap`&&t.maxPerpendicularDistance<.2){M=!0;break}}if(M)continue;for(let t=0;t<e.length;t++){if(e[t].length<.5)continue;let n=C(new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),O,k);if(n&&n.type==`collinear_overlap`&&n.maxPerpendicularDistance<.1){M=!0;break}}if(M)continue;w.push({start:O,end:k}),v.push(h);let N=e[h].rooftopPz-e[h].start.z,P=e[o].rooftopPz-e[o].start.z,F=N<P?N:P;e[h].doorAndBeamData||(e[h].doorAndBeamData=[]),e[h].doorAndBeamData.push({id:l,beamStart:O,beamEnd:k,beamHeight:F,doorStart:O,doorEnd:k,doorHeight:F,nearId:-1,type:`onlyDoor`,isDoor:!0}),n[s[t].index].isFindBeam=!0,n[s[t].index].isFindOnlyDoor=!0,m.push([{id:l,beamStart:O,beamEnd:k}]),l++,p=!0;break}}if(p)break}}}let T=0;for(let t=0;t<e.length;t++){let n=e[t];n.mainBeamDataIds||=[],n.isMainBeam||=!1;let{minZ:r,maxZ:i}=O(n);if(r==null||i==null)continue;i-r;let a=n.rooftopPz-n.start.z;if(a<o-.5||a>o+2||Math.abs(r-n.start.z)>.3||n.length<1)continue;let s=new c.Vector3(n.start.x,n.start.y,0),l=new c.Vector3(n.end.x,n.end.y,0);for(let r=0;r<e.length;r++){if(r==t||e[r].length<1)continue;let a=e[r],o=new c.Vector3(a.start.x,a.start.y,0),u=new c.Vector3(a.end.x,a.end.y,0),d=b(s,l,o,u),f=S(s,l),p=new c.Line3(o,u).closestPointToPoint(f,!0,new c.Vector3),m=f.distanceTo(p),h=O(a);if(!(h.minZ===void 0||h.maxZ===void 0)&&!(h.maxZ-h.minZ>1)&&d&&d.isParallel&&m<.25&&Math.abs(i-h.minZ)<.1){let e=`mainBeamId${T}`;a.mainBeamDataIds||=[],a.isMainBeam||=!0,a.mainBeamDataIds.push(e),n.mainBeamDataIds.push(e),T++;break}}}return{lines:e,beamGroup:m}},W=(e,t)=>{if(e.length<=0)return e;for(let t of e){let e=[];for(let n=0;n<t.checkResults.length;n++){let r=t.checkResults[n];if(r.isDoor=!1,!r.originalVertices||r.originalVertices.length==0)continue;let i=[];r.originalVertices.forEach(e=>{let t=[];e.forEach(e=>{t.push(new c.Vector3(e.x,e.y,e.z))}),i.push(t)});let a=i.length,o=Array.from({length:a},(e,t)=>t);function s(e){for(;o[e]!==e;)o[e]=o[o[e]],e=o[e];return e}for(let e=0;e<a;e++)for(let t=e+1;t<a;t++){let n=i[e],r=i[t];if(n.some(e=>r.some(t=>e.equals(t)))){let n=s(e),r=s(t);n!==r&&(o[n]=r)}}let l=new Map,u=-1,d=-1;for(let e=0;e<a;e++){let t=s(e);l.has(t)||l.set(t,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let r=l.get(t),[a,o,f,p]=i[e],m=new c.Vector3().add(a).add(o).add(f).add(p).multiplyScalar(.25);if(r.points.push(...i[e]),r.area+=a.distanceTo(o)*a.distanceTo(p),r.originalVertices.push(i[e]),r.index=n,r.centerPts.push(m),u==-1||d==-1){let e=new c.Vector3().subVectors(a,o).normalize();d=a.distanceTo(p),u=a.distanceTo(o);let t=h(e,new c.Vector3(0,0,1));t&&t.parallel&&([d,u]=[u,d])}r.gridWidth=u,r.gridHeight=d}e.push(...l.values())}t.mergeCheckRegion=e}let n=new Map;for(let t of e){let e=t.rooftopPz-t.start.z,r=Math.floor(t.rooftopPz-t.start.z);n.has(r)?n.set(r,{num:n.get(r).num+1,totalHeight:n.get(r).totalHeight+e}):n.set(r,{num:1,totalHeight:e})}let r=[...n.entries()].reduce((e,t)=>t[1].num>e[1].num?t:e),i=r[0];r[1].totalHeight/r[1].num,new c.MeshBasicMaterial({color:`#cffd00`,transparent:!0,opacity:.4,side:c.DoubleSide}),new c.PointsMaterial({color:65535,size:.01});for(let n=0;n<e.length;n++){let r=e[n],{minZ:a,maxZ:o}=O(r);if(a==null||o==null)continue;r.doorAndBeamData=[],r.completePointAreaPercentage=-1,o-a;let s=r.rooftopPz-r.start.z;if(s<i-.5||s>i+2||Math.abs(a-r.start.z)>.3||r.length<1)continue;let l=new c.Vector3(r.start.x,r.start.y,0),u=new c.Vector3(r.end.x,r.end.y,0);for(let r=0;r<e.length;r++){if(r==n||e[r].length<1)continue;let i=e[r],a=new c.Vector3(i.start.x,i.start.y,0),s=new c.Vector3(i.end.x,i.end.y,0),d=b(l,u,a,s),f=S(l,u),m=new c.Line3(a,s).closestPointToPoint(f,!0,new c.Vector3),h=f.distanceTo(m),g=O(i);if(!(g.minZ===void 0||g.maxZ===void 0)&&!(g.maxZ-g.minZ>1)&&d&&d.isParallel&&h<.25&&Math.abs(o-g.minZ)<.1){let i=S(l,u),o=S(a,s);i.z=o.z=1,i.applyEuler(new c.Euler(-Math.PI/2,0,0)),o.applyEuler(new c.Euler(-Math.PI/2,0,0));let d=`w:${e[n].originaIndex},b:${e[r].originaIndex}`,f=`b:${e[r].originaIndex},w:${e[n].originaIndex}`;t.add(p(d,i,{textColor:`#fd0000`})),t.add(p(f,o,{textColor:`#fd0000`}))}}}return e},G=(e,t)=>{let n={rectangles:[],threeEdgeRect:[]},r=new Set,i=.2,a=1.5,o=.15;for(let t=0;t<e.length;t++){let s=e[t].length;if(r.has(t)||s<i||s>a)continue;let l=[],u=new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),d=new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),f=new c.Vector3().subVectors(d,u).normalize().clone().negate(),p=new c.Vector3,m=new c.Vector3,g=new c.Vector3;new c.Vector3;for(let n=0;n<e.length;n++){let r=e[n].length;if(n==t||r<i||r>a)continue;let _=new c.Vector3(e[n].start.x,e[n].start.y,e[n].start.z),v=new c.Vector3(e[n].end.x,e[n].end.y,e[n].end.z),y=x(u,d,_,v);if(!y||y.angle<85)continue;let b=P(_,u),S=P(_,d),C=P(v,u),w=P(v,d);if(!(!b&&!S&&!C&&!w)){b||S?(p=_.clone(),m=v.clone()):(p=v.clone(),m=_.clone()),g=new c.Vector3().subVectors(m,p).normalize(),g.clone().negate();for(let p=0;p<e.length;p++){let g=e[p].length;if(p==t||p==n||g<i||g>a)continue;let y=new c.Vector3(e[p].start.x,e[p].start.y,e[p].start.z),b=new c.Vector3(e[p].end.x,e[p].end.y,e[p].end.z),S=x(_,v,y,b);if(!S||S.angle<85)continue;let C=P(y,m),w=P(b,m);if(!C&&!w)continue;new c.Vector3;let T=new c.Vector3,E=new c.Vector3;C?(E=new c.Vector3().subVectors(b,y).normalize(),y.clone(),T=b.clone()):(E=new c.Vector3().subVectors(y,b).normalize(),b.clone(),T=y.clone());let D=h(f,E,.1);if(!(!D||!D.parallel||!D.sameDirection)){for(let f=0;f<e.length;f++){let m=e[f].length;if(f==t||f==n||f==p||m<i||m>a)continue;let h=new c.Vector3(e[f].start.x,e[f].start.y,e[f].start.z),g=new c.Vector3(e[f].end.x,e[f].end.y,e[f].end.z),_=x(h,g,y,b);if(!_||_.angle<85)continue;let v=P(h,T),S=P(g,T);if(!v&&!S)continue;new c.Vector3;let C=new c.Vector3;v?(h.clone(),C=g.clone()):(g.clone(),C=h.clone());let w=P(C,u),E=P(C,d);if(!w&&!E)continue;let D=s*r;if(!(D<o||D>2)){l=[t,n,p,f];break}}if(l.length==4)break}}if(l.length==4)break}}l.length==4&&(l.forEach(e=>r.add(e)),n.rectangles.push(l))}for(let t=0;t<e.length;t++){let s=e[t].length;if(r.has(t)||s<i||s>a)continue;let l={indexs:[],missingEdge:{start:new c.Vector3,end:new c.Vector3}},u=new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),d=new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),f=!0,p=!0;for(let n=0;n<e.length;n++){if(n==t)continue;let r=new c.Vector3(e[n].start.x,e[n].start.y,e[n].start.z),i=new c.Vector3(e[n].end.x,e[n].end.y,e[n].end.z),a=P(r,u),o=P(i,u),s=P(r,d),l=P(i,d);if(a||o?f=!1:(s||l)&&(p=!1),!f&&!p)break}if(!f&&!p)continue;let m=new c.Vector3;f||([u,d]=[d,u]),m=new c.Vector3().subVectors(d,u).normalize();let g=m.clone().negate();for(let n=0;n<e.length;n++){let f=e[n].length;if(n==t||r.has(n)||f<i||f>a)continue;let p=new c.Vector3(e[n].start.x,e[n].start.y,e[n].start.z),m=new c.Vector3(e[n].end.x,e[n].end.y,e[n].end.z),_=x(u,d,p,m);if(!_||_.angle<85)continue;let v=P(p,d),y=P(m,d);if(!v&&!y)continue;new c.Vector3;let b=new c.Vector3;v?(p.clone(),b=m.clone()):(m.clone(),b=p.clone());for(let d=0;d<e.length;d++){let _=e[d].length;if(d==t||d==n||r.has(d)||_<i||_>a)continue;let v=new c.Vector3(e[d].start.x,e[d].start.y,e[d].start.z),y=new c.Vector3(e[d].end.x,e[d].end.y,e[d].end.z),S=x(p,m,v,y);if(!S||S.angle<85)continue;let C=P(v,b),w=P(y,b);if(!C&&!w)continue;let T=new c.Vector3,E=new c.Vector3;C?(T=v.clone(),E=y.clone()):(T=y.clone(),E=v.clone());let D=h(g,new c.Vector3().subVectors(E,T).normalize(),.1);if(!D||!D.parallel||!D.sameDirection)continue;let O=!0,k=!0;for(let t=0;t<e.length;t++){if(t==d)continue;let n=new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),r=new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),i=P(n,v),a=P(r,v),o=P(n,y),s=P(r,y);if(i||a?O=!1:(o||s)&&(k=!1),!O&&!k)break}if(!O&&!k)continue;let A=s*f;if(!(A<o||A>2)){l.indexs=[t,n,d],l.missingEdge.start=E,l.missingEdge.end=u;break}}if(l.indexs.length==3)break}l.indexs.length==3&&(l.indexs.forEach(e=>r.add(e)),n.threeEdgeRect.push(l))}return n};exports.classifySegments=C,exports.getAllGeometry=V,exports.getBeamLine=U,exports.getColLine=G,exports.getMainBeamLine=W,exports.getParallelism=b,exports.getPointCloudMinMax=O,exports.getPointCoverageOnQuad=E,exports.isParallel=h,exports.perpendicularInfo=x,exports.removeNoisePoints=A,exports.segmentsIntersect2D=f,exports.usegetBeamLine=H;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`three`);c=s(c);function l(e,t=!1){let n=e[0].index!==null,r=new Set(Object.keys(e[0].attributes)),i=new Set(Object.keys(e[0].morphAttributes)),a={},o={},s=e[0].morphTargetsRelative,l=new c.BufferGeometry,d=0;for(let c=0;c<e.length;++c){let u=e[c],f=0;if(n!==(u.index!==null))return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.`),null;for(let e in u.attributes){if(!r.has(e))return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. All geometries must have compatible attributes; make sure "`+e+`" attribute exists among all geometries, or in none of them.`),null;a[e]===void 0&&(a[e]=[]),a[e].push(u.attributes[e]),f++}if(f!==r.size)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. Make sure all geometries have the same number of attributes.`),null;if(s!==u.morphTargetsRelative)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. .morphTargetsRelative must be consistent throughout all geometries.`),null;for(let e in u.morphAttributes){if(!i.has(e))return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. .morphAttributes must be consistent throughout all geometries.`),null;o[e]===void 0&&(o[e]=[]),o[e].push(u.morphAttributes[e])}if(t){let e;if(n)e=u.index.count;else if(u.attributes.position!==void 0)e=u.attributes.position.count;else return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index `+c+`. The geometry must have either an index or a position attribute`),null;l.addGroup(d,e,c),d+=e}}if(n){let t=0,n=[];for(let r=0;r<e.length;++r){let i=e[r].index;for(let e=0;e<i.count;++e)n.push(i.getX(e)+t);t+=e[r].attributes.position.count}l.setIndex(n)}for(let e in a){let t=u(a[e]);if(!t)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the `+e+` attribute.`),null;l.setAttribute(e,t)}for(let e in o){let t=o[e][0].length;if(t===0)break;l.morphAttributes=l.morphAttributes||{},l.morphAttributes[e]=[];for(let n=0;n<t;++n){let t=[];for(let r=0;r<o[e].length;++r)t.push(o[e][r][n]);let r=u(t);if(!r)return console.error(`THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the `+e+` morphAttribute.`),null;l.morphAttributes[e].push(r)}}return l}function u(e){let t,n,r,i=-1,a=0;for(let o=0;o<e.length;++o){let s=e[o];if(t===void 0&&(t=s.array.constructor),t!==s.array.constructor)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.`),null;if(n===void 0&&(n=s.itemSize),n!==s.itemSize)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.`),null;if(r===void 0&&(r=s.normalized),r!==s.normalized)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.`),null;if(i===-1&&(i=s.gpuType),i!==s.gpuType)return console.error(`THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.`),null;a+=s.count*n}let o=new t(a),s=new c.BufferAttribute(o,n,r),l=0;for(let t=0;t<e.length;++t){let r=e[t];if(r.isInterleavedBufferAttribute){let e=l/n;for(let t=0,i=r.count;t<i;t++)for(let i=0;i<n;i++){let n=r.getComponent(t,i);s.setComponent(t+e,i,n)}}else o.set(r.array,l);l+=r.count*n}return i!==void 0&&(s.gpuType=i),s}var d=class extends c.Object3D{constructor(e=document.createElement(`div`)){super(),this.isCSS2DObject=!0,this.element=e,this.element.style.position=`absolute`,this.element.style.userSelect=`none`,this.element.setAttribute(`draggable`,!1),this.center=new c.Vector2(.5,.5),this.addEventListener(`removed`,function(){this.traverse(function(e){e.element&&e.element instanceof e.element.ownerDocument.defaultView.Element&&e.element.parentNode!==null&&e.element.remove()})})}copy(e,t){return super.copy(e,t),this.element=e.element.cloneNode(!0),this.center=e.center,this}};new c.Vector3,new c.Matrix4,new c.Matrix4,new c.Vector3,new c.Vector3;var f=(e,t,n,r,i=1e-8)=>{let a=t.x-e.x,o=t.y-e.y,s=r.x-n.x,l=r.y-n.y,u=a*l-o*s;if(Math.abs(u)<i)return null;let d=((n.x-e.x)*l-(n.y-e.y)*s)/u,f=((n.x-e.x)*o-(n.y-e.y)*a)/u;return d<-i||d>1+i||f<-i||f>1+i?null:{point:new c.Vector3(e.x+d*a,e.y+d*o,e.z)}},p=(e,t,n={})=>{let{fontSize:r=36,fontFamily:i=`sans-serif`,backgroundColor:a=`rgba(0,0,0,0)`,textColor:o=`#ffffff`,padding:s=10,maxWidth:l=256}=n,u=document.createElement(`canvas`).getContext(`2d`);u.font=`bold ${r}px ${i}`;let d=u.measureText(e).width,f=Math.min(d+s*2,l),p=r+s*2,h=document.createElement(`canvas`);h.width=f,h.height=p;let g=h.getContext(`2d`);g.fillStyle=a,g.fillRect(0,0,f,p),g.fillStyle=o,g.font=`bold ${r}px ${i}`,g.textAlign=`center`,g.textBaseline=`middle`,d>l-s*2?m(g,e,f/2,p/2,l,r):g.fillText(e,f/2,p/2);let _=new c.CanvasTexture(h),v=new c.SpriteMaterial({map:_,depthTest:!1,transparent:!0}),y=new c.Sprite(v);y.position.set(t.x,t.y,t.z);let b=.005;return y.scale.set(f*b,p*b,1),y};function m(e,t,n,r,i,a){let o=t.split(``),s=``,c=a*1.2,l=r;for(let t=0;t<o.length;t++){let r=s+o[t];e.measureText(r).width>i&&t>0?(e.fillText(s,n,l),s=o[t],l+=c):s=r}e.fillText(s,n,l)}var h=(e,t,n=.01)=>{let r=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z),i=Math.sqrt(t.x*t.x+t.y*t.y+t.z*t.z);if(r<1e-10||i<1e-10)return{parallel:!1,sameDirection:null,angle:NaN};let a={x:e.x/r,y:e.y/r,z:e.z/r},o={x:t.x/i,y:t.y/i,z:t.z/i},s=a.x*o.x+a.y*o.y+a.z*o.z;s=Math.max(-1,Math.min(1,s));let c=Math.acos(Math.abs(s)),l=c<=n;return{parallel:l,sameDirection:l?s>0:null,angle:c}};function g(e,t,n){let r=new c.BufferGeometry,i=[],a=[];e.forEach(e=>i.push(e.x,e.y,e.z)),t.forEach(e=>i.push(e.x,e.y,e.z)),a.push(0,2,1,0,3,2),a.push(4,5,6,4,6,7),a.push(0,1,5,0,5,4),a.push(1,2,6,1,6,5),a.push(2,3,7,2,7,6),a.push(3,0,4,3,4,7),r.setAttribute(`position`,new c.Float32BufferAttribute(i,3)),r.setIndex(a),r.computeVertexNormals();let o=new c.MeshBasicMaterial({color:n==`door`?`green`:`#a7cc00`,transparent:!0,opacity:.5,side:c.DoubleSide});return new c.Mesh(r,o)}var _=class{constructor(e={}){this.config={value:e.value||`0.0000m`,position:e.position||new c.Vector3(0,0,0),style:{fontFamily:e.style?.fontFamily||`Arial, sans-serif`,fontSize:e.style?.fontSize||`16px`,fontWeight:e.style?.fontWeight||`normal`,fontStyle:e.style?.fontStyle||`normal`},backgroundOpacity:e.backgroundOpacity||.7},this.label=null,this.labelElement=null,this.createLabel()}createLabel(){return this.labelElement=document.createElement(`div`),this.labelElement.textContent=this.config.value,this.applyBlackWhiteStyle(),this.label=new d(this.labelElement),this.label.position.copy(this.config.position),this.label}applyBlackWhiteStyle(){let e=this.labelElement.style,t=this.config;e.fontFamily=t.style.fontFamily,e.fontSize=t.style.fontSize,e.fontWeight=t.style.fontWeight,e.fontStyle=t.style.fontStyle,e.color=`#FFFFFF`,e.textShadow=`0 1px 2px rgba(0, 0, 0, 0.5)`,e.backgroundColor=`rgba(0, 0, 0, ${t.backgroundOpacity})`,e.padding=`6px 12px`,e.borderRadius=`4px`,e.position=`absolute`,e.whiteSpace=`nowrap`,e.userSelect=`none`,e.pointerEvents=`none`,e.zIndex=`1000`,e.textAlign=`center`,e.lineHeight=`1.2`}updateValue(e){this.labelElement&&(this.labelElement.textContent=e)}updatePosition(e){this.label&&this.label.position.copy(e)}updateFontStyle(e){if(this.labelElement){let t=this.labelElement.style;e.fontFamily&&(t.fontFamily=e.fontFamily),e.fontSize&&(t.fontSize=e.fontSize),e.fontWeight&&(t.fontWeight=e.fontWeight),e.fontStyle&&(t.fontStyle=e.fontStyle)}}getLabel(){return this.label}getLabelElement(){return this.labelElement}dispose(){this.labelElement&&this.labelElement.parentNode&&this.labelElement.parentNode.removeChild(this.labelElement),this.label=null,this.labelElement=null}},v=e=>{let t=new c.Group,n=new c.Group;if(e&&e.length){let r=`green.red.pink.white.azure.yellow.bisque.grey.blanchedalmond.blue.blueviolet.brown.burlywood.cadetblue.chartreuse.chocolate.coral.cornflowerblue.cornsilk.crimson.cyan.darkblue.darkcyan.darkgoldenrod.darkgray.darkgreen.darkgrey.darkkhaki.darkmagenta.darkolivegreen.darkorange.darkorchid.darkred.darksalmon.darkseagreen.darkslateblue.darkslategray.darkslategrey.darkturquoise.darkviolet.deeppink.deepskyblue.dimgray.dimgrey.dodgerblue.firebrick.floralwhite.forestgreen.fuchsia.gainsboro.ghostwhite.gold.goldenrod.gray.aliceblue.greenyellow.black.honeydew.hotpink.indianred.indigo.ivory.khaki.lavender.lavenderblush.lawngreen.lemonchiffon.lightblue.lightcoral.lightcyan.lightgoldenrodyellow.lightgray.lightgreen.lightgrey.lightpink.lightsalmon.lightseagreen.lightskyblue.lightslategray.lightslategrey.lightsteelblue.lightyellow.lime.limegreen.linen.magenta.maroon.mediumaquamarine.mediumblue.mediumorchid.mediumpurple.mediumseagreen.mediumslateblue.mediumspringgreen.mediumturquoise.mediumvioletred.midnightblue.mintcream.mistyrose.moccasin.navajowhite.navy.oldlace.olive.olivedrab.orange.orangered.orchid.palegoldenrod.palegreen.paleturquoise.palevioletred.papayawhip.peachpuff.peru.pink.plum.powderblue.purple.rebeccapurple.yellow.rosybrown.royalblue.saddlebrown.salmon.sandybrown.seagreen.seashell.sienna.silver.skyblue.slateblue.slategray.slategrey.snow.springgreen.steelblue.tan.teal.thistle.tomato.turquoise.violet.wheat.white.whitesmoke.yellow.yellowgreen`.split(`.`);e.forEach((e,i)=>{let a=r[i],o=new c.Group,{pcdPoints:s,category:l,name:u,center:d,box:f,obbBox:p,contour:m,nline:h,coordinatesByWidth:v,coordinatesByArea:y}=e,b=s.length,x=new c.Box3(new c.Vector3(f.min.x,f.min.y,f.min.z),new c.Vector3(f.max.x,f.max.y,f.max.z)),S=new c.Box3Helper(x,a);o.add(S);let C=new _({value:u,position:new c.Vector3(d.x,d.y,d.z)}).getLabel();o.add(C);let w=new c.InstancedMesh(new c.SphereGeometry(.007,8,8),new c.MeshBasicMaterial({color:a}),b);o.add(w);let T=new c.Matrix4,E=0;if(s.forEach(e=>{T.setPosition(e.x,e.y,e.z),w.setMatrixAt(E,T),E++}),w.instanceMatrix.needsUpdate=!0,h){let e=new c.BufferGeometry;e.setFromPoints([new c.Vector3(h.start.x,h.start.y,h.start.z),new c.Vector3(h.end.x,h.end.y,h.end.z)]);let t=new c.LineBasicMaterial({color:`red`,depthTest:!1,depthWrite:!1});new c.Line(e,t);let n=new c.Vector3().copy(new c.Vector3(h.start.x,h.start.y,h.start.z)).add(new c.Vector3(h.end.x,h.end.y,h.end.z)).multiplyScalar(.5),r=new c.Vector3(h.centerDir.x,h.centerDir.y,h.centerDir.z);new c.ArrowHelper(r,n,1,`red`)}if(m){let e=[];m.forEach((t,n)=>{e.push(new c.Vector3(t.x,t.y,t.z))});let r=new c.BufferGeometry;r.setFromPoints(e);let i=new c.LineBasicMaterial({color:`yellow`,depthTest:!1,depthWrite:!1}),a=new c.Line(r,i);l==`door`?t.add(a):n.add(a)}if(y){let e=[],r=[];y.coordinates.forEach((t,n)=>{e.push(new c.Vector3(t.x,t.y,t.z)),r.length<4&&r.push(new c.Vector3(t.x,t.y,t.z))});let i=new c.BufferGeometry;i.setFromPoints(e);let a=new c.LineBasicMaterial({color:`green`,depthTest:!1,depthWrite:!1}),o=new c.Line(i,a);l==`door`?t.add(o):n.add(o);let s=g(r.map(e=>new c.Vector3(e.x,e.y,y.heightData.minZ)),r.map(e=>new c.Vector3(e.x,e.y,e.z)),l);l==`door`?t.add(s):n.add(s);let[u,d,f]=e,p=u.distanceTo(d),m=new c.Vector3().copy(u).add(d).multiplyScalar(.5);new _({value:String(p.toFixed(3)),position:m}).getLabel();let h=d.distanceTo(f),v=new c.Vector3().copy(d).add(f).multiplyScalar(.5);new _({value:String(h.toFixed(3)),position:v}).getLabel()}if(p){let e=new c.BoxGeometry(p.size.x,p.size.y,p.size.z),r=new c.LineBasicMaterial({color:a,linewidth:2}),i=new c.EdgesGeometry(e),o=new c.LineSegments(i,r),s=new Vector3(p.center.x,p.center.y,p.center.z),u=new Quaternion(p.rotation.x,p.rotation.y,p.rotation.z,p.rotation.w);o.position.copy(s),o.quaternion.copy(u),l==`door`?t.add(o):n.add(o)}})}return{AiProjectionGroup:t,AiProjectionGroup2:n}},y=(e,t,n,r)=>{let i=e,a=[];if(r&&r.length&&(a=r.map(e=>e.clone())),!i||i.length<4)return{};let o=new c.Vector3().subVectors(i[1],i[0]).normalize(),s=new c.Vector3().subVectors(i[3],i[0]).normalize(),l=o.clone().cross(s).normalize(),u=1/0,d=-1/0,f=1/0,p=-1/0;for(let e of i){let t=e.dot(o),n=e.dot(s);t<u&&(u=t),t>d&&(d=t),n<f&&(f=n),n>p&&(p=n)}let m=i[0].dot(l),g=o.clone().multiplyScalar(u).add(s.clone().multiplyScalar(f)).add(l.clone().multiplyScalar(m)),_=o.clone().multiplyScalar(d).add(s.clone().multiplyScalar(f)).add(l.clone().multiplyScalar(m)),v=o.clone().multiplyScalar(d).add(s.clone().multiplyScalar(p)).add(l.clone().multiplyScalar(m)),y=o.clone().multiplyScalar(u).add(s.clone().multiplyScalar(p)).add(l.clone().multiplyScalar(m)),b=[g,_,v,y],x=h(new c.Vector3().subVectors(g,_),new c.Vector3(0,0,1));x&&x.parallel&&(b=[g,y,v,_]);let S=0;if(r.length>0){let e=new c.Vector3().subVectors(b[1],b[0]).normalize(),r=e.clone().negate(),i=new c.Vector3().subVectors(b[3],b[0]).normalize(),o=i.clone().negate(),s=b[0].distanceTo(b[1]),l=b[0].distanceTo(b[3]),u=s/t,d=l/n,f=.001;for(let r=0;r<u;r++){let r=b[0],o=0;for(let s=0;s<d;s++){let s=r.clone().addScaledVector(e,t),l=s.clone().addScaledVector(i,n),u=r.clone().addScaledVector(i,n),d=new c.Vector3().add(r).add(s).add(l).add(u).multiplyScalar(.25);for(let e=0;e<a.length;e++)if(a[e].distanceTo(d)<f){o++;break}r=u}if(o>=d/2)break;S+=o,b[0]=b[0].addScaledVector(e,t),b[3]=b[3].addScaledVector(e,t)}s=b[0].distanceTo(b[1]),u=s/t;for(let e=0;e<u;e++){let e=b[1],o=0;for(let s=0;s<d;s++){let s=e.clone().addScaledVector(r,t),l=s.clone().addScaledVector(i,n),u=e.clone().addScaledVector(i,n),d=new c.Vector3().add(e).add(s).add(l).add(u).multiplyScalar(.25);for(let e=0;e<a.length;e++)if(a[e].distanceTo(d)<f){o++;break}e=u}if(o>=d/2)break;S+=o,b[1]=b[1].addScaledVector(r,t),b[2]=b[2].addScaledVector(r,t)}s=b[0].distanceTo(b[1]),u=s/t;for(let r=0;r<d;r++){let r=b[3],i=0;for(let s=0;s<u;s++){let s=r.clone().addScaledVector(e,t),l=s.clone().addScaledVector(o,n),u=r.clone().addScaledVector(o,n),d=new c.Vector3().add(r).add(s).add(l).add(u).multiplyScalar(.25);for(let e=0;e<a.length;e++)if(a[e].distanceTo(d)<f){i++;break}r=s}if(i>=u/2)break;S+=i,b[2]=b[2].addScaledVector(o,n),b[3]=b[3].addScaledVector(o,n)}}let C=b[0].distanceTo(b[1])*b[0].distanceTo(b[3]);return{facePoints:b,boxArea:C,totalInPlaneNum:S}},b=(e,t,n,r,i=c.MathUtils.degToRad(8))=>{let a=new c.Vector3,o=new c.Vector3;a.subVectors(new c.Vector3(t.x,t.y,0),new c.Vector3(e.x,e.y,0)).normalize(),o.subVectors(new c.Vector3(r.x,r.y,0),new c.Vector3(n.x,n.y,0)).normalize();let s=a.dot(o),l=Math.acos(Math.min(Math.abs(s),1)),u=1-Math.min(l/i,1),d=s>0?`same`:`opposite`;return{parallelism:u,angle:l,angleDeg:c.MathUtils.radToDeg(l),isParallel:l<i,direction:d,vectors:{v1:a,v2:o}}},x=(e,t,n,r)=>{let i=new c.Vector3().subVectors(t,e),a=new c.Vector3().subVectors(r,n),o=i.length(),s=a.length();if(o===0||s===0)return{rate:NaN,angle:NaN,isPerpendicular:!1,isParallel:!1};i.normalize(),a.normalize();let l=Math.abs(i.dot(a)),u=Math.min(1,Math.max(0,l)),d=Math.acos(u),f=c.MathUtils.radToDeg(d),p=1-u;return{rate:p,percent:`${(p*100).toFixed(2)}%`,angle:f,isPerpendicular:Math.abs(f-90)<.01,isParallel:f<.01}},S=(e,t,n=!1)=>new c.Vector3((e.x+t.x)/2,(e.y+t.y)/2,n?0:(e.z+t.z)/2),C=(e,t,n,r,i={})=>{let{parallelAngleMax:a=c.MathUtils.degToRad(10),collinearAngleMax:o=c.MathUtils.degToRad(7),distanceThreshold:s=2,overlapThreshold:l=.01}=i,u=new c.Vector3().subVectors(t,e),d=new c.Vector3().subVectors(r,n),f=u.clone().normalize(),p=d.clone().normalize(),m=c.MathUtils.clamp(f.dot(p),-1,1),h=Math.acos(Math.abs(m)),g=c.MathUtils.radToDeg(h);if(h>a)return{type:`not_parallel`,angleDeg:g,avgPerpendicularDistance:null,maxPerpendicularDistance:null,gap:null,overlap:null,closestDistance:null};m<0&&p.negate();let _=new c.Vector3().addVectors(f,p).normalize(),v=new c.Vector3().addVectors(e,t).multiplyScalar(.5),y=w(n,v,f),b=w(r,v,f),x=(y+b)/2,S=Math.max(y,b),C=e.dot(_),E=t.dot(_),D=n.dot(_),O=r.dot(_),k=Math.min(C,E),A=Math.max(C,E),j=Math.min(D,O),M=Math.max(D,O),N=A-k,P=M-j,F=Math.min(N,P),I=Math.min(A,M)-Math.max(k,j),L=I<0?-I:0,R=I>0?I:0,z=F>0?R/F:0,B=T(e,t,n,r),V=h<=o&&x<s,H;return V?H=z>.5?`collinear_overlap`:`collinear_gap`:h<=a&&(H=`parallel_offset`),{type:H,angleDeg:g,avgPerpendicularDistance:x,maxPerpendicularDistance:S,gap:L,overlap:R,closestDistance:B}};function w(e,t,n){let r=new c.Vector3().subVectors(e,t),i=r.dot(n),a=n.clone().multiplyScalar(i);return new c.Vector3().subVectors(r,a).length()}function T(e,t,n,r){let i=new c.Vector3().subVectors(t,e),a=new c.Vector3().subVectors(r,n),o=new c.Vector3().subVectors(n,e),s=i.dot(i),l=i.dot(a),u=a.dot(a),d=i.dot(o),f=a.dot(o),p=s*u-l*l,m,h;p<1e-10?(m=0,h=u===0?0:f/u):(m=(l*f-u*d)/p,h=(s*f-l*d)/p),m=c.MathUtils.clamp(m,0,1),h=u===0?0:c.MathUtils.clamp((l*m+f)/u,0,1),m=s===0?0:c.MathUtils.clamp((l*h-d)/s,0,1);let g=e.clone().add(i.clone().multiplyScalar(m)),_=n.clone().add(a.clone().multiplyScalar(h));return g.distanceTo(_)}var E=(e,t,n,r=.05,i=.02)=>{let[a,o,s,l]=e,u=new c.Vector3().subVectors(o,a),d=new c.Vector3().subVectors(l,a),f=new c.Vector3().crossVectors(u,d).normalize(),p=u.length(),m=d.length(),h=u.clone().normalize(),g=d.clone().normalize(),_=n-r,v=n+r,y=new c.Vector3,b=[],x=Math.ceil(p/i),S=Math.ceil(m/i),C=p/x,w=m/S,T=new Uint8Array(x*S);for(let e=0;e<t.length;e++){y.subVectors(t[e],a);let n=Math.abs(y.dot(f));if(n<_||n>v)continue;let r=y.dot(h),i=y.dot(g);if(r<0||r>p||i<0||i>m)continue;b.push(new c.Vector3(t[e].x,t[e].y,t[e].z));let o=Math.min(Math.floor(r/C),x-1),s=Math.min(Math.floor(i/w),S-1);T[s*x+o]=1}let E=0;for(let e=0;e<T.length;e++)T[e]&&E++;let D=x*S,O=p*m,k=E==0||D==0?0:E/D*O;return{filteredPoints:b,coveragePercent:E==0||D==0?0:E/D*100,quadArea:O,coveredArea:k}},D=(e,t)=>Math.round(Math.max(5,Math.min(350,t*Math.sqrt(e)))),O=e=>{let t=new c.Vector3(e.start.x,e.start.y,e.start.z),n=new c.Vector3(e.end.x,e.end.y,e.end.z),r=t.distanceTo(n),i=e.rooftopPz-e.start.z,a=D(r,100),o=D(i,70),s=i/o,l=new Map;for(let e=0;e<o;e++)l.set((e+1)*s,{count:0,minZ:1/0,maxZ:-1/0});let u=new c.Line3(t,n),d=e.originalPoints,f=new c.Vector3;for(let e=0;e<d.length;e++){let t=d[e],n=u.closestPointToPoint(t,!0,f).distanceTo(t),r=Math.floor(n/s);if(r<o){let e=l.get((r+1)*s);e.count++,t.z<e.minZ&&(e.minZ=t.z),t.z>e.maxZ&&(e.maxZ=t.z)}}let p,m,h=a/2;for(let[e,t]of l)if(t.count>=h){p=t.minZ;break}for(let[e,t]of[...l.entries()].reverse())if(t.count>=h){m=t.maxZ;break}return{minZ:p,maxZ:m}},k=(e,t,n)=>{let r=new c.Plane,i=new c.Vector3(e.x,e.y,e.z),a=new c.Vector3(t.x,t.y,t.z),o=new c.Vector3(t.x,t.y,t.z+5);r.setFromCoplanarPoints(i,a,o);let s=[];n.forEach(e=>{let t=new c.Vector3;r.projectPoint(e,t),t.z=i.z,s.push(t)});let l=new c.Vector3,u=new c.Vector3;r.projectPoint(i,l),r.projectPoint(a,u);let d=new c.Line3(l,u),f=[],p=[],m=new c.Vector3;return s.forEach((e,t)=>{d.closestPointToPoint(e,!0,m).distanceTo(e)<.001?f.push(n[t]):p.push(e)}),{newOriginalPoints:f,newProjectPoints:p}},A=e=>{function t(e,t,n,r,i,a,o,s,l){let u=new c.Line3(e,t),d=new Map,f=new c.Vector3,p=e.clone(),m=t.clone(),h=0;for(;;){let g=new Map,_=0;for(let e=0;e<l.checkResults.length;e++)if(!(l.checkResults[e].allCenterPoints.length/s*100<1))for(let t=0;t<l.checkResults[e].allCenterPoints.length;t++){if(d.has(e)&&d.get(e).removePtsIndex.includes(t))continue;let n=l.checkResults[e].allCenterPoints[t];n=new c.Vector3(n.x,n.y,n.z);let r=u.closestPointToPoint(n,!0,f),a=n.distanceTo(r);Math.abs(a-i)<.01&&(_++,g.has(e)?g.get(e).removePtsIndex.push(t):g.set(e,{index:e,removePtsIndex:[t]}))}if(h==o){e=p,t=m;break}if(_<a/20*18||_==0){g.clear(),o-h<5&&(e=p,t=m,d.clear());break}else{h++;for(let[e,t]of g)d.has(e)?d.get(e).removePtsIndex.push(...t.removePtsIndex):d.set(e,t);g.clear(),e=e.addScaledVector(n,r),t=t.addScaledVector(n,r),u.set(e,t)}}if(d.size>0&&h!=o)for(let[e,t]of d){let n=[],r=[];for(let i=0;i<l.checkResults[e].allCenterPoints.length;i++)t.removePtsIndex.includes(i)||(n.push(l.checkResults[e].allCenterPoints[i]),r.push(l.checkResults[e].originalVertices[i]));l.checkResults[e].allCenterPoints=n,l.checkResults[e].originalVertices=r}}for(let n=0;n<e.length;n++){let r=e[n];if(r.length<.5)continue;let i=-1,a=-1;if(!r.checkResults||r.checkResults.length<=0)continue;if(r.checkResults[0].originalVertices&&r.checkResults[0].originalVertices.length>0){let[e,t,n,o]=r.checkResults[0].originalVertices[0];e=new c.Vector3(e.x,e.y,e.z),t=new c.Vector3(t.x,t.y,t.z),n=new c.Vector3(n.x,n.y,n.z),o=new c.Vector3(o.x,o.y,o.z),i=e.distanceTo(t),a=e.distanceTo(o);let s=h(new c.Vector3().subVectors(e,t).normalize(),new c.Vector3(0,0,1));s&&s.parallel&&([a,i]=[i,a])}if(i<0||a<0)continue;let o=new c.Vector3(r.start.x,r.start.y,r.start.z),s=new c.Vector3(r.end.x,r.end.y,r.end.z),l=o.distanceTo(s),u=r.rooftopPz-r.start.z,d=Math.ceil(l/i),f=Math.ceil(u/a),p=o.clone(),m=s.clone(),g=m.clone().add(new c.Vector3(0,0,u)),_=p.clone().add(new c.Vector3(0,0,u)),v=new c.Vector3().subVectors(m,p).normalize(),y=v.clone().negate();new c.Vector3().subVectors(g,p).normalize().clone().negate();let b=i/2;a/2;let x=l*u/(i*a);t(p,_,v,i,b,f,d,x,r),t(m,g,y,i,b,f,d,x,r),r.start=p,r.end=m;let{newOriginalPoints:S}=k(p,m,r.originalPoints);r.originalPoints=S}},j=(e,t)=>new c.Vector3(e.x,e.y,0).distanceTo(new c.Vector3(t.x,t.y,0)),M=(e,t,n=1e-6)=>{let r=new c.Vector3;return e.closestPointToPoint(t,!0,r),r.distanceTo(t)<n},N=e=>{let t=0,n=[];for(let r=0;r<e.length;r++)for(let i=r+1;i<e.length;i++){let a=e[r].distanceTo(e[i]);a>t&&(t=a,n=[e[r],e[i]])}return n},P=(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,F=e=>{let t=[];e.children.forEach(e=>{e.type==`GridHelper`||e.type==`DirectionalLight`||e.type==`AmbientLight`||t.push(e)}),t.forEach(t=>{e.remove(t),I(t)})};function I(e){for(;e.children&&e.children.length>0;){let t=e.children[0];e.remove(t),I(t)}e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(e=>L(e)):L(e.material))}function L(e){for(let t of Object.keys(e)){let n=e[t];n&&typeof n==`object`&&typeof n.dispose==`function`&&n.dispose()}e.dispose()}var R=class{results;clusterResults;constructor(){this.results=null}initLimits1(e,t){let n,r;return n=e<.3?5:e<.5?8:e<.8?10:e<1?15:e<2?30:e<3?35:e<4?40:e<5?45:e<6?50:e<7?60:e<8.5?70:e<10?80:e<15?100:e<20?120:e<25?140:e<30?160:e<35?180:e<40?200:e<45?230:e<50?250:350,t<1?r=30:t<2?r=40:t<2.5?r=45:t<3?r=60:t<3.6?r=70:t<4&&(r=80),{horizontalSubdivisions:n,verticalSubdivisions:r}}initLimits2(e,t){return{horizontalSubdivisions:Math.round(Math.max(5,Math.min(350,e/.08))),verticalSubdivisions:Math.round(Math.max(30,Math.min(80,t/.06)))}}initLimits4(e,t){return{horizontalSubdivisions:Math.round(Math.max(5,Math.min(350,65*Math.sqrt(e))))*1,verticalSubdivisions:Math.round(Math.max(30,Math.min(80,15*Math.sqrt(t))))*1}}initLimits3(e,t){let n;return n=e<2?.06:e<10?.1:.15,{horizontalSubdivisions:Math.round(Math.max(5,Math.min(350,e/n))),verticalSubdivisions:Math.round(Math.max(30,Math.min(80,t/.06)))}}createWallPlaneMeshFromFourPoints(e,t,n,r,i,a,o=16777215){let s=[e,t,n,r];for(let e=0;e<s.length;e++)this.isValidVector3(s[e])||(console.error(`点${e+1}包含无效数据:`,s[e]),s[e]=new c.Vector3(e,0,e));let l=new c.BufferGeometry,u=new Float32Array([s[0].x,s[0].y,s[0].z,s[1].x,s[1].y,s[1].z,s[2].x,s[2].y,s[2].z,s[3].x,s[3].y,s[3].z]),d=[0,1,2,0,2,3],f=new Float32Array([0,0,1,0,1,1,0,1]);l.setAttribute(`position`,new c.BufferAttribute(u,3)),l.setAttribute(`uv`,new c.BufferAttribute(f,2)),l.setIndex(d),l.computeVertexNormals();let p=new c.Mesh(l,i),m=new c.EdgesGeometry(l),h=new c.LineSegments(m,new c.LineBasicMaterial({color:o}));return a.add(h),p}createSubdividedWallPlane(e,t,n,r,i){let a=[];if(!e||!e.start||!e.end||isNaN(e.rooftopPz))return a;let o=new c.Vector3(e.start.x,e.start.y,e.start.z),s=new c.Vector3(e.end.x,e.end.y,e.end.z),l=[o,s,new c.Vector3(e.end.x,e.end.y,e.rooftopPz),new c.Vector3(e.start.x,e.start.y,e.rooftopPz)];for(let e=0;e<l.length;e++)if(!this.isValidVector3(l[e]))return console.error(`墙体基础点${e}无效:`,l[e]),a;let u=o.distanceTo(s),d=Math.abs(e.rooftopPz-e.start.z);if(u===0||d===0)return console.error(`墙体宽度或高度为0`),console.log(`line.rooftopPz`,e.rooftopPz),console.log(`bottomLeft`,o),console.log(`bottomRight`,s),console.log(e.length),a;let f=u/n,p=d/t,m=new c.Vector3().subVectors(s,o).normalize(),h=new c.Vector3(0,0,1);for(let e=0;e<t;e++)for(let t=0;t<n;t++)try{let n={points:[new c.Vector3().copy(o).add(m.clone().multiplyScalar(t*f)).add(h.clone().multiplyScalar(e*p)),new c.Vector3().copy(o).add(m.clone().multiplyScalar((t+1)*f)).add(h.clone().multiplyScalar(e*p)),new c.Vector3().copy(o).add(m.clone().multiplyScalar((t+1)*f)).add(h.clone().multiplyScalar((e+1)*p)),new c.Vector3().copy(o).add(m.clone().multiplyScalar(t*f)).add(h.clone().multiplyScalar((e+1)*p))],userData:{}};n.userData={type:`wallSegment`,row:e,col:t,originalMaterial:r,width:f,height:p},a.push(n)}catch(n){console.error(`创建墙体小平面(${e}, ${t})时出错:`,n)}return a}calculateMinRequiredPoints(e){let t=Math.floor(Math.log1p(e)*.5);return Math.max(1,t)}calculateExpectedDensity(e){return e<1?10:e<4?5:2}evaluateSegmentByArea(e,t,n,r){if(t===0)return!1;let i=e.area,a=e.minRequiredPoints,o=e.expectedDensity,s=t/Math.max(i,.001),c=t>=a,l=s>=o*.3,u=!0;return i<.5&&t>0&&(u=this.checkSmallAreaDistribution(e,n,r)),c&&l&&u}checkSmallAreaDistribution(e,t,n){if(t.length<2)return!0;let r=t.map(e=>n[e]);e.bounds;let i=e.center,a=0,o=Math.sqrt(e.area)*.3;return r.forEach(e=>{e.distanceTo(i)<=o&&a++}),a/r.length>=.3}getFailureReason(e,t){let n=e.area,r=e.minRequiredPoints,i=e.expectedDensity,a=t/Math.max(n,.001),o=[];return t===0?o.push(`无点`):(t<r&&o.push(`点数不足: ${t}/${r}`),a<i*.3&&o.push(`密度不足: ${a.toFixed(2)}/${i.toFixed(2)}`),n<.5&&t>0&&(this.checkSmallAreaDistribution(e,[],[])||o.push(`小平面分布不均`))),o.length>0?o.join(`, `):`未知原因`}calculateMedian(e){let t=[...e].sort((e,t)=>e-t),n=Math.floor(t.length/2);return t.length%2==0?(t[n-1]+t[n])/2:t[n]}isPointInBoundingBox(e,t,n=.1){return e.x>=t.min[0]-n&&e.x<=t.max[0]+n&&e.y>=t.min[1]-n&&e.y<=t.max[1]+n&&e.z>=t.min[2]-n&&e.z<=t.max[2]+n}getSegmentPlane(e){let t=e.geometry;if(!t||!t.attributes.position)return null;let n=t.attributes.position;if(n.count<3)return null;let r=new c.Vector3().fromBufferAttribute(n,0),i=new c.Vector3().fromBufferAttribute(n,1),a=new c.Vector3().fromBufferAttribute(n,2);r.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld),a.applyMatrix4(e.matrixWorld);let o=new c.Plane;return o.setFromCoplanarPoints(r,i,a),o}analyzePointDistribution(e,t,n=.01){this.results={totalSegments:0,segmentsWithPoints:0,segmentsWithoutPoints:0,missingSegments:[],pointsInSegments:new Map,segmentsByPoint:new Map,segmentDetails:new Map,tolerance:n,analysisTime:null};let r=performance.now(),i=[];e.forEach(e=>{if(e.userData&&e.userData.type===`wallSegment`){let t=this.getWorldVerticesNew(e.points);if(t.length<4)return;let n=new c.Vector3().add(t[0]).add(t[1]).add(t[2]).add(t[3]).multiplyScalar(.25);e.userData.center=n,e.vertices=t,i.push(e)}}),this.results.totalSegments=i.length;for(let e of i){if(e.vertices.length<4)continue;let r=e.userData.center,i=`row${e.userData.row}_col${e.userData.col}`,[a,o,s,l]=e.vertices,u=new c.Vector3().subVectors(o,a).normalize(),d=new c.Vector3().subVectors(l,a).normalize(),f=a.distanceTo(o),p=a.distanceTo(l),m=new c.Plane;m.setFromCoplanarPoints(a,o,l);let h=f/2,g=p/2;for(let e=0;e<t.length;e++)this.isPointInWallSegmentOptimized(t[e],r,m,a,u,d,f,p,h,g,n)&&(this.results.pointsInSegments.has(i)||this.results.pointsInSegments.set(i,[]),this.results.pointsInSegments.get(i).push(e))}return i.forEach(e=>{let t=`row${e.userData.row}_col${e.userData.col}`,n=this.results.pointsInSegments.has(t)?this.results.pointsInSegments.get(t).length:0;n>=1?this.results.segmentsWithPoints++:(this.results.segmentsWithoutPoints++,this.results.missingSegments.push({row:e.userData.row,col:e.userData.col,width:e.userData.width,height:e.userData.height,segmentKey:t,vertices:e.vertices,center:e.userData.center,mesh:e,pointCount:n,hasPointsButNotEnough:n>0&&n<1}))}),this.results.analysisTime=performance.now()-r,this.printAnalysisResults(),this.results}isPointInWallSegmentOptimized(e,t,n,r,i,a,o,s,l,u,d){if(Math.abs(n.distanceToPoint(e))>d)return!1;let f=new c.Vector3().subVectors(e,t),p=Math.abs(f.dot(i)),m=Math.abs(f.dot(a));if(p>l&&m>u)return!1;let h=new c.Vector3().subVectors(e,r),g=h.dot(i),_=h.dot(a),v=g>=-d&&g<=o+d,y=_>=-d&&_<=s+d;return v&&y}isPointInWallSegment(e,t,n,r=.1){if(!e.geometry)return!1;try{let i=this.getWorldVertices(e);return i.length<4?!1:this.isPointInRotatedWall(i,t,n,r)}catch(e){return console.error(`判断点是否在墙体平面内时出错:`,e),!1}}isPointInRotatedWall(e,t,n,r=.1){let[i,a,o,s]=e,l=new c.Plane;if(l.setFromCoplanarPoints(i,a,s),Math.abs(l.distanceToPoint(t))>r)return!1;let u=new c.Vector3().subVectors(a,i).normalize(),d=new c.Vector3().subVectors(s,i).normalize();new c.Vector3().crossVectors(u,d).normalize();let f=new c.Vector3().subVectors(t,i),p=f.dot(u),m=f.dot(d),h=i.distanceTo(a),g=i.distanceTo(s),_=p>=-r&&p<=h+r,v=m>=-r&&m<=g+r;return _&&v&&n.distanceTo(t)<h/2&&n.distanceTo(t)<g/2}getWorldVertices(e){if(e._cachedWorldVertices&&e.matrixWorld.equals(e._cachedMatrixWorld))return e._cachedWorldVertices;let t=e.geometry.getAttribute(`position`),n=[];for(let r=0;r<Math.min(4,t.count);r++){let i=new c.Vector3;i.fromBufferAttribute(t,r),i.applyMatrix4(e.matrixWorld),n.push(i)}return e._cachedWorldVertices=n,e._cachedMatrixWorld=e.matrixWorld.clone(),n}getWorldVerticesNew(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n].clone();t.push(r)}return t}getWallSegmentBounds(e){if(!e.geometry)return null;let t=e.geometry.getAttribute(`position`),n=new c.Box3;for(let r=0;r<t.count;r++){let i=new c.Vector3;i.fromBufferAttribute(t,r),i.applyMatrix4(e.matrixWorld),n.expandByPoint(i)}return{min:n.min.toArray(),max:n.max.toArray(),center:n.getCenter(new c.Vector3).toArray(),size:n.getSize(new c.Vector3).toArray()}}highlightEmptySegments(e,t,n,r=1){if(!this.results){console.warn(`请先运行分析函数`);return}let i=new Map,a=new Map;this.results.missingSegments.forEach(e=>{i.set(e.segmentKey,e),a.has(e.row)||a.set(e.row,new Map),a.get(e.row).set(e.col,{segmentKey:e.segmentKey,isEmpty:!0,visited:!1})}),e.forEach(e=>{if(e.userData&&e.userData.type===`wallSegment`){let t=`row${e.userData.row}_col${e.userData.col}`,n=i.has(t);a.has(e.userData.row)||a.set(e.userData.row,new Map),a.get(e.userData.row).has(e.userData.col)||a.get(e.userData.row).set(e.userData.col,{segmentKey:t,isEmpty:n,visited:!1})}});let o=[],s=[[0,1],[1,0],[0,-1],[-1,0]];for(let[e,t]of i){let e=a.get(t.row)?.get(t.col);if(e&&!e.visited){let n=[],c=[[t.row,t.col]];for(e.visited=!0;c.length>0;){let[e,t]=c.shift(),r=`row${e}_col${t}`;i.has(r)&&n.push(i.get(r));for(let[n,r]of s){let i=e+n,o=t+r;if(a.has(i)&&a.get(i).has(o)){let e=a.get(i).get(o);!e.visited&&e.isEmpty&&(e.visited=!0,c.push([i,o]))}}}n.length>=r&&o.push(n)}}let c=this.createClusterMaterials(o.length),l=[];return this.clusterResults={clusters:o.sort((e,t)=>t.length-e.length),highlightedMeshes:l,clusterMaterials:c,totalClusters:o.length,totalHighlighted:l.length},this.clusterResults}calculateBoundaryRegularity(e,t,n,r,i){let a=0,o=0,s=t,c=!0;for(let t=r;t<=i;t++)e.has(s)&&e.get(s).has(t)?o++:c=!1;c&&a++;let l=n,u=!0;for(let t=r;t<=i;t++)e.has(l)&&e.get(l).has(t)?o++:u=!1;u&&a++;let d=r,f=!0;for(let r=t;r<=n;r++)e.has(r)&&e.get(r).has(d)?o++:f=!1;f&&a++;let p=i,m=!0;for(let r=t;r<=n;r++)e.has(r)&&e.get(r).has(p)?o++:m=!1;return m&&a++,a/4}calculateClusterQualityScore(e){let t=1/Math.max(1,e.aspectRatio);return e.compactness*.4+e.boundaryRegularity*.4+t*.2}calculateStrictClusterBounds(e){if(e.length===0)return{width:0,height:0};let t=[];if(e.forEach(e=>{e.vertices&&e.vertices.length>0&&t.push(...e.vertices)}),t.length===0){let t=[...new Set(e.map(e=>e.row))];return{width:[...new Set(e.map(e=>e.col))].length*(e[0].bounds?.width||1),height:t.length*(e[0].bounds?.height||1)}}let n=Math.min(...t.map(e=>e.x)),r=Math.max(...t.map(e=>e.x)),i=Math.min(...t.map(e=>e.y)),a=Math.max(...t.map(e=>e.y)),o=Math.min(...t.map(e=>e.z)),s=Math.max(...t.map(e=>e.z));return{width:Math.abs(r-n),height:Math.max(Math.abs(a-i),Math.abs(s-o))}}createClusterMaterials(e){let t=[],n=[16711935,65535,16753920,16738740,9055202,3329330,`lavenderblush`,`lawngreen`,`lemonchiffon`,`lightblue`,`lightcoral`];for(let r=0;r<e;r++){let e=n[r%n.length],i=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.6,side:c.DoubleSide});t.push(i)}return t}clearHighlights(e){this.clusterResults&&this.clusterResults.highlightedMeshes&&(this.clusterResults.highlightedMeshes.forEach(t=>{e.remove(t),t.material&&t.material.dispose()}),this.results&&this.results.segmentDetails&&this.results.segmentDetails.forEach((e,t)=>{e.mesh&&e.mesh.userData.originalMaterial&&(e.mesh.material=e.mesh.userData.originalMaterial)}),this.clusterResults.highlightedMeshes=[])}getClusterInfo(){return this.clusterResults?{totalClusters:this.clusterResults.totalClusters,clusterSizes:this.clusterResults.clusters.map((e,t)=>({clusterIndex:t,size:e.length,segments:e.map(e=>e.segmentKey)})),largestCluster:Math.max(...this.clusterResults.clusters.map(e=>e.length)),smallestCluster:Math.min(...this.clusterResults.clusters.map(e=>e.length))}:null}restoreOriginalMaterials(e){let t=0;e.traverse(e=>{e.userData&&e.userData.originalMaterial&&(e.material=e.userData.originalMaterial,delete e.userData.originalMaterial,t++)}),console.log(`恢复了 ${t} 个平面的原始材质`)}createDebugHelpers(e){let t=new c.Group;return e.traverse(e=>{if(e.userData&&e.userData.type===`wallSegment`){let n=this.getWorldVertices(e);if(n.length<4)return;let r=new c.Vector3().add(n[0]).add(n[1]).add(n[2]).add(n[3]).multiplyScalar(.25),i=new c.Vector3().subVectors(n[1],n[0]).normalize(),a=new c.Vector3().subVectors(n[3],n[0]).normalize(),o=new c.Vector3().crossVectors(i,a).normalize(),s=new c.ArrowHelper(o,r,.3,16711680),l=new c.ArrowHelper(i,r,.2,65280),u=new c.ArrowHelper(a,r,.2,255);t.add(s),t.add(l),t.add(u)}}),t}printAnalysisResults(){if(!this.results){console.warn(`没有可用的分析结果`);return}this.results.missingSegments.length>0&&this.results.missingSegments.forEach(e=>{}),this.results.pointsInSegments.forEach((e,t)=>{})}isValidVector3(e){return e&&!isNaN(e.x)&&!isNaN(e.y)&&!isNaN(e.z)&&isFinite(e.x)&&isFinite(e.y)&&isFinite(e.z)}mergeWallGroupMeshes(e){let t=[];if(e.traverse(e=>{e.isMesh&&e.geometry&&t.push(e)}),t.length===0)return null;try{let e=t.map(e=>e.geometry);e.forEach((e,n)=>{e.applyMatrix4(t[n].matrixWorld)});let n=l(e),r=t[0].material.clone(),i=new c.Mesh(n,r);return i.name=`mergedWalls`,i}catch(e){return console.error(`合并网格时出错:`,e),null}}},z=e=>{let t={},n=[],r=[],i=[];return e[0].width,e[0].height,e.forEach(e=>{r.push(...e.vertices),i.push(e.center),n.push(e.vertices)}),t.originalVertices=n,t.allCenterPoints=i,t},B=e=>{let t=new c.Vector3().copy(e.start).add(e.end).multiplyScalar(.5),n=new c.Vector3().subVectors(new c.Vector3(t.x,t.y,t.z+1),t).normalize(),r=new c.Vector3(e.direction.x,e.direction.y,0);r.applyAxisAngle(n,Math.PI/2);let i=new c.Vector3().copy(t).add(r.clone().multiplyScalar(e.length)),a=new c.Vector3().copy(t).sub(r.clone().multiplyScalar(e.length));return t.z=e.start.z,i.z=e.start.z,a.z=e.start.z,{start:i,end:a,center:t,direction:r}},V=(e,t,n=!0)=>{let r=[];if(!e)return[];for(let i=0;i<e.length;i++){let a=e[i];if(!a)continue;let o=new c.Vector3(a.start.x,a.start.y,a.start.z);o.applyEuler(new c.Euler(-Math.PI/2,0,0));let s=new c.Vector3(a.end.x,a.end.y,a.end.z);if(s.applyEuler(new c.Euler(-Math.PI/2,0,0)),t.add(p(String(i),new c.Vector3((o.x+s.x)/2,(o.y+s.y)/2,(o.z+s.z)/2))),(a.isBayWindow||a.isWindow)&&n)continue;let l=new c.Plane().setFromCoplanarPoints(new c.Vector3(a.start.x,a.start.y,a.start.z),new c.Vector3(a.end.x,a.end.y,a.end.z),new c.Vector3(a.start.x,a.start.y,a.rooftopPz)),u=[];a.originalPoints.forEach((e,t)=>{let n=new c.Vector3;l.projectPoint(e,n),u.push(n)});let d=new c.Vector3(a.start.x,a.start.y,a.start.z).distanceTo(new c.Vector3(a.end.x,a.end.y,a.end.z)),f=Math.abs(a.rooftopPz-a.start.z),m=new c.MeshBasicMaterial({color:`red`,side:c.DoubleSide,wireframe:!1,transparent:!0,opacity:.5}),h=new c.Group,g=new R,{horizontalSubdivisions:_,verticalSubdivisions:v}=g.initLimits4(d,f),y=g.createSubdividedWallPlane(a,v,_,m,h);g.analyzePointDistribution(y,u,.01);let b=new c.MeshBasicMaterial({color:`black`,transparent:!0,opacity:.8,side:c.DoubleSide}),x=g.highlightEmptySegments(y,b,h),S=[];for(let e of x.clusters){let t=z(e);t&&S.push(t)}let C=B(a).direction;a.checkResults=S,a.verticalDirection=C,a.originaIndex=i,r.push(a)}return r},H=()=>`#${Math.floor(Math.random()*75+180).toString(16).padStart(2,`0`)}${Math.floor(Math.random()*75+180).toString(16).padStart(2,`0`)}${Math.floor(Math.random()*75+180).toString(16).padStart(2,`0`)}`,U=async(e,t,n,r)=>{F(r);let i=await fetch(e);if(!i)return;let a=await i.json(),o=new c.Group,s=new c.Group,u=new c.Group,d=new c.Group,f=new c.Group,m=new c.Group,h=new c.Group,g=new c.Group;for(let e=0;e<a.length;e++){let t=a[e];if(!t)continue;let n=new c.Vector3(t.start.x,t.start.y,t.start.z);n.applyEuler(new c.Euler(-Math.PI/2,0,0));let r=new c.Vector3(t.end.x,t.end.y,t.end.z);r.applyEuler(new c.Euler(-Math.PI/2,0,0)),g.add(p(String(e),new c.Vector3((n.x+r.x)/2,(n.y+r.y)/2,(n.z+r.z)/2)))}a.sort((e,t)=>e.originalIndex-t.originalIndex),console.log(`lins`,a);let _=await fetch(t);if(!_)return;let y=await _.json(),b=Array.isArray(y)?y:Object.values(y),x=await fetch(n);if(console.log(`respcd`,x),!x)return;let S=await x.json(),C=0;for(let e=0;e<S.length;e++){let t=S[e];if(t.isFindBeam=!1,t.category==`door`){let e=new c.Vector3(t.center.x,t.center.y,t.center.z);e.applyEuler(new c.Euler(-Math.PI/2,0,0)),g.add(p(`door:${C}`,e)),C++}}r.add(g),console.time();let{beamGroup:w}=await W(a,b,S,r);console.timeEnd(),console.log(`beamGroup`,w);let T=new c.MeshBasicMaterial({color:`#cffd00`,transparent:!0,opacity:.4,side:c.DoubleSide}),E=new c.MeshBasicMaterial({color:`#ff0000`,transparent:!0,opacity:.4,side:c.DoubleSide}),D=new c.MeshBasicMaterial({color:`#e100ff`,transparent:!0,opacity:.4,side:c.DoubleSide}),O=new c.MeshBasicMaterial({color:`#0400ff`,transparent:!0,opacity:.4,side:c.DoubleSide}),k=new c.LineBasicMaterial({color:`#cffd00`}),A=[];for(let e=0;e<a.length;e++){let t=a[e];if(t.checkResults)for(let e of t.checkResults)for(let t of e.originalVertices){let[e,n,r,i]=t,a=new c.BufferGeometry,o=new Float32Array([e.x,e.y,e.z,n.x,n.y,n.z,r.x,r.y,r.z,i.x,i.y,i.z]);a.setAttribute(`position`,new c.BufferAttribute(o,3)),a.setIndex([0,1,2,0,2,3]),a.computeVertexNormals();let s=new c.EdgesGeometry(a,1);A.push(s)}}if(A.length>0){let e=l(A,!1);e.rotateX(-Math.PI/2),o.add(new c.LineSegments(e,k)),o.visible=!1,r.add(o),A.forEach(e=>e.dispose())}new c.PointsMaterial({color:65535,size:.01});for(let e of a){if(!e.originalPoints||e.originalPoints.length===0)continue;let t=new Float32Array(e.originalPoints.length*3);e.originalPoints.forEach((e,n)=>{t[n*3]=e.x,t[n*3+1]=e.y,t[n*3+2]=e.z});let n=new c.BufferGeometry;n.setAttribute(`position`,new c.BufferAttribute(t,3)),n.rotateX(-Math.PI/2),s.add(new c.Points(n,new c.PointsMaterial({color:H(),size:.02})));let r=[];r.push(new c.Vector3(e.start.x,e.start.y,e.start.z)),r.push(new c.Vector3(e.end.x,e.end.y,e.end.z));let i=new c.BufferGeometry;i.setFromPoints(r),i.rotateX(-Math.PI/2),m.add(new c.Line(i,k))}m.visible=!1,r.add(s),r.add(m);let j=[],M=[],N=new c.LineBasicMaterial({color:`#f30606`}),P=new c.MeshBasicMaterial({color:`#071ac4`});for(let e=0;e<b.length;e++){let t=new c.SphereGeometry(.05);t.translate(b[e].x,b[e].y,b[e].z);let n=[],r=new c.Vector3(b[e].x,b[e].y,b[e].z),i=new c.Quaternion(b[e].qx,b[e].qy,b[e].qz,b[e].qw),a=new c.Vector3(0,0,-1).applyQuaternion(i),o=r.clone().addScaledVector(a,.001);n.push(r),n.push(o);let s=new c.BufferGeometry;s.setFromPoints(n),M.push(s),j.push(t)}if(j.length>0){let e=l(j,!1);e.rotateX(-Math.PI/2),u.add(new c.Mesh(e,P)),j.forEach(e=>e.dispose())}if(M.length>0){let e=l(M,!1);e.rotateX(-Math.PI/2),u.add(new c.Line(e,N)),M.forEach(e=>e.dispose())}r.add(u);let{AiProjectionGroup:I,AiProjectionGroup2:L}=v(S);return d.add(I),d.rotateX(-Math.PI/2),r.add(d),f.add(L),f.visible=!1,f.rotateX(-Math.PI/2),r.add(f),console.log(`jsonpcdData`,S),a.forEach(e=>{e.doorAndBeamData&&e.doorAndBeamData.length>0&&(e.doorAndBeamData.forEach(e=>{if(e.beamStart){let t=new c.BufferGeometry,n=new Float32Array([e.beamStart.x,e.beamStart.y,e.beamStart.z,e.beamEnd.x,e.beamEnd.y,e.beamEnd.z,e.beamEnd.x,e.beamEnd.y,e.beamEnd.z+e.beamHeight,e.beamStart.x,e.beamStart.y,e.beamStart.z+e.beamHeight]);t.setAttribute(`position`,new c.BufferAttribute(n,3)),t.setIndex([0,1,2,0,2,3]),t.computeVertexNormals(),t.rotateX(-Math.PI/2),h.add(new c.Mesh(t,T))}let t=new c.BufferGeometry,n=new Float32Array([e.doorStart.x,e.doorStart.y,e.doorStart.z,e.doorEnd.x,e.doorEnd.y,e.doorEnd.z,e.doorEnd.x,e.doorEnd.y,e.doorEnd.z+e.doorHeight,e.doorStart.x,e.doorStart.y,e.doorStart.z+e.doorHeight]);t.setAttribute(`position`,new c.BufferAttribute(n,3)),t.setIndex([0,1,2,0,2,3]),t.computeVertexNormals(),t.rotateX(-Math.PI/2),e.isDoor?h.add(new c.Mesh(t,O)):e.type==`beam`?h.add(new c.Mesh(t,D)):h.add(new c.Mesh(t,E));let r=`id:${e.id},Nid:${e.nearId}`,i=new c.Vector3((e.doorStart.x+e.doorEnd.x)/2,(e.doorStart.y+e.doorEnd.y)/2,e.doorStart.z+e.doorHeight);i.applyEuler(new c.Euler(-Math.PI/2,0,0)),h.add(p(r,i))}),r.add(h))}),{checkResultGroup:o,pointCloudGroup:s,runData:u,pcdGroup:d,pcdGroup2:f,pointLineGroup:m,beamDoorGroup:h,lineIndexGroup:g}},W=async(e,t,n,r)=>{if(A(e,r),e.length<=0||t.length<=0)return e;n||=[];for(let t of e){let e=[];if(!(!t.checkResults||t.checkResults.length<=0)){for(let n=0;n<t.checkResults.length;n++){let r=t.checkResults[n];if(r.isDoor=!1,!r.originalVertices||r.originalVertices.length==0)continue;let i=[];r.originalVertices.forEach(e=>{let t=[];e.forEach(e=>{t.push(new c.Vector3(e.x,e.y,e.z))}),i.push(t)});let a=i.length,o=Array.from({length:a},(e,t)=>t);function s(e){for(;o[e]!==e;)o[e]=o[o[e]],e=o[e];return e}for(let e=0;e<a;e++)for(let t=e+1;t<a;t++){let n=i[e],r=i[t];if(n.some(e=>r.some(t=>e.equals(t)))){let n=s(e),r=s(t);n!==r&&(o[n]=r)}}let l=new Map,u=-1,d=-1;for(let e=0;e<a;e++){let t=s(e);l.has(t)||l.set(t,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let r=l.get(t),[a,o,f,p]=i[e],m=new c.Vector3().add(a).add(o).add(f).add(p).multiplyScalar(.25);if(r.points.push(...i[e]),r.area+=a.distanceTo(o)*a.distanceTo(p),r.originalVertices.push(i[e]),r.index=n,r.centerPts.push(m),u==-1||d==-1){let e=new c.Vector3().subVectors(a,o).normalize();d=a.distanceTo(p),u=a.distanceTo(o);let t=h(e,new c.Vector3(0,0,1));t&&t.parallel&&([d,u]=[u,d])}r.gridWidth=u,r.gridHeight=d}e.push(...l.values())}t.mergeCheckRegion=e}}let i=new Map;for(let t of e){let e=t.rooftopPz-t.start.z,n=Math.floor(t.rooftopPz-t.start.z);i.has(n)?i.set(n,{num:i.get(n).num+1,totalHeight:i.get(n).totalHeight+e}):i.set(n,{num:1,totalHeight:e})}let a=[...i.entries()].reduce((e,t)=>t[1].num>e[1].num?t:e),o=a[0];a[1].totalHeight/a[1].num;let s=[];for(let e=0;e<n.length;e++){let t=n[e];if(t.isFindBeam=!1,t.category==`door`){let n=[];t.coordinatesByArea.coordinates.forEach(e=>{n.push(new c.Vector3(e.x,e.y,e.z))}),n[0].equals(n[n.length-1])&&n.pop();let r=n[0].distanceTo(n[1]),i=n[0].distanceTo(n[3]);i>r&&([r,i]=[i,r],n=[n[0],n[3],n[2],n[1]]);let a=S(n[0],n[3],!0),o=S(n[1],n[2],!0);s.push({doorStartPt:a,doorEndPt:o,boxPoints:n,minZ:t.coordinatesByArea.heightData.minZ,maxZ:t.coordinatesByArea.heightData.maxZ,index:e,isFind:!1,inWall:!1})}}for(let t=0;t<s.length;t++){let n=s[t];for(let t=0;t<e.length;t++){if(e[t].length<.5)continue;let r=[],i=S(e[t].start,e[t].end,!0);r.push(i),r.push(S(i,e[t].start,!0)),r.push(S(i,e[t].end,!0));let a=!1,o=n.boxPoints.length;for(let e=0;e<r.length;e++){let t=r[e].x,i=r[e].y;for(let e=0,r=o-1;e<o;r=e++){let o=n.boxPoints[e].x,s=n.boxPoints[e].y,c=n.boxPoints[r].x,l=n.boxPoints[r].y;s>i!=l>i&&t<(c-o)*(i-s)/(l-s)+o&&(a=!a)}if(a)break}if(a){let r=new c.Vector3(e[t].start.x,e[t].start.y,0),i=new c.Vector3(e[t].end.x,e[t].end.y,0),a=n.doorStartPt.distanceTo(n.doorEndPt),o=r.distanceTo(i),s=b(n.doorStartPt,n.doorEndPt,r,i);if(Math.abs(o-a)<.5&&s&&s.isParallel){n.doorStartPt=new c.Vector3(e[t].start.x,e[t].start.y,0),n.doorEndPt=new c.Vector3(e[t].end.x,e[t].end.y,0);break}else if(Math.abs(o-a)>1.3&&s&&s.isParallel){let e=C(n.doorStartPt,n.doorEndPt,r,i),t=n.doorStartPt.distanceTo(r),a=n.doorStartPt.distanceTo(i),o=n.doorEndPt.distanceTo(r),s=n.doorEndPt.distanceTo(i),c=t<.2||a<.2||o<.2||s<.2;if(e&&e.type==`collinear_overlap`&&e.maxPerpendicularDistance<.1&&!c){n.inWall=!0;break}}}else continue}}let l=0,u=[],d=[],p=[],m=[],g=.2;for(let r=0;r<e.length;r++){let i=e[r];if(!i.mergeCheckRegion||i.mergeCheckRegion.length==0)continue;i.doorAndBeamData=[],i.completePointAreaPercentage=-1;let a=new c.Box3;a.setFromPoints(i.originalPoints);let _=a.max.z,v=a.min.z,w=new c.Vector3(i.start.x,i.start.y,i.start.z),T=new c.Vector3(i.end.x,i.end.y,i.end.z),E=i.rooftopPz-i.start.z;if(E<o-.5||E>o+2)continue;let D=0;for(let a of i.mergeCheckRegion){let{facePoints:o,boxArea:O,totalInPlaneNum:A}=y(a.points,a.gridWidth,a.gridHeight,a.centerPts);if(!o||o.length<=0)continue;o[0].distanceTo(o[1]);let P=o[0].distanceTo(o[3]),F=a.gridHeight*(P/a.gridHeight/3*2)+a.gridHeight/2,I=new c.Vector3(o[0].x,o[0].y,o[0].z+F),L=new c.Vector3(o[1].x,o[1].y,o[1].z+F),R=new c.Line3(I,L),z=[],B=new c.Vector3;a.points.forEach(e=>{R.closestPointToPoint(e,!0,B).distanceTo(e)<a.gridHeight+.01&&z.push(e)});let V=[],H=[];for(;;){let e=[];for(let t=0;t<z.length;t++)H.includes(t)||e.length==0&&(e.push(z[t]),H.push(t));for(let t=0;t<z.length;t++)if(!H.includes(t)){for(let n=0;n<e.length;n++)if(z[t].distanceTo(e[n])<a.gridWidth+.01){e.push(z[t]),H.push(t),t=-1;break}}if(e.length==0)break;V.push(e)}let U=[];for(let e=0;e<V.length;e++){let t={lineSt:new c.Vector3,lineEd:new c.Vector3,facePoints:[]},n=N(V[e]);Array.isArray(n)&&n.length==2&&(t.lineSt=n[0],t.lineEd=n[1],t.facePoints.push(new c.Vector3(n[0].x,n[0].y,o[0].z)),t.facePoints.push(new c.Vector3(n[1].x,n[1].y,o[0].z)),t.facePoints.push(new c.Vector3(n[1].x,n[1].y,o[2].z)),t.facePoints.push(new c.Vector3(n[0].x,n[0].y,o[2].z)),U.push(t))}D+=a.area;let W=0;if(A!=0&&(W=a.gridHeight*a.gridWidth*A),(a.area-W)/O*100>70&&U.length==1||U.length>1)for(let o=0;o<U.length;o++){let y=U[o],D=y.facePoints[0].distanceTo(y.facePoints[1]),O=y.facePoints[0].distanceTo(y.facePoints[3]),A=D/i.length*100,P=i.rooftopPz-y.facePoints[2].z;if(O<1.5||_<y.facePoints[2].z||P>E/3*2)continue;let F=!1,I=!1,L=!1,R=[],z=y.facePoints[2].clone(),B=y.facePoints[3].clone(),V=y.facePoints[0].clone(),H=y.facePoints[1].clone(),W=!1,G=-1;if(Math.abs(y.facePoints[0].z-i.start.z)<.25){if(D>.17&&i.length>.5){let t=j(w,V),n=j(w,H),a=j(T,V),o=j(T,H),s=.1;if(t<s||n<s){let{newOriginalPoints:n}=k(V,H,i.originalPoints),a=[],o=[];if(n.forEach(e=>{e.z>=z.z?a.push(e):e.z<=V.z&&o.push(e)}),a.length>10){let n=new c.Vector3(i.start.x,i.start.y,0),a=new c.Vector3(i.end.x,i.end.y,0),o=new c.Vector3().subVectors(n,a).normalize(),l=new c.Vector3,u=1/0,d=-1,p=!1;for(let t=0;t<e.length;t++){if(t==r)continue;let i=new c.Vector3(e[t].start.x,e[t].start.y,0),s=new c.Vector3(e[t].end.x,e[t].end.y,0),m=f(n,a,i,s),h=x(n,a,i,s);if(m!=null){if(h&&h.angle>85){let e=m.point.distanceTo(n);if(m.point.distanceTo(a),e<.1){u=1/0,d=-1;break}}continue}if(h&&h.angle>65){let e=b(n,a,new c.Line3(i,s).closestPointToPoint(n,!0,l),n);if(!e||e.direction!=`same`)continue;let r=n.clone().addScaledVector(o,10),p=a.clone().addScaledVector(o.clone().negate(),10),m=new c.Vector3().subVectors(s,i).normalize(),h=f(r,p,i.clone().addScaledVector(m.clone().negate(),.03),s.clone().addScaledVector(m,.03));if(h==null)continue;let g=n.distanceTo(h.point);g<u&&(u=g,d=t)}else if(h&&h.angle<5){let e=new c.Vector3(V.x,V.y,0),t=new c.Vector3(H.x,H.y,0),n=j(e,i),r=j(e,s),a=j(t,i),o=j(t,s);if(n<.08||r<.08||a<.08||o<.08){p=!0,u=1/0,d=-1;break}}}if(u!=1/0&&u<2)e[d].length>.25&&D+u>.5&&(W=!0,t<s?(B=B.addScaledVector(o,u),V=V.addScaledVector(o,u)):(z=z.addScaledVector(o,u),H=H.addScaledVector(o,u)));else if(!p){let n=.05,i=w.clone().addScaledVector(o,n),a=w.clone().addScaledVector(o.clone().negate(),n);i.z=a.z=0;let l=!1;for(let d=0;d<e.length;d++){if(d==r)continue;let p=new c.Vector3(e[d].start.x,e[d].start.y,0),m=new c.Vector3(e[d].end.x,e[d].end.y,0),h=new c.Vector3().subVectors(m,p).normalize();p=p.clone().addScaledVector(h.clone().negate(),n),m=m.clone().addScaledVector(h,n);let g=f(i,a,p,m);if(g){g.point.z=w.z;let e=g.point.distanceTo(w);if(g.point.distanceTo(T)<e)continue;u>e&&(u=e),l=!0}if(l)break;u!=1/0&&u<2&&(t<s?(B=B.addScaledVector(o.clone().negate(),u),V=V.addScaledVector(o.clone().negate(),u)):(z=z.addScaledVector(o.clone().negate(),u),H=H.addScaledVector(o.clone().negate(),u)))}if(!l)continue}}else continue}else if(a<s||o<s){let{newOriginalPoints:t}=k(V,H,i.originalPoints),n=[],o=[];if(t.forEach(e=>{e.z>=z.z?n.push(e):e.z<=V.z&&o.push(e)}),n.length>10){let t=new c.Vector3(i.start.x,i.start.y,0),n=new c.Vector3(i.end.x,i.end.y,0),o=new c.Vector3().subVectors(n,t).normalize(),l=new c.Vector3,u=1/0,d=-1,p=!1;for(let i=0;i<e.length;i++){if(i==r)continue;let a=new c.Vector3(e[i].start.x,e[i].start.y,0),s=new c.Vector3(e[i].end.x,e[i].end.y,0),m=f(t,n,a,s),h=x(t,n,a,s);if(m!=null){if(h&&h.angle>85&&(m.point.distanceTo(t),m.point.distanceTo(n)<.1)){u=1/0,d=-1;break}continue}if(h&&h.angle>65){let e=b(n,t,new c.Line3(a,s).closestPointToPoint(n,!0,l),n);if(!e||e.direction!=`same`)continue;let r=t.clone().addScaledVector(o.clone().negate(),10),p=n.clone().addScaledVector(o,10),m=new c.Vector3().subVectors(s,a).normalize(),h=f(r,p,a.clone().addScaledVector(m.clone().negate(),.03),s.clone().addScaledVector(m,.03));if(h==null)continue;let g=n.distanceTo(h.point);g<u&&(u=g,d=i)}else if(h&&h.angle<5){let e=new c.Vector3(V.x,V.y,0),t=new c.Vector3(H.x,H.y,0),n=j(e,a),r=j(e,s),i=j(t,a),o=j(t,s);if(n<.08||r<.08||i<.08||o<.08){p=!0,u=1/0,d=-1;break}}}if(u!=1/0&&u<2)e[d].length>.25&&D+u>.5&&(W=!0,a<s?(B=B.addScaledVector(o,u),V=V.addScaledVector(o,u)):(z=z.addScaledVector(o,u),H=H.addScaledVector(o,u)));else if(!p){let t=.05,n=T.clone().addScaledVector(o,t),i=w.clone();n.z=i.z=0;let l=!1;for(let a=0;a<e.length;a++){if(a==r)continue;let o=new c.Vector3(e[a].start.x,e[a].start.y,0),s=new c.Vector3(e[a].end.x,e[a].end.y,0),d=new c.Vector3().subVectors(s,o).normalize();o=o.clone().addScaledVector(d.clone().negate(),t),s=s.clone().addScaledVector(d,t);let p=f(n,i,o,s);if(p){p.point.z=T.z;let e=p.point.distanceTo(T);if(p.point.distanceTo(w)<e)continue;u>e&&(u=e),l=!0}}if(!l)continue;u!=1/0&&u<2&&(a<s?(B=B.addScaledVector(o.clone().negate(),u),V=V.addScaledVector(o.clone().negate(),u)):(z=z.addScaledVector(o.clone().negate(),u),H=H.addScaledVector(o.clone().negate(),u)))}}else continue}D=B.distanceTo(z)}if(A<85&&D>.35||D>.7&&O>E-E/3){let e=!1;for(let n=0;n<t.length;n++){let r=n+1;if(r>=t.length)continue;let i=new c.Vector3(t[n].x,t[n].y,t[n].z),a=new c.Vector3(t[r].x,t[r].y,t[r].z);if(f(new c.Vector3(i.x,i.y,0),new c.Vector3(a.x,a.y,0),new c.Vector3(y.facePoints[0].x,y.facePoints[0].y,0),new c.Vector3(y.facePoints[1].x,y.facePoints[1].y,0),.1)!=null){e=!0;break}}for(let e=0;e<s.length;e++){let t=new c.Vector3(s[e].doorStartPt.x,s[e].doorStartPt.y,0),r=new c.Vector3(s[e].doorEndPt.x,s[e].doorEndPt.y,0),a=new c.Vector3(y.facePoints[0].x,y.facePoints[0].y,0),o=new c.Vector3(y.facePoints[1].x,y.facePoints[1].y,0),l=y.facePoints[2].z<s[e].maxZ||Math.abs(y.facePoints[2].z-s[e].maxZ)<.3;if(Math.abs(y.facePoints[2].z-s[e].maxZ),l){let l=C(t.clone(),r.clone(),a.clone(),o.clone(),{distanceThreshold:2});if(l&&l.type==`collinear_gap`){let u=S(t,r),d=new c.Line3(new c.Vector3(i.start.x,i.start.y,0),new c.Vector3(i.end.x,i.end.y,0)),f=new c.Vector3,p=d.closestPointToPoint(u,!0,f);if(u.distanceTo(p)<.15){let i=a.distanceTo(t),u=o.distanceTo(t);if(i>.25&&u>.25){let e=a.distanceTo(r),t=o.distanceTo(r);if(e>.2&&t>.2)continue}I=!0,L=!0,R.push(s[e].index),s[e].isFind=!0,G=e,n[s[e].index].isFindBeam=!0;let d=new c.Vector3().subVectors(a,o).normalize(),f=t.distanceTo(r)-l.overlap;u<i&&d.negate(),i>u?(z=y.facePoints[2].clone().addScaledVector(d,f),B=y.facePoints[3].clone(),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z):(z=y.facePoints[2].clone(),B=y.facePoints[3].clone().addScaledVector(d,f),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z)}}else if(l&&l.type==`collinear_overlap`&&l.maxPerpendicularDistance<.35){let i=a.distanceTo(o),u=r.distanceTo(t);if(Math.abs(i-l.overlap)<.25||Math.abs(u-l.overlap)<.25){if(u>i&&Math.abs(u-l.overlap)>1){let e=a.distanceTo(t),n=a.distanceTo(r),i=o.distanceTo(t),s=o.distanceTo(r),d=e<n?e:n,f=i<s?i:s,p=new c.Vector3().subVectors(a,o).normalize(),m=u-l.overlap;d<f?(p.negate(),z=y.facePoints[2].clone().addScaledVector(p,m),B=y.facePoints[3].clone(),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z):(z=y.facePoints[2].clone(),B=y.facePoints[3].clone().addScaledVector(p,m),V=B.clone(),H=z.clone(),V.z=H.z=y.facePoints[0].z)}I=!0,L=!0,R.push(s[e].index),s[e].isFind=!0,n[s[e].index].isFindBeam=!0,G=e}}}}if(!L)for(let e=0;e<s.length;e++){if(s[e].inWall)continue;let t=new c.Vector3(s[e].doorStartPt.x,s[e].doorStartPt.y,0),r=new c.Vector3(s[e].doorEndPt.x,s[e].doorEndPt.y,0),i=new c.Vector3(y.facePoints[0].x,y.facePoints[0].y,0),a=new c.Vector3(y.facePoints[1].x,y.facePoints[1].y,0),o=new c.Vector3().subVectors(t,r).normalize(),l=new c.Vector3().subVectors(i,a).normalize(),u=.2,d=f(t.clone().addScaledVector(o,u),r.clone().addScaledVector(o.clone().negate(),u),i.clone().addScaledVector(l,u),a.clone().addScaledVector(l.clone().negate(),u)),p=y.facePoints[2].z<s[e].maxZ||Math.abs(y.facePoints[2].z-s[e].maxZ)<.3,m=t.distanceTo(i),h=t.distanceTo(a),_=r.distanceTo(i),v=r.distanceTo(a);(m<g||h<g||_<g||v<g||d)&&p&&(n[s[e].index].isFindBeam=!0,I=!0,s[e].isFind=!0,G=e)}(I||e||Math.abs(O-E)>.1&&O>E/2&&D>.4&&Math.abs(v-i.start.z)<.4)&&(F=!0)}}if(F){let t=!1;for(let e=0;e<p.length;e++){let n=C(p[e].start,p[e].end,V,H);if(n&&n.type==`collinear_overlap`&&n.maxPerpendicularDistance<.01){t=!0;break}}if(t){G!=-1&&(n[s[G].index].isFindBeam=!1,s[G].isFind=!1);continue}p.push({start:V,end:H});{let e=new c.Vector3().subVectors(V,H),t=new c.Vector3().subVectors(H,V),n=1/0,r=1/0,a=V.clone(),o=H.clone(),s=[];if(i.originalPoints.forEach(e=>{e.z-V.z<O/2+.1&&e.z-V.z>O/2-.1&&s.push(e)}),s.length>0){let{newProjectPoints:i}=k(V,H,s);for(let e of i)e.z=V.z;i.forEach(i=>{let s=new c.Vector3(i.x,i.y,V.z),l=new c.Vector3().subVectors(s,H),u=h(e,new c.Vector3().subVectors(s,V)),d=h(t,l);if(u&&u.parallel&&u.sameDirection){let e=s.distanceTo(V);e<n&&(n=e,a=s)}else if(d&&d.parallel&&d.sameDirection){let e=s.distanceTo(H);e<r&&(r=e,o=s)}})}a.equals(V)||(V=a,B=new c.Vector3(V.x,V.y,B.z)),o.equals(H)||(H=o,z=new c.Vector3(H.x,H.y,z.z))}let o=H.distanceTo(V);if(o<.4&&!I||o<.3&&I)continue;d.includes(r)||d.push(r),i.checkResults[a.index].isDoor=!0;let g=``,_={id:l,beamStart:z,beamEnd:B,beamHeight:i.rooftopPz-y.facePoints[2].z,doorStart:V,doorEnd:H,doorHeight:O,nearId:-1,type:g,isExtend:W,isDoor:I,isPullOutDoor:L,pcbDoorIndexs:R},v=!1,x=new c.Vector3,w=new c.Vector3,T=-1;for(let t=0;t<u.length;t++){let n=e[u[t].linesIndex].doorAndBeamData[u[t].doorIndex];if(n.nearId!=-1)continue;let r=b(z.clone(),B.clone(),n.beamStart.clone(),n.beamEnd.clone());if(r&&r.isParallel){let e=z.distanceTo(B),t=n.beamStart.distanceTo(n.beamEnd),r=new c.Line3(z.clone(),B.clone());r.start.z=0,r.end.z=0;let i=S(n.beamStart,n.beamEnd,!0);t>e&&(r.start=new c.Vector3(n.beamStart.x,n.beamStart.y,0),r.end=new c.Vector3(n.beamEnd.x,n.beamEnd.y,0),i=S(z,B,!0));let a=new c.Vector3,o=r.closestPointToPoint(i,!0,a),s=o.distanceTo(i),u=new c.Vector3().subVectors(i,o).normalize(),d=u.clone().negate(),p=i.clone().addScaledVector(d,s+.1),m=f(r.start,r.end,i,p),h=!I&&!n.isDoor&&(e>t*2||t>e*2);if(s<.4&&m!=null&&!h){n.nearId=l,_.nearId=n.id;let r=.8;(n.isDoor||_.isDoor)&&(n.isDoor=!0,_.isDoor=!0);let i=R.some(e=>n.pcbDoorIndexs.includes(e));e<t?e>r&&!n.isPullOutDoor?(n.beamStart=z.clone().addScaledVector(d,s),n.beamEnd=B.clone().addScaledVector(d,s),n.doorStart=V.clone().addScaledVector(d,s),n.doorEnd=H.clone().addScaledVector(d,s),n.doorHeight=_.doorHeight,n.beamStart.z=n.beamEnd.z=n.doorStart.z+n.doorHeight):!L||L&&n.isPullOutDoor&&i?(_.beamStart=n.beamStart.clone().addScaledVector(u,s),_.beamEnd=n.beamEnd.clone().addScaledVector(u,s),_.doorStart=n.doorStart.clone().addScaledVector(u,s),_.doorEnd=n.doorEnd.clone().addScaledVector(u,s),_.doorHeight=n.doorHeight,_.beamStart.z=_.beamEnd.z=_.doorStart.z+_.doorHeight):(n.beamStart=z.clone().addScaledVector(d,s),n.beamEnd=B.clone().addScaledVector(d,s),n.doorStart=V.clone().addScaledVector(d,s),n.doorEnd=H.clone().addScaledVector(d,s),n.doorHeight=_.doorHeight,n.beamStart.z=n.beamEnd.z=n.doorStart.z+n.doorHeight):e>t&&(t>r&&!L?(_.beamStart=n.beamStart.clone().addScaledVector(d,s),_.beamEnd=n.beamEnd.clone().addScaledVector(d,s),_.doorStart=n.doorStart.clone().addScaledVector(d,s),_.doorEnd=n.doorEnd.clone().addScaledVector(d,s),_.doorHeight=n.doorHeight,_.beamStart.z=_.beamEnd.z=_.doorStart.z+_.doorHeight):!n.isPullOutDoor||L&&n.isPullOutDoor&&i?(n.beamStart=z.clone().addScaledVector(u,s),n.beamEnd=B.clone().addScaledVector(u,s),n.doorStart=V.clone().addScaledVector(u,s),n.doorEnd=H.clone().addScaledVector(u,s),n.doorHeight=_.doorHeight,n.beamStart.z=n.beamEnd.z=n.doorStart.z+n.doorHeight):(_.beamStart=n.beamStart.clone().addScaledVector(d,s),_.beamEnd=n.beamEnd.clone().addScaledVector(d,s),_.doorStart=n.doorStart.clone().addScaledVector(d,s),_.doorEnd=n.doorEnd.clone().addScaledVector(d,s),_.doorHeight=n.doorHeight,_.beamStart.z=_.beamEnd.z=_.doorStart.z+_.doorHeight)),T=_.nearId,x=n.beamStart.clone(),w=n.beamEnd.clone(),v=!0;break}}}let E=!1;if(!v){let i=new c.Line3(V.clone(),H.clone());for(let a=0;a<e.length;a++){if(e[a].length<.5||a==r||!e[a].checkResults)continue;let o=C(new c.Vector3(e[a].start.x,e[a].start.y,e[a].start.z),new c.Vector3(e[a].end.x,e[a].end.y,e[a].end.z),V,H);if(o&&o.maxPerpendicularDistance<.3){for(let r=0;r<e[a].checkResults.length;r++){let r=[];e[a].originalPoints.forEach(e=>{e.z>V.z&&e.z<V.z+O/2&&r.push(new c.Vector3(e.x,e.y,V.z))});let o=new c.Vector3,l=[],u=[];for(let e=0;e<r.length;e++){let t=i.closestPointToPoint(r[e],!0,o);t.distanceTo(r[e])<.15&&(l.push(r[e]),u.push(t.clone()))}for(let e=0;e<u.length;e++)M(i,u[e])&&l.push(u[e]);if(l=u,l.length<500)continue;let d=N(l);if(d.length==2){let e=d[0].distanceTo(d[1]);if(Math.abs(e-i.distance())<.3){t=!0,G!=-1&&(n[s[G].index].isFindBeam=!1,s[G].isFind=!1);break}}}if(t)break}else o&&o.type==`collinear_overlap`&&o.maxPerpendicularDistance>.3&&o.maxPerpendicularDistance<.7&&(E=!0)}if(t)continue}let A=!1;if(T!=-1)for(let e=0;e<m.length&&!(m[e].length==1&&(m[e][0].id==l?(m[e].push({id:T,beamStart:x,beamEnd:w}),A=!0):m[e][0].id==T&&(m[e].push({id:l,beamStart:z,beamEnd:B}),A=!0),A));e++);A||m.push([{id:l,beamStart:z,beamEnd:B}]);let j=_.doorStart.distanceTo(_.doorEnd);if(g=I?`door`:j>1.8||E&&j>1?`beam`:`hole`,_.type=g,_.nearId!=-1&&g==`hole`){let t=!1;for(let n=0;n<e.length;n++)if(e[n].doorAndBeamData){for(let r=0;r<e[n].doorAndBeamData.length;r++)if(e[n].doorAndBeamData[r].nearId==l&&e[n].doorAndBeamData[r].type==`beam`){e[n].doorAndBeamData[r].type=g,t=!0;break}if(t)break}}if(i.doorAndBeamData.push(_),u.push({linesIndex:r,doorIndex:i.doorAndBeamData.length-1}),l++,L&&D<2)break}}}let O=i.length*(i.rooftopPz-i.start.z);i.completePointAreaPercentage=D/O*100}if(d.length>1)for(let t=0;t<d.length;t++){let n=[];for(let r=0;r<e[d[t]].doorAndBeamData.length;r++){let i=e[d[t]].doorAndBeamData[r].doorStart.clone(),a=e[d[t]].doorAndBeamData[r].doorEnd.clone();i.z=a.z=0;let o=i.distanceTo(a),s=!1;for(let n=0;n<d.length;n++)if(t!=n)for(let t=0;t<e[d[n]].doorAndBeamData.length;t++){let r=e[d[n]].doorAndBeamData[t].doorStart.clone(),l=e[d[n]].doorAndBeamData[t].doorEnd.clone();r.z=l.z=0,r.distanceTo(l);let u=C(i,a,r,l);if(u.type==`collinear_overlap`&&u.maxPerpendicularDistance<.2){let e=new c.Line3(r,l),t=S(i,a),n=e.closestPointToPoint(t,!0,new c.Vector3),d=t.distanceTo(n);if(Math.abs(o-u.overlap)<.1&&d<.04){s=!0;break}}}s||n.push(e[d[t]].doorAndBeamData[r])}n.length!=e[d[t]].doorAndBeamData.length&&(e[d[t]].doorAndBeamData=n)}let _=.65,v=[],w=[];for(let t=0;t<s.length;t++){if(s[t].isFind)continue;let r=new c.Vector3(s[t].doorStartPt.x,s[t].doorStartPt.y,0),i=new c.Vector3(s[t].doorEndPt.x,s[t].doorEndPt.y,0),a=new c.Vector3().subVectors(r,i).normalize();for(let o=0;o<e.length;o++){if(e[o].length<.7||e[o].completePointAreaPercentage>60)continue;let u=new c.Vector3(e[o].start.x,e[o].start.y,0),d=new c.Vector3(e[o].end.x,e[o].end.y,0),p=new c.Vector3().subVectors(u,d).normalize(),h=.3,y=r.clone().addScaledVector(a,h),S=i.clone().addScaledVector(a.clone().negate(),h),T=u.clone().addScaledVector(p,h),E=d.clone().addScaledVector(p.clone().negate(),h);f(y,S,T,E);let D=b(y,S,T,E),O=r.distanceTo(u)>i.distanceTo(u)?i:r,k=O.distanceTo(u),A=O.distanceTo(d);if((k<g||A<g)&&D&&!D.isParallel){let a=r.distanceTo(u)<r.distanceTo(d)?u:d,p=!1;for(let h=0;h<e.length;h++){if(h==o||v.includes(h)||e[h].length<.7)continue;let y=new c.Vector3(e[h].start.x,e[h].start.y,0),S=new c.Vector3(e[h].end.x,e[h].end.y,0),T=new c.Vector3().subVectors(y,S).normalize(),E=T.clone().negate(),D=y.clone().addScaledVector(T,5),O=S.clone().addScaledVector(E,5),k=x(u,d,y,S),A=C(u,d,y,S),j=f(u,d,D,O),M=!0;if(j!=null&&(M=j.point.distanceTo(u)<g||j.point.distanceTo(d)<g),(k&&k.angle>85||A&&A.type==`collinear_gap`)&&M){let f=new c.Line3(u,d),g=new c.Vector3,x=f.closestPointToPoint(y,!0,g),T=f.closestPointToPoint(S,!0,g),E=x.distanceTo(y),D=T.distanceTo(S),O,k;if(E>D&&D>_)O=S,k=T;else if(E<D&&E>_)O=y,k=x;else continue;if(E=a.distanceTo(y),D=a.distanceTo(S),E>2&&D>2)continue;let A=b(O,k,y,S);if(!A||!A.isParallel)continue;let j=C(r,i,O,k);if(j&&j.type==`collinear_overlap`&&j.maxPerpendicularDistance<.2)continue;O.z=k.z=e[h].start.z;let M=!1;for(let e=0;e<w.length;e++){let t=C(w[e].start,w[e].end,O,k);if(t&&t.type==`collinear_overlap`&&t.maxPerpendicularDistance<.2){M=!0;break}}if(M)continue;for(let t=0;t<e.length;t++){if(e[t].length<.5)continue;let n=C(new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),O,k);if(n&&n.type==`collinear_overlap`&&n.maxPerpendicularDistance<.1){M=!0;break}}if(M)continue;w.push({start:O,end:k}),v.push(h);let N=e[h].rooftopPz-e[h].start.z,P=e[o].rooftopPz-e[o].start.z,F=N<P?N:P;e[h].doorAndBeamData||(e[h].doorAndBeamData=[]),e[h].doorAndBeamData.push({id:l,beamStart:O,beamEnd:k,beamHeight:F,doorStart:O,doorEnd:k,doorHeight:F,nearId:-1,type:`onlyDoor`,isDoor:!0}),n[s[t].index].isFindBeam=!0,n[s[t].index].isFindOnlyDoor=!0,m.push([{id:l,beamStart:O,beamEnd:k}]),l++,p=!0;break}}if(p)break}}}let T=0;for(let t=0;t<e.length;t++){let n=e[t];n.mainBeamDataIds||=[],n.isMainBeam||=!1;let{minZ:r,maxZ:i}=O(n);if(r==null||i==null)continue;i-r;let a=n.rooftopPz-n.start.z;if(a<o-.5||a>o+2||Math.abs(r-n.start.z)>.3||n.length<1)continue;let s=new c.Vector3(n.start.x,n.start.y,0),l=new c.Vector3(n.end.x,n.end.y,0);for(let r=0;r<e.length;r++){if(r==t||e[r].length<1)continue;let a=e[r],o=new c.Vector3(a.start.x,a.start.y,0),u=new c.Vector3(a.end.x,a.end.y,0),d=b(s,l,o,u),f=S(s,l),p=new c.Line3(o,u).closestPointToPoint(f,!0,new c.Vector3),m=f.distanceTo(p),h=O(a);if(!(h.minZ===void 0||h.maxZ===void 0)&&!(h.maxZ-h.minZ>1)&&d&&d.isParallel&&m<.25&&Math.abs(i-h.minZ)<.1){let e=`mainBeamId${T}`;a.mainBeamDataIds||=[],a.isMainBeam||=!0,a.mainBeamDataIds.push(e),n.mainBeamDataIds.push(e),T++;break}}}return{lines:e,beamGroup:m}},G=(e,t)=>{if(e.length<=0)return e;for(let t of e){let e=[];for(let n=0;n<t.checkResults.length;n++){let r=t.checkResults[n];if(r.isDoor=!1,!r.originalVertices||r.originalVertices.length==0)continue;let i=[];r.originalVertices.forEach(e=>{let t=[];e.forEach(e=>{t.push(new c.Vector3(e.x,e.y,e.z))}),i.push(t)});let a=i.length,o=Array.from({length:a},(e,t)=>t);function s(e){for(;o[e]!==e;)o[e]=o[o[e]],e=o[e];return e}for(let e=0;e<a;e++)for(let t=e+1;t<a;t++){let n=i[e],r=i[t];if(n.some(e=>r.some(t=>e.equals(t)))){let n=s(e),r=s(t);n!==r&&(o[n]=r)}}let l=new Map,u=-1,d=-1;for(let e=0;e<a;e++){let t=s(e);l.has(t)||l.set(t,{points:[],area:0,originalVertices:[],index:-1,gridWidth:-1,gridHeight:-1,centerPts:[]});let r=l.get(t),[a,o,f,p]=i[e],m=new c.Vector3().add(a).add(o).add(f).add(p).multiplyScalar(.25);if(r.points.push(...i[e]),r.area+=a.distanceTo(o)*a.distanceTo(p),r.originalVertices.push(i[e]),r.index=n,r.centerPts.push(m),u==-1||d==-1){let e=new c.Vector3().subVectors(a,o).normalize();d=a.distanceTo(p),u=a.distanceTo(o);let t=h(e,new c.Vector3(0,0,1));t&&t.parallel&&([d,u]=[u,d])}r.gridWidth=u,r.gridHeight=d}e.push(...l.values())}t.mergeCheckRegion=e}let n=new Map;for(let t of e){let e=t.rooftopPz-t.start.z,r=Math.floor(t.rooftopPz-t.start.z);n.has(r)?n.set(r,{num:n.get(r).num+1,totalHeight:n.get(r).totalHeight+e}):n.set(r,{num:1,totalHeight:e})}let r=[...n.entries()].reduce((e,t)=>t[1].num>e[1].num?t:e),i=r[0];r[1].totalHeight/r[1].num,new c.MeshBasicMaterial({color:`#cffd00`,transparent:!0,opacity:.4,side:c.DoubleSide}),new c.PointsMaterial({color:65535,size:.01});for(let n=0;n<e.length;n++){let r=e[n],{minZ:a,maxZ:o}=O(r);if(a==null||o==null)continue;r.doorAndBeamData=[],r.completePointAreaPercentage=-1,o-a;let s=r.rooftopPz-r.start.z;if(s<i-.5||s>i+2||Math.abs(a-r.start.z)>.3||r.length<1)continue;let l=new c.Vector3(r.start.x,r.start.y,0),u=new c.Vector3(r.end.x,r.end.y,0);for(let r=0;r<e.length;r++){if(r==n||e[r].length<1)continue;let i=e[r],a=new c.Vector3(i.start.x,i.start.y,0),s=new c.Vector3(i.end.x,i.end.y,0),d=b(l,u,a,s),f=S(l,u),m=new c.Line3(a,s).closestPointToPoint(f,!0,new c.Vector3),h=f.distanceTo(m),g=O(i);if(!(g.minZ===void 0||g.maxZ===void 0)&&!(g.maxZ-g.minZ>1)&&d&&d.isParallel&&h<.25&&Math.abs(o-g.minZ)<.1){let i=S(l,u),o=S(a,s);i.z=o.z=1,i.applyEuler(new c.Euler(-Math.PI/2,0,0)),o.applyEuler(new c.Euler(-Math.PI/2,0,0));let d=`w:${e[n].originaIndex},b:${e[r].originaIndex}`,f=`b:${e[r].originaIndex},w:${e[n].originaIndex}`;t.add(p(d,i,{textColor:`#fd0000`})),t.add(p(f,o,{textColor:`#fd0000`}))}}}return e},K=(e,t)=>{let n={rectangles:[],threeEdgeRect:[]},r=new Set,i=.2,a=1.5,o=.15;for(let t=0;t<e.length;t++){let s=e[t].length;if(r.has(t)||s<i||s>a)continue;let l=[],u=new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),d=new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),f=new c.Vector3().subVectors(d,u).normalize().clone().negate(),p=new c.Vector3,m=new c.Vector3,g=new c.Vector3;new c.Vector3;for(let n=0;n<e.length;n++){let r=e[n].length;if(n==t||r<i||r>a)continue;let _=new c.Vector3(e[n].start.x,e[n].start.y,e[n].start.z),v=new c.Vector3(e[n].end.x,e[n].end.y,e[n].end.z),y=x(u,d,_,v);if(!y||y.angle<85)continue;let b=P(_,u),S=P(_,d),C=P(v,u),w=P(v,d);if(!(!b&&!S&&!C&&!w)){b||S?(p=_.clone(),m=v.clone()):(p=v.clone(),m=_.clone()),g=new c.Vector3().subVectors(m,p).normalize(),g.clone().negate();for(let p=0;p<e.length;p++){let g=e[p].length;if(p==t||p==n||g<i||g>a)continue;let y=new c.Vector3(e[p].start.x,e[p].start.y,e[p].start.z),b=new c.Vector3(e[p].end.x,e[p].end.y,e[p].end.z),S=x(_,v,y,b);if(!S||S.angle<85)continue;let C=P(y,m),w=P(b,m);if(!C&&!w)continue;new c.Vector3;let T=new c.Vector3,E=new c.Vector3;C?(E=new c.Vector3().subVectors(b,y).normalize(),y.clone(),T=b.clone()):(E=new c.Vector3().subVectors(y,b).normalize(),b.clone(),T=y.clone());let D=h(f,E,.1);if(!(!D||!D.parallel||!D.sameDirection)){for(let f=0;f<e.length;f++){let m=e[f].length;if(f==t||f==n||f==p||m<i||m>a)continue;let h=new c.Vector3(e[f].start.x,e[f].start.y,e[f].start.z),g=new c.Vector3(e[f].end.x,e[f].end.y,e[f].end.z),_=x(h,g,y,b);if(!_||_.angle<85)continue;let v=P(h,T),S=P(g,T);if(!v&&!S)continue;new c.Vector3;let C=new c.Vector3;v?(h.clone(),C=g.clone()):(g.clone(),C=h.clone());let w=P(C,u),E=P(C,d);if(!w&&!E)continue;let D=s*r;if(!(D<o||D>2)){l=[t,n,p,f];break}}if(l.length==4)break}}if(l.length==4)break}}l.length==4&&(l.forEach(e=>r.add(e)),n.rectangles.push(l))}for(let t=0;t<e.length;t++){let s=e[t].length;if(r.has(t)||s<i||s>a)continue;let l={indexs:[],missingEdge:{start:new c.Vector3,end:new c.Vector3}},u=new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),d=new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),f=!0,p=!0;for(let n=0;n<e.length;n++){if(n==t)continue;let r=new c.Vector3(e[n].start.x,e[n].start.y,e[n].start.z),i=new c.Vector3(e[n].end.x,e[n].end.y,e[n].end.z),a=P(r,u),o=P(i,u),s=P(r,d),l=P(i,d);if(a||o?f=!1:(s||l)&&(p=!1),!f&&!p)break}if(!f&&!p)continue;let m=new c.Vector3;f||([u,d]=[d,u]),m=new c.Vector3().subVectors(d,u).normalize();let g=m.clone().negate();for(let n=0;n<e.length;n++){let f=e[n].length;if(n==t||r.has(n)||f<i||f>a)continue;let p=new c.Vector3(e[n].start.x,e[n].start.y,e[n].start.z),m=new c.Vector3(e[n].end.x,e[n].end.y,e[n].end.z),_=x(u,d,p,m);if(!_||_.angle<85)continue;let v=P(p,d),y=P(m,d);if(!v&&!y)continue;new c.Vector3;let b=new c.Vector3;v?(p.clone(),b=m.clone()):(m.clone(),b=p.clone());for(let d=0;d<e.length;d++){let _=e[d].length;if(d==t||d==n||r.has(d)||_<i||_>a)continue;let v=new c.Vector3(e[d].start.x,e[d].start.y,e[d].start.z),y=new c.Vector3(e[d].end.x,e[d].end.y,e[d].end.z),S=x(p,m,v,y);if(!S||S.angle<85)continue;let C=P(v,b),w=P(y,b);if(!C&&!w)continue;let T=new c.Vector3,E=new c.Vector3;C?(T=v.clone(),E=y.clone()):(T=y.clone(),E=v.clone());let D=h(g,new c.Vector3().subVectors(E,T).normalize(),.1);if(!D||!D.parallel||!D.sameDirection)continue;let O=!0,k=!0;for(let t=0;t<e.length;t++){if(t==d)continue;let n=new c.Vector3(e[t].start.x,e[t].start.y,e[t].start.z),r=new c.Vector3(e[t].end.x,e[t].end.y,e[t].end.z),i=P(n,v),a=P(r,v),o=P(n,y),s=P(r,y);if(i||a?O=!1:(o||s)&&(k=!1),!O&&!k)break}if(!O&&!k)continue;let A=s*f;if(!(A<o||A>2)){l.indexs=[t,n,d],l.missingEdge.start=E,l.missingEdge.end=u;break}}if(l.indexs.length==3)break}l.indexs.length==3&&(l.indexs.forEach(e=>r.add(e)),n.threeEdgeRect.push(l))}return n};exports.classifySegments=C,exports.getAllGeometry=V,exports.getBeamLine=W,exports.getColLine=K,exports.getMainBeamLine=G,exports.getParallelism=b,exports.getPointCloudMinMax=O,exports.getPointCoverageOnQuad=E,exports.isParallel=h,exports.perpendicularInfo=x,exports.removeNoisePoints=A,exports.segmentsIntersect2D=f,exports.usegetBeamLine=U;
package/dist/index.js CHANGED
@@ -146,16 +146,16 @@ var m = (e, t, n = .01) => {
146
146
  angle: c
147
147
  };
148
148
  };
149
- function h(t, n) {
150
- let r = new e.BufferGeometry(), i = [], a = [];
151
- t.forEach((e) => i.push(e.x, e.y, e.z)), n.forEach((e) => i.push(e.x, e.y, e.z)), a.push(0, 2, 1, 0, 3, 2), a.push(4, 5, 6, 4, 6, 7), a.push(0, 1, 5, 0, 5, 4), a.push(1, 2, 6, 1, 6, 5), a.push(2, 3, 7, 2, 7, 6), a.push(3, 0, 4, 3, 4, 7), r.setAttribute("position", new e.Float32BufferAttribute(i, 3)), r.setIndex(a), r.computeVertexNormals();
152
- let o = new e.MeshBasicMaterial({
153
- color: "green",
149
+ function h(t, n, r) {
150
+ let i = new e.BufferGeometry(), a = [], o = [];
151
+ t.forEach((e) => a.push(e.x, e.y, e.z)), n.forEach((e) => a.push(e.x, e.y, e.z)), o.push(0, 2, 1, 0, 3, 2), o.push(4, 5, 6, 4, 6, 7), o.push(0, 1, 5, 0, 5, 4), o.push(1, 2, 6, 1, 6, 5), o.push(2, 3, 7, 2, 7, 6), o.push(3, 0, 4, 3, 4, 7), i.setAttribute("position", new e.Float32BufferAttribute(a, 3)), i.setIndex(o), i.computeVertexNormals();
152
+ let s = new e.MeshBasicMaterial({
153
+ color: r == "door" ? "green" : "#a7cc00",
154
154
  transparent: !0,
155
155
  opacity: .5,
156
156
  side: e.DoubleSide
157
157
  });
158
- return new e.Mesh(r, o);
158
+ return new e.Mesh(i, s);
159
159
  }
160
160
  var g = class {
161
161
  constructor(t = {}) {
@@ -200,87 +200,87 @@ var g = class {
200
200
  this.labelElement && this.labelElement.parentNode && this.labelElement.parentNode.removeChild(this.labelElement), this.label = null, this.labelElement = null;
201
201
  }
202
202
  }, _ = (t) => {
203
- let n = new e.Group();
203
+ let n = new e.Group(), r = new e.Group();
204
204
  if (t && t.length) {
205
- let r = /* @__PURE__ */ "green.red.pink.white.azure.yellow.bisque.grey.blanchedalmond.blue.blueviolet.brown.burlywood.cadetblue.chartreuse.chocolate.coral.cornflowerblue.cornsilk.crimson.cyan.darkblue.darkcyan.darkgoldenrod.darkgray.darkgreen.darkgrey.darkkhaki.darkmagenta.darkolivegreen.darkorange.darkorchid.darkred.darksalmon.darkseagreen.darkslateblue.darkslategray.darkslategrey.darkturquoise.darkviolet.deeppink.deepskyblue.dimgray.dimgrey.dodgerblue.firebrick.floralwhite.forestgreen.fuchsia.gainsboro.ghostwhite.gold.goldenrod.gray.aliceblue.greenyellow.black.honeydew.hotpink.indianred.indigo.ivory.khaki.lavender.lavenderblush.lawngreen.lemonchiffon.lightblue.lightcoral.lightcyan.lightgoldenrodyellow.lightgray.lightgreen.lightgrey.lightpink.lightsalmon.lightseagreen.lightskyblue.lightslategray.lightslategrey.lightsteelblue.lightyellow.lime.limegreen.linen.magenta.maroon.mediumaquamarine.mediumblue.mediumorchid.mediumpurple.mediumseagreen.mediumslateblue.mediumspringgreen.mediumturquoise.mediumvioletred.midnightblue.mintcream.mistyrose.moccasin.navajowhite.navy.oldlace.olive.olivedrab.orange.orangered.orchid.palegoldenrod.palegreen.paleturquoise.palevioletred.papayawhip.peachpuff.peru.pink.plum.powderblue.purple.rebeccapurple.yellow.rosybrown.royalblue.saddlebrown.salmon.sandybrown.seagreen.seashell.sienna.silver.skyblue.slateblue.slategray.slategrey.snow.springgreen.steelblue.tan.teal.thistle.tomato.turquoise.violet.wheat.white.whitesmoke.yellow.yellowgreen".split(".");
206
- t.forEach((t, i) => {
207
- let a = r[i], o = new e.Group(), { pcdPoints: s, category: c, name: l, center: u, box: d, obbBox: f, contour: p, nline: m, coordinatesByWidth: _, coordinatesByArea: v } = t, y = s.length;
208
- if (c != "door") return;
209
- c === "balcony railing" && console.log("pcdObj", t);
210
- let b = new e.Box3(new e.Vector3(d.min.x, d.min.y, d.min.z), new e.Vector3(d.max.x, d.max.y, d.max.z)), x = new e.Box3Helper(b, a);
211
- o.add(x);
212
- let S = new g({
213
- value: l,
214
- position: new e.Vector3(u.x, u.y, u.z)
205
+ let i = /* @__PURE__ */ "green.red.pink.white.azure.yellow.bisque.grey.blanchedalmond.blue.blueviolet.brown.burlywood.cadetblue.chartreuse.chocolate.coral.cornflowerblue.cornsilk.crimson.cyan.darkblue.darkcyan.darkgoldenrod.darkgray.darkgreen.darkgrey.darkkhaki.darkmagenta.darkolivegreen.darkorange.darkorchid.darkred.darksalmon.darkseagreen.darkslateblue.darkslategray.darkslategrey.darkturquoise.darkviolet.deeppink.deepskyblue.dimgray.dimgrey.dodgerblue.firebrick.floralwhite.forestgreen.fuchsia.gainsboro.ghostwhite.gold.goldenrod.gray.aliceblue.greenyellow.black.honeydew.hotpink.indianred.indigo.ivory.khaki.lavender.lavenderblush.lawngreen.lemonchiffon.lightblue.lightcoral.lightcyan.lightgoldenrodyellow.lightgray.lightgreen.lightgrey.lightpink.lightsalmon.lightseagreen.lightskyblue.lightslategray.lightslategrey.lightsteelblue.lightyellow.lime.limegreen.linen.magenta.maroon.mediumaquamarine.mediumblue.mediumorchid.mediumpurple.mediumseagreen.mediumslateblue.mediumspringgreen.mediumturquoise.mediumvioletred.midnightblue.mintcream.mistyrose.moccasin.navajowhite.navy.oldlace.olive.olivedrab.orange.orangered.orchid.palegoldenrod.palegreen.paleturquoise.palevioletred.papayawhip.peachpuff.peru.pink.plum.powderblue.purple.rebeccapurple.yellow.rosybrown.royalblue.saddlebrown.salmon.sandybrown.seagreen.seashell.sienna.silver.skyblue.slateblue.slategray.slategrey.snow.springgreen.steelblue.tan.teal.thistle.tomato.turquoise.violet.wheat.white.whitesmoke.yellow.yellowgreen".split(".");
206
+ t.forEach((t, a) => {
207
+ let o = i[a], s = new e.Group(), { pcdPoints: c, category: l, name: u, center: d, box: f, obbBox: p, contour: m, nline: _, coordinatesByWidth: v, coordinatesByArea: y } = t, b = c.length, x = new e.Box3(new e.Vector3(f.min.x, f.min.y, f.min.z), new e.Vector3(f.max.x, f.max.y, f.max.z)), S = new e.Box3Helper(x, o);
208
+ s.add(S);
209
+ let C = new g({
210
+ value: u,
211
+ position: new e.Vector3(d.x, d.y, d.z)
215
212
  }).getLabel();
216
- o.add(S);
217
- let C = new e.InstancedMesh(new e.SphereGeometry(.007, 8, 8), new e.MeshBasicMaterial({ color: a }), y);
218
- o.add(C);
219
- let w = new e.Matrix4(), T = 0;
220
- if (s.forEach((e) => {
221
- w.setPosition(e.x, e.y, e.z), C.setMatrixAt(T, w), T++;
222
- }), C.instanceMatrix.needsUpdate = !0, m) {
213
+ s.add(C);
214
+ let w = new e.InstancedMesh(new e.SphereGeometry(.007, 8, 8), new e.MeshBasicMaterial({ color: o }), b);
215
+ s.add(w);
216
+ let T = new e.Matrix4(), E = 0;
217
+ if (c.forEach((e) => {
218
+ T.setPosition(e.x, e.y, e.z), w.setMatrixAt(E, T), E++;
219
+ }), w.instanceMatrix.needsUpdate = !0, _) {
223
220
  let t = new e.BufferGeometry();
224
- t.setFromPoints([new e.Vector3(m.start.x, m.start.y, m.start.z), new e.Vector3(m.end.x, m.end.y, m.end.z)]);
221
+ t.setFromPoints([new e.Vector3(_.start.x, _.start.y, _.start.z), new e.Vector3(_.end.x, _.end.y, _.end.z)]);
225
222
  let n = new e.LineBasicMaterial({
226
223
  color: "red",
227
224
  depthTest: !1,
228
225
  depthWrite: !1
229
226
  });
230
227
  new e.Line(t, n);
231
- let r = new e.Vector3().copy(new e.Vector3(m.start.x, m.start.y, m.start.z)).add(new e.Vector3(m.end.x, m.end.y, m.end.z)).multiplyScalar(.5), i = new e.Vector3(m.centerDir.x, m.centerDir.y, m.centerDir.z);
228
+ let r = new e.Vector3().copy(new e.Vector3(_.start.x, _.start.y, _.start.z)).add(new e.Vector3(_.end.x, _.end.y, _.end.z)).multiplyScalar(.5), i = new e.Vector3(_.centerDir.x, _.centerDir.y, _.centerDir.z);
232
229
  new e.ArrowHelper(i, r, 1, "red");
233
230
  }
234
- if (p) {
231
+ if (m) {
235
232
  let t = [];
236
- p.forEach((n, r) => {
233
+ m.forEach((n, r) => {
237
234
  t.push(new e.Vector3(n.x, n.y, n.z));
238
235
  });
239
- let r = new e.BufferGeometry();
240
- r.setFromPoints(t);
241
- let i = new e.LineBasicMaterial({
236
+ let i = new e.BufferGeometry();
237
+ i.setFromPoints(t);
238
+ let a = new e.LineBasicMaterial({
242
239
  color: "yellow",
243
240
  depthTest: !1,
244
241
  depthWrite: !1
245
- }), a = new e.Line(r, i);
246
- n.add(a);
242
+ }), o = new e.Line(i, a);
243
+ l == "door" ? n.add(o) : r.add(o);
247
244
  }
248
- if (v) {
249
- let t = [], r = [];
250
- v.coordinates.forEach((n, i) => {
251
- t.push(new e.Vector3(n.x, n.y, n.z)), r.length < 4 && r.push(new e.Vector3(n.x, n.y, n.z));
245
+ if (y) {
246
+ let t = [], i = [];
247
+ y.coordinates.forEach((n, r) => {
248
+ t.push(new e.Vector3(n.x, n.y, n.z)), i.length < 4 && i.push(new e.Vector3(n.x, n.y, n.z));
252
249
  });
253
- let i = new e.BufferGeometry();
254
- i.setFromPoints(t);
255
- let a = new e.LineBasicMaterial({
250
+ let a = new e.BufferGeometry();
251
+ a.setFromPoints(t);
252
+ let o = new e.LineBasicMaterial({
256
253
  color: "green",
257
254
  depthTest: !1,
258
255
  depthWrite: !1
259
- }), o = new e.Line(i, a);
260
- n.add(o);
261
- let s = h(r.map((t) => new e.Vector3(t.x, t.y, v.heightData.minZ)), r.map((t) => new e.Vector3(t.x, t.y, t.z)));
262
- n.add(s);
263
- let [c, l, u] = t, d = c.distanceTo(l), f = new e.Vector3().copy(c).add(l).multiplyScalar(.5);
264
- new g({
265
- value: String(d.toFixed(3)),
266
- position: f
267
- }).getLabel();
268
- let p = l.distanceTo(u), m = new e.Vector3().copy(l).add(u).multiplyScalar(.5);
256
+ }), s = new e.Line(a, o);
257
+ l == "door" ? n.add(s) : r.add(s);
258
+ let c = h(i.map((t) => new e.Vector3(t.x, t.y, y.heightData.minZ)), i.map((t) => new e.Vector3(t.x, t.y, t.z)), l);
259
+ l == "door" ? n.add(c) : r.add(c);
260
+ let [u, d, f] = t, p = u.distanceTo(d), m = new e.Vector3().copy(u).add(d).multiplyScalar(.5);
269
261
  new g({
270
262
  value: String(p.toFixed(3)),
271
263
  position: m
272
264
  }).getLabel();
265
+ let _ = d.distanceTo(f), v = new e.Vector3().copy(d).add(f).multiplyScalar(.5);
266
+ new g({
267
+ value: String(_.toFixed(3)),
268
+ position: v
269
+ }).getLabel();
273
270
  }
274
- if (f) {
275
- let t = new e.BoxGeometry(f.size.x, f.size.y, f.size.z), r = new e.LineBasicMaterial({
276
- color: a,
271
+ if (p) {
272
+ let t = new e.BoxGeometry(p.size.x, p.size.y, p.size.z), i = new e.LineBasicMaterial({
273
+ color: o,
277
274
  linewidth: 2
278
- }), i = new e.EdgesGeometry(t), o = new e.LineSegments(i, r), s = new Vector3(f.center.x, f.center.y, f.center.z), c = new Quaternion(f.rotation.x, f.rotation.y, f.rotation.z, f.rotation.w);
279
- o.position.copy(s), o.quaternion.copy(c), n.add(o);
275
+ }), a = new e.EdgesGeometry(t), s = new e.LineSegments(a, i), c = new Vector3(p.center.x, p.center.y, p.center.z), u = new Quaternion(p.rotation.x, p.rotation.y, p.rotation.z, p.rotation.w);
276
+ s.position.copy(c), s.quaternion.copy(u), l == "door" ? n.add(s) : r.add(s);
280
277
  }
281
278
  });
282
279
  }
283
- return n;
280
+ return {
281
+ AiProjectionGroup: n,
282
+ AiProjectionGroup2: r
283
+ };
284
284
  }, v = (t, n, r, i) => {
285
285
  let a = t, o = [];
286
286
  if (i && i.length && (o = i.map((e) => e.clone())), !a || a.length < 4) return {};
@@ -1056,56 +1056,56 @@ var L = class {
1056
1056
  c.checkResults = w, c.verticalDirection = T, c.originaIndex = o, i.push(c);
1057
1057
  }
1058
1058
  return i;
1059
- }, V = async (t, n, r, i) => {
1059
+ }, V = () => `#${Math.floor(Math.random() * 75 + 180).toString(16).padStart(2, "0")}${Math.floor(Math.random() * 75 + 180).toString(16).padStart(2, "0")}${Math.floor(Math.random() * 75 + 180).toString(16).padStart(2, "0")}`, H = async (t, n, r, i) => {
1060
1060
  P(i);
1061
1061
  let a = await fetch(t);
1062
1062
  if (!a) return;
1063
- let o = await a.json(), s = new e.Group(), l = new e.Group(), u = new e.Group(), d = new e.Group(), p = new e.Group(), m = new e.Group(), h = new e.Group();
1063
+ let o = await a.json(), s = new e.Group(), l = new e.Group(), u = new e.Group(), d = new e.Group(), p = new e.Group(), m = new e.Group(), h = new e.Group(), g = new e.Group();
1064
1064
  for (let t = 0; t < o.length; t++) {
1065
1065
  let n = o[t];
1066
1066
  if (!n) continue;
1067
1067
  let r = new e.Vector3(n.start.x, n.start.y, n.start.z);
1068
1068
  r.applyEuler(new e.Euler(-Math.PI / 2, 0, 0));
1069
1069
  let i = new e.Vector3(n.end.x, n.end.y, n.end.z);
1070
- i.applyEuler(new e.Euler(-Math.PI / 2, 0, 0)), h.add(f(String(t), new e.Vector3((r.x + i.x) / 2, (r.y + i.y) / 2, (r.z + i.z) / 2)));
1070
+ i.applyEuler(new e.Euler(-Math.PI / 2, 0, 0)), g.add(f(String(t), new e.Vector3((r.x + i.x) / 2, (r.y + i.y) / 2, (r.z + i.z) / 2)));
1071
1071
  }
1072
1072
  o.sort((e, t) => e.originalIndex - t.originalIndex), console.log("lins", o);
1073
- let g = await fetch(n);
1074
- if (!g) return;
1075
- let v = await g.json(), y = Array.isArray(v) ? v : Object.values(v), b = await fetch(r);
1076
- if (console.log("respcd", b), !b) return;
1077
- let x = await b.json(), S = 0;
1078
- for (let t = 0; t < x.length; t++) {
1079
- let n = x[t];
1073
+ let v = await fetch(n);
1074
+ if (!v) return;
1075
+ let y = await v.json(), b = Array.isArray(y) ? y : Object.values(y), x = await fetch(r);
1076
+ if (console.log("respcd", x), !x) return;
1077
+ let S = await x.json(), C = 0;
1078
+ for (let t = 0; t < S.length; t++) {
1079
+ let n = S[t];
1080
1080
  if (n.isFindBeam = !1, n.category == "door") {
1081
1081
  let t = new e.Vector3(n.center.x, n.center.y, n.center.z);
1082
- t.applyEuler(new e.Euler(-Math.PI / 2, 0, 0)), h.add(f(`door:${S}`, t)), S++;
1082
+ t.applyEuler(new e.Euler(-Math.PI / 2, 0, 0)), g.add(f(`door:${C}`, t)), C++;
1083
1083
  }
1084
1084
  }
1085
- i.add(h), console.time();
1086
- let { beamGroup: C } = await H(o, y, x, i);
1087
- console.timeEnd(), console.log("beamGroup", C);
1088
- let w = new e.MeshBasicMaterial({
1085
+ i.add(g), console.time();
1086
+ let { beamGroup: w } = await U(o, b, S, i);
1087
+ console.timeEnd(), console.log("beamGroup", w);
1088
+ let T = new e.MeshBasicMaterial({
1089
1089
  color: "#cffd00",
1090
1090
  transparent: !0,
1091
1091
  opacity: .4,
1092
1092
  side: e.DoubleSide
1093
- }), T = new e.MeshBasicMaterial({
1093
+ }), E = new e.MeshBasicMaterial({
1094
1094
  color: "#ff0000",
1095
1095
  transparent: !0,
1096
1096
  opacity: .4,
1097
1097
  side: e.DoubleSide
1098
- }), E = new e.MeshBasicMaterial({
1098
+ }), D = new e.MeshBasicMaterial({
1099
1099
  color: "#e100ff",
1100
1100
  transparent: !0,
1101
1101
  opacity: .4,
1102
1102
  side: e.DoubleSide
1103
- }), D = new e.MeshBasicMaterial({
1103
+ }), O = new e.MeshBasicMaterial({
1104
1104
  color: "#0400ff",
1105
1105
  transparent: !0,
1106
1106
  opacity: .4,
1107
1107
  side: e.DoubleSide
1108
- }), O = new e.LineBasicMaterial({ color: "#cffd00" }), k = [];
1108
+ }), k = new e.LineBasicMaterial({ color: "#cffd00" }), A = [];
1109
1109
  for (let t = 0; t < o.length; t++) {
1110
1110
  let n = o[t];
1111
1111
  if (n.checkResults) for (let t of n.checkResults) for (let n of t.originalVertices) {
@@ -1132,17 +1132,17 @@ var L = class {
1132
1132
  3
1133
1133
  ]), o.computeVertexNormals();
1134
1134
  let c = new e.EdgesGeometry(o, 1);
1135
- k.push(c);
1135
+ A.push(c);
1136
1136
  }
1137
1137
  }
1138
- if (k.length > 0) {
1139
- let t = c(k, !1);
1140
- t.rotateX(-Math.PI / 2), s.add(new e.LineSegments(t, O)), s.visible = !1, i.add(s), k.forEach((e) => e.dispose());
1138
+ if (A.length > 0) {
1139
+ let t = c(A, !1);
1140
+ t.rotateX(-Math.PI / 2), s.add(new e.LineSegments(t, k)), s.visible = !1, i.add(s), A.forEach((e) => e.dispose());
1141
1141
  }
1142
- let A = new e.PointsMaterial({
1142
+ new e.PointsMaterial({
1143
1143
  color: 65535,
1144
1144
  size: .01
1145
- }), j = [];
1145
+ });
1146
1146
  for (let t of o) {
1147
1147
  if (!t.originalPoints || t.originalPoints.length === 0) continue;
1148
1148
  let n = new Float32Array(t.originalPoints.length * 3);
@@ -1150,35 +1150,36 @@ var L = class {
1150
1150
  n[t * 3] = e.x, n[t * 3 + 1] = e.y, n[t * 3 + 2] = e.z;
1151
1151
  });
1152
1152
  let r = new e.BufferGeometry();
1153
- r.setAttribute("position", new e.BufferAttribute(n, 3)), j.push(r);
1153
+ r.setAttribute("position", new e.BufferAttribute(n, 3)), r.rotateX(-Math.PI / 2), l.add(new e.Points(r, new e.PointsMaterial({
1154
+ color: V(),
1155
+ size: .02
1156
+ })));
1154
1157
  let i = [];
1155
1158
  i.push(new e.Vector3(t.start.x, t.start.y, t.start.z)), i.push(new e.Vector3(t.end.x, t.end.y, t.end.z));
1156
1159
  let a = new e.BufferGeometry();
1157
- a.setFromPoints(i), a.rotateX(-Math.PI / 2), p.add(new e.Line(a, O));
1160
+ a.setFromPoints(i), a.rotateX(-Math.PI / 2), m.add(new e.Line(a, k));
1158
1161
  }
1159
- if (j.length > 0) {
1160
- let t = c(j, !1);
1161
- t.rotateX(-Math.PI / 2), l.add(new e.Points(t, A)), i.add(l), j.forEach((e) => e.dispose());
1162
- }
1163
- p.visible = !1, i.add(p);
1164
- let M = [], N = [], F = new e.LineBasicMaterial({ color: "#f30606" }), I = new e.MeshBasicMaterial({ color: "#071ac4" });
1165
- for (let t = 0; t < y.length; t++) {
1162
+ m.visible = !1, i.add(l), i.add(m);
1163
+ let j = [], M = [], N = new e.LineBasicMaterial({ color: "#f30606" }), F = new e.MeshBasicMaterial({ color: "#071ac4" });
1164
+ for (let t = 0; t < b.length; t++) {
1166
1165
  let n = new e.SphereGeometry(.05);
1167
- n.translate(y[t].x, y[t].y, y[t].z);
1168
- let r = [], i = new e.Vector3(y[t].x, y[t].y, y[t].z), a = new e.Quaternion(y[t].qx, y[t].qy, y[t].qz, y[t].qw), o = new e.Vector3(0, 0, -1).applyQuaternion(a), s = i.clone().addScaledVector(o, .001);
1166
+ n.translate(b[t].x, b[t].y, b[t].z);
1167
+ let r = [], i = new e.Vector3(b[t].x, b[t].y, b[t].z), a = new e.Quaternion(b[t].qx, b[t].qy, b[t].qz, b[t].qw), o = new e.Vector3(0, 0, -1).applyQuaternion(a), s = i.clone().addScaledVector(o, .001);
1169
1168
  r.push(i), r.push(s);
1170
1169
  let c = new e.BufferGeometry();
1171
- c.setFromPoints(r), N.push(c), M.push(n);
1170
+ c.setFromPoints(r), M.push(c), j.push(n);
1171
+ }
1172
+ if (j.length > 0) {
1173
+ let t = c(j, !1);
1174
+ t.rotateX(-Math.PI / 2), u.add(new e.Mesh(t, F)), j.forEach((e) => e.dispose());
1172
1175
  }
1173
1176
  if (M.length > 0) {
1174
1177
  let t = c(M, !1);
1175
- t.rotateX(-Math.PI / 2), u.add(new e.Mesh(t, I)), M.forEach((e) => e.dispose());
1176
- }
1177
- if (N.length > 0) {
1178
- let t = c(N, !1);
1179
- t.rotateX(-Math.PI / 2), u.add(new e.Line(t, F)), N.forEach((e) => e.dispose());
1178
+ t.rotateX(-Math.PI / 2), u.add(new e.Line(t, N)), M.forEach((e) => e.dispose());
1180
1179
  }
1181
- return i.add(u), d.add(_(x)), d.rotateX(-Math.PI / 2), i.add(d), console.log("jsonpcdData", x), o.forEach((t) => {
1180
+ i.add(u);
1181
+ let { AiProjectionGroup: I, AiProjectionGroup2: L } = _(S);
1182
+ return d.add(I), d.rotateX(-Math.PI / 2), i.add(d), p.add(L), p.visible = !1, p.rotateX(-Math.PI / 2), i.add(p), console.log("jsonpcdData", S), o.forEach((t) => {
1182
1183
  t.doorAndBeamData && t.doorAndBeamData.length > 0 && (t.doorAndBeamData.forEach((t) => {
1183
1184
  if (t.beamStart) {
1184
1185
  let n = new e.BufferGeometry(), r = new Float32Array([
@@ -1202,7 +1203,7 @@ var L = class {
1202
1203
  0,
1203
1204
  2,
1204
1205
  3
1205
- ]), n.computeVertexNormals(), n.rotateX(-Math.PI / 2), m.add(new e.Mesh(n, w));
1206
+ ]), n.computeVertexNormals(), n.rotateX(-Math.PI / 2), h.add(new e.Mesh(n, T));
1206
1207
  }
1207
1208
  let n = new e.BufferGeometry(), r = new Float32Array([
1208
1209
  t.doorStart.x,
@@ -1225,20 +1226,21 @@ var L = class {
1225
1226
  0,
1226
1227
  2,
1227
1228
  3
1228
- ]), n.computeVertexNormals(), n.rotateX(-Math.PI / 2), t.isDoor ? m.add(new e.Mesh(n, D)) : t.type == "beam" ? m.add(new e.Mesh(n, E)) : m.add(new e.Mesh(n, T));
1229
+ ]), n.computeVertexNormals(), n.rotateX(-Math.PI / 2), t.isDoor ? h.add(new e.Mesh(n, O)) : t.type == "beam" ? h.add(new e.Mesh(n, D)) : h.add(new e.Mesh(n, E));
1229
1230
  let i = `id:${t.id},Nid:${t.nearId}`, a = new e.Vector3((t.doorStart.x + t.doorEnd.x) / 2, (t.doorStart.y + t.doorEnd.y) / 2, t.doorStart.z + t.doorHeight);
1230
- a.applyEuler(new e.Euler(-Math.PI / 2, 0, 0)), m.add(f(i, a));
1231
- }), i.add(m));
1231
+ a.applyEuler(new e.Euler(-Math.PI / 2, 0, 0)), h.add(f(i, a));
1232
+ }), i.add(h));
1232
1233
  }), {
1233
1234
  checkResultGroup: s,
1234
1235
  pointCloudGroup: l,
1235
1236
  runData: u,
1236
1237
  pcdGroup: d,
1237
- pointLineGroup: p,
1238
- beamDoorGroup: m,
1239
- lineIndexGroup: h
1238
+ pcdGroup2: p,
1239
+ pointLineGroup: m,
1240
+ beamDoorGroup: h,
1241
+ lineIndexGroup: g
1240
1242
  };
1241
- }, H = async (t, n, r, i) => {
1243
+ }, U = async (t, n, r, i) => {
1242
1244
  if (k(t, i), t.length <= 0 || n.length <= 0) return t;
1243
1245
  r ||= [];
1244
1246
  for (let n of t) {
@@ -1410,44 +1412,44 @@ var L = class {
1410
1412
  if (k < 1.5 || _ < v.facePoints[2].z || P > E / 3 * 2) continue;
1411
1413
  let F = !1, I = !1, L = !1, R = [], z = v.facePoints[2].clone(), B = v.facePoints[3].clone(), V = v.facePoints[0].clone(), H = v.facePoints[1].clone(), W = !1, G = -1;
1412
1414
  if (Math.abs(v.facePoints[0].z - a.start.z) < .25) {
1413
- if (D > .25 && a.length > .5) {
1415
+ if (D > .17 && a.length > .5) {
1414
1416
  let n = A(w, V), r = A(w, H), o = A(T, V), s = A(T, H), c = .1;
1415
1417
  if (n < c || r < c) {
1416
1418
  let { newOriginalPoints: r } = O(V, H, a.originalPoints), o = [], s = [];
1417
1419
  if (r.forEach((e) => {
1418
1420
  e.z >= z.z ? o.push(e) : e.z <= V.z && s.push(e);
1419
1421
  }), o.length > 10) {
1420
- let r = new e.Vector3(a.start.x, a.start.y, 0), o = new e.Vector3(a.end.x, a.end.y, 0), s = new e.Vector3().subVectors(r, o).normalize(), l = new e.Vector3(), u = Infinity, f = -1;
1422
+ let r = new e.Vector3(a.start.x, a.start.y, 0), o = new e.Vector3(a.end.x, a.end.y, 0), s = new e.Vector3().subVectors(r, o).normalize(), l = new e.Vector3(), u = Infinity, f = -1, p = !1;
1421
1423
  for (let n = 0; n < t.length; n++) {
1422
1424
  if (n == i) continue;
1423
- let a = new e.Vector3(t[n].start.x, t[n].start.y, 0), c = new e.Vector3(t[n].end.x, t[n].end.y, 0), p = d(r, o, a, c), m = b(r, o, a, c);
1424
- if (p != null) {
1425
- if (m && m.angle > 85) {
1426
- let e = p.point.distanceTo(r);
1427
- if (p.point.distanceTo(o), e < .1) {
1425
+ let a = new e.Vector3(t[n].start.x, t[n].start.y, 0), c = new e.Vector3(t[n].end.x, t[n].end.y, 0), m = d(r, o, a, c), h = b(r, o, a, c);
1426
+ if (m != null) {
1427
+ if (h && h.angle > 85) {
1428
+ let e = m.point.distanceTo(r);
1429
+ if (m.point.distanceTo(o), e < .1) {
1428
1430
  u = Infinity, f = -1;
1429
1431
  break;
1430
1432
  }
1431
1433
  }
1432
1434
  continue;
1433
1435
  }
1434
- if (m && m.angle > 85) {
1436
+ if (h && h.angle > 65) {
1435
1437
  let t = y(r, o, new e.Line3(a, c).closestPointToPoint(r, !0, l), r);
1436
1438
  if (!t || t.direction != "same") continue;
1437
1439
  let i = r.clone().addScaledVector(s, 10), p = o.clone().addScaledVector(s.clone().negate(), 10), m = new e.Vector3().subVectors(c, a).normalize(), h = d(i, p, a.clone().addScaledVector(m.clone().negate(), .03), c.clone().addScaledVector(m, .03));
1438
1440
  if (h == null) continue;
1439
1441
  let g = r.distanceTo(h.point);
1440
1442
  g < u && (u = g, f = n);
1441
- } else if (m && m.angle < 5) {
1442
- let e = A(r, a), t = A(r, c), n = A(o, a), i = A(o, c);
1443
- if (e < .08 || t < .08 || n < .08 || i < .08) {
1444
- u = Infinity, f = -1;
1443
+ } else if (h && h.angle < 5) {
1444
+ let t = new e.Vector3(V.x, V.y, 0), n = new e.Vector3(H.x, H.y, 0), r = A(t, a), i = A(t, c), o = A(n, a), s = A(n, c);
1445
+ if (r < .08 || i < .08 || o < .08 || s < .08) {
1446
+ p = !0, u = Infinity, f = -1;
1445
1447
  break;
1446
1448
  }
1447
1449
  }
1448
1450
  }
1449
- if (u != Infinity && u < 2) t[f].length > .3 && D + u > .5 && (W = !0, n < c ? (B = B.addScaledVector(s, u), V = V.addScaledVector(s, u)) : (z = z.addScaledVector(s, u), H = H.addScaledVector(s, u)));
1450
- else {
1451
+ if (u != Infinity && u < 2) t[f].length > .25 && D + u > .5 && (W = !0, n < c ? (B = B.addScaledVector(s, u), V = V.addScaledVector(s, u)) : (z = z.addScaledVector(s, u), H = H.addScaledVector(s, u)));
1452
+ else if (!p) {
1451
1453
  let r = .05, a = w.clone().addScaledVector(s, r), o = w.clone().addScaledVector(s.clone().negate(), r);
1452
1454
  a.z = o.z = 0;
1453
1455
  let l = !1;
@@ -1473,34 +1475,34 @@ var L = class {
1473
1475
  if (n.forEach((e) => {
1474
1476
  e.z >= z.z ? r.push(e) : e.z <= V.z && s.push(e);
1475
1477
  }), r.length > 10) {
1476
- let n = new e.Vector3(a.start.x, a.start.y, 0), r = new e.Vector3(a.end.x, a.end.y, 0), s = new e.Vector3().subVectors(r, n).normalize(), l = new e.Vector3(), u = Infinity, f = -1;
1478
+ let n = new e.Vector3(a.start.x, a.start.y, 0), r = new e.Vector3(a.end.x, a.end.y, 0), s = new e.Vector3().subVectors(r, n).normalize(), l = new e.Vector3(), u = Infinity, f = -1, p = !1;
1477
1479
  for (let a = 0; a < t.length; a++) {
1478
1480
  if (a == i) continue;
1479
- let o = new e.Vector3(t[a].start.x, t[a].start.y, 0), c = new e.Vector3(t[a].end.x, t[a].end.y, 0), p = d(n, r, o, c), m = b(n, r, o, c);
1480
- if (p != null) {
1481
- if (m && m.angle > 85 && (p.point.distanceTo(n), p.point.distanceTo(r) < .1)) {
1481
+ let o = new e.Vector3(t[a].start.x, t[a].start.y, 0), c = new e.Vector3(t[a].end.x, t[a].end.y, 0), m = d(n, r, o, c), h = b(n, r, o, c);
1482
+ if (m != null) {
1483
+ if (h && h.angle > 85 && (m.point.distanceTo(n), m.point.distanceTo(r) < .1)) {
1482
1484
  u = Infinity, f = -1;
1483
1485
  break;
1484
1486
  }
1485
1487
  continue;
1486
1488
  }
1487
- if (m && m.angle > 85) {
1489
+ if (h && h.angle > 65) {
1488
1490
  let t = y(r, n, new e.Line3(o, c).closestPointToPoint(r, !0, l), r);
1489
1491
  if (!t || t.direction != "same") continue;
1490
1492
  let i = n.clone().addScaledVector(s.clone().negate(), 10), p = r.clone().addScaledVector(s, 10), m = new e.Vector3().subVectors(c, o).normalize(), h = d(i, p, o.clone().addScaledVector(m.clone().negate(), .03), c.clone().addScaledVector(m, .03));
1491
1493
  if (h == null) continue;
1492
1494
  let g = r.distanceTo(h.point);
1493
1495
  g < u && (u = g, f = a);
1494
- } else if (m && m.angle < 5) {
1495
- let e = A(n, o), t = A(n, c), i = A(r, o), a = A(r, c);
1496
- if (e < .08 || t < .08 || i < .08 || a < .08) {
1497
- u = Infinity, f = -1;
1496
+ } else if (h && h.angle < 5) {
1497
+ let t = new e.Vector3(V.x, V.y, 0), n = new e.Vector3(H.x, H.y, 0), r = A(t, o), i = A(t, c), a = A(n, o), s = A(n, c);
1498
+ if (r < .08 || i < .08 || a < .08 || s < .08) {
1499
+ p = !0, u = Infinity, f = -1;
1498
1500
  break;
1499
1501
  }
1500
1502
  }
1501
1503
  }
1502
- if (u != Infinity && u < 2) t[f].length > .3 && D + u > .5 && (W = !0, o < c ? (B = B.addScaledVector(s, u), V = V.addScaledVector(s, u)) : (z = z.addScaledVector(s, u), H = H.addScaledVector(s, u)));
1503
- else {
1504
+ if (u != Infinity && u < 2) t[f].length > .25 && D + u > .5 && (W = !0, o < c ? (B = B.addScaledVector(s, u), V = V.addScaledVector(s, u)) : (z = z.addScaledVector(s, u), H = H.addScaledVector(s, u)));
1505
+ else if (!p) {
1504
1506
  let n = .05, r = T.clone().addScaledVector(s, n), a = w.clone();
1505
1507
  r.z = a.z = 0;
1506
1508
  let l = !1;
@@ -1523,7 +1525,7 @@ var L = class {
1523
1525
  }
1524
1526
  D = B.distanceTo(z);
1525
1527
  }
1526
- if (N < 85 && D > .4 || D > .7 && k > E - E / 3) {
1528
+ if (N < 85 && D > .35 || D > .7 && k > E - E / 3) {
1527
1529
  let t = !1;
1528
1530
  for (let r = 0; r < n.length; r++) {
1529
1531
  let i = r + 1;
@@ -1607,8 +1609,10 @@ var L = class {
1607
1609
  }
1608
1610
  o.equals(V) || (V = o, B = new e.Vector3(V.x, V.y, B.z)), s.equals(H) || (H = s, z = new e.Vector3(H.x, H.y, z.z));
1609
1611
  }
1612
+ let s = H.distanceTo(V);
1613
+ if (s < .4 && !I || s < .3 && I) continue;
1610
1614
  f.includes(i) || f.push(i), a.checkResults[o.index].isDoor = !0;
1611
- let s = "", g = {
1615
+ let g = "", _ = {
1612
1616
  id: l,
1613
1617
  beamStart: z,
1614
1618
  beamEnd: B,
@@ -1617,12 +1621,12 @@ var L = class {
1617
1621
  doorEnd: H,
1618
1622
  doorHeight: k,
1619
1623
  nearId: -1,
1620
- type: s,
1624
+ type: g,
1621
1625
  isExtend: W,
1622
1626
  isDoor: I,
1623
1627
  isPullOutDoor: L,
1624
1628
  pcbDoorIndexs: R
1625
- }, _ = !1, b = new e.Vector3(), C = new e.Vector3(), w = -1;
1629
+ }, b = !1, C = new e.Vector3(), w = new e.Vector3(), T = -1;
1626
1630
  for (let n = 0; n < u.length; n++) {
1627
1631
  let r = t[u[n].linesIndex].doorAndBeamData[u[n].doorIndex];
1628
1632
  if (r.nearId != -1) continue;
@@ -1634,20 +1638,20 @@ var L = class {
1634
1638
  n > t && (i.start = new e.Vector3(r.beamStart.x, r.beamStart.y, 0), i.end = new e.Vector3(r.beamEnd.x, r.beamEnd.y, 0), a = x(z, B, !0));
1635
1639
  let o = new e.Vector3(), s = i.closestPointToPoint(a, !0, o), c = s.distanceTo(a), u = new e.Vector3().subVectors(a, s).normalize(), f = u.clone().negate(), p = a.clone().addScaledVector(f, c + .1), m = d(i.start, i.end, a, p), h = !I && !r.isDoor && (t > n * 2 || n > t * 2);
1636
1640
  if (c < .4 && m != null && !h) {
1637
- r.nearId = l, g.nearId = r.id;
1641
+ r.nearId = l, _.nearId = r.id;
1638
1642
  let e = .8;
1639
- (r.isDoor || g.isDoor) && (r.isDoor = !0, g.isDoor = !0);
1643
+ (r.isDoor || _.isDoor) && (r.isDoor = !0, _.isDoor = !0);
1640
1644
  let i = R.some((e) => r.pcbDoorIndexs.includes(e));
1641
- t < n ? t > e && !r.isPullOutDoor ? (r.beamStart = z.clone().addScaledVector(f, c), r.beamEnd = B.clone().addScaledVector(f, c), r.doorStart = V.clone().addScaledVector(f, c), r.doorEnd = H.clone().addScaledVector(f, c), r.doorHeight = g.doorHeight, r.beamStart.z = r.beamEnd.z = r.doorStart.z + r.doorHeight) : !L || L && r.isPullOutDoor && i ? (g.beamStart = r.beamStart.clone().addScaledVector(u, c), g.beamEnd = r.beamEnd.clone().addScaledVector(u, c), g.doorStart = r.doorStart.clone().addScaledVector(u, c), g.doorEnd = r.doorEnd.clone().addScaledVector(u, c), g.doorHeight = r.doorHeight, g.beamStart.z = g.beamEnd.z = g.doorStart.z + g.doorHeight) : (r.beamStart = z.clone().addScaledVector(f, c), r.beamEnd = B.clone().addScaledVector(f, c), r.doorStart = V.clone().addScaledVector(f, c), r.doorEnd = H.clone().addScaledVector(f, c), r.doorHeight = g.doorHeight, r.beamStart.z = r.beamEnd.z = r.doorStart.z + r.doorHeight) : t > n && (n > e && !L ? (g.beamStart = r.beamStart.clone().addScaledVector(f, c), g.beamEnd = r.beamEnd.clone().addScaledVector(f, c), g.doorStart = r.doorStart.clone().addScaledVector(f, c), g.doorEnd = r.doorEnd.clone().addScaledVector(f, c), g.doorHeight = r.doorHeight, g.beamStart.z = g.beamEnd.z = g.doorStart.z + g.doorHeight) : !r.isPullOutDoor || L && r.isPullOutDoor && i ? (r.beamStart = z.clone().addScaledVector(u, c), r.beamEnd = B.clone().addScaledVector(u, c), r.doorStart = V.clone().addScaledVector(u, c), r.doorEnd = H.clone().addScaledVector(u, c), r.doorHeight = g.doorHeight, r.beamStart.z = r.beamEnd.z = r.doorStart.z + r.doorHeight) : (g.beamStart = r.beamStart.clone().addScaledVector(f, c), g.beamEnd = r.beamEnd.clone().addScaledVector(f, c), g.doorStart = r.doorStart.clone().addScaledVector(f, c), g.doorEnd = r.doorEnd.clone().addScaledVector(f, c), g.doorHeight = r.doorHeight, g.beamStart.z = g.beamEnd.z = g.doorStart.z + g.doorHeight)), w = g.nearId, b = r.beamStart.clone(), C = r.beamEnd.clone(), _ = !0;
1645
+ t < n ? t > e && !r.isPullOutDoor ? (r.beamStart = z.clone().addScaledVector(f, c), r.beamEnd = B.clone().addScaledVector(f, c), r.doorStart = V.clone().addScaledVector(f, c), r.doorEnd = H.clone().addScaledVector(f, c), r.doorHeight = _.doorHeight, r.beamStart.z = r.beamEnd.z = r.doorStart.z + r.doorHeight) : !L || L && r.isPullOutDoor && i ? (_.beamStart = r.beamStart.clone().addScaledVector(u, c), _.beamEnd = r.beamEnd.clone().addScaledVector(u, c), _.doorStart = r.doorStart.clone().addScaledVector(u, c), _.doorEnd = r.doorEnd.clone().addScaledVector(u, c), _.doorHeight = r.doorHeight, _.beamStart.z = _.beamEnd.z = _.doorStart.z + _.doorHeight) : (r.beamStart = z.clone().addScaledVector(f, c), r.beamEnd = B.clone().addScaledVector(f, c), r.doorStart = V.clone().addScaledVector(f, c), r.doorEnd = H.clone().addScaledVector(f, c), r.doorHeight = _.doorHeight, r.beamStart.z = r.beamEnd.z = r.doorStart.z + r.doorHeight) : t > n && (n > e && !L ? (_.beamStart = r.beamStart.clone().addScaledVector(f, c), _.beamEnd = r.beamEnd.clone().addScaledVector(f, c), _.doorStart = r.doorStart.clone().addScaledVector(f, c), _.doorEnd = r.doorEnd.clone().addScaledVector(f, c), _.doorHeight = r.doorHeight, _.beamStart.z = _.beamEnd.z = _.doorStart.z + _.doorHeight) : !r.isPullOutDoor || L && r.isPullOutDoor && i ? (r.beamStart = z.clone().addScaledVector(u, c), r.beamEnd = B.clone().addScaledVector(u, c), r.doorStart = V.clone().addScaledVector(u, c), r.doorEnd = H.clone().addScaledVector(u, c), r.doorHeight = _.doorHeight, r.beamStart.z = r.beamEnd.z = r.doorStart.z + r.doorHeight) : (_.beamStart = r.beamStart.clone().addScaledVector(f, c), _.beamEnd = r.beamEnd.clone().addScaledVector(f, c), _.doorStart = r.doorStart.clone().addScaledVector(f, c), _.doorEnd = r.doorEnd.clone().addScaledVector(f, c), _.doorHeight = r.doorHeight, _.beamStart.z = _.beamEnd.z = _.doorStart.z + _.doorHeight)), T = _.nearId, C = r.beamStart.clone(), w = r.beamEnd.clone(), b = !0;
1642
1646
  break;
1643
1647
  }
1644
1648
  }
1645
1649
  }
1646
- let T = !1;
1647
- if (!_) {
1650
+ let E = !1;
1651
+ if (!b) {
1648
1652
  let a = new e.Line3(V.clone(), H.clone());
1649
1653
  for (let o = 0; o < t.length; o++) {
1650
- if (t[o].length < .5 || o == i) continue;
1654
+ if (t[o].length < .5 || o == i || !t[o].checkResults) continue;
1651
1655
  let s = S(new e.Vector3(t[o].start.x, t[o].start.y, t[o].start.z), new e.Vector3(t[o].end.x, t[o].end.y, t[o].end.z), V, H);
1652
1656
  if (s && s.maxPerpendicularDistance < .3) {
1653
1657
  for (let i = 0; i < t[o].checkResults.length; i++) {
@@ -1672,37 +1676,37 @@ var L = class {
1672
1676
  }
1673
1677
  }
1674
1678
  if (n) break;
1675
- } else s && s.type == "collinear_overlap" && s.maxPerpendicularDistance > .3 && s.maxPerpendicularDistance < .7 && (T = !0);
1679
+ } else s && s.type == "collinear_overlap" && s.maxPerpendicularDistance > .3 && s.maxPerpendicularDistance < .7 && (E = !0);
1676
1680
  }
1677
1681
  if (n) continue;
1678
1682
  }
1679
- let E = !1;
1680
- if (w != -1) for (let e = 0; e < h.length && !(h[e].length == 1 && (h[e][0].id == l ? (h[e].push({
1681
- id: w,
1682
- beamStart: b,
1683
- beamEnd: C
1684
- }), E = !0) : h[e][0].id == w && (h[e].push({
1683
+ let A = !1;
1684
+ if (T != -1) for (let e = 0; e < h.length && !(h[e].length == 1 && (h[e][0].id == l ? (h[e].push({
1685
+ id: T,
1686
+ beamStart: C,
1687
+ beamEnd: w
1688
+ }), A = !0) : h[e][0].id == T && (h[e].push({
1685
1689
  id: l,
1686
1690
  beamStart: z,
1687
1691
  beamEnd: B
1688
- }), E = !0), E)); e++);
1689
- E || h.push([{
1692
+ }), A = !0), A)); e++);
1693
+ A || h.push([{
1690
1694
  id: l,
1691
1695
  beamStart: z,
1692
1696
  beamEnd: B
1693
1697
  }]);
1694
- let A = g.doorStart.distanceTo(g.doorEnd);
1695
- if (console.log("id:", l, i, A), s = I ? "door" : A > 1.8 || T && A > 1 ? "beam" : "hole", g.type = s, g.nearId != -1 && s == "hole") {
1698
+ let N = _.doorStart.distanceTo(_.doorEnd);
1699
+ if (g = I ? "door" : N > 1.8 || E && N > 1 ? "beam" : "hole", _.type = g, _.nearId != -1 && g == "hole") {
1696
1700
  let e = !1;
1697
1701
  for (let n = 0; n < t.length; n++) if (t[n].doorAndBeamData) {
1698
1702
  for (let r = 0; r < t[n].doorAndBeamData.length; r++) if (t[n].doorAndBeamData[r].nearId == l && t[n].doorAndBeamData[r].type == "beam") {
1699
- t[n].doorAndBeamData[r].type = s, e = !0;
1703
+ t[n].doorAndBeamData[r].type = g, e = !0;
1700
1704
  break;
1701
1705
  }
1702
1706
  if (e) break;
1703
1707
  }
1704
1708
  }
1705
- if (a.doorAndBeamData.push(g), u.push({
1709
+ if (a.doorAndBeamData.push(_), u.push({
1706
1710
  linesIndex: i,
1707
1711
  doorIndex: a.doorAndBeamData.length - 1
1708
1712
  }), l++, L && D < 2) break;
@@ -1829,7 +1833,7 @@ var L = class {
1829
1833
  lines: t,
1830
1834
  beamGroup: h
1831
1835
  };
1832
- }, U = (t, n) => {
1836
+ }, W = (t, n) => {
1833
1837
  if (t.length <= 0) return t;
1834
1838
  for (let n of t) {
1835
1839
  let t = [];
@@ -1920,7 +1924,7 @@ var L = class {
1920
1924
  }
1921
1925
  }
1922
1926
  return t;
1923
- }, W = (t, n) => {
1927
+ }, G = (t, n) => {
1924
1928
  let r = {
1925
1929
  rectangles: [],
1926
1930
  threeEdgeRect: []
@@ -2045,4 +2049,4 @@ var L = class {
2045
2049
  return r;
2046
2050
  };
2047
2051
  //#endregion
2048
- export { S as classifySegments, B as getAllGeometry, H as getBeamLine, W as getColLine, U as getMainBeamLine, y as getParallelism, D as getPointCloudMinMax, T as getPointCoverageOnQuad, m as isParallel, b as perpendicularInfo, k as removeNoisePoints, d as segmentsIntersect2D, V as usegetBeamLine };
2052
+ export { S as classifySegments, B as getAllGeometry, U as getBeamLine, G as getColLine, W as getMainBeamLine, y as getParallelism, D as getPointCloudMinMax, T as getPointCoverageOnQuad, m as isParallel, b as perpendicularInfo, k as removeNoisePoints, d as segmentsIntersect2D, H as usegetBeamLine };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rm-graphical-computing",
3
- "version": "1.0.29",
3
+ "version": "1.0.31",
4
4
  "description": "Three.js wall segment processing utilities.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",