iflow-engine-base 3.1.2 → 3.1.3
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.
|
@@ -1160,7 +1160,7 @@ void main() {
|
|
|
1160
1160
|
gl_FragColor = vec4(color, alpha);
|
|
1161
1161
|
}
|
|
1162
1162
|
`;class Bd{scene;camera;container;gridGroup;gridGeometry;gridMaterial;gridMesh;animationFrameId=null;resizeObserver;windowResizeHandler;lastState={zoom:-1,centerX:Number.NaN,centerY:Number.NaN,viewWidth:0,viewHeight:0,containerWidth:0,containerHeight:0,minorSpacing:0};largeGridColor=6052956;smallGridColor=3815994;desiredMinorPixelSize=28;coverageMultiplier=1.6;minSpacing=1e-4;minorThicknessPx=.4;majorThicknessPx=.6;minorLineOpacity=.05;majorLineOpacity=.2;baseRenderOrder=-20;gridZOffset=-.001;majorStep=5;gridUniforms={minorSpacing:{value:100},majorStep:{value:this.majorStep},worldPerPixel:{value:new b.Vector2(1,1)},minorThicknessPx:{value:this.minorThicknessPx},majorThicknessPx:{value:this.majorThicknessPx},minorColor:{value:new b.Color(this.smallGridColor)},majorColor:{value:new b.Color(this.largeGridColor)},minorOpacity:{value:this.minorLineOpacity},majorOpacity:{value:this.majorLineOpacity}};constructor(e,t,n){this.scene=e,this.camera=t,this.container=n,this.gridGroup=new b.Group,this.gridGroup.name="AdaptiveGridGroup",this.gridGroup.renderOrder=this.baseRenderOrder,this.gridGroup.visible=!0,this.gridGroup.position.set(0,0,this.gridZOffset),this.scene.add(this.gridGroup),this.createGridMesh(),this.updateGrid(!0),this.startMonitoring(),this.setupResizeObserver()}createGridMesh(){this.gridGeometry=new b.PlaneGeometry(1,1,1,1),this.gridMaterial=new b.ShaderMaterial({uniforms:this.gridUniforms,vertexShader:Id,fragmentShader:zd,transparent:!0,depthWrite:!1,depthTest:!1,side:b.DoubleSide,toneMapped:!1}),this.gridMesh=new b.Mesh(this.gridGeometry,this.gridMaterial),this.gridMesh.frustumCulled=!1,this.gridMesh.renderOrder=this.baseRenderOrder,this.gridGroup.add(this.gridMesh)}startMonitoring(){const e=()=>{this.updateGrid(),this.animationFrameId=requestAnimationFrame(e)};e()}stopMonitoring(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}setupResizeObserver(){typeof ResizeObserver<"u"?(this.resizeObserver=new ResizeObserver(()=>this.updateGrid(!0)),this.resizeObserver.observe(this.container)):(this.windowResizeHandler=()=>this.updateGrid(!0),window.addEventListener("resize",this.windowResizeHandler))}teardownResizeObserver(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=void 0),this.windowResizeHandler&&(window.removeEventListener("resize",this.windowResizeHandler),this.windowResizeHandler=void 0)}normalizeSpacing(e){const t=Math.max(e,this.minSpacing),n=Math.floor(Math.log10(t)),i=Math.pow(10,n),s=[1,2,5,10];for(const r of s){const a=r*i;if(t<=a)return a}return 10*i}updateGrid(e=!1){if(!this.gridMesh)return;const t=Math.max(1,this.container.clientWidth),n=Math.max(1,this.container.clientHeight),i=this.camera.zoom,s=this.camera.right-this.camera.left,r=this.camera.top-this.camera.bottom,a=Math.max(this.minSpacing,s/i),l=Math.max(this.minSpacing,r/i),c=this.camera.position.x,h=this.camera.position.y,d=a/t,m=l/n,p=d*this.desiredMinorPixelSize,f=this.normalizeSpacing(p),u=this.lastState;if(!e){const v=Math.abs(i-u.zoom)/Math.max(1e-4,u.zoom||1)>.02,w=Math.abs(f-u.minorSpacing)>u.minorSpacing*.05,x=Math.abs(c-u.centerX)>Math.max(f*.5,.01),M=Math.abs(h-u.centerY)>Math.max(f*.5,.01),T=Math.abs(a-u.viewWidth)>u.viewWidth*.01,P=Math.abs(l-u.viewHeight)>u.viewHeight*.01,k=t!==u.containerWidth||n!==u.containerHeight;if(!(v||w||x||M||T||P||k))return}const g=a*this.coverageMultiplier,y=l*this.coverageMultiplier;this.gridMesh.scale.set(g,y,1),this.gridMesh.position.set(c,h,0),this.gridUniforms.minorSpacing.value=f,this.gridUniforms.worldPerPixel.value.set(d,m),this.lastState={zoom:i,centerX:c,centerY:h,viewWidth:a,viewHeight:l,containerWidth:t,containerHeight:n,minorSpacing:f}}setVisible(e){this.gridGroup.visible=e}setColors(e,t){this.largeGridColor=e,this.smallGridColor=t,this.gridUniforms.majorColor.value.setHex(e),this.gridUniforms.minorColor.value.setHex(t)}setOpacity(e,t){this.minorLineOpacity=Math.max(0,Math.min(1,e)),this.majorLineOpacity=Math.max(0,Math.min(1,t)),this.gridUniforms.minorOpacity.value=this.minorLineOpacity,this.gridUniforms.majorOpacity.value=this.majorLineOpacity}dispose(){this.stopMonitoring(),this.teardownResizeObserver(),this.gridMesh&&this.gridGroup.remove(this.gridMesh),this.gridGeometry&&(this.gridGeometry.dispose(),this.gridGeometry=void 0),this.gridMaterial&&(this.gridMaterial.dispose(),this.gridMaterial=void 0),this.gridMesh=void 0}}class Od{engine;scene;options;adaptiveGrid;axesHelper;constructor(e,t){this.engine=e,this.options=t,this.scene=this.createScene(),this.initHelpers()}createScene(){const e=new b.Scene,t=this.options.backgroundColor??1710618;return e.background=new b.Color(t),e.is2D=!0,e}initHelpers(){this.options.axesEnabled&&this.createAxes()}initGrid(){this.options.gridEnabled&&this.createGrid()}createGrid(e=1e3,t=50){this.adaptiveGrid&&(this.adaptiveGrid.dispose(),this.adaptiveGrid=void 0),this.adaptiveGrid=new Bd(this.scene,this.engine.cameraModule2d.orthographicCamera,this.engine.renderModule2d.container);const n=this.options.backgroundColor??1710618;this.updateGridColorsByBackground(n)}createAxes(e=100){this.axesHelper&&this.scene.remove(this.axesHelper),this.axesHelper=new b.AxesHelper(e),this.axesHelper.rotation.z=0,this.scene.add(this.axesHelper),this.scene.remove(this.axesHelper),this.scene.add(this.axesHelper),this.axesHelper.renderOrder=999}setBackgroundColor(e){this.scene.background=new b.Color(e),this.updateGridColorsByBackground(e)}updateGridColorsByBackground(e){if(!this.adaptiveGrid)return;const t=new b.Color(e);.299*t.r+.587*t.g+.114*t.b<.5?(this.adaptiveGrid.setColors(16777215,16777215),this.adaptiveGrid.setOpacity(.2,.3)):(this.adaptiveGrid.setColors(0,0),this.adaptiveGrid.setOpacity(.05,.2))}addObject(e){this.scene.add(e)}removeObject(e){this.scene.remove(e),e instanceof b.Mesh&&(e.geometry.dispose(),Array.isArray(e.material)?e.material.forEach(t=>t.dispose()):e.material.dispose())}clearScene(){for(let e=this.scene.children.length-1;e>=0;e--){const t=this.scene.children[e];t!==this.axesHelper&&(this.adaptiveGrid||this.removeObject(t))}this.engine.events&&this.engine.events.trigger("scene-cleared")}getObjects(e=!1){const t=[];return this.scene.children.forEach(n=>{(e||n!==this.axesHelper)&&t.push(n)}),t}getSceneStats(){let e=0,t=0,n=0;return this.scene.children.forEach(i=>{i instanceof b.Mesh?e++:i instanceof b.Line?t++:i instanceof b.Group&&n++}),{objectCount:this.scene.children.length,meshCount:e,lineCount:t,groupCount:n}}setGridVisible(e){this.adaptiveGrid&&this.adaptiveGrid.setVisible(e)}setAxesVisible(e){this.axesHelper&&(this.axesHelper.visible=e)}dispose(){this.clearScene(),this.adaptiveGrid&&(this.adaptiveGrid.dispose(),this.adaptiveGrid=void 0),this.axesHelper&&(this.scene.remove(this.axesHelper),this.axesHelper=void 0),this.scene.clear()}}class Rd{engine;orthographicCamera;container;frustumSize=1e3;near=.1;far=1e4;initialZoom=1;defaultPosition=new b.Vector3(0,0,1e3);constructor(e,t){this.engine=e,this.container=t,this.orthographicCamera=this.createOrthographicCamera()}createOrthographicCamera(){const e=this.container.clientWidth/this.container.clientHeight,t=this.frustumSize/2,n=t*e,i=new b.OrthographicCamera(-n,n,t,-t,this.near,this.far);return i.position.copy(this.defaultPosition),i.lookAt(0,0,0),i.zoom=this.initialZoom,i.updateProjectionMatrix(),i}fitToExtents(e,t=1.2){const n=new b.Vector3(e.min[0],e.min[1]),i=new b.Vector3(e.max[0],e.max[1]);if(!(n.distanceTo(i)>.001)){console.warn("[CameraModule2d] Invalid extents, using default view"),this.resetView();return}const r=new b.Vector3;r.addVectors(n,i).multiplyScalar(.5);const a=new b.Vector3;a.subVectors(i,n);const c=Math.max(a.x,a.y)*t,h=this.container.clientWidth/this.container.clientHeight,d=c/2,m=d*h;this.orthographicCamera.left=-m,this.orthographicCamera.right=m,this.orthographicCamera.top=d,this.orthographicCamera.bottom=-d,this.orthographicCamera.position.set(r.x,r.y,this.defaultPosition.z),this.orthographicCamera.zoom=1,this.orthographicCamera.updateProjectionMatrix(),this.engine.events&&this.engine.events.trigger("camera-changed",{type:"fit-to-extents",center:r,size:a})}setZoom(e){this.orthographicCamera.zoom=e,this.orthographicCamera.updateProjectionMatrix(),this.engine.events&&this.engine.events.trigger("view-zoom-changed",{zoom:e})}getZoom(){return this.orthographicCamera.zoom}setPosition(e,t){this.orthographicCamera.position.set(e,t,this.defaultPosition.z),this.engine.events&&this.engine.events.trigger("view-pan-changed",{x:e,y:t})}getPosition(){return this.orthographicCamera.position.clone()}resetView(){this.orthographicCamera.position.copy(this.defaultPosition),this.orthographicCamera.zoom=this.initialZoom,this.orthographicCamera.updateProjectionMatrix(),this.engine.events&&this.engine.events.trigger("camera-reset")}getViewBounds(){const e=this.orthographicCamera,t=e.zoom,n=e.left/t,i=e.right/t,s=e.top/t,r=e.bottom/t,a=e.position.x,l=e.position.y;return{minX:a+n,maxX:a+i,minY:l+r,maxY:l+s,width:i-n,height:s-r}}screenToWorld(e,t){const n=new b.Vector3(e/this.container.clientWidth*2-1,-(t/this.container.clientHeight)*2+1,.5);return n.unproject(this.orthographicCamera),n}worldToScreen(e,t){const n=new b.Vector3(e,t,0);return n.project(this.orthographicCamera),{x:(n.x+1)/2*this.container.clientWidth,y:-(n.y-1)/2*this.container.clientHeight}}updateAspectRatio(){const e=this.container.clientWidth/this.container.clientHeight,t=this.frustumSize/2,n=t*e;this.orthographicCamera.left=-n,this.orthographicCamera.right=n,this.orthographicCamera.top=t,this.orthographicCamera.bottom=-t,this.orthographicCamera.updateProjectionMatrix()}setFrustumSize(e){this.frustumSize=e,this.updateAspectRatio()}getFrustumSize(){return this.frustumSize}dispose(){this.orthographicCamera=null}}class Nd{engine;renderer;container;options;antialias=!0;alpha=!1;precision="highp";constructor(e,t,n){this.engine=e,this.container=t,this.options=n,this.renderer=this.createRenderer(),this.handleResize()}createRenderer(){const e=new b.WebGLRenderer({antialias:this.antialias,alpha:this.alpha,precision:this.precision}),t=this.container.clientWidth,n=this.container.clientHeight;return e.setSize(t,n),e.setPixelRatio(window.devicePixelRatio),e.autoClear=!0,e.sortObjects=!0,e.setClearColor(this.options.backgroundColor??1710618),this.container.appendChild(e.domElement),e}render(e,t){const n=performance.now();this.engine.events&&this.engine.events.trigger("render-start"),this.renderer.render(e,t);const i=performance.now()-n;this.engine.events&&this.engine.events.trigger("render-end",{renderTime:i})}handleResize(){window.addEventListener("resize",()=>{this.onWindowResize()})}onWindowResize(){const e=this.container.clientWidth,t=this.container.clientHeight;this.renderer.setSize(e,t),this.engine.cameraModule2d&&this.engine.cameraModule2d.updateAspectRatio(),this.engine.scene&&this.engine.camera&&this.render(this.engine.scene,this.engine.camera)}setSize(e,t){this.renderer.setSize(e,t),this.engine.cameraModule2d&&this.engine.cameraModule2d.updateAspectRatio()}getSize(){const e=this.renderer.getSize(new b.Vector2);return{width:e.x,height:e.y}}setBackgroundColor(e){this.renderer.setClearColor(new b.Color(e))}setPixelRatio(e){this.renderer.setPixelRatio(e)}getPixelRatio(){return this.renderer.getPixelRatio()}setAntialias(e){console.warn("Antialias cannot be changed after renderer creation")}clear(e=!0,t=!0,n=!1){this.renderer.clear(e,t,n)}getInfo(){const e=this.renderer.getContext();return{renderer:this.renderer.capabilities.isWebGL2?"WebGL 2.0":"WebGL 1.0",version:this.renderer.capabilities.getVersion(),vendor:this.renderer.capabilities.vendor,capabilities:{maxTextureSize:this.renderer.capabilities.maxTextureSize,maxRenderbufferSize:this.renderer.capabilities.maxRenderbufferSize,maxVertexAttribs:this.renderer.capabilities.maxVertexAttribs,maxVaryingVectors:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS)}}}dispose(){window.removeEventListener("resize",this.onWindowResize.bind(this)),this.renderer.dispose(),this.container.contains(this.renderer.domElement)&&this.container.removeChild(this.renderer.domElement),this.renderer=null}}class Fd extends b.EventDispatcher{object;domElement;enabled=!0;enableZoom=!0;enablePan=!0;enableDamping=!1;dampingFactor=.05;zoomSpeed=1;minZoom=0;maxZoom=1/0;isDragging=!1;mouseButton=-1;previousMousePosition=new b.Vector2;targetPosition=new b.Vector3;targetZoom=1;lastClickTime=0;doubleClickDelay=300;constructor(e,t){super(),this.object=e,this.domElement=t||document,this.targetPosition.copy(e.position),this.targetZoom=e.zoom,this.bindEvents()}bindEvents(){this.domElement.addEventListener("mousedown",this.onMouseDown.bind(this)),this.domElement.addEventListener("mousemove",this.onMouseMove.bind(this)),this.domElement.addEventListener("mouseup",this.onMouseUp.bind(this)),this.domElement.addEventListener("mouseleave",this.onMouseUp.bind(this)),this.domElement.addEventListener("wheel",this.onWheel.bind(this),{passive:!1}),this.domElement.addEventListener("dblclick",this.onDoubleClick.bind(this)),this.domElement.addEventListener("click",this.onClick.bind(this)),this.domElement.addEventListener("touchstart",this.onTouchStart.bind(this),{passive:!1}),this.domElement.addEventListener("touchmove",this.onTouchMove.bind(this),{passive:!1}),this.domElement.addEventListener("touchend",this.onTouchEnd.bind(this)),this.domElement.addEventListener("contextmenu",e=>{e.preventDefault()})}onMouseDown(e){this.enabled&&this.enablePan&&(e.button===0||e.button===1)&&(this.isDragging=!0,this.mouseButton=e.button,this.previousMousePosition.set(e.clientX,e.clientY),this.dispatchEvent({type:"start"}))}onMouseMove(e){if(!this.enabled||!this.isDragging)return;const t=e.clientX-this.previousMousePosition.x,n=e.clientY-this.previousMousePosition.y,s=1/this.object.zoom,r=this.object.top-this.object.bottom,a=this.object.right-this.object.left,l=t/this.domElement.clientWidth*a*s,c=n/this.domElement.clientHeight*r*s;this.targetPosition.x-=l,this.targetPosition.y+=c,this.enableDamping||(this.object.position.copy(this.targetPosition),this.object.updateProjectionMatrix()),this.previousMousePosition.set(e.clientX,e.clientY),this.dispatchEvent({type:"change"})}onMouseUp(e){this.isDragging&&(this.isDragging=!1,this.mouseButton=-1,this.dispatchEvent({type:"end"}))}onWheel(e){if(!this.enabled||!this.enableZoom)return;e.preventDefault();const t=Math.pow(1.1,-Math.sign(e.deltaY)*this.zoomSpeed),n=this.targetZoom;this.targetZoom*=t,this.minZoom>0&&(this.targetZoom=Math.max(this.minZoom,this.targetZoom)),this.maxZoom!==1/0&&(this.targetZoom=Math.min(this.targetZoom,this.maxZoom));const i=this.targetZoom,s=(this.object.right-this.object.left)/2,r=(this.object.top-this.object.bottom)/2,a=this.domElement.getBoundingClientRect(),l=(e.clientX-a.left)/a.width*2-1,c=-((e.clientY-a.top)/a.height)*2+1;this.targetPosition.x+=l*s*(1/n-1/i),this.targetPosition.y+=c*r*(1/n-1/i),this.enableDamping||(this.object.zoom=i,this.object.position.copy(this.targetPosition),this.object.updateProjectionMatrix()),this.dispatchEvent({type:"change"})}onDoubleClick(e){this.enabled&&this.dispatchEvent({type:"doubleClick",event:e})}onClick(e){const t=performance.now();t-this.lastClickTime<this.doubleClickDelay||(this.lastClickTime=t)}onTouchStart(e){if(!this.enabled||e.touches.length!==1)return;e.preventDefault();const t=e.touches[0];this.isDragging=!0,this.previousMousePosition.set(t.clientX,t.clientY),this.dispatchEvent({type:"start"})}onTouchMove(e){if(!this.enabled||!this.isDragging)return;e.preventDefault();const t=e.touches[0],n=t.clientX-this.previousMousePosition.x,i=t.clientY-this.previousMousePosition.y,r=1/this.object.zoom,a=this.object.top-this.object.bottom,l=this.object.right-this.object.left,c=n/this.domElement.clientWidth*l*r,h=i/this.domElement.clientHeight*a*r;this.targetPosition.x-=c,this.targetPosition.y+=h,this.enableDamping||this.object.position.copy(this.targetPosition),this.previousMousePosition.set(t.clientX,t.clientY),this.dispatchEvent({type:"change"})}onTouchEnd(e){this.isDragging&&(this.isDragging=!1,this.dispatchEvent({type:"end"}))}update(){if(this.enabled&&this.enableDamping){const e=1-this.dampingFactor;this.object.position.x+=(this.targetPosition.x-this.object.position.x)*e,this.object.position.y+=(this.targetPosition.y-this.object.position.y)*e,this.object.zoom+=(this.targetZoom-this.object.zoom)*e,this.object.updateProjectionMatrix()}}reset(){this.targetPosition.set(0,0,this.object.position.z),this.targetZoom=1,this.enableDamping||(this.object.position.copy(this.targetPosition),this.object.zoom=this.targetZoom,this.object.updateProjectionMatrix()),this.dispatchEvent({type:"reset"})}setPosition(e,t){this.targetPosition.set(e,t,this.object.position.z),this.enableDamping||this.object.position.copy(this.targetPosition),this.dispatchEvent({type:"change"})}setZoom(e){this.targetZoom=e,this.minZoom>0&&(this.targetZoom=Math.max(this.minZoom,this.targetZoom)),this.maxZoom!==1/0&&(this.targetZoom=Math.min(this.targetZoom,this.maxZoom)),this.enableDamping||(this.object.zoom=this.targetZoom,this.object.updateProjectionMatrix()),this.dispatchEvent({type:"change"})}dispose(){this.enabled=!1,this.domElement.removeEventListener("mousedown",this.onMouseDown.bind(this)),this.domElement.removeEventListener("mousemove",this.onMouseMove.bind(this)),this.domElement.removeEventListener("mouseup",this.onMouseUp.bind(this)),this.domElement.removeEventListener("mouseleave",this.onMouseUp.bind(this)),this.domElement.removeEventListener("wheel",this.onWheel.bind(this)),this.domElement.removeEventListener("dblclick",this.onDoubleClick.bind(this)),this.domElement.removeEventListener("click",this.onClick.bind(this)),this.domElement.removeEventListener("touchstart",this.onTouchStart.bind(this)),this.domElement.removeEventListener("touchmove",this.onTouchMove.bind(this)),this.domElement.removeEventListener("touchend",this.onTouchEnd.bind(this))}}class Ud{engine;panControls;isActive=!0;constructor(e){this.engine=e,this.panControls=this.createPanControls(),this.init()}init(){this.panControls.addEventListener("doubleClick",this.onDoubleClick.bind(this)),this.panControls.addEventListener("change",this.onChange.bind(this))}createPanControls(){const e=new Fd(this.engine.camera,this.engine.renderer.domElement);return e.enableZoom=!0,e.enablePan=!0,e.enableDamping=!0,e.dampingFactor=.05,e.zoomSpeed=1,e.minZoom=0,e.maxZoom=1/0,e}onDoubleClick(e){this.engine.cameraModule2d&&this.engine.cameraModule2d.resetView()}onChange(){this.engine.events&&this.engine.events.trigger("camera-changed",{type:"user-interaction"})}active(){this.isActive=!0,this.panControls.enabled=!0}disActive(){this.isActive=!1,this.panControls.enabled=!1}update(){this.isActive&&this.panControls.update()}reset(){this.panControls.reset()}setPosition(e,t){this.panControls.setPosition(e,t)}setZoom(e){this.panControls.setZoom(e)}getZoom(){return this.panControls.object.zoom}setEnableZoom(e){this.panControls.enableZoom=e}setEnablePan(e){this.panControls.enablePan=e}setEnableDamping(e){this.panControls.enableDamping=e}setDampingFactor(e){this.panControls.dampingFactor=Math.max(0,Math.min(e,1))}setZoomSpeed(e){this.panControls.zoomSpeed=Math.max(.1,e)}setZoomLimits(e,t){this.panControls.minZoom=e,this.panControls.maxZoom=t}dispose(){this.panControls.dispose(),this.panControls=null}}class Vd extends _.Loader{constructor(e){super(e)}load(e,t,n,i){const s=this,r=new _.FileLoader(this.manager);r.setPath(this.path),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,function(a){const l=s.parse(JSON.parse(a));t&&t(l)},n,i)}parse(e){return new jd(e)}}class jd{constructor(e){this.isFont=!0,this.type="Font",this.data=e}generateShapes(e,t=100,n="ltr"){const i=[],s=Gd(e,t,this.data,n);for(let r=0,a=s.length;r<a;r++)i.push(...s[r].toShapes());return i}}function Gd(o,e,t,n){const i=Array.from(o),s=e/t.resolution,r=(t.boundingBox.yMax-t.boundingBox.yMin+t.underlineThickness)*s,a=[];let l=0,c=0;(n=="rtl"||n=="tb")&&i.reverse();for(let h=0;h<i.length;h++){const d=i[h];if(d===`
|
|
1163
|
-
`)l=0,c-=r;else{const m=Wd(d,s,l,c,t);n=="tb"?(l=0,c+=t.ascender*s):l+=m.offsetX,a.push(m.path)}}return a}function Wd(o,e,t,n,i){const s=i.glyphs[o]||i.glyphs["?"];if(!s){console.error('THREE.Font: character "'+o+'" does not exists in font family '+i.familyName+".");return}const r=new _.ShapePath;let a,l,c,h,d,m,p,f;if(s.o){const u=s._cachedOutline||(s._cachedOutline=s.o.split(" "));for(let g=0,y=u.length;g<y;)switch(u[g++]){case"m":a=u[g++]*e+t,l=u[g++]*e+n,r.moveTo(a,l);break;case"l":a=u[g++]*e+t,l=u[g++]*e+n,r.lineTo(a,l);break;case"q":c=u[g++]*e+t,h=u[g++]*e+n,d=u[g++]*e+t,m=u[g++]*e+n,r.quadraticCurveTo(d,m,c,h);break;case"b":c=u[g++]*e+t,h=u[g++]*e+n,d=u[g++]*e+t,m=u[g++]*e+n,p=u[g++]*e+t,f=u[g++]*e+n,r.bezierCurveTo(d,m,p,f,c,h);break}}return{offsetX:s.ha*e,path:r}}class Xd extends _.ExtrudeGeometry{constructor(e,t={}){const n=t.font;if(n===void 0)super();else{const i=n.generateShapes(e,t.size,t.direction);t.depth===void 0&&(t.depth=50),t.bevelThickness===void 0&&(t.bevelThickness=10),t.bevelSize===void 0&&(t.bevelSize=8),t.bevelEnabled===void 0&&(t.bevelEnabled=!1),super(i,t)}this.type="TextGeometry"}}class Zd{engine;data=null;enableValidation=!0;constructor(e){this.engine=e}async loadModel(e,t={}){if(!e.includes(".json"))Wi(e
|
|
1163
|
+
`)l=0,c-=r;else{const m=Wd(d,s,l,c,t);n=="tb"?(l=0,c+=t.ascender*s):l+=m.offsetX,a.push(m.path)}}return a}function Wd(o,e,t,n,i){const s=i.glyphs[o]||i.glyphs["?"];if(!s){console.error('THREE.Font: character "'+o+'" does not exists in font family '+i.familyName+".");return}const r=new _.ShapePath;let a,l,c,h,d,m,p,f;if(s.o){const u=s._cachedOutline||(s._cachedOutline=s.o.split(" "));for(let g=0,y=u.length;g<y;)switch(u[g++]){case"m":a=u[g++]*e+t,l=u[g++]*e+n,r.moveTo(a,l);break;case"l":a=u[g++]*e+t,l=u[g++]*e+n,r.lineTo(a,l);break;case"q":c=u[g++]*e+t,h=u[g++]*e+n,d=u[g++]*e+t,m=u[g++]*e+n,r.quadraticCurveTo(d,m,c,h);break;case"b":c=u[g++]*e+t,h=u[g++]*e+n,d=u[g++]*e+t,m=u[g++]*e+n,p=u[g++]*e+t,f=u[g++]*e+n,r.bezierCurveTo(d,m,p,f,c,h);break}}return{offsetX:s.ha*e,path:r}}class Xd extends _.ExtrudeGeometry{constructor(e,t={}){const n=t.font;if(n===void 0)super();else{const i=n.generateShapes(e,t.size,t.direction);t.depth===void 0&&(t.depth=50),t.bevelThickness===void 0&&(t.bevelThickness=10),t.bevelSize===void 0&&(t.bevelSize=8),t.bevelEnabled===void 0&&(t.bevelEnabled=!1),super(i,t)}this.type="TextGeometry"}}class Zd{engine;data=null;enableValidation=!0;constructor(e){this.engine=e}async loadModel(e,t={}){if(!e.includes(".json"))Wi(e,n=>{const i=JSON.parse(n);this.engine.dwgData=i,this.data=i,this.buildScene(i),this.engine.fitToView(),this.engine.layerManager._loadLayers()});else{this.engine.events&&this.engine.events.trigger(_n.ModelLoadStart,{url:e});const n=await this.fetchJson(e),i=this.parseData(n);if(this.engine.dwgData=i,!i)throw new Error("Failed to parse DWG data");this.data=i,await this.buildScene(i),this.engine.fitToView(),this.engine.layerManager._loadLayers()}}async fetchJson(e){const t=await fetch(e);if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);return await t.json()}parseData(e){return e?this.enableValidation&&!this.validateDataStructure(e)?(console.error("[LoaderModule2d] Invalid data structure"),null):e:(console.error("[LoaderModule2d] Empty JSON data"),null)}validateDataStructure(e){return e.version||console.warn("[LoaderModule2d] Missing version"),e.metadata||console.warn("[LoaderModule2d] Missing metadata"),Array.isArray(e.layers)?Array.isArray(e.entities)?!0:(console.error("[LoaderModule2d] Invalid or missing entities array"),!1):(console.error("[LoaderModule2d] Invalid or missing layers array"),!1)}model={};totalBlock=new Map;font=null;loadFont(){return new Promise((e,t)=>{new Vd().load("https://threejs.org/examples/fonts/helvetiker_regular.typeface.json",e,void 0,t)})}async buildScene(e){this.font=await this.loadFont(),this.model.layers=e.layers,this.model.modelMap=new Map,this.model.hatchMap=new Map,this.model.textMap=new Map,console.log(this.model.layers),e.blocks.forEach(t=>{this.loadBlock(t,t.name,!0)}),this.loadBlock({entities:e.entities},"",!1),this.model.modelMap.forEach((t,n)=>{let i=[];if(t.forEach(r=>{i.push(...r)}),i.length!=0){const r=new b.BufferGeometry().setFromPoints(i);let a=parseInt(n.split("||")[1]);if(a==0){var s=this.model.layers.find(h=>h.name==n.split("||")[0]);a=s.color}const l=new b.LineBasicMaterial({color:a}),c=new b.LineSegments(r,l);c.name=n,this.engine.scene.add(c)}}),this.model.textMap.forEach((t,n)=>{let i=cn(t.map(c=>c.geometry),!1),s=parseInt(n.split("||")[1]);if(s==0){var r=this.model.layers.find(c=>c.name==n.split("||")[0]);s=r.color}const a=new b.LineBasicMaterial({color:s});let l=new b.Mesh(i,a);l.name=n,this.engine.scene.add(l)}),this.model.hatchMap.forEach((t,n)=>{let i=cn(t.map(c=>c.geometry),!1),s=parseInt(n.split("||")[1]);if(s==0){var r=this.model.layers.find(c=>c.name==n.split("||")[0]);s=r.color}const a=new b.MeshBasicMaterial({color:s,side:b.DoubleSide,transparent:!0,opacity:.5});let l=new b.Mesh(i,a);l.name=n,this.engine.scene.add(l)})}loadBlock(e,t,n,i=0){let s=[0,0,0];n&&(s=e.origin),e.entities.forEach(r=>{const a=r.layer+"||"+r.color;let l=new Map;n?(l=this.totalBlock.get(t),l==null&&(l=new Map,this.totalBlock.set(t,l))):(l=this.model.modelMap.get(a),l==null&&(l=new Map,this.model.modelMap.set(a,l)));let c=[];switch(r.type){case"LINE":c=this.getPoint_line(r,s);break;case"CIRCLE":c=this.getPoint_arc(r,s);break;case"POLYLINE":c=this.getPoint_polyline(r,s);break;case"MTEXT":this.create_text(r);break;case"HATCH":this.create_hatch(r);break;case"INSERT":if(n==!1){let h=this.totalBlock.get(r.blockId);h?.forEach(m=>{c.push(...m.map(p=>p.clone()))});const d=this.getMatrix(r.position,r.scale,r.rotation);c.forEach(m=>{m.applyMatrix4(d)})}break;default:return console.warn(`[LoaderModule2d] Unknown entity type: ${r.type}`),null}l.has(r.linkId)?l.get(r.linkId).push(...c):l.set(r.linkId,c)})}getPoint_polyline(e,t){let n=[];for(let i=0;i<e.points.length-1;i++)n.push(new b.Vector3(e.points[i].x,e.points[i].y,0)),n.push(new b.Vector3(e.points[i+1].x,e.points[i+1].y,0));return e.closed&&(n.push(new b.Vector3(e.points[e.points.length-1].x,e.points[e.points.length-1].y,0)),n.push(new b.Vector3(e.points[0].x,e.points[0].y,0))),n.forEach(i=>{i[0]=i[0]-t[0],i[1]=i[1]-t[1]}),n}create_hatch(e){if(!e.loops||e.loops.length===0)return;const t=e.loops.filter(a=>a.type===!0),n=e.loops.filter(a=>a.type===!1),i=[];for(const a of t){if(!a.points||a.points.length<3)continue;const l=new b.Shape;l.moveTo(a.points[0][0],a.points[0][1]);for(let c=1;c<a.points.length;c++)l.lineTo(a.points[c][0],a.points[c][1]);l.closePath();for(const c of n){if(!c.points||c.points.length<3)continue;const h=new b.Path;h.moveTo(c.points[0][0],c.points[0][1]);for(let d=1;d<c.points.length;d++)h.lineTo(c.points[d][0],c.points[d][1]);h.closePath(),l.holes.push(h)}i.push(new b.ShapeGeometry(l))}if(i.length===0)return;const s=i.length===1?i[0]:cn(i,!1),r=e.layer+"||"+e.color;this.model.hatchMap.has(r)?this.model.hatchMap.get(r).push({geometry:s,info:e}):this.model.hatchMap.set(r,[{geometry:s,info:e}])}create_text(e){if(!this.font||!e.text)return;const t=new Xd(e.text,{font:this.font,size:e.height??100,depth:0});e.position[1]=e.position[1]-e.height;const n=this.getMatrix(e.position,[1,1,1],e.rotation);t.applyMatrix4(n);const i=e.layer+"||"+e.color;this.model.textMap.has(i)?this.model.textMap.get(i).push({geometry:t,info:e}):this.model.textMap.set(i,[{geometry:t,info:e}])}getPoint_line(e,t){const n=new b.Vector3(e.startPoint[0],e.startPoint[1],e.startPoint[2]||0),i=new b.Vector3(e.endPoint[0],e.endPoint[1],e.endPoint[2]||0);let s=[n,i];return s.forEach(r=>{r[0]=r[0]-t[0],r[1]=r[1]-t[1]}),s}getPoint_arc(e,t){const n=e.center[0],i=e.center[1],s=e.radius,a=new b.EllipseCurve(n,i,s,s,e.startAngle,e.endAngle,!1,0).getPoints(30).map(c=>new b.Vector3(c.x,c.y,0));let l=[];for(let c=0;c<a.length-1;c++)l.push(a[c].clone()),l.push(a[c+1].clone());return l.forEach(c=>{c[0]=c[0]-t[0],c[1]=c[1]-t[1]}),l}getMatrix(e,t,n){const i=new b.Vector3(e[0],e[1],e[2]),s=new b.Euler(0,0,n),r=new b.Vector3(t[0],t[1],t[2]),a=new b.Quaternion;a.setFromEuler(s);const l=new b.Matrix4;return l.compose(i,a,r),l}getData(){return this.data}getEntitiesByLayer(e){return this.data?this.data.entities.filter(t=>t.layer===e):[]}getLayers(){return this.data?this.data.layers:[]}clear(){this.data=null}dispose(){this.clear()}}class Yd{panel=null;listEl=null;isVisible=!1;delegate;constructor(e,t){this.delegate=t,this._buildPanel(e)}show(){this.panel&&(this.panel.style.display="flex",this.isVisible=!0)}hide(){this.panel&&(this.panel.style.display="none",this.isVisible=!1)}toggle(){this.isVisible?this.hide():this.show()}refresh(){this._renderList()}_buildPanel(e){const t=document.createElement("div");t.style.cssText=`
|
|
1164
1164
|
position:absolute; top:10px; right:10px;
|
|
1165
1165
|
width:220px; max-height:480px;
|
|
1166
1166
|
background:var(--e2d-bg,#1e1f22);
|