iflow-engine-base 3.8.3 → 3.8.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"dwg-preview.umd.js","sources":["../node_modules/stats.js/build/stats.min.js","../src/core2d/v2/modules/eventModule2d.ts","../src/core2d/v2/modules/adaptiveGrid.ts","../src/core2d/v2/modules/sceneModule2d.ts","../src/core2d/v2/status/engineStatus2d.ts","../src/core2d/v2/modules/cameraModule2d.ts","../src/core2d/v2/modules/renderModule2d.ts","../src/core2d/v2/controls/Pan2dControls.ts","../src/core2d/v2/modules/controlModule2d.ts","../node_modules/three/examples/jsm/loaders/FontLoader.js","../src/common/FontJsonGenerator.ts","../src/core2d/v2/ui/layerPanelUI.ts","../src/core2d/v2/managers/layer/index.ts","../src/core2d/v2/loader/geometryUtils.ts","../src/core2d/v2/loader/BlockFlattener.ts","../node_modules/jszip/dist/jszip.min.js","../src/core2d/v2/loader/CadDataSource.ts","../node_modules/three/examples/jsm/curves/NURBSUtils.js","../node_modules/three/examples/jsm/curves/NURBSCurve.js","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../src/core2d/v2/loader/HatchPatternRenderer.ts","../src/core2d/v2/loader/EntityGeometryFactory.ts","../src/core2d/v2/loader/SceneBatchBuilder.ts","../src/core2d/v2/loader/TextGeometryFactory.ts","../src/core2d/v2/modules/loaderModule2d.ts","../src/common/WorldToScreen.ts","../src/core2d/v2/managers/octreeBox2d/index.ts","../src/core2d/v2/managers/linkView2d3d/index.ts","../src/core2d/v2/managers/linkElement2d3d/index.ts","../src/core2d/v2/modules/modelToolModule2d.ts","../src/core2d/v2/status/handelBehaved2d.ts","../src/core2d/v2/ui/mouseCoordUI.ts","../src/core2d/v2/enum/eventType.ts","../src/core2d/v2/modules/interactionModule2d.ts","../src/core2d/v2/ui/cadCursorUI.ts","../src/core2d/v2/ui/contextMenuUI.ts","../src/core2d/v2/ui/loadingUI.ts","../src/core2d/v2/ui/searchUI.ts","../src/core2d/v2/managers/search/index.ts","../src/core2d/v2/theme/index.ts","../src/core2d/v2/EngineKernel2d.ts"],"sourcesContent":["// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?\"block\":\"none\";l=a}var l=0,c=document.createElement(\"div\");c.style.cssText=\"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";c.addEventListener(\"click\",function(a){a.preventDefault();\nu(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel(\"FPS\",\"#0ff\",\"#002\")),h=e(new f.Panel(\"MS\",\"#0f0\",\"#020\"));if(self.performance&&self.performance.memory)var t=e(new f.Panel(\"MB\",\"#f08\",\"#201\"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","/**\r\n * 2D 引擎事件系统模块\r\n * 简化版事件系统,支持发布/订阅模式\r\n */\r\n\r\n/**\r\n * 事件类型枚举\r\n */\r\nexport enum EventType2d {\r\n // 模型加载事件\r\n ModelLoadStart = 'model-load-start',\r\n ModelLoadProgress = 'model-load-progress',\r\n ModelLoaded = 'model-loaded',\r\n ModelLoadError = 'model-load-error',\r\n\r\n // 渲染事件\r\n RenderStart = 'render-start',\r\n RenderEnd = 'render-end',\r\n\r\n // 相机事件\r\n CameraChanged = 'camera-changed',\r\n CameraReset = 'camera-reset',\r\n\r\n // 交互事件\r\n SelectionChanged = 'selection-changed',\r\n HoverChanged = 'hover-changed',\r\n EntityClick = 'entity-click',\r\n\r\n // 图层事件\r\n LayerVisibilityChanged = 'layer-visibility-changed',\r\n LayerColorChanged = 'layer-color-changed',\r\n\r\n // 视图事件\r\n ViewZoomChanged = 'view-zoom-changed',\r\n ViewPanChanged = 'view-pan-changed',\r\n\r\n // 工具事件\r\n ToolActivated = 'tool-activated',\r\n ToolDeactivated = 'tool-deactivated',\r\n\r\n // 错误事件\r\n Error = 'error',\r\n Warning = 'warning',\r\n}\r\n\r\n/**\r\n * 事件监听器函数类型\r\n */\r\nexport type EventListener = (data?: any) => void;\r\n\r\n/**\r\n * 事件监听器映射\r\n */\r\ntype EventListenersMap = Map<EventType2d, Set<EventListener>>;\r\n\r\n/**\r\n * 事件模块类\r\n */\r\nexport class EventModule2d {\r\n private listeners: EventListenersMap = new Map();\r\n private onceListeners: EventListenersMap = new Map();\r\n private debugMode: boolean = false;\r\n\r\n constructor(debugMode: boolean = false) {\r\n this.debugMode = debugMode;\r\n this.initializeEvents();\r\n }\r\n\r\n /**\r\n * 初始化所有事件类型\r\n */\r\n private initializeEvents(): void {\r\n const eventTypes = Object.values(EventType2d);\r\n eventTypes.forEach(type => {\r\n this.listeners.set(type as EventType2d, new Set());\r\n this.onceListeners.set(type as EventType2d, new Set());\r\n });\r\n }\r\n\r\n /**\r\n * 订阅事件\r\n * @param type 事件类型\r\n * @param listener 监听器函数\r\n * @returns 取消订阅的函数\r\n */\r\n public on(type: EventType2d, listener: EventListener): () => void {\r\n if (!this.listeners.has(type)) {\r\n console.warn(`Event type ${type} is not registered`);\r\n return () => {};\r\n }\r\n\r\n this.listeners.get(type)!.add(listener);\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Listener added for ${type}`);\r\n }\r\n\r\n // 返回取消订阅的函数\r\n return () => this.off(type, listener);\r\n }\r\n\r\n /**\r\n * 订阅一次性事件\r\n * @param type 事件类型\r\n * @param listener 监听器函数\r\n */\r\n public once(type: EventType2d, listener: EventListener): void {\r\n if (!this.onceListeners.has(type)) {\r\n console.warn(`Event type ${type} is not registered`);\r\n return;\r\n }\r\n\r\n this.onceListeners.get(type)!.add(listener);\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Once listener added for ${type}`);\r\n }\r\n }\r\n\r\n /**\r\n * 取消订阅事件\r\n * @param type 事件类型\r\n * @param listener 监听器函数\r\n */\r\n public off(type: EventType2d, listener: EventListener): void {\r\n const typeListeners = this.listeners.get(type);\r\n if (typeListeners) {\r\n typeListeners.delete(listener);\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Listener removed for ${type}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 触发事件\r\n * @param type 事件类型\r\n * @param data 事件数据\r\n */\r\n public trigger(type: EventType2d, data?: any): void {\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Triggering ${type}`, data);\r\n }\r\n\r\n // 触发普通监听器\r\n const typeListeners = this.listeners.get(type);\r\n if (typeListeners && typeListeners.size > 0) {\r\n typeListeners.forEach(listener => {\r\n try {\r\n listener(data);\r\n } catch (error) {\r\n console.error(`[EventModule2d] Error in listener for ${type}:`, error);\r\n }\r\n });\r\n }\r\n\r\n // 触发一次性监听器\r\n const onceTypeListeners = this.onceListeners.get(type);\r\n if (onceTypeListeners && onceTypeListeners.size > 0) {\r\n onceTypeListeners.forEach(listener => {\r\n try {\r\n listener(data);\r\n } catch (error) {\r\n console.error(`[EventModule2d] Error in once listener for ${type}:`, error);\r\n }\r\n });\r\n // 清空一次性监听器\r\n onceTypeListeners.clear();\r\n }\r\n }\r\n\r\n /**\r\n * 移除所有监听器\r\n */\r\n public removeAllListeners(): void {\r\n this.listeners.forEach(set => set.clear());\r\n this.onceListeners.forEach(set => set.clear());\r\n\r\n if (this.debugMode) {\r\n console.log('[EventModule2d] All listeners removed');\r\n }\r\n }\r\n\r\n /**\r\n * 移除指定类型的所有监听器\r\n * @param type 事件类型\r\n */\r\n public removeListenersOfType(type: EventType2d): void {\r\n const typeListeners = this.listeners.get(type);\r\n const onceTypeListeners = this.onceListeners.get(type);\r\n\r\n if (typeListeners) {\r\n typeListeners.clear();\r\n }\r\n if (onceTypeListeners) {\r\n onceTypeListeners.clear();\r\n }\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] All listeners removed for ${type}`);\r\n }\r\n }\r\n\r\n /**\r\n * 获取指定类型的监听器数量\r\n * @param type 事件类型\r\n * @returns 监听器数量\r\n */\r\n public getListenerCount(type: EventType2d): number {\r\n const typeListeners = this.listeners.get(type);\r\n const onceTypeListeners = this.onceListeners.get(type);\r\n\r\n const count = (typeListeners?.size || 0) + (onceTypeListeners?.size || 0);\r\n return count;\r\n }\r\n\r\n /**\r\n * 设置调试模式\r\n * @param enabled 是否启用调试模式\r\n */\r\n public setDebugMode(enabled: boolean): void {\r\n this.debugMode = enabled;\r\n }\r\n\r\n /**\r\n * 获取所有事件类型\r\n * @returns 事件类型数组\r\n */\r\n public getAllEventTypes(): EventType2d[] {\r\n return Object.values(EventType2d);\r\n }\r\n\r\n /**\r\n * 销毁事件模块\r\n */\r\n public dispose(): void {\r\n this.removeAllListeners();\r\n this.listeners.clear();\r\n this.onceListeners.clear();\r\n\r\n if (this.debugMode) {\r\n console.log('[EventModule2d] Disposed');\r\n }\r\n }\r\n}\r\n\r\nexport default EventModule2d;\r\n","import * as THREE from 'three';\n\nconst GRID_VERTEX_SHADER = `\n varying vec2 vWorldPos;\n\n void main() {\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPos = worldPosition.xy;\n gl_Position = projectionMatrix * viewMatrix * worldPosition;\n }\n`;\n\nconst GRID_FRAGMENT_SHADER = `\n precision highp float;\n\n varying vec2 vWorldPos;\n\n uniform float minorSpacing;\n uniform float majorStep;\n uniform vec2 worldPerPixel;\n uniform float minorThicknessPx;\n uniform float majorThicknessPx;\n uniform vec3 minorColor;\n uniform vec3 majorColor;\n uniform float minorOpacity;\n uniform float majorOpacity;\n\n float distanceToGridLine(float coord, float spacing) {\n float halfSpacing = spacing * 0.5;\n float wrapped = mod(coord + halfSpacing, spacing) - halfSpacing;\n return abs(wrapped);\n }\n\n void main() {\n float spacing = max(minorSpacing, 1e-6);\n float stepMultiplier = max(majorStep, 1.0);\n float majorSpacing = spacing * stepMultiplier;\n\n float distMinorX = distanceToGridLine(vWorldPos.x, spacing);\n float distMinorY = distanceToGridLine(vWorldPos.y, spacing);\n float distMajorX = distanceToGridLine(vWorldPos.x, majorSpacing);\n float distMajorY = distanceToGridLine(vWorldPos.y, majorSpacing);\n\n float minorThicknessX = max(worldPerPixel.x * minorThicknessPx, 1e-7);\n float minorThicknessY = max(worldPerPixel.y * minorThicknessPx, 1e-7);\n float majorThicknessX = max(worldPerPixel.x * majorThicknessPx, 1e-7);\n float majorThicknessY = max(worldPerPixel.y * majorThicknessPx, 1e-7);\n\n float minorMaskX = 1.0 - smoothstep(minorThicknessX, minorThicknessX * 1.5, distMinorX);\n float minorMaskY = 1.0 - smoothstep(minorThicknessY, minorThicknessY * 1.5, distMinorY);\n float majorMaskX = 1.0 - smoothstep(majorThicknessX, majorThicknessX * 1.5, distMajorX);\n float majorMaskY = 1.0 - smoothstep(majorThicknessY, majorThicknessY * 1.5, distMajorY);\n\n float majorMask = clamp(max(majorMaskX, majorMaskY), 0.0, 1.0);\n float minorMask = clamp(max(minorMaskX, minorMaskY), 0.0, 1.0);\n minorMask *= (1.0 - majorMask); // Prevent overlap so bold lines dominate.\n\n vec3 color = minorColor * minorMask * minorOpacity + majorColor * majorMask * majorOpacity;\n float alpha = minorMask * minorOpacity + majorMask * majorOpacity;\n alpha = clamp(alpha, 0.0, 1.0);\n\n if (alpha <= 1e-4) {\n discard;\n }\n\n gl_FragColor = vec4(color, alpha);\n }\n`;\n\ninterface GridState {\n zoom: number;\n centerX: number;\n centerY: number;\n viewWidth: number;\n viewHeight: number;\n containerWidth: number;\n containerHeight: number;\n minorSpacing: number;\n}\n\n/**\n * Adaptive grid rendered via shader to ensure both horizontal and vertical\n * lines remain visible regardless of zoom level or camera angle.\n */\nexport class AdaptiveGrid {\n private scene: THREE.Scene;\n private camera: THREE.OrthographicCamera;\n private container: HTMLElement;\n\n private gridGroup: THREE.Group;\n private gridGeometry?: THREE.PlaneGeometry;\n private gridMaterial?: THREE.ShaderMaterial;\n private gridMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.ShaderMaterial>;\n\n private animationFrameId: number | null = null;\n private resizeObserver?: ResizeObserver;\n private windowResizeHandler?: () => void;\n\n private lastState: GridState = {\n zoom: -1,\n centerX: Number.NaN,\n centerY: Number.NaN,\n viewWidth: 0,\n viewHeight: 0,\n containerWidth: 0,\n containerHeight: 0,\n minorSpacing: 0,\n };\n\n private largeGridColor = 0x5c5c5c;\n private smallGridColor = 0x3a3a3a;\n\n private readonly desiredMinorPixelSize = 28;\n private readonly coverageMultiplier = 1.6;\n private readonly minSpacing = 1e-4;\n private readonly minorThicknessPx = 0.4;\n private readonly majorThicknessPx = 0.6;\n private minorLineOpacity = 0.05;\n private majorLineOpacity = 0.2;\n private readonly baseRenderOrder = -20;\n private readonly gridZOffset = -0.001;\n private readonly majorStep = 5;\n\n private gridUniforms = {\n minorSpacing: { value: 100 },\n majorStep: { value: this.majorStep },\n worldPerPixel: { value: new THREE.Vector2(1, 1) },\n minorThicknessPx: { value: this.minorThicknessPx },\n majorThicknessPx: { value: this.majorThicknessPx },\n minorColor: { value: new THREE.Color(this.smallGridColor) },\n majorColor: { value: new THREE.Color(this.largeGridColor) },\n minorOpacity: { value: this.minorLineOpacity },\n majorOpacity: { value: this.majorLineOpacity },\n };\n\n constructor(scene: THREE.Scene, camera: THREE.OrthographicCamera, container: HTMLElement) {\n this.scene = scene;\n this.camera = camera;\n this.container = container;\n\n this.gridGroup = new THREE.Group();\n this.gridGroup.name = 'AdaptiveGridGroup';\n this.gridGroup.renderOrder = this.baseRenderOrder;\n this.gridGroup.visible = true;\n this.gridGroup.position.set(0, 0, this.gridZOffset);\n this.scene.add(this.gridGroup);\n\n this.createGridMesh();\n this.updateGrid(true);\n this.startMonitoring();\n this.setupResizeObserver();\n }\n\n /**\n * Build a full-screen quad with a shader-based grid.\n */\n private createGridMesh(): void {\n this.gridGeometry = new THREE.PlaneGeometry(1, 1, 1, 1);\n this.gridMaterial = new THREE.ShaderMaterial({\n uniforms: this.gridUniforms,\n vertexShader: GRID_VERTEX_SHADER,\n fragmentShader: GRID_FRAGMENT_SHADER,\n transparent: true,\n depthWrite: false,\n depthTest: false,\n side: THREE.DoubleSide,\n toneMapped: false,\n });\n\n this.gridMesh = new THREE.Mesh(this.gridGeometry, this.gridMaterial);\n this.gridMesh.frustumCulled = false;\n this.gridMesh.renderOrder = this.baseRenderOrder;\n\n this.gridGroup.add(this.gridMesh);\n }\n\n /**\n * Start a RAF loop to detect camera changes.\n */\n private startMonitoring(): void {\n const loop = () => {\n this.updateGrid();\n this.animationFrameId = requestAnimationFrame(loop);\n };\n\n loop();\n }\n\n private stopMonitoring(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n /**\n * Observe container resize for resolution updates.\n */\n private setupResizeObserver(): void {\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.updateGrid(true));\n this.resizeObserver.observe(this.container);\n } else {\n this.windowResizeHandler = () => this.updateGrid(true);\n window.addEventListener('resize', this.windowResizeHandler);\n }\n }\n\n private teardownResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n if (this.windowResizeHandler) {\n window.removeEventListener('resize', this.windowResizeHandler);\n this.windowResizeHandler = undefined;\n }\n }\n\n private normalizeSpacing(spacing: number): number {\n const safeSpacing = Math.max(spacing, this.minSpacing);\n const exponent = Math.floor(Math.log10(safeSpacing));\n const base = Math.pow(10, exponent);\n const candidates = [1, 2, 5, 10];\n\n for (const candidate of candidates) {\n const normalized = candidate * base;\n if (safeSpacing <= normalized) {\n return normalized;\n }\n }\n\n return 10 * base;\n }\n\n /**\n * Update shader uniforms + quad transform based on camera state.\n */\n private updateGrid(force: boolean = false): void {\n if (!this.gridMesh) {\n return;\n }\n\n const containerWidth = Math.max(1, this.container.clientWidth);\n const containerHeight = Math.max(1, this.container.clientHeight);\n const zoom = this.camera.zoom;\n const baseWidth = this.camera.right - this.camera.left;\n const baseHeight = this.camera.top - this.camera.bottom;\n const viewWidth = Math.max(this.minSpacing, baseWidth / zoom);\n const viewHeight = Math.max(this.minSpacing, baseHeight / zoom);\n const centerX = this.camera.position.x;\n const centerY = this.camera.position.y;\n\n const worldPerPixelX = viewWidth / containerWidth;\n const worldPerPixelY = viewHeight / containerHeight;\n const targetSpacing = worldPerPixelX * this.desiredMinorPixelSize;\n const minorSpacing = this.normalizeSpacing(targetSpacing);\n const state = this.lastState;\n\n if (!force) {\n const zoomChanged = Math.abs(zoom - state.zoom) / Math.max(0.0001, state.zoom || 1) > 0.02;\n const spacingChanged = Math.abs(minorSpacing - state.minorSpacing) > state.minorSpacing * 0.05;\n const movedX = Math.abs(centerX - state.centerX) > Math.max(minorSpacing * 0.5, 0.01);\n const movedY = Math.abs(centerY - state.centerY) > Math.max(minorSpacing * 0.5, 0.01);\n const widthChanged = Math.abs(viewWidth - state.viewWidth) > state.viewWidth * 0.01;\n const heightChanged = Math.abs(viewHeight - state.viewHeight) > state.viewHeight * 0.01;\n const containerChanged = containerWidth !== state.containerWidth || containerHeight !== state.containerHeight;\n\n if (!(zoomChanged || spacingChanged || movedX || movedY || widthChanged || heightChanged || containerChanged)) {\n return;\n }\n }\n\n const planeWidth = viewWidth * this.coverageMultiplier;\n const planeHeight = viewHeight * this.coverageMultiplier;\n\n this.gridMesh.scale.set(planeWidth, planeHeight, 1);\n this.gridMesh.position.set(centerX, centerY, 0);\n\n this.gridUniforms.minorSpacing.value = minorSpacing;\n this.gridUniforms.worldPerPixel.value.set(worldPerPixelX, worldPerPixelY);\n\n this.lastState = {\n zoom,\n centerX,\n centerY,\n viewWidth,\n viewHeight,\n containerWidth,\n containerHeight,\n minorSpacing,\n };\n }\n\n /**\n * Toggle overall grid visibility.\n */\n public setVisible(visible: boolean): void {\n this.gridGroup.visible = visible;\n }\n\n /**\n * Update grid colors.\n */\n public setColors(largeColor: number, smallColor: number): void {\n this.largeGridColor = largeColor;\n this.smallGridColor = smallColor;\n\n this.gridUniforms.majorColor.value.setHex(largeColor);\n this.gridUniforms.minorColor.value.setHex(smallColor);\n }\n /**\n * 设置网格线条透明度。\n * @param minorOpacity 细网格线透明度 (0~1)\n * @param majorOpacity 粗网格线透明度 (0~1)\n */\n public setOpacity(minorOpacity: number, majorOpacity: number): void {\n this.minorLineOpacity = Math.max(0, Math.min(1, minorOpacity));\n this.majorLineOpacity = Math.max(0, Math.min(1, majorOpacity));\n\n this.gridUniforms.minorOpacity.value = this.minorLineOpacity;\n this.gridUniforms.majorOpacity.value = this.majorLineOpacity;\n }\n\n /**\n * Dispose GPU resources.\n */\n public dispose(): void {\n this.stopMonitoring();\n this.teardownResizeObserver();\n\n if (this.gridMesh) {\n this.gridGroup.remove(this.gridMesh);\n }\n\n if (this.gridGeometry) {\n this.gridGeometry.dispose();\n this.gridGeometry = undefined;\n }\n\n if (this.gridMaterial) {\n this.gridMaterial.dispose();\n this.gridMaterial = undefined;\n }\n\n this.gridMesh = undefined;\n }\n}\n\nexport default AdaptiveGrid;\n","/**\r\n * 2D 引擎场景管理模块\r\n * 负责创建和管理 Three.js 场景\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { Engine2dOptions } from '../types/entityTypes';\r\nimport { AdaptiveGrid } from './adaptiveGrid';\r\n\r\nexport class SceneModule2d {\r\n private engine: any;\r\n public scene: THREE.Scene;\r\n private options: Engine2dOptions;\r\n\r\n // 辅助元素\r\n private adaptiveGrid?: AdaptiveGrid;\r\n private axesHelper?: THREE.AxesHelper;\r\n\r\n constructor(engine: any, options: Engine2dOptions) {\r\n this.engine = engine;\r\n this.options = options;\r\n this.scene = this.createScene();\r\n this.initHelpers();\r\n }\r\n\r\n /**\r\n * 创建 2D 场景\r\n */\r\n private createScene(): THREE.Scene {\r\n const scene = new THREE.Scene();\r\n\r\n // 设置背景色\r\n const bgColor = this.options.backgroundColor ?? 0x1a1a1a;\r\n scene.background = new THREE.Color(bgColor);\r\n\r\n // 2D 场景不需要雾效等效果\r\n // 设置场景为 2D 模式\r\n (scene as any).is2D = true;\r\n\r\n return scene;\r\n }\r\n\r\n /**\r\n * 初始化辅助工具\r\n */\r\n private initHelpers(): void {\r\n // 不在这里创建网格,因为相机模块可能还没有初始化\r\n // 网格将在引擎初始化完成后创建\r\n\r\n // 坐标轴辅助(可选)\r\n if (this.options.axesEnabled) {\r\n this.createAxes();\r\n }\r\n }\r\n\r\n /**\r\n * 延迟初始化网格(在所有模块创建完成后调用)\r\n */\r\n public initGrid(): void {\r\n if (this.options.gridEnabled) {\r\n this.createGrid();\r\n }\r\n }\r\n\r\n /**\r\n * 创建网格辅助(自适应网格)\r\n */\r\n public createGrid(size: number = 1000, divisions: number = 50): void {\r\n // 移除旧的自适应网格\r\n if (this.adaptiveGrid) {\r\n this.adaptiveGrid.dispose();\r\n this.adaptiveGrid = undefined;\r\n }\r\n\r\n // 创建自适应网格\r\n this.adaptiveGrid = new AdaptiveGrid(\r\n this.scene,\r\n this.engine.cameraModule2d.orthographicCamera,\r\n this.engine.renderModule2d.container\r\n );\r\n\r\n // 根据当前背景颜色设置网格颜色\r\n const bgColor = this.options.backgroundColor ?? 0x1a1a1a;\r\n this.updateGridColorsByBackground(bgColor);\r\n }\r\n\r\n /**\r\n * 创建坐标轴辅助\r\n */\r\n public createAxes(size: number = 100): void {\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper);\r\n }\r\n\r\n this.axesHelper = new THREE.AxesHelper(size);\r\n\r\n // 调整坐标轴方向以适应 2D 视图\r\n this.axesHelper.rotation.z = 0;\r\n\r\n // 先添加到场景\r\n this.scene.add(this.axesHelper);\r\n\r\n // 确保坐标轴在场景中最后渲染,避免被网格等对象遮挡\r\n // 通过将其移除再重新添加到最后\r\n this.scene.remove(this.axesHelper);\r\n this.scene.add(this.axesHelper);\r\n\r\n // 设置渲染顺序,确保坐标轴在最后渲染\r\n this.axesHelper.renderOrder = 999;\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n * @param color 颜色值\r\n */\r\n public setBackgroundColor(color: number): void {\r\n this.scene.background = new THREE.Color(color);\r\n\r\n // 根据背景亮度自动调整网格颜色\r\n this.updateGridColorsByBackground(color);\r\n }\r\n\r\n /**\r\n * 根据背景颜色更新网格颜色\r\n * @param backgroundColor 背景颜色值\r\n */\r\n private updateGridColorsByBackground(backgroundColor: number): void {\r\n if (!this.adaptiveGrid) {\r\n return;\r\n }\r\n\r\n // 计算背景亮度\r\n const color = new THREE.Color(backgroundColor);\r\n const luminance = 0.299 * color.r + 0.587 * color.g + 0.114 * color.b;\r\n\r\n // 如果背景较暗(亮度 < 0.5),使用浅色网格\r\n if (luminance < 0.5) {\r\n // 浅色网格:大网格白色,小网格浅灰色\r\n this.adaptiveGrid.setColors(0xffffff, 0xffffff);\r\n this.adaptiveGrid.setOpacity(0.2,0.3)\r\n } else {\r\n // 深色网格:大网格深灰色,小网格更深的灰色\r\n this.adaptiveGrid.setColors(0x000000, 0x000000);\r\n this.adaptiveGrid.setOpacity(0.05,0.2)\r\n }\r\n }\r\n\r\n /**\r\n * 添加对象到场景\r\n * @param object Three.js 对象\r\n */\r\n public addObject(object: THREE.Object3D): void {\r\n this.scene.add(object);\r\n }\r\n\r\n /**\r\n * 从场景移除对象\r\n * @param object Three.js 对象\r\n */\r\n public removeObject(object: THREE.Object3D): void {\r\n this.scene.remove(object);\r\n\r\n // 释放资源\r\n if (object instanceof THREE.Mesh) {\r\n object.geometry.dispose();\r\n if (Array.isArray(object.material)) {\r\n object.material.forEach(material => material.dispose());\r\n } else {\r\n object.material.dispose();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空场景\r\n */\r\n public clearScene(): void {\r\n // 从后往前遍历,避免移除时的索引问题\r\n for (let i = this.scene.children.length - 1; i >= 0; i--) {\r\n const object = this.scene.children[i];\r\n\r\n // 保留坐标轴\r\n if (object === this.axesHelper) {\r\n continue;\r\n }\r\n\r\n // 保留自适应网格\r\n if (this.adaptiveGrid) {\r\n // 自适应网格会自己管理,不在这里删除\r\n continue;\r\n }\r\n\r\n this.removeObject(object);\r\n }\r\n\r\n // 触发场景清空事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('scene-cleared' as any);\r\n }\r\n }\r\n\r\n /**\r\n * 获取场景中的所有对象\r\n * @param includeHelpers 是否包含辅助对象\r\n * @returns 对象数组\r\n */\r\n public getObjects(includeHelpers: boolean = false): THREE.Object3D[] {\r\n const objects: THREE.Object3D[] = [];\r\n\r\n this.scene.children.forEach(child => {\r\n if (includeHelpers || (child !== this.axesHelper)) {\r\n objects.push(child);\r\n }\r\n });\r\n\r\n return objects;\r\n }\r\n\r\n /**\r\n * 获取场景统计信息\r\n * @returns 统计信息对象\r\n */\r\n public getSceneStats(): {\r\n objectCount: number;\r\n meshCount: number;\r\n lineCount: number;\r\n groupCount: number;\r\n } {\r\n let meshCount = 0;\r\n let lineCount = 0;\r\n let groupCount = 0;\r\n\r\n this.scene.children.forEach(child => {\r\n if (child instanceof THREE.Mesh) meshCount++;\r\n else if (child instanceof THREE.Line) lineCount++;\r\n else if (child instanceof THREE.Group) groupCount++;\r\n });\r\n\r\n return {\r\n objectCount: this.scene.children.length,\r\n meshCount,\r\n lineCount,\r\n groupCount,\r\n };\r\n }\r\n\r\n /**\r\n * 显示/隐藏网格\r\n * @param visible 是否可见\r\n */\r\n public setGridVisible(visible: boolean): void {\r\n if (this.adaptiveGrid) {\r\n this.adaptiveGrid.setVisible(visible);\r\n }\r\n }\r\n\r\n /**\r\n * 显示/隐藏坐标轴\r\n * @param visible 是否可见\r\n */\r\n public setAxesVisible(visible: boolean): void {\r\n if (this.axesHelper) {\r\n this.axesHelper.visible = visible;\r\n }\r\n }\r\n\r\n /**\r\n * 销毁场景模块\r\n */\r\n public dispose(): void {\r\n // 清空场景\r\n this.clearScene();\r\n\r\n // 移除自适应网格\r\n if (this.adaptiveGrid) {\r\n this.adaptiveGrid.dispose();\r\n this.adaptiveGrid = undefined;\r\n }\r\n\r\n // 移除坐标轴\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper);\r\n this.axesHelper = undefined;\r\n }\r\n\r\n // 清理场景\r\n this.scene.clear();\r\n }\r\n}\r\n\r\nexport default SceneModule2d;\r\n","// \r\nexport class EngineStatus2d{\r\n private engine: any;\r\n public isFree: boolean;\r\n // 高亮模型\r\n public highlightModels: any[];\r\n public highlightHoverModels:any[]\r\n // 隐藏的毛线哦\r\n public hideModels: any[];\r\n // 半透明的模型\r\n public translucentModels: any[];\r\n // 已加载的模型\r\n public models: any[];\r\n \r\n constructor(engine: any){\r\n this.engine = engine;\r\n this.isFree = true;\r\n this.highlightModels = [];\r\n this.hideModels = [];\r\n this.translucentModels = [];\r\n this.highlightHoverModels = []\r\n this.models = [];\r\n }\r\n \r\n}","/**\r\n * 2D 引擎相机管理模块\r\n * 负责管理正交相机(2D 视图专用)\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { ViewBounds } from '../types/entityTypes';\r\n\r\nexport class CameraModule2d {\r\n private engine: any;\r\n public orthographicCamera: THREE.OrthographicCamera;\r\n private container: HTMLElement;\r\n\r\n // 相机配置\r\n private frustumSize: number = 1000;\r\n private near: number = 0.1;\r\n private far: number = 10000;\r\n private initialZoom: number = 1;\r\n\r\n // 相机位置\r\n private defaultPosition: THREE.Vector3 = new THREE.Vector3(0, 0, 1000);\r\n\r\n constructor(engine: any, container: HTMLElement) {\r\n this.engine = engine;\r\n this.container = container;\r\n this.orthographicCamera = this.createOrthographicCamera();\r\n }\r\n\r\n /**\r\n * 创建正交相机\r\n */\r\n private createOrthographicCamera(): THREE.OrthographicCamera {\r\n const aspect = this.container.clientWidth / this.container.clientHeight;\r\n const frustumHalfHeight = this.frustumSize / 2;\r\n const frustumHalfWidth = frustumHalfHeight * aspect;\r\n\r\n const camera = new THREE.OrthographicCamera(\r\n -frustumHalfWidth,\r\n frustumHalfWidth,\r\n frustumHalfHeight,\r\n -frustumHalfHeight,\r\n this.near,\r\n this.far\r\n );\r\n\r\n // 设置相机位置(2D 视图从上往下看)\r\n camera.position.copy(this.defaultPosition);\r\n camera.lookAt(0, 0, 0);\r\n camera.zoom = this.initialZoom;\r\n camera.updateProjectionMatrix();\r\n\r\n return camera;\r\n }\r\n\r\n // 动画相关\r\n private animationId: number | null = null;\r\n private animationStartTime: number = 0;\r\n private animationDuration: number = 800; // 默认动画时长 800ms\r\n private animationStartState: any = {};\r\n private animationTargetState: any = {};\r\n\r\n /**\r\n * 适配视图到模型边界\r\n * @param extents 模型边界 { min: [x, y, z], max: [x, y, z] }\r\n * @param padding 边距(默认 1.2 = 20% 边距)\r\n * @param animated 是否使用动画(默认 true)\r\n * @param duration 动画时长(毫秒,默认 800)\r\n */\r\n public fitToExtents(\r\n extents: { min: number[]; max: number[] },\r\n padding: number = 1.2,\r\n animated: boolean = true,\r\n duration: number = 800\r\n ): void {\r\n const min = new THREE.Vector3(extents.min[0], extents.min[1]);\r\n const max = new THREE.Vector3(extents.max[0], extents.max[1]);\r\n\r\n // 检查边界是否有效\r\n const boundsValid = min.distanceTo(max) > 0.001;\r\n if (!boundsValid) {\r\n console.warn('[CameraModule2d] Invalid extents, using default view');\r\n this.resetView();\r\n return;\r\n }\r\n\r\n // 计算边界中心\r\n const center = new THREE.Vector3();\r\n center.addVectors(min, max).multiplyScalar(0.5);\r\n\r\n // 计算边界尺寸\r\n const size = new THREE.Vector3();\r\n size.subVectors(max, min);\r\n\r\n // 计算需要的视锥体大小\r\n const maxDim = Math.max(size.x, size.y);\r\n const frustumSize = maxDim * padding;\r\n\r\n // 更新相机参数\r\n const aspect = this.container.clientWidth / this.container.clientHeight;\r\n const frustumHalfHeight = frustumSize / 2;\r\n const frustumHalfWidth = frustumHalfHeight * aspect;\r\n\r\n // 目标状态\r\n const targetLeft = -frustumHalfWidth;\r\n const targetRight = frustumHalfWidth;\r\n const targetTop = frustumHalfHeight;\r\n const targetBottom = -frustumHalfHeight;\r\n const targetX = center.x;\r\n const targetY = center.y;\r\n const targetZoom = 1;\r\n\r\n // 如果不使用动画,直接设置\r\n if (!animated) {\r\n this.orthographicCamera.left = targetLeft;\r\n this.orthographicCamera.right = targetRight;\r\n this.orthographicCamera.top = targetTop;\r\n this.orthographicCamera.bottom = targetBottom;\r\n this.orthographicCamera.position.set(targetX, targetY, this.defaultPosition.z);\r\n this.orthographicCamera.zoom = targetZoom;\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 同步控制器\r\n if (this.engine.controlModule2d?.panControls) {\r\n this.engine.controlModule2d.panControls.setPosition(targetX, targetY);\r\n this.engine.controlModule2d.panControls.setZoom(targetZoom);\r\n }\r\n\r\n // 触发相机变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-changed' as any, {\r\n type: 'fit-to-extents',\r\n center,\r\n size,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n // 使用动画过渡\r\n // 取消之前的动画\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId);\r\n this.animationId = null;\r\n }\r\n\r\n // 保存起始状态\r\n this.animationStartState = {\r\n left: this.orthographicCamera.left,\r\n right: this.orthographicCamera.right,\r\n top: this.orthographicCamera.top,\r\n bottom: this.orthographicCamera.bottom,\r\n x: this.orthographicCamera.position.x,\r\n y: this.orthographicCamera.position.y,\r\n zoom: this.orthographicCamera.zoom,\r\n };\r\n\r\n // 保存目标状态\r\n this.animationTargetState = {\r\n left: targetLeft,\r\n right: targetRight,\r\n top: targetTop,\r\n bottom: targetBottom,\r\n x: targetX,\r\n y: targetY,\r\n zoom: targetZoom,\r\n };\r\n\r\n this.animationDuration = duration;\r\n this.animationStartTime = performance.now();\r\n\r\n // 开始动画\r\n this.animateFitToExtents(center, size);\r\n }\r\n\r\n /**\r\n * 缓动函数 - easeOutCubic\r\n * @param t 进度 0-1\r\n * @returns 缓动后的值\r\n */\r\n private easeOutCubic(t: number): number {\r\n return 1 - Math.pow(1 - t, 3);\r\n }\r\n\r\n /**\r\n * 执行 fitToExtents 动画\r\n */\r\n private animateFitToExtents(center: THREE.Vector3, size: THREE.Vector3): void {\r\n const currentTime = performance.now();\r\n const elapsed = currentTime - this.animationStartTime;\r\n const progress = Math.min(elapsed / this.animationDuration, 1);\r\n const easedProgress = this.easeOutCubic(progress);\r\n\r\n // 插值计算当前状态\r\n const start = this.animationStartState;\r\n const target = this.animationTargetState;\r\n\r\n this.orthographicCamera.left = this.lerp(start.left, target.left, easedProgress);\r\n this.orthographicCamera.right = this.lerp(start.right, target.right, easedProgress);\r\n this.orthographicCamera.top = this.lerp(start.top, target.top, easedProgress);\r\n this.orthographicCamera.bottom = this.lerp(start.bottom, target.bottom, easedProgress);\r\n this.orthographicCamera.position.x = this.lerp(start.x, target.x, easedProgress);\r\n this.orthographicCamera.position.y = this.lerp(start.y, target.y, easedProgress);\r\n this.orthographicCamera.zoom = this.lerp(start.zoom, target.zoom, easedProgress);\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 同步控制器\r\n if (this.engine.controlModule2d?.panControls) {\r\n this.engine.controlModule2d.panControls.setPosition(\r\n this.orthographicCamera.position.x,\r\n this.orthographicCamera.position.y\r\n );\r\n this.engine.controlModule2d.panControls.setZoom(this.orthographicCamera.zoom);\r\n }\r\n\r\n // 触发相机变化事件(动画过程中持续触发)\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-changed' as any, {\r\n type: 'fit-to-extents',\r\n center,\r\n size,\r\n progress: easedProgress,\r\n });\r\n }\r\n\r\n // 继续动画或结束\r\n if (progress < 1) {\r\n this.animationId = requestAnimationFrame(() => this.animateFitToExtents(center, size));\r\n } else {\r\n this.animationId = null;\r\n }\r\n }\r\n\r\n /**\r\n * 线性插值\r\n */\r\n private lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t;\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n // 移除缩放限制,允许任意缩放级别\r\n this.orthographicCamera.zoom = zoom;\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 触发缩放变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('view-zoom-changed' as any, { zoom });\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前缩放级别\r\n * @returns 缩放级别\r\n */\r\n public getZoom(): number {\r\n return this.orthographicCamera.zoom;\r\n }\r\n\r\n /**\r\n * 设置相机位置\r\n * @param x X 坐标\r\n * @param y Y 坐标\r\n */\r\n public setPosition(x: number, y: number): void {\r\n this.orthographicCamera.position.set(x, y, this.defaultPosition.z);\r\n\r\n // 触发平移变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('view-pan-changed' as any, { x, y });\r\n }\r\n }\r\n\r\n /**\r\n * 获取相机位置\r\n * @returns 位置向量\r\n */\r\n public getPosition(): THREE.Vector3 {\r\n return this.orthographicCamera.position.clone();\r\n }\r\n\r\n /**\r\n * 重置相机视图\r\n */\r\n public resetView(): void {\r\n this.orthographicCamera.position.copy(this.defaultPosition);\r\n this.orthographicCamera.zoom = this.initialZoom;\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 触发相机重置事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-reset' as any);\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前视图边界\r\n * @returns 视图边界\r\n */\r\n public getViewBounds(): ViewBounds {\r\n const camera = this.orthographicCamera;\r\n const zoom = camera.zoom;\r\n\r\n // 计算视图边界(考虑缩放)\r\n const left = camera.left / zoom;\r\n const right = camera.right / zoom;\r\n const top = camera.top / zoom;\r\n const bottom = camera.bottom / zoom;\r\n\r\n // 相对于相机位置的偏移\r\n const cameraX = camera.position.x;\r\n const cameraY = camera.position.y;\r\n\r\n return {\r\n minX: cameraX + left,\r\n maxX: cameraX + right,\r\n minY: cameraY + bottom,\r\n maxY: cameraY + top,\r\n width: right - left,\r\n height: top - bottom,\r\n };\r\n }\r\n\r\n /**\r\n * 屏幕坐标转世界坐标\r\n * @param screenX 屏幕 X 坐标\r\n * @param screenY 屏幕 Y 坐标\r\n * @returns 世界坐标向量\r\n */\r\n public screenToWorld(screenX: number, screenY: number): THREE.Vector3 {\r\n const vector = new THREE.Vector3(\r\n (screenX / this.container.clientWidth) * 2 - 1,\r\n -(screenY / this.container.clientHeight) * 2 + 1,\r\n 0.5\r\n );\r\n\r\n vector.unproject(this.orthographicCamera);\r\n\r\n return vector;\r\n }\r\n\r\n /**\r\n * 世界坐标转屏幕坐标\r\n * @param worldX 世界 X 坐标\r\n * @param worldY 世界 Y 坐标\r\n * @returns 屏幕坐标 { x, y }\r\n */\r\n public worldToScreen(worldX: number, worldY: number): { x: number; y: number } {\r\n const vector = new THREE.Vector3(worldX, worldY, 0);\r\n vector.project(this.orthographicCamera);\r\n\r\n return {\r\n x: (vector.x + 1) / 2 * this.container.clientWidth,\r\n y: -(vector.y - 1) / 2 * this.container.clientHeight,\r\n };\r\n }\r\n\r\n /**\r\n * 更新相机宽高比\r\n * 在容器尺寸变化时调用\r\n */\r\n public updateAspectRatio(): void {\r\n const aspect = this.container.clientWidth / this.container.clientHeight;\r\n const frustumHalfHeight = this.frustumSize / 2;\r\n const frustumHalfWidth = frustumHalfHeight * aspect;\r\n\r\n this.orthographicCamera.left = -frustumHalfWidth;\r\n this.orthographicCamera.right = frustumHalfWidth;\r\n this.orthographicCamera.top = frustumHalfHeight;\r\n this.orthographicCamera.bottom = -frustumHalfHeight;\r\n\r\n this.orthographicCamera.updateProjectionMatrix();\r\n }\r\n\r\n /**\r\n * 设置视锥体大小\r\n * @param size 视锥体大小\r\n */\r\n public setFrustumSize(size: number): void {\r\n this.frustumSize = size;\r\n this.updateAspectRatio();\r\n }\r\n\r\n /**\r\n * 获取视锥体大小\r\n * @returns 视锥体大小\r\n */\r\n public getFrustumSize(): number {\r\n return this.frustumSize;\r\n }\r\n\r\n /**\r\n * 销毁相机模块\r\n */\r\n public dispose(): void {\r\n // 取消正在进行的动画\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId);\r\n this.animationId = null;\r\n }\r\n // Three.js 相机不需要特殊清理\r\n this.orthographicCamera = null as any;\r\n }\r\n}\r\n\r\nexport default CameraModule2d;\r\n","/**\r\n * 2D 引擎渲染模块\r\n * 负责创建和配置 WebGL 渲染器\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { Engine2dOptions } from '../types/entityTypes';\r\n\r\nexport class RenderModule2d {\r\n private engine: any;\r\n public renderer: THREE.WebGLRenderer;\r\n private container: HTMLElement;\r\n private options: Engine2dOptions;\r\n\r\n // 渲染配置\r\n private antialias: boolean = true;\r\n private alpha: boolean = false;\r\n private precision: 'highp' | 'mediump' | 'lowp' = 'highp';\r\n\r\n constructor(engine: any, container: HTMLElement, options: Engine2dOptions) {\r\n this.engine = engine;\r\n this.container = container;\r\n this.options = options;\r\n this.renderer = this.createRenderer();\r\n this.handleResize();\r\n }\r\n\r\n /**\r\n * 创建 WebGL 渲染器\r\n */\r\n private createRenderer(): THREE.WebGLRenderer {\r\n const renderer = new THREE.WebGLRenderer({\r\n antialias: this.antialias,\r\n alpha: this.alpha,\r\n precision: this.precision,\r\n });\r\n\r\n // 设置渲染器尺寸\r\n const width = this.container.clientWidth;\r\n const height = this.container.clientHeight;\r\n renderer.setSize(width, height);\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n\r\n // 2D 渲染器配置\r\n renderer.autoClear = true;\r\n renderer.sortObjects = true;\r\n\r\n // 设置初始背景色\r\n renderer.setClearColor(this.options.backgroundColor ?? 0x1a1a1a);\r\n\r\n // 优化:不需要深度测试(2D 场景)\r\n // 但为了正确的层级关系,还是保留深度测试\r\n\r\n // 添加到容器\r\n this.container.appendChild(renderer.domElement);\r\n\r\n return renderer;\r\n }\r\n\r\n /**\r\n * 渲染场景\r\n * @param scene Three.js 场景\r\n * @param camera Three.js 相机\r\n */\r\n public render(scene: THREE.Scene, camera: THREE.Camera): void {\r\n const startTime = performance.now();\r\n\r\n // 触发渲染开始事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('render-start' as any);\r\n }\r\n\r\n // 执行渲染\r\n this.renderer.render(scene, camera);\r\n\r\n const renderTime = performance.now() - startTime;\r\n\r\n // 触发渲染结束事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('render-end' as any, { renderTime });\r\n }\r\n }\r\n\r\n /**\r\n * 处理窗口大小变化\r\n */\r\n private handleResize(): void {\r\n window.addEventListener('resize', () => {\r\n this.onWindowResize();\r\n });\r\n }\r\n\r\n /**\r\n * 窗口大小变化处理\r\n */\r\n private onWindowResize(): void {\r\n const width = this.container.clientWidth;\r\n const height = this.container.clientHeight;\r\n\r\n // 更新渲染器尺寸\r\n this.renderer.setSize(width, height);\r\n\r\n // 更新相机宽高比\r\n if (this.engine.cameraModule2d) {\r\n this.engine.cameraModule2d.updateAspectRatio();\r\n }\r\n\r\n // 重新渲染\r\n if (this.engine.scene && this.engine.camera) {\r\n this.render(this.engine.scene, this.engine.camera);\r\n }\r\n }\r\n\r\n /**\r\n * 手动调整渲染器尺寸\r\n * @param width 宽度\r\n * @param height 高度\r\n */\r\n public setSize(width: number, height: number): void {\r\n this.renderer.setSize(width, height);\r\n\r\n // 更新相机宽高比\r\n if (this.engine.cameraModule2d) {\r\n this.engine.cameraModule2d.updateAspectRatio();\r\n }\r\n }\r\n\r\n /**\r\n * 获取渲染器尺寸\r\n * @returns 尺寸对象 { width, height }\r\n */\r\n public getSize(): { width: number; height: number } {\r\n const size = this.renderer.getSize(new THREE.Vector2());\r\n return {\r\n width: size.x,\r\n height: size.y,\r\n };\r\n }\r\n\r\n /**\r\n * 设置背景色\r\n * @param color 颜色值\r\n */\r\n public setBackgroundColor(color: number): void {\r\n this.renderer.setClearColor(new THREE.Color(color));\r\n }\r\n\r\n /**\r\n * 设置像素比率\r\n * @param pixelRatio 像素比率\r\n */\r\n public setPixelRatio(pixelRatio: number): void {\r\n this.renderer.setPixelRatio(pixelRatio);\r\n }\r\n\r\n /**\r\n * 获取像素比率\r\n * @returns 像素比率\r\n */\r\n public getPixelRatio(): number {\r\n return this.renderer.getPixelRatio();\r\n }\r\n\r\n /**\r\n * 启用/禁用抗锯齿\r\n * @param enabled 是否启用\r\n */\r\n public setAntialias(enabled: boolean): void {\r\n // WebGLRenderer 创建后无法更改抗锯齿设置\r\n console.warn('Antialias cannot be changed after renderer creation');\r\n }\r\n\r\n /**\r\n * 清除渲染缓冲\r\n * @param color 是否清除颜色缓冲\r\n * @param depth 是否清除深度缓冲\r\n * @param stencil 是否清除模板缓冲\r\n */\r\n public clear(color: boolean = true, depth: boolean = true, stencil: boolean = false): void {\r\n this.renderer.clear(color, depth, stencil);\r\n }\r\n\r\n /**\r\n * 获取渲染器信息\r\n * @returns 渲染器信息\r\n */\r\n public getInfo(): {\r\n renderer: string;\r\n version: string;\r\n vendor: string;\r\n capabilities: any;\r\n } {\r\n const context = this.renderer.getContext();\r\n\r\n return {\r\n renderer: this.renderer.capabilities.isWebGL2 ? 'WebGL 2.0' : 'WebGL 1.0',\r\n version: this.renderer.capabilities.getVersion(),\r\n vendor: this.renderer.capabilities.vendor,\r\n capabilities: {\r\n maxTextureSize: this.renderer.capabilities.maxTextureSize,\r\n maxRenderbufferSize: this.renderer.capabilities.maxRenderbufferSize,\r\n maxVertexAttribs: this.renderer.capabilities.maxVertexAttribs,\r\n maxVaryingVectors: context.getParameter(context.MAX_VARYING_VECTORS),\r\n maxFragmentUniforms: context.getParameter(context.MAX_FRAGMENT_UNIFORM_VECTORS),\r\n maxVertexUniforms: context.getParameter(context.MAX_VERTEX_UNIFORM_VECTORS),\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 销毁渲染模块\r\n */\r\n public dispose(): void {\r\n // 移除窗口大小监听\r\n window.removeEventListener('resize', this.onWindowResize.bind(this));\r\n\r\n // 销毁渲染器\r\n this.renderer.dispose();\r\n\r\n // 从 DOM 中移除 canvas\r\n if (this.container.contains(this.renderer.domElement)) {\r\n this.container.removeChild(this.renderer.domElement);\r\n }\r\n\r\n this.renderer = null as any;\r\n }\r\n}\r\n\r\nexport default RenderModule2d;\r\n","/**\r\n * 2D 平移控制器\r\n * 实现 CAD 风格的鼠标交互控制\r\n * 功能:平移、缩放、双击重置\r\n */\r\n\r\nimport * as THREE from 'three';\r\n\r\nexport class Pan2dControls extends THREE.EventDispatcher {\r\n public object: THREE.OrthographicCamera;\r\n public domElement: HTMLElement;\r\n public enabled: boolean = true;\r\n\r\n // 配置\r\n public enableZoom: boolean = true;\r\n public enablePan: boolean = true;\r\n public enableDamping: boolean = false;\r\n public dampingFactor: number = 0.05;\r\n public zoomSpeed: number = 1.0;\r\n\r\n // 缩放限制(0 表示无限制)\r\n public minZoom: number = 0;\r\n public maxZoom: number = Infinity;\r\n\r\n // 状态\r\n private isDragging: boolean = false;\r\n private mouseButton: number = -1; // -1: 无, 0: 左键, 1: 中键, 2: 右键\r\n private previousMousePosition: THREE.Vector2 = new THREE.Vector2();\r\n private targetPosition: THREE.Vector3 = new THREE.Vector3();\r\n private targetZoom: number = 1;\r\n\r\n // 双击检测\r\n private lastClickTime: number = 0;\r\n private doubleClickDelay: number = 300;\r\n\r\n constructor(object: THREE.OrthographicCamera, domElement?: HTMLElement) {\r\n super();\r\n\r\n this.object = object;\r\n this.domElement = domElement || document;\r\n\r\n this.targetPosition.copy(object.position);\r\n this.targetZoom = object.zoom;\r\n\r\n this.bindEvents();\r\n }\r\n\r\n /**\r\n * 绑定事件监听\r\n */\r\n private bindEvents(): void {\r\n // 鼠标事件\r\n this.domElement.addEventListener('mousedown', this.onMouseDown.bind(this));\r\n this.domElement.addEventListener('mousemove', this.onMouseMove.bind(this));\r\n this.domElement.addEventListener('mouseup', this.onMouseUp.bind(this));\r\n this.domElement.addEventListener('mouseleave', this.onMouseUp.bind(this));\r\n this.domElement.addEventListener('wheel', this.onWheel.bind(this), { passive: false });\r\n this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this));\r\n this.domElement.addEventListener('click', this.onClick.bind(this));\r\n\r\n // 触摸事件(移动端支持)\r\n this.domElement.addEventListener('touchstart', this.onTouchStart.bind(this), { passive: false });\r\n this.domElement.addEventListener('touchmove', this.onTouchMove.bind(this), { passive: false });\r\n this.domElement.addEventListener('touchend', this.onTouchEnd.bind(this));\r\n\r\n // 阻止右键菜单\r\n this.domElement.addEventListener('contextmenu', (event) => {\r\n event.preventDefault();\r\n });\r\n }\r\n\r\n /**\r\n * 鼠标按下\r\n */\r\n private onMouseDown(event: MouseEvent): void {\r\n if (!this.enabled) return;\r\n\r\n // 检查是否启用了平移\r\n if (!this.enablePan) return;\r\n\r\n // 只响应左键和中键\r\n if (event.button === 0 || event.button === 1) {\r\n this.isDragging = true;\r\n this.mouseButton = event.button;\r\n this.previousMousePosition.set(event.clientX, event.clientY);\r\n\r\n this.dispatchEvent({ type: 'start' });\r\n }\r\n }\r\n\r\n /**\r\n * 鼠标移动\r\n */\r\n private onMouseMove(event: MouseEvent): void {\r\n if (!this.enabled || !this.isDragging) return;\r\n\r\n const deltaX = event.clientX - this.previousMousePosition.x;\r\n const deltaY = event.clientY - this.previousMousePosition.y;\r\n\r\n // 计算世界坐标偏移(考虑缩放)\r\n const zoom = this.object.zoom;\r\n const factor = 1 / zoom;\r\n\r\n // 获取视锥体尺寸\r\n const frustumHeight = (this.object.top - this.object.bottom);\r\n const frustumWidth = (this.object.right - this.object.left);\r\n\r\n // 计算移动距离(世界坐标)\r\n const worldDeltaX = (deltaX / this.domElement.clientWidth) * frustumWidth * factor;\r\n const worldDeltaY = (deltaY / this.domElement.clientHeight) * frustumHeight * factor;\r\n\r\n // 更新目标位置\r\n this.targetPosition.x -= worldDeltaX;\r\n this.targetPosition.y += worldDeltaY;\r\n\r\n if (!this.enableDamping) {\r\n // 无阻尼模式,直接更新\r\n this.object.position.copy(this.targetPosition);\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.previousMousePosition.set(event.clientX, event.clientY);\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 鼠标释放\r\n */\r\n private onMouseUp(event: MouseEvent): void {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.mouseButton = -1;\r\n\r\n this.dispatchEvent({ type: 'end' });\r\n }\r\n }\r\n\r\n /**\r\n * 鼠标滚轮(缩放)\r\n */\r\n private onWheel(event: WheelEvent): void {\r\n if (!this.enabled || !this.enableZoom) return;\r\n\r\n event.preventDefault();\r\n\r\n const zoomFactor = Math.pow(1.1, -Math.sign(event.deltaY) * this.zoomSpeed);\r\n const oldZoom = this.targetZoom;\r\n\r\n this.targetZoom *= zoomFactor;\r\n if (this.minZoom > 0) this.targetZoom = Math.max(this.minZoom, this.targetZoom);\r\n if (this.maxZoom !== Infinity) this.targetZoom = Math.min(this.targetZoom, this.maxZoom);\r\n\r\n const newZoom = this.targetZoom;\r\n\r\n // 正交相机视锥体的半宽高(zoom=1 时的基准值)\r\n const halfW = (this.object.right - this.object.left) / 2;\r\n const halfH = (this.object.top - this.object.bottom) / 2;\r\n\r\n // 鼠标相对于 canvas 的 NDC 坐标\r\n const rect = this.domElement.getBoundingClientRect();\r\n const ndcX = ((event.clientX - rect.left) / rect.width) * 2 - 1;\r\n const ndcY = -((event.clientY - rect.top) / rect.height) * 2 + 1;\r\n\r\n // 缩放后鼠标对应的世界坐标 = 缩放前的世界坐标\r\n // worldX = camX + ndcX * halfW / zoom\r\n // 推导:camX_new = camX + ndcX * halfW * (1/oldZoom - 1/newZoom)\r\n this.targetPosition.x += ndcX * halfW * (1 / oldZoom - 1 / newZoom);\r\n this.targetPosition.y += ndcY * halfH * (1 / oldZoom - 1 / newZoom);\r\n\r\n if (!this.enableDamping) {\r\n this.object.zoom = newZoom;\r\n this.object.position.copy(this.targetPosition);\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 双击事件(重置视图)\r\n */\r\n private onDoubleClick(event: MouseEvent): void {\r\n if (!this.enabled) return;\r\n\r\n this.dispatchEvent({ type: 'doubleClick', event });\r\n }\r\n\r\n /**\r\n * 单击事件\r\n */\r\n private onClick(event: MouseEvent): void {\r\n // 检测双击\r\n const now = performance.now();\r\n if (now - this.lastClickTime < this.doubleClickDelay) {\r\n // 这是一个双击\r\n return;\r\n }\r\n this.lastClickTime = now;\r\n }\r\n\r\n /**\r\n * 触摸开始\r\n */\r\n private onTouchStart(event: TouchEvent): void {\r\n if (!this.enabled || event.touches.length !== 1) return;\r\n\r\n event.preventDefault();\r\n\r\n const touch = event.touches[0];\r\n this.isDragging = true;\r\n this.previousMousePosition.set(touch.clientX, touch.clientY);\r\n\r\n this.dispatchEvent({ type: 'start' });\r\n }\r\n\r\n /**\r\n * 触摸移动\r\n */\r\n private onTouchMove(event: TouchEvent): void {\r\n if (!this.enabled || !this.isDragging) return;\r\n\r\n event.preventDefault();\r\n\r\n const touch = event.touches[0];\r\n const deltaX = touch.clientX - this.previousMousePosition.x;\r\n const deltaY = touch.clientY - this.previousMousePosition.y;\r\n\r\n const zoom = this.object.zoom;\r\n const factor = 1 / zoom;\r\n const frustumHeight = (this.object.top - this.object.bottom);\r\n const frustumWidth = (this.object.right - this.object.left);\r\n\r\n const worldDeltaX = (deltaX / this.domElement.clientWidth) * frustumWidth * factor;\r\n const worldDeltaY = (deltaY / this.domElement.clientHeight) * frustumHeight * factor;\r\n\r\n this.targetPosition.x -= worldDeltaX;\r\n this.targetPosition.y += worldDeltaY;\r\n\r\n if (!this.enableDamping) {\r\n this.object.position.copy(this.targetPosition);\r\n }\r\n\r\n this.previousMousePosition.set(touch.clientX, touch.clientY);\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 触摸结束\r\n */\r\n private onTouchEnd(event: TouchEvent): void {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n\r\n this.dispatchEvent({ type: 'end' });\r\n }\r\n }\r\n\r\n /**\r\n * 更新控制器(在动画循环中调用)\r\n */\r\n public update(): void {\r\n if (!this.enabled) return;\r\n\r\n if (this.enableDamping) {\r\n // 阻尼模式,平滑过渡\r\n const damping = 1 - this.dampingFactor;\r\n\r\n // 平滑位置\r\n this.object.position.x += (this.targetPosition.x - this.object.position.x) * damping;\r\n this.object.position.y += (this.targetPosition.y - this.object.position.y) * damping;\r\n\r\n // 平滑缩放\r\n this.object.zoom += (this.targetZoom - this.object.zoom) * damping;\r\n\r\n this.object.updateProjectionMatrix();\r\n }\r\n }\r\n\r\n /**\r\n * 重置控制器\r\n */\r\n public reset(): void {\r\n this.targetPosition.set(0, 0, this.object.position.z);\r\n this.targetZoom = 1;\r\n\r\n if (!this.enableDamping) {\r\n this.object.position.copy(this.targetPosition);\r\n this.object.zoom = this.targetZoom;\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.dispatchEvent({ type: 'reset' });\r\n }\r\n\r\n /**\r\n * 设置相机位置\r\n * @param x X 坐标\r\n * @param y Y 坐标\r\n */\r\n public setPosition(x: number, y: number): void {\r\n this.targetPosition.set(x, y, this.object.position.z);\r\n\r\n if (!this.enableDamping) {\r\n this.object.position.copy(this.targetPosition);\r\n }\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n this.targetZoom = zoom;\r\n if (this.minZoom > 0) this.targetZoom = Math.max(this.minZoom, this.targetZoom);\r\n if (this.maxZoom !== Infinity) this.targetZoom = Math.min(this.targetZoom, this.maxZoom);\r\n\r\n if (!this.enableDamping) {\r\n this.object.zoom = this.targetZoom;\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 销毁控制器\r\n */\r\n public dispose(): void {\r\n this.enabled = false;\r\n\r\n // 移除事件监听\r\n this.domElement.removeEventListener('mousedown', this.onMouseDown.bind(this));\r\n this.domElement.removeEventListener('mousemove', this.onMouseMove.bind(this));\r\n this.domElement.removeEventListener('mouseup', this.onMouseUp.bind(this));\r\n this.domElement.removeEventListener('mouseleave', this.onMouseUp.bind(this));\r\n this.domElement.removeEventListener('wheel', this.onWheel.bind(this));\r\n this.domElement.removeEventListener('dblclick', this.onDoubleClick.bind(this));\r\n this.domElement.removeEventListener('click', this.onClick.bind(this));\r\n this.domElement.removeEventListener('touchstart', this.onTouchStart.bind(this));\r\n this.domElement.removeEventListener('touchmove', this.onTouchMove.bind(this));\r\n this.domElement.removeEventListener('touchend', this.onTouchEnd.bind(this));\r\n }\r\n}\r\n\r\nexport default Pan2dControls;\r\n","/**\r\n * 2D 控制器模块\r\n * 管理所有交互控制器\r\n */\r\n\r\nimport { Pan2dControls } from '../controls/Pan2dControls';\r\n\r\nexport class ControlModule2d {\r\n private engine: any;\r\n public panControls: Pan2dControls;\r\n public isActive: boolean = true;\r\n\r\n constructor(engine: any) {\r\n this.engine = engine;\r\n this.panControls = this.createPanControls();\r\n this.init();\r\n }\r\n\r\n /**\r\n * 初始化控制器\r\n */\r\n private init(): void {\r\n // 监听双击事件\r\n this.panControls.addEventListener('doubleClick', this.onDoubleClick.bind(this));\r\n\r\n // 监听控制器变化事件\r\n this.panControls.addEventListener('change', this.onChange.bind(this));\r\n }\r\n\r\n /**\r\n * 创建 2D 平移控制器\r\n */\r\n private createPanControls(): Pan2dControls {\r\n const controls = new Pan2dControls(\r\n this.engine.camera as any,\r\n this.engine.renderer.domElement\r\n );\r\n\r\n // 配置控制器\r\n controls.enableZoom = true;\r\n controls.enablePan = true;\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n controls.zoomSpeed = 1.0;\r\n controls.minZoom = 0;\r\n controls.maxZoom = Infinity;\r\n\r\n return controls;\r\n }\r\n\r\n /**\r\n * 双击事件处理\r\n */\r\n private onDoubleClick(event: any): void {\r\n // 双击重置视图\r\n if (this.engine.cameraModule2d) {\r\n this.engine.cameraModule2d.resetView();\r\n }\r\n }\r\n\r\n /**\r\n * 控制器变化事件处理\r\n */\r\n private onChange(): void {\r\n // 触发相机变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-changed' as any, {\r\n type: 'user-interaction',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 激活控制器\r\n */\r\n public active(): void {\r\n this.isActive = true;\r\n this.panControls.enabled = true;\r\n }\r\n\r\n /**\r\n * 禁用控制器\r\n */\r\n public disActive(): void {\r\n this.isActive = false;\r\n this.panControls.enabled = false;\r\n }\r\n\r\n /**\r\n * 更新控制器(在动画循环中调用)\r\n */\r\n public update(): void {\r\n if (this.isActive) {\r\n this.panControls.update();\r\n }\r\n }\r\n\r\n /**\r\n * 重置控制器\r\n */\r\n public reset(): void {\r\n this.panControls.reset();\r\n }\r\n\r\n /**\r\n * 设置控制器位置\r\n * @param x X 坐标\r\n * @param y Y 坐标\r\n */\r\n public setPosition(x: number, y: number): void {\r\n this.panControls.setPosition(x, y);\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n this.panControls.setZoom(zoom);\r\n }\r\n\r\n /**\r\n * 获取当前缩放级别\r\n * @returns 缩放级别\r\n */\r\n public getZoom(): number {\r\n return this.panControls.object.zoom;\r\n }\r\n\r\n /**\r\n * 启用/禁用缩放\r\n * @param enabled 是否启用\r\n */\r\n public setEnableZoom(enabled: boolean): void {\r\n this.panControls.enableZoom = enabled;\r\n }\r\n\r\n /**\r\n * 启用/禁用平移\r\n * @param enabled 是否启用\r\n */\r\n public setEnablePan(enabled: boolean): void {\r\n this.panControls.enablePan = enabled;\r\n }\r\n\r\n /**\r\n * 启用/禁用阻尼效果\r\n * @param enabled 是否启用\r\n */\r\n public setEnableDamping(enabled: boolean): void {\r\n this.panControls.enableDamping = enabled;\r\n }\r\n\r\n /**\r\n * 设置阻尼系数\r\n * @param factor 阻尼系数 (0-1)\r\n */\r\n public setDampingFactor(factor: number): void {\r\n this.panControls.dampingFactor = Math.max(0, Math.min(factor, 1));\r\n }\r\n\r\n /**\r\n * 设置缩放速度\r\n * @param speed 缩放速度\r\n */\r\n public setZoomSpeed(speed: number): void {\r\n this.panControls.zoomSpeed = Math.max(0.1, speed);\r\n }\r\n\r\n /**\r\n * 设置缩放限制\r\n * @param min 最小缩放\r\n * @param max 最大缩放\r\n */\r\n public setZoomLimits(min: number, max: number): void {\r\n this.panControls.minZoom = min;\r\n this.panControls.maxZoom = max;\r\n }\r\n\r\n /**\r\n * 销毁控制器模块\r\n */\r\n public dispose(): void {\r\n this.panControls.dispose();\r\n this.panControls = null as any;\r\n }\r\n}\r\n\r\nexport default ControlModule2d;\r\n","import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\n/**\n * A loader for loading fonts.\n *\n * You can convert fonts online using [facetype.js](https://gero3.github.io/facetype.js/).\n *\n * ```js\n * const loader = new FontLoader();\n * const font = await loader.loadAsync( 'fonts/helvetiker_regular.typeface.json' );\n * ```\n *\n * @augments Loader\n * @three_import import { FontLoader } from 'three/addons/loaders/FontLoader.js';\n */\nclass FontLoader extends Loader {\n\n\t/**\n\t * Constructs a new font loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded font\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Font)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tconst font = scope.parse( JSON.parse( text ) );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given font data and returns the resulting font.\n\t *\n\t * @param {Object} json - The raw font data as a JSON object.\n\t * @return {Font} The font.\n\t */\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n/**\n * Class representing a font.\n */\nclass Font {\n\n\t/**\n\t * Constructs a new font.\n\t *\n\t * @param {Object} data - The font data as JSON.\n\t */\n\tconstructor( data ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFont = true;\n\n\t\tthis.type = 'Font';\n\n\t\t/**\n\t\t * The font data as JSON.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.data = data;\n\n\t}\n\n\t/**\n\t * Generates geometry shapes from the given text and size. The result of this method\n\t * should be used with {@link ShapeGeometry} to generate the actual geometry data.\n\t *\n\t * @param {string} text - The text.\n\t * @param {number} [size=100] - The text size.\n\t * @param {string} [direction='ltr'] - Char direction: ltr(left to right), rtl(right to left) & tb(top bottom).\n\t * @return {Array<Shape>} An array of shapes representing the text.\n\t */\n\tgenerateShapes( text, size = 100, direction = 'ltr' ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data, direction );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tshapes.push( ...paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data, direction ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tif ( direction == 'rtl' || direction == 'tb' ) {\n\n\t\tchars.reverse();\n\n\t}\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\n\t\t\tif ( direction == 'tb' ) {\n\n\t\t\t\toffsetX = 0;\n\t\t\t\toffsetY += data.ascender * scale;\n\n\t\t\t} else {\n\n\t\t\t\toffsetX += ret.offsetX;\n\n\t\t\t}\n\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nexport { FontLoader, Font };\n","/**\n * FontJsonGenerator - 将 TTF/OTF 字体转换为 Three.js typeface.json 格式。\n * 使用 opentype.js 解析字体轮廓,并兼容中文等 Unicode 字符。\n */\n\nimport * as opentype from 'opentype.js';\nimport { Font, FontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nexport interface TypefaceGlyph {\n x_min: number;\n x_max: number;\n /** horizontal advance */\n ha: number;\n /** 路径指令:m moveTo / l lineTo / q quadratic / b cubic / z close */\n o: string;\n}\n\nexport interface TypefaceJson {\n familyName: string;\n ascender: number;\n descender: number;\n underlinePosition: number;\n underlineThickness: number;\n boundingBox: { yMin: number; xMin: number; yMax: number; xMax: number };\n resolution: number;\n original_font_information: Record<string, string>;\n cssFontStyle: string;\n cssFontWeight: string;\n glyphs: Record<string, TypefaceGlyph>;\n}\n\nexport interface GeneratorOptions {\n /** 只提取这些字符;不传则提取字体 cmap 中的全部字符。 */\n chars?: string;\n}\n\ntype Point2D = { x: number; y: number };\n\ntype OutlineSegment = {\n type: 'L' | 'Q' | 'C';\n start: Point2D;\n end: Point2D;\n x1?: number;\n y1?: number;\n x2?: number;\n y2?: number;\n};\n\ntype OutlineContour = {\n segments: OutlineSegment[];\n points: Point2D[];\n};\n\ntype ContourEntry = {\n contour: OutlineContour;\n index: number;\n depth: number;\n absArea: number;\n};\n\nexport class FontJsonGenerator {\n /** 从 URL 加载 TTF/OTF 字体,生成 Three.js typeface.json。 */\n static async fromUrl(fontUrl: string, options?: GeneratorOptions): Promise<TypefaceJson> {\n const res = await fetch(fontUrl);\n if (!res.ok) throw new Error(`FontJsonGenerator: 无法加载 ${fontUrl} (${res.status})`);\n const buffer = await res.arrayBuffer();\n return FontJsonGenerator.fromArrayBuffer(buffer, options);\n }\n\n /** 从 ArrayBuffer 解析字体,生成 typeface.json。 */\n static fromArrayBuffer(buffer: ArrayBuffer, options?: GeneratorOptions): TypefaceJson {\n const font = opentype.parse(buffer);\n return FontJsonGenerator._convert(font, options?.chars);\n }\n\n /** 将 typeface.json 转为 Three.js Font 对象,可直接用于文字几何。 */\n static toThreeFont(json: TypefaceJson): Font {\n return new FontLoader().parse(json as any);\n }\n\n private static _convert(font: opentype.Font, chars?: string): TypefaceJson {\n const glyphs: Record<string, TypefaceGlyph> = {};\n const upm = font.unitsPerEm;\n const r = (n: number) => Math.round(n);\n\n const extractChar = (char: string) => {\n const glyph = font.charToGlyph(char);\n if (!glyph || glyph.index === 0) return;\n\n const parts = FontJsonGenerator._commandsToTypefaceOutline(glyph.path.commands as any[], r);\n const bb = glyph.getBoundingBox();\n glyphs[char] = {\n x_min: bb.x1,\n x_max: bb.x2,\n ha: glyph.advanceWidth ?? 0,\n o: parts.join(' '),\n };\n };\n\n if (chars) {\n for (const ch of chars) extractChar(ch);\n } else {\n const glyphIndexMap = (font.tables as any).cmap?.glyphIndexMap ?? {};\n for (const cpStr of Object.keys(glyphIndexMap)) {\n const cp = Number.parseInt(cpStr, 10);\n if (cp > 0) extractChar(String.fromCodePoint(cp));\n }\n }\n\n // 空格必须存在,否则 Three Font 在生成文字时会报缺字。\n if (!glyphs[' ']) {\n const spGlyph = font.charToGlyph(' ');\n glyphs[' '] = {\n x_min: 0,\n x_max: 0,\n ha: spGlyph?.advanceWidth ?? Math.round(upm / 4),\n o: '',\n };\n }\n\n const names = font.names as any;\n const get = (k: string) => (names[k]?.en ?? names[k]?.zh ?? '') as string;\n const familyName = get('fontFamily') || 'Custom Font';\n const subfamily = get('fontSubfamily') || 'Regular';\n\n return {\n familyName,\n ascender: font.ascender,\n descender: font.descender,\n underlinePosition: (font.tables as any).post?.underlinePosition ?? -100,\n underlineThickness: (font.tables as any).post?.underlineThickness ?? 50,\n boundingBox: { yMin: font.descender, xMin: 0, yMax: font.ascender, xMax: upm },\n resolution: upm,\n original_font_information: { fontFamily: familyName, fontSubfamily: subfamily },\n cssFontStyle: subfamily.toLowerCase().includes('italic') ? 'italic' : 'normal',\n cssFontWeight: subfamily.toLowerCase().includes('bold') ? 'bold' : 'normal',\n glyphs,\n };\n }\n\n /** 将 opentype 命令拆为闭合轮廓,并输出为 Three 更稳定的“外轮廓 -> 孔洞”顺序。 */\n private static _commandsToTypefaceOutline(commands: any[], r: (n: number) => number): string[] {\n const contours = FontJsonGenerator._splitContours(commands);\n const entries = FontJsonGenerator._createContourEntries(contours);\n const solids = entries.filter((entry) => entry.depth % 2 === 0);\n const holes = entries.filter((entry) => entry.depth % 2 === 1);\n const parts: string[] = [];\n\n solids\n .sort((a, b) => a.index - b.index)\n .forEach((solid) => {\n FontJsonGenerator._appendNormalizedContour(solid.contour, true, parts, r);\n\n // simfang 等字体可能按“孔洞、外轮廓、孔洞”排列;Three 对这种顺序会误填孔洞。\n holes\n .filter((hole) => FontJsonGenerator._findParentSolid(hole, solids) === solid)\n .sort((a, b) => a.index - b.index)\n .forEach((hole) => FontJsonGenerator._appendNormalizedContour(hole.contour, false, parts, r));\n });\n\n return parts;\n }\n\n private static _createContourEntries(contours: OutlineContour[]): ContourEntry[] {\n return contours\n .filter((contour) => contour.segments.length > 0)\n .map((contour, index) => {\n const sample = FontJsonGenerator._samplePoint(contour);\n const depth = contours.reduce((count, other) => {\n if (other === contour || other.points.length < 3) return count;\n return FontJsonGenerator._pointInPolygon(sample, other.points) ? count + 1 : count;\n }, 0);\n return {\n contour,\n index,\n depth,\n absArea: Math.abs(FontJsonGenerator._signedArea(contour.points)),\n };\n });\n }\n\n private static _findParentSolid(hole: ContourEntry, solids: ContourEntry[]): ContourEntry | undefined {\n const sample = FontJsonGenerator._samplePoint(hole.contour);\n return solids\n .filter((solid) => FontJsonGenerator._pointInPolygon(sample, solid.contour.points))\n .sort((a, b) => a.absArea - b.absArea)[0];\n }\n\n private static _appendNormalizedContour(\n contour: OutlineContour,\n shouldBeClockwise: boolean,\n parts: string[],\n r: (n: number) => number\n ): void {\n // Three ShapePath.toShapes() 默认要求:实心外轮廓顺时针,孔洞逆时针。\n const isClockwise = FontJsonGenerator._signedArea(contour.points) < 0;\n const normalized = isClockwise === shouldBeClockwise\n ? contour.segments\n : FontJsonGenerator._reverseSegments(contour.segments);\n FontJsonGenerator._appendContour(normalized, parts, r);\n }\n\n private static _splitContours(commands: any[]): OutlineContour[] {\n const contours: OutlineContour[] = [];\n let contour: OutlineContour | null = null;\n let current: Point2D | null = null;\n\n const closeContour = () => {\n if (contour && contour.segments.length > 0) contours.push(contour);\n contour = null;\n current = null;\n };\n\n commands.forEach((cmd) => {\n if (cmd.type === 'M') {\n closeContour();\n current = { x: cmd.x, y: cmd.y };\n contour = { segments: [], points: [current] };\n return;\n }\n\n if (!contour || !current) return;\n\n if (cmd.type === 'Z') {\n closeContour();\n return;\n }\n\n const end = { x: cmd.x, y: cmd.y };\n if (cmd.type === 'L') {\n contour.segments.push({ type: 'L', start: current, end });\n } else if (cmd.type === 'Q') {\n contour.segments.push({ type: 'Q', start: current, end, x1: cmd.x1, y1: cmd.y1 });\n } else if (cmd.type === 'C') {\n contour.segments.push({\n type: 'C',\n start: current,\n end,\n x1: cmd.x1,\n y1: cmd.y1,\n x2: cmd.x2,\n y2: cmd.y2,\n });\n }\n\n current = end;\n contour.points.push(end);\n });\n\n closeContour();\n return contours;\n }\n\n private static _appendContour(segments: OutlineSegment[], parts: string[], r: (n: number) => number): void {\n const start = segments[0].start;\n parts.push(`m ${r(start.x)} ${r(start.y)}`);\n\n segments.forEach((segment) => {\n if (segment.type === 'L') {\n parts.push(`l ${r(segment.end.x)} ${r(segment.end.y)}`);\n } else if (segment.type === 'Q') {\n // Three FontLoader 的 q 顺序是:终点、控制点。\n parts.push(`q ${r(segment.end.x)} ${r(segment.end.y)} ${r(segment.x1!)} ${r(segment.y1!)}`);\n } else {\n // Three FontLoader 的 b 顺序是:终点、控制点1、控制点2。\n parts.push(\n `b ${r(segment.end.x)} ${r(segment.end.y)} ${r(segment.x1!)} ${r(segment.y1!)} ${r(segment.x2!)} ${r(segment.y2!)}`\n );\n }\n });\n\n parts.push('z');\n }\n\n private static _reverseSegments(segments: OutlineSegment[]): OutlineSegment[] {\n return segments.slice().reverse().map((segment) => {\n if (segment.type === 'L') {\n return { type: 'L', start: segment.end, end: segment.start };\n }\n if (segment.type === 'Q') {\n return { type: 'Q', start: segment.end, end: segment.start, x1: segment.x1, y1: segment.y1 };\n }\n return {\n type: 'C',\n start: segment.end,\n end: segment.start,\n x1: segment.x2,\n y1: segment.y2,\n x2: segment.x1,\n y2: segment.y1,\n };\n });\n }\n\n private static _signedArea(points: Point2D[]): number {\n let area = 0;\n for (let i = 0, j = points.length - 1; i < points.length; j = i++) {\n area += points[j].x * points[i].y - points[i].x * points[j].y;\n }\n return area / 2;\n }\n\n private static _samplePoint(contour: OutlineContour): Point2D {\n // 不使用点集质心:像数字 0 的外轮廓质心可能落在内孔里,导致外轮廓被误判为孔洞。\n return contour.points[0];\n }\n\n private static _pointInPolygon(point: Point2D, polygon: Point2D[]): boolean {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const pi = polygon[i];\n const pj = polygon[j];\n const intersects = pi.y > point.y !== pj.y > point.y\n && point.x < ((pj.x - pi.x) * (point.y - pi.y)) / (pj.y - pi.y) + pi.x;\n if (intersects) inside = !inside;\n }\n return inside;\n }\n}\n","import { LayerState } from '../managers/layer/index';\r\n\r\n/** LayerPanelUI 所需的数据访问接口,避免与 LayerManager 形成循环依赖 */\r\ninterface LayerPanelDelegate {\n getLayers(): LayerState[];\n getDisplayColor(color: number): number;\n isAllVisible(): boolean;\n toggleLayer(name: string): boolean;\n setAllLayersVisible(visible: boolean): void;\n}\n\r\n/**\r\n * 图层面板 UI 组件\r\n * 在容器右上角展示可拖拽的图层列表面板\r\n * 颜色全部通过 CSS 自定义属性(var(--e2d-xxx))读取,支持动态主题切换\r\n */\r\nexport class LayerPanelUI {\r\n private panel: HTMLElement | null = null;\r\n private listEl: HTMLElement | null = null;\r\n private isVisible = false;\r\n private delegate: LayerPanelDelegate;\r\n\r\n constructor(container: HTMLElement, delegate: LayerPanelDelegate) {\r\n this.delegate = delegate;\r\n this._buildPanel(container);\r\n }\r\n\r\n // ─── 面板开关 ──────────────────────────────────────────\r\n\r\n public show(): void {\r\n if (this.panel) {\r\n this.panel.style.display = 'flex';\r\n this.isVisible = true;\r\n }\r\n }\r\n\r\n public hide(): void {\r\n if (this.panel) {\r\n this.panel.style.display = 'none';\r\n this.isVisible = false;\r\n }\r\n }\r\n\r\n public toggle(): void {\r\n this.isVisible ? this.hide() : this.show();\r\n }\r\n\r\n /** 刷新图层列表(数据变化后调用) */\r\n public refresh(): void {\r\n this._renderList();\r\n }\r\n\r\n // ─── DOM 构建 ──────────────────────────────────────────\r\n\r\n private _buildPanel(container: HTMLElement): void {\r\n const panel = document.createElement('div');\r\n panel.style.cssText = `\r\n position:absolute; top:10px; right:10px;\r\n width:220px; max-height:480px;\r\n background:var(--e2d-bg,#1e1f22);\r\n border:1px solid var(--e2d-border2,#333);\r\n border-radius:4px;\r\n box-shadow:0 4px 16px var(--e2d-shadow,rgba(0,0,0,.6));\r\n display:none; flex-direction:column;\r\n z-index:100; user-select:none;\r\n font-size:13px; color:var(--e2d-text,#e0e0e0);\r\n font-family:system-ui,sans-serif;\r\n `;\r\n this.panel = panel;\r\n\r\n // 标题栏\r\n const header = document.createElement('div');\r\n header.style.cssText = `\r\n display:flex; align-items:center; justify-content:space-between;\r\n padding:8px 10px;\r\n background:var(--e2d-bg3,#222);\r\n border-bottom:1px solid var(--e2d-border2,#333);\r\n border-radius:4px 4px 0 0; cursor:move; flex-shrink:0;\r\n `;\r\n const title = document.createElement('span');\r\n title.textContent = '图层';\r\n title.style.cssText = 'font-size:13px; font-weight:500; color:var(--e2d-text,#e0e0e0);';\r\n\r\n const closeBtn = document.createElement('button');\r\n closeBtn.textContent = '×';\r\n closeBtn.style.cssText = `\r\n background:none; border:none;\r\n color:var(--e2d-close,#aaa);\r\n font-size:18px; line-height:1; cursor:pointer; padding:0 2px;\r\n transition:color 0.15s;\r\n `;\r\n closeBtn.onmouseenter = () => { closeBtn.style.color = 'var(--e2d-close-hover,#fff)'; };\r\n closeBtn.onmouseleave = () => { closeBtn.style.color = 'var(--e2d-close,#aaa)'; };\r\n closeBtn.onclick = () => this.hide();\r\n\r\n header.appendChild(title);\r\n header.appendChild(closeBtn);\r\n this._makeDraggable(panel, header);\r\n\r\n // 全部图层行\r\n const allRow = this._createRow();\r\n const allEye = this._createEye(true);\r\n const allLabel = document.createElement('span');\r\n allLabel.textContent = '全部图层';\r\n allLabel.style.cssText = 'flex:1; font-weight:500; color:var(--e2d-text,#e0e0e0);';\r\n allRow.appendChild(allEye);\r\n allRow.appendChild(allLabel);\r\n allRow.onclick = () => {\r\n const next = !this.delegate.isAllVisible();\r\n this.delegate.setAllLayersVisible(next);\r\n this._renderList();\r\n this._updateEye(allEye, next);\r\n };\r\n\r\n // 分割线\r\n const divider = document.createElement('div');\r\n divider.style.cssText = 'height:1px; background:var(--e2d-border2,#333); margin:0 8px; flex-shrink:0;';\r\n\r\n // 图层列表容器(可滚动)\r\n const list = document.createElement('div');\r\n list.style.cssText = `\r\n overflow-y:auto; flex:1;\r\n scrollbar-width:thin;\r\n scrollbar-color:var(--e2d-scrollbar,#444) transparent;\r\n `;\r\n this.listEl = list;\r\n\r\n panel.appendChild(header);\r\n panel.appendChild(allRow);\r\n panel.appendChild(divider);\r\n panel.appendChild(list);\r\n\r\n // 每次 _renderList 后同步全部图层眼睛图标状态\r\n const origRender = this._renderList.bind(this);\r\n this._renderList = () => {\r\n origRender();\r\n this._updateEye(allEye, this.delegate.isAllVisible());\r\n };\r\n\r\n this._renderList();\r\n\r\n container.style.position = 'relative';\r\n container.appendChild(panel);\r\n }\r\n\r\n private _renderList(): void {\r\n const list = this.listEl;\r\n if (!list) return;\r\n list.innerHTML = '';\r\n for (const layer of this.delegate.getLayers()) {\r\n const row = this._createRow();\r\n const eye = this._createEye(layer.visible);\r\n const swatch = document.createElement('span');\r\n swatch.style.cssText = `\r\n width:14px; height:14px; border-radius:2px; flex-shrink:0;\r\n border:1px solid var(--e2d-swatch-border,#444);\r\n background:${this._colorToHex(this.delegate.getDisplayColor(layer.color))};\n `;\n const label = document.createElement('span');\r\n label.textContent = layer.name;\r\n label.style.cssText = `\r\n flex:1; white-space:nowrap; overflow:hidden;\r\n text-overflow:ellipsis; font-size:12px;\r\n color:${layer.visible ? 'var(--e2d-text,#ddd)' : 'var(--e2d-text4,#666)'};\r\n transition:color 0.15s;\r\n `;\r\n\r\n row.appendChild(eye);\r\n row.appendChild(swatch);\r\n row.appendChild(label);\r\n\r\n row.onclick = () => {\r\n const next = this.delegate.toggleLayer(layer.name);\r\n this._updateEye(eye, next);\r\n label.style.color = next ? 'var(--e2d-text,#ddd)' : 'var(--e2d-text4,#666)';\r\n };\r\n\r\n list.appendChild(row);\r\n }\r\n }\r\n\r\n private _createRow(): HTMLElement {\r\n const row = document.createElement('div');\r\n row.style.cssText = `\r\n display:flex; align-items:center; gap:8px;\r\n padding:5px 10px; cursor:pointer;\r\n border-bottom:1px solid var(--e2d-border2,#222);\r\n transition:background 0.1s;\r\n `;\r\n row.onmouseenter = () => { row.style.background = 'var(--e2d-bg-hover,#2a2a2a)'; };\r\n row.onmouseleave = () => { row.style.background = ''; };\r\n return row;\r\n }\r\n\r\n private _createEye(open: boolean): HTMLElement {\r\n const el = document.createElement('span');\r\n el.style.cssText = 'display:flex; align-items:center; flex-shrink:0; width:16px;';\r\n this._updateEye(el, open);\r\n return el;\r\n }\r\n\r\n private _updateEye(el: HTMLElement, open: boolean): void {\r\n // 通过 CSS color 继承,SVG 使用 currentColor,由此响应主题变量\r\n el.style.color = open ? 'var(--e2d-close,#aaa)' : 'var(--e2d-text4,#555)';\r\n el.innerHTML = open\r\n ? `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8 3C4.5 3 1.5 8 1.5 8C1.5 8 4.5 13 8 13C11.5 13 14.5 8 14.5 8C14.5 8 11.5 3 8 3Z\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n </svg>`\r\n : `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 2L14 14\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M8 3C4.5 3 1.5 8 1.5 8C2.2 9.3 3.3 10.5 4.5 11.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M11.5 11.5C12.7 10.5 13.8 9.3 14.5 8C14.5 8 11.5 3 8 3\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n </svg>`;\r\n }\r\n\r\n private _colorToHex(color: number): string {\r\n return '#' + color.toString(16).padStart(6, '0');\r\n }\r\n\r\n private _makeDraggable(panel: HTMLElement, handle: HTMLElement): void {\r\n handle.onmousedown = (e: MouseEvent) => {\r\n e.preventDefault();\r\n const panelRect = panel.getBoundingClientRect();\r\n const parentRect = (panel.offsetParent as HTMLElement)?.getBoundingClientRect() ?? { left: 0, top: 0 };\r\n\r\n panel.style.left = (panelRect.left - parentRect.left) + 'px';\r\n panel.style.top = (panelRect.top - parentRect.top) + 'px';\r\n panel.style.right = 'auto';\r\n panel.style.bottom = 'auto';\r\n\r\n const ox = e.clientX - panelRect.left;\r\n const oy = e.clientY - panelRect.top;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n panel.style.left = (ev.clientX - ox - parentRect.left) + 'px';\r\n panel.style.top = (ev.clientY - oy - parentRect.top) + 'px';\r\n };\r\n const onUp = () => {\r\n document.removeEventListener('mousemove', onMove);\r\n document.removeEventListener('mouseup', onUp);\r\n };\r\n document.addEventListener('mousemove', onMove);\r\n document.addEventListener('mouseup', onUp);\r\n };\r\n }\r\n\r\n public dispose(): void {\r\n this.panel?.remove();\r\n this.panel = null;\r\n this.listEl = null;\r\n }\r\n}\r\n","import { DWGLayer } from '../../types/dwgTypes';\r\nimport { LayerPanelUI } from '../../ui/layerPanelUI';\r\n\r\nexport interface LayerState extends DWGLayer {}\r\n \r\n\r\nexport class LayerManager {\r\n private engine: any;\r\n private layerMap = new Map<string, LayerState>();\r\n private panelUI: LayerPanelUI | null = null;\r\n\r\n constructor(engine: any) {\r\n this.engine = engine; \r\n const container: HTMLElement | null =\r\n document.getElementById(engine?.options?.containerId ?? '') ??\r\n engine?.container ?? null;\r\n\r\n if (container) {\r\n this.panelUI = new LayerPanelUI(container, this);\r\n }\r\n }\r\n\r\n // ─── 数据 ──────────────────────────────────────────────\r\n\r\n public _loadLayers(layers: DWGLayer[] = this.engine.dwgData?.layers ?? []): void {\n this.layerMap.clear();\n for (const layer of layers) {\n this.layerMap.set(layer.name, { ...layer });\n }\n this.panelUI?.refresh();\n }\n\r\n public syncFromModel(layers: DWGLayer[]): void {\r\n if (layers?.length > 0) {\r\n this._loadLayers(layers);\r\n this.panelUI?.refresh();\r\n }\r\n }\r\n\r\n public getLayers(): LayerState[] {\n return Array.from(this.layerMap.values());\n }\n\n /** 按当前背景返回图层在面板上的显示色,和场景图元保持一致。 */\n public getDisplayColor(color: number): number {\n return this.engine.modelToolModule2d?.getDisplayColor(color) ?? color;\n }\n\n public refresh(): void {\n this.panelUI?.refresh();\n }\n\n public setLayerVisible(layerName: string, visible: boolean): void {\n const state = this.layerMap.get(layerName);\n if (state) state.visible = visible;\n this._applyVisibility(layerName, visible);\n if (!visible) this.clearInteractiveStateForLayer(layerName);\n }\n\r\n public toggleLayer(layerName: string): boolean {\r\n const state = this.layerMap.get(layerName);\r\n if (!state) return true;\r\n const next = !state.visible;\r\n this.setLayerVisible(layerName, next);\r\n return next;\r\n }\r\n\r\n public setAllLayersVisible(visible: boolean): void {\r\n for (const name of this.layerMap.keys()) {\r\n const state = this.layerMap.get(name)!;\r\n state.visible = visible;\r\n this._applyVisibility(name, visible);\r\n }\r\n }\r\n\r\n public isAllVisible(): boolean {\n return Array.from(this.layerMap.values()).every(l => l.visible);\n }\n\n /** 判断单个图层是否可见;未登记图层默认可见,避免旧数据被误过滤。 */\n public isLayerVisible(layerName?: string): boolean {\n if (!layerName) return true;\n const state = this.layerMap.get(layerName);\n return state?.visible !== false;\n }\n\n /** 判断指定图元是否仍处在可见图层中,用于 hover 和点击拾取过滤。 */\n public isModelVisibleByLayer(modelId: any): boolean {\n const nodes = this.engine.loaderModule2d?.model?.nodeMap?.get(String(modelId)) ?? this.engine.loaderModule2d?.model?.nodeMap?.get(modelId);\n if (!nodes || nodes.length === 0) return true;\n return nodes.some((node: any) => {\n const object = this.getNodeObject(node);\n return this.isLayerVisible(node?.layer) && object?.visible !== false;\n });\n }\n\n private _applyVisibility(layerName: string, visible: boolean): void {\n const root = this.engine?.modelGroup ?? this.engine?.scene;\n if (!root) return;\n const prefix = layerName + '||';\n // 2D 模型对象挂在 modelGroup 内部,递归遍历才能覆盖图块展开后的线、文字和填充。\n root.traverse((obj: any) => {\n if (obj.name?.startsWith(prefix)) obj.visible = visible;\n });\n }\n\n private getNodeObject(node: any): any {\n return node?.object ?? node?.group?.children?.[node.indexes?.[0]] ?? this.engine.modelGroup?.children?.[node.indexes?.[0]];\n }\n\n /** 图层被隐藏时,清理该图层上已有的 hover/选中高亮。 */\n private clearInteractiveStateForLayer(layerName: string): void {\n const activeIds = [\n ...(this.engine.engineStatus2d?.highlightModels ?? []),\n ...(this.engine.engineStatus2d?.highlightHoverModels ?? []),\n ];\n if (activeIds.length === 0) return;\n\n const shouldClear = activeIds.some((id: any) => {\n const nodes = this.engine.loaderModule2d?.model?.nodeMap?.get(String(id)) ?? this.engine.loaderModule2d?.model?.nodeMap?.get(id);\n return nodes?.some((node: any) => node?.layer === layerName);\n });\n if (!shouldClear) return;\n\n this.engine.modelToolModule2d?.unHighlightModelHover?.();\n this.engine.modelToolModule2d?.unhighlightAllModels?.();\n }\n\r\n // ─── 面板开关(代理到 UI) ──────────────────────────────\r\n\r\n public show(): void { this.panelUI?.show(); }\r\n public hide(): void { this.panelUI?.hide(); }\r\n public toggle(): void { this.panelUI?.toggle(); }\r\n\r\n public dispose(): void {\r\n this.panelUI?.dispose();\r\n this.panelUI = null;\r\n this.layerMap.clear();\r\n }\r\n}\r\n","import * as THREE from 'three';\n\n/** 将导出器里的数组点或对象点统一转为 Three Vector3。 */\nexport function toVector3(point: any): THREE.Vector3 {\n // 兼容导出器里的数组点和对象点两种格式。\n if (Array.isArray(point)) {\n return new THREE.Vector3(point[0] ?? 0, point[1] ?? 0, point[2] ?? 0);\n }\n return new THREE.Vector3(point?.x ?? 0, point?.y ?? 0, point?.z ?? 0);\n}\n\n/** 计算 BufferGeometry 包围盒,并用克隆值避免后续修改污染原 geometry。 */\nexport function getGeometryBounds(geometry?: THREE.BufferGeometry): { min: THREE.Vector3; max: THREE.Vector3 } {\n if (!geometry) {\n return { min: new THREE.Vector3(), max: new THREE.Vector3() };\n }\n geometry.computeBoundingBox();\n return {\n min: geometry.boundingBox?.min.clone() ?? new THREE.Vector3(),\n max: geometry.boundingBox?.max.clone() ?? new THREE.Vector3(),\n };\n}\n\n/** 兼容旧版 position/scale/rotation 字段的矩阵组合方式。 */\nexport function composeMatrix(position_: any, scale_: any, rotation_: any): THREE.Matrix4 {\n const position = new THREE.Vector3(position_[0] ?? 0, position_[1] ?? 0, position_[2] ?? 0);\n const rotation = new THREE.Euler(0, 0, rotation_ ?? 0);\n const scale = new THREE.Vector3(scale_[0] ?? 1, scale_[1] ?? 1, scale_[2] ?? 1);\n const quaternion = new THREE.Quaternion().setFromEuler(rotation);\n return new THREE.Matrix4().compose(position, quaternion, scale);\n}\n\n/** 获取 INSERT 变换矩阵;新版数据以 transformMatrix 为唯一可信变换来源。 */\nexport function getInsertMatrix(entity: any): THREE.Matrix4 {\n if (Array.isArray(entity?.transformMatrix) && entity.transformMatrix.length === 16) {\n // transformMatrix 的平移位于 12/13/14,等价于 three.js Matrix4.elements 布局。\n return new THREE.Matrix4().fromArray(entity.transformMatrix);\n }\n\n return composeMatrix(\n entity.position ?? [0, 0, 0],\n entity.scale ?? [1, 1, 1],\n entity.rotation ?? 0,\n );\n}\n\n/** 从线段点集计算选择和索引用包围盒。 */\nexport function getPointsBounds(points: THREE.Vector3[]): { min: THREE.Vector3; max: THREE.Vector3 } {\n if (points.length === 0) {\n return { min: new THREE.Vector3(), max: new THREE.Vector3() };\n }\n const min = new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n const max = new THREE.Vector3(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY);\n points.forEach((point) => {\n min.x = Math.min(min.x, point.x);\n min.y = Math.min(min.y, point.y);\n min.z = Math.min(min.z, point.z);\n max.x = Math.max(max.x, point.x);\n max.y = Math.max(max.y, point.y);\n max.z = Math.max(max.z, point.z);\n });\n return {\n min,\n max,\n };\n}\n","import * as THREE from 'three';\r\nimport { EntityGeometryFactory } from './EntityGeometryFactory';\r\nimport { getGeometryBounds, getInsertMatrix } from './geometryUtils';\r\nimport { RenderItem2d } from './types';\r\n\r\ninterface ClipVertex2d {\r\n position: THREE.Vector3;\r\n uv?: THREE.Vector2;\r\n}\r\n\r\n/** 展开 block/INSERT 嵌套关系,将所有可渲染内容转换成全局坐标 RenderItem。 */\r\nexport class BlockFlattener {\r\n private readonly cache = new Map<string, RenderItem2d[]>();\r\n private readonly blockIndex = new Map<string, any>();\r\n\r\n constructor(\r\n private readonly geometryFactory: EntityGeometryFactory,\r\n ) {}\r\n\r\n /** 重建 block 索引;每次加载新模型前都需要清空缓存。 */\r\n public setBlocks(blocks: any[]): void {\n this.cache.clear();\n this.blockIndex.clear();\n (blocks ?? []).forEach((block) => {\r\n if (block?.name) this.blockIndex.set(block.name, block);\r\n if (block?.id) this.blockIndex.set(block.id, block);\n });\n }\n\n /** 清理已展开 block 缓存;每个 tile 合批后释放基础几何,避免加载过程中持续累积。 */\n public clearCache(): void {\n this.cache.clear();\n }\n\r\n /** 展开根实体列表,根实体通常来自新 tile inserts。 */\n public flattenRootEntities(entities: any[]): RenderItem2d[] {\n return Array.from(this.iterateRootEntities(entities));\n }\n\n /** 流式展开根实体,避免一次性持有整个 tile 的 RenderItem 中间数组。 */\n public *iterateRootEntities(entities: any[]): IterableIterator<RenderItem2d> {\n yield* this.iterateEntities(entities ?? [], new THREE.Matrix4(), 0);\n }\n\r\n /** 展开单个 block 定义;缓存只保存未裁剪的本地渲染项,裁剪 INSERT 必须在实例层单独处理。 */\r\n private flattenBlock(block: any, blockId: string, level: number): RenderItem2d[] {\r\n const cached = this.cache.get(blockId);\r\n if (cached) return cached;\r\n\r\n const origin = block.origin ?? [0, 0, 0];\r\n const baseMatrix = new THREE.Matrix4().makeTranslation(-origin[0], -origin[1], -(origin[2] ?? 0));\r\n const items = this.flattenEntities(block.entities ?? [], baseMatrix, level);\r\n this.cache.set(blockId, items);\r\n if (block.name) this.cache.set(block.name, items);\r\n if (block.id) this.cache.set(block.id, items);\r\n return items;\r\n }\r\n\r\n /** 递归展开实体;INSERT 只应用 transformMatrix,不使用 min/max 反推位置。 */\n private flattenEntities(entities: any[], baseMatrix: THREE.Matrix4, level: number): RenderItem2d[] {\n return Array.from(this.iterateEntities(entities, baseMatrix, level));\n }\n\n /** 递归逐项展开实体;根 tile 使用该路径时可以边生成边合批,降低峰值内存。 */\n private *iterateEntities(entities: any[], baseMatrix: THREE.Matrix4, level: number): IterableIterator<RenderItem2d> {\n if (level > 20) {\n console.warn('[LoaderModule2d] Block nesting is too deep, skip nested INSERT.');\n return;\n }\n\n for (const entity of entities) {\n if (entity?.visible === false) continue;\n if (entity.type === 'INSERT') {\n const blockItems = this.getBlockItems(entity.blockId, level + 1);\n const matrix = baseMatrix.clone().multiply(getInsertMatrix(entity));\n const clipPolygon = this.getClipPolygon(entity, baseMatrix);\n for (const item of blockItems) {\n const cloned = this.cloneRenderItem(item, matrix, entity);\n const clipped = clipPolygon ? this.clipRenderItem(cloned, clipPolygon) : cloned;\n if (clipped) yield clipped;\n }\n if (clipPolygon && entity.displayClipBoundary === true) {\n yield this.createClipBoundaryItem(entity, clipPolygon);\n }\n continue;\n }\n\n for (const item of this.geometryFactory.create(entity, baseMatrix)) {\n yield item;\n }\n }\n }\n\r\n /** 按 blockId/name 获取缓存后的 block 渲染项,避免重复生成基础几何。 */\r\n private getBlockItems(blockId: string, level: number): RenderItem2d[] {\r\n const cached = this.cache.get(blockId);\r\n if (cached) return cached;\r\n\r\n const block = this.blockIndex.get(blockId);\r\n if (!block) {\r\n console.warn(`[LoaderModule2d] Missing block: ${blockId}`);\r\n return [];\r\n }\r\n return this.flattenBlock(block, block.name ?? block.id ?? blockId, level);\r\n }\r\n\r\n /** 克隆 block 内渲染项并应用 INSERT 矩阵,同时处理 BYBLOCK/BYLAYER 风格继承。 */\r\n private cloneRenderItem(item: RenderItem2d, matrix: THREE.Matrix4, insertEntity: any): RenderItem2d {\r\n const layer = item.layer === '0' && insertEntity?.layer ? insertEntity.layer : (item.layer ?? insertEntity?.layer);\r\n const color = item.color == null || item.color === 0 ? (insertEntity?.color ?? item.color ?? 0) : item.color;\r\n const linkId = insertEntity?.linkId ?? insertEntity?.id ?? item.linkId;\r\n\r\n if (item.kind === 'line') {\r\n return {\r\n ...item,\r\n layer,\r\n color,\r\n linkId,\r\n points: (item.points ?? []).map((point) => point.clone().applyMatrix4(matrix)),\r\n };\r\n }\r\n\r\n const geometry = item.geometry?.clone();\r\n geometry?.applyMatrix4(matrix);\r\n const textAnchor = item.textAnchor?.clone().applyMatrix4(matrix);\r\n const bounds = getGeometryBounds(geometry);\r\n return { ...item, layer, color, linkId, geometry, min: bounds.min, max: bounds.max, textAnchor };\r\n }\r\n\r\n /** 读取 INSERT 多边形裁剪边界;clipInsertTransform 表示裁剪边界相对当前 INSERT 的附加变换。 */\r\n private getClipPolygon(insertEntity: any, baseMatrix: THREE.Matrix4): THREE.Vector3[] | null {\r\n if (insertEntity?.clipping !== true || !Array.isArray(insertEntity?.clipBoundary)) return null;\r\n const points: THREE.Vector3[] = insertEntity.clipBoundary\r\n .map((point: any) => new THREE.Vector3(point?.[0] ?? point?.x ?? 0, point?.[1] ?? point?.y ?? 0, point?.[2] ?? point?.z ?? 0))\r\n .filter((point: THREE.Vector3) => Number.isFinite(point.x) && Number.isFinite(point.y));\r\n if (points.length < 3) return null;\r\n\r\n const clipTransform = this.getClipBoundaryMatrix(insertEntity, baseMatrix);\r\n if (!clipTransform) return points;\r\n return points.map((point: THREE.Vector3) => point.clone().applyMatrix4(clipTransform));\r\n }\r\n\r\n /** clipInsertTransform 已经表达裁剪边界到实例裁剪坐标的关系;这里只叠加外层 block 的基准矩阵。 */\r\n private getClipBoundaryMatrix(insertEntity: any, baseMatrix: THREE.Matrix4): THREE.Matrix4 | null {\r\n if (!Array.isArray(insertEntity?.clipInsertTransform) || insertEntity.clipInsertTransform.length !== 16) return null;\r\n return baseMatrix.clone().multiply(new THREE.Matrix4().fromArray(insertEntity.clipInsertTransform));\r\n }\r\n\r\n /** 对单个 RenderItem 做实例级裁剪,返回 null 表示该实例被完全裁掉。 */\r\n private clipRenderItem(item: RenderItem2d, polygon: THREE.Vector3[]): RenderItem2d | null {\r\n if (item.kind === 'line') {\r\n const points = this.clipLinePoints(item.points ?? [], polygon);\r\n if (points.length === 0) return null;\r\n const bounds = this.getPointsBounds(points);\r\n return { ...item, points, min: bounds.min, max: bounds.max };\r\n }\r\n\r\n const geometry = this.clipGeometry(item.geometry, polygon);\r\n if (!geometry) return null;\r\n const bounds = getGeometryBounds(geometry);\r\n return { ...item, geometry, min: bounds.min, max: bounds.max };\r\n }\r\n\r\n /** 线段按点对裁剪,保留落在任意简单多边形内的部分。 */\r\n private clipLinePoints(points: THREE.Vector3[], polygon: THREE.Vector3[]): THREE.Vector3[] {\r\n const result: THREE.Vector3[] = [];\r\n for (let index = 0; index < points.length - 1; index += 2) {\r\n this.clipSegmentByPolygon(points[index], points[index + 1], polygon).forEach((segment) => {\r\n result.push(segment[0], segment[1]);\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /** 任意多边形线段裁剪:先按边界交点切分,再用中点判断每段是否在内部。 */\r\n private clipSegmentByPolygon(start: THREE.Vector3, end: THREE.Vector3, polygon: THREE.Vector3[]): [THREE.Vector3, THREE.Vector3][] {\r\n const direction = end.clone().sub(start);\r\n const parameters = [0, 1];\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n const t = this.getSegmentIntersectionParameter(start, end, polygon[index], polygon[(index + 1) % polygon.length]);\r\n if (t != null && t > 1e-9 && t < 1 - 1e-9) parameters.push(t);\r\n }\r\n\r\n const sorted = Array.from(new Set(parameters.map((value) => Number(value.toFixed(12))))).sort((a, b) => a - b);\r\n const segments: [THREE.Vector3, THREE.Vector3][] = [];\r\n for (let index = 0; index < sorted.length - 1; index += 1) {\r\n const startT = sorted[index];\r\n const endT = sorted[index + 1];\r\n if (endT - startT < 1e-10) continue;\r\n const midT = (startT + endT) * 0.5;\r\n const mid = start.clone().add(direction.clone().multiplyScalar(midT));\r\n if (this.isPointInPolygon(mid, polygon)) {\r\n segments.push([\r\n start.clone().add(direction.clone().multiplyScalar(startT)),\r\n start.clone().add(direction.clone().multiplyScalar(endT)),\r\n ]);\r\n }\r\n }\r\n return segments;\r\n }\r\n\r\n /** 计算两条线段交点在第一条线段上的参数 t。 */\r\n private getSegmentIntersectionParameter(a: THREE.Vector3, b: THREE.Vector3, c: THREE.Vector3, d: THREE.Vector3): number | null {\r\n const rX = b.x - a.x;\r\n const rY = b.y - a.y;\r\n const sX = d.x - c.x;\r\n const sY = d.y - c.y;\r\n const denominator = rX * sY - rY * sX;\r\n if (Math.abs(denominator) < 1e-12) return null;\r\n const cax = c.x - a.x;\r\n const cay = c.y - a.y;\r\n const t = (cax * sY - cay * sX) / denominator;\r\n const u = (cax * rY - cay * rX) / denominator;\r\n return t >= -1e-9 && t <= 1 + 1e-9 && u >= -1e-9 && u <= 1 + 1e-9 ? THREE.MathUtils.clamp(t, 0, 1) : null;\r\n }\r\n\r\n /** 射线法判断点是否在多边形内,边界点按内部处理。 */\r\n private isPointInPolygon(point: THREE.Vector3, polygon: THREE.Vector3[]): boolean {\r\n let inside = false;\r\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i, i += 1) {\r\n const a = polygon[i];\r\n const b = polygon[j];\r\n if (this.isPointOnSegment(point, a, b)) return true;\r\n const intersect = ((a.y > point.y) !== (b.y > point.y)) && (point.x < ((b.x - a.x) * (point.y - a.y)) / (b.y - a.y) + a.x);\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n }\r\n\r\n private isPointOnSegment(point: THREE.Vector3, start: THREE.Vector3, end: THREE.Vector3): boolean {\r\n const cross = (end.x - start.x) * (point.y - start.y) - (end.y - start.y) * (point.x - start.x);\r\n if (Math.abs(cross) > 1e-8) return false;\r\n const dot = (point.x - start.x) * (end.x - start.x) + (point.y - start.y) * (end.y - start.y);\r\n const lengthSq = (end.x - start.x) ** 2 + (end.y - start.y) ** 2;\r\n return dot >= -1e-8 && dot <= lengthSq + 1e-8;\r\n }\r\n\r\n /** 裁剪三角网格;如果几何带 UV,会同步插值 UV,避免图片裁剪后纹理拉伸。 */\r\n private clipGeometry(geometry: THREE.BufferGeometry | undefined, polygon: THREE.Vector3[]): THREE.BufferGeometry | null {\r\n if (!geometry?.attributes?.position) return null;\r\n const position = geometry.attributes.position;\r\n const uv = geometry.attributes.uv;\r\n const index = geometry.index;\r\n const positions: number[] = [];\r\n const uvs: number[] = [];\r\n const hasUv = !!uv;\r\n const clipTriangles = this.triangulateClipPolygon(polygon);\r\n\r\n const readVertex = (vertexIndex: number): ClipVertex2d => ({\r\n position: new THREE.Vector3(position.getX(vertexIndex), position.getY(vertexIndex), position.getZ(vertexIndex)),\r\n uv: hasUv ? new THREE.Vector2(uv.getX(vertexIndex), uv.getY(vertexIndex)) : undefined,\r\n });\r\n const vertexCount = index ? index.count : position.count;\r\n\r\n for (let offset = 0; offset < vertexCount; offset += 3) {\r\n const a = index ? index.getX(offset) : offset;\r\n const b = index ? index.getX(offset + 1) : offset + 1;\r\n const c = index ? index.getX(offset + 2) : offset + 2;\r\n const subject = [readVertex(a), readVertex(b), readVertex(c)];\r\n clipTriangles.forEach((clipTriangle) => {\r\n const clipped = this.clipTriangle(subject, clipTriangle);\r\n if (clipped.length < 3) return;\r\n for (let vertexIndex = 1; vertexIndex < clipped.length - 1; vertexIndex += 1) {\r\n [clipped[0], clipped[vertexIndex], clipped[vertexIndex + 1]].forEach((vertex) => {\r\n positions.push(vertex.position.x, vertex.position.y, vertex.position.z);\r\n if (hasUv && vertex.uv) uvs.push(vertex.uv.x, vertex.uv.y);\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (positions.length === 0) return null;\r\n const clippedGeometry = new THREE.BufferGeometry();\r\n clippedGeometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));\r\n if (hasUv) clippedGeometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\r\n clippedGeometry.computeVertexNormals();\r\n return clippedGeometry;\r\n }\r\n\r\n /** 将任意简单裁剪多边形三角化,后续每个三角形都可用凸裁剪处理。 */\r\n private triangulateClipPolygon(polygon: THREE.Vector3[]): THREE.Vector3[][] {\r\n const contour = polygon.map((point) => new THREE.Vector2(point.x, point.y));\r\n const triangles = THREE.ShapeUtils.triangulateShape(contour, []);\r\n if (triangles.length === 0) {\r\n const fallback: THREE.Vector3[][] = [];\r\n for (let index = 1; index < polygon.length - 1; index += 1) {\r\n fallback.push([polygon[0], polygon[index], polygon[index + 1]]);\r\n }\r\n return fallback;\r\n }\r\n return triangles.map((triangle) => triangle.map((index) => polygon[index]));\r\n }\r\n\r\n /** Sutherland-Hodgman 多边形裁剪,输入三角形,输出被裁后的凸多边形。 */\r\n private clipTriangle(vertices: ClipVertex2d[], polygon: THREE.Vector3[]): ClipVertex2d[] {\r\n const orientation = this.getPolygonOrientation(polygon);\r\n let output = vertices;\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n const a = polygon[index];\r\n const b = polygon[(index + 1) % polygon.length];\r\n const input = output;\r\n output = [];\r\n if (input.length === 0) break;\r\n\r\n let previous = input[input.length - 1];\r\n let previousInside = this.isInsideClipEdge(previous.position, a, b, orientation);\r\n input.forEach((current) => {\r\n const currentInside = this.isInsideClipEdge(current.position, a, b, orientation);\r\n if (currentInside !== previousInside) {\r\n output.push(this.intersectClipEdge(previous, current, a, b, orientation));\r\n }\r\n if (currentInside) output.push(current);\r\n previous = current;\r\n previousInside = currentInside;\r\n });\r\n }\r\n return output;\r\n }\r\n\r\n private isInsideClipEdge(point: THREE.Vector3, edgeStart: THREE.Vector3, edgeEnd: THREE.Vector3, orientation: number): boolean {\r\n const edgeX = edgeEnd.x - edgeStart.x;\r\n const edgeY = edgeEnd.y - edgeStart.y;\r\n return orientation * (edgeX * (point.y - edgeStart.y) - edgeY * (point.x - edgeStart.x)) >= -1e-9;\r\n }\r\n\r\n private intersectClipEdge(start: ClipVertex2d, end: ClipVertex2d, edgeStart: THREE.Vector3, edgeEnd: THREE.Vector3, orientation: number): ClipVertex2d {\r\n const edgeX = edgeEnd.x - edgeStart.x;\r\n const edgeY = edgeEnd.y - edgeStart.y;\r\n const startValue = orientation * (edgeX * (start.position.y - edgeStart.y) - edgeY * (start.position.x - edgeStart.x));\r\n const endValue = orientation * (edgeX * (end.position.y - edgeStart.y) - edgeY * (end.position.x - edgeStart.x));\r\n const t = Math.abs(startValue - endValue) < 1e-12 ? 0 : startValue / (startValue - endValue);\r\n return {\r\n position: start.position.clone().lerp(end.position, t),\r\n uv: start.uv && end.uv ? start.uv.clone().lerp(end.uv, t) : undefined,\r\n };\r\n }\r\n\r\n /** polygon 面积符号用于判断内侧方向,兼容顺时针和逆时针边界。 */\r\n private getPolygonOrientation(polygon: THREE.Vector3[]): number {\r\n let area = 0;\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n const a = polygon[index];\r\n const b = polygon[(index + 1) % polygon.length];\r\n area += a.x * b.y - b.x * a.y;\r\n }\r\n return area >= 0 ? 1 : -1;\r\n }\r\n\r\n private getPointsBounds(points: THREE.Vector3[]): { min: THREE.Vector3; max: THREE.Vector3 } {\r\n const min = new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\r\n const max = new THREE.Vector3(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY);\r\n points.forEach((point) => {\r\n min.min(point);\r\n max.max(point);\r\n });\r\n return { min, max };\r\n }\r\n\r\n /** displayClipBoundary=true 时画出裁剪边界,方便核对裁剪结果。 */\r\n private createClipBoundaryItem(insertEntity: any, polygon: THREE.Vector3[]): RenderItem2d {\r\n const points: THREE.Vector3[] = [];\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n points.push(polygon[index].clone(), polygon[(index + 1) % polygon.length].clone());\r\n }\r\n const bounds = this.getPointsBounds(points);\r\n return {\r\n kind: 'line',\n layer: insertEntity.layer ?? '0',\n color: insertEntity.clipBoundaryColor ?? 0xff00ff,\n lineType: 'Continuous',\n linkId: insertEntity.linkId ?? insertEntity.id,\n points,\n min: bounds.min,\r\n max: bounds.max,\r\n info: insertEntity,\r\n };\r\n }\r\n}\r\n","/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e<h.length;e++)u(h[e]);return u}({1:[function(e,t,r){\"use strict\";var d=e(\"./utils\"),c=e(\"./support\"),p=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";r.encode=function(e){for(var t,r,n,i,s,a,o,h=[],u=0,l=e.length,f=l,c=\"string\"!==d.getTypeOf(e);u<e.length;)f=l-u,n=c?(t=e[u++],r=u<l?e[u++]:0,u<l?e[u++]:0):(t=e.charCodeAt(u++),r=u<l?e.charCodeAt(u++):0,u<l?e.charCodeAt(u++):0),i=t>>2,s=(3&t)<<4|r>>4,a=1<f?(15&r)<<2|n>>6:64,o=2<f?63&n:64,h.push(p.charAt(i)+p.charAt(s)+p.charAt(a)+p.charAt(o));return h.join(\"\")},r.decode=function(e){var t,r,n,i,s,a,o=0,h=0,u=\"data:\";if(e.substr(0,u.length)===u)throw new Error(\"Invalid base64 input, it looks like a data url.\");var l,f=3*(e=e.replace(/[^A-Za-z0-9+/=]/g,\"\")).length/4;if(e.charAt(e.length-1)===p.charAt(64)&&f--,e.charAt(e.length-2)===p.charAt(64)&&f--,f%1!=0)throw new Error(\"Invalid base64 input, bad content length.\");for(l=c.uint8array?new Uint8Array(0|f):new Array(0|f);o<e.length;)t=p.indexOf(e.charAt(o++))<<2|(i=p.indexOf(e.charAt(o++)))>>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r<t;r++)n+=String.fromCharCode(255&e),e>>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t<this.dirRecords.length;t++)this.push({data:this.dirRecords[t],meta:{percent:100}});var r=this.bytesWritten-e,n=function(e,t,r,n,i){var s=I.transformTo(\"string\",i(n));return R.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+A(e,2)+A(e,2)+A(t,4)+A(r,4)+A(s.length,2)+s}(this.dirRecords.length,r,e,this.zipComment,this.encodeFileName);this.push({data:n,meta:{percent:100}})},s.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},s.prototype.registerPrevious=function(e){this._sources.push(e);var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.closedSource(t.previous.streamInfo),t._sources.length?t.prepareNextSource():t.end()}),e.on(\"error\",function(e){t.error(e)}),this},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},s.prototype.error=function(e){var t=this._sources;if(!i.prototype.error.call(this,e))return!1;for(var r=0;r<t.length;r++)try{t[r].error(e)}catch(e){}return!0},s.prototype.lock=function(){i.prototype.lock.call(this);for(var e=this._sources,t=0;t<e.length;t++)e[t].lock()},t.exports=s},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(e,t,r){\"use strict\";var u=e(\"../compressions\"),n=e(\"./ZipFileWorker\");r.generateWorker=function(e,a,t){var o=new n(a.streamFiles,t,a.platform,a.encodeFileName),h=0;try{e.forEach(function(e,t){h++;var r=function(e,t){var r=e||t,n=u[r];if(!n)throw new Error(r+\" is not a valid compression method !\");return n}(t.options.compression,a.compression),n=t.options.compressionOptions||a.compressionOptions||{},i=t.dir,s=t.date;t._compressWorker(r,n).withStreamInfo(\"file\",{name:e,dir:i,date:s,comment:t.comment||\"\",unixPermissions:t.unixPermissions,dosPermissions:t.dosPermissions}).pipe(o)}),o.entriesCount=h}catch(e){o.error(e)}return o}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(e,t,r){\"use strict\";function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files=Object.create(null),this.comment=null,this.root=\"\",this.clone=function(){var e=new n;for(var t in this)\"function\"!=typeof this[t]&&(e[t]=this[t]);return e}}(n.prototype=e(\"./object\")).loadAsync=e(\"./load\"),n.support=e(\"./support\"),n.defaults=e(\"./defaults\"),n.version=\"3.10.1\",n.loadAsync=function(e,t){return(new n).loadAsync(e,t)},n.external=e(\"./external\"),t.exports=n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(e,t,r){\"use strict\";var u=e(\"./utils\"),i=e(\"./external\"),n=e(\"./utf8\"),s=e(\"./zipEntries\"),a=e(\"./stream/Crc32Probe\"),l=e(\"./nodejsUtils\");function f(n){return new i.Promise(function(e,t){var r=n.decompressed.getContentWorker().pipe(new a);r.on(\"error\",function(e){t(e)}).on(\"end\",function(){r.streamInfo.crc32!==n.decompressed.crc32?t(new Error(\"Corrupted zip : CRC32 mismatch\")):e()}).resume()})}t.exports=function(e,o){var h=this;return o=u.extend(o||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:n.utf8decode}),l.isNode&&l.isStream(e)?i.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):u.prepareContent(\"the loaded zip file\",e,!0,o.optimizedBinaryString,o.base64).then(function(e){var t=new s(o);return t.load(e),t}).then(function(e){var t=[i.Promise.resolve(e)],r=e.files;if(o.checkCRC32)for(var n=0;n<r.length;n++)t.push(f(r[n]));return i.Promise.all(t)}).then(function(e){for(var t=e.shift(),r=t.files,n=0;n<r.length;n++){var i=r[n],s=i.fileNameStr,a=u.resolve(i.fileNameStr);h.file(a,i.decompressed,{binary:!0,optimizedBinaryString:!0,date:i.date,dir:i.dir,comment:i.fileCommentStr.length?i.fileCommentStr:null,unixPermissions:i.unixPermissions,dosPermissions:i.dosPermissions,createFolders:o.createFolders}),i.dir||(h.file(a).unsafeOriginalName=s)}return t.zipComment.length&&(h.comment=t.zipComment),h})}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../stream/GenericWorker\");function s(e,t){i.call(this,\"Nodejs stream input adapter for \"+e),this._upstreamEnded=!1,this._bindStream(t)}n.inherits(s,i),s.prototype._bindStream=function(e){var t=this;(this._stream=e).pause(),e.on(\"data\",function(e){t.push({data:e,meta:{percent:0}})}).on(\"error\",function(e){t.isPaused?this.generatedError=e:t.error(e)}).on(\"end\",function(){t.isPaused?t._upstreamEnded=!0:t.end()})},s.prototype.pause=function(){return!!i.prototype.pause.call(this)&&(this._stream.pause(),!0)},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},t.exports=s},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(e,t,r){\"use strict\";var i=e(\"readable-stream\").Readable;function n(e,t,r){i.call(this,t),this._helper=e;var n=this;e.on(\"data\",function(e,t){n.push(e)||n._helper.pause(),r&&r(t)}).on(\"error\",function(e){n.emit(\"error\",e)}).on(\"end\",function(){n.push(null)})}e(\"../utils\").inherits(n,i),n.prototype._read=function(){this._helper.resume()},t.exports=n},{\"../utils\":32,\"readable-stream\":16}],14:[function(e,t,r){\"use strict\";t.exports={isNode:\"undefined\"!=typeof Buffer,newBufferFrom:function(e,t){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(e,t);if(\"number\"==typeof e)throw new Error('The \"data\" argument must not be a number');return new Buffer(e,t)},allocBuffer:function(e){if(Buffer.alloc)return Buffer.alloc(e);var t=new Buffer(e);return t.fill(0),t},isBuffer:function(e){return Buffer.isBuffer(e)},isStream:function(e){return e&&\"function\"==typeof e.on&&\"function\"==typeof e.pause&&\"function\"==typeof e.resume}}},{}],15:[function(e,t,r){\"use strict\";function s(e,t,r){var n,i=u.getTypeOf(t),s=u.extend(r||{},f);s.date=s.date||new Date,null!==s.compression&&(s.compression=s.compression.toUpperCase()),\"string\"==typeof s.unixPermissions&&(s.unixPermissions=parseInt(s.unixPermissions,8)),s.unixPermissions&&16384&s.unixPermissions&&(s.dir=!0),s.dosPermissions&&16&s.dosPermissions&&(s.dir=!0),s.dir&&(e=g(e)),s.createFolders&&(n=_(e))&&b.call(this,n,!0);var a=\"string\"===i&&!1===s.binary&&!1===s.base64;r&&void 0!==r.binary||(s.binary=!a),(t instanceof c&&0===t.uncompressedSize||s.dir||!t||0===t.length)&&(s.base64=!1,s.binary=!0,t=\"\",s.compression=\"STORE\",i=\"string\");var o=null;o=t instanceof c||t instanceof l?t:p.isNode&&p.isStream(t)?new m(e,t):u.prepareContent(e,t,s.binary,s.optimizedBinaryString,s.base64);var h=new d(e,o,s);this.files[e]=h}var i=e(\"./utf8\"),u=e(\"./utils\"),l=e(\"./stream/GenericWorker\"),a=e(\"./stream/StreamHelper\"),f=e(\"./defaults\"),c=e(\"./compressedObject\"),d=e(\"./zipObject\"),o=e(\"./generate\"),p=e(\"./nodejsUtils\"),m=e(\"./nodejs/NodejsStreamInputAdapter\"),_=function(e){\"/\"===e.slice(-1)&&(e=e.substring(0,e.length-1));var t=e.lastIndexOf(\"/\");return 0<t?e.substring(0,t):\"\"},g=function(e){return\"/\"!==e.slice(-1)&&(e+=\"/\"),e},b=function(e,t){return t=void 0!==t?t:f.createFolders,e=g(e),this.files[e]||s.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]};function h(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var n={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(e){var t,r,n;for(t in this.files)n=this.files[t],(r=t.slice(this.root.length,t.length))&&t.slice(0,this.root.length)===this.root&&e(r,n)},filter:function(r){var n=[];return this.forEach(function(e,t){r(e,t)&&n.push(t)}),n},file:function(e,t,r){if(1!==arguments.length)return e=this.root+e,s.call(this,e,t,r),this;if(h(e)){var n=e;return this.filter(function(e,t){return!t.dir&&n.test(e)})}var i=this.files[this.root+e];return i&&!i.dir?i:null},folder:function(r){if(!r)return this;if(h(r))return this.filter(function(e,t){return t.dir&&r.test(e)});var e=this.root+r,t=b.call(this,e),n=this.clone();return n.root=t.name,n},remove:function(r){r=this.root+r;var e=this.files[r];if(e||(\"/\"!==r.slice(-1)&&(r+=\"/\"),e=this.files[r]),e&&!e.dir)delete this.files[r];else for(var t=this.filter(function(e,t){return t.name.slice(0,r.length)===r}),n=0;n<t.length;n++)delete this.files[t[n].name];return this},generate:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(e){var t,r={};try{if((r=u.extend(e||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:i.utf8encode})).type=r.type.toLowerCase(),r.compression=r.compression.toUpperCase(),\"binarystring\"===r.type&&(r.type=\"string\"),!r.type)throw new Error(\"No output type specified.\");u.checkSupport(r.type),\"darwin\"!==r.platform&&\"freebsd\"!==r.platform&&\"linux\"!==r.platform&&\"sunos\"!==r.platform||(r.platform=\"UNIX\"),\"win32\"===r.platform&&(r.platform=\"DOS\");var n=r.comment||this.comment||\"\";t=o.generateWorker(this,r,n)}catch(e){(t=new l(\"error\")).error(e)}return new a(t,r.type||\"string\",r.mimeType)},generateAsync:function(e,t){return this.generateInternalStream(e).accumulate(t)},generateNodeStream:function(e,t){return(e=e||{}).type||(e.type=\"nodebuffer\"),this.generateInternalStream(e).toNodejsStream(t)}};t.exports=n},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(e,t,r){\"use strict\";t.exports=e(\"stream\")},{stream:void 0}],17:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e);for(var t=0;t<this.data.length;t++)e[t]=255&e[t]}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data[this.zero+e]},i.prototype.lastIndexOfSignature=function(e){for(var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.length-4;0<=s;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===i)return s-this.zero;return-1},i.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.readData(4);return t===s[0]&&r===s[1]&&n===s[2]&&i===s[3]},i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],18:[function(e,t,r){\"use strict\";var n=e(\"../utils\");function i(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length<this.zero+e||e<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+e+\"). Corrupted zip ?\")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r<this._listeners[e].length;r++)this._listeners[e][r].call(this,t)},pipe:function(e){return e.registerPrevious(this)},registerPrevious:function(e){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=e.streamInfo,this.mergeStreamInfo(),this.previous=e;var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.end()}),e.on(\"error\",function(e){t.error(e)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var e=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),e=!0),this.previous&&this.previous.resume(),!e},flush:function(){},processChunk:function(e){this.push(e)},withStreamInfo:function(e,t){return this.extraStreamInfo[e]=t,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var e in this.extraStreamInfo)Object.prototype.hasOwnProperty.call(this.extraStreamInfo,e)&&(this.streamInfo[e]=this.extraStreamInfo[e])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var e=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r<t.length;r++)s+=t[r].length;switch(e){case\"string\":return t.join(\"\");case\"array\":return Array.prototype.concat.apply([],t);case\"uint8array\":for(i=new Uint8Array(s),r=0;r<t.length;r++)i.set(t[r],n),n+=t[r].length;return i;case\"nodebuffer\":return Buffer.concat(t);default:throw new Error(\"concat : unsupported type '\"+e+\"'\")}}(i,n),a);t(e)}catch(e){r(e)}n=[]}).resume()})}function f(e,t,r){var n=t;switch(t){case\"blob\":case\"arraybuffer\":n=\"uint8array\";break;case\"base64\":n=\"string\"}try{this._internalType=n,this._outputType=t,this._mimeType=r,h.checkSupport(n),this._worker=e.pipe(new i(n)),e.lock()}catch(e){this._worker=new s(\"error\"),this._worker.error(e)}}f.prototype={accumulate:function(e){return l(this,e)},on:function(e,t){var r=this;return\"data\"===e?this._worker.on(e,function(e){t.call(r,e.data,e.meta)}):this._worker.on(e,function(){h.delay(t,arguments,r)}),this},resume:function(){return h.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(e){if(h.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new o(this,{objectMode:\"nodebuffer\"!==this._outputType},e)}},t.exports=f},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(e,t,r){\"use strict\";if(r.base64=!0,r.array=!0,r.string=!0,r.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,r.nodebuffer=\"undefined\"!=typeof Buffer,r.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)r.blob=!1;else{var n=new ArrayBuffer(0);try{r.blob=0===new Blob([n],{type:\"application/zip\"}).size}catch(e){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),r.blob=0===i.getBlob(\"application/zip\").size}catch(e){r.blob=!1}}}try{r.nodestream=!!e(\"readable-stream\").Readable}catch(e){r.nodestream=!1}},{\"readable-stream\":16}],31:[function(e,t,s){\"use strict\";for(var o=e(\"./utils\"),h=e(\"./support\"),r=e(\"./nodejsUtils\"),n=e(\"./stream/GenericWorker\"),u=new Array(256),i=0;i<256;i++)u[i]=252<=i?6:248<=i?5:240<=i?4:224<=i?3:192<=i?2:1;u[254]=u[254]=1;function a(){n.call(this,\"utf-8 decode\"),this.leftOver=null}function l(){n.call(this,\"utf-8 encode\")}s.utf8encode=function(e){return h.nodebuffer?r.newBufferFrom(e,\"utf-8\"):function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=h.uint8array?new Uint8Array(o):new Array(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t<s;)if((n=e[t++])<128)a[r++]=n;else if(4<(i=u[n]))a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;1<i&&t<s;)n=n<<6|63&e[t++],i--;1<i?a[r++]=65533:n<65536?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r<e.length;++r)t[r]=255&e.charCodeAt(r);return t}e(\"setimmediate\"),a.newBlob=function(t,r){a.checkSupport(\"blob\");try{return new Blob([t],{type:r})}catch(e){try{var n=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return n.append(t),n.getBlob(r)}catch(e){throw new Error(\"Bug : can't construct the Blob.\")}}};var i={stringifyByChunk:function(e,t,r){var n=[],i=0,s=e.length;if(s<=r)return String.fromCharCode.apply(null,e);for(;i<s;)\"array\"===t||\"nodebuffer\"===t?n.push(String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,s)))):n.push(String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,s)))),i+=r;return n.join(\"\")},stringifyByChar:function(e){for(var t=\"\",r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return t},applyCanBeUsed:{uint8array:function(){try{return o.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(e){return!1}}(),nodebuffer:function(){try{return o.nodebuffer&&1===String.fromCharCode.apply(null,r.allocBuffer(1)).length}catch(e){return!1}}()}};function s(e){var t=65536,r=a.getTypeOf(e),n=!0;if(\"uint8array\"===r?n=i.applyCanBeUsed.uint8array:\"nodebuffer\"===r&&(n=i.applyCanBeUsed.nodebuffer),n)for(;1<t;)try{return i.stringifyByChunk(e,r,t)}catch(e){t=Math.floor(t/2)}return i.stringifyByChar(e)}function f(e,t){for(var r=0;r<e.length;r++)t[r]=e[r];return t}a.applyFromCharCode=s;var c={};c.string={string:n,array:function(e){return l(e,new Array(e.length))},arraybuffer:function(e){return c.string.uint8array(e).buffer},uint8array:function(e){return l(e,new Uint8Array(e.length))},nodebuffer:function(e){return l(e,r.allocBuffer(e.length))}},c.array={string:s,array:n,arraybuffer:function(e){return new Uint8Array(e).buffer},uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(e)}},c.arraybuffer={string:function(e){return s(new Uint8Array(e))},array:function(e){return f(new Uint8Array(e),new Array(e.byteLength))},arraybuffer:n,uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(new Uint8Array(e))}},c.uint8array={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return e.buffer},uint8array:n,nodebuffer:function(e){return r.newBufferFrom(e)}},c.nodebuffer={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return c.nodebuffer.uint8array(e).buffer},uint8array:function(e){return f(e,new Uint8Array(e.length))},nodebuffer:n},a.transformTo=function(e,t){if(t=t||\"\",!e)return t;a.checkSupport(e);var r=a.getTypeOf(t);return c[r][e](t)},a.resolve=function(e){for(var t=e.split(\"/\"),r=[],n=0;n<t.length;n++){var i=t[n];\".\"===i||\"\"===i&&0!==n&&n!==t.length-1||(\"..\"===i?r.pop():r.push(i))}return r.join(\"/\")},a.getTypeOf=function(e){return\"string\"==typeof e?\"string\":\"[object Array]\"===Object.prototype.toString.call(e)?\"array\":o.nodebuffer&&r.isBuffer(e)?\"nodebuffer\":o.uint8array&&e instanceof Uint8Array?\"uint8array\":o.arraybuffer&&e instanceof ArrayBuffer?\"arraybuffer\":void 0},a.checkSupport=function(e){if(!o[e.toLowerCase()])throw new Error(e+\" is not supported by this platform\")},a.MAX_VALUE_16BITS=65535,a.MAX_VALUE_32BITS=-1,a.pretty=function(e){var t,r,n=\"\";for(r=0;r<(e||\"\").length;r++)n+=\"\\\\x\"+((t=e.charCodeAt(r))<16?\"0\":\"\")+t.toString(16).toUpperCase();return n},a.delay=function(e,t,r){setImmediate(function(){e.apply(r||null,t||[])})},a.inherits=function(e,t){function r(){}r.prototype=t.prototype,e.prototype=new r},a.extend=function(){var e,t,r={};for(e=0;e<arguments.length;e++)for(t in arguments[e])Object.prototype.hasOwnProperty.call(arguments[e],t)&&void 0===r[t]&&(r[t]=arguments[e][t]);return r},a.prepareContent=function(r,e,n,i,s){return u.Promise.resolve(e).then(function(n){return o.blob&&(n instanceof Blob||-1!==[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(n)))&&\"undefined\"!=typeof FileReader?new u.Promise(function(t,r){var e=new FileReader;e.onload=function(e){t(e.target.result)},e.onerror=function(e){r(e.target.error)},e.readAsArrayBuffer(n)}):n}).then(function(e){var t=a.getTypeOf(e);return t?(\"arraybuffer\"===t?e=a.transformTo(\"uint8array\",e):\"string\"===t&&(s?e=h.decode(e):n&&!0!==i&&(e=function(e){return l(e,o.uint8array?new Uint8Array(e.length):new Array(e.length))}(e))),e):u.Promise.reject(new Error(\"Can't read the data of '\"+r+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))})}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,setimmediate:54}],33:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),i=e(\"./utils\"),s=e(\"./signature\"),a=e(\"./zipEntry\"),o=e(\"./support\");function h(e){this.files=[],this.loadOptions=e}h.prototype={checkSignature:function(e){if(!this.reader.readAndCheckSignature(e)){this.reader.index-=4;var t=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+i.pretty(t)+\", expected \"+i.pretty(e)+\")\")}},isSignature:function(e,t){var r=this.reader.index;this.reader.setIndex(e);var n=this.reader.readString(4)===t;return this.reader.setIndex(r),n},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var e=this.reader.readData(this.zipCommentLength),t=o.uint8array?\"uint8array\":\"array\",r=i.transformTo(t,e);this.zipComment=this.loadOptions.decodeFileName(r)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var e,t,r,n=this.zip64EndOfCentralSize-44;0<n;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var e,t;for(e=0;e<this.files.length;e++)t=this.files[e],this.reader.setIndex(t.localHeaderOffset),this.checkSignature(s.LOCAL_FILE_HEADER),t.readLocalPart(this.reader),t.handleUTF8(),t.processAttributes()},readCentralDir:function(){var e;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);)(e=new a({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(e);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var e=this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if(e<0)throw!this.isSignature(0,s.LOCAL_FILE_HEADER)?new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\"):new Error(\"Corrupted zip: can't find end of central directory\");this.reader.setIndex(e);var t=e;if(this.checkSignature(s.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,(e=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(e),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,s.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var n=t-r;if(0<n)this.isSignature(t,s.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(n)+\" bytes.\")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=h},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utils\":32,\"./zipEntry\":34}],34:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),s=e(\"./utils\"),i=e(\"./compressedObject\"),a=e(\"./crc32\"),o=e(\"./utf8\"),h=e(\"./compressions\"),u=e(\"./support\");function l(e,t){this.options=e,this.loadOptions=t}l.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(null===(t=function(e){for(var t in h)if(Object.prototype.hasOwnProperty.call(h,t)&&h[t].magic===e)return h[t];return null}(this.compressionMethod)))throw new Error(\"Corrupted zip : compression \"+s.pretty(this.compressionMethod)+\" unknown (inner file : \"+s.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new i(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4<i;)t=e.readInt(2),r=e.readInt(2),n=e.readData(r),this.extraFields[t]={id:t,length:r,value:n};e.setIndex(i)},handleUTF8:function(){var e=u.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=o.utf8decode(this.fileName),this.fileCommentStr=o.utf8decode(this.fileComment);else{var t=this.findExtraFieldUnicodePath();if(null!==t)this.fileNameStr=t;else{var r=s.transformTo(e,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(r)}var n=this.findExtraFieldUnicodeComment();if(null!==n)this.fileCommentStr=n;else{var i=s.transformTo(e,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(i)}}},findExtraFieldUnicodePath:function(){var e=this.extraFields[28789];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileName)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null},findExtraFieldUnicodeComment:function(){var e=this.extraFields[25461];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileComment)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null}},t.exports=l},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(e,t,r){\"use strict\";function n(e,t,r){this.name=e,this.dir=r.dir,this.date=r.date,this.comment=r.comment,this.unixPermissions=r.unixPermissions,this.dosPermissions=r.dosPermissions,this._data=t,this._dataBinary=r.binary,this.options={compression:r.compression,compressionOptions:r.compressionOptions}}var s=e(\"./stream/StreamHelper\"),i=e(\"./stream/DataWorker\"),a=e(\"./utf8\"),o=e(\"./compressedObject\"),h=e(\"./stream/GenericWorker\");n.prototype={internalStream:function(e){var t=null,r=\"string\";try{if(!e)throw new Error(\"No output type specified.\");var n=\"string\"===(r=e.toLowerCase())||\"text\"===r;\"binarystring\"!==r&&\"text\"!==r||(r=\"string\"),t=this._decompressWorker();var i=!this._dataBinary;i&&!n&&(t=t.pipe(new a.Utf8EncodeWorker)),!i&&n&&(t=t.pipe(new a.Utf8DecodeWorker))}catch(e){(t=new h(\"error\")).error(e)}return new s(t,r,\"\")},async:function(e,t){return this.internalStream(e).accumulate(t)},nodeStream:function(e,t){return this.internalStream(e||\"nodebuffer\").toNodejsStream(t)},_compressWorker:function(e,t){if(this._data instanceof o&&this._data.compression.magic===e.magic)return this._data.getCompressedWorker();var r=this._decompressWorker();return this._dataBinary||(r=r.pipe(new a.Utf8EncodeWorker)),o.createWorkerFrom(r,e,t)},_decompressWorker:function(){return this._data instanceof o?this._data.getContentWorker():this._data instanceof h?this._data:new i(this._data)}};for(var u=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],l=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},f=0;f<u.length;f++)n.prototype[u[f]]=l;t.exports=n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(e,l,t){(function(t){\"use strict\";var r,n,e=t.MutationObserver||t.WebKitMutationObserver;if(e){var i=0,s=new e(u),a=t.document.createTextNode(\"\");s.observe(a,{characterData:!0}),r=function(){a.data=i=++i%2}}else if(t.setImmediate||void 0===t.MessageChannel)r=\"document\"in t&&\"onreadystatechange\"in t.document.createElement(\"script\")?function(){var e=t.document.createElement(\"script\");e.onreadystatechange=function(){u(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},t.document.documentElement.appendChild(e)}:function(){setTimeout(u,0)};else{var o=new t.MessageChannel;o.port1.onmessage=u,r=function(){o.port2.postMessage(0)}}var h=[];function u(){var e,t;n=!0;for(var r=h.length;r;){for(t=h,h=[],e=-1;++e<r;)t[e]();r=h.length}n=!1}l.exports=function(e){1!==h.push(e)||n||r()}}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(e,t,r){\"use strict\";var i=e(\"immediate\");function u(){}var l={},s=[\"REJECTED\"],a=[\"FULFILLED\"],n=[\"PENDING\"];function o(e){if(\"function\"!=typeof e)throw new TypeError(\"resolver must be a function\");this.state=n,this.queue=[],this.outcome=void 0,e!==u&&d(this,e)}function h(e,t,r){this.promise=e,\"function\"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function f(t,r,n){i(function(){var e;try{e=r(n)}catch(e){return l.reject(t,e)}e===t?l.reject(t,new TypeError(\"Cannot resolve promise with itself\")):l.resolve(t,e)})}function c(e){var t=e&&e.then;if(e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof t)return function(){t.apply(e,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,l.reject(t,e))}function i(e){r||(r=!0,l.resolve(t,e))}var s=p(function(){e(i,n)});\"error\"===s.status&&n(s.value)}function p(e,t){var r={};try{r.value=e(t),r.status=\"success\"}catch(e){r.status=\"error\",r.value=e}return r}(t.exports=o).prototype.finally=function(t){if(\"function\"!=typeof t)return this;var r=this.constructor;return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})})},o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){if(\"function\"!=typeof e&&this.state===a||\"function\"!=typeof t&&this.state===s)return this;var r=new this.constructor(u);this.state!==n?f(r,this.state===a?e:t,this.outcome):this.queue.push(new h(r,e,t));return r},h.prototype.callFulfilled=function(e){l.resolve(this.promise,e)},h.prototype.otherCallFulfilled=function(e){f(this.promise,this.onFulfilled,e)},h.prototype.callRejected=function(e){l.reject(this.promise,e)},h.prototype.otherCallRejected=function(e){f(this.promise,this.onRejected,e)},l.resolve=function(e,t){var r=p(c,t);if(\"error\"===r.status)return l.reject(e,r.value);var n=r.value;if(n)d(e,n);else{e.state=a,e.outcome=t;for(var i=-1,s=e.queue.length;++i<s;)e.queue[i].callFulfilled(t)}return e},l.reject=function(e,t){e.state=s,e.outcome=t;for(var r=-1,n=e.queue.length;++r<n;)e.queue[r].callRejected(t);return e},o.resolve=function(e){if(e instanceof this)return e;return l.resolve(new this(u),e)},o.reject=function(e){var t=new this(u);return l.reject(t,e)},o.all=function(e){var r=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var n=e.length,i=!1;if(!n)return this.resolve([]);var s=new Array(n),a=0,t=-1,o=new this(u);for(;++t<n;)h(e[t],t);return o;function h(e,t){r.resolve(e).then(function(e){s[t]=e,++a!==n||i||(i=!0,l.resolve(o,s))},function(e){i||(i=!0,l.reject(o,e))})}},o.race=function(e){var t=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var r=e.length,n=!1;if(!r)return this.resolve([]);var i=-1,s=new this(u);for(;++i<r;)a=e[i],t.resolve(a).then(function(e){n||(n=!0,l.resolve(s,e))},function(e){n||(n=!0,l.reject(s,e))});var a;return s}},{immediate:36}],38:[function(e,t,r){\"use strict\";var n={};(0,e(\"./lib/utils/common\").assign)(n,e(\"./lib/deflate\"),e(\"./lib/inflate\"),e(\"./lib/zlib/constants\")),t.exports=n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(e,t,r){\"use strict\";var a=e(\"./zlib/deflate\"),o=e(\"./utils/common\"),h=e(\"./utils/strings\"),i=e(\"./zlib/messages\"),s=e(\"./zlib/zstream\"),u=Object.prototype.toString,l=0,f=-1,c=0,d=8;function p(e){if(!(this instanceof p))return new p(e);this.options=o.assign({level:f,method:d,chunkSize:16384,windowBits:15,memLevel:8,strategy:c,to:\"\"},e||{});var t=this.options;t.raw&&0<t.windowBits?t.windowBits=-t.windowBits:t.gzip&&0<t.windowBits&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new s,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==l)throw new Error(i[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var n;if(n=\"string\"==typeof t.dictionary?h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===u.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=a.deflateSetDictionary(this.strm,n))!==l)throw new Error(i[r]);this._dict_set=!0}}function n(e,t){var r=new p(t);if(r.push(e,!0),r.err)throw r.msg||i[r.err];return r.result}p.prototype.push=function(e,t){var r,n,i=this.strm,s=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:!0===t?4:0,\"string\"==typeof e?i.input=h.string2buf(e):\"[object ArrayBuffer]\"===u.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new o.Buf8(s),i.next_out=0,i.avail_out=s),1!==(r=a.deflate(i,n))&&r!==l)return this.onEnd(r),!(this.ended=!0);0!==i.avail_out&&(0!==i.avail_in||4!==n&&2!==n)||(\"string\"===this.options.to?this.onData(h.buf2binstring(o.shrinkBuf(i.output,i.next_out))):this.onData(o.shrinkBuf(i.output,i.next_out)))}while((0<i.avail_in||0===i.avail_out)&&1!==r);return 4===n?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l):2!==n||(this.onEnd(l),!(i.avail_out=0))},p.prototype.onData=function(e){this.chunks.push(e)},p.prototype.onEnd=function(e){e===l&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=o.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=p,r.deflate=n,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,n(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,n(e,t)}},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(e,t,r){\"use strict\";var c=e(\"./zlib/inflate\"),d=e(\"./utils/common\"),p=e(\"./utils/strings\"),m=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),i=e(\"./zlib/zstream\"),s=e(\"./zlib/gzheader\"),_=Object.prototype.toString;function a(e){if(!(this instanceof a))return new a(e);this.options=d.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new i,this.strm.avail_out=0;var r=c.inflateInit2(this.strm,t.windowBits);if(r!==m.Z_OK)throw new Error(n[r]);this.header=new s,c.inflateGetHeader(this.strm,this.header)}function o(e,t){var r=new a(t);if(r.push(e,!0),r.err)throw r.msg||n[r.err];return r.result}a.prototype.push=function(e,t){var r,n,i,s,a,o,h=this.strm,u=this.options.chunkSize,l=this.options.dictionary,f=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?m.Z_FINISH:m.Z_NO_FLUSH,\"string\"==typeof e?h.input=p.binstring2buf(e):\"[object ArrayBuffer]\"===_.call(e)?h.input=new Uint8Array(e):h.input=e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new d.Buf8(u),h.next_out=0,h.avail_out=u),(r=c.inflate(h,m.Z_NO_FLUSH))===m.Z_NEED_DICT&&l&&(o=\"string\"==typeof l?p.string2buf(l):\"[object ArrayBuffer]\"===_.call(l)?new Uint8Array(l):l,r=c.inflateSetDictionary(this.strm,o)),r===m.Z_BUF_ERROR&&!0===f&&(r=m.Z_OK,f=!1),r!==m.Z_STREAM_END&&r!==m.Z_OK)return this.onEnd(r),!(this.ended=!0);h.next_out&&(0!==h.avail_out&&r!==m.Z_STREAM_END&&(0!==h.avail_in||n!==m.Z_FINISH&&n!==m.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(i=p.utf8border(h.output,h.next_out),s=h.next_out-i,a=p.buf2string(h.output,i),h.next_out=s,h.avail_out=u-s,s&&d.arraySet(h.output,h.output,i,s,0),this.onData(a)):this.onData(d.shrinkBuf(h.output,h.next_out)))),0===h.avail_in&&0===h.avail_out&&(f=!0)}while((0<h.avail_in||0===h.avail_out)&&r!==m.Z_STREAM_END);return r===m.Z_STREAM_END&&(n=m.Z_FINISH),n===m.Z_FINISH?(r=c.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===m.Z_OK):n!==m.Z_SYNC_FLUSH||(this.onEnd(m.Z_OK),!(h.avail_out=0))},a.prototype.onData=function(e){this.chunks.push(e)},a.prototype.onEnd=function(e){e===m.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=d.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=a,r.inflate=o,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,o(e,t)},r.ungzip=o},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if(\"object\"!=typeof r)throw new TypeError(r+\"must be non-object\");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){var t,r,n,i,s,a;for(t=n=0,r=e.length;t<r;t++)n+=e[t].length;for(a=new Uint8Array(n),t=i=0,r=e.length;t<r;t++)s=e[t],a.set(s,i),i+=s.length;return a}},s={arraySet:function(e,t,r,n,i){for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,s))},r.setTyped(n)},{}],42:[function(e,t,r){\"use strict\";var h=e(\"./common\"),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(e){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){s=!1}for(var u=new h.Buf8(256),n=0;n<256;n++)u[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&i))return String.fromCharCode.apply(null,h.shrinkBuf(e,t));for(var r=\"\",n=0;n<t;n++)r+=String.fromCharCode(e[n]);return r}u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=new h.Buf8(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r<n;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,n,i,s,a=t||e.length,o=new Array(2*a);for(r=n=0;r<a;)if((i=e[r++])<128)o[n++]=i;else if(4<(s=u[i]))o[n++]=65533,r+=s-1;else{for(i&=2===s?31:3===s?15:7;1<s&&r<a;)i=i<<6|63&e[r++],s--;1<s?o[n++]=65533:i<65536?o[n++]=i:(i-=65536,o[n++]=55296|i>>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3<r?2e3:r;s=s+(i=i+t[n++]|0)|0,--a;);i%=65521,s%=65521}return i|s<<16|0}},{}],44:[function(e,t,r){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(e,t,r){\"use strict\";var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4<e?9:0)}function D(e){for(var t=e.length;0<=--t;)e[t]=0}function F(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&s<c);if(n=S-(c-s),s=c-S,a<n){if(e.match_start=t,o<=(a=n))break;d=u[s+a-1],p=u[s+a]}}}while((t=f[t&l])>h&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u<l&&(l=u),r=0===l?0:(a.avail_in-=l,c.arraySet(o,a.input,a.next_in,l,h),1===a.state.wrap?a.adler=d(a.adler,o,l,h):2===a.state.wrap&&(a.adler=p(a.adler,o,l,h)),a.next_in+=l,a.total_in+=l,l),e.lookahead+=r,e.lookahead+e.insert>=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+1])&e.hash_mask;e.insert&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+x-1])&e.hash_mask,e.prev[s&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=s,s++,e.insert--,!(e.lookahead+e.insert<x)););}while(e.lookahead<z&&0!==e.strm.avail_in)}function Z(e,t){for(var r,n;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==r&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r)),e.match_length>=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart,0!=--e.match_length;);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+1])&e.hash_mask;else n=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function W(e,t){for(var r,n,i;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=x-1,0!==r&&e.prev_length<e.max_lazy_match&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r),e.match_length<=5&&(1===e.strategy||e.match_length===x&&4096<e.strstart-e.match_start)&&(e.match_length=x-1)),e.prev_length>=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!=--e.prev_length;);if(e.match_available=0,e.match_length=x-1,e.strstart++,n&&(N(e,!1),0===e.strm.avail_out))return A}else if(e.match_available){if((n=u._tr_tally(e,0,e.window[e.strstart-1]))&&N(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return A}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=u._tr_tally(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function M(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function H(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=v,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new c.Buf16(2*w),this.dyn_dtree=new c.Buf16(2*(2*a+1)),this.bl_tree=new c.Buf16(2*(2*o+1)),D(this.dyn_ltree),D(this.dyn_dtree),D(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new c.Buf16(k+1),this.heap=new c.Buf16(2*s+1),D(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new c.Buf16(2*s+1),D(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function G(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=i,(t=e.state).pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?C:E,e.adler=2===t.wrap?0:1,t.last_flush=l,u._tr_init(t),m):R(e,_)}function K(e){var t=G(e);return t===m&&function(e){e.window_size=2*e.w_size,D(e.head),e.max_lazy_match=h[e.level].max_lazy,e.good_match=h[e.level].good_length,e.nice_match=h[e.level].nice_length,e.max_chain_length=h[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=x-1,e.match_available=0,e.ins_h=0}(e.state),t}function Y(e,t,r,n,i,s){if(!e)return _;var a=1;if(t===g&&(t=6),n<0?(a=0,n=-n):15<n&&(a=2,n-=16),i<1||y<i||r!==v||n<8||15<n||t<0||9<t||s<0||b<s)return R(e,_);8===n&&(n=9);var o=new H;return(e.state=o).strm=e,o.wrap=a,o.gzhead=null,o.w_bits=n,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=i+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+x-1)/x),o.window=new c.Buf8(2*o.w_size),o.head=new c.Buf16(o.hash_size),o.prev=new c.Buf16(o.w_size),o.lit_bufsize=1<<i+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new c.Buf8(o.pending_buf_size),o.d_buf=1*o.lit_bufsize,o.l_buf=3*o.lit_bufsize,o.level=t,o.strategy=s,o.method=r,K(e)}h=[new M(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5<t||t<0)return e?R(e,_):_;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||666===n.status&&t!==f)return R(e,0===e.avail_out?-5:_);if(n.strm=e,r=n.last_flush,n.last_flush=t,n.status===C)if(2===n.wrap)e.adler=0,U(n,31),U(n,139),U(n,8),n.gzhead?(U(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),U(n,255&n.gzhead.time),U(n,n.gzhead.time>>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.name.length?255&n.gzhead.name.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.comment.length?255&n.gzhead.comment.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0<e.strstart&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){s=e.strstart+S;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&i<s);e.match_length=S-(s-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0<n.wrap&&(n.wrap=-n.wrap),0!==n.pending?m:1)},r.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==C&&69!==t&&73!==t&&91!==t&&103!==t&&t!==E&&666!==t?R(e,_):(e.state=null,t===E?R(e,-3):m):_},r.deflateSetDictionary=function(e,t){var r,n,i,s,a,o,h,u,l=t.length;if(!e||!e.state)return _;if(2===(s=(r=e.state).wrap)||1===s&&r.status!==C||r.lookahead)return _;for(1===s&&(e.adler=d(e.adler,t,l,0)),r.wrap=0,l>=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<<r.hash_shift^r.window[n+x-1])&r.hash_mask,r.prev[n&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=n,n++,--i;);r.strstart=n,r.lookahead=x-1,j(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=x-1,r.match_available=0,e.next_in=o,e.input=h,e.avail_in=a,r.wrap=s,m},r.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(e,t,r){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],48:[function(e,t,r){\"use strict\";t.exports=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C;r=e.state,n=e.next_in,z=e.input,i=n+(e.avail_in-5),s=e.next_out,C=e.output,a=s-(t-e.avail_out),o=s+(e.avail_out-257),h=r.dmax,u=r.wsize,l=r.whave,f=r.wnext,c=r.window,d=r.hold,p=r.bits,m=r.lencode,_=r.distcode,g=(1<<r.lenbits)-1,b=(1<<r.distbits)-1;e:do{p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=m[d&g];t:for(;;){if(d>>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<<y)-1)];continue t}if(32&y){r.mode=12;break e}e.msg=\"invalid literal/length code\",r.mode=30;break e}w=65535&v,(y&=15)&&(p<y&&(d+=z[n++]<<p,p+=8),w+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=_[d&b];r:for(;;){if(d>>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<<y)-1)];continue r}e.msg=\"invalid distance code\",r.mode=30;break e}if(k=65535&v,p<(y&=15)&&(d+=z[n++]<<p,(p+=8)<y&&(d+=z[n++]<<p,p+=8)),h<(k+=d&(1<<y)-1)){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(d>>>=y,p-=y,(y=s-a)<k){if(l<(y=k-y)&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(S=c,(x=0)===f){if(x+=u-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}}else if(f<y){if(x+=u+f-y,(y-=f)<w){for(w-=y;C[s++]=c[x++],--y;);if(x=0,f<w){for(w-=y=f;C[s++]=c[x++],--y;);x=s-k,S=C}}}else if(x+=f-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}for(;2<w;)C[s++]=S[x++],C[s++]=S[x++],C[s++]=S[x++],w-=3;w&&(C[s++]=S[x++],1<w&&(C[s++]=S[x++]))}else{for(x=s-k;C[s++]=C[x++],C[s++]=C[x++],C[s++]=C[x++],2<(w-=3););w&&(C[s++]=C[x++],1<w&&(C[s++]=C[x++]))}break}}break}}while(n<i&&s<o);n-=w=p>>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n<i?i-n+5:5-(n-i),e.avail_out=s<o?o-s+257:257-(s-o),r.hold=d,r.bits=p}},{}],49:[function(e,t,r){\"use strict\";var I=e(\"../utils/common\"),O=e(\"./adler32\"),B=e(\"./crc32\"),R=e(\"./inffast\"),T=e(\"./inftrees\"),D=1,F=2,N=0,U=-2,P=1,n=852,i=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,o(e))):U}function u(e,t){var r,n;return e?(n=new s,(e.state=n).window=null,(r=h(e,t))!==N&&(e.state=null),r):U}var l,f,c=!0;function j(e){if(c){var t;for(l=new I.Buf32(512),f=new I.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(T(D,e.lens,0,288,l,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;T(F,e.lens,0,32,f,0,e.work,{bits:5}),c=!1}e.lencode=l,e.lenbits=9,e.distcode=f,e.distbits=5}function Z(e,t,r,n){var i,s=e.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new I.Buf8(s.wsize)),n>=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=i))),0}r.inflateReset=o,r.inflateReset2=h,r.inflateResetKeep=a,r.inflateInit=function(e){return u(e,15)},r.inflateInit2=u,r.inflate=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C=0,E=new I.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(r=e.state).mode&&(r.mode=13),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,f=o,c=h,x=N;e:for(;;)switch(r.mode){case P:if(0===r.wrap){r.mode=13;break}for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(2&r.wrap&&35615===u){E[r.check=0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<<k,e.adler=r.check=1,r.mode=512&u?10:12,l=u=0;break;case 2:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.flags=u,8!=(255&r.flags)){e.msg=\"unknown compression method\",r.mode=30;break}if(57344&r.flags){e.msg=\"unknown header flags set\",r.mode=30;break}r.head&&(r.head.text=u>>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.time=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.xflags=255&u,r.head.os=u>>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length=u,r.head&&(r.head.extra_len=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.comment+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(65535&r.check)){e.msg=\"header crc mismatch\",r.mode=30;break}l=u=0}r.head&&(r.head.hcrc=r.flags>>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}e.adler=r.check=L(u),l=u=0,r.mode=11;case 11:if(0===r.havedict)return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,2;e.adler=r.check=1,r.mode=12;case 12:if(5===t||6===t)break e;case 13:if(r.last){u>>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}switch(r.last=1&u,l-=1,3&(u>>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if((65535&u)!=(u>>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o<d&&(d=o),h<d&&(d=h),0===d)break e;I.arraySet(i,n,s,d,a),o-=d,s+=d,h-=d,a+=d,r.length-=d;break}r.mode=12;break;case 17:for(;l<14;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.nlen=257+(31&u),u>>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286<r.nlen||30<r.ndist){e.msg=\"too many length or distance symbols\",r.mode=30;break}r.have=0,r.mode=18;case 18:for(;r.have<r.ncode;){for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.lens[A[r.have++]]=7&u,u>>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have<r.nlen+r.ndist;){for(;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(b<16)u>>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u>>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=3+(7&(u>>>=_)),u>>>=3,l-=3}else{for(z=_+7;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=11+(127&(u>>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(g&&0==(240&g)){for(v=_,y=g,w=b;g=(C=r.lencode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<<r.distbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(0==(240&g)){for(v=_,y=g,w=b;g=(C=r.distcode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.offset+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(h<d&&(d=h),h-=d,r.length-=d;i[a++]=m[p++],--d;);0===r.length&&(r.mode=21);break;case 26:if(0===h)break e;i[a++]=r.length,h--,r.mode=21;break;case 27:if(r.wrap){for(;l<32;){if(0===o)break e;o--,u|=n[s++]<<l,l+=8}if(c-=h,e.total_out+=c,r.total+=c,c&&(e.adler=r.check=r.flags?B(r.check,i,c,a-c):O(r.check,i,c,a-c)),c=h,(r.flags?u:L(u))!==r.check){e.msg=\"incorrect data check\",r.mode=30;break}l=u=0}r.mode=28;case 28:if(r.wrap&&r.flags){for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(4294967295&r.total)){e.msg=\"incorrect length check\",r.mode=30;break}l=u=0}r.mode=29;case 29:x=1;break e;case 30:x=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,(r.wsize||c!==e.avail_out&&r.mode<30&&(r.mode<27||4!==t))&&Z(e,e.output,e.next_out,c-e.avail_out)?(r.mode=31,-4):(f-=e.avail_in,c-=e.avail_out,e.total_in+=f,e.total_out+=c,r.total+=c,r.wrap&&c&&(e.adler=r.check=r.flags?B(r.check,i,c,e.next_out-c):O(r.check,i,c,e.next_out-c)),e.data_type=r.bits+(r.last?64:0)+(12===r.mode?128:0)+(20===r.mode||15===r.mode?256:0),(0==f&&0===c||4===t)&&x===N&&(x=-5),x)},r.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,N},r.inflateGetHeader=function(e,t){var r;return e&&e.state?0==(2&(r=e.state).wrap)?U:((r.head=t).done=!1,N):U},r.inflateSetDictionary=function(e,t){var r,n=t.length;return e&&e.state?0!==(r=e.state).wrap&&11!==r.mode?U:11===r.mode&&O(1,t,n,0)!==r.check?-3:Z(e,t,n,n)?(r.mode=31,-4):(r.havedict=1,N):U},r.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(e,t,r){\"use strict\";var D=e(\"../utils/common\"),F=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],N=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],P=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,r,n,i,s,a,o){var h,u,l,f,c,d,p,m,_,g=o.bits,b=0,v=0,y=0,w=0,k=0,x=0,S=0,z=0,C=0,E=0,A=null,I=0,O=new D.Buf16(16),B=new D.Buf16(16),R=null,T=0;for(b=0;b<=15;b++)O[b]=0;for(v=0;v<n;v++)O[t[r+v]]++;for(k=g,w=15;1<=w&&0===O[w];w--);if(w<k&&(k=w),0===w)return i[s++]=20971520,i[s++]=20971520,o.bits=1,0;for(y=1;y<w&&0===O[y];y++);for(k<y&&(k=y),b=z=1;b<=15;b++)if(z<<=1,(z-=O[b])<0)return-1;if(0<z&&(0===e||1!==w))return-1;for(B[1]=0,b=1;b<15;b++)B[b+1]=B[b]+O[b];for(v=0;v<n;v++)0!==t[r+v]&&(a[B[t[r+v]]++]=v);if(d=0===e?(A=R=a,19):1===e?(A=F,I-=257,R=N,T-=257,256):(A=U,R=P,-1),b=y,c=s,S=v=E=0,l=-1,f=(C=1<<(x=k))-1,1===e&&852<C||2===e&&592<C)return 1;for(;;){for(p=b-S,_=a[v]<d?(m=0,a[v]):a[v]>d?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<<b-S,y=u=1<<x;i[c+(E>>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<<b-1;E&h;)h>>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k<b&&(E&f)!==l){for(0===S&&(S=k),c+=y,z=1<<(x=b-S);x+S<w&&!((z-=O[x+S])<=0);)x++,z<<=1;if(C+=1<<x,1===e&&852<C||2===e&&592<C)return 1;i[l=E&f]=k<<24|x<<16|c-s|0}}return 0!==E&&(i[c+E]=b-S<<24|64<<16|0),o.bits=k,0}},{\"../utils/common\":41}],51:[function(e,t,r){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(e,t,r){\"use strict\";var i=e(\"../utils/common\"),o=0,h=1;function n(e){for(var t=e.length;0<=--t;)e[t]=0}var s=0,a=29,u=256,l=u+1+a,f=30,c=19,_=2*l+1,g=15,d=16,p=7,m=256,b=16,v=17,y=18,w=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],k=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],x=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],z=new Array(2*(l+2));n(z);var C=new Array(2*f);n(C);var E=new Array(512);n(E);var A=new Array(256);n(A);var I=new Array(a);n(I);var O,B,R,T=new Array(f);function D(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function F(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function N(e){return e<256?E[e]:E[256+(e>>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<<e.bi_valid&65535,U(e,e.bi_buf),e.bi_buf=t>>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=r)}function L(e,t,r){P(e,r[2*t],r[2*t+1])}function j(e,t){for(var r=0;r|=1&e,e>>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t<l;t++)e.dyn_ltree[2*t]=0;for(t=0;t<f;t++)e.dyn_dtree[2*t]=0;for(t=0;t<c;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*m]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function M(e){8<e.bi_valid?U(e,e.bi_buf):0<e.bi_valid&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function H(e,t,r,n){var i=2*t,s=2*r;return e[i]<e[s]||e[i]===e[s]&&n[t]<=n[r]}function G(e,t,r){for(var n=e.heap[r],i=r<<1;i<=e.heap_len&&(i<e.heap_len&&H(t,e.heap[i+1],e.heap[i],e.depth)&&i++,!H(t,n,e.heap[i],e.depth));)e.heap[r]=e.heap[i],r=i,i<<=1;e.heap[r]=n}function K(e,t,r){var n,i,s,a,o=0;if(0!==e.last_lit)for(;n=e.pending_buf[e.d_buf+2*o]<<8|e.pending_buf[e.d_buf+2*o+1],i=e.pending_buf[e.l_buf+o],o++,0===n?L(e,i,t):(L(e,(s=A[i])+u+1,t),0!==(a=w[s])&&P(e,i-=I[s],a),L(e,s=N(--n),r),0!==(a=k[s])&&P(e,n-=T[s],a)),o<e.last_lit;);L(e,m,t)}function Y(e,t){var r,n,i,s=t.dyn_tree,a=t.stat_desc.static_tree,o=t.stat_desc.has_stree,h=t.stat_desc.elems,u=-1;for(e.heap_len=0,e.heap_max=_,r=0;r<h;r++)0!==s[2*r]?(e.heap[++e.heap_len]=u=r,e.depth[r]=0):s[2*r+1]=0;for(;e.heap_len<2;)s[2*(i=e.heap[++e.heap_len]=u<2?++u:0)]=1,e.depth[i]=0,e.opt_len--,o&&(e.static_len-=a[2*i+1]);for(t.max_code=u,r=e.heap_len>>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u<n||(e.bl_count[s]++,a=0,d<=n&&(a=c[n-d]),o=h[2*n],e.opt_len+=o*(s+a),f&&(e.static_len+=o*(l[2*n+1]+a)));if(0!==m){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,m-=2}while(0<m);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)u<(i=e.heap[--r])||(h[2*i+1]!==s&&(e.opt_len+=(s-h[2*i+1])*h[2*i],h[2*i+1]=s),n--)}}(e,t),Z(s,u,e.bl_count)}function X(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=a,a=t[2*(n+1)+1],++o<h&&i===a||(o<u?e.bl_tree[2*i]+=o:0!==i?(i!==s&&e.bl_tree[2*i]++,e.bl_tree[2*b]++):o<=10?e.bl_tree[2*v]++:e.bl_tree[2*y]++,s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4))}function V(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),n=0;n<=r;n++)if(i=a,a=t[2*(n+1)+1],!(++o<h&&i===a)){if(o<u)for(;L(e,i,e.bl_tree),0!=--o;);else 0!==i?(i!==s&&(L(e,i,e.bl_tree),o--),L(e,b,e.bl_tree),P(e,o-3,2)):o<=10?(L(e,v,e.bl_tree),P(e,o-3,3)):(L(e,y,e.bl_tree),P(e,o-11,7));s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4)}}n(T);var q=!1;function J(e,t,r,n){P(e,(s<<1)+(n?1:0),3),function(e,t,r,n){M(e),n&&(U(e,r),U(e,~r)),i.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}(e,t,r,!0)}r._tr_init=function(e){q||(function(){var e,t,r,n,i,s=new Array(g+1);for(n=r=0;n<a-1;n++)for(I[n]=r,e=0;e<1<<w[n];e++)A[r++]=n;for(A[r-1]=n,n=i=0;n<16;n++)for(T[n]=i,e=0;e<1<<k[n];e++)E[i++]=n;for(i>>=7;n<f;n++)for(T[n]=i<<7,e=0;e<1<<k[n]-7;e++)E[256+i++]=n;for(t=0;t<=g;t++)s[t]=0;for(e=0;e<=143;)z[2*e+1]=8,e++,s[8]++;for(;e<=255;)z[2*e+1]=9,e++,s[9]++;for(;e<=279;)z[2*e+1]=7,e++,s[7]++;for(;e<=287;)z[2*e+1]=8,e++,s[8]++;for(Z(z,l+1,s),e=0;e<f;e++)C[2*e+1]=5,C[2*e]=j(e,5);O=new D(z,w,u+1,l,g),B=new D(C,k,0,f,g),R=new D(new Array(0),x,0,c,p)}(),q=!0),e.l_desc=new F(e.dyn_ltree,O),e.d_desc=new F(e.dyn_dtree,B),e.bl_desc=new F(e.bl_tree,R),e.bi_buf=0,e.bi_valid=0,W(e)},r._tr_stored_block=J,r._tr_flush_block=function(e,t,r,n){var i,s,a=0;0<e.level?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t<u;t++)if(0!==e.dyn_ltree[2*t])return h;return o}(e)),Y(e,e.l_desc),Y(e,e.d_desc),a=function(e){var t;for(X(e,e.dyn_ltree,e.l_desc.max_code),X(e,e.dyn_dtree,e.d_desc.max_code),Y(e,e.bl_desc),t=c-1;3<=t&&0===e.bl_tree[2*S[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i<n;i++)P(e,e.bl_tree[2*S[i]+1],3);V(e,e.dyn_ltree,t-1),V(e,e.dyn_dtree,r-1)}(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),K(e,e.dyn_ltree,e.dyn_dtree)),W(e),n&&M(e)},r._tr_tally=function(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r<t.length;r++)t[r]=arguments[r+1];var n={callback:e,args:t};return h[o]=n,i(o),o++},e.clearImmediate=f}function f(e){delete h[e]}function c(e){if(u)setTimeout(c,0,e);else{var t=h[e];if(t){u=!0;try{!function(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}(t)}finally{f(e),u=!1}}}}function d(e){e.source===r&&\"string\"==typeof e.data&&0===e.data.indexOf(a)&&c(+e.data.slice(a.length))}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}]},{},[10])(10)});","import JSZip from 'jszip';\nimport { DWGData } from '../types/dwgTypes';\nimport { LoadedCadTile2d, SplitCadManifest, SplitCadManifestNode } from './types';\n\ntype JsonLoader = (url: string) => Promise<any>;\ntype ImageUrlResolver = (entity: any, baseUrl: string) => Promise<string>;\n\n/** CAD 数据源适配器,支持拆分目录、manifest 地址和 .2d zip 包。 */\nexport class CadDataSource {\n private zipObjectUrls: string[] = [];\n\n /** 加载新版 manifest 分包数据,并返回 Loader 可消费的 DWGData 结构。 */\n public async load(url: string): Promise<DWGData> {\n this.clearZipObjectUrls();\n\n if (this.is2dZipUrl(url)) {\n return this.loadZipData(url);\n }\n\n const manifestUrl = this.isManifestUrl(url) ? url : this.joinUrl(this.normalizeDirectoryUrl(url), 'manifest.json');\n const manifest = await this.fetchJson(manifestUrl);\n if (!this.isSplitManifest(manifest)) {\n throw new Error('[LoaderModule2d] Expected split CAD manifest data.');\n }\n return this.loadSplitData(this.getBaseUrl(manifestUrl), manifest);\n }\n\n /** 拉取 JSON 资源;保留为 public,方便后续按视口动态加载 tile。 */\n public async fetchJson(url: string): Promise<any> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n }\n\n /** 组装 manifest/layers/metadata/blocks/tiles,octree 和 tiles 会保留给渲染分组使用。 */\n private async loadSplitData(\n baseUrl: string,\n manifest: SplitCadManifest,\n fetchJson: JsonLoader = (url) => this.fetchJson(url),\n resolveImageUrl: ImageUrlResolver = (entity, sourceBaseUrl) => Promise.resolve(this.resolveImageUrl(entity, sourceBaseUrl)),\n ): Promise<DWGData> {\n const [metadata, layers, blocks, tiles] = await Promise.all([\n fetchJson(this.joinUrl(baseUrl, manifest.metadataUrl ?? 'metadata.json')),\n fetchJson(this.joinUrl(baseUrl, manifest.layersUrl ?? 'layers.json')),\n this.loadBlocks(baseUrl, manifest.blocksUrl ?? 'blocks/index.json', fetchJson),\n this.loadTiles(baseUrl, manifest.root, fetchJson),\n ]);\n\n await this.resolveBlockAssets(blocks, baseUrl, resolveImageUrl);\n\n const entities: any[] = [];\n tiles.forEach((tile) => {\n tile.inserts.forEach((insert) => entities.push(insert));\n });\n\n return {\n version: manifest.version ?? '1.0',\n metadata,\n layers,\n blocks,\n entities,\n octree: manifest.root,\n tiles,\n } as DWGData;\n }\n\n /** blocks/index.json 只保存分包列表,这里全量拉取并建立 block 列表。 */\n private async loadBlocks(baseUrl: string, blocksUrl: string, fetchJson: JsonLoader): Promise<any[]> {\n const index = await fetchJson(this.joinUrl(baseUrl, blocksUrl));\n const parts: string[] = index.parts ?? [];\n const blockParts = await Promise.all(parts.map((partUrl) => this.loadBlockPart(this.joinUrl(baseUrl, partUrl), fetchJson)));\n const blocks: any[] = [];\n blockParts.forEach((part) => {\n const partBlocks = Array.isArray(part?.blocks) ? part.blocks : [];\n partBlocks.forEach((block: any) => blocks.push(block));\n });\n return blocks;\n }\n\n /** block 分包允许缺失或损坏;跳过失败分包,避免单个 JSON 中断整张 2D 图纸加载。 */\n private async loadBlockPart(url: string, fetchJson: JsonLoader): Promise<any> {\n try {\n return await fetchJson(url);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[LoaderModule2d] Skip missing block json: ${url}`, message);\n return { blocks: [] };\n }\n }\n\n /** 给 IMAGE 实体补充浏览器可访问的图片 URL,避免渲染层依赖本机绝对路径。 */\n private async resolveBlockAssets(blocks: any[], baseUrl: string, resolveImageUrl: ImageUrlResolver): Promise<void> {\n await Promise.all(blocks.map(async (block) => {\n const entities = Array.isArray(block?.entities) ? block.entities : [];\n await Promise.all(entities.map(async (entity: any) => {\n if (String(entity?.type).toUpperCase() !== 'IMAGE') return;\n entity.imageUrl = await resolveImageUrl(entity, baseUrl);\n }));\n }));\n }\n\n /** 优先使用 localPath 的文件名;导出器会把图片复制到 manifest 同级目录。 */\n private resolveImageUrl(entity: any, baseUrl: string): string {\n const rawPath = entity.localPath || entity.sourcePath || entity.path || entity.url || '';\n if (/^(https?:)?\\/\\//i.test(rawPath) || rawPath.startsWith('/')) return rawPath;\n const normalized = String(rawPath).replace(/\\\\/g, '/');\n const fileName = normalized.split('/').filter(Boolean).pop();\n return fileName ? this.joinUrl(baseUrl, fileName) : '';\n }\n\n /** 逐个加载 octree tile,并把 tile 内 linkId 回写到节点,供拾取时快速筛选。 */\n private async loadTiles(baseUrl: string, root: SplitCadManifestNode | undefined, fetchJson: JsonLoader): Promise<LoadedCadTile2d[]> {\n const nodes = this.collectTileNodes(root);\n const tiles = await Promise.all(nodes.map(async (node) => {\n const tileUrl = node.tileUrl ?? '';\n const tile = await fetchJson(this.joinUrl(baseUrl, tileUrl));\n const inserts = this.normalizeTileInserts(tile.inserts ?? []);\n node.elements = inserts.map((insert) => insert.linkId ?? insert.id).filter((id) => id != null);\n return {\n id: node.id ?? tile.id ?? tileUrl,\n url: tileUrl,\n node,\n inserts,\n };\n }));\n return tiles;\n }\n\n /** 统一 tile 内 INSERT 字段,后续 block 展开只依赖 transformMatrix,不使用 min/max 修正位置。 */\n private normalizeTileInserts(inserts: any[]): any[] {\n return inserts.map((insert: any) => ({\n ...insert,\n linkId: insert.linkId ?? insert.id,\n type: 'INSERT',\n color: insert.color ?? 0,\n visible: insert.visible ?? true,\n }));\n }\n\n /** 迭代收集 manifest 空间树中实际存在 tile 文件的节点,避免深树递归造成调用栈风险。 */\n private collectTileNodes(root?: SplitCadManifestNode): SplitCadManifestNode[] {\n if (!root) return [];\n const nodes: SplitCadManifestNode[] = [];\n const stack: SplitCadManifestNode[] = [root];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n if (current.tileUrl) nodes.push(current);\n const children = current.children ?? [];\n for (let index = children.length - 1; index >= 0; index -= 1) {\n stack.push(children[index]);\n }\n }\n return nodes;\n }\n\n /** 加载 .2d 压缩包,并按包内 manifest 引用路径读取拆分后的 CAD 数据。 */\n private async loadZipData(url: string): Promise<DWGData> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const zip = await JSZip.loadAsync(await response.arrayBuffer());\n const manifestPath = this.findZipManifestPath(zip);\n const manifest = await this.fetchZipJson(zip, manifestPath);\n if (!this.isSplitManifest(manifest)) {\n throw new Error('[LoaderModule2d] Expected split CAD manifest data in .2d package.');\n }\n\n const baseUrl = this.getZipBasePath(manifestPath);\n return this.loadSplitData(\n baseUrl,\n manifest,\n (sourceUrl) => this.fetchZipJson(zip, sourceUrl),\n (entity, sourceBaseUrl) => this.resolveZipImageUrl(zip, entity, sourceBaseUrl),\n );\n }\n\n /** .2d 是 zip 容器,manifest 可以在根目录或子目录中。 */\n private findZipManifestPath(zip: JSZip): string {\n const names = Object.keys(zip.files).filter((name) => !zip.files[name].dir);\n const rootManifest = names.find((name) => this.normalizeZipPath(name).toLowerCase() === 'manifest.json');\n const manifest = rootManifest ?? names.find((name) => this.normalizeZipPath(name).toLowerCase().endsWith('/manifest.json'));\n if (!manifest) {\n throw new Error('[LoaderModule2d] Missing manifest.json in .2d package.');\n }\n return this.normalizeZipPath(manifest);\n }\n\n /** 从 zip 中读取 JSON,路径规则与原 manifest 拆分目录保持一致。 */\n private async fetchZipJson(zip: JSZip, url: string): Promise<any> {\n if (/^(https?:)?\\/\\//i.test(url)) {\n return this.fetchJson(url);\n }\n\n const zipFile = this.getZipFile(zip, url);\n if (!zipFile) {\n throw new Error(`[LoaderModule2d] Missing file in .2d package: ${url}`);\n }\n return JSON.parse(await zipFile.async('string'));\n }\n\n /** IMAGE 实体改为使用 zip 中解出的 Blob URL,避免继续按外部目录请求图片。 */\n private async resolveZipImageUrl(zip: JSZip, entity: any, baseUrl: string): Promise<string> {\n const rawPath = entity.localPath || entity.sourcePath || entity.path || entity.url || '';\n if (/^(https?:)?\\/\\//i.test(rawPath) || String(rawPath).startsWith('blob:')) return rawPath;\n\n const normalized = this.normalizeZipPath(String(rawPath));\n const fileName = normalized.split('/').filter(Boolean).pop();\n const candidates = [\n this.joinUrl(baseUrl, normalized),\n fileName ? this.joinUrl(baseUrl, fileName) : '',\n normalized,\n fileName ?? '',\n ].filter(Boolean);\n\n const match = candidates.map((candidate) => this.getZipFile(zip, candidate)).find((file): file is JSZip.JSZipObject => !!file);\n if (!match) return '';\n\n const blobUrl = URL.createObjectURL(new Blob([await match.async('arraybuffer')]));\n this.zipObjectUrls.push(blobUrl);\n return blobUrl;\n }\n\n private isSplitManifest(data: any): data is SplitCadManifest {\n return !!data && typeof data === 'object' && (data.splitType === 'octree-2d' || !!data.blocksUrl);\n }\n\n private is2dZipUrl(url: string): boolean {\n return /\\.2d($|[?#])/i.test(url);\n }\n\n private isManifestUrl(url: string): boolean {\n return /manifest\\.json($|\\?)/i.test(url);\n }\n\n private getBaseUrl(url: string): string {\n const cleanUrl = url.split('?')[0];\n return cleanUrl.slice(0, cleanUrl.lastIndexOf('/') + 1);\n }\n\n private getZipBasePath(url: string): string {\n const cleanUrl = this.normalizeZipPath(url);\n const index = cleanUrl.lastIndexOf('/');\n return index >= 0 ? cleanUrl.slice(0, index + 1) : '';\n }\n\n private normalizeDirectoryUrl(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n }\n\n private joinUrl(baseUrl: string, relativeUrl: string): string {\n if (/^(https?:)?\\/\\//i.test(relativeUrl) || relativeUrl.startsWith('/')) return relativeUrl;\n return `${baseUrl}${relativeUrl}`.replace(/([^:]\\/)\\/+/g, '$1');\n }\n\n private normalizeZipPath(path: string): string {\n return String(path).split('?')[0].split('#')[0].replace(/\\\\/g, '/').replace(/^\\/+/, '');\n }\n\n private getZipFile(zip: JSZip, url: string): JSZip.JSZipObject | null {\n const normalized = this.normalizeZipPath(url);\n const exact = zip.file(normalized);\n if (exact) return exact;\n const lowerPath = normalized.toLowerCase();\n const matchedName = Object.keys(zip.files).find((name) => this.normalizeZipPath(name).toLowerCase() === lowerPath);\n return matchedName ? zip.file(matchedName) : null;\n }\n\n private clearZipObjectUrls(): void {\n this.zipObjectUrls.forEach((url) => URL.revokeObjectURL(url));\n this.zipObjectUrls = [];\n }\n}\n","import {\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * @module NURBSUtils\n * @three_import import * as NURBSUtils from 'three/addons/curves/NURBSUtils.js';\n */\n\n/**\n * Finds knot vector span.\n *\n * @param {number} p - The degree.\n * @param {number} u - The parametric value.\n * @param {Array<number>} U - The knot vector.\n * @return {number} The span.\n */\nfunction findSpan( p, u, U ) {\n\n\tconst n = U.length - p - 1;\n\n\tif ( u >= U[ n ] ) {\n\n\t\treturn n - 1;\n\n\t}\n\n\tif ( u <= U[ p ] ) {\n\n\t\treturn p;\n\n\t}\n\n\tlet low = p;\n\tlet high = n;\n\tlet mid = Math.floor( ( low + high ) / 2 );\n\n\twhile ( u < U[ mid ] || u >= U[ mid + 1 ] ) {\n\n\t\tif ( u < U[ mid ] ) {\n\n\t\t\thigh = mid;\n\n\t\t} else {\n\n\t\t\tlow = mid;\n\n\t\t}\n\n\t\tmid = Math.floor( ( low + high ) / 2 );\n\n\t}\n\n\treturn mid;\n\n}\n\n/**\n * Calculates basis functions. See The NURBS Book, page 70, algorithm A2.2.\n *\n * @param {number} span - The span in which `u` lies.\n * @param {number} u - The parametric value.\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @return {Array<number>} Array[p+1] with basis functions values.\n */\nfunction calcBasisFunctions( span, u, p, U ) {\n\n\tconst N = [];\n\tconst left = [];\n\tconst right = [];\n\tN[ 0 ] = 1.0;\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tconst temp = N[ r ] / ( rv + lv );\n\t\t\tN[ r ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tN[ j ] = saved;\n\n\t}\n\n\treturn N;\n\n}\n\n/**\n * Calculates B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n *\n * @param {number} p - The degree of the B-Spline.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points\n * @param {number} u - The parametric point.\n * @return {Vector4} The point for given `u`.\n */\nfunction calcBSplinePoint( p, U, P, u ) {\n\n\tconst span = findSpan( p, u, U );\n\tconst N = calcBasisFunctions( span, u, p, U );\n\tconst C = new Vector4( 0, 0, 0, 0 );\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tconst point = P[ span - p + j ];\n\t\tconst Nj = N[ j ];\n\t\tconst wNj = point.w * Nj;\n\t\tC.x += point.x * wNj;\n\t\tC.y += point.y * wNj;\n\t\tC.z += point.z * wNj;\n\t\tC.w += point.w * Nj;\n\n\t}\n\n\treturn C;\n\n}\n\n/**\n * Calculates basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n *\n * @param {number} span - The span in which `u` lies.\n * @param {number} u - The parametric point.\n * @param {number} p - The degree.\n * @param {number} n - number of derivatives to calculate\n * @param {Array<number>} U - The knot vector.\n * @return {Array<Array<number>>} An array[n+1][p+1] with basis functions derivatives.\n */\nfunction calcBasisFunctionDerivatives( span, u, p, n, U ) {\n\n\tconst zeroArr = [];\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tzeroArr[ i ] = 0.0;\n\n\tconst ders = [];\n\n\tfor ( let i = 0; i <= n; ++ i )\n\t\tders[ i ] = zeroArr.slice( 0 );\n\n\tconst ndu = [];\n\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tndu[ i ] = zeroArr.slice( 0 );\n\n\tndu[ 0 ][ 0 ] = 1.0;\n\n\tconst left = zeroArr.slice( 0 );\n\tconst right = zeroArr.slice( 0 );\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tndu[ j ][ r ] = rv + lv;\n\n\t\t\tconst temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];\n\t\t\tndu[ r ][ j ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tndu[ j ][ j ] = saved;\n\n\t}\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tders[ 0 ][ j ] = ndu[ j ][ p ];\n\n\t}\n\n\tfor ( let r = 0; r <= p; ++ r ) {\n\n\t\tlet s1 = 0;\n\t\tlet s2 = 1;\n\n\t\tconst a = [];\n\t\tfor ( let i = 0; i <= p; ++ i ) {\n\n\t\t\ta[ i ] = zeroArr.slice( 0 );\n\n\t\t}\n\n\t\ta[ 0 ][ 0 ] = 1.0;\n\n\t\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\t\tlet d = 0.0;\n\t\t\tconst rk = r - k;\n\t\t\tconst pk = p - k;\n\n\t\t\tif ( r >= k ) {\n\n\t\t\t\ta[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];\n\t\t\t\td = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];\n\n\t\t\t}\n\n\t\t\tconst j1 = ( rk >= - 1 ) ? 1 : - rk;\n\t\t\tconst j2 = ( r - 1 <= pk ) ? k - 1 : p - r;\n\n\t\t\tfor ( let j = j1; j <= j2; ++ j ) {\n\n\t\t\t\ta[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];\n\t\t\t\td += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];\n\n\t\t\t}\n\n\t\t\tif ( r <= pk ) {\n\n\t\t\t\ta[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];\n\t\t\t\td += a[ s2 ][ k ] * ndu[ r ][ pk ];\n\n\t\t\t}\n\n\t\t\tders[ k ][ r ] = d;\n\n\t\t\tconst j = s1;\n\t\t\ts1 = s2;\n\t\t\ts2 = j;\n\n\t\t}\n\n\t}\n\n\tlet r = p;\n\n\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\t\tders[ k ][ j ] *= r;\n\n\t\t}\n\n\t\tr *= p - k;\n\n\t}\n\n\treturn ders;\n\n}\n\n/**\n * Calculates derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n *\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points\n * @param {number} u - The parametric point.\n * @param {number} nd - The number of derivatives.\n * @return {Array<Vector4>} An array[d+1] with derivatives.\n */\nfunction calcBSplineDerivatives( p, U, P, u, nd ) {\n\n\tconst du = nd < p ? nd : p;\n\tconst CK = [];\n\tconst span = findSpan( p, u, U );\n\tconst nders = calcBasisFunctionDerivatives( span, u, p, du, U );\n\tconst Pw = [];\n\n\tfor ( let i = 0; i < P.length; ++ i ) {\n\n\t\tconst point = P[ i ].clone();\n\t\tconst w = point.w;\n\n\t\tpoint.x *= w;\n\t\tpoint.y *= w;\n\t\tpoint.z *= w;\n\n\t\tPw[ i ] = point;\n\n\t}\n\n\tfor ( let k = 0; k <= du; ++ k ) {\n\n\t\tconst point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );\n\n\t\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\t\tpoint.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = point;\n\n\t}\n\n\tfor ( let k = du + 1; k <= nd + 1; ++ k ) {\n\n\t\tCK[ k ] = new Vector4( 0, 0, 0 );\n\n\t}\n\n\treturn CK;\n\n}\n\n/**\n * Calculates \"K over I\".\n *\n * @param {number} k - The K value.\n * @param {number} i - The I value.\n * @return {number} k!/(i!(k-i)!)\n */\nfunction calcKoverI( k, i ) {\n\n\tlet nom = 1;\n\n\tfor ( let j = 2; j <= k; ++ j ) {\n\n\t\tnom *= j;\n\n\t}\n\n\tlet denom = 1;\n\n\tfor ( let j = 2; j <= i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\tfor ( let j = 2; j <= k - i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\treturn nom / denom;\n\n}\n\n/**\n * Calculates derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n *\n * @param {Array<Vector4>} Pders - Array with derivatives.\n * @return {Array<Vector3>} An array with derivatives for rational curve.\n */\nfunction calcRationalCurveDerivatives( Pders ) {\n\n\tconst nd = Pders.length;\n\tconst Aders = [];\n\tconst wders = [];\n\n\tfor ( let i = 0; i < nd; ++ i ) {\n\n\t\tconst point = Pders[ i ];\n\t\tAders[ i ] = new Vector3( point.x, point.y, point.z );\n\t\twders[ i ] = point.w;\n\n\t}\n\n\tconst CK = [];\n\n\tfor ( let k = 0; k < nd; ++ k ) {\n\n\t\tconst v = Aders[ k ].clone();\n\n\t\tfor ( let i = 1; i <= k; ++ i ) {\n\n\t\t\tv.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = v.divideScalar( wders[ 0 ] );\n\n\t}\n\n\treturn CK;\n\n}\n\n/**\n * Calculates NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n *\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points in homogeneous space.\n * @param {number} u - The parametric point.\n * @param {number} nd - The number of derivatives.\n * @return {Array<Vector3>} array with derivatives for rational curve.\n */\nfunction calcNURBSDerivatives( p, U, P, u, nd ) {\n\n\tconst Pders = calcBSplineDerivatives( p, U, P, u, nd );\n\treturn calcRationalCurveDerivatives( Pders );\n\n}\n\n/**\n * Calculates a rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n *\n * @param {number} p - The first degree of B-Spline surface.\n * @param {number} q - The second degree of B-Spline surface.\n * @param {Array<number>} U - The first knot vector.\n * @param {Array<number>} V - The second knot vector.\n * @param {Array<Array<Vector4>>} P - The control points in homogeneous space.\n * @param {number} u - The first parametric point.\n * @param {number} v - The second parametric point.\n * @param {Vector3} target - The target vector.\n */\nfunction calcSurfacePoint( p, q, U, V, P, u, v, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst temp = [];\n\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\ttemp[ l ] = new Vector4( 0, 0, 0, 0 );\n\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ].clone();\n\t\t\tconst w = point.w;\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\t\t\ttemp[ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\tSw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n/**\n * Calculates a rational B-Spline volume point. See The NURBS Book, page 134, algorithm A4.3.\n *\n * @param {number} p - The first degree of B-Spline surface.\n * @param {number} q - The second degree of B-Spline surface.\n * @param {number} r - The third degree of B-Spline surface.\n * @param {Array<number>} U - The first knot vector.\n * @param {Array<number>} V - The second knot vector.\n * @param {Array<number>} W - The third knot vector.\n * @param {Array<Array<Array<Vector4>>>} P - The control points in homogeneous space.\n * @param {number} u - The first parametric point.\n * @param {number} v - The second parametric point.\n * @param {number} w - The third parametric point.\n * @param {Vector3} target - The target vector.\n */\nfunction calcVolumePoint( p, q, r, U, V, W, P, u, v, w, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst wspan = findSpan( r, w, W );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst Nw = calcBasisFunctions( wspan, w, r, W );\n\tconst temp = [];\n\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\ttemp[ m ] = [];\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\ttemp[ m ][ l ] = new Vector4( 0, 0, 0, 0 );\n\t\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ][ wspan - r + m ].clone();\n\t\t\t\tconst w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[ m ][ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\tSw.add( temp[ m ][ l ].multiplyScalar( Nw[ m ] ).multiplyScalar( Nv[ l ] ) );\n\n\t\t}\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\nexport {\n\tfindSpan,\n\tcalcBasisFunctions,\n\tcalcBSplinePoint,\n\tcalcBasisFunctionDerivatives,\n\tcalcBSplineDerivatives,\n\tcalcKoverI,\n\tcalcRationalCurveDerivatives,\n\tcalcNURBSDerivatives,\n\tcalcSurfacePoint,\n\tcalcVolumePoint,\n};\n","import {\n\tCurve,\n\tVector3,\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * This class represents a NURBS curve.\n *\n * Implementation is based on `(x, y [, z=0 [, w=1]])` control points with `w=weight`.\n *\n * @augments Curve\n * @three_import import { NURBSCurve } from 'three/addons/curves/NURBSCurve.js';\n */\nclass NURBSCurve extends Curve {\n\n\t/**\n\t * Constructs a new NURBS curve.\n\t *\n\t * @param {number} degree - The NURBS degree.\n\t * @param {Array<number>} knots - The knots as a flat array of numbers.\n\t * @param {Array<Vector2|Vector3|Vector4>} controlPoints - An array holding control points.\n\t * @param {number} [startKnot] - Index of the start knot into the `knots` array.\n\t * @param {number} [endKnot] - Index of the end knot into the `knots` array.\n\t */\n\tconstructor( degree, knots, controlPoints, startKnot, endKnot ) {\n\n\t\tsuper();\n\n\t\tconst knotsLength = knots ? knots.length - 1 : 0;\n\t\tconst pointsLength = controlPoints ? controlPoints.length : 0;\n\n\t\t/**\n\t\t * The NURBS degree.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.degree = degree;\n\n\t\t/**\n\t\t * The knots as a flat array of numbers.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.knots = knots;\n\n\t\t/**\n\t\t * An array of control points.\n\t\t *\n\t\t * @type {Array<Vector4>}\n\t\t */\n\t\tthis.controlPoints = [];\n\n\t\t/**\n\t\t * Index of the start knot into the `knots` array.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.startKnot = startKnot || 0;\n\n\t\t/**\n\t\t * Index of the end knot into the `knots` array.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.endKnot = endKnot || knotsLength;\n\n\t\tfor ( let i = 0; i < pointsLength; ++ i ) {\n\n\t\t\t// ensure Vector4 for control points\n\t\t\tconst point = controlPoints[ i ];\n\t\t\tthis.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u\n\n\t\t// following results in (wx, wy, wz, w) homogeneous point\n\t\tconst hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );\n\n\t\tif ( hpoint.w !== 1.0 ) {\n\n\t\t\t// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\t\thpoint.divideScalar( hpoint.w );\n\n\t\t}\n\n\t\treturn point.set( hpoint.x, hpoint.y, hpoint.z );\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\tconst tangent = optionalTarget;\n\n\t\tconst u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );\n\t\tconst ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );\n\t\ttangent.copy( ders[ 1 ] ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.degree = this.degree;\n\t\tdata.knots = [ ...this.knots ];\n\t\tdata.controlPoints = this.controlPoints.map( p => p.toArray() );\n\t\tdata.startKnot = this.startKnot;\n\t\tdata.endKnot = this.endKnot;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.degree = json.degree;\n\t\tthis.knots = [ ...json.knots ];\n\t\tthis.controlPoints = json.controlPoints.map( p => new Vector4( p[ 0 ], p[ 1 ], p[ 2 ], p[ 3 ] ) );\n\t\tthis.startKnot = json.startKnot;\n\t\tthis.endKnot = json.endKnot;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { NURBSCurve };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\n/**\n * @module BufferGeometryUtils\n * @three_import import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';\n */\n\n/**\n * Computes vertex tangents using the MikkTSpace algorithm. MikkTSpace generates the same tangents consistently,\n * and is used in most modelling tools and normal map bakers. Use MikkTSpace for materials with normal maps,\n * because inconsistent tangents may lead to subtle visual issues in the normal map, particularly around mirrored\n * UV seams.\n *\n * In comparison to this method, {@link BufferGeometry#computeTangents} (a custom algorithm) generates tangents that\n * probably will not match the tangents in other software. The custom algorithm is sufficient for general use with a\n * custom material, and may be faster than MikkTSpace.\n *\n * Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.\n *\n * @param {BufferGeometry} geometry - The geometry to compute tangents for.\n * @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.\n * Await `MikkTSpace.ready` before use.\n * @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.\n * Required for normal map conventions in some formats, including glTF.\n * @return {BufferGeometry} The updated geometry.\n */\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Merges a set of geometries into a single instance. All geometries must have compatible attributes.\n *\n * @param {Array<BufferGeometry>} geometries - The geometries to merge.\n * @param {boolean} [useGroups=false] - Whether to use groups or not.\n * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.\n * Instances of {@link InterleavedBufferAttribute} are not supported.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to merge.\n * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Performs a deep clone of the given buffer attribute.\n *\n * @param {BufferAttribute} attribute - The attribute to clone.\n * @return {BufferAttribute} The cloned attribute.\n */\nfunction deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * Interleaves a set of attributes and returns a new array of corresponding attributes that share a\n * single {@link InterleavedBuffer} instance. All attributes must have compatible types.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to interleave.\n * @return {?Array<InterleavedBufferAttribute>} An array of interleaved attributes. If interleave does not succeed, the method returns `null`.\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n/**\n * Returns a new, non-interleaved version of the given attribute.\n *\n * @param {InterleavedBufferAttribute} attribute - The interleaved attribute.\n * @return {BufferAttribute} The non-interleaved attribute.\n */\nfunction deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n/**\n * Deinterleaves all attributes on the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to deinterleave.\n */\nfunction deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Returns the amount of bytes used by all attributes to represent the geometry.\n *\n * @param {BufferGeometry} geometry - The geometry.\n * @return {number} The estimate bytes used.\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * Returns a new geometry with vertices for which all similar vertex attributes (within tolerance) are merged.\n *\n * @param {BufferGeometry} geometry - The geometry to merge vertices for.\n * @param {number} [tolerance=1e-4] - The tolerance value.\n * @return {BufferGeometry} - The new geometry with merged vertices.\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * Returns a new indexed geometry based on `TrianglesDrawMode` draw mode.\n * This mode corresponds to the `gl.TRIANGLES` primitive in WebGL.\n *\n * @param {BufferGeometry} geometry - The geometry to convert.\n * @param {number} drawMode - The current draw mode.\n * @return {BufferGeometry} The new geometry using `TrianglesDrawMode`.\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n *\n * Helpful for Raytracing or Decals (i.e. a `DecalGeometry` applied to a morphed Object with a `BufferGeometry`\n * will use the original `BufferGeometry`, not the morphed/skinned one, generating an incorrect result.\n * Using this function to create a shadow `Object3`D the `DecalGeometry` can be correctly generated).\n *\n * @param {Mesh|Line|Points} object - The 3D object to compute morph attributes for.\n * @return {Object} An object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\n/**\n * Merges the {@link BufferGeometry#groups} for the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @param {number} [creaseAngle=Math.PI/3] - The crease angle in radians.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tdeepCloneAttribute,\n\tdeinterleaveAttribute,\n\tdeinterleaveGeometry,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import * as THREE from 'three';\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport { RenderItem2d } from './types';\nimport { getGeometryBounds, getPointsBounds } from './geometryUtils';\n\ntype Vec2Tuple = [number, number];\n\ninterface HatchLoop {\n type?: boolean;\n points?: Vec2Tuple[];\n}\n\ninterface HatchPatternLine {\n angle?: number;\n basePoint?: Vec2Tuple;\n offset?: Vec2Tuple;\n lineOffset?: number;\n shift?: number;\n dashLengths?: number[];\n}\n\ninterface HatchGradientStop {\n value?: number;\n color?: number;\n rgb?: number[];\n}\n\ninterface HatchGradient {\n enabled?: boolean;\n name?: string;\n angle?: number;\n shift?: number;\n singleColor?: boolean;\n colorTint?: number;\n colors?: HatchGradientStop[];\n}\n\ninterface HatchEntity {\n id?: any;\n linkId?: any;\n layer?: string;\n color?: number;\n rgb?: number[];\n solid?: boolean;\n patternType?: string;\n patternAngle?: number;\n gradient?: HatchGradient;\n loops?: HatchLoop[];\n patternLines?: HatchPatternLine[];\n}\n\ninterface HatchLoopSet {\n outers: Vec2Tuple[][];\n holes: Vec2Tuple[][];\n}\n\nconst EPSILON = 1e-8;\nconst HATCH_Z_OFFSET = 0.001;\nconst UNKNOWN_HATCH_FILL_COLOR = 0x808080;\n\n/** 填充图案渲染器,负责把 CAD HATCH 的边界、洞和 PAT 线族还原成渲染中间态。 */\nexport class HatchPatternRenderer {\n constructor(private readonly engine: any) {}\n\n /** 根据 HATCH 数据生成实心面或图案线;有 patternLines 时优先还原图案。 */\n public create(entity: HatchEntity, baseMatrix: THREE.Matrix4): RenderItem2d[] {\n const loopSet = this.getLoopSet(entity);\n if (loopSet.outers.length === 0) return [];\n\n if (this.isGradientFill(entity)) {\n return this.createGradientItems(entity, baseMatrix, loopSet);\n }\n\n const isSolidFill = this.isSolidFill(entity);\n if (isSolidFill) {\n return this.createSolidItems(entity, baseMatrix, loopSet);\n }\n\n const patternItem = this.createPatternLineItem(entity, baseMatrix, loopSet);\n if (patternItem) return [patternItem];\n\n // 无法还原 PAT 线族时用灰色实心面兜底,避免图案填充整块缺失。\n this.warnUnknownPatternFallback(entity);\n return this.createSolidItems(entity, baseMatrix, loopSet, UNKNOWN_HATCH_FILL_COLOR);\n }\n\n /** 只有明确的 SOLID 才作为实心面;patternType=SolidFill 在当前导出数据里不可靠。 */\n private isSolidFill(entity: HatchEntity): boolean {\n const patternName = String((entity as any).pattern ?? (entity as any).patternName ?? '').toUpperCase();\n return entity.solid === true || patternName === 'SOLID';\n }\n\n private warnUnknownPatternFallback(entity: HatchEntity): void {\n const patternName = (entity as any).pattern ?? (entity as any).patternName ?? 'UNKNOWN';\n if (this.engine.options?.debugHatch === true) {\n console.warn(`[LoaderModule2d] HATCH pattern \"${patternName}\" cannot be rendered, use gray solid fallback.`);\n }\n }\n\n /** 渐变填充要先于 SOLID 名称判断,否则 pattern=SOLID,_O 会被当作普通面。 */\n private isGradientFill(entity: HatchEntity): boolean {\n return entity.gradient?.enabled === true || String(entity.patternType ?? '').toUpperCase() === 'GRADIENTFILL';\n }\n\n /** 将循环按外轮廓和洞拆分;兼容只按顺序导出的数据。 */\n private getLoopSet(entity: HatchEntity): HatchLoopSet {\n const validLoops = (entity.loops ?? [])\n .map((loop) => this.normalizeLoop(loop.points))\n .filter((points): points is Vec2Tuple[] => points.length >= 3);\n if (validLoops.length === 0) return { outers: [], holes: [] };\n\n const typedLoops = (entity.loops ?? []).filter((loop) => this.normalizeLoop(loop.points).length >= 3);\n if (!typedLoops.some((loop) => loop.type === false)) {\n return this.classifyLoopsByContainment(validLoops);\n }\n\n const outers = typedLoops\n .filter((loop) => loop.type !== false)\n .map((loop) => this.normalizeLoop(loop.points));\n const holes = typedLoops\n .filter((loop) => loop.type === false)\n .map((loop) => this.normalizeLoop(loop.points));\n\n if (outers.length > 0) return { outers, holes };\n return { outers: [validLoops[0]], holes: validLoops.slice(1) };\n }\n\n /** 当导出数据没有显式洞标记时,按包含层级用奇偶规则区分外环和洞。 */\n private classifyLoopsByContainment(loops: Vec2Tuple[][]): HatchLoopSet {\n const sorted = [...loops].sort((a, b) => Math.abs(this.signedArea(b)) - Math.abs(this.signedArea(a)));\n const outers: Vec2Tuple[][] = [];\n const holes: Vec2Tuple[][] = [];\n\n sorted.forEach((loop, index) => {\n const sample = new THREE.Vector2(loop[0][0], loop[0][1]);\n const containingCount = sorted\n .slice(0, index)\n .filter((candidate) => this.pointInPolygon(sample, candidate))\n .length;\n if (containingCount % 2 === 0) outers.push(loop);\n else holes.push(loop);\n });\n\n return { outers, holes };\n }\n\n private signedArea(points: Vec2Tuple[]): number {\n let area = 0;\n for (let i = 0; i < points.length; i += 1) {\n const a = points[i];\n const b = points[(i + 1) % points.length];\n area += a[0] * b[1] - b[0] * a[1];\n }\n return area / 2;\n }\n\n /** 去掉重复闭合点和零长度边,降低裁剪时出现 NaN 或极短线段的概率。 */\n private normalizeLoop(points?: Vec2Tuple[]): Vec2Tuple[] {\n const result: Vec2Tuple[] = [];\n (points ?? []).forEach((point) => {\n if (!Array.isArray(point) || point.length < 2) return;\n const next: Vec2Tuple = [Number(point[0]), Number(point[1])];\n if (!Number.isFinite(next[0]) || !Number.isFinite(next[1])) return;\n const last = result[result.length - 1];\n if (!last || Math.hypot(next[0] - last[0], next[1] - last[1]) > EPSILON) result.push(next);\n });\n const first = result[0];\n const last = result[result.length - 1];\n if (first && last && Math.hypot(first[0] - last[0], first[1] - last[1]) <= EPSILON) result.pop();\n return result;\n }\n\n /** 通过 ShapeGeometry 构造实心填充面,洞循环会写入 shape.holes。 */\n private createSolidItems(\n entity: HatchEntity,\n baseMatrix: THREE.Matrix4,\n loopSet: HatchLoopSet,\n colorOverride?: number,\n ): RenderItem2d[] {\n const geometries: THREE.ShapeGeometry[] = [];\n loopSet.outers.forEach((outer) => {\n const shape = this.createShape(outer);\n loopSet.holes.filter((hole) => this.pointInPolygon(new THREE.Vector2(hole[0][0], hole[0][1]), outer)).forEach((hole) => {\n shape.holes.push(this.createPath(hole));\n });\n geometries.push(new THREE.ShapeGeometry(shape));\n });\n if (geometries.length === 0) return [];\n\n const geometry = geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, false);\n geometry.applyMatrix4(baseMatrix);\n const bounds = getGeometryBounds(geometry);\n return [{\n kind: 'hatch',\n layer: entity.layer ?? '0',\n color: colorOverride ?? this.resolveEntityColor(entity),\n linkId: entity.linkId ?? entity.id,\n geometry,\n min: bounds.min,\n max: bounds.max,\n info: entity,\n }];\n }\n\n private createShape(points: Vec2Tuple[]): THREE.Shape {\n const shape = new THREE.Shape();\n shape.moveTo(points[0][0], points[0][1]);\n for (let i = 1; i < points.length; i += 1) shape.lineTo(points[i][0], points[i][1]);\n shape.closePath();\n return shape;\n }\n\n private createPath(points: Vec2Tuple[]): THREE.Path {\n const path = new THREE.Path();\n path.moveTo(points[0][0], points[0][1]);\n for (let i = 1; i < points.length; i += 1) path.lineTo(points[i][0], points[i][1]);\n path.closePath();\n return path;\n }\n\n /** 按 CAD 渐变填充字段生成带顶点色的面,边界和洞仍复用 HATCH loop 裁剪。 */\n private createGradientItems(entity: HatchEntity, baseMatrix: THREE.Matrix4, loopSet: HatchLoopSet): RenderItem2d[] {\n const geometries: THREE.BufferGeometry[] = [];\n loopSet.outers.forEach((outer) => {\n const shape = this.createShape(outer);\n loopSet.holes.filter((hole) => this.pointInPolygon(new THREE.Vector2(hole[0][0], hole[0][1]), outer)).forEach((hole) => {\n shape.holes.push(this.createPath(hole));\n });\n\n const geometry = this.subdivideTriangles(new THREE.ShapeGeometry(shape), this.engine.options?.hatchGradientSubdivisions ?? 3);\n this.applyGradientVertexColors(geometry, outer, entity.gradient);\n geometries.push(geometry);\n });\n if (geometries.length === 0) return [];\n\n const geometry = geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, false);\n geometry.applyMatrix4(baseMatrix);\n const bounds = getGeometryBounds(geometry);\n return [{\n kind: 'hatch',\n layer: entity.layer ?? '0',\n color: this.resolveEntityColor(entity),\n linkId: entity.linkId ?? entity.id,\n geometry,\n useVertexColors: true,\n min: bounds.min,\n max: bounds.max,\n info: entity,\n }];\n }\n\n /** 渐变颜色直接写入顶点色;不同渐变名称用不同的归一化函数模拟 AutoCAD 的填充效果。 */\n private applyGradientVertexColors(geometry: THREE.BufferGeometry, outer: Vec2Tuple[], gradient?: HatchGradient): void {\n const position = geometry.getAttribute('position');\n const colors: number[] = [];\n const stops = this.resolveGradientStops(gradient);\n const bounds = this.getBounds(outer);\n const center = new THREE.Vector2((bounds.minX + bounds.maxX) / 2, (bounds.minY + bounds.maxY) / 2);\n const sizeX = Math.max(bounds.maxX - bounds.minX, EPSILON);\n const sizeY = Math.max(bounds.maxY - bounds.minY, EPSILON);\n const radius = Math.max(Math.hypot(sizeX / 2, sizeY / 2), EPSILON);\n const angle = Number(gradient?.angle ?? 0);\n const axis = new THREE.Vector2(Math.cos(angle), Math.sin(angle)).normalize();\n const normal = new THREE.Vector2(-axis.y, axis.x);\n\n for (let i = 0; i < position.count; i += 1) {\n const point = new THREE.Vector2(position.getX(i), position.getY(i));\n const factor = this.resolveGradientFactor(point, center, axis, normal, sizeX, sizeY, radius, gradient);\n const color = this.sampleGradientColor(stops, factor);\n colors.push(color.r, color.g, color.b);\n }\n geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\n }\n\n /** 顶点色渐变需要面内采样点;递归细分三角形后,矩形上的球形/圆柱渐变不会退化成纯色。 */\n private subdivideTriangles(source: THREE.BufferGeometry, depth: number): THREE.BufferGeometry {\n let geometry = source.index ? source.toNonIndexed() : source.clone();\n const safeDepth = Math.max(0, Math.min(Math.floor(Number(depth) || 0), 5));\n for (let level = 0; level < safeDepth; level += 1) {\n const position = geometry.getAttribute('position');\n const next: number[] = [];\n for (let i = 0; i < position.count; i += 3) {\n const a = new THREE.Vector3(position.getX(i), position.getY(i), position.getZ(i));\n const b = new THREE.Vector3(position.getX(i + 1), position.getY(i + 1), position.getZ(i + 1));\n const c = new THREE.Vector3(position.getX(i + 2), position.getY(i + 2), position.getZ(i + 2));\n const ab = a.clone().lerp(b, 0.5);\n const bc = b.clone().lerp(c, 0.5);\n const ca = c.clone().lerp(a, 0.5);\n this.pushTriangle(next, a, ab, ca);\n this.pushTriangle(next, ab, b, bc);\n this.pushTriangle(next, ca, bc, c);\n this.pushTriangle(next, ab, bc, ca);\n }\n geometry = new THREE.BufferGeometry().setAttribute('position', new THREE.Float32BufferAttribute(next, 3));\n }\n return geometry;\n }\n\n private pushTriangle(target: number[], a: THREE.Vector3, b: THREE.Vector3, c: THREE.Vector3): void {\n target.push(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z);\n }\n\n private resolveGradientFactor(\n point: THREE.Vector2,\n center: THREE.Vector2,\n axis: THREE.Vector2,\n normal: THREE.Vector2,\n sizeX: number,\n sizeY: number,\n radius: number,\n gradient?: HatchGradient,\n ): number {\n const relative = point.clone().sub(center);\n const name = String(gradient?.name ?? 'LINEAR').toUpperCase();\n const shift = Number(gradient?.shift ?? 0);\n const axisSpan = Math.max(Math.abs(axis.x) * sizeX + Math.abs(axis.y) * sizeY, EPSILON);\n const normalSpan = Math.max(Math.abs(normal.x) * sizeX + Math.abs(normal.y) * sizeY, EPSILON);\n let value = 0.5 + relative.dot(axis) / axisSpan + shift;\n\n if (name.includes('CYLINDER')) {\n value = Math.abs(relative.dot(normal)) / (normalSpan / 2);\n } else if (name.includes('SPHERICAL')) {\n value = relative.length() / radius;\n if (name.includes('HEMI')) value = Math.sqrt(value);\n } else if (name.includes('CURVED')) {\n value = Math.pow(Math.abs(relative.dot(axis)) / (axisSpan / 2), 0.65);\n }\n\n if (name.startsWith('INV')) value = 1 - value;\n return THREE.MathUtils.clamp(value, 0, 1);\n }\n\n private resolveGradientStops(gradient?: HatchGradient): Array<{ value: number; color: THREE.Color }> {\n const stops = (gradient?.colors ?? [])\n .map((stop) => ({ value: THREE.MathUtils.clamp(Number(stop.value ?? 0), 0, 1), color: this.resolveGradientStopColor(stop) }))\n .sort((a, b) => a.value - b.value);\n if (stops.length >= 2) return stops;\n if (stops.length === 1) {\n const tint = THREE.MathUtils.clamp(Number(gradient?.colorTint ?? 0), 0, 1);\n return [\n { value: 0, color: stops[0].color.clone().lerp(new THREE.Color(0xffffff), tint) },\n { value: 1, color: stops[0].color },\n ];\n }\n return [\n { value: 0, color: new THREE.Color(0xffffff) },\n { value: 1, color: new THREE.Color(0x000000) },\n ];\n }\n\n /** 渐变颜色兼容当前 rgb 数组格式和旧版数字色值格式。 */\n private resolveGradientStopColor(stop: HatchGradientStop): THREE.Color {\n if (Array.isArray(stop.rgb) && stop.rgb.length >= 3) {\n const [r, g, b] = stop.rgb.map((value) => THREE.MathUtils.clamp(Number(value ?? 0), 0, 255) / 255);\n return new THREE.Color(r, g, b);\n }\n return new THREE.Color(stop.color ?? 0xffffff);\n }\n\n /** HATCH 实体颜色优先读取当前数据的 rgb 数组;缺失时再兼容旧版 color 数字。 */\n private resolveEntityColor(entity: HatchEntity): number {\n if (Array.isArray(entity.rgb) && entity.rgb.length >= 3) {\n const [r, g, b] = entity.rgb.map((value) => Math.round(THREE.MathUtils.clamp(Number(value ?? 0), 0, 255)));\n return (r << 16) | (g << 8) | b;\n }\n return entity.color ?? 0xffffff;\n }\n\n private sampleGradientColor(stops: Array<{ value: number; color: THREE.Color }>, factor: number): THREE.Color {\n if (factor <= stops[0].value) return stops[0].color.clone();\n for (let i = 0; i < stops.length - 1; i += 1) {\n const current = stops[i];\n const next = stops[i + 1];\n if (factor <= next.value + EPSILON) {\n const span = Math.max(next.value - current.value, EPSILON);\n return current.color.clone().lerp(next.color, (factor - current.value) / span);\n }\n }\n return stops[stops.length - 1].color.clone();\n }\n\n /** 生成 PAT 图案线,先按外边界裁剪,再扣除所有洞边界。 */\n private createPatternLineItem(entity: HatchEntity, baseMatrix: THREE.Matrix4, loopSet: HatchLoopSet): RenderItem2d | null {\n const localPoints: THREE.Vector3[] = [];\n const maxSegments = this.engine.options?.hatchPatternMaxSegments ?? 20000;\n let segmentCount = 0;\n\n for (const outer of loopSet.outers) {\n const bounds = this.getBounds(outer);\n const diagonal = Math.hypot(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY);\n if (diagonal < EPSILON) continue;\n\n for (const patternLine of entity.patternLines ?? []) {\n if (segmentCount >= maxSegments) break;\n const familySegments = this.createPatternFamilySegments(entity, patternLine, outer, loopSet.holes, bounds, diagonal, maxSegments - segmentCount);\n familySegments.forEach(([start, end]) => {\n localPoints.push(\n new THREE.Vector3(start.x, start.y, HATCH_Z_OFFSET),\n new THREE.Vector3(end.x, end.y, HATCH_Z_OFFSET),\n );\n });\n segmentCount += familySegments.length;\n }\n }\n\n if (localPoints.length === 0) return null;\n localPoints.forEach((point) => point.applyMatrix4(baseMatrix));\n const bounds = getPointsBounds(localPoints);\n return {\n kind: 'line',\n layer: entity.layer ?? '0',\n color: this.resolveEntityColor(entity),\n linkId: entity.linkId ?? entity.id,\n points: localPoints,\n min: bounds.min,\n max: bounds.max,\n info: entity,\n };\n }\n\n /** 对一个 PAT 线族生成覆盖包围盒的候选长线,并拆成可见线段。 */\n private createPatternFamilySegments(\n entity: HatchEntity,\n patternLine: HatchPatternLine,\n outer: Vec2Tuple[],\n holes: Vec2Tuple[][],\n bounds: { minX: number; minY: number; maxX: number; maxY: number },\n diagonal: number,\n segmentBudget: number,\n ): Array<[THREE.Vector2, THREE.Vector2]> {\n const patternTransform = this.resolvePatternLineTransform(entity, patternLine);\n const dir = patternTransform.dir;\n const normal = new THREE.Vector2(-dir.y, dir.x);\n const base = patternTransform.base;\n const offset = patternTransform.offset;\n let normalStep = offset.dot(normal);\n if (Math.abs(normalStep) < EPSILON) {\n normalStep = Number(patternLine.lineOffset ?? 0);\n }\n if (Math.abs(normalStep) < EPSILON) return [];\n\n const corners = [\n new THREE.Vector2(bounds.minX, bounds.minY),\n new THREE.Vector2(bounds.maxX, bounds.minY),\n new THREE.Vector2(bounds.maxX, bounds.maxY),\n new THREE.Vector2(bounds.minX, bounds.maxY),\n ];\n const baseProjection = base.dot(normal);\n const projections = corners.map((corner) => corner.dot(normal) - baseProjection);\n const minProjection = Math.min(...projections) - diagonal;\n const maxProjection = Math.max(...projections) + diagonal;\n const i0 = Math.floor(Math.min(minProjection / normalStep, maxProjection / normalStep)) - 2;\n const i1 = Math.ceil(Math.max(minProjection / normalStep, maxProjection / normalStep)) + 2;\n const result: Array<[THREE.Vector2, THREE.Vector2]> = [];\n const boundsCenter = new THREE.Vector2((bounds.minX + bounds.maxX) / 2, (bounds.minY + bounds.maxY) / 2);\n\n for (let i = i0; i <= i1 && result.length < segmentBudget; i += 1) {\n const lineAnchor = base.clone().add(offset.clone().multiplyScalar(i));\n // PAT 的 basePoint 可能离图形很远;沿线方向平移不改变无限直线,只用于让有限候选线覆盖当前边界。\n const lineCenter = lineAnchor.clone().add(dir.clone().multiplyScalar(boundsCenter.clone().sub(lineAnchor).dot(dir)));\n const a = lineCenter.clone().add(dir.clone().multiplyScalar(-diagonal * 2));\n const b = lineCenter.clone().add(dir.clone().multiplyScalar(diagonal * 2));\n const clipped = this.clipLineByPolygon(a, b, outer);\n\n clipped.forEach(([start, end]) => {\n this.subtractHoles(start, end, holes).forEach(([visibleStart, visibleEnd]) => {\n this.appendDashedSegment(result, visibleStart, visibleEnd, patternLine.dashLengths, lineAnchor, dir);\n });\n });\n }\n return result.slice(0, segmentBudget);\n }\n\n /** 使用后端展开后的 PAT 线族定义;patternLines 已经包含最终角度和偏移。 */\n private resolvePatternLineTransform(entity: HatchEntity, patternLine: HatchPatternLine): { dir: THREE.Vector2; base: THREE.Vector2; offset: THREE.Vector2 } {\n const angle = Number(patternLine.angle ?? entity.patternAngle ?? 0);\n const dir = new THREE.Vector2(Math.cos(angle), Math.sin(angle)).normalize();\n\n return {\n dir,\n base: this.toVector2(patternLine.basePoint),\n offset: this.toVector2(patternLine.offset),\n };\n }\n\n private toVector2(point?: Vec2Tuple): THREE.Vector2 {\n return new THREE.Vector2(point?.[0] ?? 0, point?.[1] ?? 0);\n }\n\n private getBounds(points: Vec2Tuple[]): { minX: number; minY: number; maxX: number; maxY: number } {\n return {\n minX: Math.min(...points.map((point) => point[0])),\n minY: Math.min(...points.map((point) => point[1])),\n maxX: Math.max(...points.map((point) => point[0])),\n maxY: Math.max(...points.map((point) => point[1])),\n };\n }\n\n /** 线段与多边形裁剪采用“交点参数排序 + 中点内外判断”,适合 HATCH 边界。 */\n private clipLineByPolygon(a: THREE.Vector2, b: THREE.Vector2, polygon: Vec2Tuple[]): Array<[THREE.Vector2, THREE.Vector2]> {\n const tValues = [0, 1];\n for (let i = 0; i < polygon.length; i += 1) {\n const p0 = new THREE.Vector2(polygon[i][0], polygon[i][1]);\n const p1 = new THREE.Vector2(polygon[(i + 1) % polygon.length][0], polygon[(i + 1) % polygon.length][1]);\n const t = this.segmentIntersectionT(a, b, p0, p1);\n if (t !== null && t > EPSILON && t < 1 - EPSILON) tValues.push(t);\n }\n\n const unique = this.dedupeSorted(tValues.sort((x, y) => x - y), 1e-7);\n const result: Array<[THREE.Vector2, THREE.Vector2]> = [];\n for (let i = 0; i < unique.length - 1; i += 1) {\n const t0 = unique[i];\n const t1 = unique[i + 1];\n if (t1 - t0 < 1e-7) continue;\n const mid = this.interpolate2(a, b, (t0 + t1) / 2);\n if (this.pointInPolygon(mid, polygon)) result.push([this.interpolate2(a, b, t0), this.interpolate2(a, b, t1)]);\n }\n return result;\n }\n\n private subtractHoles(a: THREE.Vector2, b: THREE.Vector2, holes: Vec2Tuple[][]): Array<[THREE.Vector2, THREE.Vector2]> {\n let segments: Array<[THREE.Vector2, THREE.Vector2]> = [[a, b]];\n holes.forEach((hole) => {\n const next: Array<[THREE.Vector2, THREE.Vector2]> = [];\n segments.forEach(([start, end]) => {\n const holePieces = this.clipLineByPolygon(start, end, hole);\n next.push(...this.subtractSegments(start, end, holePieces));\n });\n segments = next;\n });\n return segments;\n }\n\n private appendDashedSegment(\n result: Array<[THREE.Vector2, THREE.Vector2]>,\n a: THREE.Vector2,\n b: THREE.Vector2,\n dashLengths?: number[],\n lineAnchor?: THREE.Vector2,\n lineDirection?: THREE.Vector2,\n ): void {\n const length = a.distanceTo(b);\n if (length < EPSILON) return;\n if (!dashLengths?.length) {\n result.push([a, b]);\n return;\n }\n\n const pattern = this.normalizeDashPattern(dashLengths);\n const period = pattern.reduce((sum, item) => sum + item.length, 0);\n if (period < EPSILON) {\n result.push([a, b]);\n return;\n }\n\n // PAT 虚线相位必须相对线族锚点计算;从裁剪边界重新起算会把 CROSS 误画成普通虚线网格。\n const dir = lineDirection?.clone().normalize() ?? b.clone().sub(a).normalize();\n const anchor = lineAnchor ?? a;\n const segmentDirection = b.clone().sub(a).normalize();\n const sign = segmentDirection.dot(dir) >= 0 ? 1 : -1;\n const startPhaseDistance = a.clone().sub(anchor).dot(dir) * sign;\n const startOffsetInPeriod = this.positiveModulo(startPhaseDistance, period);\n let cursor = 0;\n let patternIndex = this.findDashIndex(pattern, startOffsetInPeriod);\n let distanceInCurrentDash = startOffsetInPeriod - pattern[patternIndex].start;\n\n while (cursor < length - EPSILON) {\n const dash = pattern[patternIndex];\n const remainingDash = Math.max(dash.length - distanceInCurrentDash, EPSILON);\n const next = Math.min(length, cursor + remainingDash);\n if (dash.draw) {\n result.push([this.pointAtLength(a, b, cursor), this.pointAtLength(a, b, next)]);\n }\n cursor = next;\n patternIndex = (patternIndex + 1) % pattern.length;\n distanceInCurrentDash = 0;\n }\n }\n\n /** 将 PAT dash 数组转为带累计起点的周期表,0 长点线用很短的可见段表示。 */\n private normalizeDashPattern(dashLengths: number[]): Array<{ length: number; draw: boolean; start: number }> {\n let cursor = 0;\n return dashLengths.map((value) => {\n const rawDash = Number(value ?? 0);\n const item = {\n length: Math.max(Math.abs(rawDash), 0.0005),\n draw: rawDash >= 0,\n start: cursor,\n };\n cursor += item.length;\n return item;\n }).filter((item) => item.length > EPSILON);\n }\n\n private findDashIndex(pattern: Array<{ length: number; draw: boolean; start: number }>, offset: number): number {\n for (let index = pattern.length - 1; index >= 0; index -= 1) {\n if (offset >= pattern[index].start - EPSILON) return index;\n }\n return 0;\n }\n\n private positiveModulo(value: number, period: number): number {\n return ((value % period) + period) % period;\n }\n\n private subtractSegments(a: THREE.Vector2, b: THREE.Vector2, holes: Array<[THREE.Vector2, THREE.Vector2]>): Array<[THREE.Vector2, THREE.Vector2]> {\n const intervals = holes\n .map(([start, end]) => [this.projectT(a, b, start), this.projectT(a, b, end)] as [number, number])\n .map(([start, end]) => [Math.max(0, Math.min(start, end)), Math.min(1, Math.max(start, end))] as [number, number])\n .sort((x, y) => x[0] - y[0]);\n const result: Array<[THREE.Vector2, THREE.Vector2]> = [];\n let cursor = 0;\n\n intervals.forEach(([start, end]) => {\n if (start > cursor + EPSILON) result.push([this.interpolate2(a, b, cursor), this.interpolate2(a, b, start)]);\n cursor = Math.max(cursor, end);\n });\n if (cursor < 1 - EPSILON) result.push([this.interpolate2(a, b, cursor), this.interpolate2(a, b, 1)]);\n return result;\n }\n\n private segmentIntersectionT(a: THREE.Vector2, b: THREE.Vector2, c: THREE.Vector2, d: THREE.Vector2): number | null {\n const r = b.clone().sub(a);\n const s = d.clone().sub(c);\n const denominator = this.cross2(r, s);\n if (Math.abs(denominator) < 1e-10) return null;\n\n const cma = c.clone().sub(a);\n const t = this.cross2(cma, s) / denominator;\n const u = this.cross2(cma, r) / denominator;\n return t >= -1e-8 && t <= 1 + 1e-8 && u >= -1e-8 && u <= 1 + 1e-8 ? t : null;\n }\n\n private pointInPolygon(point: THREE.Vector2, polygon: Vec2Tuple[]): boolean {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i, i += 1) {\n const xi = polygon[i][0];\n const yi = polygon[i][1];\n const xj = polygon[j][0];\n const yj = polygon[j][1];\n const intersects = yi > point.y !== yj > point.y\n && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi + 1e-20) + xi;\n if (intersects) inside = !inside;\n }\n return inside;\n }\n\n private cross2(a: THREE.Vector2, b: THREE.Vector2): number {\n return a.x * b.y - a.y * b.x;\n }\n\n private interpolate2(a: THREE.Vector2, b: THREE.Vector2, t: number): THREE.Vector2 {\n return a.clone().lerp(b, t);\n }\n\n private projectT(a: THREE.Vector2, b: THREE.Vector2, point: THREE.Vector2): number {\n const ab = b.clone().sub(a);\n const denominator = ab.lengthSq();\n if (denominator < 1e-12) return 0;\n return point.clone().sub(a).dot(ab) / denominator;\n }\n\n private pointAtLength(a: THREE.Vector2, b: THREE.Vector2, distance: number): THREE.Vector2 {\n const length = a.distanceTo(b);\n return this.interpolate2(a, b, length < 1e-12 ? 0 : distance / length);\n }\n\n private dedupeSorted(values: number[], epsilon: number): number[] {\n const result: number[] = [];\n values.forEach((value) => {\n if (!result.length || Math.abs(value - result[result.length - 1]) > epsilon) result.push(value);\n });\n return result;\n }\n}\n","import * as THREE from 'three';\r\nimport { NURBSCurve } from 'three/examples/jsm/curves/NURBSCurve.js';\r\nimport { RenderItem2d } from './types';\r\nimport { getGeometryBounds, toVector3 } from './geometryUtils';\r\nimport { TextGeometryFactory } from './TextGeometryFactory';\r\nimport { HatchPatternRenderer } from './HatchPatternRenderer';\r\n\r\n/** 图元几何工厂,负责把 block 内实体转换为渲染中间态。 */\r\nexport class EntityGeometryFactory {\r\n private readonly hatchRenderer: HatchPatternRenderer;\r\n\r\n constructor(\r\n private readonly engine: any,\r\n private readonly textFactory: TextGeometryFactory,\r\n ) {\r\n this.hatchRenderer = new HatchPatternRenderer(engine);\r\n }\r\n\r\n /** 根据实体类型分发到线、文字、填充、图片等具体几何生成逻辑。 */\r\n public create(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n switch (entity.type) {\r\n case 'LINE_GROUP':\r\n case 'LINE':\r\n case 'CIRCLE':\r\n case 'POLYLINE':\r\n case 'SPLINE':\r\n return this.createLineItem(entity, baseMatrix);\r\n case 'MTEXT':\r\n case 'TEXT':\r\n return this.textFactory.create(entity, baseMatrix);\r\n case 'HATCH':\r\n return this.createHatch(entity, baseMatrix);\r\n case 'IMAGE':\r\n return this.createImage(entity, baseMatrix);\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n /** 线类实体统一输出为 LineSegments 所需的点对列表。 */\r\n private createLineItem(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n const points = this.getEntityPoints(entity).map((point) => point.clone().applyMatrix4(baseMatrix));\r\n if (points.length === 0) return [];\r\n return [{\r\n kind: 'line',\r\n layer: entity.layer,\r\n color: entity.color,\r\n lineType: entity.lineType,\r\n lineTypeScale: entity.lineTypeScale,\r\n lineTypePattern: Array.isArray(entity.lineTypePattern) ? entity.lineTypePattern : undefined,\r\n linkId: entity.linkId ?? entity.id,\r\n points,\r\n info: entity,\r\n }];\r\n }\r\n\r\n /** 将各种线类实体转换为未变换的本地坐标点对。 */\r\n private getEntityPoints(entity: any): THREE.Vector3[] {\r\n switch (entity.type) {\r\n case 'LINE_GROUP': \r\n return this.getLineGroupPoints(entity);\r\n case 'LINE': \r\n return [toVector3(entity.startPoint), toVector3(entity.endPoint)];\r\n case 'CIRCLE': \r\n return this.getCirclePoints(entity);\r\n case 'POLYLINE': \r\n return this.getPolylinePoints(entity);\r\n case 'SPLINE': \r\n return this.getSplinePoints(entity);\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n /** 新格式会把同层同色线段预合并成 LINE_GROUP,这里直接展开为点对。 */\r\n private getLineGroupPoints(entity: any): THREE.Vector3[] {\r\n const points: THREE.Vector3[] = [];\r\n (entity.segments ?? []).forEach((segment: number[]) => {\r\n points.push(new THREE.Vector3(segment[0] ?? 0, segment[1] ?? 0, segment[2] ?? 0));\r\n points.push(new THREE.Vector3(segment[3] ?? 0, segment[4] ?? 0, segment[5] ?? 0));\r\n });\r\n return points;\r\n }\r\n\r\n /** 将圆或圆弧离散成 LineSegments 点对。 */\r\n private getCirclePoints(entity: any): THREE.Vector3[] {\r\n const curve = new THREE.EllipseCurve(\r\n entity.center?.[0] ?? 0,\r\n entity.center?.[1] ?? 0,\r\n entity.radius ?? 0,\r\n entity.radius ?? 0,\r\n entity.startAngle ?? 0,\r\n (entity.endAngle ?? Math.PI * 2) - 0.00001,\r\n false,\r\n 0,\r\n );\r\n return this.pointsToSegments(curve.getPoints(this.engine.options?.circleSegments ?? 48).map((point) => new THREE.Vector3(point.x, point.y, entity.center?.[2] ?? 0)));\r\n }\r\n\r\n /** 多段线逐段展开,支持每段起点上的 bulge 圆弧参数。 */\r\n private getPolylinePoints(entity: any): THREE.Vector3[] {\r\n const points: THREE.Vector3[] = [];\r\n const rawPoints = entity.points ?? [];\r\n for (let i = 0; i < rawPoints.length - 1; i += 1) {\r\n this.getPolylineSegmentPoints(rawPoints[i], rawPoints[i + 1]).forEach((point) => {\r\n points.push(point);\r\n });\r\n }\r\n if (entity.closed && rawPoints.length > 1) {\r\n this.getPolylineSegmentPoints(rawPoints[rawPoints.length - 1], rawPoints[0]).forEach((point) => {\r\n points.push(point);\r\n });\r\n }\r\n return points;\r\n }\r\n\r\n /** 根据 bulge = tan(圆心角 / 4) 将单段多段线转换为直线或圆弧采样点对。 */\r\n private getPolylineSegmentPoints(startPoint: any, endPoint: any): THREE.Vector3[] {\r\n const start = toVector3(startPoint);\r\n const end = toVector3(endPoint);\r\n const bulge = Number(startPoint?.bulge ?? 0);\r\n if (!Number.isFinite(bulge) || Math.abs(bulge) < 1e-10) return [start, end];\r\n\r\n const chord = end.clone().sub(start);\r\n const chordLength = chord.length();\r\n if (chordLength < 1e-12) return [start, end];\r\n\r\n // bulge 的符号决定圆弧位于弦线左侧还是右侧。\r\n const includedAngle = 4 * Math.atan(bulge);\r\n const radius = chordLength * (1 + bulge * bulge) / (4 * Math.abs(bulge));\r\n const mid = start.clone().add(end).multiplyScalar(0.5);\r\n const normal = new THREE.Vector3(-chord.y / chordLength, chord.x / chordLength, 0);\r\n const center = mid.clone().add(normal.multiplyScalar(chordLength * (1 - bulge * bulge) / (4 * bulge)));\r\n const startAngle = Math.atan2(start.y - center.y, start.x - center.x);\r\n const segmentCount = Math.max(4, Math.ceil(Math.abs(includedAngle) / (this.engine.options?.polylineArcAngleStep ?? (Math.PI / 18))));\r\n const arcPoints: THREE.Vector3[] = [];\r\n for (let i = 0; i <= segmentCount; i += 1) {\r\n const t = i / segmentCount;\r\n const angle = startAngle + includedAngle * t;\r\n arcPoints.push(new THREE.Vector3(center.x + Math.cos(angle) * radius, center.y + Math.sin(angle) * radius, start.z + (end.z - start.z) * t));\r\n }\r\n return this.pointsToSegments(arcPoints);\r\n }\r\n\r\n /** 样条线使用控制点生成平滑曲线,不强制穿过每一个控制点。 */\r\n private getSplinePoints(entity: any): THREE.Vector3[] {\r\n const controlPoints = (entity.points ?? []).map((point: any) => toVector3(point));\r\n if (controlPoints.length < 2) return [];\r\n const sampled = controlPoints.length === 2 ? controlPoints : this.sampleSplineCurve(controlPoints, entity);\r\n return this.pointsToSegments(sampled);\r\n }\r\n\r\n /** 用 clamped B-spline/NURBS 采样样条;有 knots/weights 时优先使用源数据。 */\r\n private sampleSplineCurve(controlPoints: THREE.Vector3[], spline: any): THREE.Vector3[] {\r\n \r\n const degree = Math.min(Math.max(Number(spline.degree ?? this.engine.options?.splineDegree ?? 6), 1), controlPoints.length - 1);\r\n const knots = Array.isArray(spline.knots) && spline.knots.length === controlPoints.length + degree + 1\r\n ? spline.knots\r\n : this.createClampedUniformKnots(controlPoints.length, degree);\r\n const points = controlPoints.map((point, index) => {\r\n const weight = Array.isArray(spline.weights) ? Number(spline.weights[index] ?? 1) : 1;\r\n return new THREE.Vector4(point.x, point.y, point.z, Number.isFinite(weight) ? weight : 1);\r\n });\r\n // 样条线固定使用较稀疏的采样,避免大图纸中曲线细分过密导致点数和内存快速膨胀。\r\n // const spanCount = Math.max(controlPoints.length - 1, 1);\r\n // const segments = Math.round(THREE.MathUtils.clamp(spanCount * 8, 8, 8));\r\n\r\n // 这个地方,会导致崩溃\r\n let segments = (controlPoints.length - 1) * 2;\r\n\r\n // if(segments>100){\r\n // segments = 100\r\n // }\r\n\r\n\r\n const sampled = new NURBSCurve(degree, knots, points).getPoints(segments);\r\n if (spline.closed === true && sampled.length > 1) sampled.push(sampled[0].clone());\r\n return sampled;\r\n }\r\n\r\n /** 在缺少 knots 的数据里生成首尾夹紧的均匀节点向量。 */\r\n private createClampedUniformKnots(controlPointCount: number, degree: number): number[] {\r\n const knots: number[] = [];\r\n for (let i = 0; i < controlPointCount + degree + 1; i += 1) {\r\n if (i <= degree) knots.push(0);\r\n else if (i >= controlPointCount) knots.push(1);\r\n else knots.push((i - degree) / (controlPointCount - degree));\r\n }\r\n return knots;\r\n }\r\n\r\n /** 将连续采样点转换为 LineSegments 需要的 [p0,p1,p1,p2...] 点对。 */\r\n private pointsToSegments(points: THREE.Vector3[]): THREE.Vector3[] {\r\n const segments: THREE.Vector3[] = [];\r\n for (let i = 0; i < points.length - 1; i += 1) {\r\n segments.push(points[i].clone(), points[i + 1].clone());\r\n }\r\n return segments;\r\n }\r\n\r\n /** HATCH 交给独立渲染器处理,兼容实心填充和 PAT 图案线。 */\r\n private createHatch(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n return this.hatchRenderer.create(entity, baseMatrix);\r\n }\r\n\r\n /** 将 IMAGE 实体转为带 UV 的四边形,纹理由 SceneBatchBuilder 延迟加载。 */\r\n private createImage(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n const imageUrl = entity.imageUrl || entity.url;\r\n if (!imageUrl) return [];\r\n\r\n const origin = toVector3(entity.position);\r\n const uVector = toVector3(entity.uVector);\r\n const vVector = toVector3(entity.vVector);\r\n const uScale = Number(entity.pixelWidth ?? entity.width ?? 1);\r\n const vScale = Number(entity.pixelHeight ?? entity.height ?? 1);\r\n if (!Number.isFinite(uScale) || !Number.isFinite(vScale) || uScale === 0 || vScale === 0) return [];\r\n\r\n // CAD 导出的 u/vVector 表示单个像素的世界方向,乘以像素尺寸得到图片四角。\r\n const right = uVector.multiplyScalar(uScale);\r\n const up = vVector.multiplyScalar(vScale);\r\n const p0 = origin.clone();\r\n const p1 = origin.clone().add(right);\r\n const p2 = origin.clone().add(right).add(up);\r\n const p3 = origin.clone().add(up);\r\n [p0, p1, p2, p3].forEach((point) => point.applyMatrix4(baseMatrix));\r\n\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute([\r\n p0.x, p0.y, p0.z,\r\n p1.x, p1.y, p1.z,\r\n p2.x, p2.y, p2.z,\r\n p0.x, p0.y, p0.z,\r\n p2.x, p2.y, p2.z,\r\n p3.x, p3.y, p3.z,\r\n ], 3));\r\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute([\r\n 0, 0,\r\n 1, 0,\r\n 1, 1,\r\n 0, 0,\r\n 1, 1,\r\n 0, 1,\r\n ], 2));\r\n geometry.computeVertexNormals();\r\n\r\n const bounds = getGeometryBounds(geometry);\r\n const fade = Number(entity.fade ?? 0);\r\n return [{\r\n kind: 'image',\r\n layer: entity.layer ?? '0',\r\n color: entity.color ?? 0xffffff,\r\n linkId: entity.linkId ?? entity.id,\r\n geometry,\r\n imageUrl,\r\n opacity: Number.isFinite(fade) ? THREE.MathUtils.clamp(1 - fade / 100, 0, 1) : 1,\r\n min: bounds.min,\r\n max: bounds.max,\r\n info: entity,\r\n }];\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\nimport { LoaderModel2d, RenderItem2d } from './types';\r\nimport { getPointsBounds } from './geometryUtils';\r\n\r\n/** 将 RenderItem 按图层和颜色合批成 Three 对象,并维护选择索引。 */\r\nexport class SceneBatchBuilder {\r\n private readonly modelMap = new Map<string, Map<any, THREE.Vector3[]>>();\r\n private readonly hatchMap = new Map<string, RenderItem2d[]>();\r\n private readonly textMap = new Map<string, RenderItem2d[]>();\r\n private readonly imageMap = new Map<string, RenderItem2d[]>();\r\n private readonly textureLoader = new THREE.TextureLoader();\r\n\r\n constructor(\r\n _engine: any,\r\n private readonly model: LoaderModel2d,\r\n private readonly targetGroup: THREE.Group = _engine.modelGroup,\r\n ) {}\r\n\r\n /** 将展开后的渲染项放入当前 tile 的 line/text/hatch/image 合批容器。 */\r\n public addRenderItems(items: RenderItem2d[]): void {\r\n items.forEach((item) => this.addRenderItem(item));\r\n }\r\n\r\n /** 按类别创建最终 Three.js 对象,并加入当前 octree group。 */\r\n public buildSceneObjects(): void {\r\n this.buildImageObjects();\r\n this.buildHatchObjects();\r\n this.buildLineObjects();\r\n this.buildTextObjects();\r\n }\r\n\r\n /** 按 kind 分流,合批 key 使用 layer||color;图片额外按 URL 分组以复用纹理。 */\n public addRenderItem(item: RenderItem2d): void {\n const layerName = `${item.layer}||${item.color}`;\r\n if (item.kind === 'line') {\r\n let modelMap = this.modelMap.get(layerName);\r\n if (!modelMap) {\r\n modelMap = new Map<any, THREE.Vector3[]>();\r\n this.modelMap.set(layerName, modelMap);\r\n }\r\n const points = this.resolveLinePoints(item);\r\n const nodePoints = modelMap.get(item.linkId);\r\n if (nodePoints) points.forEach((point) => nodePoints.push(point));\r\n else modelMap.set(item.linkId, [...points]);\r\n return;\r\n }\r\n\r\n const map = this.getItemMap(item);\r\n const key = item.kind === 'image' ? `${layerName}||${item.imageUrl ?? ''}` : layerName;\r\n const list = map.get(key);\r\n if (list) list.push(item);\r\n else map.set(key, [item]);\r\n }\r\n\r\n private getItemMap(item: RenderItem2d): Map<string, RenderItem2d[]> {\r\n if (item.kind === 'text') return this.textMap;\r\n if (item.kind === 'image') return this.imageMap;\r\n return this.hatchMap;\r\n }\r\n\r\n /** 根据实体或图层线型把原始线段切成可见段,线宽仍沿用当前 LineBasicMaterial。 */\r\n private resolveLinePoints(item: RenderItem2d): THREE.Vector3[] {\r\n const points = item.points ?? [];\r\n const pattern = this.resolveLineTypePattern(item);\r\n if (!pattern) return points;\r\n\r\n const dashedPoints: THREE.Vector3[] = [];\r\n for (let index = 0; index < points.length - 1; index += 2) {\r\n this.applyDashPattern(points[index], points[index + 1], pattern).forEach((point) => dashedPoints.push(point));\r\n }\r\n return dashedPoints;\r\n }\r\n\r\n /** 正数表示画线、负数表示留白;ByLayer 会使用当前图层定义,Continuous 保持实线。 */\r\n private resolveLineTypePattern(item: RenderItem2d): number[] | null {\r\n const layer = this.model.layers.find((layerItem: any) => layerItem.name === item.layer);\r\n const itemLineType = String(item.lineType ?? '').toLowerCase();\r\n const lineType = itemLineType === 'bylayer' || itemLineType === ''\r\n ? String(layer?.lineType ?? '').toLowerCase()\r\n : itemLineType;\r\n if (!lineType || lineType === 'continuous' || lineType === 'byblock') return null;\r\n\r\n const rawPattern: number[] | null = Array.isArray(item.lineTypePattern) && item.lineTypePattern.length > 0\r\n ? item.lineTypePattern\r\n : (Array.isArray(layer?.lineTypePattern) ? layer.lineTypePattern : this.getFallbackLineTypePattern(lineType));\r\n if (!rawPattern || rawPattern.length === 0) return null;\r\n\r\n const scale = this.resolveLineTypeScale(item, layer);\r\n const pattern = rawPattern\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value))\r\n .map((value) => value * scale);\r\n return pattern.some((value) => Math.abs(value) > 1e-12) ? pattern : null;\r\n }\r\n\r\n /** 兼容原始数据未带 pattern、但 lineType 已标识为 DASH/DASHED 的情况。 */\r\n private getFallbackLineTypePattern(lineType: string): number[] | null {\r\n if (lineType.includes('dash')) return [0.25, -0.1];\r\n if (lineType.includes('dot')) return [0, -0.1];\r\n return null;\r\n }\r\n\r\n private resolveLineTypeScale(item: RenderItem2d, layer: any): number {\r\n const rawScale = Number(item.lineTypeScale ?? layer?.lineTypeScale ?? 1);\r\n if (!Number.isFinite(rawScale) || Math.abs(rawScale) < 1e-12) return 1;\r\n return Math.abs(rawScale);\r\n }\r\n\r\n /** 将单条线段按线型 pattern 裁成多段可见线,pattern 每条源线段独立起算。 */\r\n private applyDashPattern(start: THREE.Vector3, end: THREE.Vector3, pattern: number[]): THREE.Vector3[] {\r\n const direction = end.clone().sub(start);\r\n const length = direction.length();\r\n if (length < 1e-12) return [];\r\n\r\n const unit = direction.multiplyScalar(1 / length);\r\n const totalPatternLength = pattern.reduce((sum, value) => sum + Math.abs(value), 0);\r\n const dotLength = Math.max(totalPatternLength * 0.05, length * 0.002, 1e-6);\r\n const result: THREE.Vector3[] = [];\r\n let cursor = 0;\r\n let patternIndex = 0;\r\n\r\n while (cursor < length - 1e-12) {\r\n const sourceLength = pattern[patternIndex % pattern.length];\r\n const isDraw = sourceLength >= 0;\r\n const dashLength = Math.max(Math.abs(sourceLength), dotLength);\r\n const nextCursor = Math.min(cursor + dashLength, length);\r\n\r\n if (isDraw && nextCursor > cursor) {\r\n result.push(\r\n start.clone().add(unit.clone().multiplyScalar(cursor)),\r\n start.clone().add(unit.clone().multiplyScalar(nextCursor)),\r\n );\r\n }\r\n\r\n cursor = nextCursor;\r\n patternIndex += 1;\r\n if (patternIndex > 100000) break;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** 合并所有线段为 LineSegments,并记录每个 linkId 对应的顶点范围。 */\r\n private buildLineObjects(): void {\r\n this.modelMap.forEach((item, key) => {\r\n const [layerName] = key.split('||');\r\n const points: THREE.Vector3[] = [];\r\n item.forEach((nodePoints) => {\r\n nodePoints.forEach((point) => points.push(point));\r\n });\r\n if (points.length === 0) return;\r\n\r\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n const material = new THREE.LineBasicMaterial({ color: this.resolveColor(key) });\n const lines: any = new THREE.LineSegments(geometry, material);\n lines.name = key;\n // 线段隐藏/恢复需要原始坐标;使用 TypedArray 副本,避免 JS number 数组带来的额外内存膨胀。\n const position = geometry.getAttribute('position');\n lines.clonePoints = position.array.slice();\n lines.materialClone = material.clone();\n\r\n this.targetGroup.add(lines);\r\n const objectIndex = this.targetGroup.children.length - 1;\r\n let index = 0;\r\n item.forEach((nodePoints, linkId) => {\r\n const bounds = getPointsBounds(nodePoints);\r\n this.pushNodeMap(linkId, {\r\n indexes: [objectIndex, index, index + nodePoints.length * 3],\r\n object: lines,\r\n group: this.targetGroup,\r\n kind: 'line',\r\n layer: layerName,\r\n min: bounds.min,\r\n max: bounds.max,\r\n });\r\n index += nodePoints.length * 3;\r\n });\r\n });\r\n }\r\n\r\n /** 合并文字几何和 hitbox;hitbox 材质不可见但仍保留选择索引。 */\r\n private buildTextObjects(): void {\r\n this.textMap.forEach((items, key) => {\r\n const renderItems = items.filter((item) => !!item.geometry);\n const geometries = this.normalizeMeshGeometries(renderItems, false, false);\n if (geometries.length === 0) return;\n const geometry = this.mergeMeshGeometries(geometries);\n const material = new THREE.MeshBasicMaterial({ color: this.resolveColor(key), side: THREE.DoubleSide });\n if (key.includes('_hitbox')) material.visible = false;\n this.addMeshObject(renderItems, key, geometry, geometries, material);\n });\r\n }\r\n\r\n /** 合并填充面,默认使用半透明材质以接近原有显示效果。 */\r\n private buildHatchObjects(): void {\r\n this.hatchMap.forEach((items, key) => {\r\n const renderItems = items.filter((item) => !!item.geometry);\r\n const useVertexColors = renderItems.some((item) => item.useVertexColors === true);\n const geometries = this.normalizeMeshGeometries(renderItems, false, useVertexColors);\n if (geometries.length === 0) return;\n const geometry = this.mergeMeshGeometries(geometries);\n const material = new THREE.MeshBasicMaterial({\n color: useVertexColors ? 0xffffff : this.resolveColor(key),\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: useVertexColors ? 1 : 0.5,\r\n vertexColors: useVertexColors,\r\n });\r\n this.addMeshObject(renderItems, key, geometry, geometries, material);\r\n });\r\n }\r\n\r\n /** 图片按 URL 合并为纹理网格,透明 PNG 直接由材质 alpha 处理。 */\r\n private buildImageObjects(): void {\r\n this.imageMap.forEach((items, key) => {\r\n const renderItems = items.filter((item) => !!item.geometry);\r\n const geometries = this.normalizeMeshGeometries(renderItems, true, false);\r\n if (geometries.length === 0) return;\r\n const imageUrl = renderItems[0]?.imageUrl;\r\n if (!imageUrl) return;\n\n const geometry = this.mergeMeshGeometries(geometries);\n const texture = this.textureLoader.load(imageUrl);\n texture.colorSpace = THREE.SRGBColorSpace;\r\n texture.needsUpdate = true;\r\n const opacity = renderItems.reduce((value, item) => Math.min(value, item.opacity ?? 1), 1);\r\n const material = new THREE.MeshBasicMaterial({\r\n map: texture,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity,\r\n depthWrite: false,\r\n });\r\n this.addMeshObject(renderItems, key, geometry, geometries, material);\n });\n }\n\n /** 合并后保留每个子几何的 group 范围,后续高亮/拾取可按范围临时提取,不再常驻 geometrys 副本。 */\n private mergeMeshGeometries(geometries: THREE.BufferGeometry[]): THREE.BufferGeometry {\n const geometry = geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, true);\n if (geometry.groups.length === 0) {\n const position = geometry.getAttribute('position');\n geometry.addGroup(0, position?.count ?? 0, 0);\n }\n geometry.groups.forEach((group) => {\n group.materialIndex = 0;\n });\n return geometry;\n }\n\r\n /** 统一合批几何属性,避免裁剪后 normal/index/uv 差异导致 mergeGeometries 失败。 */\r\n private normalizeMeshGeometries(items: RenderItem2d[], keepUv: boolean, keepColor: boolean): THREE.BufferGeometry[] {\r\n return items.map((item) => {\r\n const source = item.geometry!;\r\n const geometry = source.index ? source.toNonIndexed() : source.clone();\r\n const position = geometry.getAttribute('position');\r\n const uv = geometry.getAttribute('uv');\r\n const color = geometry.getAttribute('color');\r\n const normalized = new THREE.BufferGeometry();\r\n normalized.setAttribute('position', position.clone());\r\n if (keepUv) {\r\n normalized.setAttribute('uv', uv ? uv.clone() : this.createEmptyUv(position.count));\r\n }\r\n if (keepColor) {\r\n normalized.setAttribute('color', color ? color.clone() : this.createSolidColorAttribute(position.count, item.color));\r\n }\r\n return normalized;\r\n });\r\n }\r\n\r\n /** 图片几何必须带 UV;缺失时补零,保证纹理合批属性一致。 */\r\n private createEmptyUv(vertexCount: number): THREE.BufferAttribute {\r\n return new THREE.Float32BufferAttribute(new Array(vertexCount * 2).fill(0), 2);\r\n }\r\n\r\n /** 渐变填充与普通填充合批时,普通填充需要补齐统一颜色的顶点色。 */\r\n private createSolidColorAttribute(vertexCount: number, colorValue: number): THREE.BufferAttribute {\r\n const color = new THREE.Color(colorValue ?? 0xffffff);\r\n const values: number[] = [];\r\n for (let i = 0; i < vertexCount; i += 1) {\r\n values.push(color.r, color.g, color.b);\r\n }\r\n return new THREE.Float32BufferAttribute(values, 3);\r\n }\r\n\r\n /** 建立 Mesh 并把每个子几何写入 nodeMap,供选择、高亮、隐藏使用。 */\r\n private addMeshObject(\r\n items: RenderItem2d[],\r\n key: string,\r\n geometry: THREE.BufferGeometry,\r\n geometries: THREE.BufferGeometry[],\r\n material: THREE.MeshBasicMaterial,\r\n ): void {\r\n const mesh: any = new THREE.Mesh(geometry, material);\r\n mesh.name = key;\n mesh.materialClone = material.clone();\n mesh.isSplit = false;\n mesh.geometrys = undefined;\n geometries.forEach((item) => {\n if (item !== geometry) item.dispose();\n });\n\n this.targetGroup.add(mesh);\n const objectIndex = this.targetGroup.children.length - 1;\r\n items.forEach((item, index) => {\r\n const linkId = item.linkId ?? item.info?.id;\r\n this.pushNodeMap(linkId, {\r\n indexes: [objectIndex, index],\r\n object: mesh,\r\n group: this.targetGroup,\r\n kind: item.kind,\r\n layer: item.layer,\r\n info: item.info,\r\n min: item.min ?? new THREE.Vector3(),\r\n max: item.max ?? new THREE.Vector3(),\r\n });\r\n this.pushTextSearchItem(item, key);\r\n });\r\n }\r\n\r\n /** 文字搜索只收录真实文字几何,hitbox 仅用于选择,不进入搜索结果。 */\r\n private pushTextSearchItem(item: RenderItem2d, key: string): void {\r\n if (item.kind !== 'text' || key.includes('_hitbox')) return;\r\n const rawText = item.info?.text;\r\n const text = String(rawText ?? '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').trim();\r\n const id = item.linkId ?? item.info?.id;\r\n if (!text || id == null) return;\r\n\r\n this.model.textItems.push({\r\n id: String(id),\r\n text,\r\n layer: item.layer,\r\n min: item.min,\r\n max: item.max,\r\n anchor: item.textAnchor,\r\n info: item.info,\r\n });\r\n }\r\n\r\n /** color=0 或非法颜色时回退到图层颜色。 */\r\n private resolveColor(key: string): number {\r\n const [layerName, colorText] = key.split('||');\r\n let color = Number.parseInt(colorText);\r\n if (color === 0 || Number.isNaN(color)) {\r\n const layer = this.model.layers.find((item: any) => item.name === layerName);\r\n color = layer?.color ?? 0xffffff;\r\n }\r\n return color;\r\n }\r\n\r\n /** 维护 linkId -> 场景对象索引,供选择、高亮和属性查询使用。 */\r\n private pushNodeMap(linkId: any, value: any): void {\r\n if (linkId == null) return;\r\n const key = String(linkId);\r\n const list = this.model.nodeMap.get(key);\r\n if (list) list.push(value);\r\n else this.model.nodeMap.set(key, [value]);\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\nimport { Font } from 'three/examples/jsm/loaders/FontLoader.js';\r\nimport { RenderItem2d } from './types';\r\nimport { composeMatrix, getGeometryBounds } from './geometryUtils';\r\n\r\n/** 文字几何工厂,集中处理 MTEXT/TEXT 的换行、缺字过滤、hitbox 和锚点。 */\r\nexport class TextGeometryFactory {\r\n constructor(\r\n private readonly engine: any,\r\n private readonly font: Font,\r\n ) {}\r\n\r\n /** 将单个文字实体转换为可合批的文字 mesh 和不可见选择 hitbox。 */\r\n public create(entity: any, baseMatrix: THREE.Matrix4 = new THREE.Matrix4()): RenderItem2d[] {\r\n if (!entity.text) return [];\r\n const text = this.normalizeText(entity.text);\r\n if (!text.trim()) return [];\r\n\r\n const curveSegments = this.engine.options?.textCurveSegments ?? 1;\r\n const geometry = this.createTextGeometry(text, entity.height ?? 100, curveSegments);\r\n if (!geometry) return [];\r\n\r\n const textPosition = [...(entity.position ?? [0, 0, 0])];\r\n textPosition[1] = textPosition[1] - (entity.height ?? 0);\r\n const widthScale = this.resolveWidthScale(entity);\r\n const textAnchor = new THREE.Vector3(textPosition[0] ?? 0, textPosition[1] ?? 0, textPosition[2] ?? 0).applyMatrix4(baseMatrix);\r\n const scale = 1.4 * entity.scale\r\n \r\n geometry.applyMatrix4(baseMatrix.clone().multiply(composeMatrix(textPosition, [widthScale*1.4, 1*scale, 1*scale], entity.rotation ?? 0)));\r\n const bounds = getGeometryBounds(geometry);\r\n\r\n const items: RenderItem2d[] = [{\r\n kind: 'text',\r\n layer: entity.layer,\r\n color: entity.color,\r\n linkId: entity.linkId ?? entity.id,\r\n geometry,\r\n min: bounds.min,\r\n max: bounds.max,\r\n textAnchor,\r\n info: entity,\r\n }];\r\n\r\n const hitbox = this.createHitbox(geometry);\r\n if (hitbox) {\r\n const hitboxBounds = getGeometryBounds(hitbox);\r\n items.push({\r\n kind: 'text',\r\n layer: entity.layer,\r\n color: `${entity.color}_hitbox` as any,\r\n linkId: entity.linkId ?? entity.id,\r\n geometry: hitbox,\r\n min: hitboxBounds.min,\r\n max: hitboxBounds.max,\r\n textAnchor,\r\n info: entity,\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /** 兼容新导出数据的 widthScale 和旧数据的 widthFactor,仅压缩或拉伸文字本地 X 方向。 */\r\n private resolveWidthScale(entity: any): number {\r\n const widthScale = Number(entity.widthScale ?? entity.widthFactor ?? 1);\r\n if (!Number.isFinite(widthScale) || Math.abs(widthScale) < 1e-12) return 1;\r\n return widthScale;\r\n }\r\n\r\n /** 统一 CAD 文字里的换行格式,避免 FontLoader 把 CR 当字形查找。 */\r\n public normalizeText(text: any): string {\r\n // FontLoader 不支持 CR/LF 字形,先统一换行,生成几何时再逐行处理。\r\n return String(text ?? '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n }\r\n\r\n /** 收集字体转换所需字符时保留可见字符,换行由几何生成阶段处理。 */\r\n public collectTextChars(text: string): string {\r\n return this.normalizeText(text).replace(/\\n/g, ' ');\r\n }\r\n\r\n /** 多行文字逐行生成 ShapeGeometry,再按行距平移后合并。 */\r\n private createTextGeometry(text: string, height: number, curveSegments: number): THREE.BufferGeometry | null {\r\n const lines = text.split('\\n');\r\n const lineHeight = height * (this.engine.options?.textLineHeight ?? 1.35);\r\n const geometries: THREE.BufferGeometry[] = [];\r\n \r\n lines.forEach((line, index) => {\r\n if (!line) return;\r\n const safeLine = this.getRenderableText(line);\r\n if (!safeLine.trim()) return;\r\n const shapes = this.font.generateShapes(safeLine, height);\r\n const geometry = new THREE.ShapeGeometry(shapes, curveSegments);\r\n geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, -index * lineHeight, 0));\r\n geometries.push(geometry);\r\n });\r\n if (geometries.length === 0) return null;\r\n return geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, false);\r\n }\r\n\r\n /** FontLoader 遇到缺字会抛错,渲染前将不可用字符替换为空格。 */\r\n private getRenderableText(text: string): string {\r\n const glyphs = (this.font as any)?.data?.glyphs;\r\n if (!glyphs) return text;\r\n\r\n // 字体不存在的字符会让 FontLoader 抛错;乱码或缺字替换为空格,避免整张图加载中断。\r\n return Array.from(text).map((char) => {\r\n if (char === '\\t') return ' ';\r\n return glyphs[char] ? char : ' ';\r\n }).join('');\r\n }\r\n\r\n /** 根据真实文字包围盒创建不可见平面,供射线选择使用。 */\r\n private createHitbox(geometry: THREE.BufferGeometry): THREE.BufferGeometry | null {\r\n geometry.computeBoundingBox();\r\n const box = geometry.boundingBox;\r\n if (!box) return null;\r\n const width = box.max.x - box.min.x;\r\n const height = box.max.y - box.min.y;\r\n if (width <= 0 || height <= 0) return null;\r\n const hitbox = new THREE.PlaneGeometry(width, height);\r\n hitbox.applyMatrix4(composeMatrix([(box.min.x + box.max.x) / 2, (box.min.y + box.max.y) / 2, 0], [1, 1, 1], 0));\r\n return hitbox;\r\n }\r\n}\r\n","/**\r\n * 2D 数据加载入口。\r\n * 数据读取、图元几何生成、block 展开和场景合批都放在 loader 目录中。\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { Font } from 'three/examples/jsm/loaders/FontLoader.js';\r\nimport { DWGData, DWGEntity } from '../types/dwgTypes';\r\nimport { FontJsonGenerator } from '../../../common/FontJsonGenerator';\r\nimport { LayerManager } from '../managers/layer/index';\r\nimport { EventType2d } from './eventModule2d';\r\nimport { BlockFlattener } from '../loader/BlockFlattener';\r\nimport { CadDataSource } from '../loader/CadDataSource';\r\nimport { EntityGeometryFactory } from '../loader/EntityGeometryFactory';\r\nimport { SceneBatchBuilder } from '../loader/SceneBatchBuilder';\r\nimport { TextGeometryFactory } from '../loader/TextGeometryFactory';\r\nimport { LoadedCadTile2d, LoaderModel2d } from '../loader/types';\r\n\r\nexport class LoaderModule2d {\r\n private engine: any;\r\n private data: DWGData | null = null;\r\n private enableValidation = true;\r\n public model: LoaderModel2d = this.createEmptyModel();\r\n private font: Font | null = null;\r\n private readonly dataSource = new CadDataSource();\r\n\r\n constructor(engine: any) {\r\n this.engine = engine;\r\n this.engine.modelGroup = new THREE.Group();\r\n this.engine.modelGroup.name = 'model2d';\r\n this.engine.scene.add(this.engine.modelGroup);\r\n this.clearModelGroup();\r\n }\r\n\r\n /**\r\n * 加载 2D CAD 模型。\r\n * 只支持新版分包数据:传入 manifest.json 或 CAD 目录地址。\r\n */\r\n public async loadModel(\r\n url: string,\r\n options: {\r\n chunkSize?: number;\r\n enableChunkedLoading?: boolean;\r\n enableValidation?: boolean;\r\n } = {},\r\n ): Promise<void> {\r\n this.enableValidation = options.enableValidation ?? this.enableValidation;\r\n this.engine.events?.trigger(EventType2d.ModelLoadStart, { url });\r\n\r\n try {\r\n this._emitProgress(10, '请求数据...');\r\n const dwgData = await this.loadData(url);\r\n const parsed = this.parseData(dwgData);\r\n if (!parsed) throw new Error('Failed to parse DWG data');\r\n\r\n this.engine.dwgData = parsed;\n this.data = parsed;\n this._emitProgress(20, '解析数据...');\n await this.buildScene(parsed, {\n chunkSize: options.chunkSize,\n enableChunkedLoading: options.enableChunkedLoading,\n });\n this.applyMetadataViewTransform(parsed);\n this.afterModelLoaded();\n } catch (error) {\r\n console.error('[LoaderModule2d] Model load failed:', error);\r\n this._emitProgress(0, '抱歉,图纸加载失败');\r\n throw error;\r\n }\r\n }\r\n\r\n private async loadData(url: string): Promise<DWGData> {\n return this.dataSource.load(url);\n }\n\n /** 把 metadata 中的整体视图变换应用到 2D 模型最外层 group,避免逐个 tile 或图元重复旋转。 */\n private applyMetadataViewTransform(dwgData: DWGData): void {\n const viewRotation = Number(dwgData.metadata?.viewRotation ?? 0);\n const rotation = Number.isFinite(viewRotation) ? viewRotation : 0;\n this.engine.modelGroup.rotation.set(0, 0, rotation);\n this.engine.modelGroup.updateMatrixWorld(true);\n }\n\r\n /** 做最小结构校验,避免下游几何生成拿到明显非法的数据。 */\r\n private parseData(jsonData: any): DWGData | null {\r\n if (!jsonData) {\r\n console.error('[LoaderModule2d] Empty JSON data');\r\n return null;\r\n }\r\n\r\n if (this.enableValidation && !this.validateDataStructure(jsonData)) {\r\n console.error('[LoaderModule2d] Invalid data structure');\r\n return null;\r\n }\r\n\r\n return jsonData as DWGData;\r\n }\r\n\r\n /** 校验新版 loader 运行所需的核心字段。 */\r\n private validateDataStructure(data: any): boolean {\r\n if (!data.version) console.warn('[LoaderModule2d] Missing version');\r\n if (!data.metadata) console.warn('[LoaderModule2d] Missing metadata');\r\n if (!Array.isArray(data.layers)) {\r\n console.error('[LoaderModule2d] Invalid or missing layers array');\r\n return false;\r\n }\r\n if (!Array.isArray(data.blocks)) {\r\n console.error('[LoaderModule2d] Invalid or missing blocks array');\r\n return false;\r\n }\r\n if (!Array.isArray(data.tiles)) {\r\n console.error('[LoaderModule2d] Invalid or missing tiles array');\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** 构建 2D 场景:字体 -> block 展开 -> 每个 octree tile 单独合批到一个 THREE.Group。 */\r\n private async buildScene(\n dwgData: DWGData,\n options: {\n chunkSize?: number;\n enableChunkedLoading?: boolean;\n } = {},\n ): Promise<void> {\n this.clearModelGroup();\r\n this.model = this.createEmptyModel();\r\n this.model.layers = dwgData.layers;\r\n this._emitProgress(30, '加载字体...');\r\n this.font = await this.loadFont(dwgData);\r\n\r\n this._emitProgress(45, '生成图元...');\r\n const textFactory = new TextGeometryFactory(this.engine, this.font);\r\n const geometryFactory = new EntityGeometryFactory(this.engine, textFactory);\r\n const flattener = new BlockFlattener(geometryFactory);\r\n flattener.setBlocks((dwgData as any).blocks ?? []);\r\n\r\n const tiles = ((dwgData as any).tiles ?? []) as LoadedCadTile2d[];\n const totalTiles = Math.max(tiles.length, 1);\n const chunkSize = Math.max(1, options.chunkSize ?? 2000);\n const enableChunkedLoading = options.enableChunkedLoading ?? true;\n for (let index = 0; index < tiles.length; index += 1) {\n const tile = tiles[index];\n const group = this.createTileGroup(tile);\n this.engine.modelGroup.add(group);\n const batchBuilder = new SceneBatchBuilder(this.engine, this.model, group);\n const linkIds = new Set<string>();\n let renderItemCount = 0;\n let chunkCount = 0;\n\n // 边展开边合批,避免 tile 内生成一个巨大的 renderItems 临时数组导致内存峰值过高。\n for (const item of flattener.iterateRootEntities(tile.inserts ?? [])) {\n if (item?.linkId != null) linkIds.add(String(item.linkId));\n renderItemCount += 1;\n chunkCount += 1;\n batchBuilder.addRenderItem(item);\n\n if (enableChunkedLoading && chunkCount >= chunkSize) {\n chunkCount = 0;\n await this.yieldToBrowser();\n }\n }\n\n group.userData.linkIds = Array.from(linkIds);\n group.userData.renderItemCount = renderItemCount;\n batchBuilder.buildSceneObjects();\n flattener.clearCache();\n\n const progress = 45 + Math.round(((index + 1) / totalTiles) * 45);\n this._emitProgress(progress, `合并图元 ${index + 1}/${totalTiles}...`);\n if (enableChunkedLoading) await this.yieldToBrowser();\n }\n\n this.engine.model = this.model;\n this._emitProgress(100, '加载完成');\n }\n\n /** 分块加载时让出一次事件循环,降低长时间同步展开造成的页面卡死概率。 */\n private async yieldToBrowser(): Promise<void> {\n await new Promise<void>((resolve) => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => resolve());\n return;\n }\n setTimeout(resolve, 0);\n });\n }\n\r\n /** 创建 octree tile 对应的 Three 分组;min/max 只作为空间索引元数据,不参与定位修正。 */\r\n private createTileGroup(tile: LoadedCadTile2d): THREE.Group {\r\n const group = new THREE.Group();\r\n group.name = `octree:${tile.id}`;\r\n group.userData = {\r\n type: 'octree-tile',\r\n tileId: tile.id,\r\n tileUrl: tile.url,\r\n min: tile.node?.min,\r\n max: tile.node?.max,\r\n entityCount: tile.inserts?.length ?? tile.node?.entityCount ?? 0,\r\n };\r\n return group;\r\n }\r\n\r\n /** 按图纸实际文字裁剪字体字符集,降低字体转换成本。 */\n private async loadFont(dwgData: DWGData): Promise<Font> {\n const fontUrl: string = this.engine.options?.fontUrl ?? '/fonts/simfang.ttf';\r\n // 只转换当前图纸用到的字符,避免默认加载整套中文字体导致 JSON 过大和解析过慢。\r\n const json = await FontJsonGenerator.fromUrl(fontUrl, { chars: this.collectTextChars(dwgData) });\r\n return FontJsonGenerator.toThreeFont(json);\r\n }\r\n\r\n /** 从 block 实体中收集需要转换的文字字符;根实体来自 tile insert,不包含真实文字。 */\r\n private collectTextChars(dwgData: DWGData): string {\r\n const chars = new Set<string>([' ']);\r\n const collectFromEntities = (entities?: any[]): void => {\r\n if (!Array.isArray(entities)) return;\r\n entities.forEach((entity: any) => {\r\n if (typeof entity?.text === 'string') {\r\n for (const char of this.normalizeText(entity.text).replace(/\\n/g, ' ')) chars.add(char);\r\n }\r\n });\r\n };\r\n\r\n collectFromEntities((dwgData as any).entities);\r\n ((dwgData as any).blocks ?? []).forEach((block: any) => collectFromEntities(block?.entities));\r\n return Array.from(chars).join('');\r\n }\r\n\r\n /** 统一换行格式,和 TextGeometryFactory 保持一致。 */\r\n private normalizeText(text: any): string {\r\n return String(text ?? '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n }\r\n\r\n /** 场景构建完成后的视图适配、图层管理和事件通知。 */\r\n private afterModelLoaded(): void {\r\n try {\r\n this.engine.fitToView();\r\n } catch (_error) {\r\n // 某些宿主会延迟初始化相机控制器,fit 失败不应中断加载。\r\n }\r\n\r\n if (!this.engine.layerManager) {\r\n this.engine.layerManager = new LayerManager(this.engine);\r\n }\r\n this.engine.layerManager._loadLayers();\r\n const background = this.engine.scene?.background;\r\n const backgroundColor = background instanceof THREE.Color ? background.getHex() : (this.engine.options?.backgroundColor ?? 0x1a1a1a);\r\n this.engine.modelToolModule2d?.updateColorsForBackground(backgroundColor);\r\n this.engine.layerManager.refresh();\r\n this.engine.events?.trigger(EventType2d.ModelLoaded, {});\r\n }\r\n\r\n /** 创建一次加载周期内使用的合批容器。 */\r\n private createEmptyModel(): LoaderModel2d {\r\n return {\r\n layers: [],\r\n modelMap: new Map(),\r\n hatchMap: new Map(),\r\n textMap: new Map(),\r\n imageMap: new Map(),\r\n nodeMap: new Map(),\r\n textItems: [],\r\n };\r\n }\r\n\r\n /** 清空 Three 组内旧模型对象,但保留 modelGroup 实例供外部引用。 */\r\n private clearModelGroup(): void {\n this.engine.modelGroup.rotation.set(0, 0, 0);\n while (this.engine.modelGroup.children.length > 0) {\n const child = this.engine.modelGroup.children[0];\n this.engine.modelGroup.remove(child);\n this.disposeObject3d(child);\n }\n }\n\n /** 释放旧模型占用的 CPU/GPU 资源,避免重复加载或失败重试时内存继续累加。 */\n private disposeObject3d(object: THREE.Object3D): void {\n object.traverse((child: any) => {\n this.disposeGeometry(child.geometry);\n this.disposeGeometryList(child.geometrys);\n this.disposeMaterial(child.material);\n this.disposeMaterial(child.materialClone);\n child.geometrys = undefined;\n child.clonePoints = undefined;\n child.materialClone = undefined;\n });\n }\n\n private disposeGeometry(geometry: THREE.BufferGeometry | undefined): void {\n geometry?.dispose?.();\n }\n\n private disposeGeometryList(geometries: THREE.BufferGeometry[] | undefined): void {\n geometries?.forEach((geometry) => this.disposeGeometry(geometry));\n }\n\n private disposeMaterial(material: THREE.Material | THREE.Material[] | undefined): void {\n if (Array.isArray(material)) {\n material.forEach((item) => this.disposeMaterial(item));\n return;\n }\n if (!material) return;\n Object.values(material).forEach((value: any) => {\n if (value?.isTexture) value.dispose?.();\n });\n material.dispose?.();\n }\n\r\n /** 对外发送加载进度事件。 */\r\n private _emitProgress(progress: number, text: string): void {\r\n this.engine.events?.trigger(EventType2d.ModelLoadProgress, { progress, text });\r\n }\r\n\r\n public getData(): DWGData | null {\r\n return this.data;\r\n }\r\n\r\n public getEntitiesByLayer(layerName: string): DWGEntity[] {\r\n if (!this.data) return [];\r\n return this.data.entities.filter((entity) => entity.layer === layerName);\r\n }\r\n\r\n public getLayers(): DWGData['layers'] {\r\n if (!this.data) return [];\r\n return this.data.layers;\r\n }\r\n\r\n public clear(): void {\r\n this.data = null;\r\n this.engine.dwgData = null;\r\n this.model = this.createEmptyModel();\r\n this.clearModelGroup();\r\n }\r\n\r\n public dispose(): void {\r\n this.clear();\r\n }\r\n}\r\n","import * as THREE from 'three';\r\n\r\n/**\r\n * 世界坐标与屏幕坐标转换工具类\r\n * 提供世界坐标(3D空间坐标)与屏幕坐标(2D像素坐标)之间的双向转换功能\r\n */\r\nexport class WorldToScreen {\r\n private raycaster: THREE.Raycaster;\r\n\r\n /**\r\n * 构造函数\r\n * @param camera - Three.js 相机对象(用于投影计算)\r\n * @param renderer - Three.js 渲染器对象(用于获取画布尺寸)\r\n * @param scene - Three.js 场景对象(用于屏幕坐标转世界坐标时的射线检测,可选)\r\n */\r\n constructor(\r\n private camera: THREE.Camera,\r\n private renderer: THREE.WebGLRenderer,\r\n private scene?: THREE.Scene\r\n ) {\r\n // 初始化射线检测器,用于屏幕坐标转世界坐标\r\n this.raycaster = new THREE.Raycaster();\r\n }\r\n\r\n /**\r\n * 将世界坐标转换为屏幕坐标(归一化坐标,范围 -1 到 1)\r\n * @param worldPos - 世界空间中的3D坐标点\r\n * @returns 归一化的屏幕坐标,x 和 y 的范围都是 -1 到 1\r\n * x: -1 表示屏幕左边缘,1 表示屏幕右边缘\r\n * y: -1 表示屏幕下边缘,1 表示屏幕上边缘\r\n */\r\n public worldToScreenNormalized(worldPos: THREE.Vector3): THREE.Vector2 {\r\n // 克隆坐标点,避免修改原始对象\r\n const pos = worldPos.clone();\r\n // 使用相机的投影矩阵将世界坐标投影到归一化设备坐标(NDC)\r\n pos.project(this.camera);\r\n // 返回归一化的屏幕坐标\r\n return new THREE.Vector2(pos.x, pos.y);\r\n }\r\n\r\n /**\r\n * 将世界坐标转换为屏幕坐标(像素坐标)\r\n * @param worldPos - 世界空间中的3D坐标点\r\n * @returns 屏幕像素坐标,x 和 y 表示在画布上的实际像素位置\r\n * x: 0 表示屏幕左边缘,width 表示屏幕右边缘\r\n * y: 0 表示屏幕上边缘,height 表示屏幕下边缘\r\n */\r\n public worldToScreen(worldPos: THREE.Vector3): THREE.Vector2 {\r\n // 创建一个向量用于存储世界坐标\r\n const vector = new THREE.Vector3();\r\n \r\n // 将世界坐标转换为裁剪空间坐标\r\n vector.copy(worldPos).project(this.camera);\r\n \r\n // 将裁剪空间坐标转换到NDC(标准化设备坐标)\r\n // 在NDC中,x和y的范围是-1到1,z是0到1\r\n vector.x = vector.x * this.renderer.domElement.clientWidth * 0.5;\r\n vector.y = -vector.y * this.renderer.domElement.clientHeight * 0.5; // 注意y轴的反向性\r\n vector.z = (vector.z + 1) * 0.5; // z的范围从-1到1映射到0到1\r\n \r\n // 转换为屏幕坐标,加上窗口的偏移量\r\n vector.x += this.renderer.domElement.clientWidth * 0.5;\r\n vector.y += this.renderer.domElement.clientHeight * 0.5;\r\n \r\n return new THREE.Vector2(vector.x, vector.y);\n }\n\n /**\n * 将世界坐标转换为屏幕坐标,仅在点位于当前相机可见裁剪空间内时返回结果。\n * 透视相机背后的点经过 project 后会翻转到屏幕异常位置,这里提前过滤。\n * @param worldPos - 世界空间中的 3D 坐标点\n * @returns 屏幕像素坐标;如果点不可见或投影结果无效,返回 null\n */\n public worldToScreenIfVisible(worldPos: THREE.Vector3): THREE.Vector2 | null {\n this.camera.updateMatrixWorld(true);\n\n if (this.camera instanceof THREE.PerspectiveCamera) {\n const cameraSpacePos = worldPos.clone().applyMatrix4(this.camera.matrixWorldInverse);\n if (cameraSpacePos.z >= 0) {\n return null;\n }\n }\n\n const vector = worldPos.clone().project(this.camera);\n if (\n !Number.isFinite(vector.x) ||\n !Number.isFinite(vector.y) ||\n !Number.isFinite(vector.z) ||\n vector.z < -1 ||\n vector.z > 1\n ) {\n return null;\n }\n\n const width = this.renderer.domElement.clientWidth;\n const height = this.renderer.domElement.clientHeight;\n\n return new THREE.Vector2(\n vector.x * width * 0.5 + width * 0.5,\n -vector.y * height * 0.5 + height * 0.5\n );\n }\n\n /**\n * 将屏幕坐标(像素坐标)转换为归一化坐标\r\n * @param screenX - 屏幕像素 X 坐标\r\n * @param screenY - 屏幕像素 Y 坐标\r\n * @returns 归一化的屏幕坐标,范围 -1 到 1\r\n */\r\n public screenToNormalized(screenX: number, screenY: number): THREE.Vector2 {\r\n const width = this.renderer.domElement.clientWidth;\r\n const height = this.renderer.domElement.clientHeight;\r\n \r\n const x = (screenX / width) * 2 - 1;\r\n const y = -((screenY / height) * 2 - 1);\r\n \r\n return new THREE.Vector2(x, y);\r\n }\r\n\r\n /**\r\n * 将屏幕坐标(像素坐标)转换为世界坐标\r\n * 使用射线检测,返回与场景中第一个相交对象的世界坐标点\r\n * @param screenX - 屏幕像素 X 坐标\r\n * @param screenY - 屏幕像素 Y 坐标\r\n * @param objects - 可选,指定要检测的对象数组。如果不提供且 scene 存在,则检测场景中的所有对象\r\n * @returns 世界坐标点,如果没有相交则返回 null\r\n */\r\n public screenToWorld(\r\n screenX: number, \r\n screenY: number, \r\n objects?: THREE.Object3D[]\r\n ): THREE.Vector3 | null {\r\n // 如果没有提供场景,无法进行射线检测\r\n if (!this.scene && !objects) {\r\n console.warn('WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标');\r\n return null;\r\n }\r\n\r\n // 将屏幕坐标转换为归一化坐标\r\n const normalized = this.screenToNormalized(screenX, screenY);\r\n \r\n // 设置射线检测器的起点和方向\r\n this.raycaster.setFromCamera(normalized, this.camera);\r\n \r\n // 确定要检测的对象列表\r\n const objectsToTest = objects || this.scene!.children;\r\n \r\n // 执行射线检测,获取所有相交点\r\n const intersects = this.raycaster.intersectObjects(objectsToTest, true);\r\n \r\n // 如果存在相交点,返回第一个相交点的世界坐标\r\n if (intersects.length > 0) {\r\n return intersects[0].point;\r\n }\r\n \r\n // 如果没有相交,返回 null\r\n return null;\r\n }\r\n\r\n /**\r\n * 将屏幕坐标转换为指定深度的世界坐标\r\n * @param screenX - 屏幕像素 X 坐标\r\n * @param screenY - 屏幕像素 Y 坐标\r\n * @param depth - 沿射线方向的距离(世界单位)\r\n * @returns 世界坐标点\r\n */\r\n public screenToWorldWithDepth(\r\n screenX: number, \r\n screenY: number, \r\n depth: number = 0\r\n ): THREE.Vector3 {\r\n const normalized = this.screenToNormalized(screenX, screenY);\r\n this.raycaster.setFromCamera(normalized, this.camera);\r\n const result = new THREE.Vector3();\r\n this.raycaster.ray.at(depth, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * 更新相机引用(当相机发生变化时调用)\r\n * @param camera - 新的相机对象\r\n */\r\n public updateCamera(camera: THREE.Camera): void {\r\n this.camera = camera;\r\n }\r\n\r\n /**\r\n * 更新渲染器引用(当渲染器发生变化时调用)\r\n * @param renderer - 新的渲染器对象\r\n */\r\n public updateRenderer(renderer: THREE.WebGLRenderer): void {\r\n this.renderer = renderer;\r\n }\r\n\r\n /**\r\n * 更新场景引用(当场景发生变化时调用)\r\n * @param scene - 新的场景对象\r\n */\r\n public updateScene(scene: THREE.Scene): void {\r\n this.scene = scene;\r\n }\r\n}\n","import * as THREE from 'three';\r\nimport { WorldToScreen } from '../../../../common/WorldToScreen';\r\n\r\n/** 基于 2D octree 的粗筛拾取管理器。 */\r\nexport class OctreeBox2d {\r\n private engine: any;\n private pickBoxElementIds: any[] = [];\n private worldToScreen: WorldToScreen;\n private readonly invisibleMaterial = new THREE.MeshBasicMaterial({ visible: false });\n private readonly maxHoverLineCoordinateCount = 30000;\n private readonly maxHoverMeshVertexCount = 30000;\n\r\n constructor(engine: any) {\r\n this.engine = engine;\r\n this.pickBoxElementIds = [];\r\n this.worldToScreen = new WorldToScreen(engine.camera, engine.renderer, engine.scene);\r\n }\r\n\r\n public init(): void {\r\n this.pickBoxElementIds = [];\r\n }\r\n\r\n /** 先通过 octree 包围盒筛候选 linkId,再对线和面做精确拾取。 */\r\n public pick2d(rayCaster: any, event: any): any {\r\n const meshs: any[] = [];\r\n const mousePoint = new THREE.Vector2(event.offsetX, event.offsetY);\r\n this.init();\r\n this.RecurrentIteration(rayCaster, this.engine.dwgData?.octree);\r\n\r\n const interList: any[] = [];\r\n this.pickBoxElementIds.forEach((id) => {\r\n const nodes = this.engine.loaderModule2d.model.nodeMap.get(String(id)) ?? this.engine.loaderModule2d.model.nodeMap.get(id);\r\n nodes?.forEach((node: any) => {\r\n if (node == null) return;\r\n const model = this.getNodeObject(node);\n if (model == null) return;\n if (!this.isNodePickable(node, model)) return;\n if (event?.isHover === true && this.isLargeHoverNode(node, model)) return;\n if (model instanceof THREE.LineSegments) {\n const threeBox = new THREE.Box3(node.min, node.max);\r\n const isinter = rayCaster.ray.intersectsBox(threeBox);\r\n if (isinter == null || isinter === false) return;\r\n\r\n const line: any = model;\r\n const ps = line.clonePoints.slice(node.indexes[1], node.indexes[2]);\r\n const points: THREE.Vector3[] = [];\r\n for (let index = 0; index < ps.length / 3; index += 1) {\r\n points.push(new THREE.Vector3(ps[index * 3], ps[index * 3 + 1], ps[index * 3 + 2]));\r\n }\r\n\r\n const screenLines: [THREE.Vector2, THREE.Vector2][] = [];\r\n for (let index = 0; index < points.length / 2; index += 1) {\r\n const start = this.worldToScreen.worldToScreen(points[index * 2]);\r\n const end = this.worldToScreen.worldToScreen(points[index * 2 + 1]);\r\n if (start.distanceTo(end) > 1) screenLines.push([start, end]);\r\n }\r\n\r\n screenLines.forEach((line) => {\r\n const distance = this.pointToLineDistance(mousePoint, line[0], line[1]);\r\n if (distance < 10) {\r\n interList.push({ distance, linkId: id });\r\n }\r\n });\r\n } else {\n const geo = this.getNodeGeometry(model, node);\n if (!geo) return;\n const invisibleMesh: any = new THREE.Mesh(geo, this.invisibleMaterial);\n invisibleMesh.linkId = id;\n meshs.push(invisibleMesh);\n }\n });\n });\n\n const intersects = rayCaster.intersectObjects(meshs, true);\n meshs.forEach((mesh) => {\n mesh.geometry?.dispose?.();\n });\n if (intersects.length > 0) {\n return (intersects[0].object as any).linkId;\n }\r\n if (interList.length > 0) {\r\n interList.sort((a, b) => a.distance - b.distance);\r\n return interList[0].linkId;\r\n }\r\n return null;\r\n }\r\n\r\n /** 分组加载后 nodeMap 会保存真实对象;旧索引只作为兜底。 */\r\n private getNodeObject(node: any): any {\n return node?.object ?? node?.group?.children?.[node.indexes?.[0]] ?? this.engine.modelGroup.children[node.indexes?.[0]];\n }\n\n /** 从合并后的 geometry group 中临时提取单个图元几何,避免加载期常驻每个子 geometry。 */\n private getNodeGeometry(object: any, node: any): THREE.BufferGeometry | null {\n if (Array.isArray(object.geometrys) && object.geometrys[node.indexes[1]]) {\n return object.geometrys[node.indexes[1]].clone();\n }\n\n const geometry = object.geometry as THREE.BufferGeometry | undefined;\n const group = geometry?.groups?.[node.indexes[1]];\n if (!geometry || !group) return null;\n\n const result = new THREE.BufferGeometry();\n Object.keys(geometry.attributes).forEach((name) => {\n const attribute = geometry.getAttribute(name) as THREE.BufferAttribute;\n const itemSize = attribute.itemSize;\n const source = attribute.array as any;\n const start = group.start * itemSize;\n const end = (group.start + group.count) * itemSize;\n result.setAttribute(name, new THREE.BufferAttribute(source.slice(start, end), itemSize, attribute.normalized));\n });\n return result;\n }\n\r\n /** 获取鼠标射线经过的 octree 节点内元素。 */\r\n public RecurrentIteration(rayCaster: any, box: any): void {\r\n if (box == null) return;\r\n const stack = [box];\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!current) continue;\r\n const bounds = this.getBox3(current);\r\n if (bounds && !rayCaster.ray.intersectsBox(bounds)) continue;\r\n\r\n const elements = current.elements ?? [];\r\n elements.forEach((ele: any) => {\r\n if (this.isElementPickable(ele)) this.pickBoxElementIds.push(ele);\r\n });\r\n\r\n const children = current.children ?? [];\r\n for (let index = children.length - 1; index >= 0; index -= 1) {\r\n stack.push(children[index]);\r\n }\r\n }\r\n }\r\n\r\n /** 新版 min/max 是数组,这里也兼容对象形式,避免外部数据轻微差异导致拾取失效。 */\r\n private getBox3(box: any): THREE.Box3 | null {\r\n const min = this.toVector3(box.min);\r\n const max = this.toVector3(box.max);\r\n if (!min || !max) return null;\r\n return new THREE.Box3(\r\n new THREE.Vector3(Math.min(min.x, max.x), Math.min(min.y, max.y), Math.min(min.z, max.z)),\r\n new THREE.Vector3(Math.max(max.x, min.x), Math.max(max.y, min.y), Math.max(max.z, min.z)),\r\n );\r\n }\r\n\r\n private toVector3(value: any): THREE.Vector3 | null {\r\n if (Array.isArray(value)) return new THREE.Vector3(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0);\r\n if (value && typeof value === 'object') return new THREE.Vector3(value.X ?? value.x ?? 0, value.Y ?? value.y ?? 0, value.Z ?? value.z ?? 0);\r\n return null;\r\n }\r\n\r\n /** 隐藏或已经高亮的元素不参与普通拾取,保持原有交互语义。 */\r\n private isElementPickable(ele: any): boolean {\r\n let ids = this.engine.engineStatus2d.hideModels;\r\n if (ids != null && ids.includes(ele)) return false;\r\n ids = this.engine.engineStatus2d.highlightModels;\r\n if (ids != null && ids.includes(ele)) return false;\r\n if (this.engine.layerManager?.isModelVisibleByLayer?.(ele) === false) return false;\r\n return true;\r\n }\r\n\r\n /** 图层隐藏后,命中的子几何不再参与线/面精确拾取。 */\r\n private isNodePickable(node: any, object: any): boolean {\n if (object?.visible === false) return false;\n return this.engine.layerManager?.isLayerVisible?.(node?.layer) !== false;\n }\n\n /** hover 阶段跳过超大节点的精确拾取;click 不带 isHover 标记,仍走完整命中。 */\n private isLargeHoverNode(node: any, object: any): boolean {\n if (object instanceof THREE.LineSegments) {\n return Math.max(0, (node.indexes?.[2] ?? 0) - (node.indexes?.[1] ?? 0)) > this.maxHoverLineCoordinateCount;\n }\n\n const group = object?.geometry?.groups?.[node.indexes?.[1]];\n return (group?.count ?? 0) > this.maxHoverMeshVertexCount;\n }\n\n private pointToLineDistance(point: THREE.Vector2, start: THREE.Vector2, end: THREE.Vector2): number {\n const lineDir = new THREE.Vector2().subVectors(end, start);\r\n const lineLengthSq = lineDir.lengthSq();\r\n if (lineLengthSq < 1e-10) {\r\n return point.distanceTo(start);\r\n }\r\n const toPoint = new THREE.Vector2().subVectors(point, start);\r\n const t = THREE.MathUtils.clamp(toPoint.dot(lineDir) / lineLengthSq, 0, 1);\r\n const projectionPoint = new THREE.Vector2().copy(lineDir).multiplyScalar(t).add(start);\r\n return point.distanceTo(projectionPoint);\r\n }\r\n}\r\n","import {WorldToScreen} from \"../../../../common/WorldToScreen\"\r\nimport * as THREE from 'three';\r\nexport class LinkView2d3d{\r\n private engine:any\r\n // 小组件容器\r\n private widgetContainer: HTMLDivElement | null = null\r\n private widgetCanvas: HTMLCanvasElement | null = null\r\n private widgetCtx: CanvasRenderingContext2D | null = null\r\n // 小组件尺寸\r\n private readonly widgetSize: number = 50\r\n // 拖拽交互状态\r\n private isDragging: boolean = false\r\n private isRotating: boolean = false\r\n private lastMouseX: number = 0\r\n private lastMouseY: number = 0\r\n // 小组件位置(相对于屏幕)\r\n private widgetX: number = this.widgetSize / 2 + 5\r\n private widgetY: number = this.widgetSize / 2 + 5\r\n // 小组件旋转角度\r\n private widgetRotation: number = 0\r\n private rotationStartAngle: number | null = null\r\n private widgetRotationStart: number = 0\r\n private worldToScreen:WorldToScreen\r\n private currentWordPosition:THREE.Vector3 | null = null\r\n private currentWordRotation:number | null = null\r\n private lastCameraWorldPosition: THREE.Vector3 | null = null\r\n // 是否启用状态\r\n private enabled: boolean = true\r\n constructor(engine:any){\r\n this.engine = engine\r\n this.worldToScreen = new WorldToScreen(engine.camera,engine.renderer,engine.scene)\r\n this.initWidget()\r\n this.active()\r\n let this_ = this\r\n this.engine.controlModule2d.panControls.addEventListener('change', () => {\r\n // change 同时包含拖拽和滚轮,无法区分\r\n this_.updateViewPoint()\r\n });\r\n }\r\n\r\n /**\r\n * 切换启用状态\r\n */\r\n public toggle(): boolean {\r\n this.enabled = !this.enabled\r\n if (this.enabled) {\r\n this.active()\r\n if(this.widgetContainer) {\r\n this.widgetContainer.style.display = 'block'\r\n }\r\n } else {\r\n this.disActive()\r\n if(this.widgetContainer) {\r\n this.widgetContainer.style.display = 'none'\r\n }\r\n }\r\n return this.enabled\r\n }\r\n\r\n /**\r\n * 获取启用状态\r\n */\r\n public isEnabled(): boolean {\r\n return this.enabled\r\n }\r\n\r\n // 初始化小组件\r\n private initWidget(){\r\n const dpr = window.devicePixelRatio || 1\r\n\r\n // 创建容器\r\n this.widgetContainer = document.createElement('div')\r\n this.widgetContainer.className = \"MapController\"\r\n this.widgetContainer.style.position = 'absolute'\r\n this.widgetContainer.style.width = `${this.widgetSize}px`\r\n this.widgetContainer.style.height = `${this.widgetSize}px`\r\n this.widgetContainer.style.border = '2px solid rgba(255, 255, 255, 0.4)'\r\n this.widgetContainer.style.borderRadius = '50%'\r\n this.widgetContainer.style.overflow = 'hidden'\r\n this.widgetContainer.style.backgroundColor = 'rgba(26, 26, 46, 0.85)'\r\n this.widgetContainer.style.cursor = 'crosshair'\r\n this.widgetContainer.style.userSelect = 'none'\r\n this.widgetContainer.style.pointerEvents = 'auto'\r\n this.syncWidgetPosition()\r\n\r\n // 创建 canvas 用于绘制方向指示器\r\n this.widgetCanvas = document.createElement('canvas')\r\n this.widgetContainer.className = \"MapController\"\r\n this.widgetCanvas.width = this.widgetSize * dpr\r\n this.widgetCanvas.height = this.widgetSize * dpr\r\n this.widgetCanvas.style.position = 'absolute'\r\n this.widgetCanvas.style.top = '0'\r\n this.widgetCanvas.style.left = '0'\r\n this.widgetCanvas.style.width = `${this.widgetSize}px`\r\n this.widgetCanvas.style.height = `${this.widgetSize}px`\r\n this.widgetCanvas.style.pointerEvents = 'auto' \r\n this.widgetContainer.style.zIndex = '1000'\r\n this.widgetContainer.appendChild(this.widgetCanvas)\r\n\r\n this.widgetCtx = this.widgetCanvas.getContext('2d')\r\n if(this.widgetCtx){\r\n this.widgetCtx.scale(dpr, dpr)\r\n }\r\n\r\n // 绑定事件\r\n this.setupWidgetEvents()\r\n\r\n // 添加到页面\r\n if(this.engine.container){\r\n this.engine.container.appendChild(this.widgetContainer)\r\n }\r\n\r\n // 初始绘制\r\n this.drawWidget()\r\n }\r\n\r\n // 设置小组件事件\r\n private setupWidgetEvents(){\r\n if(!this.widgetContainer) return\r\n\r\n // widgetContainer: 左键拖动组件位置\r\n this.widgetContainer.addEventListener('mousedown', this.onWidgetCanvasMouseDown)\r\n // widgetCanvas: 左键旋转方向\r\n if(this.widgetCanvas){\r\n this.widgetCanvas.addEventListener('mousedown', this.onWidgetCanvasMouseDown)\r\n }\r\n window.addEventListener('mousemove', this.onWidgetMouseMove)\r\n window.addEventListener('mouseup', this.onWidgetMouseUp)\r\n\r\n // 禁用右键菜单\r\n this.widgetContainer.addEventListener('contextmenu', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n })\r\n if(this.widgetCanvas){\r\n this.widgetCanvas.addEventListener('contextmenu', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n })\r\n }\r\n }\r\n \r\n // 鼠标按下 - Canvas(旋转)\r\n private readonly onWidgetCanvasMouseDown = (e: MouseEvent) => {\r\n if(!this.widgetContainer) return\r\n if(e.button == 0){\r\n this.isDragging = false\r\n this.isRotating = true\r\n } else{\r\n this.isDragging = true\r\n this.isRotating = false\r\n }\r\n \r\n this.captureRotationBaseline(e)\r\n\r\n this.lastMouseX = e.clientX\r\n this.lastMouseY = e.clientY\r\n\r\n if(this.widgetContainer){\r\n this.widgetContainer.style.cursor = 'alias'\r\n }\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n // 鼠标移动\r\n private readonly onWidgetMouseMove = (e: MouseEvent) => {\r\n if(!this.isDragging && !this.isRotating) return\r\n\r\n const deltaX = e.clientX - this.lastMouseX\r\n const deltaY = e.clientY - this.lastMouseY\r\n\r\n if(this.isDragging){\r\n // 拖动整个组件\r\n this.widgetX += deltaX\r\n this.widgetY += deltaY\r\n console.log(`[LinkView2d3d] 拖动位置更新: x=${this.widgetX.toFixed(0)}, y=${this.widgetY.toFixed(0)}`)\r\n\r\n this.syncWidgetPosition()\r\n this.handleWidgetPositionControl()\r\n } else if(this.isRotating){\r\n // 旋转指示器\r\n const currentAngle = this.calculatePointerAngle(e)\r\n if(currentAngle !== null){\r\n if(this.rotationStartAngle === null){\r\n this.rotationStartAngle = currentAngle\r\n this.widgetRotationStart = this.widgetRotation\r\n }\r\n const angleDelta = currentAngle - this.rotationStartAngle\r\n this.widgetRotation = this.widgetRotationStart + angleDelta\r\n console.log(`[LinkView2d3d] 旋转角度更新: ${(this.widgetRotation * 180 / Math.PI).toFixed(1)}°`)\r\n this.drawWidget()\r\n this.handleWidgetRotationControl()\r\n }\r\n }\r\n\r\n this.lastMouseX = e.clientX\r\n this.lastMouseY = e.clientY\r\n }\r\n\r\n // 鼠标松开\r\n private readonly onWidgetMouseUp = () => {\r\n if(this.isDragging){\r\n console.log(`[LinkView2d3d] 拖动结束,最终位置: x=${this.widgetX.toFixed(0)}, y=${this.widgetY.toFixed(0)}`)\r\n }\r\n if(this.isRotating){\r\n console.log(`[LinkView2d3d] 旋转结束,最终角度: ${(this.widgetRotation * 180 / Math.PI).toFixed(1)}°`)\r\n }\r\n\r\n this.isDragging = false\r\n this.isRotating = false\r\n this.rotationStartAngle = null\r\n\r\n if(this.widgetContainer){\r\n this.widgetContainer.style.cursor = 'crosshair'\r\n }\r\n }\r\n\r\n // 绘制小组件\r\n private drawWidget(){\r\n const ctx = this.widgetCtx\r\n if(!ctx) return\r\n\r\n const cx = this.widgetSize / 2\r\n const cy = this.widgetSize / 2\r\n\r\n ctx.clearRect(0, 0, this.widgetSize, this.widgetSize)\r\n\r\n ctx.save()\r\n ctx.translate(cx, cy)\r\n ctx.rotate(this.widgetRotation)\r\n\r\n // 绘制视野锥形指示器(类似 miniMap)\r\n const coneLength = 36\r\n const halfAngle = Math.PI / 10 // 15° → 总张角 30°\r\n\r\n // 由内向外渐变:尖端不透明绿 → 外沿完全透明\r\n const grad = ctx.createRadialGradient(0, 0, 2, 0, 0, coneLength)\r\n grad.addColorStop(0, 'rgba(0, 230, 130, 0.9)')\r\n grad.addColorStop(1, 'rgba(0, 230, 130, 0)')\r\n\r\n const lx = -Math.sin(halfAngle) * coneLength\r\n const ly = -Math.cos(halfAngle) * coneLength\r\n const rx = Math.sin(halfAngle) * coneLength\r\n const ry = -Math.cos(halfAngle) * coneLength\r\n\r\n ctx.beginPath()\r\n ctx.moveTo(0, 0)\r\n ctx.lineTo(lx, ly)\r\n ctx.lineTo(rx, ry)\r\n ctx.closePath()\r\n ctx.fillStyle = grad\r\n ctx.fill()\r\n\r\n // 中心圆点(位置指示器)\r\n ctx.fillStyle = 'rgba(255, 255, 255, 0.95)'\r\n ctx.strokeStyle = 'rgba(0, 200, 110, 0.9)'\r\n ctx.lineWidth = 1.5\r\n ctx.beginPath()\r\n ctx.arc(0, 0, 4, 0, Math.PI * 2)\r\n ctx.fill()\r\n ctx.stroke()\r\n\r\n ctx.restore()\r\n }\r\n\r\n // 激活\r\n private active(){\r\n window.addEventListener('D3ViewUpdate', this.listenViewUpdate)\r\n }\r\n // 取消\r\n private disActive(){\r\n window.removeEventListener('D3ViewUpdate', this.listenViewUpdate)\r\n }\r\n\r\n // 清理小组件资源\r\n private disposeWidget(){\r\n if(this.widgetContainer){\r\n this.widgetContainer.removeEventListener('mousedown', this.onWidgetMouseDown)\r\n }\r\n if(this.widgetCanvas){\r\n this.widgetCanvas.removeEventListener('mousedown', this.onWidgetCanvasMouseDown)\r\n }\r\n window.removeEventListener('mousemove', this.onWidgetMouseMove)\r\n window.removeEventListener('mouseup', this.onWidgetMouseUp)\r\n\r\n this.widgetContainer?.remove()\r\n\r\n this.widgetContainer = null\r\n this.widgetCanvas = null\r\n this.widgetCtx = null\r\n }\r\n\r\n // 更新相机位置\r\n private readonly listenViewUpdate = (res:any) =>{\r\n console.log('[LinkView2d3d] 收到视图更新事件', res)\r\n res = res.detail\r\n // 这里可以根据 3D 视图的位置来更新小组件的位置和方向\r\n // 例如:\r\n if(res && res.position){ \r\n this.lastCameraWorldPosition = new THREE.Vector3(res.position.x, res.position.y, res.position.z)\r\n this.currentWordPosition = new THREE.Vector3(res.position.x,-res.position.z,0)\r\n }\r\n \r\n if(res && typeof res.rotation === 'number'){\r\n this.currentWordRotation = res.rotation \r\n }\r\n\r\n this.updateViewPoint()\r\n }\r\n\r\n private updateViewPoint(){\r\n if(this.currentWordPosition){ \r\n let screenPoint = this.worldToScreen.worldToScreen(this.currentWordPosition)\r\n this.widgetX = screenPoint.x\r\n this.widgetY = screenPoint.y\r\n this.syncWidgetPosition()\r\n }\r\n if(this.currentWordRotation !== null){\r\n // 根据相机旋转角度计算widgetRotation\r\n // rotation.y 是偏航角(yaw),用于2D平面旋转\r\n // 加上 Math.PI 是因为3D相机的0°朝向与2D指示器方向需要偏移180°\r\n this.widgetRotation = this.currentWordRotation\r\n this.drawWidget()\r\n } \r\n }\r\n\r\n private syncWidgetPosition(){\r\n if(!this.widgetContainer) return\r\n const halfSize = this.widgetSize / 2\r\n this.widgetContainer.style.left = `${this.widgetX - halfSize}px`\r\n this.widgetContainer.style.top = `${this.widgetY - halfSize}px`\r\n }\r\n\r\n private handleWidgetPositionControl(){\r\n const worldPoint = this.getWidgetWorldPosition()\r\n if(!worldPoint) return\r\n this.currentWordPosition = worldPoint\r\n this.dispatchViewControl('move', { position2d: worldPoint })\r\n }\r\n\r\n private handleWidgetRotationControl(){\r\n this.currentWordRotation = this.widgetRotation\r\n this.dispatchViewControl('rotate', { rotation: this.widgetRotation })\r\n }\r\n\r\n private getWidgetWorldPosition(): THREE.Vector3 | null{\r\n if(!this.engine?.cameraModule2d?.screenToWorld) return null\r\n const point = this.engine.cameraModule2d.screenToWorld(this.widgetX, this.widgetY)\r\n if(!point) return null\r\n\r\n return new THREE.Vector3(point.x, point.y, 0)\r\n }\r\n\r\n private dispatchViewControl(mode:'move'|'rotate'|'both', payload:{ position2d?: THREE.Vector3, rotation?: number }){\r\n const hasPosition = !!payload.position2d\r\n const hasRotation = typeof payload.rotation === 'number'\r\n if(!hasPosition && !hasRotation) return\r\n\r\n if(hasPosition && !this.lastCameraWorldPosition){\r\n console.warn('[LinkView2d3d] 未获取到 3D 相机位置,暂不推送位置控制')\r\n return\r\n }\r\n\r\n const detail:any = {\r\n source: 'LinkView2d3d',\r\n mode\r\n }\r\n\r\n if(payload.position2d && this.lastCameraWorldPosition){\r\n const targetY = this.lastCameraWorldPosition.y\r\n const mappedZ = -payload.position2d.y\r\n detail.position = {\r\n x: payload.position2d.x,\r\n y: targetY,\r\n z: mappedZ\r\n }\r\n this.lastCameraWorldPosition = new THREE.Vector3(payload.position2d.x, targetY, mappedZ)\r\n }\r\n\r\n if(hasRotation){\r\n detail.rotation = payload.rotation\r\n }\r\n\r\n window.dispatchEvent(new CustomEvent('D2ViewControl', { detail }))\r\n }\r\n\r\n private captureRotationBaseline(e: MouseEvent){\r\n const pointerAngle = this.calculatePointerAngle(e)\r\n if(pointerAngle === null){\r\n this.rotationStartAngle = null\r\n return\r\n }\r\n this.rotationStartAngle = pointerAngle\r\n this.widgetRotationStart = this.widgetRotation\r\n }\r\n\r\n private calculatePointerAngle(e: MouseEvent): number | null{\r\n if(!this.widgetContainer) return null\r\n const rect = this.widgetContainer.getBoundingClientRect()\r\n const centerX = rect.left + rect.width / 2\r\n const centerY = rect.top + rect.height / 2\r\n\r\n return Math.atan2(e.clientX - centerX, centerY - e.clientY)\r\n }\r\n\r\n}\r\n","\r\nexport class LinkElement2d3d{\r\n private engine:any;\r\n // 是否启用状态\r\n private enabled: boolean = true;\r\n\r\n constructor(engine:any){\r\n this.engine = engine\r\n this.active()\r\n }\r\n\r\n /**\r\n * 切换启用状态\r\n */\r\n public toggle(): boolean {\r\n this.enabled = !this.enabled\r\n if (this.enabled) {\r\n this.active()\r\n } else {\r\n this.disActive()\r\n }\r\n return this.enabled\r\n }\r\n\r\n /**\r\n * 获取启用状态\r\n */\r\n public isEnabled(): boolean {\r\n return this.enabled\r\n }\r\n\r\n // 激活\r\n private active(){\r\n window.addEventListener('D3ElementClick', this.listenElementClick);\r\n }\r\n // 取消\r\n private disActive(){\r\n window.removeEventListener('D3ElementClick', this.listenElementClick);\r\n }\r\n\r\n\r\n private readonly listenElementClick = (res:any) => {\r\n let id = res.detail.id.toString()\r\n // 判断一下我的模型里面有没有\r\n var node = this.engine.loaderModule2d.model.nodeMap.get(id)\r\n if(node!=null){\r\n this.engine.modelToolModule2d.highlightModel([id])\r\n \r\n this.engine.cameraModule2d.fitToExtents({\r\n min:[node[0].min.x,node[0].min.y],\r\n max:[node[0].max.x,node[0].max.y]\r\n },3);\r\n\r\n }else{\r\n this.engine.modelToolModule2d.unhighlightAllModels()\r\n }\r\n } \r\n}","import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\nimport * as THREE from 'three';\r\n\r\n/** 负责 2D 模型的高亮、悬浮高亮和显隐控制。 */\r\nexport class ModelToolModule2d {\r\n private engine: any;\r\n private highlightMaterial: THREE.MeshBasicMaterial;\r\n private hideMaterial: THREE.MeshBasicMaterial;\r\n private translucentMaterial: THREE.MeshBasicMaterial;\r\n private readonly lightBackgroundWhiteColor = 0x000000;\r\n private readonly darkBackgroundWhiteColor = 0xffffff;\r\n private readonly maxHoverLineCoordinateCount = 30000;\r\n private readonly maxHoverMeshVertexCount = 30000;\r\n\r\n constructor(engine_: any) {\r\n this.engine = engine_;\r\n this.highlightMaterial = new THREE.MeshBasicMaterial({\r\n color: 0x00aaff,\r\n depthTest: false,\r\n depthWrite: false,\r\n transparent: true,\r\n opacity: 0.5,\r\n side: THREE.DoubleSide,\r\n });\r\n this.hideMaterial = new THREE.MeshBasicMaterial({\r\n color: 0x000000,\r\n transparent: true,\r\n opacity: 0,\r\n side: THREE.DoubleSide,\r\n });\r\n this.translucentMaterial = new THREE.MeshBasicMaterial({\r\n color: this.getHoverHighlightColor(),\r\n depthTest: false,\r\n depthWrite: false,\r\n transparent: true,\r\n opacity: 0.5,\r\n side: THREE.DoubleSide,\r\n });\r\n\r\n this.highlightMaterial.clippingPlanes = this.engine.sectionPlane;\r\n this.hideMaterial.clippingPlanes = this.engine.sectionPlane;\r\n this.translucentMaterial.clippingPlanes = this.engine.sectionPlane;\r\n }\r\n\r\n /** 拆分合并网格,让单个子几何可以通过 materialIndex 独立高亮或隐藏。 */\r\n public split_merge_model(model: any): void {\r\n if (model.isSplit || model instanceof THREE.InstancedMesh) {\r\n return;\r\n }\r\n const material = model.materialClone.clone();\r\n const newGeometry = Array.isArray(model.geometrys) && model.geometrys.length > 0\r\n ? BufferGeometryUtils.mergeGeometries(model.geometrys, true)\r\n : model.geometry;\r\n newGeometry.groups.forEach((item: any) => {\r\n item.materialIndex = 0;\r\n });\r\n model.geometry = newGeometry;\r\n model.material = [material, this.highlightMaterial, this.translucentMaterial];\r\n model.needsUpdate = true;\r\n model.isSplit = true;\r\n }\r\n\r\n public un_split_merge_model(_model: any): void {}\r\n\r\n /** 分组加载后 nodeMap 直接保存真实对象;旧索引只作为兼容兜底。 */\r\n private getNodeObject(node: any): any {\r\n return node?.object ?? node?.group?.children?.[node.indexes?.[0]] ?? this.engine.modelGroup.children[node.indexes?.[0]];\r\n }\r\n\r\n /** 根据 nodeMap 遍历指定模型节点。 */\r\n private forEachNode(models: any, callback: (node: any, object: any, id: any) => void): void {\r\n (models ?? []).forEach((id: any) => {\r\n const nodes = this.engine.loaderModule2d.model.nodeMap.get(String(id)) ?? this.engine.loaderModule2d.model.nodeMap.get(id);\r\n if (nodes == null) return;\r\n nodes.forEach((node: any) => {\r\n if (node == null || node.indexes == null) return;\r\n const object = this.getNodeObject(node);\r\n if (object == null) return;\r\n callback(node, object, id);\r\n });\r\n });\r\n }\r\n\r\n /** 根据当前 2D 背景亮度选择 hover 高亮色,浅色背景避免继续使用白色。 */\r\n private getHoverHighlightColor(): number {\r\n const background = this.engine.scene?.background;\r\n if (background instanceof THREE.Color) {\r\n const luminance = 0.299 * background.r + 0.587 * background.g + 0.114 * background.b;\r\n return luminance > 0.5 ? 0x66c7ff : 0xffffff;\r\n }\r\n\r\n return this.engine.themeManager?.getTheme?.() === 'light' ? 0x66c7ff : 0xffffff;\r\n }\r\n\r\n /** 白色背景下把原始白色图元显示为黑色,切回黑色背景时恢复白色。 */\r\n public updateColorsForBackground(backgroundColor: number): void {\r\n const isLightBackground = this.isLightBackground(backgroundColor);\r\n this.engine.modelGroup?.traverse?.((object: any) => {\r\n this.updateObjectMaterialColor(object, isLightBackground);\r\n this.updateVertexColors(object, isLightBackground);\r\n });\r\n }\r\n\r\n /** 图层面板和场景对象共享同一套白色转黑色规则。 */\r\n public getDisplayColor(color: number): number {\r\n return this.isCurrentBackgroundLight() && this.isWhiteColor(color) ? this.lightBackgroundWhiteColor : color;\r\n }\r\n\r\n private updateObjectMaterialColor(object: any, isLightBackground: boolean): void {\r\n const originalColor = this.resolveOriginalColor(object);\r\n if (originalColor == null || !this.isWhiteColor(originalColor)) return;\r\n\r\n const displayColor = isLightBackground ? this.lightBackgroundWhiteColor : this.darkBackgroundWhiteColor;\r\n const applyColor = (material: any): void => {\r\n if (material?.color) material.color.setHex(displayColor);\r\n };\r\n\r\n if (Array.isArray(object.material)) object.material.forEach(applyColor);\r\n else applyColor(object.material);\r\n applyColor(object.materialClone);\r\n }\r\n\r\n private updateVertexColors(object: any, isLightBackground: boolean): void {\r\n const geometry = object.geometry as THREE.BufferGeometry | undefined;\r\n const colorAttribute = geometry?.getAttribute('color') as THREE.BufferAttribute | undefined;\r\n if (!geometry || !colorAttribute) return;\r\n\r\n if (!object.userData.originalColorAttribute) {\r\n object.userData.originalColorAttribute = colorAttribute.clone();\r\n }\r\n\r\n const source = object.userData.originalColorAttribute as THREE.BufferAttribute;\r\n const values = colorAttribute.array as ArrayLike<number> & { [index: number]: number };\r\n for (let index = 0; index < source.count; index += 1) {\r\n const r = source.getX(index);\r\n const g = source.getY(index);\r\n const b = source.getZ(index);\r\n const replaceWhite = isLightBackground && this.isWhiteRgb(r, g, b);\r\n values[index * 3] = replaceWhite ? 0 : r;\r\n values[index * 3 + 1] = replaceWhite ? 0 : g;\r\n values[index * 3 + 2] = replaceWhite ? 0 : b;\r\n }\r\n colorAttribute.needsUpdate = true;\r\n }\r\n\r\n private resolveOriginalColor(object: any): number | null {\r\n if (typeof object.userData?.originalDisplayColor === 'number') return object.userData.originalDisplayColor;\r\n\r\n const [layerName, colorText] = String(object.name ?? '').split('||');\r\n let color = Number.parseInt(colorText);\r\n if (color === 0 || Number.isNaN(color)) {\r\n const layer = this.engine.loaderModule2d?.model?.layers?.find((item: any) => item.name === layerName);\r\n color = layer?.color;\r\n }\r\n if (typeof color !== 'number' || Number.isNaN(color)) return null;\r\n\r\n object.userData.originalDisplayColor = color;\r\n return color;\r\n }\r\n\r\n private isCurrentBackgroundLight(): boolean {\r\n const background = this.engine.scene?.background;\r\n if (background instanceof THREE.Color) {\r\n return 0.299 * background.r + 0.587 * background.g + 0.114 * background.b > 0.5;\r\n }\r\n return this.engine.themeManager?.getTheme?.() === 'light';\r\n }\r\n\r\n private isLightBackground(backgroundColor: number): boolean {\r\n const color = new THREE.Color(backgroundColor);\r\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b > 0.5;\r\n }\r\n\r\n private isWhiteColor(color: number): boolean {\r\n return (color & 0xffffff) === 0xffffff;\r\n }\r\n\r\n private isWhiteRgb(r: number, g: number, b: number): boolean {\r\n return r > 0.99 && g > 0.99 && b > 0.99;\r\n }\r\n\r\n public highlightModelHover(models: any[]): void {\r\n models = this.filterVisibleLayerModels(models);\r\n models = this.filterHoverableModels(models);\r\n this.unHighlightModelHover();\r\n if (models.length === 0) return;\r\n this.engine.engineStatus2d.highlightHoverModels = models;\r\n this.translucentMaterial.color.setHex(this.getHoverHighlightColor());\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const line: any = object;\r\n const ps = line.clonePoints.slice(node.indexes[1], node.indexes[2]);\r\n this.highLightRenderLineHover(ps);\r\n } else {\r\n // 面、文字、填充等大图块 hover 只切换 group 材质索引,避免每次悬浮都复制大段 geometry。\r\n this.split_merge_model(object);\r\n const group = object.geometry?.groups?.[node.indexes[1]];\r\n if (group) group.materialIndex = 2;\r\n }\r\n });\r\n }\r\n\r\n public unHighlightModelHover(): void {\r\n const hoverModels = this.engine.engineStatus2d.highlightHoverModels ?? [];\r\n const selectedIds = new Set((this.engine.engineStatus2d.highlightModels ?? []).map((id: any) => String(id)));\r\n this.forEachNode(hoverModels, (node, object, id) => {\r\n if (object instanceof THREE.LineSegments) return;\r\n const group = object.geometry?.groups?.[node.indexes[1]];\r\n if (!group) return;\r\n group.materialIndex = selectedIds.has(String(id)) ? 1 : 0;\r\n });\r\n this.engine.engineStatus2d.highlightHoverModels = [];\r\n this.unhighLightRenderLineHover();\r\n }\r\n\r\n /** 设置模型高亮。 */\r\n public highlightModel(models: any): void {\r\n models = this.filterVisibleLayerModels(models);\r\n if (models.length === 0) return;\r\n this.unHighlightModelHover();\r\n this.engine.engineStatus2d.highlightModels = models;\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const line: any = object;\r\n const ps = line.clonePoints.slice(node.indexes[1], node.indexes[2]);\r\n this.highLightRenderLine(ps);\r\n } else {\r\n this.split_merge_model(object);\r\n object.geometry.groups[node.indexes[1]].materialIndex = 1;\r\n }\r\n });\r\n }\r\n\r\n /** 取消指定模型高亮。 */\r\n public unhighlightModel(models: any): void {\r\n this.forEachNode(models, (node, object) => {\r\n if (!(object instanceof THREE.LineSegments)) {\r\n object.geometry.groups[node.indexes[1]].materialIndex = 0;\r\n }\r\n });\r\n this.unhighLightRenderLine();\r\n }\r\n\r\n /** 取消全部模型高亮。 */\r\n public unhighlightAllModels(isClear: boolean = true): void {\r\n this.engine.engineStatus2d.highlightModels.forEach((model: any) => {\r\n this.unhighlightModel([model]);\r\n });\r\n if (isClear) {\r\n this.engine.engineStatus2d.highlightModels = [];\r\n }\r\n }\r\n\r\n /** 隐藏模型。 */\r\n public hideModel(models: any): void {\r\n this.unhighlightAllModels();\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const positions = object.geometry.attributes.position.array;\r\n for (let index = node.indexes[1]; index < node.indexes[2]; index += 1) {\r\n positions[index] = NaN;\r\n }\r\n object.geometry.attributes.position.needsUpdate = true;\r\n } else {\r\n this.split_merge_model(object);\r\n object.geometry.groups[node.indexes[1]].materialIndex = -1;\r\n }\r\n });\r\n this.engine.engineStatus2d.hideModels.push(...models);\r\n }\r\n\r\n /** 显示模型。 */\r\n public showModel(models: any): void {\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const positions = object.geometry.attributes.position.array;\r\n const line: any = object;\r\n for (let index = node.indexes[1]; index < node.indexes[2]; index += 1) {\r\n positions[index] = line.clonePoints[index];\r\n }\r\n object.geometry.attributes.position.needsUpdate = true;\r\n } else {\r\n this.split_merge_model(object);\r\n object.geometry.groups[node.indexes[1]].materialIndex = 0;\r\n }\r\n });\r\n this.engine.engineStatus2d.hideModels = [];\r\n }\r\n\r\n /** 显示所有模型,恢复隐藏和高亮状态。 */\r\n public showAllModels(): void {\r\n if (this.engine.engineStatus2d.hideModels && this.engine.engineStatus2d.hideModels.length > 0) {\r\n this.showModel(this.engine.engineStatus2d.hideModels);\r\n }\r\n this.engine.engineStatus2d.hideModels = [];\r\n this.unhighlightAllModels();\r\n }\r\n\r\n /** 渲染线段高亮覆盖层。 */\r\n public highLightRenderLine(ps: ArrayLike<number>): void {\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(ps, 3));\r\n const material = new THREE.LineBasicMaterial({\r\n color: 0x00aaff,\r\n depthTest: false,\r\n depthWrite: false,\r\n });\r\n const lines = new THREE.LineSegments(geometry, material);\r\n lines.name = 'HighLight';\r\n lines.renderOrder = 999;\r\n this.engine.modelGroup.add(lines);\r\n }\r\n\r\n public unhighLightRenderLine(): void {\r\n this.engine.modelGroup.children.filter((child: any) => child.name === 'HighLight').forEach((child: any) => {\r\n this.engine.modelGroup.remove(child);\r\n this.disposeTemporaryObject(child);\r\n });\r\n }\r\n\r\n /** 渲染悬浮线段高亮覆盖层。 */\r\n public highLightRenderLineHover(ps: ArrayLike<number>): void {\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(ps, 3));\r\n const material = new THREE.LineBasicMaterial({\r\n color: this.getHoverHighlightColor(),\r\n depthTest: false,\r\n depthWrite: false,\r\n });\r\n const lines = new THREE.LineSegments(geometry, material);\r\n lines.name = 'HighLightHover';\r\n lines.renderOrder = 999;\r\n this.engine.modelGroup.add(lines);\r\n }\r\n\r\n public unhighLightRenderLineHover(): void {\r\n this.engine.modelGroup.children.filter((child: any) => child.name === 'HighLightHover').forEach((child: any) => {\r\n this.engine.modelGroup.remove(child);\r\n this.disposeTemporaryObject(child);\r\n });\r\n }\r\n\r\n /** 移除临时高亮对象时同步释放几何和材质,避免交互后内存残留。 */\r\n private disposeTemporaryObject(object: any): void {\r\n object.geometry?.dispose?.();\r\n const material = object.material;\r\n const disposeMaterial = (item: any): void => {\r\n if (item === this.highlightMaterial || item === this.translucentMaterial || item === this.hideMaterial) return;\r\n item?.dispose?.();\r\n };\r\n if (Array.isArray(material)) material.forEach(disposeMaterial);\r\n else disposeMaterial(material);\r\n }\r\n\r\n /** 图层隐藏的图元不能再被 hover 或选中高亮。 */\r\n private filterVisibleLayerModels(models: any[]): any[] {\r\n return (models ?? []).filter((id: any) => this.engine.layerManager?.isModelVisibleByLayer?.(id) !== false);\r\n }\r\n\r\n /** 过大的图块跳过 hover 高亮,保留点击选中,避免大几何在鼠标移动中反复触发高成本操作。 */\r\n private filterHoverableModels(models: any[]): any[] {\r\n return (models ?? []).filter((id: any) => this.isHoverableModel(id));\r\n }\r\n\r\n private isHoverableModel(id: any): boolean {\r\n const nodes = this.engine.loaderModule2d.model.nodeMap.get(String(id)) ?? this.engine.loaderModule2d.model.nodeMap.get(id);\r\n if (!nodes || nodes.length === 0) return false;\r\n\r\n let lineCoordinateCount = 0;\r\n let meshVertexCount = 0;\r\n for (const node of nodes) {\r\n if (node == null || node.indexes == null) continue;\r\n const object = this.getNodeObject(node);\r\n if (object instanceof THREE.LineSegments) {\r\n lineCoordinateCount += Math.max(0, (node.indexes[2] ?? 0) - (node.indexes[1] ?? 0));\r\n if (lineCoordinateCount > this.maxHoverLineCoordinateCount) return false;\r\n continue;\r\n }\r\n\r\n const group = object?.geometry?.groups?.[node.indexes[1]];\r\n meshVertexCount += group?.count ?? 0;\r\n if (meshVertexCount > this.maxHoverMeshVertexCount) return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","import * as THREE from 'three';\n/**\r\n * 行为处理器 - 管理引擎的交互行为(鼠标、键盘事件等)\r\n * @param engine 引擎实例\r\n * @returns 行为处理器对象\r\n */\r\nexport function HandelBehaved2d(engine: any) {\r\n\r\n\t// 行为处理器内部状态\r\n\tconst _handelBehaved: any = {\n\t\tmouseMoveFrame: null as number | null,\n\t\tlatestMouseMoveEvent: null as any,\n\t\tself: null as any, // 当前激活的行为对象\r\n\t\toptions: null as any, // 行为配置选项\r\n\t\tmouseDownTime: 0, // 鼠标按下时的时间戳\r\n\t\tmouseDownPosition:null, // 鼠标按下的位置\r\n\t\tlastClickTime: 0, // 上次点击时间\r\n\t};\r\n\r\n\t/**\r\n\t * 初始化行为处理器\r\n\t * @param self 要激活的行为对象\r\n\t * @param options 行为配置选项\r\n\t */\r\n\t_handelBehaved.init = function(self: any, options: any): void {\r\n\t\t// 关闭上一个功能\r\n\t\tif (_handelBehaved.self != null && _handelBehaved.self.disActive != null&&_handelBehaved.self.type!=self.type) {\r\n\t\t\t_handelBehaved.self.disActive();\r\n\t\t}\r\n\t\t_handelBehaved.self = self;\r\n\t\t// 一些基本配置\r\n\t\tif(options == null){\r\n\t\t\toptions = {\r\n\t\t\t\tshowCatch: false,\r\n\t\t\t}\r\n\t\t}\r\n\t\t_handelBehaved.options = options;\r\n\t};\r\n\r\n\t/**\r\n\t * 刷帧 - 调用当前行为对象的渲染方法\r\n\t */\r\n\t_handelBehaved.render = function(): void {\r\n\t\tif (_handelBehaved.self && _handelBehaved.self.render != null) {\r\n\t\t\t_handelBehaved.self.render();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 开启事务 - 激活事件监听(同时支持桌面端和移动端)\r\n\t */\r\n\t_handelBehaved.active = function(): void { \r\n\t\t// 恢复控制器 - 桌面端鼠标事件\r\n\t\tengine.renderer.domElement.addEventListener('mousedown', handle_Mouse_Down);\r\n\t\tengine.renderer.domElement.addEventListener('mouseup', handle_Mouse_Up);\r\n\t\tengine.renderer.domElement.addEventListener('mousemove', handle_Mouse_Move); \r\n\t\t// 移动端触摸事件\r\n\t\tengine.renderer.domElement.addEventListener('touchstart', handle_Touch_Start, { passive: false });\r\n\t\tengine.renderer.domElement.addEventListener('touchend', handle_Touch_End, { passive: false });\r\n\t\tengine.renderer.domElement.addEventListener('touchmove', handle_Touch_Move, { passive: false });\r\n\t\t// 键盘事件\r\n\t\twindow.addEventListener('keydown', handle_key_down);\r\n\t\twindow.addEventListener('keyup', handle_key_up);\r\n\t};\r\n\r\n\t/**\r\n\t * 关闭事务 - 禁用事件监听(同时支持桌面端和移动端)\r\n\t */\r\n\t_handelBehaved.disActive = function(): void {\r\n\t\t// 禁用控制器 - 桌面端鼠标事件\r\n\t\tengine.renderer.domElement.removeEventListener('mousedown', handle_Mouse_Down);\r\n\t\tengine.renderer.domElement.removeEventListener('mouseup', handle_Mouse_Up);\r\n\t\tengine.renderer.domElement.removeEventListener('mousemove', handle_Mouse_Move);\r\n\t\t// 移动端触摸事件\r\n\t\tengine.renderer.domElement.removeEventListener('touchstart', handle_Touch_Start);\r\n\t\tengine.renderer.domElement.removeEventListener('touchend', handle_Touch_End);\r\n\t\tengine.renderer.domElement.removeEventListener('touchmove', handle_Touch_Move);\r\n\t\t// 键盘事件\r\n\t\twindow.removeEventListener('keydown', handle_key_down);\r\n\t\twindow.removeEventListener('keyup', handle_key_up); \n\t\tif (_handelBehaved.mouseMoveFrame != null) {\n\t\t\tcancelAnimationFrame(_handelBehaved.mouseMoveFrame);\n\t\t\t_handelBehaved.mouseMoveFrame = null;\n\t\t\t_handelBehaved.latestMouseMoveEvent = null;\n\t\t}\n\t};\n\r\n\t/**\r\n\t * 处理键盘按下事件\r\n\t * @param event 键盘事件对象\r\n\t */\r\n\tfunction handle_key_down(event: any): void {\r\n\t\t// 处理删除键(Backspace: 8, Delete: 46)\r\n\t\tif (event.keyCode === 8 || event.keyCode === 46) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyDeleteDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyDeleteDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// esc\r\n\t\tif (event.keyCode === 27) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyEscDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyEscDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// enter\r\n\t\tif (event.keyCode === 13) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyEnterDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyEnterDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// space\r\n\t\tif (event.keyCode === 32) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeySpaceDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeySpaceDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// ctrl\r\n\t\tif (event.key === 'Control') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyCtrlDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyCtrlDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// delete\r\n\t\tif (event.key === 'Delete') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyDeleteDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyDeleteDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// shift\r\n\t\tif (event.key === 'Shift') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyShiftDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyShiftDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// meta\r\n\t\tif (event.key === 'Meta') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyMetaDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyMetaDown();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfunction handle_key_up(event: any): void { \r\n\t\t// alt\r\n\t\tif (event.key === 'Alt') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyAltUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyAltUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// tab\r\n\t\tif (event.key === 'Tab') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyTabUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyTabUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// ctrl\r\n\t\tif (event.key === 'Control') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyCtrlUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyCtrlUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// shift\r\n\t\tif (event.key === 'Shift') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyShiftUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyShiftUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// meta\r\n\t\tif (event.key === 'Meta') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyMetaUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyMetaUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// command\r\n\t\tif (event.key === 'Command') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyCommandUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyCommandUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// windows\r\n\t\tif (event.key === 'Windows') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyWindowsUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyWindowsUp();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 将鼠标事件坐标转换为标准化设备坐标(NDC)\r\n\t * @param event 鼠标事件对象\r\n\t * @returns 标准化后的鼠标坐标\r\n\t */\r\n\tfunction getNormalizedMousePosition(event: any): THREE.Vector2 {\r\n\t\tconst mouse = new THREE.Vector2();\r\n\t\tconst width = engine.renderer.domElement.clientWidth;\r\n\t\tconst height = engine.renderer.domElement.clientHeight;\r\n\t\tmouse.x = (event.offsetX / width) * 2 - 1;\r\n\t\tmouse.y = -(event.offsetY / height) * 2 + 1; \r\n\t\treturn mouse;\r\n\t}\r\n\r\n\t/**\r\n\t * 创建射线投射器并设置从相机到鼠标位置的射线\r\n\t * @param event 鼠标事件对象\r\n\t * @returns 配置好的射线投射器\r\n\t */\r\n\tfunction createRaycaster(event: any): THREE.Raycaster {\r\n\t\tconst raycaster = new THREE.Raycaster();\r\n\t\tconst mouse = getNormalizedMousePosition(event);\r\n\t\traycaster.setFromCamera(mouse, engine.camera);\r\n\t\treturn raycaster;\r\n\t}\r\n\r\n\t/**\r\n\t * 为事件对象添加射线投射器和捕捉结果\r\n\t * @param event 鼠标事件对象\r\n\t * @param includeCatch 是否包含捕捉结果\r\n\t */\r\n\tfunction enrichEventWithRaycast(event: any, includeCatch: boolean = false): void {\r\n\t\tconst raycaster = createRaycaster(event);\r\n\t\tevent.raycaster = raycaster;\r\n\t\tif (includeCatch) {\r\n\t\t\tconst catchResult = handle_catch(raycaster,event);\r\n\t\t\tevent.catch = catchResult;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 鼠标按下事件处理\r\n\t * @param event 鼠标事件对象\r\n\t */\r\n\tfunction handle_Mouse_Down(event: any): void {\r\n\t\t// 只处理左键(button === 0)\r\n\t\tif (event.button !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// 记录鼠标按下的时间\r\n\t\t_handelBehaved.mouseDownTime = Date.now();\r\n\t\t_handelBehaved.mouseDownPosition = new THREE.Vector3(event.offsetX,event.offsetY,0)\r\n\t\t \r\n\r\n\r\n\t\t// 如果当前行为对象有处理鼠标按下的方法,则调用\r\n\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseDown != null) { \r\n\t\t\tengine.engineStatus.isFree = true\r\n\t\t\tenrichEventWithRaycast(event, true); \r\n\t\t\tif(event.catch!=null){\r\n\t\t\t\tengine.controlModule.orbitControls.origin.set(event.catch.point.x,event.catch.point.y,event.catch.point.z)\r\n\t\t\t}\r\n\t\t\t_handelBehaved.self.handleMouseDown(event); \r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 鼠标移动事件处理\r\n\t * @param event 鼠标事件对象\r\n\t */\r\n\tfunction handle_Mouse_Move(event: any): void {\n\t\t_handelBehaved.latestMouseMoveEvent = event;\n\t\tif (_handelBehaved.mouseMoveFrame != null) return;\n\n\t\t// hover 拾取和高亮成本较高,合并到每帧最多执行一次,避免大图块在高频 mousemove 下阻塞主线程。\n\t\t_handelBehaved.mouseMoveFrame = requestAnimationFrame(() => {\n\t\t\tconst currentEvent = _handelBehaved.latestMouseMoveEvent;\n\t\t\t_handelBehaved.latestMouseMoveEvent = null;\n\t\t\t_handelBehaved.mouseMoveFrame = null;\n\t\t\tif (!currentEvent) return;\n\n\t\t\tcurrentEvent.isHover = true;\n\t\t\tenrichEventWithRaycast(currentEvent, true);\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseMove != null) {\n\t\t\t\t_handelBehaved.self.handleMouseMove(currentEvent);\n\t\t\t}\n\t\t});\n\t\treturn;\n\t}\n\r\n\t/**\r\n\t * 鼠标弹起事件处理\r\n\t * @param event 鼠标事件对象\r\n\t */\r\n\tfunction handle_Mouse_Up(event: any): void {\r\n\t\t// 只处理左键(button === 0)\r\n\t\tif (event.button !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// 计算鼠标按下到弹起的时间差\r\n\t\tconst nowTime = Date.now();\r\n\t\tconst timeDiff = nowTime - _handelBehaved.mouseDownTime;\r\n\t\tconst current_position = new THREE.Vector3(event.offsetX,event.offsetY,0)\r\n\t\t\r\n\t\t// 如果当前行为对象有处理鼠标弹起的方法,则调用\r\n\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseUp != null) {\r\n\t\t\tenrichEventWithRaycast(event, false);\r\n\t\t\t_handelBehaved.self.handleMouseUp(event);\r\n\t\t}\r\n\t\tconst dis = current_position.distanceTo(_handelBehaved.mouseDownPosition); \r\n\t\t// 判断是否为单击(按下到弹起的时间小于100毫秒)\r\n\t\tif (timeDiff < 100 || dis==0) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseClick != null) {\r\n\t\t\t\tenrichEventWithRaycast(event, true); \r\n\t\t\t\tconst timeDiff_double = nowTime - _handelBehaved.lastClickTime; \r\n\t\t\t\tif(timeDiff_double < 200) { \r\n\t\t\t\t\t// 双击\r\n\t\t\t\t\tif(_handelBehaved.self.handleMouseDoubleClick != null){\r\n\t\t\t\t\t\t_handelBehaved.self.handleMouseDoubleClick(event);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse{ \r\n\t\t\t\t\t// 单击\r\n\t\t\t\t\tif(_handelBehaved.self.handleMouseClick != null){ \r\n\t\t\t\t\t\t_handelBehaved.self.handleMouseClick(event);\r\n\t\t\t\t\t}\r\n\t\t\t\t} \r\n\t\t\t\t_handelBehaved.lastClickTime = Date.now();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 将触摸事件转换为鼠标事件格式\r\n\t * @param touchEvent 触摸事件对象\r\n\t * @returns 转换后的鼠标事件格式对象\r\n\t */\r\n\tfunction convertTouchToMouseEvent(touchEvent: TouchEvent): any {\r\n\t\t// 获取第一个触摸点\r\n\t\tconst touch = touchEvent.touches[0] || touchEvent.changedTouches[0];\r\n\t\tif (!touch) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// 获取 canvas 元素的位置信息\r\n\t\tconst canvas = engine.renderer.domElement;\r\n\t\tconst rect = canvas.getBoundingClientRect();\r\n\r\n\t\t// 计算相对于 canvas 的坐标\r\n\t\tconst offsetX = touch.clientX - rect.left;\r\n\t\tconst offsetY = touch.clientY - rect.top;\r\n\r\n\t\t// 创建类似鼠标事件的对象\r\n\t\tconst mouseEvent = {\r\n\t\t\toffsetX: offsetX,\r\n\t\t\toffsetY: offsetY,\r\n\t\t\tbutton: 0, // 模拟左键\r\n\t\t\tclientX: touch.clientX,\r\n\t\t\tclientY: touch.clientY,\r\n\t\t\tpreventDefault: () => touchEvent.preventDefault(),\r\n\t\t\tstopPropagation: () => touchEvent.stopPropagation(),\r\n\t\t\toriginalEvent: touchEvent // 保留原始触摸事件\r\n\t\t};\r\n\r\n\t\treturn mouseEvent;\r\n\t}\r\n\r\n\t/**\r\n\t * 触摸开始事件处理(移动端)\r\n\t * @param event 触摸事件对象\r\n\t */\r\n\tfunction handle_Touch_Start(event: TouchEvent): void {\r\n\t\t// 阻止默认行为,避免页面滚动\r\n\t\tevent.preventDefault();\r\n\t\t\r\n\t\t// 只处理单点触摸\r\n\t\tif (event.touches.length !== 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// 将触摸事件转换为鼠标事件格式\r\n\t\tconst mouseEvent = convertTouchToMouseEvent(event);\r\n\t\tif (mouseEvent) {\r\n\t\t\t// 调用鼠标按下处理函数\r\n\t\t\thandle_Mouse_Down(mouseEvent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 触摸移动事件处理(移动端)\r\n\t * @param event 触摸事件对象\r\n\t */\r\n\tfunction handle_Touch_Move(event: TouchEvent): void {\r\n\t\t// 阻止默认行为,避免页面滚动\r\n\t\tevent.preventDefault();\r\n\t\t\r\n\t\t// 只处理单点触摸\r\n\t\tif (event.touches.length !== 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// 将触摸事件转换为鼠标事件格式\r\n\t\tconst mouseEvent = convertTouchToMouseEvent(event);\r\n\t\tif (mouseEvent) {\r\n\t\t\t// 调用鼠标移动处理函数\r\n\t\t\thandle_Mouse_Move(mouseEvent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 触摸结束事件处理(移动端)\r\n\t * @param event 触摸事件对象\r\n\t */\r\n\tfunction handle_Touch_End(event: TouchEvent): void {\r\n\t\t// 阻止默认行为\r\n\t\tevent.preventDefault();\r\n\t\t\r\n\t\t// 将触摸事件转换为鼠标事件格式(使用 changedTouches,因为 touchend 时 touches 可能为空)\r\n\t\tconst mouseEvent = convertTouchToMouseEvent(event);\r\n\t\tif (mouseEvent) {\r\n\t\t\t// 调用鼠标弹起处理函数\r\n\t\t\thandle_Mouse_Up(mouseEvent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 捕捉功能 - 通过射线投射检测与模型的交点\r\n\t * @param raycaster 射线投射器\r\n\t * @returns 捕捉结果(包含交点和法线),如果没有交点则返回 undefined\r\n\t */\r\n\tfunction handle_catch(raycaster: any,event: any): any { \r\n\t\tvar id = engine.octreeBox2d.pick2d(raycaster,event); \n\t\tif(id==null){\r\n\t\t\treturn null\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tpoint:null,\r\n\t\t\tid:id\r\n\t\t} \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t}\r\n\treturn _handelBehaved;\r\n}\r\n","/**\r\n * 鼠标坐标显示 UI 组件\r\n * 在容器左下角实时显示鼠标世界坐标\r\n */\r\nexport class MouseCoordUI {\r\n private el: HTMLElement;\r\n private xEl: HTMLElement;\r\n private yEl: HTMLElement;\r\n\r\n constructor(container: HTMLElement) {\r\n this.el = document.createElement('div');\r\n this.el.className = 'engine-2d-mouse-coord';\r\n\r\n const label = document.createElement('span');\r\n label.className = 'engine-2d-mouse-coord__label';\r\n label.textContent = '';\r\n\r\n this.xEl = document.createElement('span');\r\n this.xEl.className = 'engine-2d-mouse-coord__value';\r\n this.xEl.textContent = 'X: --';\r\n\r\n this.yEl = document.createElement('span');\r\n this.yEl.className = 'engine-2d-mouse-coord__value';\r\n this.yEl.textContent = 'Y: --';\r\n\r\n this.el.appendChild(label);\r\n this.el.appendChild(this.xEl);\r\n this.el.appendChild(this.yEl);\r\n\r\n container.appendChild(this.el);\r\n }\r\n\r\n public update(x: number, y: number): void {\r\n this.xEl.textContent = `X: ${x.toFixed(0)} mm`;\r\n this.yEl.textContent = `Y: ${y.toFixed(0)} mm`;\r\n }\r\n\r\n public reset(): void {\r\n this.xEl.textContent = 'X: --';\r\n this.yEl.textContent = 'Y: --';\r\n }\r\n\r\n public dispose(): void {\r\n this.el.parentElement?.removeChild(this.el);\r\n }\r\n}\r\n","/**\r\n * 事件类型枚举\r\n */\r\nexport enum EventType {\r\n // 资源类\r\n ModelLoadStart = 'model-load-start',\r\n ModelLoadProgress = 'model-load-progress',\r\n ModelLoaded = 'model-loaded',\r\n ModelError = 'model-error',\r\n\r\n // 交互类\r\n SelectionChanged = 'selection-changed', // data: { ids: string[], modelId: string }\r\n HoverChanged = 'hover-changed', // data: { id: string | null, point: Vector3 }\r\n Click = 'click', // data: MouseEventData\r\n MouseMove = 'mouse-move', // data: MouseEventData - 鼠标移动事件\r\n\r\n // 视图类\r\n CameraChanged = 'camera-changed', // 相机移动时持续触发\r\n CameraIdle = 'camera-idle', // 相机静止后触发\r\n\r\n // 引擎状态\r\n EngineFree = 'engine-free',\r\n EngineBusy = 'engine-busy',\r\n\r\n\r\n // 业务类\r\n // 测量值变化\r\n MeasureChanged = 'measure-changed',\r\n MeasureClick = \"measure-click\",\r\n // 剖切值变化\r\n SectionMove = \"section-move\"\r\n}","import { MouseCoordUI } from '../ui/mouseCoordUI';\r\nimport { EventType } from '../enum/eventType';\r\nexport class InteractionModule2d {\r\n private engine: any;\r\n private behavior: any;\r\n private mouseCoordUI: MouseCoordUI | null = null;\r\n\r\n constructor(engine: any){\r\n this.engine = engine;\r\n }\r\n\r\n\r\n public init(){\r\n this.behavior = this.engine.handelBehaved2d;\r\n this.behavior.init(this)\r\n\r\n const container = this.engine.container as HTMLElement;\r\n // 坐标状态栏默认开启,宿主可在初始化时关闭。\r\n if (container && this.engine.options?.showMouseCoordinates !== false) {\r\n this.mouseCoordUI = new MouseCoordUI(container);\r\n }\r\n }\r\n\r\n\r\n public active(){\r\n this.behavior.active();\r\n }\r\n\r\n public disActive(){\r\n this.behavior.disActive();\r\n }\r\n\r\n // 鼠标移动时,触发模型高亮\r\n private oldId = null\r\n public handleMouseMove(event: any){\r\n if (this.mouseCoordUI && this.engine.cameraModule2d) {\r\n const world = this.engine.cameraModule2d.screenToWorld(event.offsetX, event.offsetY);\r\n this.mouseCoordUI.update(world.x*1000, world.y*1000);\r\n }\r\n // 实现悬浮特效\r\n if(event.catch==null || event.catch.id==null){\r\n this.engine.modelToolModule2d.unHighlightModelHover()\r\n this.oldId =null\r\n return;\r\n }\r\n // 准备高亮模型\r\n let id = event.catch.id;\r\n if (!this.isModelInteractive(id)) {\r\n this.engine.modelToolModule2d.unHighlightModelHover()\r\n this.oldId = null\r\n return\r\n }\r\n if(this.oldId==id){\r\n return\r\n }else{\r\n this.engine.modelToolModule2d.highlightModelHover([id]);\r\n this.oldId = id;\r\n } \r\n }\r\n\r\n // esc 按下,取消高亮\r\n public handelKeyEscDown(_event:any){\r\n this.engine.modelToolModule2d.unhighlightAllModels() \r\n }\r\n\r\n /** 空白处双击恢复到整图适配视角,不影响双击图元的后续扩展。 */\r\n public handleMouseDoubleClick(event: any){\r\n if(event.catch!=null && event.catch.id!=null){\r\n return\r\n }\r\n this.engine.modelToolModule2d.unHighlightModelHover()\r\n this.engine.modelToolModule2d.unhighlightAllModels()\r\n this.engine.fitToView()\r\n }\r\n\r\n\r\n // 业务功能-监听鼠标谈起,点选模型\r\n public handleMouseClick(event: any){ \r\n if(event.catch!=null && this.isModelInteractive(event.catch.id)){ \r\n this.engine.modelToolModule2d.highlightModel([event.catch.id]); \r\n this.engine.events.trigger(EventType.Click, event.catch.id); \r\n\r\n let e = new CustomEvent('D2ElementClick', {\r\n detail: { id:event.catch.id}\r\n });\r\n window.dispatchEvent(e);\r\n\r\n }else{\r\n this.engine.modelToolModule2d.unhighlightAllModels();\r\n\r\n let e = new CustomEvent('D2ElementClick', {\r\n detail: { id:-1}\r\n });\r\n window.dispatchEvent(e);\r\n } \r\n }\r\n\r\n /** 图层隐藏的图元不允许 hover 高亮和点击选中。 */\r\n private isModelInteractive(id: any): boolean {\r\n return this.engine.layerManager?.isModelVisibleByLayer?.(id) !== false;\r\n }\r\n\r\n public dispose(): void {\r\n this.mouseCoordUI?.dispose();\r\n this.mouseCoordUI = null;\r\n }\r\n}\r\n","/**\n * CAD 风格十字光标 UI 组件。\n */\nimport type { CadCursorStyle2d } from '../types/entityTypes';\n\nexport class CadCursorUI {\n private overlay: HTMLElement;\n private hLine: HTMLElement;\n private vLine: HTMLElement;\n private box: HTMLElement;\n private canvas: HTMLElement;\n private container: HTMLElement;\n private readonly style: CadCursorStyle2d;\n\n constructor(container: HTMLElement, canvas: HTMLElement, style: CadCursorStyle2d = 'full-crosshair') {\n this.container = container;\n this.canvas = canvas;\n this.style = style;\n\n canvas.style.cursor = 'none';\n\n this.overlay = document.createElement('div');\n this.overlay.className = `engine-2d-cad-cursor engine-2d-cad-cursor--${style}`;\n\n this.hLine = document.createElement('div');\n this.hLine.className = 'engine-2d-cad-cursor__h';\n\n this.vLine = document.createElement('div');\n this.vLine.className = 'engine-2d-cad-cursor__v';\n\n this.box = document.createElement('div');\n this.box.className = 'engine-2d-cad-cursor__box';\n\n this.overlay.appendChild(this.hLine);\n this.overlay.appendChild(this.vLine);\n this.overlay.appendChild(this.box);\n container.appendChild(this.overlay);\n\n this.hide();\n this.bindEvents();\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener('mousemove', this.onMouseMove);\n this.canvas.addEventListener('mouseenter', this.onMouseEnter);\n this.canvas.addEventListener('mouseleave', this.onMouseLeave);\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n this.hLine.style.top = `${y}px`;\n this.vLine.style.left = `${x}px`;\n\n // 短十字架需要同时更新横线和竖线的中心点。\n if (this.style === 'short-crosshair') {\n this.hLine.style.left = `${x}px`;\n this.vLine.style.top = `${y}px`;\n }\n\n this.box.style.left = `${x}px`;\n this.box.style.top = `${y}px`;\n };\n\n private onMouseEnter = (): void => {\n this.show();\n };\n\n private onMouseLeave = (): void => {\n this.hide();\n };\n\n private show(): void {\n this.overlay.style.visibility = 'visible';\n }\n\n private hide(): void {\n this.overlay.style.visibility = 'hidden';\n }\n\n /** 根据画布背景亮度反转十字光标颜色,保证黑白背景下都有足够对比度。 */\n public setBackgroundColor(color: number): void {\n const r = (color >> 16) & 255;\n const g = (color >> 8) & 255;\n const b = color & 255;\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n const cursorColor = luminance < 0.5 ? 'rgba(255,255,255,0.85)' : 'rgba(0,0,0,0.75)';\n\n this.container.style.setProperty('--e2d-cursor', cursorColor);\n }\n\n public dispose(): void {\n this.canvas.removeEventListener('mousemove', this.onMouseMove);\n this.canvas.removeEventListener('mouseenter', this.onMouseEnter);\n this.canvas.removeEventListener('mouseleave', this.onMouseLeave);\n this.canvas.style.cursor = '';\n this.overlay.parentElement?.removeChild(this.overlay);\n }\n}\n","/**\n * 右键菜单 UI 组件。\n */\n\nexport type ContextMenuAction =\n | 'hideElement'\n | 'showAll'\n | 'hideLayer'\n | 'showAllLayers'\n | 'search'\n | 'layerManage'\n | 'linkElement2d3d'\n | 'linkView2d3d'\n | 'toggleBg';\n\nexport interface ContextMenuItem {\n action: ContextMenuAction;\n label: string;\n /** 分隔线显示在该项上方。 */\n dividerBefore?: boolean;\n}\n\nexport interface ContextMenuItemConfig {\n action: ContextMenuAction;\n label?: string;\n visible?: boolean;\n dividerBefore?: boolean;\n}\n\nconst MENU_ITEMS: ContextMenuItem[] = [\n { action: 'search', label: '搜索' },\n { action: 'hideElement', label: '隐藏元素', dividerBefore: true },\n { action: 'showAll', label: '显示全部' },\n { action: 'hideLayer', label: '隐藏图层', dividerBefore: true },\n { action: 'showAllLayers', label: '显示所有图层' },\n { action: 'layerManage', label: '图层管理', dividerBefore: true },\n { action: 'toggleBg', label: '切换背景' },\n { action: 'linkElement2d3d', label: '模型联动', dividerBefore: true },\n { action: 'linkView2d3d', label: '视角关联' },\n];\n\nexport type ContextMenuCallback = (action: ContextMenuAction) => void;\n\nexport class ContextMenuUI {\n private menu: HTMLElement;\n private container: HTMLElement;\n private canvas: HTMLElement;\n private onAction: ContextMenuCallback;\n private readonly menuItemStates: Map<ContextMenuAction, boolean> = new Map();\n\n constructor(\n container: HTMLElement,\n canvas: HTMLElement,\n onAction: ContextMenuCallback,\n items?: ContextMenuItemConfig[],\n ) {\n this.container = container;\n this.canvas = canvas;\n this.onAction = onAction;\n\n this.menu = this.createMenu(items);\n container.appendChild(this.menu);\n\n this.bindEvents();\n }\n\n private createMenu(items?: ContextMenuItemConfig[]): HTMLElement {\n const menu = document.createElement('div');\n menu.className = 'engine-2d-context-menu';\n\n this.resolveMenuItems(items).forEach((item) => {\n if (item.dividerBefore) {\n const divider = document.createElement('div');\n divider.className = 'engine-2d-context-menu__divider';\n menu.appendChild(divider);\n }\n\n const btn = document.createElement('div');\n btn.className = 'engine-2d-context-menu__item';\n btn.textContent = item.label;\n btn.dataset.action = item.action;\n btn.addEventListener('click', () => {\n this.hide();\n this.onAction(item.action);\n });\n menu.appendChild(btn);\n });\n\n return menu;\n }\n\n /** 按初始化配置解析菜单项顺序和显隐,未传配置时保持默认菜单。 */\n private resolveMenuItems(items?: ContextMenuItemConfig[]): ContextMenuItem[] {\n if (!items || items.length === 0) return MENU_ITEMS;\n return items\n .filter((item) => item.visible !== false)\n .map((item) => {\n const defaults = MENU_ITEMS.find((defaultItem) => defaultItem.action === item.action);\n return {\n action: item.action,\n label: item.label ?? defaults?.label ?? item.action,\n dividerBefore: item.dividerBefore ?? defaults?.dividerBefore,\n };\n });\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener('contextmenu', this.onContextMenu);\n document.addEventListener('mousedown', this.onDocMouseDown);\n document.addEventListener('keydown', this.onEscape);\n }\n\n private onContextMenu = (e: MouseEvent): void => {\n e.preventDefault();\n const rect = this.container.getBoundingClientRect();\n let x = e.clientX - rect.left;\n let y = e.clientY - rect.top;\n\n // 先显示再计算溢出,避免 menu 尺寸为 0。\n this.menu.style.left = `${x}px`;\n this.menu.style.top = `${y}px`;\n this.menu.classList.add('engine-2d-context-menu--visible');\n this.updateMenuItemStyles();\n\n const menuW = this.menu.offsetWidth;\n const menuH = this.menu.offsetHeight;\n const contW = this.container.clientWidth;\n const contH = this.container.clientHeight;\n if (x + menuW > contW) x = contW - menuW - 4;\n if (y + menuH > contH) y = contH - menuH - 4;\n this.menu.style.left = `${x}px`;\n this.menu.style.top = `${y}px`;\n };\n\n private onDocMouseDown = (e: MouseEvent): void => {\n if (!this.menu.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n private onEscape = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.hide();\n };\n\n private hide(): void {\n this.menu.classList.remove('engine-2d-context-menu--visible');\n }\n\n /** 设置菜单项状态,启用项会高亮显示。 */\n public setMenuItemState(action: ContextMenuAction, enabled: boolean): void {\n this.menuItemStates.set(action, enabled);\n }\n\n /** 批量设置菜单项状态。 */\n public setMenuItemStates(states: Partial<Record<ContextMenuAction, boolean>>): void {\n Object.entries(states).forEach(([action, enabled]) => {\n this.menuItemStates.set(action as ContextMenuAction, enabled as boolean);\n });\n }\n\n private updateMenuItemStyles(): void {\n const items = this.menu.querySelectorAll('.engine-2d-context-menu__item');\n items.forEach((item) => {\n const action = (item as HTMLElement).dataset.action as ContextMenuAction;\n const enabled = this.menuItemStates.get(action);\n\n if (enabled) {\n (item as HTMLElement).style.color = '#00e682';\n (item as HTMLElement).style.fontWeight = 'bold';\n } else {\n (item as HTMLElement).style.color = '';\n (item as HTMLElement).style.fontWeight = '';\n }\n });\n }\n\n public dispose(): void {\n this.canvas.removeEventListener('contextmenu', this.onContextMenu);\n document.removeEventListener('mousedown', this.onDocMouseDown);\n document.removeEventListener('keydown', this.onEscape);\n this.menu.parentElement?.removeChild(this.menu);\n }\n}\n","import type { LoadingStyle2d } from '../types/entityTypes';\n\n/**\n * 加载进度 UI 组件\n * 样式 1 为居中卡片,样式 2 为底部进度条。\n */\nexport class LoadingUI {\n private overlay: HTMLElement | null = null;\n private textEl: HTMLElement | null = null;\n private barEl: HTMLElement | null = null;\n private pctEl: HTMLElement | null = null;\n\n constructor(container: HTMLElement, style: LoadingStyle2d = 1) {\n this._build(container, style);\n }\n\n public show(text = '正在加载...', progress = 0): void {\n if (!this.overlay) return;\n this.overlay.style.display = 'flex';\n this._update(text, progress);\n }\n\n public update(text: string, progress: number): void {\n if (this.overlay?.style.display === 'none') return;\n this._update(text, progress);\n }\n\n public hide(): void {\n if (this.overlay) this.overlay.style.display = 'none';\n }\n\n private _update(text: string, progress: number): void {\n const pct = Math.min(100, Math.max(0, Math.round(progress)));\n if (this.textEl) this.textEl.textContent = text;\n if (this.barEl) this.barEl.style.width = `${pct}%`;\n if (this.pctEl) this.pctEl.textContent = `${pct}%`;\n }\n\n private _build(container: HTMLElement, style: LoadingStyle2d): void {\n const overlay = document.createElement('div');\n overlay.style.cssText = this._getOverlayStyle(style);\n this.overlay = overlay;\n\n const panel = style === 2 ? this._buildBottomPanel() : this._buildCardPanel();\n overlay.appendChild(panel);\n container.appendChild(overlay);\n }\n\n private _getOverlayStyle(style: LoadingStyle2d): string {\n if (style === 2) {\n return `\n position:absolute; inset:0;\n display:none; align-items:flex-end; justify-content:center;\n z-index:200; pointer-events:none;\n `;\n }\n\n return `\n position:absolute; inset:0;\n display:none; align-items:center; justify-content:center;\n z-index:200;\n `;\n }\n\n private _buildCardPanel(): HTMLElement {\n const card = document.createElement('div');\n card.style.cssText = `\n display:flex; flex-direction:column; align-items:center; gap:14px;\n padding:28px 36px;\n background:var(--e2d-bg,#1e1f22);\n border:1px solid var(--e2d-border,rgba(255,255,255,0.12));\n border-radius:8px;\n box-shadow:0 8px 32px var(--e2d-shadow-lg,rgba(0,0,0,0.65));\n min-width:200px;\n font-family:system-ui,sans-serif;\n `;\n\n // 样式 1 沿用原来的旋转加载态,保证默认视觉不变。\n const spinnerWrap = document.createElement('div');\n spinnerWrap.style.cssText = 'width:48px; height:48px;';\n spinnerWrap.innerHTML = `\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n <style>\n @keyframes _e2d_spin { to { transform: rotate(360deg); } }\n ._e2d_ring { transform-origin: 24px 24px; animation: _e2d_spin 0.9s linear infinite; }\n </style>\n <circle cx=\"24\" cy=\"24\" r=\"19\" fill=\"none\"\n stroke=\"var(--e2d-border2,#333)\" stroke-width=\"3\"/>\n <g class=\"_e2d_ring\">\n <circle cx=\"24\" cy=\"24\" r=\"19\" fill=\"none\"\n stroke=\"var(--e2d-accent,#4fc3f7)\" stroke-width=\"3\"\n stroke-dasharray=\"30 90\" stroke-linecap=\"round\"/>\n </g>\n </svg>\n `;\n\n const text = document.createElement('div');\n text.style.cssText = `\n font-size:13px; color:var(--e2d-text2,#ccc);\n text-align:center; white-space:nowrap;\n `;\n text.textContent = '正在加载...';\n this.textEl = text;\n\n const track = document.createElement('div');\n track.style.cssText = `\n width:160px; height:3px; border-radius:2px;\n background:var(--e2d-border2,#333); overflow:hidden;\n `;\n const bar = document.createElement('div');\n bar.style.cssText = `\n height:100%; width:0%; border-radius:2px;\n background:var(--e2d-accent,#4fc3f7);\n transition:width 0.25s ease;\n `;\n track.appendChild(bar);\n this.barEl = bar;\n\n const pct = document.createElement('div');\n pct.style.cssText = `\n font-size:12px; color:var(--e2d-text3,rgba(255,255,255,0.35));\n `;\n pct.textContent = '0%';\n this.pctEl = pct;\n\n card.appendChild(spinnerWrap);\n card.appendChild(text);\n card.appendChild(track);\n card.appendChild(pct);\n return card;\n }\n\n private _buildBottomPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.style.cssText = `\n width:100%;\n display:flex; flex-direction:column;\n font-family:system-ui,sans-serif;\n background:var(--e2d-float-bg,rgba(0,0,0,0.72));\n border-top:1px solid var(--e2d-float-border,rgba(255,255,255,0.10));\n box-shadow:0 -8px 24px var(--e2d-shadow,rgba(0,0,0,0.38));\n `;\n\n const row = document.createElement('div');\n row.style.cssText = `\n min-height:34px;\n display:flex; align-items:center; justify-content:space-between; gap:16px;\n padding:0 16px;\n `;\n\n const text = document.createElement('div');\n text.style.cssText = `\n min-width:0;\n font-size:12px; line-height:1.4;\n color:var(--e2d-text2,#ccc);\n white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\n `;\n text.textContent = '正在加载...';\n this.textEl = text;\n\n const pct = document.createElement('div');\n pct.style.cssText = `\n flex:0 0 auto;\n font-size:12px; line-height:1;\n color:var(--e2d-accent,#4fc3f7);\n font-variant-numeric:tabular-nums;\n `;\n pct.textContent = '0%';\n this.pctEl = pct;\n\n const track = document.createElement('div');\n track.style.cssText = `\n width:100%; height:4px;\n background:var(--e2d-border2,#333);\n overflow:hidden;\n `;\n\n const bar = document.createElement('div');\n bar.style.cssText = `\n height:100%; width:0%;\n background:linear-gradient(90deg,var(--e2d-accent,#4fc3f7),#8be9fd);\n box-shadow:0 0 12px rgba(79,195,247,0.45);\n transition:width 0.25s ease;\n `;\n this.barEl = bar;\n\n row.appendChild(text);\n row.appendChild(pct);\n track.appendChild(bar);\n panel.appendChild(row);\n panel.appendChild(track);\n return panel;\n }\n\n public dispose(): void {\n this.overlay?.remove();\n this.overlay = null;\n this.textEl = null;\n this.barEl = null;\n this.pctEl = null;\n }\n}\n","import type { SearchManager, SearchResult } from '../managers/search/index';\n\nconst ICON_SEARCH = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <line x1=\"10\" y1=\"10\" x2=\"14\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nconst ICON_CLOSE = `<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"1\" y1=\"1\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"11\" y1=\"1\" x2=\"1\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport class SearchUI {\n private manager: SearchManager;\n\n private wrapper: HTMLElement;\n private input: HTMLInputElement;\n private clearBtn: HTMLElement;\n private resultList: HTMLElement;\n private statusEl: HTMLElement;\n\n private activeIndex = -1;\n private currentResults: SearchResult[] = [];\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(container: HTMLElement, manager: SearchManager) {\n this.manager = manager;\n\n this.wrapper = this.buildWrapper();\n this.input = this.wrapper.querySelector('.engine-2d-search__input') as HTMLInputElement;\n this.clearBtn = this.wrapper.querySelector('.engine-2d-search__clear') as HTMLElement;\n this.resultList = this.wrapper.querySelector('.engine-2d-search__list') as HTMLElement;\n this.statusEl = this.wrapper.querySelector('.engine-2d-search__status') as HTMLElement;\n\n container.appendChild(this.wrapper);\n this.bindEvents();\n }\n\n /** 构建搜索弹窗,当前搜索仅面向 CAD 文字内容。 */\n private buildWrapper(): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'engine-2d-search';\n wrapper.innerHTML = `\n <div class=\"engine-2d-search__box\">\n <div class=\"engine-2d-search__input-row\">\n <span class=\"engine-2d-search__icon\">${ICON_SEARCH}</span>\n <input\n class=\"engine-2d-search__input\"\n type=\"text\"\n placeholder=\"搜索文字内容\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n <button class=\"engine-2d-search__clear\" title=\"清除\">${ICON_CLOSE}</button>\n </div>\n <div class=\"engine-2d-search__divider\"></div>\n <div class=\"engine-2d-search__status\"></div>\n <ul class=\"engine-2d-search__list\" role=\"listbox\"></ul>\n </div>\n `;\n return wrapper;\n }\n\n private bindEvents(): void {\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('keydown', this.onKeyDown);\n this.clearBtn.addEventListener('click', this.onClear);\n document.addEventListener('mousedown', this.onDocMouseDown);\n document.addEventListener('keydown', this.onEscape);\n }\n\n private onInput = (): void => {\n if (this.debounceTimer !== null) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => this.doSearch(), 150);\n\n const hasText = this.input.value.length > 0;\n this.clearBtn.style.opacity = hasText ? '1' : '0';\n this.clearBtn.style.pointerEvents = hasText ? 'auto' : 'none';\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter' && this.activeIndex >= 0 && this.currentResults[this.activeIndex]) {\n e.preventDefault();\n this.selectResult(this.currentResults[this.activeIndex]);\n return;\n }\n\n const items = this.resultList.querySelectorAll<HTMLElement>('.engine-2d-search__item');\n if (!items.length) return;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.activeIndex = Math.min(this.activeIndex + 1, items.length - 1);\n this.highlightItem(items);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.activeIndex = Math.max(this.activeIndex - 1, 0);\n this.highlightItem(items);\n }\n };\n\n private onClear = (): void => {\n this.input.value = '';\n this.clearBtn.style.opacity = '0';\n this.clearBtn.style.pointerEvents = 'none';\n this.clearResults();\n this.input.focus();\n };\n\n private onDocMouseDown = (e: MouseEvent): void => {\n if (!this.wrapper.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n private onEscape = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.hide();\n };\n\n private doSearch(): void {\n const query = this.input.value;\n if (!query.trim()) {\n this.clearResults();\n return;\n }\n\n this.currentResults = this.manager.search(query);\n this.activeIndex = this.currentResults.length > 0 ? 0 : -1;\n this.renderResults(this.currentResults, query);\n }\n\n /** 渲染真实文字搜索结果,列表项点击后由 SearchManager 定位。 */\n private renderResults(results: SearchResult[], query: string): void {\n this.resultList.innerHTML = '';\n const divider = this.wrapper.querySelector('.engine-2d-search__divider') as HTMLElement;\n\n if (results.length === 0) {\n this.statusEl.textContent = `未找到与 \"${query}\" 匹配的文字`;\n this.statusEl.style.display = 'block';\n divider.style.display = 'none';\n this.resultList.style.display = 'none';\n return;\n }\n\n this.statusEl.textContent = `找到 ${results.length} 条文字`;\n this.statusEl.style.display = 'block';\n divider.style.display = 'block';\n this.resultList.style.display = 'block';\n\n results.forEach((item, index) => {\n const li = document.createElement('li');\n li.className = 'engine-2d-search__item';\n li.classList.toggle('engine-2d-search__item--active', index === this.activeIndex);\n li.setAttribute('role', 'option');\n li.dataset.index = String(index);\n\n li.innerHTML = `\n <span class=\"engine-2d-search__item-badge\">文字</span>\n <span class=\"engine-2d-search__item-name\">${this.highlight(item.name, query)}</span>\n ${item.layer ? `<span class=\"engine-2d-search__item-layer\">${this.escapeHtml(item.layer)}</span>` : ''}\n ${item.description ? `<span class=\"engine-2d-search__item-desc\">${this.escapeHtml(item.description)}</span>` : ''}\n `;\n\n li.addEventListener('click', () => this.selectResult(item));\n li.addEventListener('mouseenter', () => {\n this.activeIndex = index;\n this.highlightItem(this.resultList.querySelectorAll<HTMLElement>('.engine-2d-search__item'));\n });\n\n this.resultList.appendChild(li);\n });\n }\n\n /** 只高亮连续命中的关键词;模糊命中仍展示完整文字。 */\n private highlight(text: string, query: string): string {\n const escapedText = this.escapeHtml(text);\n const normalizedQuery = query.trim();\n if (!normalizedQuery) return escapedText;\n const escapedQuery = this.escapeRegExp(this.escapeHtml(normalizedQuery));\n return escapedText.replace(new RegExp(`(${escapedQuery})`, 'gi'), '<mark class=\"engine-2d-search__mark\">$1</mark>');\n }\n\n private highlightItem(items: NodeListOf<HTMLElement>): void {\n items.forEach((el, index) => {\n el.classList.toggle('engine-2d-search__item--active', index === this.activeIndex);\n });\n if (this.activeIndex >= 0) {\n items[this.activeIndex]?.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private selectResult(result: SearchResult): void {\n this.manager.onResultSelect(result);\n this.hide();\n }\n\n private clearResults(): void {\n this.resultList.innerHTML = '';\n this.resultList.style.display = 'none';\n this.statusEl.style.display = 'none';\n const divider = this.wrapper.querySelector('.engine-2d-search__divider') as HTMLElement;\n divider.style.display = 'none';\n this.currentResults = [];\n this.activeIndex = -1;\n }\n\n private escapeHtml(value: string): string {\n return String(value ?? '').replace(/[&<>\"']/g, (char) => ({\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n }[char] ?? char));\n }\n\n private escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n public show(): void {\n this.wrapper.classList.add('engine-2d-search--visible');\n requestAnimationFrame(() => this.input.focus());\n }\n\n public hide(): void {\n this.wrapper.classList.remove('engine-2d-search--visible');\n this.clearResults();\n this.input.value = '';\n this.clearBtn.style.opacity = '0';\n this.clearBtn.style.pointerEvents = 'none';\n }\n\n public toggle(): void {\n if (this.wrapper.classList.contains('engine-2d-search--visible')) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n public dispose(): void {\n this.input.removeEventListener('input', this.onInput);\n this.input.removeEventListener('keydown', this.onKeyDown);\n this.clearBtn.removeEventListener('click', this.onClear);\n document.removeEventListener('mousedown', this.onDocMouseDown);\n document.removeEventListener('keydown', this.onEscape);\n this.wrapper.parentElement?.removeChild(this.wrapper);\n if (this.debounceTimer !== null) clearTimeout(this.debounceTimer);\n }\n}\n","import * as THREE from 'three';\nimport { SearchUI } from '../../ui/searchUI';\nimport type { SearchableText2d } from '../../loader/types';\n\nexport interface SearchResult {\n id: string;\n name: string;\n type: string;\n layer?: string;\n description?: string;\n score?: number;\n target?: SearchableText2d;\n}\n\nexport class SearchManager {\n private engine: any;\n private searchUI: SearchUI | null = null;\n\n constructor(engine: any) {\n this.engine = engine;\n\n const container: HTMLElement | null =\n document.getElementById(engine?.options?.containerId ?? '') ??\n engine?.container ?? null;\n\n if (container) {\n this.searchUI = new SearchUI(container, this);\n }\n }\n\n /** 只查询已加载的文字实体,支持连续包含和按字符顺序的模糊匹配。 */\n public search(query: string): SearchResult[] {\n const normalizedQuery = this.normalize(query);\n if (!normalizedQuery) return [];\n\n const textItems: SearchableText2d[] = this.engine.loaderModule2d?.model?.textItems ?? [];\n return textItems\n .map((item) => {\n const score = this.getMatchScore(item.text, normalizedQuery);\n if (score == null) return null;\n return {\n id: item.id,\n name: item.text,\n type: '文字',\n layer: item.layer,\n description: this.getPositionDescription(item),\n score,\n target: item,\n } as SearchResult;\n })\n .filter((item): item is SearchResult => item !== null)\n .sort((a, b) => (b.score ?? 0) - (a.score ?? 0) || a.name.length - b.name.length)\n .slice(0, 100);\n }\n\n /** 点击结果后定位到文字包围盒,并高亮对应文字图元。 */\n public onResultSelect(result: SearchResult): void {\n const target = result.target;\n if (!target) return;\n\n this.engine.modelToolModule2d?.unhighlightAllModels?.();\n this.engine.modelToolModule2d?.highlightModel?.([result.id]);\n this.fitToText(target);\n }\n\n /** 将搜索结果定位到视口中央,极小文字用锚点补一个可见范围。 */\n private fitToText(item: SearchableText2d): void {\n const min = item.min?.clone();\n const max = item.max?.clone();\n const anchor = item.anchor?.clone();\n if ((!min || !max || min.distanceTo(max) < 1e-6) && anchor) {\n const radius = Math.max(Number(item.info?.height ?? 100), 100);\n this.engine.cameraModule2d?.fitToExtents({\n min: [anchor.x - radius, anchor.y - radius, 0],\n max: [anchor.x + radius, anchor.y + radius, 0],\n }, 2, true, 500);\n return;\n }\n\n if (!min || !max) return;\n const size = new THREE.Vector3().subVectors(max, min);\n const padding = Math.max(size.x, size.y) < 1e-6 ? 2 : 2.5;\n this.engine.cameraModule2d?.fitToExtents({\n min: [min.x, min.y, min.z],\n max: [max.x, max.y, max.z],\n }, padding, true, 500);\n }\n\n private getPositionDescription(item: SearchableText2d): string {\n const point = item.anchor ?? item.min;\n if (!point) return '';\n return `X:${point.x.toFixed(0)} Y:${point.y.toFixed(0)}`;\n }\n\n private normalize(value: string): string {\n return String(value ?? '').trim().toLowerCase().replace(/\\s+/g, '');\n }\n\n private getMatchScore(text: string, normalizedQuery: string): number | null {\n const normalizedText = this.normalize(text);\n if (!normalizedText) return null;\n const index = normalizedText.indexOf(normalizedQuery);\n if (index >= 0) return 1000 - index - Math.max(0, normalizedText.length - normalizedQuery.length) * 0.01;\n\n let cursor = 0;\n let gap = 0;\n for (const char of normalizedQuery) {\n const nextIndex = normalizedText.indexOf(char, cursor);\n if (nextIndex < 0) return null;\n gap += nextIndex - cursor;\n cursor = nextIndex + 1;\n }\n return 500 - gap - Math.max(0, normalizedText.length - normalizedQuery.length) * 0.01;\n }\n\n public show(): void { this.searchUI?.show(); }\n public hide(): void { this.searchUI?.hide(); }\n public toggle(): void { this.searchUI?.toggle(); }\n\n public dispose(): void {\n this.searchUI?.dispose();\n this.searchUI = null;\n }\n}\n","/**\r\n * 2D 引擎主题管理器\r\n * 通过在容器元素上切换 CSS 自定义属性实现暗色 / 亮色主题\r\n */\r\n\r\nexport type Theme2d = 'dark' | 'light';\r\n\r\n/** 所有 UI 组件共享的设计 Token */\r\nconst THEME_VARS: Record<Theme2d, Record<string, string>> = {\r\n dark: {\r\n /* 背景 */\r\n '--e2d-bg': '#1e1f22', // 面板主背景\r\n '--e2d-bg2': '#252526', // 次级面板背景(右键菜单)\r\n '--e2d-bg3': '#222222', // 标题栏 / 第三级背景\r\n '--e2d-bg-hover': 'rgba(79,195,247,0.08)', // 列表项悬停(中性蓝调)\r\n '--e2d-bg-accent': '#094771', // 强调悬停(右键菜单项)\r\n '--e2d-icon-bg': 'rgba(255,255,255,0.08)', // 图标按钮背景\r\n '--e2d-icon-bg-hover': 'rgba(255,255,255,0.16)', // 图标按钮悬停背景\r\n\r\n /* 描边 */\r\n '--e2d-border': 'rgba(255,255,255,0.12)', // 面板边框\r\n '--e2d-border2': '#333333', // 行分隔线 / 细描边\r\n\r\n /* 文字 */\r\n '--e2d-text': '#e0e0e0', // 主文字\r\n '--e2d-text2': '#cccccc', // 次级文字\r\n '--e2d-text3': 'rgba(255,255,255,0.35)', // 辅助 / 占位文字\r\n '--e2d-text4': '#666666', // 禁用 / 暗淡文字\r\n '--e2d-text-accent': '#ffffff', // 强调背景上的文字\r\n\r\n /* 强调色 */\r\n '--e2d-accent': '#4fc3f7', // 主强调(搜索标记、光标色值)\r\n\r\n /* 阴影 */\r\n '--e2d-shadow': 'rgba(0,0,0,0.50)', // 普通阴影\r\n '--e2d-shadow-lg': 'rgba(0,0,0,0.65)', // 大阴影\r\n\r\n /* 光标 */\r\n '--e2d-cursor': 'rgba(255,255,255,0.85)', // CAD 十字光标颜色\r\n\r\n /* 滚动条 */\r\n '--e2d-scrollbar': 'rgba(255,255,255,0.15)', // 滚动条滑块\r\n\r\n /* 浮动元素(坐标显示、提示等) */\r\n '--e2d-float-bg': 'rgba(0,0,0,0.65)',\r\n '--e2d-float-border': 'rgba(255,255,255,0.08)',\r\n\r\n /* 图层色块描边 */\r\n '--e2d-swatch-border': '#444444',\r\n\r\n /* 关闭按钮 */\r\n '--e2d-close': '#aaaaaa',\r\n '--e2d-close-hover': '#ffffff',\r\n\r\n /* 图标 */\r\n '--e2d-icon': 'rgba(255,255,255,0.4)',\r\n\r\n /* 坐标显示 */\r\n '--e2d-coord-value': '#76c8ff',\r\n '--e2d-coord-label': 'rgba(255,255,255,0.45)',\r\n },\r\n\r\n light: {\r\n /* 背景 */\r\n '--e2d-bg': '#ffffff',\r\n '--e2d-bg2': '#ffffff',\n '--e2d-bg3': '#eeeeee',\r\n '--e2d-bg-hover': 'rgba(25,118,210,0.06)',\r\n '--e2d-bg-accent': '#e3f2fd',\r\n '--e2d-icon-bg': 'rgba(0,0,0,0.06)',\r\n '--e2d-icon-bg-hover': 'rgba(0,0,0,0.12)',\r\n\r\n /* 描边 */\r\n '--e2d-border': 'rgba(0,0,0,0.12)',\r\n '--e2d-border2': '#e0e0e0',\r\n\r\n /* 文字 */\r\n '--e2d-text': '#1a1a1a',\r\n '--e2d-text2': '#444444',\r\n '--e2d-text3': 'rgba(0,0,0,0.40)',\r\n '--e2d-text4': '#aaaaaa',\r\n '--e2d-text-accent': '#1565c0',\r\n\r\n /* 强调色 */\r\n '--e2d-accent': '#1976d2',\r\n\r\n /* 阴影 */\r\n '--e2d-shadow': 'rgba(0,0,0,0.15)',\r\n '--e2d-shadow-lg': 'rgba(0,0,0,0.22)',\r\n\r\n /* 光标 */\r\n '--e2d-cursor': 'rgba(30,30,30,0.70)',\r\n\r\n /* 滚动条 */\r\n '--e2d-scrollbar': 'rgba(0,0,0,0.18)',\r\n\r\n /* 浮动元素 */\r\n '--e2d-float-bg': '#ffffff',\n '--e2d-float-border': 'rgba(0,0,0,0.10)',\r\n\r\n /* 图层色块描边 */\r\n '--e2d-swatch-border': '#cccccc',\r\n\r\n /* 关闭按钮 */\r\n '--e2d-close': '#777777',\r\n '--e2d-close-hover': '#1a1a1a',\r\n\r\n /* 图标 */\r\n '--e2d-icon': 'rgba(0,0,0,0.45)',\r\n\r\n /* 坐标显示 */\r\n '--e2d-coord-value': '#1976d2',\r\n '--e2d-coord-label': 'rgba(0,0,0,0.50)',\r\n },\r\n};\r\n\r\nexport class ThemeManager {\r\n private container: HTMLElement;\r\n private current: Theme2d;\r\n\r\n constructor(container: HTMLElement, initial: Theme2d = 'dark') {\r\n this.container = container;\r\n this.current = initial;\r\n this._apply(initial);\r\n }\r\n\r\n private _apply(theme: Theme2d): void {\r\n const vars = THEME_VARS[theme];\r\n for (const [key, val] of Object.entries(vars)) {\r\n this.container.style.setProperty(key, val);\r\n }\r\n // data 属性方便外部 CSS 按需覆盖\r\n this.container.setAttribute('data-e2d-theme', theme);\r\n }\r\n\r\n public setTheme(theme: Theme2d): void {\r\n this.current = theme;\r\n this._apply(theme);\r\n }\r\n\r\n public getTheme(): Theme2d {\r\n return this.current;\r\n }\r\n\r\n public toggle(): void {\r\n this.setTheme(this.current === 'dark' ? 'light' : 'dark');\r\n }\r\n\r\n public dispose(): void {\r\n for (const key of Object.keys(THEME_VARS[this.current])) {\r\n this.container.style.removeProperty(key);\r\n }\r\n this.container.removeAttribute('data-e2d-theme');\r\n }\r\n}\r\n","/**\r\n * 2D CAD 浏览引擎内核\r\n * 主入口类,整合所有模块\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport Stats from 'stats.js';\r\nimport { EventModule2d, EventType2d } from './modules/eventModule2d';\r\nimport { SceneModule2d } from './modules/sceneModule2d';\r\nimport { EngineStatus2d } from './status/engineStatus2d.ts'\r\nimport { CameraModule2d } from './modules/cameraModule2d';\r\nimport { RenderModule2d } from './modules/renderModule2d';\r\nimport { ControlModule2d } from './modules/controlModule2d';\r\nimport { LoaderModule2d } from './modules/loaderModule2d';\r\nimport { LayerManager } from './managers/layer/index';\r\nimport { OctreeBox2d } from './managers/octreeBox2d';\r\nimport { LinkView2d3d } from './managers/linkView2d3d'\r\nimport { LinkElement2d3d } from './managers/linkElement2d3d'\r\nimport { ModelToolModule2d } from './modules/modelToolModule2d'\r\nimport { HandelBehaved2d } from './status/handelBehaved2d';\r\nimport { InteractionModule2d } from \"./modules/interactionModule2d\"\r\nimport { Engine2dOptions, PerformanceStats } from './types/entityTypes';\r\nimport { DWGData } from './types/dwgTypes';\r\nimport { CadCursorUI } from './ui/cadCursorUI';\r\nimport { ContextMenuUI } from './ui/contextMenuUI';\r\nimport { LoadingUI } from './ui/loadingUI';\r\nimport { SearchManager } from './managers/search/index';\r\nimport { ThemeManager, Theme2d } from './theme/index';\r\nimport './EngineKernel2d.css';\r\n\r\nexport class EngineKernel2d {\r\n // 配置选项\r\n private options: Engine2dOptions;\r\n private container: HTMLElement | null = null;\r\n\r\n // 渲染循环\r\n private animationId: number | null = null;\r\n private isRendering: boolean = false;\r\n\r\n // 性能监控\r\n private fpsFrameCount: number = 0;\r\n private fpsLastCheck: number = 0;\r\n private currentFps: number = 0;\r\n private enablePerformanceMonitoring: boolean = false;\r\n public stats?: Stats;\r\n\r\n // 核心模块\r\n public modelToolModule2d!:ModelToolModule2d;\r\n public engineStatus2d!:EngineStatus2d;\r\n public octreeBox2d!:OctreeBox2d;\r\n public events!: EventModule2d;\r\n public handelBehaved2d!: any;\r\n public interactionModule2d:InteractionModule2d;\r\n public sceneModule2d!: SceneModule2d;\r\n public cameraModule2d!: CameraModule2d;\r\n public renderModule2d!: RenderModule2d;\r\n public controlModule2d!: ControlModule2d;\r\n public loaderModule2d!: LoaderModule2d;\r\n public layerManager!: LayerManager;\r\n public searchManager!: SearchManager;\r\n public themeManager!: ThemeManager;\r\n private cadCursorUI!: CadCursorUI;\r\n private contextMenuUI!: ContextMenuUI;\r\n private loadingUI!: LoadingUI;\r\n private linkView2d3d!: LinkView2d3d;\r\n private linkElement2d3d!: LinkElement2d3d;\r\n\r\n // Three.js 核心对象\r\n public scene: THREE.Scene | null = null;\r\n public camera: THREE.OrthographicCamera | null = null;\r\n public renderer: THREE.WebGLRenderer | null = null;\r\n\r\n // 数据\r\n public dwgData: DWGData | null = null;\r\n public version: string = '1.0.0';\r\n\r\n constructor(options: Engine2dOptions) {\r\n // 设置一些默认值\r\n this.options = options;\r\n this.options.backgroundColor = this.options.backgroundColor ?? 0x1a1a1a;\r\n this.options.enablePerformanceMonitoring = this.options.enablePerformanceMonitoring ?? false\r\n this.options.showMouseCoordinates = this.options.showMouseCoordinates ?? false\r\n this.options.loadingStyle = this.options.loadingStyle ?? 2;\r\n\r\n\r\n\r\n this.options.contextMenu = this.options.contextMenu ?? {\r\n items:[ \r\n { action: 'hideElement', label: '隐藏模型'}, \r\n { action: 'showAll', label: '显示全部' },\r\n { action: 'hideLayer', label: '隐藏图层' },\r\n { action: 'showAllLayers', label: '显示所有图层' },\r\n { action: 'toggleBg', label: '切换背景',},\r\n { action: 'layerManage', label: '图层管理' }, \r\n { action: 'linkElement2d3d', label: '模型联动', visible: false }\r\n ]\r\n }\r\n\r\n\r\n\r\n\r\n this.enablePerformanceMonitoring = options.enablePerformanceMonitoring ?? false;\r\n\r\n // 获取容器\r\n this.container = document.getElementById(options.containerId);\r\n if (!this.container) {\r\n throw new Error(`Container ${options.containerId} not found`);\r\n }\r\n\r\n // 需要支持多工作空间 第一个是modelspace,后面的时layoutspace\r\n // 初始化引擎\r\n this.initialize();\r\n\r\n\r\n\r\n this.handelBehaved2d = HandelBehaved2d(this)\r\n this.interactionModule2d = new InteractionModule2d(this) \r\n this.interactionModule2d.init()\r\n this.interactionModule2d.active()\r\n \r\n }\r\n\r\n /**\r\n * 初始化引擎\r\n */\r\n private initialize(): void {\r\n // 1. 创建事件系统\r\n this.events = new EventModule2d(false);\r\n\r\n // 2. 创建场景\r\n this.sceneModule2d = new SceneModule2d(this, this.options);\r\n this.scene = this.sceneModule2d.scene;\r\n\r\n // 3. 创建相机\r\n this.cameraModule2d = new CameraModule2d(this, this.container!);\r\n this.camera = this.cameraModule2d.orthographicCamera;\r\n\r\n // 4. 创建渲染器\r\n this.renderModule2d = new RenderModule2d(this, this.container!, this.options);\r\n this.renderer = this.renderModule2d.renderer;\r\n\r\n // 5. 创建控制器\r\n this.controlModule2d = new ControlModule2d(this); \r\n\r\n // 6. 创建数据加载器\r\n this.loaderModule2d = new LoaderModule2d(this);\r\n\r\n // 7. 初始化主题(需在所有 UI 之前)\r\n this.themeManager = new ThemeManager(this.container!);\r\n\r\n // 8. 创建图层管理器\r\n this.layerManager = new LayerManager(this);\r\n\r\n // 9. 创建搜索管理器\r\n this.searchManager = new SearchManager(this);\r\n\r\n // 9.5 加载八叉树\r\n this.octreeBox2d = new OctreeBox2d(this);\r\n this.modelToolModule2d = new ModelToolModule2d(this);\r\n this.engineStatus2d = new EngineStatus2d(this)\r\n this.linkView2d3d = new LinkView2d3d(this)\r\n this.linkElement2d3d = new LinkElement2d3d(this)\r\n // 10. 初始化网格(现在相机已经创建好了)\r\n this.sceneModule2d.initGrid();\r\n\r\n // 初始化 CAD 十字光标\r\n this.cadCursorUI = new CadCursorUI(this.container!, this.renderer!.domElement, this.options.cursorStyle ?? 'short-crosshair');\r\n this.cadCursorUI.setBackgroundColor(this.options.backgroundColor ?? 0x1a1a1a);\r\n\r\n // 初始化加载进度 UI\r\n this.loadingUI = new LoadingUI(this.container!, this.options.loadingStyle);\r\n this.events.on(EventType2d.ModelLoadStart, () => this.loadingUI.show('正在加载...', 0));\r\n this.events.on(EventType2d.ModelLoadProgress, (d) => this.loadingUI.update(d.text, d.progress));\r\n this.events.on(EventType2d.ModelLoaded, () => this.loadingUI.hide());\r\n this.events.on(EventType2d.ModelLoadError, () => this.loadingUI.hide());\r\n\r\n // 初始化右键菜单\r\n this.contextMenuUI = new ContextMenuUI(\r\n this.container!,\r\n this.renderer!.domElement,\r\n (action) => {\r\n if (action === 'search') this.searchManager.show();\r\n if (action === 'layerManage') this.layerManager.toggle();\r\n if(action===\"hideElement\"){\r\n // 隐藏图元\r\n this.modelToolModule2d.hideModel(this.engineStatus2d.highlightModels);\r\n }\r\n if(action===\"showAll\"){\r\n // 显示全部\r\n this.modelToolModule2d.showAllModels();\r\n }\r\n if(action === \"hideLayer\"){\r\n // 隐藏当前高亮图元所在图层\r\n this.hideHighlightedLayers();\r\n }\r\n if(action === \"showAllLayers\"){\r\n // 显示所有图层\r\n this.layerManager.setAllLayersVisible(true);\r\n this.layerManager.refresh();\r\n }\r\n if (action === 'toggleBg') {\r\n const nextTheme = this.themeManager.getTheme() === 'dark' ? 'light' : 'dark';\r\n this.setTheme(nextTheme);\r\n }\r\n if (action === 'linkElement2d3d') {\r\n // 切换二三维图元联动\r\n const enabled = this.linkElement2d3d.toggle();\r\n this.contextMenuUI.setMenuItemState('linkElement2d3d', enabled);\r\n console.log(`[EngineKernel2d] 二三维图元联动: ${enabled ? '已开启' : '已关闭'}`);\r\n }\r\n if (action === 'linkView2d3d') {\r\n // 切换图模关联\r\n const enabled = this.linkView2d3d.toggle();\r\n this.contextMenuUI.setMenuItemState('linkView2d3d', enabled);\r\n console.log(`[EngineKernel2d] 图模关联: ${enabled ? '已开启' : '已关闭'}`);\r\n }\r\n },\r\n this.options.contextMenu?.items,\r\n );\r\n\r\n // 设置菜单项初始状态\r\n this.contextMenuUI.setMenuItemStates({\r\n 'linkElement2d3d': this.linkElement2d3d.isEnabled(),\r\n 'linkView2d3d': this.linkView2d3d.isEnabled()\r\n });\r\n\r\n // 9. 开始渲染循环\r\n this.initStatsMonitor();\r\n this.startRendering();\r\n\r\n console.log(`[EngineKernel2d] 2D Engine initialized (v${this.version})`);\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private startRendering(): void {\r\n if (this.isRendering) return;\r\n\r\n this.isRendering = true;\r\n this.fpsLastCheck = performance.now();\r\n this.animate();\r\n\r\n console.log('[EngineKernel2d] Rendering started');\r\n }\r\n\r\n /**\r\n * 停止渲染循环\r\n */\r\n private stopRendering(): void {\r\n this.isRendering = false;\r\n\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId);\r\n this.animationId = null;\r\n }\r\n\r\n console.log('[EngineKernel2d] Rendering stopped');\r\n }\r\n\r\n /**\r\n * 动画循环\r\n */\r\n private animate = (): void => {\r\n if (!this.isRendering) return;\r\n\r\n this.animationId = requestAnimationFrame(this.animate);\r\n this.stats?.begin();\r\n\r\n // 更新控制器\r\n this.controlModule2d.update();\r\n\r\n // 渲染场景\r\n if (this.scene && this.camera && this.renderer) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 性能监控\r\n if (this.enablePerformanceMonitoring) {\r\n this.updatePerformanceStats();\r\n }\r\n this.stats?.end();\r\n }\r\n\r\n /** 初始化 stats.js 性能监视器,showStats 优先控制可视面板,旧配置 enablePerformanceMonitoring 继续兼容。 */\r\n private initStatsMonitor(): void {\r\n if (!(this.options.showStats ?? this.enablePerformanceMonitoring) || !this.container) return;\r\n\r\n this.stats = new Stats();\r\n this.stats.showPanel(0);\r\n this.stats.dom.className = 'engine-2d-stats-monitor';\r\n this.stats.dom.style.position = 'absolute';\r\n this.stats.dom.style.top = '0px';\r\n this.stats.dom.style.left = '0px';\r\n this.stats.dom.style.zIndex = '1000';\r\n this.container.appendChild(this.stats.dom);\r\n }\r\n\r\n /**\r\n * 更新性能统计\r\n */\r\n private updatePerformanceStats(): void {\r\n this.fpsFrameCount++;\r\n const now = performance.now();\r\n\r\n if (now - this.fpsLastCheck >= 1000) {\r\n this.currentFps = this.fpsFrameCount;\r\n this.fpsFrameCount = 0;\r\n this.fpsLastCheck = now;\r\n\r\n // 触发性能更新事件\r\n this.events.trigger(EventType2d.RenderEnd, {\r\n fps: this.currentFps,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 加载模型\r\n * @param url 模型文件 URL\r\n * @param options 加载选项\r\n * @returns 加载结果\r\n */\r\n public async loadModel(\r\n url: string,\r\n options?: {\r\n chunkSize?: number;\r\n enableChunkedLoading?: boolean;\r\n enableValidation?: boolean;\r\n }\r\n ) {\r\n await this.loaderModule2d.loadModel(url, options);\r\n \r\n\r\n return {};\r\n }\r\n\r\n /**\r\n * 获取图层列表\r\n * @returns 图层数组\r\n */\r\n public getLayers() {\r\n return this.loaderModule2d.getLayers();\r\n }\r\n\r\n /**\r\n * 按图层获取实体\r\n * @param layerName 图层名称\r\n * @returns 实体数组\r\n */\r\n public getEntitiesByLayer(layerName: string) {\r\n return this.loaderModule2d.getEntitiesByLayer(layerName);\r\n }\r\n\r\n /**\r\n * 设置图层可见性\r\n * @param layerName 图层名称\r\n * @param visible 是否可见\r\n */\r\n public setLayerVisible(layerName: string, visible: boolean): void {\r\n this.layerManager?.setLayerVisible(layerName, visible);\r\n }\r\n\r\n /** 隐藏当前选中/高亮图元所在图层,供右键菜单直接调用。 */\r\n private hideHighlightedLayers(): void {\r\n const layerNames = this.getLayersByModelIds(this.engineStatus2d?.highlightModels ?? []);\r\n layerNames.forEach((layerName) => this.layerManager?.setLayerVisible(layerName, false));\r\n this.layerManager?.refresh();\r\n }\r\n\r\n /** 从 nodeMap 中反查图元所在图层;一个 linkId 可能对应多个合批对象。 */\r\n private getLayersByModelIds(modelIds: any[]): string[] {\r\n const layers = new Set<string>();\r\n modelIds.forEach((id) => {\r\n const nodes = this.loaderModule2d?.model?.nodeMap?.get(String(id)) ?? this.loaderModule2d?.model?.nodeMap?.get(id);\r\n nodes?.forEach((node: any) => {\r\n if (node?.layer) layers.add(node.layer);\r\n });\r\n });\r\n return Array.from(layers);\r\n }\r\n\r\n /**\r\n * 切换主题\r\n * @param theme 'dark' | 'light'\r\n */\r\n public setTheme(theme: Theme2d): void {\r\n this.themeManager.setTheme(theme);\r\n const bgColor = theme === 'dark' ? 0x1a1a1a : 0xf0f0f0;\r\n this.setBackgroundColor(bgColor);\r\n }\r\n\r\n /**\r\n * 重置视图\r\n */\r\n public resetView(): void {\r\n if (this.cameraModule2d) {\r\n this.cameraModule2d.resetView();\r\n }\r\n }\r\n\r\n /**\r\n * 适配视图到模型边界\r\n */\r\n public fitToView(): void { \r\n const metadata = this.dwgData?.metadata;\r\n const extents = metadata?.viewExtents ?? metadata?.extents;\r\n if (extents) {\r\n // metadata.viewExtents 是图纸推荐的默认打开范围;缺失时兼容旧数据的模型整体范围。\r\n this.cameraModule2d.fitToExtents(extents);\r\n }\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n if (this.cameraModule2d) {\r\n this.cameraModule2d.setZoom(zoom);\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前缩放级别\r\n * @returns 缩放级别\r\n */\r\n public getZoom(): number {\r\n if (this.cameraModule2d) {\r\n return this.cameraModule2d.getZoom();\r\n }\r\n return 1;\r\n }\r\n\r\n /**\r\n * 获取性能统计\r\n * @returns 性能统计信息\r\n */\r\n public getPerformanceStats(): PerformanceStats {\r\n const sceneStats = this.sceneModule2d.getSceneStats();\r\n\r\n return {\r\n fps: this.currentFps,\r\n renderTime: 0, // TODO: 实现渲染时间统计\r\n entityCount: sceneStats.objectCount,\r\n visibleEntityCount: sceneStats.objectCount,\r\n };\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n * @param color 颜色值\r\n */\r\n public setBackgroundColor(color: number): void {\r\n this.options.backgroundColor = color;\r\n if (this.sceneModule2d) {\r\n this.sceneModule2d.setBackgroundColor(color);\r\n }\r\n this.cadCursorUI?.setBackgroundColor(color);\r\n this.modelToolModule2d?.updateColorsForBackground(color);\r\n this.layerManager?.refresh();\r\n }\r\n\r\n /**\r\n * 清空场景\r\n */\r\n public clearScene(): void {\r\n if (this.sceneModule2d) {\r\n this.sceneModule2d.clearScene();\r\n }\r\n }\r\n\r\n /**\r\n * 调整渲染器尺寸\r\n */\r\n public resize(): void {\r\n if (this.renderModule2d) {\r\n const width = this.container?.clientWidth ?? 0;\r\n const height = this.container?.clientHeight ?? 0;\r\n this.renderModule2d.setSize(width, height);\r\n }\r\n }\r\n\r\n /**\r\n * 将主 canvas 转换成图片\r\n * @param options 图片导出选项\r\n * @returns 图片信息(包含 Data URL 和 Blob URL)\r\n */\r\n public captureImage(options?: {\r\n format?: 'png' | 'jpeg' | 'webp';\r\n quality?: number;\r\n filename?: string;\r\n download?: boolean;\r\n transparent?: boolean;\r\n hideGrid?: boolean;\r\n hideAxes?: boolean;\r\n }): {\r\n dataURL: string;\r\n blobURL?: string;\r\n blob?: Blob;\r\n } | null {\r\n if (!this.renderer || !this.sceneModule2d) {\r\n console.error('[EngineKernel2d] Renderer or scene module not initialized');\r\n return null;\r\n }\r\n\r\n const canvas = this.renderer.domElement;\r\n const format = options?.format || 'png';\r\n const quality = options?.quality || 0.92;\r\n const mimeType = `image/${format === 'jpeg' ? 'jpeg' : format}`;\r\n const transparent = options?.transparent ?? false;\r\n const hideGrid = options?.hideGrid ?? true;\r\n const hideAxes = options?.hideAxes ?? true;\r\n\r\n // 保存当前状态\r\n const originalBackground = this.scene?.background ?? null;\r\n let originalGridVisible = false;\r\n let originalAxesVisible = false;\r\n\r\n // 保存网格可见性\r\n if (this.sceneModule2d['adaptiveGrid']) {\r\n originalGridVisible = this.sceneModule2d['adaptiveGrid']['gridGroup']?.visible ?? false;\r\n if (hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(false);\r\n }\r\n }\r\n\r\n // 保存坐标轴可见性\r\n if (this.sceneModule2d['axesHelper']) {\r\n originalAxesVisible = this.sceneModule2d['axesHelper'].visible ?? false;\r\n if (hideAxes) {\r\n this.sceneModule2d.setAxesVisible(false);\r\n }\r\n }\r\n\r\n // 设置透明背景\r\n if (transparent && this.scene) {\r\n this.scene.background = null;\r\n }\r\n\r\n // 强制重新渲染一次以确保获取最新画面\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 获取 Data URL\r\n const dataURL = canvas.toDataURL(mimeType, quality);\r\n\r\n // 恢复背景\r\n if (this.scene) {\r\n this.scene.background = originalBackground;\r\n }\r\n\r\n // 恢复网格可见性\r\n if (this.sceneModule2d['adaptiveGrid'] && hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(originalGridVisible);\r\n }\r\n\r\n // 恢复坐标轴可见性\r\n if (this.sceneModule2d['axesHelper'] && hideAxes) {\r\n this.sceneModule2d.setAxesVisible(originalAxesVisible);\r\n }\r\n\r\n // 再次渲染以恢复显示\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n const result: {\r\n dataURL: string;\r\n blobURL?: string;\r\n blob?: Blob;\r\n } = {\r\n dataURL,\r\n };\r\n\r\n // 如果需要下载\r\n if (options?.download) {\r\n const filename = options.filename || `capture-${Date.now()}.${format}`;\r\n\r\n // 创建临时链接触发下载\r\n const link = document.createElement('a');\r\n link.href = dataURL;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n\r\n console.log(`[EngineKernel2d] Image captured and downloaded: ${filename}`);\r\n } else {\r\n console.log('[EngineKernel2d] Image captured');\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 将主 canvas 转换成图片(异步版本,返回 Blob)\r\n * @param options 图片导出选项\r\n * @returns Promise,包含图片信息(Data URL、Blob URL 和 Blob)\r\n */\r\n public async captureImageAsync(options?: {\r\n format?: 'png' | 'jpeg' | 'webp';\r\n quality?: number;\r\n filename?: string;\r\n download?: boolean;\r\n transparent?: boolean;\r\n hideGrid?: boolean;\r\n hideAxes?: boolean;\r\n }): Promise<{\r\n dataURL: string;\r\n blobURL: string;\r\n blob: Blob;\r\n } | null> {\r\n if (!this.renderer || !this.sceneModule2d) {\r\n console.error('[EngineKernel2d] Renderer or scene module not initialized');\r\n return null;\r\n }\r\n\r\n const canvas = this.renderer.domElement;\r\n const format = options?.format || 'png';\r\n const quality = options?.quality || 0.92;\r\n const mimeType = `image/${format === 'jpeg' ? 'jpeg' : format}`;\r\n const transparent = options?.transparent ?? false;\r\n const hideGrid = options?.hideGrid ?? true;\r\n const hideAxes = options?.hideAxes ?? true;\r\n\r\n // 保存当前状态\r\n const originalBackground = this.scene?.background ?? null;\r\n let originalGridVisible = false;\r\n let originalAxesVisible = false;\r\n\r\n // 保存网格可见性\r\n if (this.sceneModule2d['adaptiveGrid']) {\r\n originalGridVisible = this.sceneModule2d['adaptiveGrid']['gridGroup']?.visible ?? false;\r\n if (hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(false);\r\n }\r\n }\r\n\r\n // 保存坐标轴可见性\r\n if (this.sceneModule2d['axesHelper']) {\r\n originalAxesVisible = this.sceneModule2d['axesHelper'].visible ?? false;\r\n if (hideAxes) {\r\n this.sceneModule2d.setAxesVisible(false);\r\n }\r\n }\r\n\r\n // 设置透明背景\r\n if (transparent && this.scene) {\r\n this.scene.background = null;\r\n }\r\n\r\n // 强制重新渲染一次以确保获取最新画面\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 获取 Data URL\r\n const dataURL = canvas.toDataURL(mimeType, quality);\r\n\r\n // 获取 Blob\r\n const blob = await new Promise<Blob>((resolve) => {\r\n canvas.toBlob((b) => {\r\n if (b) resolve(b);\r\n }, mimeType, quality);\r\n });\r\n\r\n // 创建 Blob URL\r\n const blobURL = URL.createObjectURL(blob);\r\n\r\n // 恢复背景\r\n if (this.scene) {\r\n this.scene.background = originalBackground;\r\n }\r\n\r\n // 恢复网格可见性\r\n if (this.sceneModule2d['adaptiveGrid'] && hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(originalGridVisible);\r\n }\r\n\r\n // 恢复坐标轴可见性\r\n if (this.sceneModule2d['axesHelper'] && hideAxes) {\r\n this.sceneModule2d.setAxesVisible(originalAxesVisible);\r\n }\r\n\r\n // 再次渲染以恢复显示\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 如果需要下载\r\n if (options?.download) {\r\n const filename = options.filename || `capture-${Date.now()}.${format}`;\r\n\r\n // 创建临时链接触发下载\r\n const link = document.createElement('a');\r\n link.href = blobURL;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n\r\n console.log(`[EngineKernel2d] Image captured and downloaded: ${filename}`);\r\n } else {\r\n console.log('[EngineKernel2d] Image captured with Blob URL:', blobURL);\r\n }\r\n\r\n return {\r\n dataURL,\r\n blobURL,\r\n blob,\r\n };\r\n }\r\n\r\n /**\r\n * 销毁引擎\r\n */\r\n public dispose(): void {\r\n console.log('[EngineKernel2d] Disposing engine...');\r\n\r\n // 停止渲染\r\n this.stopRendering();\r\n\r\n // 销毁各模块\r\n this.cadCursorUI?.dispose();\r\n this.contextMenuUI?.dispose();\r\n this.loadingUI?.dispose();\r\n this.searchManager?.dispose();\r\n this.themeManager?.dispose();\r\n this.loaderModule2d?.dispose();\r\n this.controlModule2d?.dispose();\r\n this.renderModule2d?.dispose();\r\n this.cameraModule2d?.dispose();\r\n this.sceneModule2d?.dispose();\r\n this.events?.dispose();\r\n if (this.stats?.dom?.parentElement) {\r\n this.stats.dom.parentElement.removeChild(this.stats.dom);\r\n }\r\n\r\n // 清空引用\r\n this.scene = null;\r\n this.camera = null;\r\n this.renderer = null;\r\n this.dwgData = null;\r\n this.stats = undefined;\r\n\r\n console.log('[EngineKernel2d] Engine disposed');\r\n }\r\n}\r\n\r\n/**\r\n * 创建 2D 引擎实例的工厂函数\r\n * @param options 引擎配置选项\r\n * @returns 2D 引擎实例\r\n */\r\nexport function createEngine2d(options: Engine2dOptions): EngineKernel2d {\r\n return new EngineKernel2d(options);\r\n}\r\n\r\nexport default EngineKernel2d;\r\n"],"names":["f","e","module","this","a","c","u","d","l","k","g","r","h","t","v","m","n","p","q","b","w","EventType2d","EventModule2d","debugMode","type","listener","typeListeners","data","error","onceTypeListeners","set","enabled","GRID_VERTEX_SHADER","GRID_FRAGMENT_SHADER","AdaptiveGrid","THREE","scene","camera","container","loop","spacing","safeSpacing","exponent","base","candidates","candidate","normalized","force","containerWidth","containerHeight","zoom","baseWidth","baseHeight","viewWidth","viewHeight","centerX","centerY","worldPerPixelX","worldPerPixelY","targetSpacing","minorSpacing","state","zoomChanged","spacingChanged","movedX","movedY","widthChanged","heightChanged","containerChanged","planeWidth","planeHeight","visible","largeColor","smallColor","minorOpacity","majorOpacity","SceneModule2d","engine","options","bgColor","size","divisions","color","backgroundColor","object","material","i","includeHelpers","objects","child","meshCount","lineCount","groupCount","EngineStatus2d","CameraModule2d","aspect","frustumHalfHeight","frustumHalfWidth","extents","padding","animated","duration","min","max","center","frustumSize","targetLeft","targetRight","targetTop","targetBottom","targetX","targetY","targetZoom","elapsed","progress","easedProgress","start","target","end","x","y","left","right","top","bottom","cameraX","cameraY","screenX","screenY","vector","worldX","worldY","RenderModule2d","renderer","width","height","startTime","renderTime","pixelRatio","depth","stencil","context","Pan2dControls","domElement","event","deltaX","deltaY","factor","frustumHeight","frustumWidth","worldDeltaX","worldDeltaY","zoomFactor","oldZoom","newZoom","halfW","halfH","rect","ndcX","ndcY","now","touch","damping","ControlModule2d","controls","speed","FontLoader","Loader","manager","url","onLoad","onProgress","onError","scope","loader","FileLoader","text","font","json","Font","direction","shapes","paths","createPaths","pl","chars","scale","line_height","offsetX","offsetY","char","ret","createPath","glyph","path","ShapePath","cpx","cpy","cpx1","cpy1","cpx2","cpy2","outline","FontJsonGenerator","fontUrl","res","buffer","opentype","glyphs","upm","extractChar","parts","bb","ch","glyphIndexMap","cpStr","cp","spGlyph","names","get","familyName","subfamily","commands","contours","entries","solids","entry","holes","solid","hole","contour","index","sample","count","other","shouldBeClockwise","current","closeContour","cmd","segments","segment","points","area","j","point","polygon","inside","pi","pj","LayerPanelUI","delegate","panel","header","title","closeBtn","allRow","allEye","allLabel","next","divider","list","origRender","layer","row","eye","swatch","label","open","el","handle","panelRect","parentRect","ox","oy","onMove","ev","onUp","LayerManager","layers","layerName","name","modelId","nodes","node","root","prefix","obj","activeIds","id","toVector3","getGeometryBounds","geometry","composeMatrix","position_","scale_","rotation_","position","rotation","quaternion","getInsertMatrix","entity","getPointsBounds","BlockFlattener","geometryFactory","blocks","block","entities","blockId","level","cached","origin","baseMatrix","items","blockItems","matrix","clipPolygon","item","cloned","clipped","insertEntity","linkId","textAnchor","bounds","clipTransform","result","parameters","sorted","value","startT","endT","midT","mid","rX","rY","sX","sY","denominator","cax","cay","cross","dot","lengthSq","uv","positions","uvs","hasUv","clipTriangles","readVertex","vertexIndex","vertexCount","offset","subject","clipTriangle","vertex","clippedGeometry","triangles","fallback","triangle","vertices","orientation","output","input","previous","previousInside","currentInside","edgeStart","edgeEnd","edgeX","edgeY","startValue","endValue","s","o","require","A","O","I","_","S","z","C","B","E","R","global","T","D","F","N","U","P","L","Z","W","M","H","G","K","Y","X","V","J","CadDataSource","manifestUrl","manifest","response","baseUrl","fetchJson","resolveImageUrl","sourceBaseUrl","metadata","tiles","tile","insert","blocksUrl","blockParts","partUrl","part","message","rawPath","fileName","tileUrl","inserts","stack","children","zip","JSZip","manifestPath","sourceUrl","zipFile","match","file","blobUrl","cleanUrl","relativeUrl","exact","lowerPath","matchedName","findSpan","low","high","calcBasisFunctions","span","saved","rv","lv","temp","calcBSplinePoint","Vector4","Nj","wNj","calcBasisFunctionDerivatives","zeroArr","ders","ndu","s1","s2","rk","pk","j1","j2","calcBSplineDerivatives","nd","du","CK","nders","Pw","calcKoverI","nom","denom","calcRationalCurveDerivatives","Pders","Aders","wders","Vector3","calcNURBSDerivatives","NURBSCurve","Curve","degree","knots","controlPoints","startKnot","endKnot","knotsLength","pointsLength","optionalTarget","hpoint","NURBSUtils.calcBSplinePoint","tangent","NURBSUtils.calcNURBSDerivatives","mergeGeometries","geometries","useGroups","isIndexed","attributesUsed","morphAttributesUsed","attributes","morphAttributes","morphTargetsRelative","mergedGeometry","BufferGeometry","attributesCount","indexOffset","mergedIndex","mergedAttribute","mergeAttributes","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","TypedArray","itemSize","gpuType","arrayLength","attribute","array","BufferAttribute","tupleOffset","EPSILON","HATCH_Z_OFFSET","UNKNOWN_HATCH_FILL_COLOR","HatchPatternRenderer","loopSet","patternItem","patternName","validLoops","typedLoops","outers","loops","last","first","colorOverride","outer","shape","BufferGeometryUtils.mergeGeometries","gradient","colors","stops","sizeX","sizeY","radius","angle","axis","normal","source","safeDepth","ab","bc","ca","relative","shift","axisSpan","normalSpan","stop","tint","localPoints","maxSegments","segmentCount","diagonal","patternLine","familySegments","segmentBudget","patternTransform","dir","normalStep","corners","baseProjection","projections","corner","minProjection","maxProjection","i0","i1","boundsCenter","lineAnchor","lineCenter","visibleStart","visibleEnd","tValues","p0","p1","unique","t0","t1","holePieces","dashLengths","lineDirection","length","pattern","period","sum","anchor","sign","startPhaseDistance","startOffsetInPeriod","cursor","patternIndex","distanceInCurrentDash","dash","remainingDash","rawDash","intervals","cma","xi","yi","xj","yj","distance","values","epsilon","EntityGeometryFactory","textFactory","curve","rawPoints","startPoint","endPoint","bulge","chord","chordLength","includedAngle","startAngle","arcPoints","sampled","spline","weight","controlPointCount","imageUrl","uVector","vVector","uScale","vScale","up","p2","p3","fade","SceneBatchBuilder","_engine","model","targetGroup","modelMap","nodePoints","map","key","dashedPoints","layerItem","itemLineType","lineType","rawPattern","rawScale","unit","totalPatternLength","dotLength","sourceLength","isDraw","dashLength","nextCursor","lines","objectIndex","renderItems","useVertexColors","texture","opacity","group","keepUv","keepColor","colorValue","mesh","rawText","colorText","TextGeometryFactory","curveSegments","textPosition","widthScale","hitbox","hitboxBounds","lineHeight","line","safeLine","box","LoaderModule2d","dwgData","parsed","viewRotation","jsonData","flattener","totalTiles","chunkSize","enableChunkedLoading","batchBuilder","linkIds","renderItemCount","chunkCount","resolve","collectFromEntities","background","WorldToScreen","worldPos","pos","objectsToTest","intersects","OctreeBox2d","rayCaster","meshs","mousePoint","interList","threeBox","isinter","ps","screenLines","geo","invisibleMesh","ele","ids","lineDir","lineLengthSq","toPoint","projectionPoint","LinkView2d3d","this_","dpr","currentAngle","angleDelta","ctx","cx","cy","coneLength","halfAngle","grad","lx","ly","rx","ry","screenPoint","halfSize","worldPoint","mode","payload","hasPosition","hasRotation","detail","mappedZ","pointerAngle","LinkElement2d3d","ModelToolModule2d","engine_","newGeometry","_model","models","callback","isLightBackground","originalColor","displayColor","applyColor","colorAttribute","replaceWhite","hoverModels","selectedIds","isClear","disposeMaterial","lineCoordinateCount","meshVertexCount","HandelBehaved2d","_handelBehaved","self","handle_Mouse_Down","handle_Mouse_Up","handle_Mouse_Move","handle_Touch_Start","handle_Touch_End","handle_Touch_Move","handle_key_down","handle_key_up","getNormalizedMousePosition","mouse","createRaycaster","raycaster","enrichEventWithRaycast","includeCatch","catchResult","handle_catch","currentEvent","nowTime","timeDiff","current_position","dis","convertTouchToMouseEvent","touchEvent","mouseEvent","MouseCoordUI","EventType","InteractionModule2d","world","_event","CadCursorUI","canvas","style","cursorColor","MENU_ITEMS","ContextMenuUI","onAction","menu","btn","defaults","defaultItem","menuW","menuH","contW","contH","action","states","LoadingUI","pct","overlay","card","spinnerWrap","track","bar","ICON_SEARCH","ICON_CLOSE","SearchUI","wrapper","hasText","query","results","li","escapedText","normalizedQuery","escapedQuery","SearchManager","score","normalizedText","gap","nextIndex","THEME_VARS","ThemeManager","initial","theme","vars","val","EngineKernel2d","nextTheme","Stats","modelIds","sceneStats","format","quality","mimeType","transparent","hideGrid","hideAxes","originalBackground","originalGridVisible","originalAxesVisible","dataURL","filename","link","blob","blobURL","createEngine2d"],"mappings":"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","x_google_ignoreList":[0,9,15,17,18,19]}
1
+ {"version":3,"file":"dwg-preview.umd.js","sources":["../node_modules/stats.js/build/stats.min.js","../src/core2d/v2/modules/eventModule2d.ts","../src/core2d/v2/modules/adaptiveGrid.ts","../src/core2d/v2/modules/sceneModule2d.ts","../src/core2d/v2/status/engineStatus2d.ts","../src/core2d/v2/modules/cameraModule2d.ts","../src/core2d/v2/modules/renderModule2d.ts","../src/core2d/v2/controls/Pan2dControls.ts","../src/core2d/v2/modules/controlModule2d.ts","../node_modules/three/examples/jsm/loaders/FontLoader.js","../src/common/FontJsonGenerator.ts","../src/core2d/v2/ui/layerPanelUI.ts","../src/core2d/v2/managers/layer/index.ts","../src/core2d/v2/loader/geometryUtils.ts","../src/core2d/v2/loader/BlockFlattener.ts","../node_modules/jszip/dist/jszip.min.js","../src/core2d/v2/loader/CadDataSource.ts","../node_modules/three/examples/jsm/curves/NURBSUtils.js","../node_modules/three/examples/jsm/curves/NURBSCurve.js","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../src/core2d/v2/loader/HatchPatternRenderer.ts","../src/core2d/v2/loader/EntityGeometryFactory.ts","../src/core2d/v2/loader/SceneBatchBuilder.ts","../src/core2d/v2/loader/TextGeometryFactory.ts","../src/core2d/v2/modules/loaderModule2d.ts","../src/common/WorldToScreen.ts","../src/core2d/v2/managers/octreeBox2d/index.ts","../src/core2d/v2/managers/linkView2d3d/index.ts","../src/core2d/v2/managers/linkElement2d3d/index.ts","../src/core2d/v2/modules/modelToolModule2d.ts","../src/core2d/v2/status/handelBehaved2d.ts","../src/core2d/v2/ui/mouseCoordUI.ts","../src/core2d/v2/enum/eventType.ts","../src/core2d/v2/modules/interactionModule2d.ts","../src/core2d/v2/ui/cadCursorUI.ts","../src/core2d/v2/ui/contextMenuUI.ts","../src/core2d/v2/ui/loadingUI.ts","../src/core2d/v2/ui/searchUI.ts","../src/core2d/v2/managers/search/index.ts","../src/core2d/v2/theme/index.ts","../src/core2d/v2/EngineKernel2d.ts"],"sourcesContent":["// stats.js - http://github.com/mrdoob/stats.js\n(function(f,e){\"object\"===typeof exports&&\"undefined\"!==typeof module?module.exports=e():\"function\"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?\"block\":\"none\";l=a}var l=0,c=document.createElement(\"div\");c.style.cssText=\"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";c.addEventListener(\"click\",function(a){a.preventDefault();\nu(++l%c.children.length)},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel(\"FPS\",\"#0ff\",\"#002\")),h=e(new f.Panel(\"MS\",\"#0f0\",\"#020\"));if(self.performance&&self.performance.memory)var t=e(new f.Panel(\"MB\",\"#f08\",\"#201\"));u(0);return{REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now()},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/\n1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement(\"canvas\");q.width=r;q.height=h;q.style.cssText=\"width:80px;height:48px\";var b=q.getContext(\"2d\");b.font=\"bold \"+9*a+\"px Helvetica,Arial,sans-serif\";b.textBaseline=\"top\";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);\nb.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+\" \"+e+\" (\"+g(c)+\"-\"+g(k)+\")\",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f});\n","/**\r\n * 2D 引擎事件系统模块\r\n * 简化版事件系统,支持发布/订阅模式\r\n */\r\n\r\n/**\r\n * 事件类型枚举\r\n */\r\nexport enum EventType2d {\r\n // 模型加载事件\r\n ModelLoadStart = 'model-load-start',\r\n ModelLoadProgress = 'model-load-progress',\r\n ModelLoaded = 'model-loaded',\r\n ModelLoadError = 'model-load-error',\r\n\r\n // 渲染事件\r\n RenderStart = 'render-start',\r\n RenderEnd = 'render-end',\r\n\r\n // 相机事件\r\n CameraChanged = 'camera-changed',\r\n CameraReset = 'camera-reset',\r\n\r\n // 交互事件\r\n SelectionChanged = 'selection-changed',\r\n HoverChanged = 'hover-changed',\r\n EntityClick = 'entity-click',\r\n\r\n // 图层事件\r\n LayerVisibilityChanged = 'layer-visibility-changed',\r\n LayerColorChanged = 'layer-color-changed',\r\n\r\n // 视图事件\r\n ViewZoomChanged = 'view-zoom-changed',\r\n ViewPanChanged = 'view-pan-changed',\r\n\r\n // 工具事件\r\n ToolActivated = 'tool-activated',\r\n ToolDeactivated = 'tool-deactivated',\r\n\r\n // 错误事件\r\n Error = 'error',\r\n Warning = 'warning',\r\n}\r\n\r\n/**\r\n * 事件监听器函数类型\r\n */\r\nexport type EventListener = (data?: any) => void;\r\n\r\n/**\r\n * 事件监听器映射\r\n */\r\ntype EventListenersMap = Map<EventType2d, Set<EventListener>>;\r\n\r\n/**\r\n * 事件模块类\r\n */\r\nexport class EventModule2d {\r\n private listeners: EventListenersMap = new Map();\r\n private onceListeners: EventListenersMap = new Map();\r\n private debugMode: boolean = false;\r\n\r\n constructor(debugMode: boolean = false) {\r\n this.debugMode = debugMode;\r\n this.initializeEvents();\r\n }\r\n\r\n /**\r\n * 初始化所有事件类型\r\n */\r\n private initializeEvents(): void {\r\n const eventTypes = Object.values(EventType2d);\r\n eventTypes.forEach(type => {\r\n this.listeners.set(type as EventType2d, new Set());\r\n this.onceListeners.set(type as EventType2d, new Set());\r\n });\r\n }\r\n\r\n /**\r\n * 订阅事件\r\n * @param type 事件类型\r\n * @param listener 监听器函数\r\n * @returns 取消订阅的函数\r\n */\r\n public on(type: EventType2d, listener: EventListener): () => void {\r\n if (!this.listeners.has(type)) {\r\n console.warn(`Event type ${type} is not registered`);\r\n return () => {};\r\n }\r\n\r\n this.listeners.get(type)!.add(listener);\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Listener added for ${type}`);\r\n }\r\n\r\n // 返回取消订阅的函数\r\n return () => this.off(type, listener);\r\n }\r\n\r\n /**\r\n * 订阅一次性事件\r\n * @param type 事件类型\r\n * @param listener 监听器函数\r\n */\r\n public once(type: EventType2d, listener: EventListener): void {\r\n if (!this.onceListeners.has(type)) {\r\n console.warn(`Event type ${type} is not registered`);\r\n return;\r\n }\r\n\r\n this.onceListeners.get(type)!.add(listener);\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Once listener added for ${type}`);\r\n }\r\n }\r\n\r\n /**\r\n * 取消订阅事件\r\n * @param type 事件类型\r\n * @param listener 监听器函数\r\n */\r\n public off(type: EventType2d, listener: EventListener): void {\r\n const typeListeners = this.listeners.get(type);\r\n if (typeListeners) {\r\n typeListeners.delete(listener);\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Listener removed for ${type}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 触发事件\r\n * @param type 事件类型\r\n * @param data 事件数据\r\n */\r\n public trigger(type: EventType2d, data?: any): void {\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] Triggering ${type}`, data);\r\n }\r\n\r\n // 触发普通监听器\r\n const typeListeners = this.listeners.get(type);\r\n if (typeListeners && typeListeners.size > 0) {\r\n typeListeners.forEach(listener => {\r\n try {\r\n listener(data);\r\n } catch (error) {\r\n console.error(`[EventModule2d] Error in listener for ${type}:`, error);\r\n }\r\n });\r\n }\r\n\r\n // 触发一次性监听器\r\n const onceTypeListeners = this.onceListeners.get(type);\r\n if (onceTypeListeners && onceTypeListeners.size > 0) {\r\n onceTypeListeners.forEach(listener => {\r\n try {\r\n listener(data);\r\n } catch (error) {\r\n console.error(`[EventModule2d] Error in once listener for ${type}:`, error);\r\n }\r\n });\r\n // 清空一次性监听器\r\n onceTypeListeners.clear();\r\n }\r\n }\r\n\r\n /**\r\n * 移除所有监听器\r\n */\r\n public removeAllListeners(): void {\r\n this.listeners.forEach(set => set.clear());\r\n this.onceListeners.forEach(set => set.clear());\r\n\r\n if (this.debugMode) {\r\n console.log('[EventModule2d] All listeners removed');\r\n }\r\n }\r\n\r\n /**\r\n * 移除指定类型的所有监听器\r\n * @param type 事件类型\r\n */\r\n public removeListenersOfType(type: EventType2d): void {\r\n const typeListeners = this.listeners.get(type);\r\n const onceTypeListeners = this.onceListeners.get(type);\r\n\r\n if (typeListeners) {\r\n typeListeners.clear();\r\n }\r\n if (onceTypeListeners) {\r\n onceTypeListeners.clear();\r\n }\r\n\r\n if (this.debugMode) {\r\n console.log(`[EventModule2d] All listeners removed for ${type}`);\r\n }\r\n }\r\n\r\n /**\r\n * 获取指定类型的监听器数量\r\n * @param type 事件类型\r\n * @returns 监听器数量\r\n */\r\n public getListenerCount(type: EventType2d): number {\r\n const typeListeners = this.listeners.get(type);\r\n const onceTypeListeners = this.onceListeners.get(type);\r\n\r\n const count = (typeListeners?.size || 0) + (onceTypeListeners?.size || 0);\r\n return count;\r\n }\r\n\r\n /**\r\n * 设置调试模式\r\n * @param enabled 是否启用调试模式\r\n */\r\n public setDebugMode(enabled: boolean): void {\r\n this.debugMode = enabled;\r\n }\r\n\r\n /**\r\n * 获取所有事件类型\r\n * @returns 事件类型数组\r\n */\r\n public getAllEventTypes(): EventType2d[] {\r\n return Object.values(EventType2d);\r\n }\r\n\r\n /**\r\n * 销毁事件模块\r\n */\r\n public dispose(): void {\r\n this.removeAllListeners();\r\n this.listeners.clear();\r\n this.onceListeners.clear();\r\n\r\n if (this.debugMode) {\r\n console.log('[EventModule2d] Disposed');\r\n }\r\n }\r\n}\r\n\r\nexport default EventModule2d;\r\n","import * as THREE from 'three';\n\nconst GRID_VERTEX_SHADER = `\n varying vec2 vWorldPos;\n\n void main() {\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n vWorldPos = worldPosition.xy;\n gl_Position = projectionMatrix * viewMatrix * worldPosition;\n }\n`;\n\nconst GRID_FRAGMENT_SHADER = `\n precision highp float;\n\n varying vec2 vWorldPos;\n\n uniform float minorSpacing;\n uniform float majorStep;\n uniform vec2 worldPerPixel;\n uniform float minorThicknessPx;\n uniform float majorThicknessPx;\n uniform vec3 minorColor;\n uniform vec3 majorColor;\n uniform float minorOpacity;\n uniform float majorOpacity;\n\n float distanceToGridLine(float coord, float spacing) {\n float halfSpacing = spacing * 0.5;\n float wrapped = mod(coord + halfSpacing, spacing) - halfSpacing;\n return abs(wrapped);\n }\n\n void main() {\n float spacing = max(minorSpacing, 1e-6);\n float stepMultiplier = max(majorStep, 1.0);\n float majorSpacing = spacing * stepMultiplier;\n\n float distMinorX = distanceToGridLine(vWorldPos.x, spacing);\n float distMinorY = distanceToGridLine(vWorldPos.y, spacing);\n float distMajorX = distanceToGridLine(vWorldPos.x, majorSpacing);\n float distMajorY = distanceToGridLine(vWorldPos.y, majorSpacing);\n\n float minorThicknessX = max(worldPerPixel.x * minorThicknessPx, 1e-7);\n float minorThicknessY = max(worldPerPixel.y * minorThicknessPx, 1e-7);\n float majorThicknessX = max(worldPerPixel.x * majorThicknessPx, 1e-7);\n float majorThicknessY = max(worldPerPixel.y * majorThicknessPx, 1e-7);\n\n float minorMaskX = 1.0 - smoothstep(minorThicknessX, minorThicknessX * 1.5, distMinorX);\n float minorMaskY = 1.0 - smoothstep(minorThicknessY, minorThicknessY * 1.5, distMinorY);\n float majorMaskX = 1.0 - smoothstep(majorThicknessX, majorThicknessX * 1.5, distMajorX);\n float majorMaskY = 1.0 - smoothstep(majorThicknessY, majorThicknessY * 1.5, distMajorY);\n\n float majorMask = clamp(max(majorMaskX, majorMaskY), 0.0, 1.0);\n float minorMask = clamp(max(minorMaskX, minorMaskY), 0.0, 1.0);\n minorMask *= (1.0 - majorMask); // Prevent overlap so bold lines dominate.\n\n vec3 color = minorColor * minorMask * minorOpacity + majorColor * majorMask * majorOpacity;\n float alpha = minorMask * minorOpacity + majorMask * majorOpacity;\n alpha = clamp(alpha, 0.0, 1.0);\n\n if (alpha <= 1e-4) {\n discard;\n }\n\n gl_FragColor = vec4(color, alpha);\n }\n`;\n\ninterface GridState {\n zoom: number;\n centerX: number;\n centerY: number;\n viewWidth: number;\n viewHeight: number;\n containerWidth: number;\n containerHeight: number;\n minorSpacing: number;\n}\n\n/**\n * Adaptive grid rendered via shader to ensure both horizontal and vertical\n * lines remain visible regardless of zoom level or camera angle.\n */\nexport class AdaptiveGrid {\n private scene: THREE.Scene;\n private camera: THREE.OrthographicCamera;\n private container: HTMLElement;\n\n private gridGroup: THREE.Group;\n private gridGeometry?: THREE.PlaneGeometry;\n private gridMaterial?: THREE.ShaderMaterial;\n private gridMesh?: THREE.Mesh<THREE.PlaneGeometry, THREE.ShaderMaterial>;\n\n private animationFrameId: number | null = null;\n private resizeObserver?: ResizeObserver;\n private windowResizeHandler?: () => void;\n\n private lastState: GridState = {\n zoom: -1,\n centerX: Number.NaN,\n centerY: Number.NaN,\n viewWidth: 0,\n viewHeight: 0,\n containerWidth: 0,\n containerHeight: 0,\n minorSpacing: 0,\n };\n\n private largeGridColor = 0x5c5c5c;\n private smallGridColor = 0x3a3a3a;\n\n private readonly desiredMinorPixelSize = 28;\n private readonly coverageMultiplier = 1.6;\n private readonly minSpacing = 1e-4;\n private readonly minorThicknessPx = 0.4;\n private readonly majorThicknessPx = 0.6;\n private minorLineOpacity = 0.05;\n private majorLineOpacity = 0.2;\n private readonly baseRenderOrder = -20;\n private readonly gridZOffset = -0.001;\n private readonly majorStep = 5;\n\n private gridUniforms = {\n minorSpacing: { value: 100 },\n majorStep: { value: this.majorStep },\n worldPerPixel: { value: new THREE.Vector2(1, 1) },\n minorThicknessPx: { value: this.minorThicknessPx },\n majorThicknessPx: { value: this.majorThicknessPx },\n minorColor: { value: new THREE.Color(this.smallGridColor) },\n majorColor: { value: new THREE.Color(this.largeGridColor) },\n minorOpacity: { value: this.minorLineOpacity },\n majorOpacity: { value: this.majorLineOpacity },\n };\n\n constructor(scene: THREE.Scene, camera: THREE.OrthographicCamera, container: HTMLElement) {\n this.scene = scene;\n this.camera = camera;\n this.container = container;\n\n this.gridGroup = new THREE.Group();\n this.gridGroup.name = 'AdaptiveGridGroup';\n this.gridGroup.renderOrder = this.baseRenderOrder;\n this.gridGroup.visible = true;\n this.gridGroup.position.set(0, 0, this.gridZOffset);\n this.scene.add(this.gridGroup);\n\n this.createGridMesh();\n this.updateGrid(true);\n this.startMonitoring();\n this.setupResizeObserver();\n }\n\n /**\n * Build a full-screen quad with a shader-based grid.\n */\n private createGridMesh(): void {\n this.gridGeometry = new THREE.PlaneGeometry(1, 1, 1, 1);\n this.gridMaterial = new THREE.ShaderMaterial({\n uniforms: this.gridUniforms,\n vertexShader: GRID_VERTEX_SHADER,\n fragmentShader: GRID_FRAGMENT_SHADER,\n transparent: true,\n depthWrite: false,\n depthTest: false,\n side: THREE.DoubleSide,\n toneMapped: false,\n });\n\n this.gridMesh = new THREE.Mesh(this.gridGeometry, this.gridMaterial);\n this.gridMesh.frustumCulled = false;\n this.gridMesh.renderOrder = this.baseRenderOrder;\n\n this.gridGroup.add(this.gridMesh);\n }\n\n /**\n * Start a RAF loop to detect camera changes.\n */\n private startMonitoring(): void {\n const loop = () => {\n this.updateGrid();\n this.animationFrameId = requestAnimationFrame(loop);\n };\n\n loop();\n }\n\n private stopMonitoring(): void {\n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n /**\n * Observe container resize for resolution updates.\n */\n private setupResizeObserver(): void {\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.updateGrid(true));\n this.resizeObserver.observe(this.container);\n } else {\n this.windowResizeHandler = () => this.updateGrid(true);\n window.addEventListener('resize', this.windowResizeHandler);\n }\n }\n\n private teardownResizeObserver(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n if (this.windowResizeHandler) {\n window.removeEventListener('resize', this.windowResizeHandler);\n this.windowResizeHandler = undefined;\n }\n }\n\n private normalizeSpacing(spacing: number): number {\n const safeSpacing = Math.max(spacing, this.minSpacing);\n const exponent = Math.floor(Math.log10(safeSpacing));\n const base = Math.pow(10, exponent);\n const candidates = [1, 2, 5, 10];\n\n for (const candidate of candidates) {\n const normalized = candidate * base;\n if (safeSpacing <= normalized) {\n return normalized;\n }\n }\n\n return 10 * base;\n }\n\n /**\n * Update shader uniforms + quad transform based on camera state.\n */\n private updateGrid(force: boolean = false): void {\n if (!this.gridMesh) {\n return;\n }\n\n const containerWidth = Math.max(1, this.container.clientWidth);\n const containerHeight = Math.max(1, this.container.clientHeight);\n const zoom = this.camera.zoom;\n const baseWidth = this.camera.right - this.camera.left;\n const baseHeight = this.camera.top - this.camera.bottom;\n const viewWidth = Math.max(this.minSpacing, baseWidth / zoom);\n const viewHeight = Math.max(this.minSpacing, baseHeight / zoom);\n const centerX = this.camera.position.x;\n const centerY = this.camera.position.y;\n\n const worldPerPixelX = viewWidth / containerWidth;\n const worldPerPixelY = viewHeight / containerHeight;\n const targetSpacing = worldPerPixelX * this.desiredMinorPixelSize;\n const minorSpacing = this.normalizeSpacing(targetSpacing);\n const state = this.lastState;\n\n if (!force) {\n const zoomChanged = Math.abs(zoom - state.zoom) / Math.max(0.0001, state.zoom || 1) > 0.02;\n const spacingChanged = Math.abs(minorSpacing - state.minorSpacing) > state.minorSpacing * 0.05;\n const movedX = Math.abs(centerX - state.centerX) > Math.max(minorSpacing * 0.5, 0.01);\n const movedY = Math.abs(centerY - state.centerY) > Math.max(minorSpacing * 0.5, 0.01);\n const widthChanged = Math.abs(viewWidth - state.viewWidth) > state.viewWidth * 0.01;\n const heightChanged = Math.abs(viewHeight - state.viewHeight) > state.viewHeight * 0.01;\n const containerChanged = containerWidth !== state.containerWidth || containerHeight !== state.containerHeight;\n\n if (!(zoomChanged || spacingChanged || movedX || movedY || widthChanged || heightChanged || containerChanged)) {\n return;\n }\n }\n\n const planeWidth = viewWidth * this.coverageMultiplier;\n const planeHeight = viewHeight * this.coverageMultiplier;\n\n this.gridMesh.scale.set(planeWidth, planeHeight, 1);\n this.gridMesh.position.set(centerX, centerY, 0);\n\n this.gridUniforms.minorSpacing.value = minorSpacing;\n this.gridUniforms.worldPerPixel.value.set(worldPerPixelX, worldPerPixelY);\n\n this.lastState = {\n zoom,\n centerX,\n centerY,\n viewWidth,\n viewHeight,\n containerWidth,\n containerHeight,\n minorSpacing,\n };\n }\n\n /**\n * Toggle overall grid visibility.\n */\n public setVisible(visible: boolean): void {\n this.gridGroup.visible = visible;\n }\n\n /**\n * Update grid colors.\n */\n public setColors(largeColor: number, smallColor: number): void {\n this.largeGridColor = largeColor;\n this.smallGridColor = smallColor;\n\n this.gridUniforms.majorColor.value.setHex(largeColor);\n this.gridUniforms.minorColor.value.setHex(smallColor);\n }\n /**\n * 设置网格线条透明度。\n * @param minorOpacity 细网格线透明度 (0~1)\n * @param majorOpacity 粗网格线透明度 (0~1)\n */\n public setOpacity(minorOpacity: number, majorOpacity: number): void {\n this.minorLineOpacity = Math.max(0, Math.min(1, minorOpacity));\n this.majorLineOpacity = Math.max(0, Math.min(1, majorOpacity));\n\n this.gridUniforms.minorOpacity.value = this.minorLineOpacity;\n this.gridUniforms.majorOpacity.value = this.majorLineOpacity;\n }\n\n /**\n * Dispose GPU resources.\n */\n public dispose(): void {\n this.stopMonitoring();\n this.teardownResizeObserver();\n\n if (this.gridMesh) {\n this.gridGroup.remove(this.gridMesh);\n }\n\n if (this.gridGeometry) {\n this.gridGeometry.dispose();\n this.gridGeometry = undefined;\n }\n\n if (this.gridMaterial) {\n this.gridMaterial.dispose();\n this.gridMaterial = undefined;\n }\n\n this.gridMesh = undefined;\n }\n}\n\nexport default AdaptiveGrid;\n","/**\r\n * 2D 引擎场景管理模块\r\n * 负责创建和管理 Three.js 场景\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { Engine2dOptions } from '../types/entityTypes';\r\nimport { AdaptiveGrid } from './adaptiveGrid';\r\n\r\nexport class SceneModule2d {\r\n private engine: any;\r\n public scene: THREE.Scene;\r\n private options: Engine2dOptions;\r\n\r\n // 辅助元素\r\n private adaptiveGrid?: AdaptiveGrid;\r\n private axesHelper?: THREE.AxesHelper;\r\n\r\n constructor(engine: any, options: Engine2dOptions) {\r\n this.engine = engine;\r\n this.options = options;\r\n this.scene = this.createScene();\r\n this.initHelpers();\r\n }\r\n\r\n /**\r\n * 创建 2D 场景\r\n */\r\n private createScene(): THREE.Scene {\r\n const scene = new THREE.Scene();\r\n\r\n // 设置背景色\r\n const bgColor = this.options.backgroundColor ?? 0x1a1a1a;\r\n scene.background = new THREE.Color(bgColor);\r\n\r\n // 2D 场景不需要雾效等效果\r\n // 设置场景为 2D 模式\r\n (scene as any).is2D = true;\r\n\r\n return scene;\r\n }\r\n\r\n /**\r\n * 初始化辅助工具\r\n */\r\n private initHelpers(): void {\r\n // 不在这里创建网格,因为相机模块可能还没有初始化\r\n // 网格将在引擎初始化完成后创建\r\n\r\n // 坐标轴辅助(可选)\r\n if (this.options.axesEnabled) {\r\n this.createAxes();\r\n }\r\n }\r\n\r\n /**\r\n * 延迟初始化网格(在所有模块创建完成后调用)\r\n */\r\n public initGrid(): void {\r\n if (this.options.gridEnabled) {\r\n this.createGrid();\r\n }\r\n }\r\n\r\n /**\r\n * 创建网格辅助(自适应网格)\r\n */\r\n public createGrid(size: number = 1000, divisions: number = 50): void {\r\n // 移除旧的自适应网格\r\n if (this.adaptiveGrid) {\r\n this.adaptiveGrid.dispose();\r\n this.adaptiveGrid = undefined;\r\n }\r\n\r\n // 创建自适应网格\r\n this.adaptiveGrid = new AdaptiveGrid(\r\n this.scene,\r\n this.engine.cameraModule2d.orthographicCamera,\r\n this.engine.renderModule2d.container\r\n );\r\n\r\n // 根据当前背景颜色设置网格颜色\r\n const bgColor = this.options.backgroundColor ?? 0x1a1a1a;\r\n this.updateGridColorsByBackground(bgColor);\r\n }\r\n\r\n /**\r\n * 创建坐标轴辅助\r\n */\r\n public createAxes(size: number = 100): void {\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper);\r\n }\r\n\r\n this.axesHelper = new THREE.AxesHelper(size);\r\n\r\n // 调整坐标轴方向以适应 2D 视图\r\n this.axesHelper.rotation.z = 0;\r\n\r\n // 先添加到场景\r\n this.scene.add(this.axesHelper);\r\n\r\n // 确保坐标轴在场景中最后渲染,避免被网格等对象遮挡\r\n // 通过将其移除再重新添加到最后\r\n this.scene.remove(this.axesHelper);\r\n this.scene.add(this.axesHelper);\r\n\r\n // 设置渲染顺序,确保坐标轴在最后渲染\r\n this.axesHelper.renderOrder = 999;\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n * @param color 颜色值\r\n */\r\n public setBackgroundColor(color: number): void {\r\n this.scene.background = new THREE.Color(color);\r\n\r\n // 根据背景亮度自动调整网格颜色\r\n this.updateGridColorsByBackground(color);\r\n }\r\n\r\n /**\r\n * 根据背景颜色更新网格颜色\r\n * @param backgroundColor 背景颜色值\r\n */\r\n private updateGridColorsByBackground(backgroundColor: number): void {\r\n if (!this.adaptiveGrid) {\r\n return;\r\n }\r\n\r\n // 计算背景亮度\r\n const color = new THREE.Color(backgroundColor);\r\n const luminance = 0.299 * color.r + 0.587 * color.g + 0.114 * color.b;\r\n\r\n // 如果背景较暗(亮度 < 0.5),使用浅色网格\r\n if (luminance < 0.5) {\r\n // 浅色网格:大网格白色,小网格浅灰色\r\n this.adaptiveGrid.setColors(0xffffff, 0xffffff);\r\n this.adaptiveGrid.setOpacity(0.2,0.3)\r\n } else {\r\n // 深色网格:大网格深灰色,小网格更深的灰色\r\n this.adaptiveGrid.setColors(0x000000, 0x000000);\r\n this.adaptiveGrid.setOpacity(0.05,0.2)\r\n }\r\n }\r\n\r\n /**\r\n * 添加对象到场景\r\n * @param object Three.js 对象\r\n */\r\n public addObject(object: THREE.Object3D): void {\r\n this.scene.add(object);\r\n }\r\n\r\n /**\r\n * 从场景移除对象\r\n * @param object Three.js 对象\r\n */\r\n public removeObject(object: THREE.Object3D): void {\r\n this.scene.remove(object);\r\n\r\n // 释放资源\r\n if (object instanceof THREE.Mesh) {\r\n object.geometry.dispose();\r\n if (Array.isArray(object.material)) {\r\n object.material.forEach(material => material.dispose());\r\n } else {\r\n object.material.dispose();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空场景\r\n */\r\n public clearScene(): void {\r\n // 从后往前遍历,避免移除时的索引问题\r\n for (let i = this.scene.children.length - 1; i >= 0; i--) {\r\n const object = this.scene.children[i];\r\n\r\n // 保留坐标轴\r\n if (object === this.axesHelper) {\r\n continue;\r\n }\r\n\r\n // 保留自适应网格\r\n if (this.adaptiveGrid) {\r\n // 自适应网格会自己管理,不在这里删除\r\n continue;\r\n }\r\n\r\n this.removeObject(object);\r\n }\r\n\r\n // 触发场景清空事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('scene-cleared' as any);\r\n }\r\n }\r\n\r\n /**\r\n * 获取场景中的所有对象\r\n * @param includeHelpers 是否包含辅助对象\r\n * @returns 对象数组\r\n */\r\n public getObjects(includeHelpers: boolean = false): THREE.Object3D[] {\r\n const objects: THREE.Object3D[] = [];\r\n\r\n this.scene.children.forEach(child => {\r\n if (includeHelpers || (child !== this.axesHelper)) {\r\n objects.push(child);\r\n }\r\n });\r\n\r\n return objects;\r\n }\r\n\r\n /**\r\n * 获取场景统计信息\r\n * @returns 统计信息对象\r\n */\r\n public getSceneStats(): {\r\n objectCount: number;\r\n meshCount: number;\r\n lineCount: number;\r\n groupCount: number;\r\n } {\r\n let meshCount = 0;\r\n let lineCount = 0;\r\n let groupCount = 0;\r\n\r\n this.scene.children.forEach(child => {\r\n if (child instanceof THREE.Mesh) meshCount++;\r\n else if (child instanceof THREE.Line) lineCount++;\r\n else if (child instanceof THREE.Group) groupCount++;\r\n });\r\n\r\n return {\r\n objectCount: this.scene.children.length,\r\n meshCount,\r\n lineCount,\r\n groupCount,\r\n };\r\n }\r\n\r\n /**\r\n * 显示/隐藏网格\r\n * @param visible 是否可见\r\n */\r\n public setGridVisible(visible: boolean): void {\r\n if (this.adaptiveGrid) {\r\n this.adaptiveGrid.setVisible(visible);\r\n }\r\n }\r\n\r\n /**\r\n * 显示/隐藏坐标轴\r\n * @param visible 是否可见\r\n */\r\n public setAxesVisible(visible: boolean): void {\r\n if (this.axesHelper) {\r\n this.axesHelper.visible = visible;\r\n }\r\n }\r\n\r\n /**\r\n * 销毁场景模块\r\n */\r\n public dispose(): void {\r\n // 清空场景\r\n this.clearScene();\r\n\r\n // 移除自适应网格\r\n if (this.adaptiveGrid) {\r\n this.adaptiveGrid.dispose();\r\n this.adaptiveGrid = undefined;\r\n }\r\n\r\n // 移除坐标轴\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper);\r\n this.axesHelper = undefined;\r\n }\r\n\r\n // 清理场景\r\n this.scene.clear();\r\n }\r\n}\r\n\r\nexport default SceneModule2d;\r\n","// \r\nexport class EngineStatus2d{\r\n private engine: any;\r\n public isFree: boolean;\r\n // 高亮模型\r\n public highlightModels: any[];\r\n public highlightHoverModels:any[]\r\n // 隐藏的毛线哦\r\n public hideModels: any[];\r\n // 半透明的模型\r\n public translucentModels: any[];\r\n // 已加载的模型\r\n public models: any[];\r\n \r\n constructor(engine: any){\r\n this.engine = engine;\r\n this.isFree = true;\r\n this.highlightModels = [];\r\n this.hideModels = [];\r\n this.translucentModels = [];\r\n this.highlightHoverModels = []\r\n this.models = [];\r\n }\r\n \r\n}","/**\r\n * 2D 引擎相机管理模块\r\n * 负责管理正交相机(2D 视图专用)\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { ViewBounds } from '../types/entityTypes';\r\n\r\nexport class CameraModule2d {\r\n private engine: any;\r\n public orthographicCamera: THREE.OrthographicCamera;\r\n private container: HTMLElement;\r\n\r\n // 相机配置\r\n private frustumSize: number = 1000;\r\n private near: number = 0.1;\r\n private far: number = 10000;\r\n private initialZoom: number = 1;\r\n\r\n // 相机位置\r\n private defaultPosition: THREE.Vector3 = new THREE.Vector3(0, 0, 1000);\r\n\r\n constructor(engine: any, container: HTMLElement) {\r\n this.engine = engine;\r\n this.container = container;\r\n this.orthographicCamera = this.createOrthographicCamera();\r\n }\r\n\r\n /**\r\n * 创建正交相机\r\n */\r\n private createOrthographicCamera(): THREE.OrthographicCamera {\r\n const aspect = this.container.clientWidth / this.container.clientHeight;\r\n const frustumHalfHeight = this.frustumSize / 2;\r\n const frustumHalfWidth = frustumHalfHeight * aspect;\r\n\r\n const camera = new THREE.OrthographicCamera(\r\n -frustumHalfWidth,\r\n frustumHalfWidth,\r\n frustumHalfHeight,\r\n -frustumHalfHeight,\r\n this.near,\r\n this.far\r\n );\r\n\r\n // 设置相机位置(2D 视图从上往下看)\r\n camera.position.copy(this.defaultPosition);\r\n camera.lookAt(0, 0, 0);\r\n camera.zoom = this.initialZoom;\r\n camera.updateProjectionMatrix();\r\n\r\n return camera;\r\n }\r\n\r\n // 动画相关\r\n private animationId: number | null = null;\r\n private animationStartTime: number = 0;\r\n private animationDuration: number = 800; // 默认动画时长 800ms\r\n private animationStartState: any = {};\r\n private animationTargetState: any = {};\r\n\r\n /**\r\n * 适配视图到模型边界\r\n * @param extents 模型边界 { min: [x, y, z], max: [x, y, z] }\r\n * @param padding 边距(默认 1.2 = 20% 边距)\r\n * @param animated 是否使用动画(默认 true)\r\n * @param duration 动画时长(毫秒,默认 800)\r\n */\r\n public fitToExtents(\r\n extents: { min: number[]; max: number[] },\r\n padding: number = 1.2,\r\n animated: boolean = true,\r\n duration: number = 800\r\n ): void {\r\n const min = new THREE.Vector3(extents.min[0], extents.min[1]);\r\n const max = new THREE.Vector3(extents.max[0], extents.max[1]);\r\n\r\n // 检查边界是否有效\r\n const boundsValid = min.distanceTo(max) > 0.001;\r\n if (!boundsValid) {\r\n console.warn('[CameraModule2d] Invalid extents, using default view');\r\n this.resetView();\r\n return;\r\n }\r\n\r\n // 计算边界中心\r\n const center = new THREE.Vector3();\r\n center.addVectors(min, max).multiplyScalar(0.5);\r\n\r\n // 计算边界尺寸\r\n const size = new THREE.Vector3();\r\n size.subVectors(max, min);\r\n\r\n // 计算需要的视锥体大小\r\n const maxDim = Math.max(size.x, size.y);\r\n const frustumSize = maxDim * padding;\r\n\r\n // 更新相机参数\r\n const aspect = this.container.clientWidth / this.container.clientHeight;\r\n const frustumHalfHeight = frustumSize / 2;\r\n const frustumHalfWidth = frustumHalfHeight * aspect;\r\n\r\n // 目标状态\r\n const targetLeft = -frustumHalfWidth;\r\n const targetRight = frustumHalfWidth;\r\n const targetTop = frustumHalfHeight;\r\n const targetBottom = -frustumHalfHeight;\r\n const targetX = center.x;\r\n const targetY = center.y;\r\n const targetZoom = 1;\r\n\r\n // 如果不使用动画,直接设置\r\n if (!animated) {\r\n this.orthographicCamera.left = targetLeft;\r\n this.orthographicCamera.right = targetRight;\r\n this.orthographicCamera.top = targetTop;\r\n this.orthographicCamera.bottom = targetBottom;\r\n this.orthographicCamera.position.set(targetX, targetY, this.defaultPosition.z);\r\n this.orthographicCamera.zoom = targetZoom;\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 同步控制器\r\n if (this.engine.controlModule2d?.panControls) {\r\n this.engine.controlModule2d.panControls.setPosition(targetX, targetY);\r\n this.engine.controlModule2d.panControls.setZoom(targetZoom);\r\n }\r\n\r\n // 触发相机变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-changed' as any, {\r\n type: 'fit-to-extents',\r\n center,\r\n size,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n // 使用动画过渡\r\n // 取消之前的动画\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId);\r\n this.animationId = null;\r\n }\r\n\r\n // 保存起始状态\r\n this.animationStartState = {\r\n left: this.orthographicCamera.left,\r\n right: this.orthographicCamera.right,\r\n top: this.orthographicCamera.top,\r\n bottom: this.orthographicCamera.bottom,\r\n x: this.orthographicCamera.position.x,\r\n y: this.orthographicCamera.position.y,\r\n zoom: this.orthographicCamera.zoom,\r\n };\r\n\r\n // 保存目标状态\r\n this.animationTargetState = {\r\n left: targetLeft,\r\n right: targetRight,\r\n top: targetTop,\r\n bottom: targetBottom,\r\n x: targetX,\r\n y: targetY,\r\n zoom: targetZoom,\r\n };\r\n\r\n this.animationDuration = duration;\r\n this.animationStartTime = performance.now();\r\n\r\n // 开始动画\r\n this.animateFitToExtents(center, size);\r\n }\r\n\r\n /**\r\n * 缓动函数 - easeOutCubic\r\n * @param t 进度 0-1\r\n * @returns 缓动后的值\r\n */\r\n private easeOutCubic(t: number): number {\r\n return 1 - Math.pow(1 - t, 3);\r\n }\r\n\r\n /**\r\n * 执行 fitToExtents 动画\r\n */\r\n private animateFitToExtents(center: THREE.Vector3, size: THREE.Vector3): void {\r\n const currentTime = performance.now();\r\n const elapsed = currentTime - this.animationStartTime;\r\n const progress = Math.min(elapsed / this.animationDuration, 1);\r\n const easedProgress = this.easeOutCubic(progress);\r\n\r\n // 插值计算当前状态\r\n const start = this.animationStartState;\r\n const target = this.animationTargetState;\r\n\r\n this.orthographicCamera.left = this.lerp(start.left, target.left, easedProgress);\r\n this.orthographicCamera.right = this.lerp(start.right, target.right, easedProgress);\r\n this.orthographicCamera.top = this.lerp(start.top, target.top, easedProgress);\r\n this.orthographicCamera.bottom = this.lerp(start.bottom, target.bottom, easedProgress);\r\n this.orthographicCamera.position.x = this.lerp(start.x, target.x, easedProgress);\r\n this.orthographicCamera.position.y = this.lerp(start.y, target.y, easedProgress);\r\n this.orthographicCamera.zoom = this.lerp(start.zoom, target.zoom, easedProgress);\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 同步控制器\r\n if (this.engine.controlModule2d?.panControls) {\r\n this.engine.controlModule2d.panControls.setPosition(\r\n this.orthographicCamera.position.x,\r\n this.orthographicCamera.position.y\r\n );\r\n this.engine.controlModule2d.panControls.setZoom(this.orthographicCamera.zoom);\r\n }\r\n\r\n // 触发相机变化事件(动画过程中持续触发)\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-changed' as any, {\r\n type: 'fit-to-extents',\r\n center,\r\n size,\r\n progress: easedProgress,\r\n });\r\n }\r\n\r\n // 继续动画或结束\r\n if (progress < 1) {\r\n this.animationId = requestAnimationFrame(() => this.animateFitToExtents(center, size));\r\n } else {\r\n this.animationId = null;\r\n }\r\n }\r\n\r\n /**\r\n * 线性插值\r\n */\r\n private lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t;\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n // 移除缩放限制,允许任意缩放级别\r\n this.orthographicCamera.zoom = zoom;\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 触发缩放变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('view-zoom-changed' as any, { zoom });\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前缩放级别\r\n * @returns 缩放级别\r\n */\r\n public getZoom(): number {\r\n return this.orthographicCamera.zoom;\r\n }\r\n\r\n /**\r\n * 设置相机位置\r\n * @param x X 坐标\r\n * @param y Y 坐标\r\n */\r\n public setPosition(x: number, y: number): void {\r\n this.orthographicCamera.position.set(x, y, this.defaultPosition.z);\r\n\r\n // 触发平移变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('view-pan-changed' as any, { x, y });\r\n }\r\n }\r\n\r\n /**\r\n * 获取相机位置\r\n * @returns 位置向量\r\n */\r\n public getPosition(): THREE.Vector3 {\r\n return this.orthographicCamera.position.clone();\r\n }\r\n\r\n /**\r\n * 重置相机视图\r\n */\r\n public resetView(): void {\r\n this.orthographicCamera.position.copy(this.defaultPosition);\r\n this.orthographicCamera.zoom = this.initialZoom;\r\n this.orthographicCamera.updateProjectionMatrix();\r\n\r\n // 触发相机重置事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-reset' as any);\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前视图边界\r\n * @returns 视图边界\r\n */\r\n public getViewBounds(): ViewBounds {\r\n const camera = this.orthographicCamera;\r\n const zoom = camera.zoom;\r\n\r\n // 计算视图边界(考虑缩放)\r\n const left = camera.left / zoom;\r\n const right = camera.right / zoom;\r\n const top = camera.top / zoom;\r\n const bottom = camera.bottom / zoom;\r\n\r\n // 相对于相机位置的偏移\r\n const cameraX = camera.position.x;\r\n const cameraY = camera.position.y;\r\n\r\n return {\r\n minX: cameraX + left,\r\n maxX: cameraX + right,\r\n minY: cameraY + bottom,\r\n maxY: cameraY + top,\r\n width: right - left,\r\n height: top - bottom,\r\n };\r\n }\r\n\r\n /**\r\n * 屏幕坐标转世界坐标\r\n * @param screenX 屏幕 X 坐标\r\n * @param screenY 屏幕 Y 坐标\r\n * @returns 世界坐标向量\r\n */\r\n public screenToWorld(screenX: number, screenY: number): THREE.Vector3 {\r\n const vector = new THREE.Vector3(\r\n (screenX / this.container.clientWidth) * 2 - 1,\r\n -(screenY / this.container.clientHeight) * 2 + 1,\r\n 0.5\r\n );\r\n\r\n vector.unproject(this.orthographicCamera);\r\n\r\n return vector;\r\n }\r\n\r\n /**\r\n * 世界坐标转屏幕坐标\r\n * @param worldX 世界 X 坐标\r\n * @param worldY 世界 Y 坐标\r\n * @returns 屏幕坐标 { x, y }\r\n */\r\n public worldToScreen(worldX: number, worldY: number): { x: number; y: number } {\r\n const vector = new THREE.Vector3(worldX, worldY, 0);\r\n vector.project(this.orthographicCamera);\r\n\r\n return {\r\n x: (vector.x + 1) / 2 * this.container.clientWidth,\r\n y: -(vector.y - 1) / 2 * this.container.clientHeight,\r\n };\r\n }\r\n\r\n /**\r\n * 更新相机宽高比\r\n * 在容器尺寸变化时调用\r\n */\r\n public updateAspectRatio(): void {\r\n const aspect = this.container.clientWidth / this.container.clientHeight;\r\n const frustumHalfHeight = this.frustumSize / 2;\r\n const frustumHalfWidth = frustumHalfHeight * aspect;\r\n\r\n this.orthographicCamera.left = -frustumHalfWidth;\r\n this.orthographicCamera.right = frustumHalfWidth;\r\n this.orthographicCamera.top = frustumHalfHeight;\r\n this.orthographicCamera.bottom = -frustumHalfHeight;\r\n\r\n this.orthographicCamera.updateProjectionMatrix();\r\n }\r\n\r\n /**\r\n * 设置视锥体大小\r\n * @param size 视锥体大小\r\n */\r\n public setFrustumSize(size: number): void {\r\n this.frustumSize = size;\r\n this.updateAspectRatio();\r\n }\r\n\r\n /**\r\n * 获取视锥体大小\r\n * @returns 视锥体大小\r\n */\r\n public getFrustumSize(): number {\r\n return this.frustumSize;\r\n }\r\n\r\n /**\r\n * 销毁相机模块\r\n */\r\n public dispose(): void {\r\n // 取消正在进行的动画\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId);\r\n this.animationId = null;\r\n }\r\n // Three.js 相机不需要特殊清理\r\n this.orthographicCamera = null as any;\r\n }\r\n}\r\n\r\nexport default CameraModule2d;\r\n","/**\r\n * 2D 引擎渲染模块\r\n * 负责创建和配置 WebGL 渲染器\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { Engine2dOptions } from '../types/entityTypes';\r\n\r\nexport class RenderModule2d {\r\n private engine: any;\r\n public renderer: THREE.WebGLRenderer;\r\n private container: HTMLElement;\r\n private options: Engine2dOptions;\r\n\r\n // 渲染配置\r\n private antialias: boolean = true;\r\n private alpha: boolean = false;\r\n private precision: 'highp' | 'mediump' | 'lowp' = 'highp';\r\n\r\n constructor(engine: any, container: HTMLElement, options: Engine2dOptions) {\r\n this.engine = engine;\r\n this.container = container;\r\n this.options = options;\r\n this.renderer = this.createRenderer();\r\n this.handleResize();\r\n }\r\n\r\n /**\r\n * 创建 WebGL 渲染器\r\n */\r\n private createRenderer(): THREE.WebGLRenderer {\r\n const renderer = new THREE.WebGLRenderer({\r\n antialias: this.antialias,\r\n alpha: this.alpha,\r\n precision: this.precision,\r\n });\r\n\r\n // 设置渲染器尺寸\r\n const width = this.container.clientWidth;\r\n const height = this.container.clientHeight;\r\n renderer.setSize(width, height);\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n\r\n // 2D 渲染器配置\r\n renderer.autoClear = true;\r\n renderer.sortObjects = true;\r\n\r\n // 设置初始背景色\r\n renderer.setClearColor(this.options.backgroundColor ?? 0x1a1a1a);\r\n\r\n // 优化:不需要深度测试(2D 场景)\r\n // 但为了正确的层级关系,还是保留深度测试\r\n\r\n // 添加到容器\r\n this.container.appendChild(renderer.domElement);\r\n\r\n return renderer;\r\n }\r\n\r\n /**\r\n * 渲染场景\r\n * @param scene Three.js 场景\r\n * @param camera Three.js 相机\r\n */\r\n public render(scene: THREE.Scene, camera: THREE.Camera): void {\r\n const startTime = performance.now();\r\n\r\n // 触发渲染开始事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('render-start' as any);\r\n }\r\n\r\n // 执行渲染\r\n this.renderer.render(scene, camera);\r\n\r\n const renderTime = performance.now() - startTime;\r\n\r\n // 触发渲染结束事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('render-end' as any, { renderTime });\r\n }\r\n }\r\n\r\n /**\r\n * 处理窗口大小变化\r\n */\r\n private handleResize(): void {\r\n window.addEventListener('resize', () => {\r\n this.onWindowResize();\r\n });\r\n }\r\n\r\n /**\r\n * 窗口大小变化处理\r\n */\r\n private onWindowResize(): void {\r\n const width = this.container.clientWidth;\r\n const height = this.container.clientHeight;\r\n\r\n // 更新渲染器尺寸\r\n this.renderer.setSize(width, height);\r\n\r\n // 更新相机宽高比\r\n if (this.engine.cameraModule2d) {\r\n this.engine.cameraModule2d.updateAspectRatio();\r\n }\r\n\r\n // 重新渲染\r\n if (this.engine.scene && this.engine.camera) {\r\n this.render(this.engine.scene, this.engine.camera);\r\n }\r\n }\r\n\r\n /**\r\n * 手动调整渲染器尺寸\r\n * @param width 宽度\r\n * @param height 高度\r\n */\r\n public setSize(width: number, height: number): void {\r\n this.renderer.setSize(width, height);\r\n\r\n // 更新相机宽高比\r\n if (this.engine.cameraModule2d) {\r\n this.engine.cameraModule2d.updateAspectRatio();\r\n }\r\n }\r\n\r\n /**\r\n * 获取渲染器尺寸\r\n * @returns 尺寸对象 { width, height }\r\n */\r\n public getSize(): { width: number; height: number } {\r\n const size = this.renderer.getSize(new THREE.Vector2());\r\n return {\r\n width: size.x,\r\n height: size.y,\r\n };\r\n }\r\n\r\n /**\r\n * 设置背景色\r\n * @param color 颜色值\r\n */\r\n public setBackgroundColor(color: number): void {\r\n this.renderer.setClearColor(new THREE.Color(color));\r\n }\r\n\r\n /**\r\n * 设置像素比率\r\n * @param pixelRatio 像素比率\r\n */\r\n public setPixelRatio(pixelRatio: number): void {\r\n this.renderer.setPixelRatio(pixelRatio);\r\n }\r\n\r\n /**\r\n * 获取像素比率\r\n * @returns 像素比率\r\n */\r\n public getPixelRatio(): number {\r\n return this.renderer.getPixelRatio();\r\n }\r\n\r\n /**\r\n * 启用/禁用抗锯齿\r\n * @param enabled 是否启用\r\n */\r\n public setAntialias(enabled: boolean): void {\r\n // WebGLRenderer 创建后无法更改抗锯齿设置\r\n console.warn('Antialias cannot be changed after renderer creation');\r\n }\r\n\r\n /**\r\n * 清除渲染缓冲\r\n * @param color 是否清除颜色缓冲\r\n * @param depth 是否清除深度缓冲\r\n * @param stencil 是否清除模板缓冲\r\n */\r\n public clear(color: boolean = true, depth: boolean = true, stencil: boolean = false): void {\r\n this.renderer.clear(color, depth, stencil);\r\n }\r\n\r\n /**\r\n * 获取渲染器信息\r\n * @returns 渲染器信息\r\n */\r\n public getInfo(): {\r\n renderer: string;\r\n version: string;\r\n vendor: string;\r\n capabilities: any;\r\n } {\r\n const context = this.renderer.getContext();\r\n\r\n return {\r\n renderer: this.renderer.capabilities.isWebGL2 ? 'WebGL 2.0' : 'WebGL 1.0',\r\n version: this.renderer.capabilities.getVersion(),\r\n vendor: this.renderer.capabilities.vendor,\r\n capabilities: {\r\n maxTextureSize: this.renderer.capabilities.maxTextureSize,\r\n maxRenderbufferSize: this.renderer.capabilities.maxRenderbufferSize,\r\n maxVertexAttribs: this.renderer.capabilities.maxVertexAttribs,\r\n maxVaryingVectors: context.getParameter(context.MAX_VARYING_VECTORS),\r\n maxFragmentUniforms: context.getParameter(context.MAX_FRAGMENT_UNIFORM_VECTORS),\r\n maxVertexUniforms: context.getParameter(context.MAX_VERTEX_UNIFORM_VECTORS),\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 销毁渲染模块\r\n */\r\n public dispose(): void {\r\n // 移除窗口大小监听\r\n window.removeEventListener('resize', this.onWindowResize.bind(this));\r\n\r\n // 销毁渲染器\r\n this.renderer.dispose();\r\n\r\n // 从 DOM 中移除 canvas\r\n if (this.container.contains(this.renderer.domElement)) {\r\n this.container.removeChild(this.renderer.domElement);\r\n }\r\n\r\n this.renderer = null as any;\r\n }\r\n}\r\n\r\nexport default RenderModule2d;\r\n","/**\r\n * 2D 平移控制器\r\n * 实现 CAD 风格的鼠标交互控制\r\n * 功能:平移、缩放、双击重置\r\n */\r\n\r\nimport * as THREE from 'three';\r\n\r\nexport class Pan2dControls extends THREE.EventDispatcher {\r\n public object: THREE.OrthographicCamera;\r\n public domElement: HTMLElement;\r\n public enabled: boolean = true;\r\n\r\n // 配置\r\n public enableZoom: boolean = true;\r\n public enablePan: boolean = true;\r\n public enableDamping: boolean = false;\r\n public dampingFactor: number = 0.05;\r\n public zoomSpeed: number = 1.0;\r\n\r\n // 缩放限制(0 表示无限制)\r\n public minZoom: number = 0;\r\n public maxZoom: number = Infinity;\r\n\r\n // 状态\r\n private isDragging: boolean = false;\r\n private mouseButton: number = -1; // -1: 无, 0: 左键, 1: 中键, 2: 右键\r\n private previousMousePosition: THREE.Vector2 = new THREE.Vector2();\r\n private targetPosition: THREE.Vector3 = new THREE.Vector3();\r\n private targetZoom: number = 1;\r\n\r\n // 双击检测\r\n private lastClickTime: number = 0;\r\n private doubleClickDelay: number = 300;\r\n\r\n constructor(object: THREE.OrthographicCamera, domElement?: HTMLElement) {\r\n super();\r\n\r\n this.object = object;\r\n this.domElement = domElement || document;\r\n\r\n this.targetPosition.copy(object.position);\r\n this.targetZoom = object.zoom;\r\n\r\n this.bindEvents();\r\n }\r\n\r\n /**\r\n * 绑定事件监听\r\n */\r\n private bindEvents(): void {\r\n // 鼠标事件\r\n this.domElement.addEventListener('mousedown', this.onMouseDown.bind(this));\r\n this.domElement.addEventListener('mousemove', this.onMouseMove.bind(this));\r\n this.domElement.addEventListener('mouseup', this.onMouseUp.bind(this));\r\n this.domElement.addEventListener('mouseleave', this.onMouseUp.bind(this));\r\n this.domElement.addEventListener('wheel', this.onWheel.bind(this), { passive: false });\r\n this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this));\r\n this.domElement.addEventListener('click', this.onClick.bind(this));\r\n\r\n // 触摸事件(移动端支持)\r\n this.domElement.addEventListener('touchstart', this.onTouchStart.bind(this), { passive: false });\r\n this.domElement.addEventListener('touchmove', this.onTouchMove.bind(this), { passive: false });\r\n this.domElement.addEventListener('touchend', this.onTouchEnd.bind(this));\r\n\r\n // 阻止右键菜单\r\n this.domElement.addEventListener('contextmenu', (event) => {\r\n event.preventDefault();\r\n });\r\n }\r\n\r\n /**\r\n * 鼠标按下\r\n */\r\n private onMouseDown(event: MouseEvent): void {\r\n if (!this.enabled) return;\r\n\r\n // 检查是否启用了平移\r\n if (!this.enablePan) return;\r\n\r\n // 只响应左键和中键\r\n if (event.button === 0 || event.button === 1) {\r\n this.isDragging = true;\r\n this.mouseButton = event.button;\r\n this.previousMousePosition.set(event.clientX, event.clientY);\r\n\r\n this.dispatchEvent({ type: 'start' });\r\n }\r\n }\r\n\r\n /**\r\n * 鼠标移动\r\n */\r\n private onMouseMove(event: MouseEvent): void {\r\n if (!this.enabled || !this.isDragging) return;\r\n\r\n const deltaX = event.clientX - this.previousMousePosition.x;\r\n const deltaY = event.clientY - this.previousMousePosition.y;\r\n\r\n // 计算世界坐标偏移(考虑缩放)\r\n const zoom = this.object.zoom;\r\n const factor = 1 / zoom;\r\n\r\n // 获取视锥体尺寸\r\n const frustumHeight = (this.object.top - this.object.bottom);\r\n const frustumWidth = (this.object.right - this.object.left);\r\n\r\n // 计算移动距离(世界坐标)\r\n const worldDeltaX = (deltaX / this.domElement.clientWidth) * frustumWidth * factor;\r\n const worldDeltaY = (deltaY / this.domElement.clientHeight) * frustumHeight * factor;\r\n\r\n // 更新目标位置\r\n this.targetPosition.x -= worldDeltaX;\r\n this.targetPosition.y += worldDeltaY;\r\n\r\n if (!this.enableDamping) {\r\n // 无阻尼模式,直接更新\r\n this.object.position.copy(this.targetPosition);\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.previousMousePosition.set(event.clientX, event.clientY);\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 鼠标释放\r\n */\r\n private onMouseUp(event: MouseEvent): void {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.mouseButton = -1;\r\n\r\n this.dispatchEvent({ type: 'end' });\r\n }\r\n }\r\n\r\n /**\r\n * 鼠标滚轮(缩放)\r\n */\r\n private onWheel(event: WheelEvent): void {\r\n if (!this.enabled || !this.enableZoom) return;\r\n\r\n event.preventDefault();\r\n\r\n const zoomFactor = Math.pow(1.1, -Math.sign(event.deltaY) * this.zoomSpeed);\r\n const oldZoom = this.targetZoom;\r\n\r\n this.targetZoom *= zoomFactor;\r\n if (this.minZoom > 0) this.targetZoom = Math.max(this.minZoom, this.targetZoom);\r\n if (this.maxZoom !== Infinity) this.targetZoom = Math.min(this.targetZoom, this.maxZoom);\r\n\r\n const newZoom = this.targetZoom;\r\n\r\n // 正交相机视锥体的半宽高(zoom=1 时的基准值)\r\n const halfW = (this.object.right - this.object.left) / 2;\r\n const halfH = (this.object.top - this.object.bottom) / 2;\r\n\r\n // 鼠标相对于 canvas 的 NDC 坐标\r\n const rect = this.domElement.getBoundingClientRect();\r\n const ndcX = ((event.clientX - rect.left) / rect.width) * 2 - 1;\r\n const ndcY = -((event.clientY - rect.top) / rect.height) * 2 + 1;\r\n\r\n // 缩放后鼠标对应的世界坐标 = 缩放前的世界坐标\r\n // worldX = camX + ndcX * halfW / zoom\r\n // 推导:camX_new = camX + ndcX * halfW * (1/oldZoom - 1/newZoom)\r\n this.targetPosition.x += ndcX * halfW * (1 / oldZoom - 1 / newZoom);\r\n this.targetPosition.y += ndcY * halfH * (1 / oldZoom - 1 / newZoom);\r\n\r\n if (!this.enableDamping) {\r\n this.object.zoom = newZoom;\r\n this.object.position.copy(this.targetPosition);\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 双击事件(重置视图)\r\n */\r\n private onDoubleClick(event: MouseEvent): void {\r\n if (!this.enabled) return;\r\n\r\n this.dispatchEvent({ type: 'doubleClick', event });\r\n }\r\n\r\n /**\r\n * 单击事件\r\n */\r\n private onClick(event: MouseEvent): void {\r\n // 检测双击\r\n const now = performance.now();\r\n if (now - this.lastClickTime < this.doubleClickDelay) {\r\n // 这是一个双击\r\n return;\r\n }\r\n this.lastClickTime = now;\r\n }\r\n\r\n /**\r\n * 触摸开始\r\n */\r\n private onTouchStart(event: TouchEvent): void {\r\n if (!this.enabled || event.touches.length !== 1) return;\r\n\r\n event.preventDefault();\r\n\r\n const touch = event.touches[0];\r\n this.isDragging = true;\r\n this.previousMousePosition.set(touch.clientX, touch.clientY);\r\n\r\n this.dispatchEvent({ type: 'start' });\r\n }\r\n\r\n /**\r\n * 触摸移动\r\n */\r\n private onTouchMove(event: TouchEvent): void {\r\n if (!this.enabled || !this.isDragging) return;\r\n\r\n event.preventDefault();\r\n\r\n const touch = event.touches[0];\r\n const deltaX = touch.clientX - this.previousMousePosition.x;\r\n const deltaY = touch.clientY - this.previousMousePosition.y;\r\n\r\n const zoom = this.object.zoom;\r\n const factor = 1 / zoom;\r\n const frustumHeight = (this.object.top - this.object.bottom);\r\n const frustumWidth = (this.object.right - this.object.left);\r\n\r\n const worldDeltaX = (deltaX / this.domElement.clientWidth) * frustumWidth * factor;\r\n const worldDeltaY = (deltaY / this.domElement.clientHeight) * frustumHeight * factor;\r\n\r\n this.targetPosition.x -= worldDeltaX;\r\n this.targetPosition.y += worldDeltaY;\r\n\r\n if (!this.enableDamping) {\r\n this.object.position.copy(this.targetPosition);\r\n }\r\n\r\n this.previousMousePosition.set(touch.clientX, touch.clientY);\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 触摸结束\r\n */\r\n private onTouchEnd(event: TouchEvent): void {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n\r\n this.dispatchEvent({ type: 'end' });\r\n }\r\n }\r\n\r\n /**\r\n * 更新控制器(在动画循环中调用)\r\n */\r\n public update(): void {\r\n if (!this.enabled) return;\r\n\r\n if (this.enableDamping) {\r\n // 阻尼模式,平滑过渡\r\n const damping = 1 - this.dampingFactor;\r\n\r\n // 平滑位置\r\n this.object.position.x += (this.targetPosition.x - this.object.position.x) * damping;\r\n this.object.position.y += (this.targetPosition.y - this.object.position.y) * damping;\r\n\r\n // 平滑缩放\r\n this.object.zoom += (this.targetZoom - this.object.zoom) * damping;\r\n\r\n this.object.updateProjectionMatrix();\r\n }\r\n }\r\n\r\n /**\r\n * 重置控制器\r\n */\r\n public reset(): void {\r\n this.targetPosition.set(0, 0, this.object.position.z);\r\n this.targetZoom = 1;\r\n\r\n if (!this.enableDamping) {\r\n this.object.position.copy(this.targetPosition);\r\n this.object.zoom = this.targetZoom;\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.dispatchEvent({ type: 'reset' });\r\n }\r\n\r\n /**\r\n * 设置相机位置\r\n * @param x X 坐标\r\n * @param y Y 坐标\r\n */\r\n public setPosition(x: number, y: number): void {\r\n this.targetPosition.set(x, y, this.object.position.z);\r\n\r\n if (!this.enableDamping) {\r\n this.object.position.copy(this.targetPosition);\r\n }\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n this.targetZoom = zoom;\r\n if (this.minZoom > 0) this.targetZoom = Math.max(this.minZoom, this.targetZoom);\r\n if (this.maxZoom !== Infinity) this.targetZoom = Math.min(this.targetZoom, this.maxZoom);\r\n\r\n if (!this.enableDamping) {\r\n this.object.zoom = this.targetZoom;\r\n this.object.updateProjectionMatrix();\r\n }\r\n\r\n this.dispatchEvent({ type: 'change' });\r\n }\r\n\r\n /**\r\n * 销毁控制器\r\n */\r\n public dispose(): void {\r\n this.enabled = false;\r\n\r\n // 移除事件监听\r\n this.domElement.removeEventListener('mousedown', this.onMouseDown.bind(this));\r\n this.domElement.removeEventListener('mousemove', this.onMouseMove.bind(this));\r\n this.domElement.removeEventListener('mouseup', this.onMouseUp.bind(this));\r\n this.domElement.removeEventListener('mouseleave', this.onMouseUp.bind(this));\r\n this.domElement.removeEventListener('wheel', this.onWheel.bind(this));\r\n this.domElement.removeEventListener('dblclick', this.onDoubleClick.bind(this));\r\n this.domElement.removeEventListener('click', this.onClick.bind(this));\r\n this.domElement.removeEventListener('touchstart', this.onTouchStart.bind(this));\r\n this.domElement.removeEventListener('touchmove', this.onTouchMove.bind(this));\r\n this.domElement.removeEventListener('touchend', this.onTouchEnd.bind(this));\r\n }\r\n}\r\n\r\nexport default Pan2dControls;\r\n","/**\r\n * 2D 控制器模块\r\n * 管理所有交互控制器\r\n */\r\n\r\nimport { Pan2dControls } from '../controls/Pan2dControls';\r\n\r\nexport class ControlModule2d {\r\n private engine: any;\r\n public panControls: Pan2dControls;\r\n public isActive: boolean = true;\r\n\r\n constructor(engine: any) {\r\n this.engine = engine;\r\n this.panControls = this.createPanControls();\r\n this.init();\r\n }\r\n\r\n /**\r\n * 初始化控制器\r\n */\r\n private init(): void {\r\n // 监听双击事件\r\n this.panControls.addEventListener('doubleClick', this.onDoubleClick.bind(this));\r\n\r\n // 监听控制器变化事件\r\n this.panControls.addEventListener('change', this.onChange.bind(this));\r\n }\r\n\r\n /**\r\n * 创建 2D 平移控制器\r\n */\r\n private createPanControls(): Pan2dControls {\r\n const controls = new Pan2dControls(\r\n this.engine.camera as any,\r\n this.engine.renderer.domElement\r\n );\r\n\r\n // 配置控制器\r\n controls.enableZoom = true;\r\n controls.enablePan = true;\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n controls.zoomSpeed = 1.0;\r\n controls.minZoom = 0;\r\n controls.maxZoom = Infinity;\r\n\r\n return controls;\r\n }\r\n\r\n /**\r\n * 双击事件处理\r\n */\r\n private onDoubleClick(event: any): void {\r\n // 双击重置视图\r\n if (this.engine.cameraModule2d) {\r\n this.engine.cameraModule2d.resetView();\r\n }\r\n }\r\n\r\n /**\r\n * 控制器变化事件处理\r\n */\r\n private onChange(): void {\r\n // 触发相机变化事件\r\n if (this.engine.events) {\r\n this.engine.events.trigger('camera-changed' as any, {\r\n type: 'user-interaction',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 激活控制器\r\n */\r\n public active(): void {\r\n this.isActive = true;\r\n this.panControls.enabled = true;\r\n }\r\n\r\n /**\r\n * 禁用控制器\r\n */\r\n public disActive(): void {\r\n this.isActive = false;\r\n this.panControls.enabled = false;\r\n }\r\n\r\n /**\r\n * 更新控制器(在动画循环中调用)\r\n */\r\n public update(): void {\r\n if (this.isActive) {\r\n this.panControls.update();\r\n }\r\n }\r\n\r\n /**\r\n * 重置控制器\r\n */\r\n public reset(): void {\r\n this.panControls.reset();\r\n }\r\n\r\n /**\r\n * 设置控制器位置\r\n * @param x X 坐标\r\n * @param y Y 坐标\r\n */\r\n public setPosition(x: number, y: number): void {\r\n this.panControls.setPosition(x, y);\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n this.panControls.setZoom(zoom);\r\n }\r\n\r\n /**\r\n * 获取当前缩放级别\r\n * @returns 缩放级别\r\n */\r\n public getZoom(): number {\r\n return this.panControls.object.zoom;\r\n }\r\n\r\n /**\r\n * 启用/禁用缩放\r\n * @param enabled 是否启用\r\n */\r\n public setEnableZoom(enabled: boolean): void {\r\n this.panControls.enableZoom = enabled;\r\n }\r\n\r\n /**\r\n * 启用/禁用平移\r\n * @param enabled 是否启用\r\n */\r\n public setEnablePan(enabled: boolean): void {\r\n this.panControls.enablePan = enabled;\r\n }\r\n\r\n /**\r\n * 启用/禁用阻尼效果\r\n * @param enabled 是否启用\r\n */\r\n public setEnableDamping(enabled: boolean): void {\r\n this.panControls.enableDamping = enabled;\r\n }\r\n\r\n /**\r\n * 设置阻尼系数\r\n * @param factor 阻尼系数 (0-1)\r\n */\r\n public setDampingFactor(factor: number): void {\r\n this.panControls.dampingFactor = Math.max(0, Math.min(factor, 1));\r\n }\r\n\r\n /**\r\n * 设置缩放速度\r\n * @param speed 缩放速度\r\n */\r\n public setZoomSpeed(speed: number): void {\r\n this.panControls.zoomSpeed = Math.max(0.1, speed);\r\n }\r\n\r\n /**\r\n * 设置缩放限制\r\n * @param min 最小缩放\r\n * @param max 最大缩放\r\n */\r\n public setZoomLimits(min: number, max: number): void {\r\n this.panControls.minZoom = min;\r\n this.panControls.maxZoom = max;\r\n }\r\n\r\n /**\r\n * 销毁控制器模块\r\n */\r\n public dispose(): void {\r\n this.panControls.dispose();\r\n this.panControls = null as any;\r\n }\r\n}\r\n\r\nexport default ControlModule2d;\r\n","import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\n/**\n * A loader for loading fonts.\n *\n * You can convert fonts online using [facetype.js](https://gero3.github.io/facetype.js/).\n *\n * ```js\n * const loader = new FontLoader();\n * const font = await loader.loadAsync( 'fonts/helvetiker_regular.typeface.json' );\n * ```\n *\n * @augments Loader\n * @three_import import { FontLoader } from 'three/addons/loaders/FontLoader.js';\n */\nclass FontLoader extends Loader {\n\n\t/**\n\t * Constructs a new font loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded font\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Font)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tconst font = scope.parse( JSON.parse( text ) );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given font data and returns the resulting font.\n\t *\n\t * @param {Object} json - The raw font data as a JSON object.\n\t * @return {Font} The font.\n\t */\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n/**\n * Class representing a font.\n */\nclass Font {\n\n\t/**\n\t * Constructs a new font.\n\t *\n\t * @param {Object} data - The font data as JSON.\n\t */\n\tconstructor( data ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFont = true;\n\n\t\tthis.type = 'Font';\n\n\t\t/**\n\t\t * The font data as JSON.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.data = data;\n\n\t}\n\n\t/**\n\t * Generates geometry shapes from the given text and size. The result of this method\n\t * should be used with {@link ShapeGeometry} to generate the actual geometry data.\n\t *\n\t * @param {string} text - The text.\n\t * @param {number} [size=100] - The text size.\n\t * @param {string} [direction='ltr'] - Char direction: ltr(left to right), rtl(right to left) & tb(top bottom).\n\t * @return {Array<Shape>} An array of shapes representing the text.\n\t */\n\tgenerateShapes( text, size = 100, direction = 'ltr' ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data, direction );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tshapes.push( ...paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data, direction ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tif ( direction == 'rtl' || direction == 'tb' ) {\n\n\t\tchars.reverse();\n\n\t}\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\n\t\t\tif ( direction == 'tb' ) {\n\n\t\t\t\toffsetX = 0;\n\t\t\t\toffsetY += data.ascender * scale;\n\n\t\t\t} else {\n\n\t\t\t\toffsetX += ret.offsetX;\n\n\t\t\t}\n\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nexport { FontLoader, Font };\n","/**\n * FontJsonGenerator - 将 TTF/OTF 字体转换为 Three.js typeface.json 格式。\n * 使用 opentype.js 解析字体轮廓,并兼容中文等 Unicode 字符。\n */\n\nimport * as opentype from 'opentype.js';\nimport { Font, FontLoader } from 'three/examples/jsm/loaders/FontLoader.js';\n\nexport interface TypefaceGlyph {\n x_min: number;\n x_max: number;\n /** horizontal advance */\n ha: number;\n /** 路径指令:m moveTo / l lineTo / q quadratic / b cubic / z close */\n o: string;\n}\n\nexport interface TypefaceJson {\n familyName: string;\n ascender: number;\n descender: number;\n underlinePosition: number;\n underlineThickness: number;\n boundingBox: { yMin: number; xMin: number; yMax: number; xMax: number };\n resolution: number;\n original_font_information: Record<string, string>;\n cssFontStyle: string;\n cssFontWeight: string;\n glyphs: Record<string, TypefaceGlyph>;\n}\n\nexport interface GeneratorOptions {\n /** 只提取这些字符;不传则提取字体 cmap 中的全部字符。 */\n chars?: string;\n}\n\ntype Point2D = { x: number; y: number };\n\ntype OutlineSegment = {\n type: 'L' | 'Q' | 'C';\n start: Point2D;\n end: Point2D;\n x1?: number;\n y1?: number;\n x2?: number;\n y2?: number;\n};\n\ntype OutlineContour = {\n segments: OutlineSegment[];\n points: Point2D[];\n};\n\ntype ContourEntry = {\n contour: OutlineContour;\n index: number;\n depth: number;\n absArea: number;\n};\n\nexport class FontJsonGenerator {\n /** 从 URL 加载 TTF/OTF 字体,生成 Three.js typeface.json。 */\n static async fromUrl(fontUrl: string, options?: GeneratorOptions): Promise<TypefaceJson> {\n const res = await fetch(fontUrl);\n if (!res.ok) throw new Error(`FontJsonGenerator: 无法加载 ${fontUrl} (${res.status})`);\n const buffer = await res.arrayBuffer();\n return FontJsonGenerator.fromArrayBuffer(buffer, options);\n }\n\n /** 从 ArrayBuffer 解析字体,生成 typeface.json。 */\n static fromArrayBuffer(buffer: ArrayBuffer, options?: GeneratorOptions): TypefaceJson {\n const font = opentype.parse(buffer);\n return FontJsonGenerator._convert(font, options?.chars);\n }\n\n /** 将 typeface.json 转为 Three.js Font 对象,可直接用于文字几何。 */\n static toThreeFont(json: TypefaceJson): Font {\n return new FontLoader().parse(json as any);\n }\n\n private static _convert(font: opentype.Font, chars?: string): TypefaceJson {\n const glyphs: Record<string, TypefaceGlyph> = {};\n const upm = font.unitsPerEm;\n const r = (n: number) => Math.round(n);\n\n const extractChar = (char: string) => {\n const glyph = font.charToGlyph(char);\n if (!glyph || glyph.index === 0) return;\n\n const parts = FontJsonGenerator._commandsToTypefaceOutline(glyph.path.commands as any[], r);\n const bb = glyph.getBoundingBox();\n glyphs[char] = {\n x_min: bb.x1,\n x_max: bb.x2,\n ha: glyph.advanceWidth ?? 0,\n o: parts.join(' '),\n };\n };\n\n if (chars) {\n for (const ch of chars) extractChar(ch);\n } else {\n const glyphIndexMap = (font.tables as any).cmap?.glyphIndexMap ?? {};\n for (const cpStr of Object.keys(glyphIndexMap)) {\n const cp = Number.parseInt(cpStr, 10);\n if (cp > 0) extractChar(String.fromCodePoint(cp));\n }\n }\n\n // 空格必须存在,否则 Three Font 在生成文字时会报缺字。\n if (!glyphs[' ']) {\n const spGlyph = font.charToGlyph(' ');\n glyphs[' '] = {\n x_min: 0,\n x_max: 0,\n ha: spGlyph?.advanceWidth ?? Math.round(upm / 4),\n o: '',\n };\n }\n\n const names = font.names as any;\n const get = (k: string) => (names[k]?.en ?? names[k]?.zh ?? '') as string;\n const familyName = get('fontFamily') || 'Custom Font';\n const subfamily = get('fontSubfamily') || 'Regular';\n\n return {\n familyName,\n ascender: font.ascender,\n descender: font.descender,\n underlinePosition: (font.tables as any).post?.underlinePosition ?? -100,\n underlineThickness: (font.tables as any).post?.underlineThickness ?? 50,\n boundingBox: { yMin: font.descender, xMin: 0, yMax: font.ascender, xMax: upm },\n resolution: upm,\n original_font_information: { fontFamily: familyName, fontSubfamily: subfamily },\n cssFontStyle: subfamily.toLowerCase().includes('italic') ? 'italic' : 'normal',\n cssFontWeight: subfamily.toLowerCase().includes('bold') ? 'bold' : 'normal',\n glyphs,\n };\n }\n\n /** 将 opentype 命令拆为闭合轮廓,并输出为 Three 更稳定的“外轮廓 -> 孔洞”顺序。 */\n private static _commandsToTypefaceOutline(commands: any[], r: (n: number) => number): string[] {\n const contours = FontJsonGenerator._splitContours(commands);\n const entries = FontJsonGenerator._createContourEntries(contours);\n const solids = entries.filter((entry) => entry.depth % 2 === 0);\n const holes = entries.filter((entry) => entry.depth % 2 === 1);\n const parts: string[] = [];\n\n solids\n .sort((a, b) => a.index - b.index)\n .forEach((solid) => {\n FontJsonGenerator._appendNormalizedContour(solid.contour, true, parts, r);\n\n // simfang 等字体可能按“孔洞、外轮廓、孔洞”排列;Three 对这种顺序会误填孔洞。\n holes\n .filter((hole) => FontJsonGenerator._findParentSolid(hole, solids) === solid)\n .sort((a, b) => a.index - b.index)\n .forEach((hole) => FontJsonGenerator._appendNormalizedContour(hole.contour, false, parts, r));\n });\n\n return parts;\n }\n\n private static _createContourEntries(contours: OutlineContour[]): ContourEntry[] {\n return contours\n .filter((contour) => contour.segments.length > 0)\n .map((contour, index) => {\n const sample = FontJsonGenerator._samplePoint(contour);\n const depth = contours.reduce((count, other) => {\n if (other === contour || other.points.length < 3) return count;\n return FontJsonGenerator._pointInPolygon(sample, other.points) ? count + 1 : count;\n }, 0);\n return {\n contour,\n index,\n depth,\n absArea: Math.abs(FontJsonGenerator._signedArea(contour.points)),\n };\n });\n }\n\n private static _findParentSolid(hole: ContourEntry, solids: ContourEntry[]): ContourEntry | undefined {\n const sample = FontJsonGenerator._samplePoint(hole.contour);\n return solids\n .filter((solid) => FontJsonGenerator._pointInPolygon(sample, solid.contour.points))\n .sort((a, b) => a.absArea - b.absArea)[0];\n }\n\n private static _appendNormalizedContour(\n contour: OutlineContour,\n shouldBeClockwise: boolean,\n parts: string[],\n r: (n: number) => number\n ): void {\n // Three ShapePath.toShapes() 默认要求:实心外轮廓顺时针,孔洞逆时针。\n const isClockwise = FontJsonGenerator._signedArea(contour.points) < 0;\n const normalized = isClockwise === shouldBeClockwise\n ? contour.segments\n : FontJsonGenerator._reverseSegments(contour.segments);\n FontJsonGenerator._appendContour(normalized, parts, r);\n }\n\n private static _splitContours(commands: any[]): OutlineContour[] {\n const contours: OutlineContour[] = [];\n let contour: OutlineContour | null = null;\n let current: Point2D | null = null;\n\n const closeContour = () => {\n if (contour && contour.segments.length > 0) contours.push(contour);\n contour = null;\n current = null;\n };\n\n commands.forEach((cmd) => {\n if (cmd.type === 'M') {\n closeContour();\n current = { x: cmd.x, y: cmd.y };\n contour = { segments: [], points: [current] };\n return;\n }\n\n if (!contour || !current) return;\n\n if (cmd.type === 'Z') {\n closeContour();\n return;\n }\n\n const end = { x: cmd.x, y: cmd.y };\n if (cmd.type === 'L') {\n contour.segments.push({ type: 'L', start: current, end });\n } else if (cmd.type === 'Q') {\n contour.segments.push({ type: 'Q', start: current, end, x1: cmd.x1, y1: cmd.y1 });\n } else if (cmd.type === 'C') {\n contour.segments.push({\n type: 'C',\n start: current,\n end,\n x1: cmd.x1,\n y1: cmd.y1,\n x2: cmd.x2,\n y2: cmd.y2,\n });\n }\n\n current = end;\n contour.points.push(end);\n });\n\n closeContour();\n return contours;\n }\n\n private static _appendContour(segments: OutlineSegment[], parts: string[], r: (n: number) => number): void {\n const start = segments[0].start;\n parts.push(`m ${r(start.x)} ${r(start.y)}`);\n\n segments.forEach((segment) => {\n if (segment.type === 'L') {\n parts.push(`l ${r(segment.end.x)} ${r(segment.end.y)}`);\n } else if (segment.type === 'Q') {\n // Three FontLoader 的 q 顺序是:终点、控制点。\n parts.push(`q ${r(segment.end.x)} ${r(segment.end.y)} ${r(segment.x1!)} ${r(segment.y1!)}`);\n } else {\n // Three FontLoader 的 b 顺序是:终点、控制点1、控制点2。\n parts.push(\n `b ${r(segment.end.x)} ${r(segment.end.y)} ${r(segment.x1!)} ${r(segment.y1!)} ${r(segment.x2!)} ${r(segment.y2!)}`\n );\n }\n });\n\n parts.push('z');\n }\n\n private static _reverseSegments(segments: OutlineSegment[]): OutlineSegment[] {\n return segments.slice().reverse().map((segment) => {\n if (segment.type === 'L') {\n return { type: 'L', start: segment.end, end: segment.start };\n }\n if (segment.type === 'Q') {\n return { type: 'Q', start: segment.end, end: segment.start, x1: segment.x1, y1: segment.y1 };\n }\n return {\n type: 'C',\n start: segment.end,\n end: segment.start,\n x1: segment.x2,\n y1: segment.y2,\n x2: segment.x1,\n y2: segment.y1,\n };\n });\n }\n\n private static _signedArea(points: Point2D[]): number {\n let area = 0;\n for (let i = 0, j = points.length - 1; i < points.length; j = i++) {\n area += points[j].x * points[i].y - points[i].x * points[j].y;\n }\n return area / 2;\n }\n\n private static _samplePoint(contour: OutlineContour): Point2D {\n // 不使用点集质心:像数字 0 的外轮廓质心可能落在内孔里,导致外轮廓被误判为孔洞。\n return contour.points[0];\n }\n\n private static _pointInPolygon(point: Point2D, polygon: Point2D[]): boolean {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const pi = polygon[i];\n const pj = polygon[j];\n const intersects = pi.y > point.y !== pj.y > point.y\n && point.x < ((pj.x - pi.x) * (point.y - pi.y)) / (pj.y - pi.y) + pi.x;\n if (intersects) inside = !inside;\n }\n return inside;\n }\n}\n","import { LayerState } from '../managers/layer/index';\r\n\r\n/** LayerPanelUI 所需的数据访问接口,避免与 LayerManager 形成循环依赖 */\r\ninterface LayerPanelDelegate {\n getLayers(): LayerState[];\n getDisplayColor(color: number): number;\n isAllVisible(): boolean;\n toggleLayer(name: string): boolean;\n setAllLayersVisible(visible: boolean): void;\n}\n\r\n/**\r\n * 图层面板 UI 组件\r\n * 在容器右上角展示可拖拽的图层列表面板\r\n * 颜色全部通过 CSS 自定义属性(var(--e2d-xxx))读取,支持动态主题切换\r\n */\r\nexport class LayerPanelUI {\r\n private panel: HTMLElement | null = null;\r\n private listEl: HTMLElement | null = null;\r\n private isVisible = false;\r\n private delegate: LayerPanelDelegate;\r\n\r\n constructor(container: HTMLElement, delegate: LayerPanelDelegate) {\r\n this.delegate = delegate;\r\n this._buildPanel(container);\r\n }\r\n\r\n // ─── 面板开关 ──────────────────────────────────────────\r\n\r\n public show(): void {\r\n if (this.panel) {\r\n this.panel.style.display = 'flex';\r\n this.isVisible = true;\r\n }\r\n }\r\n\r\n public hide(): void {\r\n if (this.panel) {\r\n this.panel.style.display = 'none';\r\n this.isVisible = false;\r\n }\r\n }\r\n\r\n public toggle(): void {\r\n this.isVisible ? this.hide() : this.show();\r\n }\r\n\r\n /** 刷新图层列表(数据变化后调用) */\r\n public refresh(): void {\r\n this._renderList();\r\n }\r\n\r\n // ─── DOM 构建 ──────────────────────────────────────────\r\n\r\n private _buildPanel(container: HTMLElement): void {\r\n const panel = document.createElement('div');\r\n panel.style.cssText = `\r\n position:absolute; top:10px; right:10px;\r\n width:220px; max-height:480px;\r\n background:var(--e2d-bg,#1e1f22);\r\n border:1px solid var(--e2d-border2,#333);\r\n border-radius:4px;\r\n box-shadow:0 4px 16px var(--e2d-shadow,rgba(0,0,0,.6));\r\n display:none; flex-direction:column;\r\n z-index:100; user-select:none;\r\n font-size:13px; color:var(--e2d-text,#e0e0e0);\r\n font-family:system-ui,sans-serif;\r\n `;\r\n this.panel = panel;\r\n\r\n // 标题栏\r\n const header = document.createElement('div');\r\n header.style.cssText = `\r\n display:flex; align-items:center; justify-content:space-between;\r\n padding:8px 10px;\r\n background:var(--e2d-bg3,#222);\r\n border-bottom:1px solid var(--e2d-border2,#333);\r\n border-radius:4px 4px 0 0; cursor:move; flex-shrink:0;\r\n `;\r\n const title = document.createElement('span');\r\n title.textContent = '图层';\r\n title.style.cssText = 'font-size:13px; font-weight:500; color:var(--e2d-text,#e0e0e0);';\r\n\r\n const closeBtn = document.createElement('button');\r\n closeBtn.textContent = '×';\r\n closeBtn.style.cssText = `\r\n background:none; border:none;\r\n color:var(--e2d-close,#aaa);\r\n font-size:18px; line-height:1; cursor:pointer; padding:0 2px;\r\n transition:color 0.15s;\r\n `;\r\n closeBtn.onmouseenter = () => { closeBtn.style.color = 'var(--e2d-close-hover,#fff)'; };\r\n closeBtn.onmouseleave = () => { closeBtn.style.color = 'var(--e2d-close,#aaa)'; };\r\n closeBtn.onclick = () => this.hide();\r\n\r\n header.appendChild(title);\r\n header.appendChild(closeBtn);\r\n this._makeDraggable(panel, header);\r\n\r\n // 全部图层行\r\n const allRow = this._createRow();\r\n const allEye = this._createEye(true);\r\n const allLabel = document.createElement('span');\r\n allLabel.textContent = '全部图层';\r\n allLabel.style.cssText = 'flex:1; font-weight:500; color:var(--e2d-text,#e0e0e0);';\r\n allRow.appendChild(allEye);\r\n allRow.appendChild(allLabel);\r\n allRow.onclick = () => {\r\n const next = !this.delegate.isAllVisible();\r\n this.delegate.setAllLayersVisible(next);\r\n this._renderList();\r\n this._updateEye(allEye, next);\r\n };\r\n\r\n // 分割线\r\n const divider = document.createElement('div');\r\n divider.style.cssText = 'height:1px; background:var(--e2d-border2,#333); margin:0 8px; flex-shrink:0;';\r\n\r\n // 图层列表容器(可滚动)\r\n const list = document.createElement('div');\r\n list.style.cssText = `\r\n overflow-y:auto; flex:1;\r\n scrollbar-width:thin;\r\n scrollbar-color:var(--e2d-scrollbar,#444) transparent;\r\n `;\r\n this.listEl = list;\r\n\r\n panel.appendChild(header);\r\n panel.appendChild(allRow);\r\n panel.appendChild(divider);\r\n panel.appendChild(list);\r\n\r\n // 每次 _renderList 后同步全部图层眼睛图标状态\r\n const origRender = this._renderList.bind(this);\r\n this._renderList = () => {\r\n origRender();\r\n this._updateEye(allEye, this.delegate.isAllVisible());\r\n };\r\n\r\n this._renderList();\r\n\r\n container.style.position = 'relative';\r\n container.appendChild(panel);\r\n }\r\n\r\n private _renderList(): void {\r\n const list = this.listEl;\r\n if (!list) return;\r\n list.innerHTML = '';\r\n for (const layer of this.delegate.getLayers()) {\r\n const row = this._createRow();\r\n const eye = this._createEye(layer.visible);\r\n const swatch = document.createElement('span');\r\n swatch.style.cssText = `\r\n width:14px; height:14px; border-radius:2px; flex-shrink:0;\r\n border:1px solid var(--e2d-swatch-border,#444);\r\n background:${this._colorToHex(this.delegate.getDisplayColor(layer.color))};\n `;\n const label = document.createElement('span');\r\n label.textContent = layer.name;\r\n label.style.cssText = `\r\n flex:1; white-space:nowrap; overflow:hidden;\r\n text-overflow:ellipsis; font-size:12px;\r\n color:${layer.visible ? 'var(--e2d-text,#ddd)' : 'var(--e2d-text4,#666)'};\r\n transition:color 0.15s;\r\n `;\r\n\r\n row.appendChild(eye);\r\n row.appendChild(swatch);\r\n row.appendChild(label);\r\n\r\n row.onclick = () => {\r\n const next = this.delegate.toggleLayer(layer.name);\r\n this._updateEye(eye, next);\r\n label.style.color = next ? 'var(--e2d-text,#ddd)' : 'var(--e2d-text4,#666)';\r\n };\r\n\r\n list.appendChild(row);\r\n }\r\n }\r\n\r\n private _createRow(): HTMLElement {\r\n const row = document.createElement('div');\r\n row.style.cssText = `\r\n display:flex; align-items:center; gap:8px;\r\n padding:5px 10px; cursor:pointer;\r\n border-bottom:1px solid var(--e2d-border2,#222);\r\n transition:background 0.1s;\r\n `;\r\n row.onmouseenter = () => { row.style.background = 'var(--e2d-bg-hover,#2a2a2a)'; };\r\n row.onmouseleave = () => { row.style.background = ''; };\r\n return row;\r\n }\r\n\r\n private _createEye(open: boolean): HTMLElement {\r\n const el = document.createElement('span');\r\n el.style.cssText = 'display:flex; align-items:center; flex-shrink:0; width:16px;';\r\n this._updateEye(el, open);\r\n return el;\r\n }\r\n\r\n private _updateEye(el: HTMLElement, open: boolean): void {\r\n // 通过 CSS color 继承,SVG 使用 currentColor,由此响应主题变量\r\n el.style.color = open ? 'var(--e2d-close,#aaa)' : 'var(--e2d-text4,#555)';\r\n el.innerHTML = open\r\n ? `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8 3C4.5 3 1.5 8 1.5 8C1.5 8 4.5 13 8 13C11.5 13 14.5 8 14.5 8C14.5 8 11.5 3 8 3Z\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n </svg>`\r\n : `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2 2L14 14\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M8 3C4.5 3 1.5 8 1.5 8C2.2 9.3 3.3 10.5 4.5 11.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n <path d=\"M11.5 11.5C12.7 10.5 13.8 9.3 14.5 8C14.5 8 11.5 3 8 3\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\r\n </svg>`;\r\n }\r\n\r\n private _colorToHex(color: number): string {\r\n return '#' + color.toString(16).padStart(6, '0');\r\n }\r\n\r\n private _makeDraggable(panel: HTMLElement, handle: HTMLElement): void {\r\n handle.onmousedown = (e: MouseEvent) => {\r\n e.preventDefault();\r\n const panelRect = panel.getBoundingClientRect();\r\n const parentRect = (panel.offsetParent as HTMLElement)?.getBoundingClientRect() ?? { left: 0, top: 0 };\r\n\r\n panel.style.left = (panelRect.left - parentRect.left) + 'px';\r\n panel.style.top = (panelRect.top - parentRect.top) + 'px';\r\n panel.style.right = 'auto';\r\n panel.style.bottom = 'auto';\r\n\r\n const ox = e.clientX - panelRect.left;\r\n const oy = e.clientY - panelRect.top;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n panel.style.left = (ev.clientX - ox - parentRect.left) + 'px';\r\n panel.style.top = (ev.clientY - oy - parentRect.top) + 'px';\r\n };\r\n const onUp = () => {\r\n document.removeEventListener('mousemove', onMove);\r\n document.removeEventListener('mouseup', onUp);\r\n };\r\n document.addEventListener('mousemove', onMove);\r\n document.addEventListener('mouseup', onUp);\r\n };\r\n }\r\n\r\n public dispose(): void {\r\n this.panel?.remove();\r\n this.panel = null;\r\n this.listEl = null;\r\n }\r\n}\r\n","import { DWGLayer } from '../../types/dwgTypes';\r\nimport { LayerPanelUI } from '../../ui/layerPanelUI';\r\n\r\nexport interface LayerState extends DWGLayer {}\r\n \r\n\r\nexport class LayerManager {\r\n private engine: any;\r\n private layerMap = new Map<string, LayerState>();\r\n private panelUI: LayerPanelUI | null = null;\r\n\r\n constructor(engine: any) {\r\n this.engine = engine; \r\n const container: HTMLElement | null =\r\n document.getElementById(engine?.options?.containerId ?? '') ??\r\n engine?.container ?? null;\r\n\r\n if (container) {\r\n this.panelUI = new LayerPanelUI(container, this);\r\n }\r\n }\r\n\r\n // ─── 数据 ──────────────────────────────────────────────\r\n\r\n public _loadLayers(layers: DWGLayer[] = this.engine.dwgData?.layers ?? []): void {\n this.layerMap.clear();\n for (const layer of layers) {\n this.layerMap.set(layer.name, { ...layer });\n }\n this.panelUI?.refresh();\n }\n\r\n public syncFromModel(layers: DWGLayer[]): void {\r\n if (layers?.length > 0) {\r\n this._loadLayers(layers);\r\n this.panelUI?.refresh();\r\n }\r\n }\r\n\r\n public getLayers(): LayerState[] {\n return Array.from(this.layerMap.values());\n }\n\n /** 按当前背景返回图层在面板上的显示色,和场景图元保持一致。 */\n public getDisplayColor(color: number): number {\n return this.engine.modelToolModule2d?.getDisplayColor(color) ?? color;\n }\n\n public refresh(): void {\n this.panelUI?.refresh();\n }\n\n public setLayerVisible(layerName: string, visible: boolean): void {\n const state = this.layerMap.get(layerName);\n if (state) state.visible = visible;\n this._applyVisibility(layerName, visible);\n if (!visible) this.clearInteractiveStateForLayer(layerName);\n }\n\r\n public toggleLayer(layerName: string): boolean {\r\n const state = this.layerMap.get(layerName);\r\n if (!state) return true;\r\n const next = !state.visible;\r\n this.setLayerVisible(layerName, next);\r\n return next;\r\n }\r\n\r\n public setAllLayersVisible(visible: boolean): void {\r\n for (const name of this.layerMap.keys()) {\r\n const state = this.layerMap.get(name)!;\r\n state.visible = visible;\r\n this._applyVisibility(name, visible);\r\n }\r\n }\r\n\r\n public isAllVisible(): boolean {\n return Array.from(this.layerMap.values()).every(l => l.visible);\n }\n\n /** 判断单个图层是否可见;未登记图层默认可见,避免旧数据被误过滤。 */\n public isLayerVisible(layerName?: string): boolean {\n if (!layerName) return true;\n const state = this.layerMap.get(layerName);\n return state?.visible !== false;\n }\n\n /** 判断指定图元是否仍处在可见图层中,用于 hover 和点击拾取过滤。 */\n public isModelVisibleByLayer(modelId: any): boolean {\n const nodes = this.engine.loaderModule2d?.model?.nodeMap?.get(String(modelId)) ?? this.engine.loaderModule2d?.model?.nodeMap?.get(modelId);\n if (!nodes || nodes.length === 0) return true;\n return nodes.some((node: any) => {\n const object = this.getNodeObject(node);\n return this.isLayerVisible(node?.layer) && object?.visible !== false;\n });\n }\n\n private _applyVisibility(layerName: string, visible: boolean): void {\n const root = this.engine?.modelGroup ?? this.engine?.scene;\n if (!root) return;\n const prefix = layerName + '||';\n // 2D 模型对象挂在 modelGroup 内部,递归遍历才能覆盖图块展开后的线、文字和填充。\n root.traverse((obj: any) => {\n if (obj.name?.startsWith(prefix)) obj.visible = visible;\n });\n }\n\n private getNodeObject(node: any): any {\n return node?.object ?? node?.group?.children?.[node.indexes?.[0]] ?? this.engine.modelGroup?.children?.[node.indexes?.[0]];\n }\n\n /** 图层被隐藏时,清理该图层上已有的 hover/选中高亮。 */\n private clearInteractiveStateForLayer(layerName: string): void {\n const activeIds = [\n ...(this.engine.engineStatus2d?.highlightModels ?? []),\n ...(this.engine.engineStatus2d?.highlightHoverModels ?? []),\n ];\n if (activeIds.length === 0) return;\n\n const shouldClear = activeIds.some((id: any) => {\n const nodes = this.engine.loaderModule2d?.model?.nodeMap?.get(String(id)) ?? this.engine.loaderModule2d?.model?.nodeMap?.get(id);\n return nodes?.some((node: any) => node?.layer === layerName);\n });\n if (!shouldClear) return;\n\n this.engine.modelToolModule2d?.unHighlightModelHover?.();\n this.engine.modelToolModule2d?.unhighlightAllModels?.();\n }\n\r\n // ─── 面板开关(代理到 UI) ──────────────────────────────\r\n\r\n public show(): void { this.panelUI?.show(); }\r\n public hide(): void { this.panelUI?.hide(); }\r\n public toggle(): void { this.panelUI?.toggle(); }\r\n\r\n public dispose(): void {\r\n this.panelUI?.dispose();\r\n this.panelUI = null;\r\n this.layerMap.clear();\r\n }\r\n}\r\n","import * as THREE from 'three';\n\n/** 将导出器里的数组点或对象点统一转为 Three Vector3。 */\nexport function toVector3(point: any): THREE.Vector3 {\n // 兼容导出器里的数组点和对象点两种格式。\n if (Array.isArray(point)) {\n return new THREE.Vector3(point[0] ?? 0, point[1] ?? 0, point[2] ?? 0);\n }\n return new THREE.Vector3(point?.x ?? 0, point?.y ?? 0, point?.z ?? 0);\n}\n\n/** 计算 BufferGeometry 包围盒,并用克隆值避免后续修改污染原 geometry。 */\nexport function getGeometryBounds(geometry?: THREE.BufferGeometry): { min: THREE.Vector3; max: THREE.Vector3 } {\n if (!geometry) {\n return { min: new THREE.Vector3(), max: new THREE.Vector3() };\n }\n geometry.computeBoundingBox();\n return {\n min: geometry.boundingBox?.min.clone() ?? new THREE.Vector3(),\n max: geometry.boundingBox?.max.clone() ?? new THREE.Vector3(),\n };\n}\n\n/** 兼容旧版 position/scale/rotation 字段的矩阵组合方式。 */\nexport function composeMatrix(position_: any, scale_: any, rotation_: any): THREE.Matrix4 {\n const position = new THREE.Vector3(position_[0] ?? 0, position_[1] ?? 0, position_[2] ?? 0);\n const rotation = new THREE.Euler(0, 0, rotation_ ?? 0);\n const scale = new THREE.Vector3(scale_[0] ?? 1, scale_[1] ?? 1, scale_[2] ?? 1);\n const quaternion = new THREE.Quaternion().setFromEuler(rotation);\n return new THREE.Matrix4().compose(position, quaternion, scale);\n}\n\n/** 获取 INSERT 变换矩阵;新版数据以 transformMatrix 为唯一可信变换来源。 */\nexport function getInsertMatrix(entity: any): THREE.Matrix4 {\n if (Array.isArray(entity?.transformMatrix) && entity.transformMatrix.length === 16) {\n // transformMatrix 的平移位于 12/13/14,等价于 three.js Matrix4.elements 布局。\n return new THREE.Matrix4().fromArray(entity.transformMatrix);\n }\n\n return composeMatrix(\n entity.position ?? [0, 0, 0],\n entity.scale ?? [1, 1, 1],\n entity.rotation ?? 0,\n );\n}\n\n/** 从线段点集计算选择和索引用包围盒。 */\nexport function getPointsBounds(points: THREE.Vector3[]): { min: THREE.Vector3; max: THREE.Vector3 } {\n if (points.length === 0) {\n return { min: new THREE.Vector3(), max: new THREE.Vector3() };\n }\n const min = new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\n const max = new THREE.Vector3(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY);\n points.forEach((point) => {\n min.x = Math.min(min.x, point.x);\n min.y = Math.min(min.y, point.y);\n min.z = Math.min(min.z, point.z);\n max.x = Math.max(max.x, point.x);\n max.y = Math.max(max.y, point.y);\n max.z = Math.max(max.z, point.z);\n });\n return {\n min,\n max,\n };\n}\n","import * as THREE from 'three';\r\nimport { EntityGeometryFactory } from './EntityGeometryFactory';\r\nimport { getGeometryBounds, getInsertMatrix } from './geometryUtils';\r\nimport { RenderItem2d } from './types';\r\n\r\ninterface ClipVertex2d {\r\n position: THREE.Vector3;\r\n uv?: THREE.Vector2;\r\n}\r\n\r\n/** 展开 block/INSERT 嵌套关系,将所有可渲染内容转换成全局坐标 RenderItem。 */\r\nexport class BlockFlattener {\r\n private readonly cache = new Map<string, RenderItem2d[]>();\r\n private readonly blockIndex = new Map<string, any>();\r\n\r\n constructor(\r\n private readonly geometryFactory: EntityGeometryFactory,\r\n ) {}\r\n\r\n /** 重建 block 索引;每次加载新模型前都需要清空缓存。 */\r\n public setBlocks(blocks: any[]): void {\n this.cache.clear();\n this.blockIndex.clear();\n (blocks ?? []).forEach((block) => {\r\n if (block?.name) this.blockIndex.set(block.name, block);\r\n if (block?.id) this.blockIndex.set(block.id, block);\n });\n }\n\n /** 清理已展开 block 缓存;每个 tile 合批后释放基础几何,避免加载过程中持续累积。 */\n public clearCache(): void {\n this.cache.clear();\n }\n\r\n /** 展开根实体列表,根实体通常来自新 tile inserts。 */\n public flattenRootEntities(entities: any[]): RenderItem2d[] {\n return Array.from(this.iterateRootEntities(entities));\n }\n\n /** 流式展开根实体,避免一次性持有整个 tile 的 RenderItem 中间数组。 */\n public *iterateRootEntities(entities: any[]): IterableIterator<RenderItem2d> {\n yield* this.iterateEntities(entities ?? [], new THREE.Matrix4(), 0);\n }\n\r\n /** 展开单个 block 定义;缓存只保存未裁剪的本地渲染项,裁剪 INSERT 必须在实例层单独处理。 */\r\n private flattenBlock(block: any, blockId: string, level: number): RenderItem2d[] {\r\n const cached = this.cache.get(blockId);\r\n if (cached) return cached;\r\n\r\n const origin = block.origin ?? [0, 0, 0];\r\n const baseMatrix = new THREE.Matrix4().makeTranslation(-origin[0], -origin[1], -(origin[2] ?? 0));\r\n const items = this.flattenEntities(block.entities ?? [], baseMatrix, level);\r\n this.cache.set(blockId, items);\r\n if (block.name) this.cache.set(block.name, items);\r\n if (block.id) this.cache.set(block.id, items);\r\n return items;\r\n }\r\n\r\n /** 递归展开实体;INSERT 只应用 transformMatrix,不使用 min/max 反推位置。 */\n private flattenEntities(entities: any[], baseMatrix: THREE.Matrix4, level: number): RenderItem2d[] {\n return Array.from(this.iterateEntities(entities, baseMatrix, level));\n }\n\n /** 递归逐项展开实体;根 tile 使用该路径时可以边生成边合批,降低峰值内存。 */\n private *iterateEntities(entities: any[], baseMatrix: THREE.Matrix4, level: number): IterableIterator<RenderItem2d> {\n if (level > 20) {\n console.warn('[LoaderModule2d] Block nesting is too deep, skip nested INSERT.');\n return;\n }\n\n for (const entity of entities) {\n if (entity?.visible === false) continue;\n if (entity.type === 'INSERT') {\n const blockItems = this.getBlockItems(entity.blockId, level + 1);\n const matrix = baseMatrix.clone().multiply(getInsertMatrix(entity));\n const clipPolygon = this.getClipPolygon(entity, baseMatrix);\n for (const item of blockItems) {\n const cloned = this.cloneRenderItem(item, matrix, entity);\n const clipped = clipPolygon ? this.clipRenderItem(cloned, clipPolygon) : cloned;\n if (clipped) yield clipped;\n }\n if (clipPolygon && entity.displayClipBoundary === true) {\n yield this.createClipBoundaryItem(entity, clipPolygon);\n }\n continue;\n }\n\n for (const item of this.geometryFactory.create(entity, baseMatrix)) {\n yield item;\n }\n }\n }\n\r\n /** 按 blockId/name 获取缓存后的 block 渲染项,避免重复生成基础几何。 */\r\n private getBlockItems(blockId: string, level: number): RenderItem2d[] {\r\n const cached = this.cache.get(blockId);\r\n if (cached) return cached;\r\n\r\n const block = this.blockIndex.get(blockId);\r\n if (!block) {\r\n console.warn(`[LoaderModule2d] Missing block: ${blockId}`);\r\n return [];\r\n }\r\n return this.flattenBlock(block, block.name ?? block.id ?? blockId, level);\r\n }\r\n\r\n /** 克隆 block 内渲染项并应用 INSERT 矩阵,同时处理 BYBLOCK/BYLAYER 风格继承。 */\r\n private cloneRenderItem(item: RenderItem2d, matrix: THREE.Matrix4, insertEntity: any): RenderItem2d {\r\n const layer = item.layer === '0' && insertEntity?.layer ? insertEntity.layer : (item.layer ?? insertEntity?.layer);\r\n const color = item.color == null || item.color === 0 ? (insertEntity?.color ?? item.color ?? 0) : item.color;\r\n const linkId = insertEntity?.linkId ?? insertEntity?.id ?? item.linkId;\r\n\r\n if (item.kind === 'line') {\r\n return {\r\n ...item,\r\n layer,\r\n color,\r\n linkId,\r\n points: (item.points ?? []).map((point) => point.clone().applyMatrix4(matrix)),\r\n };\r\n }\r\n\r\n const geometry = item.geometry?.clone();\r\n geometry?.applyMatrix4(matrix);\r\n const textAnchor = item.textAnchor?.clone().applyMatrix4(matrix);\r\n const bounds = getGeometryBounds(geometry);\r\n return { ...item, layer, color, linkId, geometry, min: bounds.min, max: bounds.max, textAnchor };\r\n }\r\n\r\n /** 读取 INSERT 多边形裁剪边界;clipInsertTransform 表示裁剪边界相对当前 INSERT 的附加变换。 */\r\n private getClipPolygon(insertEntity: any, baseMatrix: THREE.Matrix4): THREE.Vector3[] | null {\r\n if (insertEntity?.clipping !== true || !Array.isArray(insertEntity?.clipBoundary)) return null;\r\n const points: THREE.Vector3[] = insertEntity.clipBoundary\r\n .map((point: any) => new THREE.Vector3(point?.[0] ?? point?.x ?? 0, point?.[1] ?? point?.y ?? 0, point?.[2] ?? point?.z ?? 0))\r\n .filter((point: THREE.Vector3) => Number.isFinite(point.x) && Number.isFinite(point.y));\r\n if (points.length < 3) return null;\r\n\r\n const clipTransform = this.getClipBoundaryMatrix(insertEntity, baseMatrix);\r\n if (!clipTransform) return points;\r\n return points.map((point: THREE.Vector3) => point.clone().applyMatrix4(clipTransform));\r\n }\r\n\r\n /** clipInsertTransform 已经表达裁剪边界到实例裁剪坐标的关系;这里只叠加外层 block 的基准矩阵。 */\r\n private getClipBoundaryMatrix(insertEntity: any, baseMatrix: THREE.Matrix4): THREE.Matrix4 | null {\r\n if (!Array.isArray(insertEntity?.clipInsertTransform) || insertEntity.clipInsertTransform.length !== 16) return null;\r\n return baseMatrix.clone().multiply(new THREE.Matrix4().fromArray(insertEntity.clipInsertTransform));\r\n }\r\n\r\n /** 对单个 RenderItem 做实例级裁剪,返回 null 表示该实例被完全裁掉。 */\r\n private clipRenderItem(item: RenderItem2d, polygon: THREE.Vector3[]): RenderItem2d | null {\r\n if (item.kind === 'line') {\r\n const points = this.clipLinePoints(item.points ?? [], polygon);\r\n if (points.length === 0) return null;\r\n const bounds = this.getPointsBounds(points);\r\n return { ...item, points, min: bounds.min, max: bounds.max };\r\n }\r\n\r\n const geometry = this.clipGeometry(item.geometry, polygon);\r\n if (!geometry) return null;\r\n const bounds = getGeometryBounds(geometry);\r\n return { ...item, geometry, min: bounds.min, max: bounds.max };\r\n }\r\n\r\n /** 线段按点对裁剪,保留落在任意简单多边形内的部分。 */\r\n private clipLinePoints(points: THREE.Vector3[], polygon: THREE.Vector3[]): THREE.Vector3[] {\r\n const result: THREE.Vector3[] = [];\r\n for (let index = 0; index < points.length - 1; index += 2) {\r\n this.clipSegmentByPolygon(points[index], points[index + 1], polygon).forEach((segment) => {\r\n result.push(segment[0], segment[1]);\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n /** 任意多边形线段裁剪:先按边界交点切分,再用中点判断每段是否在内部。 */\r\n private clipSegmentByPolygon(start: THREE.Vector3, end: THREE.Vector3, polygon: THREE.Vector3[]): [THREE.Vector3, THREE.Vector3][] {\r\n const direction = end.clone().sub(start);\r\n const parameters = [0, 1];\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n const t = this.getSegmentIntersectionParameter(start, end, polygon[index], polygon[(index + 1) % polygon.length]);\r\n if (t != null && t > 1e-9 && t < 1 - 1e-9) parameters.push(t);\r\n }\r\n\r\n const sorted = Array.from(new Set(parameters.map((value) => Number(value.toFixed(12))))).sort((a, b) => a - b);\r\n const segments: [THREE.Vector3, THREE.Vector3][] = [];\r\n for (let index = 0; index < sorted.length - 1; index += 1) {\r\n const startT = sorted[index];\r\n const endT = sorted[index + 1];\r\n if (endT - startT < 1e-10) continue;\r\n const midT = (startT + endT) * 0.5;\r\n const mid = start.clone().add(direction.clone().multiplyScalar(midT));\r\n if (this.isPointInPolygon(mid, polygon)) {\r\n segments.push([\r\n start.clone().add(direction.clone().multiplyScalar(startT)),\r\n start.clone().add(direction.clone().multiplyScalar(endT)),\r\n ]);\r\n }\r\n }\r\n return segments;\r\n }\r\n\r\n /** 计算两条线段交点在第一条线段上的参数 t。 */\r\n private getSegmentIntersectionParameter(a: THREE.Vector3, b: THREE.Vector3, c: THREE.Vector3, d: THREE.Vector3): number | null {\r\n const rX = b.x - a.x;\r\n const rY = b.y - a.y;\r\n const sX = d.x - c.x;\r\n const sY = d.y - c.y;\r\n const denominator = rX * sY - rY * sX;\r\n if (Math.abs(denominator) < 1e-12) return null;\r\n const cax = c.x - a.x;\r\n const cay = c.y - a.y;\r\n const t = (cax * sY - cay * sX) / denominator;\r\n const u = (cax * rY - cay * rX) / denominator;\r\n return t >= -1e-9 && t <= 1 + 1e-9 && u >= -1e-9 && u <= 1 + 1e-9 ? THREE.MathUtils.clamp(t, 0, 1) : null;\r\n }\r\n\r\n /** 射线法判断点是否在多边形内,边界点按内部处理。 */\r\n private isPointInPolygon(point: THREE.Vector3, polygon: THREE.Vector3[]): boolean {\r\n let inside = false;\r\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i, i += 1) {\r\n const a = polygon[i];\r\n const b = polygon[j];\r\n if (this.isPointOnSegment(point, a, b)) return true;\r\n const intersect = ((a.y > point.y) !== (b.y > point.y)) && (point.x < ((b.x - a.x) * (point.y - a.y)) / (b.y - a.y) + a.x);\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n }\r\n\r\n private isPointOnSegment(point: THREE.Vector3, start: THREE.Vector3, end: THREE.Vector3): boolean {\r\n const cross = (end.x - start.x) * (point.y - start.y) - (end.y - start.y) * (point.x - start.x);\r\n if (Math.abs(cross) > 1e-8) return false;\r\n const dot = (point.x - start.x) * (end.x - start.x) + (point.y - start.y) * (end.y - start.y);\r\n const lengthSq = (end.x - start.x) ** 2 + (end.y - start.y) ** 2;\r\n return dot >= -1e-8 && dot <= lengthSq + 1e-8;\r\n }\r\n\r\n /** 裁剪三角网格;如果几何带 UV,会同步插值 UV,避免图片裁剪后纹理拉伸。 */\r\n private clipGeometry(geometry: THREE.BufferGeometry | undefined, polygon: THREE.Vector3[]): THREE.BufferGeometry | null {\r\n if (!geometry?.attributes?.position) return null;\r\n const position = geometry.attributes.position;\r\n const uv = geometry.attributes.uv;\r\n const index = geometry.index;\r\n const positions: number[] = [];\r\n const uvs: number[] = [];\r\n const hasUv = !!uv;\r\n const clipTriangles = this.triangulateClipPolygon(polygon);\r\n\r\n const readVertex = (vertexIndex: number): ClipVertex2d => ({\r\n position: new THREE.Vector3(position.getX(vertexIndex), position.getY(vertexIndex), position.getZ(vertexIndex)),\r\n uv: hasUv ? new THREE.Vector2(uv.getX(vertexIndex), uv.getY(vertexIndex)) : undefined,\r\n });\r\n const vertexCount = index ? index.count : position.count;\r\n\r\n for (let offset = 0; offset < vertexCount; offset += 3) {\r\n const a = index ? index.getX(offset) : offset;\r\n const b = index ? index.getX(offset + 1) : offset + 1;\r\n const c = index ? index.getX(offset + 2) : offset + 2;\r\n const subject = [readVertex(a), readVertex(b), readVertex(c)];\r\n clipTriangles.forEach((clipTriangle) => {\r\n const clipped = this.clipTriangle(subject, clipTriangle);\r\n if (clipped.length < 3) return;\r\n for (let vertexIndex = 1; vertexIndex < clipped.length - 1; vertexIndex += 1) {\r\n [clipped[0], clipped[vertexIndex], clipped[vertexIndex + 1]].forEach((vertex) => {\r\n positions.push(vertex.position.x, vertex.position.y, vertex.position.z);\r\n if (hasUv && vertex.uv) uvs.push(vertex.uv.x, vertex.uv.y);\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (positions.length === 0) return null;\r\n const clippedGeometry = new THREE.BufferGeometry();\r\n clippedGeometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));\r\n if (hasUv) clippedGeometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\r\n clippedGeometry.computeVertexNormals();\r\n return clippedGeometry;\r\n }\r\n\r\n /** 将任意简单裁剪多边形三角化,后续每个三角形都可用凸裁剪处理。 */\r\n private triangulateClipPolygon(polygon: THREE.Vector3[]): THREE.Vector3[][] {\r\n const contour = polygon.map((point) => new THREE.Vector2(point.x, point.y));\r\n const triangles = THREE.ShapeUtils.triangulateShape(contour, []);\r\n if (triangles.length === 0) {\r\n const fallback: THREE.Vector3[][] = [];\r\n for (let index = 1; index < polygon.length - 1; index += 1) {\r\n fallback.push([polygon[0], polygon[index], polygon[index + 1]]);\r\n }\r\n return fallback;\r\n }\r\n return triangles.map((triangle) => triangle.map((index) => polygon[index]));\r\n }\r\n\r\n /** Sutherland-Hodgman 多边形裁剪,输入三角形,输出被裁后的凸多边形。 */\r\n private clipTriangle(vertices: ClipVertex2d[], polygon: THREE.Vector3[]): ClipVertex2d[] {\r\n const orientation = this.getPolygonOrientation(polygon);\r\n let output = vertices;\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n const a = polygon[index];\r\n const b = polygon[(index + 1) % polygon.length];\r\n const input = output;\r\n output = [];\r\n if (input.length === 0) break;\r\n\r\n let previous = input[input.length - 1];\r\n let previousInside = this.isInsideClipEdge(previous.position, a, b, orientation);\r\n input.forEach((current) => {\r\n const currentInside = this.isInsideClipEdge(current.position, a, b, orientation);\r\n if (currentInside !== previousInside) {\r\n output.push(this.intersectClipEdge(previous, current, a, b, orientation));\r\n }\r\n if (currentInside) output.push(current);\r\n previous = current;\r\n previousInside = currentInside;\r\n });\r\n }\r\n return output;\r\n }\r\n\r\n private isInsideClipEdge(point: THREE.Vector3, edgeStart: THREE.Vector3, edgeEnd: THREE.Vector3, orientation: number): boolean {\r\n const edgeX = edgeEnd.x - edgeStart.x;\r\n const edgeY = edgeEnd.y - edgeStart.y;\r\n return orientation * (edgeX * (point.y - edgeStart.y) - edgeY * (point.x - edgeStart.x)) >= -1e-9;\r\n }\r\n\r\n private intersectClipEdge(start: ClipVertex2d, end: ClipVertex2d, edgeStart: THREE.Vector3, edgeEnd: THREE.Vector3, orientation: number): ClipVertex2d {\r\n const edgeX = edgeEnd.x - edgeStart.x;\r\n const edgeY = edgeEnd.y - edgeStart.y;\r\n const startValue = orientation * (edgeX * (start.position.y - edgeStart.y) - edgeY * (start.position.x - edgeStart.x));\r\n const endValue = orientation * (edgeX * (end.position.y - edgeStart.y) - edgeY * (end.position.x - edgeStart.x));\r\n const t = Math.abs(startValue - endValue) < 1e-12 ? 0 : startValue / (startValue - endValue);\r\n return {\r\n position: start.position.clone().lerp(end.position, t),\r\n uv: start.uv && end.uv ? start.uv.clone().lerp(end.uv, t) : undefined,\r\n };\r\n }\r\n\r\n /** polygon 面积符号用于判断内侧方向,兼容顺时针和逆时针边界。 */\r\n private getPolygonOrientation(polygon: THREE.Vector3[]): number {\r\n let area = 0;\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n const a = polygon[index];\r\n const b = polygon[(index + 1) % polygon.length];\r\n area += a.x * b.y - b.x * a.y;\r\n }\r\n return area >= 0 ? 1 : -1;\r\n }\r\n\r\n private getPointsBounds(points: THREE.Vector3[]): { min: THREE.Vector3; max: THREE.Vector3 } {\r\n const min = new THREE.Vector3(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\r\n const max = new THREE.Vector3(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY);\r\n points.forEach((point) => {\r\n min.min(point);\r\n max.max(point);\r\n });\r\n return { min, max };\r\n }\r\n\r\n /** displayClipBoundary=true 时画出裁剪边界,方便核对裁剪结果。 */\r\n private createClipBoundaryItem(insertEntity: any, polygon: THREE.Vector3[]): RenderItem2d {\r\n const points: THREE.Vector3[] = [];\r\n for (let index = 0; index < polygon.length; index += 1) {\r\n points.push(polygon[index].clone(), polygon[(index + 1) % polygon.length].clone());\r\n }\r\n const bounds = this.getPointsBounds(points);\r\n return {\r\n kind: 'line',\n layer: insertEntity.layer ?? '0',\n color: insertEntity.clipBoundaryColor ?? 0xff00ff,\n lineType: 'Continuous',\n linkId: insertEntity.linkId ?? insertEntity.id,\n points,\n min: bounds.min,\r\n max: bounds.max,\r\n info: insertEntity,\r\n };\r\n }\r\n}\r\n","/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e<h.length;e++)u(h[e]);return u}({1:[function(e,t,r){\"use strict\";var d=e(\"./utils\"),c=e(\"./support\"),p=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";r.encode=function(e){for(var t,r,n,i,s,a,o,h=[],u=0,l=e.length,f=l,c=\"string\"!==d.getTypeOf(e);u<e.length;)f=l-u,n=c?(t=e[u++],r=u<l?e[u++]:0,u<l?e[u++]:0):(t=e.charCodeAt(u++),r=u<l?e.charCodeAt(u++):0,u<l?e.charCodeAt(u++):0),i=t>>2,s=(3&t)<<4|r>>4,a=1<f?(15&r)<<2|n>>6:64,o=2<f?63&n:64,h.push(p.charAt(i)+p.charAt(s)+p.charAt(a)+p.charAt(o));return h.join(\"\")},r.decode=function(e){var t,r,n,i,s,a,o=0,h=0,u=\"data:\";if(e.substr(0,u.length)===u)throw new Error(\"Invalid base64 input, it looks like a data url.\");var l,f=3*(e=e.replace(/[^A-Za-z0-9+/=]/g,\"\")).length/4;if(e.charAt(e.length-1)===p.charAt(64)&&f--,e.charAt(e.length-2)===p.charAt(64)&&f--,f%1!=0)throw new Error(\"Invalid base64 input, bad content length.\");for(l=c.uint8array?new Uint8Array(0|f):new Array(0|f);o<e.length;)t=p.indexOf(e.charAt(o++))<<2|(i=p.indexOf(e.charAt(o++)))>>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r<t;r++)n+=String.fromCharCode(255&e),e>>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t<this.dirRecords.length;t++)this.push({data:this.dirRecords[t],meta:{percent:100}});var r=this.bytesWritten-e,n=function(e,t,r,n,i){var s=I.transformTo(\"string\",i(n));return R.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+A(e,2)+A(e,2)+A(t,4)+A(r,4)+A(s.length,2)+s}(this.dirRecords.length,r,e,this.zipComment,this.encodeFileName);this.push({data:n,meta:{percent:100}})},s.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},s.prototype.registerPrevious=function(e){this._sources.push(e);var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.closedSource(t.previous.streamInfo),t._sources.length?t.prepareNextSource():t.end()}),e.on(\"error\",function(e){t.error(e)}),this},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},s.prototype.error=function(e){var t=this._sources;if(!i.prototype.error.call(this,e))return!1;for(var r=0;r<t.length;r++)try{t[r].error(e)}catch(e){}return!0},s.prototype.lock=function(){i.prototype.lock.call(this);for(var e=this._sources,t=0;t<e.length;t++)e[t].lock()},t.exports=s},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(e,t,r){\"use strict\";var u=e(\"../compressions\"),n=e(\"./ZipFileWorker\");r.generateWorker=function(e,a,t){var o=new n(a.streamFiles,t,a.platform,a.encodeFileName),h=0;try{e.forEach(function(e,t){h++;var r=function(e,t){var r=e||t,n=u[r];if(!n)throw new Error(r+\" is not a valid compression method !\");return n}(t.options.compression,a.compression),n=t.options.compressionOptions||a.compressionOptions||{},i=t.dir,s=t.date;t._compressWorker(r,n).withStreamInfo(\"file\",{name:e,dir:i,date:s,comment:t.comment||\"\",unixPermissions:t.unixPermissions,dosPermissions:t.dosPermissions}).pipe(o)}),o.entriesCount=h}catch(e){o.error(e)}return o}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(e,t,r){\"use strict\";function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files=Object.create(null),this.comment=null,this.root=\"\",this.clone=function(){var e=new n;for(var t in this)\"function\"!=typeof this[t]&&(e[t]=this[t]);return e}}(n.prototype=e(\"./object\")).loadAsync=e(\"./load\"),n.support=e(\"./support\"),n.defaults=e(\"./defaults\"),n.version=\"3.10.1\",n.loadAsync=function(e,t){return(new n).loadAsync(e,t)},n.external=e(\"./external\"),t.exports=n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(e,t,r){\"use strict\";var u=e(\"./utils\"),i=e(\"./external\"),n=e(\"./utf8\"),s=e(\"./zipEntries\"),a=e(\"./stream/Crc32Probe\"),l=e(\"./nodejsUtils\");function f(n){return new i.Promise(function(e,t){var r=n.decompressed.getContentWorker().pipe(new a);r.on(\"error\",function(e){t(e)}).on(\"end\",function(){r.streamInfo.crc32!==n.decompressed.crc32?t(new Error(\"Corrupted zip : CRC32 mismatch\")):e()}).resume()})}t.exports=function(e,o){var h=this;return o=u.extend(o||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:n.utf8decode}),l.isNode&&l.isStream(e)?i.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):u.prepareContent(\"the loaded zip file\",e,!0,o.optimizedBinaryString,o.base64).then(function(e){var t=new s(o);return t.load(e),t}).then(function(e){var t=[i.Promise.resolve(e)],r=e.files;if(o.checkCRC32)for(var n=0;n<r.length;n++)t.push(f(r[n]));return i.Promise.all(t)}).then(function(e){for(var t=e.shift(),r=t.files,n=0;n<r.length;n++){var i=r[n],s=i.fileNameStr,a=u.resolve(i.fileNameStr);h.file(a,i.decompressed,{binary:!0,optimizedBinaryString:!0,date:i.date,dir:i.dir,comment:i.fileCommentStr.length?i.fileCommentStr:null,unixPermissions:i.unixPermissions,dosPermissions:i.dosPermissions,createFolders:o.createFolders}),i.dir||(h.file(a).unsafeOriginalName=s)}return t.zipComment.length&&(h.comment=t.zipComment),h})}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../stream/GenericWorker\");function s(e,t){i.call(this,\"Nodejs stream input adapter for \"+e),this._upstreamEnded=!1,this._bindStream(t)}n.inherits(s,i),s.prototype._bindStream=function(e){var t=this;(this._stream=e).pause(),e.on(\"data\",function(e){t.push({data:e,meta:{percent:0}})}).on(\"error\",function(e){t.isPaused?this.generatedError=e:t.error(e)}).on(\"end\",function(){t.isPaused?t._upstreamEnded=!0:t.end()})},s.prototype.pause=function(){return!!i.prototype.pause.call(this)&&(this._stream.pause(),!0)},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},t.exports=s},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(e,t,r){\"use strict\";var i=e(\"readable-stream\").Readable;function n(e,t,r){i.call(this,t),this._helper=e;var n=this;e.on(\"data\",function(e,t){n.push(e)||n._helper.pause(),r&&r(t)}).on(\"error\",function(e){n.emit(\"error\",e)}).on(\"end\",function(){n.push(null)})}e(\"../utils\").inherits(n,i),n.prototype._read=function(){this._helper.resume()},t.exports=n},{\"../utils\":32,\"readable-stream\":16}],14:[function(e,t,r){\"use strict\";t.exports={isNode:\"undefined\"!=typeof Buffer,newBufferFrom:function(e,t){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(e,t);if(\"number\"==typeof e)throw new Error('The \"data\" argument must not be a number');return new Buffer(e,t)},allocBuffer:function(e){if(Buffer.alloc)return Buffer.alloc(e);var t=new Buffer(e);return t.fill(0),t},isBuffer:function(e){return Buffer.isBuffer(e)},isStream:function(e){return e&&\"function\"==typeof e.on&&\"function\"==typeof e.pause&&\"function\"==typeof e.resume}}},{}],15:[function(e,t,r){\"use strict\";function s(e,t,r){var n,i=u.getTypeOf(t),s=u.extend(r||{},f);s.date=s.date||new Date,null!==s.compression&&(s.compression=s.compression.toUpperCase()),\"string\"==typeof s.unixPermissions&&(s.unixPermissions=parseInt(s.unixPermissions,8)),s.unixPermissions&&16384&s.unixPermissions&&(s.dir=!0),s.dosPermissions&&16&s.dosPermissions&&(s.dir=!0),s.dir&&(e=g(e)),s.createFolders&&(n=_(e))&&b.call(this,n,!0);var a=\"string\"===i&&!1===s.binary&&!1===s.base64;r&&void 0!==r.binary||(s.binary=!a),(t instanceof c&&0===t.uncompressedSize||s.dir||!t||0===t.length)&&(s.base64=!1,s.binary=!0,t=\"\",s.compression=\"STORE\",i=\"string\");var o=null;o=t instanceof c||t instanceof l?t:p.isNode&&p.isStream(t)?new m(e,t):u.prepareContent(e,t,s.binary,s.optimizedBinaryString,s.base64);var h=new d(e,o,s);this.files[e]=h}var i=e(\"./utf8\"),u=e(\"./utils\"),l=e(\"./stream/GenericWorker\"),a=e(\"./stream/StreamHelper\"),f=e(\"./defaults\"),c=e(\"./compressedObject\"),d=e(\"./zipObject\"),o=e(\"./generate\"),p=e(\"./nodejsUtils\"),m=e(\"./nodejs/NodejsStreamInputAdapter\"),_=function(e){\"/\"===e.slice(-1)&&(e=e.substring(0,e.length-1));var t=e.lastIndexOf(\"/\");return 0<t?e.substring(0,t):\"\"},g=function(e){return\"/\"!==e.slice(-1)&&(e+=\"/\"),e},b=function(e,t){return t=void 0!==t?t:f.createFolders,e=g(e),this.files[e]||s.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]};function h(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var n={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(e){var t,r,n;for(t in this.files)n=this.files[t],(r=t.slice(this.root.length,t.length))&&t.slice(0,this.root.length)===this.root&&e(r,n)},filter:function(r){var n=[];return this.forEach(function(e,t){r(e,t)&&n.push(t)}),n},file:function(e,t,r){if(1!==arguments.length)return e=this.root+e,s.call(this,e,t,r),this;if(h(e)){var n=e;return this.filter(function(e,t){return!t.dir&&n.test(e)})}var i=this.files[this.root+e];return i&&!i.dir?i:null},folder:function(r){if(!r)return this;if(h(r))return this.filter(function(e,t){return t.dir&&r.test(e)});var e=this.root+r,t=b.call(this,e),n=this.clone();return n.root=t.name,n},remove:function(r){r=this.root+r;var e=this.files[r];if(e||(\"/\"!==r.slice(-1)&&(r+=\"/\"),e=this.files[r]),e&&!e.dir)delete this.files[r];else for(var t=this.filter(function(e,t){return t.name.slice(0,r.length)===r}),n=0;n<t.length;n++)delete this.files[t[n].name];return this},generate:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(e){var t,r={};try{if((r=u.extend(e||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:i.utf8encode})).type=r.type.toLowerCase(),r.compression=r.compression.toUpperCase(),\"binarystring\"===r.type&&(r.type=\"string\"),!r.type)throw new Error(\"No output type specified.\");u.checkSupport(r.type),\"darwin\"!==r.platform&&\"freebsd\"!==r.platform&&\"linux\"!==r.platform&&\"sunos\"!==r.platform||(r.platform=\"UNIX\"),\"win32\"===r.platform&&(r.platform=\"DOS\");var n=r.comment||this.comment||\"\";t=o.generateWorker(this,r,n)}catch(e){(t=new l(\"error\")).error(e)}return new a(t,r.type||\"string\",r.mimeType)},generateAsync:function(e,t){return this.generateInternalStream(e).accumulate(t)},generateNodeStream:function(e,t){return(e=e||{}).type||(e.type=\"nodebuffer\"),this.generateInternalStream(e).toNodejsStream(t)}};t.exports=n},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(e,t,r){\"use strict\";t.exports=e(\"stream\")},{stream:void 0}],17:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e);for(var t=0;t<this.data.length;t++)e[t]=255&e[t]}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data[this.zero+e]},i.prototype.lastIndexOfSignature=function(e){for(var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.length-4;0<=s;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===i)return s-this.zero;return-1},i.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),s=this.readData(4);return t===s[0]&&r===s[1]&&n===s[2]&&i===s[3]},i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],18:[function(e,t,r){\"use strict\";var n=e(\"../utils\");function i(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length<this.zero+e||e<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+e+\"). Corrupted zip ?\")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r<this._listeners[e].length;r++)this._listeners[e][r].call(this,t)},pipe:function(e){return e.registerPrevious(this)},registerPrevious:function(e){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=e.streamInfo,this.mergeStreamInfo(),this.previous=e;var t=this;return e.on(\"data\",function(e){t.processChunk(e)}),e.on(\"end\",function(){t.end()}),e.on(\"error\",function(e){t.error(e)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var e=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),e=!0),this.previous&&this.previous.resume(),!e},flush:function(){},processChunk:function(e){this.push(e)},withStreamInfo:function(e,t){return this.extraStreamInfo[e]=t,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var e in this.extraStreamInfo)Object.prototype.hasOwnProperty.call(this.extraStreamInfo,e)&&(this.streamInfo[e]=this.extraStreamInfo[e])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var e=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r<t.length;r++)s+=t[r].length;switch(e){case\"string\":return t.join(\"\");case\"array\":return Array.prototype.concat.apply([],t);case\"uint8array\":for(i=new Uint8Array(s),r=0;r<t.length;r++)i.set(t[r],n),n+=t[r].length;return i;case\"nodebuffer\":return Buffer.concat(t);default:throw new Error(\"concat : unsupported type '\"+e+\"'\")}}(i,n),a);t(e)}catch(e){r(e)}n=[]}).resume()})}function f(e,t,r){var n=t;switch(t){case\"blob\":case\"arraybuffer\":n=\"uint8array\";break;case\"base64\":n=\"string\"}try{this._internalType=n,this._outputType=t,this._mimeType=r,h.checkSupport(n),this._worker=e.pipe(new i(n)),e.lock()}catch(e){this._worker=new s(\"error\"),this._worker.error(e)}}f.prototype={accumulate:function(e){return l(this,e)},on:function(e,t){var r=this;return\"data\"===e?this._worker.on(e,function(e){t.call(r,e.data,e.meta)}):this._worker.on(e,function(){h.delay(t,arguments,r)}),this},resume:function(){return h.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(e){if(h.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new o(this,{objectMode:\"nodebuffer\"!==this._outputType},e)}},t.exports=f},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(e,t,r){\"use strict\";if(r.base64=!0,r.array=!0,r.string=!0,r.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,r.nodebuffer=\"undefined\"!=typeof Buffer,r.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)r.blob=!1;else{var n=new ArrayBuffer(0);try{r.blob=0===new Blob([n],{type:\"application/zip\"}).size}catch(e){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),r.blob=0===i.getBlob(\"application/zip\").size}catch(e){r.blob=!1}}}try{r.nodestream=!!e(\"readable-stream\").Readable}catch(e){r.nodestream=!1}},{\"readable-stream\":16}],31:[function(e,t,s){\"use strict\";for(var o=e(\"./utils\"),h=e(\"./support\"),r=e(\"./nodejsUtils\"),n=e(\"./stream/GenericWorker\"),u=new Array(256),i=0;i<256;i++)u[i]=252<=i?6:248<=i?5:240<=i?4:224<=i?3:192<=i?2:1;u[254]=u[254]=1;function a(){n.call(this,\"utf-8 decode\"),this.leftOver=null}function l(){n.call(this,\"utf-8 encode\")}s.utf8encode=function(e){return h.nodebuffer?r.newBufferFrom(e,\"utf-8\"):function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=h.uint8array?new Uint8Array(o):new Array(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t<s;)if((n=e[t++])<128)a[r++]=n;else if(4<(i=u[n]))a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;1<i&&t<s;)n=n<<6|63&e[t++],i--;1<i?a[r++]=65533:n<65536?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r<e.length;++r)t[r]=255&e.charCodeAt(r);return t}e(\"setimmediate\"),a.newBlob=function(t,r){a.checkSupport(\"blob\");try{return new Blob([t],{type:r})}catch(e){try{var n=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return n.append(t),n.getBlob(r)}catch(e){throw new Error(\"Bug : can't construct the Blob.\")}}};var i={stringifyByChunk:function(e,t,r){var n=[],i=0,s=e.length;if(s<=r)return String.fromCharCode.apply(null,e);for(;i<s;)\"array\"===t||\"nodebuffer\"===t?n.push(String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,s)))):n.push(String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,s)))),i+=r;return n.join(\"\")},stringifyByChar:function(e){for(var t=\"\",r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return t},applyCanBeUsed:{uint8array:function(){try{return o.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(e){return!1}}(),nodebuffer:function(){try{return o.nodebuffer&&1===String.fromCharCode.apply(null,r.allocBuffer(1)).length}catch(e){return!1}}()}};function s(e){var t=65536,r=a.getTypeOf(e),n=!0;if(\"uint8array\"===r?n=i.applyCanBeUsed.uint8array:\"nodebuffer\"===r&&(n=i.applyCanBeUsed.nodebuffer),n)for(;1<t;)try{return i.stringifyByChunk(e,r,t)}catch(e){t=Math.floor(t/2)}return i.stringifyByChar(e)}function f(e,t){for(var r=0;r<e.length;r++)t[r]=e[r];return t}a.applyFromCharCode=s;var c={};c.string={string:n,array:function(e){return l(e,new Array(e.length))},arraybuffer:function(e){return c.string.uint8array(e).buffer},uint8array:function(e){return l(e,new Uint8Array(e.length))},nodebuffer:function(e){return l(e,r.allocBuffer(e.length))}},c.array={string:s,array:n,arraybuffer:function(e){return new Uint8Array(e).buffer},uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(e)}},c.arraybuffer={string:function(e){return s(new Uint8Array(e))},array:function(e){return f(new Uint8Array(e),new Array(e.byteLength))},arraybuffer:n,uint8array:function(e){return new Uint8Array(e)},nodebuffer:function(e){return r.newBufferFrom(new Uint8Array(e))}},c.uint8array={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return e.buffer},uint8array:n,nodebuffer:function(e){return r.newBufferFrom(e)}},c.nodebuffer={string:s,array:function(e){return f(e,new Array(e.length))},arraybuffer:function(e){return c.nodebuffer.uint8array(e).buffer},uint8array:function(e){return f(e,new Uint8Array(e.length))},nodebuffer:n},a.transformTo=function(e,t){if(t=t||\"\",!e)return t;a.checkSupport(e);var r=a.getTypeOf(t);return c[r][e](t)},a.resolve=function(e){for(var t=e.split(\"/\"),r=[],n=0;n<t.length;n++){var i=t[n];\".\"===i||\"\"===i&&0!==n&&n!==t.length-1||(\"..\"===i?r.pop():r.push(i))}return r.join(\"/\")},a.getTypeOf=function(e){return\"string\"==typeof e?\"string\":\"[object Array]\"===Object.prototype.toString.call(e)?\"array\":o.nodebuffer&&r.isBuffer(e)?\"nodebuffer\":o.uint8array&&e instanceof Uint8Array?\"uint8array\":o.arraybuffer&&e instanceof ArrayBuffer?\"arraybuffer\":void 0},a.checkSupport=function(e){if(!o[e.toLowerCase()])throw new Error(e+\" is not supported by this platform\")},a.MAX_VALUE_16BITS=65535,a.MAX_VALUE_32BITS=-1,a.pretty=function(e){var t,r,n=\"\";for(r=0;r<(e||\"\").length;r++)n+=\"\\\\x\"+((t=e.charCodeAt(r))<16?\"0\":\"\")+t.toString(16).toUpperCase();return n},a.delay=function(e,t,r){setImmediate(function(){e.apply(r||null,t||[])})},a.inherits=function(e,t){function r(){}r.prototype=t.prototype,e.prototype=new r},a.extend=function(){var e,t,r={};for(e=0;e<arguments.length;e++)for(t in arguments[e])Object.prototype.hasOwnProperty.call(arguments[e],t)&&void 0===r[t]&&(r[t]=arguments[e][t]);return r},a.prepareContent=function(r,e,n,i,s){return u.Promise.resolve(e).then(function(n){return o.blob&&(n instanceof Blob||-1!==[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(n)))&&\"undefined\"!=typeof FileReader?new u.Promise(function(t,r){var e=new FileReader;e.onload=function(e){t(e.target.result)},e.onerror=function(e){r(e.target.error)},e.readAsArrayBuffer(n)}):n}).then(function(e){var t=a.getTypeOf(e);return t?(\"arraybuffer\"===t?e=a.transformTo(\"uint8array\",e):\"string\"===t&&(s?e=h.decode(e):n&&!0!==i&&(e=function(e){return l(e,o.uint8array?new Uint8Array(e.length):new Array(e.length))}(e))),e):u.Promise.reject(new Error(\"Can't read the data of '\"+r+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))})}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,setimmediate:54}],33:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),i=e(\"./utils\"),s=e(\"./signature\"),a=e(\"./zipEntry\"),o=e(\"./support\");function h(e){this.files=[],this.loadOptions=e}h.prototype={checkSignature:function(e){if(!this.reader.readAndCheckSignature(e)){this.reader.index-=4;var t=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+i.pretty(t)+\", expected \"+i.pretty(e)+\")\")}},isSignature:function(e,t){var r=this.reader.index;this.reader.setIndex(e);var n=this.reader.readString(4)===t;return this.reader.setIndex(r),n},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var e=this.reader.readData(this.zipCommentLength),t=o.uint8array?\"uint8array\":\"array\",r=i.transformTo(t,e);this.zipComment=this.loadOptions.decodeFileName(r)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var e,t,r,n=this.zip64EndOfCentralSize-44;0<n;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var e,t;for(e=0;e<this.files.length;e++)t=this.files[e],this.reader.setIndex(t.localHeaderOffset),this.checkSignature(s.LOCAL_FILE_HEADER),t.readLocalPart(this.reader),t.handleUTF8(),t.processAttributes()},readCentralDir:function(){var e;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER);)(e=new a({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(e);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var e=this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);if(e<0)throw!this.isSignature(0,s.LOCAL_FILE_HEADER)?new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\"):new Error(\"Corrupted zip: can't find end of central directory\");this.reader.setIndex(e);var t=e;if(this.checkSignature(s.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,(e=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(e),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,s.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var n=t-r;if(0<n)this.isSignature(t,s.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(n)+\" bytes.\")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=h},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utils\":32,\"./zipEntry\":34}],34:[function(e,t,r){\"use strict\";var n=e(\"./reader/readerFor\"),s=e(\"./utils\"),i=e(\"./compressedObject\"),a=e(\"./crc32\"),o=e(\"./utf8\"),h=e(\"./compressions\"),u=e(\"./support\");function l(e,t){this.options=e,this.loadOptions=t}l.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(null===(t=function(e){for(var t in h)if(Object.prototype.hasOwnProperty.call(h,t)&&h[t].magic===e)return h[t];return null}(this.compressionMethod)))throw new Error(\"Corrupted zip : compression \"+s.pretty(this.compressionMethod)+\" unknown (inner file : \"+s.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new i(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4<i;)t=e.readInt(2),r=e.readInt(2),n=e.readData(r),this.extraFields[t]={id:t,length:r,value:n};e.setIndex(i)},handleUTF8:function(){var e=u.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=o.utf8decode(this.fileName),this.fileCommentStr=o.utf8decode(this.fileComment);else{var t=this.findExtraFieldUnicodePath();if(null!==t)this.fileNameStr=t;else{var r=s.transformTo(e,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(r)}var n=this.findExtraFieldUnicodeComment();if(null!==n)this.fileCommentStr=n;else{var i=s.transformTo(e,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(i)}}},findExtraFieldUnicodePath:function(){var e=this.extraFields[28789];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileName)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null},findExtraFieldUnicodeComment:function(){var e=this.extraFields[25461];if(e){var t=n(e.value);return 1!==t.readInt(1)?null:a(this.fileComment)!==t.readInt(4)?null:o.utf8decode(t.readData(e.length-5))}return null}},t.exports=l},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(e,t,r){\"use strict\";function n(e,t,r){this.name=e,this.dir=r.dir,this.date=r.date,this.comment=r.comment,this.unixPermissions=r.unixPermissions,this.dosPermissions=r.dosPermissions,this._data=t,this._dataBinary=r.binary,this.options={compression:r.compression,compressionOptions:r.compressionOptions}}var s=e(\"./stream/StreamHelper\"),i=e(\"./stream/DataWorker\"),a=e(\"./utf8\"),o=e(\"./compressedObject\"),h=e(\"./stream/GenericWorker\");n.prototype={internalStream:function(e){var t=null,r=\"string\";try{if(!e)throw new Error(\"No output type specified.\");var n=\"string\"===(r=e.toLowerCase())||\"text\"===r;\"binarystring\"!==r&&\"text\"!==r||(r=\"string\"),t=this._decompressWorker();var i=!this._dataBinary;i&&!n&&(t=t.pipe(new a.Utf8EncodeWorker)),!i&&n&&(t=t.pipe(new a.Utf8DecodeWorker))}catch(e){(t=new h(\"error\")).error(e)}return new s(t,r,\"\")},async:function(e,t){return this.internalStream(e).accumulate(t)},nodeStream:function(e,t){return this.internalStream(e||\"nodebuffer\").toNodejsStream(t)},_compressWorker:function(e,t){if(this._data instanceof o&&this._data.compression.magic===e.magic)return this._data.getCompressedWorker();var r=this._decompressWorker();return this._dataBinary||(r=r.pipe(new a.Utf8EncodeWorker)),o.createWorkerFrom(r,e,t)},_decompressWorker:function(){return this._data instanceof o?this._data.getContentWorker():this._data instanceof h?this._data:new i(this._data)}};for(var u=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],l=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},f=0;f<u.length;f++)n.prototype[u[f]]=l;t.exports=n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(e,l,t){(function(t){\"use strict\";var r,n,e=t.MutationObserver||t.WebKitMutationObserver;if(e){var i=0,s=new e(u),a=t.document.createTextNode(\"\");s.observe(a,{characterData:!0}),r=function(){a.data=i=++i%2}}else if(t.setImmediate||void 0===t.MessageChannel)r=\"document\"in t&&\"onreadystatechange\"in t.document.createElement(\"script\")?function(){var e=t.document.createElement(\"script\");e.onreadystatechange=function(){u(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},t.document.documentElement.appendChild(e)}:function(){setTimeout(u,0)};else{var o=new t.MessageChannel;o.port1.onmessage=u,r=function(){o.port2.postMessage(0)}}var h=[];function u(){var e,t;n=!0;for(var r=h.length;r;){for(t=h,h=[],e=-1;++e<r;)t[e]();r=h.length}n=!1}l.exports=function(e){1!==h.push(e)||n||r()}}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(e,t,r){\"use strict\";var i=e(\"immediate\");function u(){}var l={},s=[\"REJECTED\"],a=[\"FULFILLED\"],n=[\"PENDING\"];function o(e){if(\"function\"!=typeof e)throw new TypeError(\"resolver must be a function\");this.state=n,this.queue=[],this.outcome=void 0,e!==u&&d(this,e)}function h(e,t,r){this.promise=e,\"function\"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function f(t,r,n){i(function(){var e;try{e=r(n)}catch(e){return l.reject(t,e)}e===t?l.reject(t,new TypeError(\"Cannot resolve promise with itself\")):l.resolve(t,e)})}function c(e){var t=e&&e.then;if(e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof t)return function(){t.apply(e,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,l.reject(t,e))}function i(e){r||(r=!0,l.resolve(t,e))}var s=p(function(){e(i,n)});\"error\"===s.status&&n(s.value)}function p(e,t){var r={};try{r.value=e(t),r.status=\"success\"}catch(e){r.status=\"error\",r.value=e}return r}(t.exports=o).prototype.finally=function(t){if(\"function\"!=typeof t)return this;var r=this.constructor;return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})})},o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){if(\"function\"!=typeof e&&this.state===a||\"function\"!=typeof t&&this.state===s)return this;var r=new this.constructor(u);this.state!==n?f(r,this.state===a?e:t,this.outcome):this.queue.push(new h(r,e,t));return r},h.prototype.callFulfilled=function(e){l.resolve(this.promise,e)},h.prototype.otherCallFulfilled=function(e){f(this.promise,this.onFulfilled,e)},h.prototype.callRejected=function(e){l.reject(this.promise,e)},h.prototype.otherCallRejected=function(e){f(this.promise,this.onRejected,e)},l.resolve=function(e,t){var r=p(c,t);if(\"error\"===r.status)return l.reject(e,r.value);var n=r.value;if(n)d(e,n);else{e.state=a,e.outcome=t;for(var i=-1,s=e.queue.length;++i<s;)e.queue[i].callFulfilled(t)}return e},l.reject=function(e,t){e.state=s,e.outcome=t;for(var r=-1,n=e.queue.length;++r<n;)e.queue[r].callRejected(t);return e},o.resolve=function(e){if(e instanceof this)return e;return l.resolve(new this(u),e)},o.reject=function(e){var t=new this(u);return l.reject(t,e)},o.all=function(e){var r=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var n=e.length,i=!1;if(!n)return this.resolve([]);var s=new Array(n),a=0,t=-1,o=new this(u);for(;++t<n;)h(e[t],t);return o;function h(e,t){r.resolve(e).then(function(e){s[t]=e,++a!==n||i||(i=!0,l.resolve(o,s))},function(e){i||(i=!0,l.reject(o,e))})}},o.race=function(e){var t=this;if(\"[object Array]\"!==Object.prototype.toString.call(e))return this.reject(new TypeError(\"must be an array\"));var r=e.length,n=!1;if(!r)return this.resolve([]);var i=-1,s=new this(u);for(;++i<r;)a=e[i],t.resolve(a).then(function(e){n||(n=!0,l.resolve(s,e))},function(e){n||(n=!0,l.reject(s,e))});var a;return s}},{immediate:36}],38:[function(e,t,r){\"use strict\";var n={};(0,e(\"./lib/utils/common\").assign)(n,e(\"./lib/deflate\"),e(\"./lib/inflate\"),e(\"./lib/zlib/constants\")),t.exports=n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(e,t,r){\"use strict\";var a=e(\"./zlib/deflate\"),o=e(\"./utils/common\"),h=e(\"./utils/strings\"),i=e(\"./zlib/messages\"),s=e(\"./zlib/zstream\"),u=Object.prototype.toString,l=0,f=-1,c=0,d=8;function p(e){if(!(this instanceof p))return new p(e);this.options=o.assign({level:f,method:d,chunkSize:16384,windowBits:15,memLevel:8,strategy:c,to:\"\"},e||{});var t=this.options;t.raw&&0<t.windowBits?t.windowBits=-t.windowBits:t.gzip&&0<t.windowBits&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new s,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==l)throw new Error(i[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var n;if(n=\"string\"==typeof t.dictionary?h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===u.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=a.deflateSetDictionary(this.strm,n))!==l)throw new Error(i[r]);this._dict_set=!0}}function n(e,t){var r=new p(t);if(r.push(e,!0),r.err)throw r.msg||i[r.err];return r.result}p.prototype.push=function(e,t){var r,n,i=this.strm,s=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:!0===t?4:0,\"string\"==typeof e?i.input=h.string2buf(e):\"[object ArrayBuffer]\"===u.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new o.Buf8(s),i.next_out=0,i.avail_out=s),1!==(r=a.deflate(i,n))&&r!==l)return this.onEnd(r),!(this.ended=!0);0!==i.avail_out&&(0!==i.avail_in||4!==n&&2!==n)||(\"string\"===this.options.to?this.onData(h.buf2binstring(o.shrinkBuf(i.output,i.next_out))):this.onData(o.shrinkBuf(i.output,i.next_out)))}while((0<i.avail_in||0===i.avail_out)&&1!==r);return 4===n?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l):2!==n||(this.onEnd(l),!(i.avail_out=0))},p.prototype.onData=function(e){this.chunks.push(e)},p.prototype.onEnd=function(e){e===l&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=o.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=p,r.deflate=n,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,n(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,n(e,t)}},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(e,t,r){\"use strict\";var c=e(\"./zlib/inflate\"),d=e(\"./utils/common\"),p=e(\"./utils/strings\"),m=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),i=e(\"./zlib/zstream\"),s=e(\"./zlib/gzheader\"),_=Object.prototype.toString;function a(e){if(!(this instanceof a))return new a(e);this.options=d.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new i,this.strm.avail_out=0;var r=c.inflateInit2(this.strm,t.windowBits);if(r!==m.Z_OK)throw new Error(n[r]);this.header=new s,c.inflateGetHeader(this.strm,this.header)}function o(e,t){var r=new a(t);if(r.push(e,!0),r.err)throw r.msg||n[r.err];return r.result}a.prototype.push=function(e,t){var r,n,i,s,a,o,h=this.strm,u=this.options.chunkSize,l=this.options.dictionary,f=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?m.Z_FINISH:m.Z_NO_FLUSH,\"string\"==typeof e?h.input=p.binstring2buf(e):\"[object ArrayBuffer]\"===_.call(e)?h.input=new Uint8Array(e):h.input=e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new d.Buf8(u),h.next_out=0,h.avail_out=u),(r=c.inflate(h,m.Z_NO_FLUSH))===m.Z_NEED_DICT&&l&&(o=\"string\"==typeof l?p.string2buf(l):\"[object ArrayBuffer]\"===_.call(l)?new Uint8Array(l):l,r=c.inflateSetDictionary(this.strm,o)),r===m.Z_BUF_ERROR&&!0===f&&(r=m.Z_OK,f=!1),r!==m.Z_STREAM_END&&r!==m.Z_OK)return this.onEnd(r),!(this.ended=!0);h.next_out&&(0!==h.avail_out&&r!==m.Z_STREAM_END&&(0!==h.avail_in||n!==m.Z_FINISH&&n!==m.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(i=p.utf8border(h.output,h.next_out),s=h.next_out-i,a=p.buf2string(h.output,i),h.next_out=s,h.avail_out=u-s,s&&d.arraySet(h.output,h.output,i,s,0),this.onData(a)):this.onData(d.shrinkBuf(h.output,h.next_out)))),0===h.avail_in&&0===h.avail_out&&(f=!0)}while((0<h.avail_in||0===h.avail_out)&&r!==m.Z_STREAM_END);return r===m.Z_STREAM_END&&(n=m.Z_FINISH),n===m.Z_FINISH?(r=c.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===m.Z_OK):n!==m.Z_SYNC_FLUSH||(this.onEnd(m.Z_OK),!(h.avail_out=0))},a.prototype.onData=function(e){this.chunks.push(e)},a.prototype.onEnd=function(e){e===m.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=d.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=a,r.inflate=o,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,o(e,t)},r.ungzip=o},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if(\"object\"!=typeof r)throw new TypeError(r+\"must be non-object\");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){var t,r,n,i,s,a;for(t=n=0,r=e.length;t<r;t++)n+=e[t].length;for(a=new Uint8Array(n),t=i=0,r=e.length;t<r;t++)s=e[t],a.set(s,i),i+=s.length;return a}},s={arraySet:function(e,t,r,n,i){for(var s=0;s<n;s++)e[i+s]=t[r+s]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,s))},r.setTyped(n)},{}],42:[function(e,t,r){\"use strict\";var h=e(\"./common\"),i=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(e){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){s=!1}for(var u=new h.Buf8(256),n=0;n<256;n++)u[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&i))return String.fromCharCode.apply(null,h.shrinkBuf(e,t));for(var r=\"\",n=0;n<t;n++)r+=String.fromCharCode(e[n]);return r}u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,i,s,a=e.length,o=0;for(i=0;i<a;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),o+=r<128?1:r<2048?2:r<65536?3:4;for(t=new h.Buf8(o),i=s=0;s<o;i++)55296==(64512&(r=e.charCodeAt(i)))&&i+1<a&&56320==(64512&(n=e.charCodeAt(i+1)))&&(r=65536+(r-55296<<10)+(n-56320),i++),r<128?t[s++]=r:(r<2048?t[s++]=192|r>>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r<n;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,n,i,s,a=t||e.length,o=new Array(2*a);for(r=n=0;r<a;)if((i=e[r++])<128)o[n++]=i;else if(4<(s=u[i]))o[n++]=65533,r+=s-1;else{for(i&=2===s?31:3===s?15:7;1<s&&r<a;)i=i<<6|63&e[r++],s--;1<s?o[n++]=65533:i<65536?o[n++]=i:(i-=65536,o[n++]=55296|i>>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3<r?2e3:r;s=s+(i=i+t[n++]|0)|0,--a;);i%=65521,s%=65521}return i|s<<16|0}},{}],44:[function(e,t,r){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(e,t,r){\"use strict\";var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a<s;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4<e?9:0)}function D(e){for(var t=e.length;0<=--t;)e[t]=0}function F(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&s<c);if(n=S-(c-s),s=c-S,a<n){if(e.match_start=t,o<=(a=n))break;d=u[s+a-1],p=u[s+a]}}}while((t=f[t&l])>h&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u<l&&(l=u),r=0===l?0:(a.avail_in-=l,c.arraySet(o,a.input,a.next_in,l,h),1===a.state.wrap?a.adler=d(a.adler,o,l,h):2===a.state.wrap&&(a.adler=p(a.adler,o,l,h)),a.next_in+=l,a.total_in+=l,l),e.lookahead+=r,e.lookahead+e.insert>=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+1])&e.hash_mask;e.insert&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[s+x-1])&e.hash_mask,e.prev[s&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=s,s++,e.insert--,!(e.lookahead+e.insert<x)););}while(e.lookahead<z&&0!==e.strm.avail_in)}function Z(e,t){for(var r,n;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==r&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r)),e.match_length>=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart,0!=--e.match_length;);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+1])&e.hash_mask;else n=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function W(e,t){for(var r,n,i;;){if(e.lookahead<z){if(j(e),e.lookahead<z&&t===l)return A;if(0===e.lookahead)break}if(r=0,e.lookahead>=x&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=x-1,0!==r&&e.prev_length<e.max_lazy_match&&e.strstart-r<=e.w_size-z&&(e.match_length=L(e,r),e.match_length<=5&&(1===e.strategy||e.match_length===x&&4096<e.strstart-e.match_start)&&(e.match_length=x-1)),e.prev_length>=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<<e.hash_shift^e.window[e.strstart+x-1])&e.hash_mask,r=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!=--e.prev_length;);if(e.match_available=0,e.match_length=x-1,e.strstart++,n&&(N(e,!1),0===e.strm.avail_out))return A}else if(e.match_available){if((n=u._tr_tally(e,0,e.window[e.strstart-1]))&&N(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return A}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=u._tr_tally(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<x-1?e.strstart:x-1,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}function M(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function H(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=v,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new c.Buf16(2*w),this.dyn_dtree=new c.Buf16(2*(2*a+1)),this.bl_tree=new c.Buf16(2*(2*o+1)),D(this.dyn_ltree),D(this.dyn_dtree),D(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new c.Buf16(k+1),this.heap=new c.Buf16(2*s+1),D(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new c.Buf16(2*s+1),D(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function G(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=i,(t=e.state).pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?C:E,e.adler=2===t.wrap?0:1,t.last_flush=l,u._tr_init(t),m):R(e,_)}function K(e){var t=G(e);return t===m&&function(e){e.window_size=2*e.w_size,D(e.head),e.max_lazy_match=h[e.level].max_lazy,e.good_match=h[e.level].good_length,e.nice_match=h[e.level].nice_length,e.max_chain_length=h[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=x-1,e.match_available=0,e.ins_h=0}(e.state),t}function Y(e,t,r,n,i,s){if(!e)return _;var a=1;if(t===g&&(t=6),n<0?(a=0,n=-n):15<n&&(a=2,n-=16),i<1||y<i||r!==v||n<8||15<n||t<0||9<t||s<0||b<s)return R(e,_);8===n&&(n=9);var o=new H;return(e.state=o).strm=e,o.wrap=a,o.gzhead=null,o.w_bits=n,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=i+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+x-1)/x),o.window=new c.Buf8(2*o.w_size),o.head=new c.Buf16(o.hash_size),o.prev=new c.Buf16(o.w_size),o.lit_bufsize=1<<i+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new c.Buf8(o.pending_buf_size),o.d_buf=1*o.lit_bufsize,o.l_buf=3*o.lit_bufsize,o.level=t,o.strategy=s,o.method=r,K(e)}h=[new M(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5<t||t<0)return e?R(e,_):_;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||666===n.status&&t!==f)return R(e,0===e.avail_out?-5:_);if(n.strm=e,r=n.last_flush,n.last_flush=t,n.status===C)if(2===n.wrap)e.adler=0,U(n,31),U(n,139),U(n,8),n.gzhead?(U(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),U(n,255&n.gzhead.time),U(n,n.gzhead.time>>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.name.length?255&n.gzhead.name.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindex<n.gzhead.comment.length?255&n.gzhead.comment.charCodeAt(n.gzindex++):0,U(n,s)}while(0!==s);n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0<e.strstart&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){s=e.strstart+S;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&i<s);e.match_length=S-(s-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0<n.wrap&&(n.wrap=-n.wrap),0!==n.pending?m:1)},r.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==C&&69!==t&&73!==t&&91!==t&&103!==t&&t!==E&&666!==t?R(e,_):(e.state=null,t===E?R(e,-3):m):_},r.deflateSetDictionary=function(e,t){var r,n,i,s,a,o,h,u,l=t.length;if(!e||!e.state)return _;if(2===(s=(r=e.state).wrap)||1===s&&r.status!==C||r.lookahead)return _;for(1===s&&(e.adler=d(e.adler,t,l,0)),r.wrap=0,l>=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<<r.hash_shift^r.window[n+x-1])&r.hash_mask,r.prev[n&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=n,n++,--i;);r.strstart=n,r.lookahead=x-1,j(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=x-1,r.match_available=0,e.next_in=o,e.input=h,e.avail_in=a,r.wrap=s,m},r.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(e,t,r){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],48:[function(e,t,r){\"use strict\";t.exports=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C;r=e.state,n=e.next_in,z=e.input,i=n+(e.avail_in-5),s=e.next_out,C=e.output,a=s-(t-e.avail_out),o=s+(e.avail_out-257),h=r.dmax,u=r.wsize,l=r.whave,f=r.wnext,c=r.window,d=r.hold,p=r.bits,m=r.lencode,_=r.distcode,g=(1<<r.lenbits)-1,b=(1<<r.distbits)-1;e:do{p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=m[d&g];t:for(;;){if(d>>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<<y)-1)];continue t}if(32&y){r.mode=12;break e}e.msg=\"invalid literal/length code\",r.mode=30;break e}w=65535&v,(y&=15)&&(p<y&&(d+=z[n++]<<p,p+=8),w+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=z[n++]<<p,p+=8,d+=z[n++]<<p,p+=8),v=_[d&b];r:for(;;){if(d>>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<<y)-1)];continue r}e.msg=\"invalid distance code\",r.mode=30;break e}if(k=65535&v,p<(y&=15)&&(d+=z[n++]<<p,(p+=8)<y&&(d+=z[n++]<<p,p+=8)),h<(k+=d&(1<<y)-1)){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(d>>>=y,p-=y,(y=s-a)<k){if(l<(y=k-y)&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break e}if(S=c,(x=0)===f){if(x+=u-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}}else if(f<y){if(x+=u+f-y,(y-=f)<w){for(w-=y;C[s++]=c[x++],--y;);if(x=0,f<w){for(w-=y=f;C[s++]=c[x++],--y;);x=s-k,S=C}}}else if(x+=f-y,y<w){for(w-=y;C[s++]=c[x++],--y;);x=s-k,S=C}for(;2<w;)C[s++]=S[x++],C[s++]=S[x++],C[s++]=S[x++],w-=3;w&&(C[s++]=S[x++],1<w&&(C[s++]=S[x++]))}else{for(x=s-k;C[s++]=C[x++],C[s++]=C[x++],C[s++]=C[x++],2<(w-=3););w&&(C[s++]=C[x++],1<w&&(C[s++]=C[x++]))}break}}break}}while(n<i&&s<o);n-=w=p>>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n<i?i-n+5:5-(n-i),e.avail_out=s<o?o-s+257:257-(s-o),r.hold=d,r.bits=p}},{}],49:[function(e,t,r){\"use strict\";var I=e(\"../utils/common\"),O=e(\"./adler32\"),B=e(\"./crc32\"),R=e(\"./inffast\"),T=e(\"./inftrees\"),D=1,F=2,N=0,U=-2,P=1,n=852,i=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,o(e))):U}function u(e,t){var r,n;return e?(n=new s,(e.state=n).window=null,(r=h(e,t))!==N&&(e.state=null),r):U}var l,f,c=!0;function j(e){if(c){var t;for(l=new I.Buf32(512),f=new I.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(T(D,e.lens,0,288,l,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;T(F,e.lens,0,32,f,0,e.work,{bits:5}),c=!1}e.lencode=l,e.lenbits=9,e.distcode=f,e.distbits=5}function Z(e,t,r,n){var i,s=e.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new I.Buf8(s.wsize)),n>=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=i))),0}r.inflateReset=o,r.inflateReset2=h,r.inflateResetKeep=a,r.inflateInit=function(e){return u(e,15)},r.inflateInit2=u,r.inflate=function(e,t){var r,n,i,s,a,o,h,u,l,f,c,d,p,m,_,g,b,v,y,w,k,x,S,z,C=0,E=new I.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(r=e.state).mode&&(r.mode=13),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,f=o,c=h,x=N;e:for(;;)switch(r.mode){case P:if(0===r.wrap){r.mode=13;break}for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(2&r.wrap&&35615===u){E[r.check=0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<<k,e.adler=r.check=1,r.mode=512&u?10:12,l=u=0;break;case 2:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.flags=u,8!=(255&r.flags)){e.msg=\"unknown compression method\",r.mode=30;break}if(57344&r.flags){e.msg=\"unknown header flags set\",r.mode=30;break}r.head&&(r.head.text=u>>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.time=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.head&&(r.head.xflags=255&u,r.head.os=u>>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length=u,r.head&&(r.head.extra_len=u),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.comment+=String.fromCharCode(k)),k&&d<o;);if(512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,k)break e}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(65535&r.check)){e.msg=\"header crc mismatch\",r.mode=30;break}l=u=0}r.head&&(r.head.hcrc=r.flags>>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}e.adler=r.check=L(u),l=u=0,r.mode=11;case 11:if(0===r.havedict)return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,2;e.adler=r.check=1,r.mode=12;case 12:if(5===t||6===t)break e;case 13:if(r.last){u>>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}switch(r.last=1&u,l-=1,3&(u>>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if((65535&u)!=(u>>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o<d&&(d=o),h<d&&(d=h),0===d)break e;I.arraySet(i,n,s,d,a),o-=d,s+=d,h-=d,a+=d,r.length-=d;break}r.mode=12;break;case 17:for(;l<14;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(r.nlen=257+(31&u),u>>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286<r.nlen||30<r.ndist){e.msg=\"too many length or distance symbols\",r.mode=30;break}r.have=0,r.mode=18;case 18:for(;r.have<r.ncode;){for(;l<3;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.lens[A[r.have++]]=7&u,u>>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have<r.nlen+r.ndist;){for(;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(b<16)u>>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u>>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=3+(7&(u>>>=_)),u>>>=3,l-=3}else{for(z=_+7;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}l-=_,k=0,d=11+(127&(u>>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<<r.lenbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(g&&0==(240&g)){for(v=_,y=g,w=b;g=(C=r.lencode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.length+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<<r.distbits)-1])>>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(0==(240&g)){for(v=_,y=g,w=b;g=(C=r.distcode[w+((u&(1<<v+y)-1)>>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}u>>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l<z;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}r.offset+=u&(1<<r.extra)-1,u>>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(h<d&&(d=h),h-=d,r.length-=d;i[a++]=m[p++],--d;);0===r.length&&(r.mode=21);break;case 26:if(0===h)break e;i[a++]=r.length,h--,r.mode=21;break;case 27:if(r.wrap){for(;l<32;){if(0===o)break e;o--,u|=n[s++]<<l,l+=8}if(c-=h,e.total_out+=c,r.total+=c,c&&(e.adler=r.check=r.flags?B(r.check,i,c,a-c):O(r.check,i,c,a-c)),c=h,(r.flags?u:L(u))!==r.check){e.msg=\"incorrect data check\",r.mode=30;break}l=u=0}r.mode=28;case 28:if(r.wrap&&r.flags){for(;l<32;){if(0===o)break e;o--,u+=n[s++]<<l,l+=8}if(u!==(4294967295&r.total)){e.msg=\"incorrect length check\",r.mode=30;break}l=u=0}r.mode=29;case 29:x=1;break e;case 30:x=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,(r.wsize||c!==e.avail_out&&r.mode<30&&(r.mode<27||4!==t))&&Z(e,e.output,e.next_out,c-e.avail_out)?(r.mode=31,-4):(f-=e.avail_in,c-=e.avail_out,e.total_in+=f,e.total_out+=c,r.total+=c,r.wrap&&c&&(e.adler=r.check=r.flags?B(r.check,i,c,e.next_out-c):O(r.check,i,c,e.next_out-c)),e.data_type=r.bits+(r.last?64:0)+(12===r.mode?128:0)+(20===r.mode||15===r.mode?256:0),(0==f&&0===c||4===t)&&x===N&&(x=-5),x)},r.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,N},r.inflateGetHeader=function(e,t){var r;return e&&e.state?0==(2&(r=e.state).wrap)?U:((r.head=t).done=!1,N):U},r.inflateSetDictionary=function(e,t){var r,n=t.length;return e&&e.state?0!==(r=e.state).wrap&&11!==r.mode?U:11===r.mode&&O(1,t,n,0)!==r.check?-3:Z(e,t,n,n)?(r.mode=31,-4):(r.havedict=1,N):U},r.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(e,t,r){\"use strict\";var D=e(\"../utils/common\"),F=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],N=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],P=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,r,n,i,s,a,o){var h,u,l,f,c,d,p,m,_,g=o.bits,b=0,v=0,y=0,w=0,k=0,x=0,S=0,z=0,C=0,E=0,A=null,I=0,O=new D.Buf16(16),B=new D.Buf16(16),R=null,T=0;for(b=0;b<=15;b++)O[b]=0;for(v=0;v<n;v++)O[t[r+v]]++;for(k=g,w=15;1<=w&&0===O[w];w--);if(w<k&&(k=w),0===w)return i[s++]=20971520,i[s++]=20971520,o.bits=1,0;for(y=1;y<w&&0===O[y];y++);for(k<y&&(k=y),b=z=1;b<=15;b++)if(z<<=1,(z-=O[b])<0)return-1;if(0<z&&(0===e||1!==w))return-1;for(B[1]=0,b=1;b<15;b++)B[b+1]=B[b]+O[b];for(v=0;v<n;v++)0!==t[r+v]&&(a[B[t[r+v]]++]=v);if(d=0===e?(A=R=a,19):1===e?(A=F,I-=257,R=N,T-=257,256):(A=U,R=P,-1),b=y,c=s,S=v=E=0,l=-1,f=(C=1<<(x=k))-1,1===e&&852<C||2===e&&592<C)return 1;for(;;){for(p=b-S,_=a[v]<d?(m=0,a[v]):a[v]>d?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<<b-S,y=u=1<<x;i[c+(E>>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<<b-1;E&h;)h>>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k<b&&(E&f)!==l){for(0===S&&(S=k),c+=y,z=1<<(x=b-S);x+S<w&&!((z-=O[x+S])<=0);)x++,z<<=1;if(C+=1<<x,1===e&&852<C||2===e&&592<C)return 1;i[l=E&f]=k<<24|x<<16|c-s|0}}return 0!==E&&(i[c+E]=b-S<<24|64<<16|0),o.bits=k,0}},{\"../utils/common\":41}],51:[function(e,t,r){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(e,t,r){\"use strict\";var i=e(\"../utils/common\"),o=0,h=1;function n(e){for(var t=e.length;0<=--t;)e[t]=0}var s=0,a=29,u=256,l=u+1+a,f=30,c=19,_=2*l+1,g=15,d=16,p=7,m=256,b=16,v=17,y=18,w=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],k=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],x=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],z=new Array(2*(l+2));n(z);var C=new Array(2*f);n(C);var E=new Array(512);n(E);var A=new Array(256);n(A);var I=new Array(a);n(I);var O,B,R,T=new Array(f);function D(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function F(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function N(e){return e<256?E[e]:E[256+(e>>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<<e.bi_valid&65535,U(e,e.bi_buf),e.bi_buf=t>>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=r)}function L(e,t,r){P(e,r[2*t],r[2*t+1])}function j(e,t){for(var r=0;r|=1&e,e>>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t<l;t++)e.dyn_ltree[2*t]=0;for(t=0;t<f;t++)e.dyn_dtree[2*t]=0;for(t=0;t<c;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*m]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function M(e){8<e.bi_valid?U(e,e.bi_buf):0<e.bi_valid&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function H(e,t,r,n){var i=2*t,s=2*r;return e[i]<e[s]||e[i]===e[s]&&n[t]<=n[r]}function G(e,t,r){for(var n=e.heap[r],i=r<<1;i<=e.heap_len&&(i<e.heap_len&&H(t,e.heap[i+1],e.heap[i],e.depth)&&i++,!H(t,n,e.heap[i],e.depth));)e.heap[r]=e.heap[i],r=i,i<<=1;e.heap[r]=n}function K(e,t,r){var n,i,s,a,o=0;if(0!==e.last_lit)for(;n=e.pending_buf[e.d_buf+2*o]<<8|e.pending_buf[e.d_buf+2*o+1],i=e.pending_buf[e.l_buf+o],o++,0===n?L(e,i,t):(L(e,(s=A[i])+u+1,t),0!==(a=w[s])&&P(e,i-=I[s],a),L(e,s=N(--n),r),0!==(a=k[s])&&P(e,n-=T[s],a)),o<e.last_lit;);L(e,m,t)}function Y(e,t){var r,n,i,s=t.dyn_tree,a=t.stat_desc.static_tree,o=t.stat_desc.has_stree,h=t.stat_desc.elems,u=-1;for(e.heap_len=0,e.heap_max=_,r=0;r<h;r++)0!==s[2*r]?(e.heap[++e.heap_len]=u=r,e.depth[r]=0):s[2*r+1]=0;for(;e.heap_len<2;)s[2*(i=e.heap[++e.heap_len]=u<2?++u:0)]=1,e.depth[i]=0,e.opt_len--,o&&(e.static_len-=a[2*i+1]);for(t.max_code=u,r=e.heap_len>>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u<n||(e.bl_count[s]++,a=0,d<=n&&(a=c[n-d]),o=h[2*n],e.opt_len+=o*(s+a),f&&(e.static_len+=o*(l[2*n+1]+a)));if(0!==m){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,m-=2}while(0<m);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)u<(i=e.heap[--r])||(h[2*i+1]!==s&&(e.opt_len+=(s-h[2*i+1])*h[2*i],h[2*i+1]=s),n--)}}(e,t),Z(s,u,e.bl_count)}function X(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=a,a=t[2*(n+1)+1],++o<h&&i===a||(o<u?e.bl_tree[2*i]+=o:0!==i?(i!==s&&e.bl_tree[2*i]++,e.bl_tree[2*b]++):o<=10?e.bl_tree[2*v]++:e.bl_tree[2*y]++,s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4))}function V(e,t,r){var n,i,s=-1,a=t[1],o=0,h=7,u=4;for(0===a&&(h=138,u=3),n=0;n<=r;n++)if(i=a,a=t[2*(n+1)+1],!(++o<h&&i===a)){if(o<u)for(;L(e,i,e.bl_tree),0!=--o;);else 0!==i?(i!==s&&(L(e,i,e.bl_tree),o--),L(e,b,e.bl_tree),P(e,o-3,2)):o<=10?(L(e,v,e.bl_tree),P(e,o-3,3)):(L(e,y,e.bl_tree),P(e,o-11,7));s=i,u=(o=0)===a?(h=138,3):i===a?(h=6,3):(h=7,4)}}n(T);var q=!1;function J(e,t,r,n){P(e,(s<<1)+(n?1:0),3),function(e,t,r,n){M(e),n&&(U(e,r),U(e,~r)),i.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}(e,t,r,!0)}r._tr_init=function(e){q||(function(){var e,t,r,n,i,s=new Array(g+1);for(n=r=0;n<a-1;n++)for(I[n]=r,e=0;e<1<<w[n];e++)A[r++]=n;for(A[r-1]=n,n=i=0;n<16;n++)for(T[n]=i,e=0;e<1<<k[n];e++)E[i++]=n;for(i>>=7;n<f;n++)for(T[n]=i<<7,e=0;e<1<<k[n]-7;e++)E[256+i++]=n;for(t=0;t<=g;t++)s[t]=0;for(e=0;e<=143;)z[2*e+1]=8,e++,s[8]++;for(;e<=255;)z[2*e+1]=9,e++,s[9]++;for(;e<=279;)z[2*e+1]=7,e++,s[7]++;for(;e<=287;)z[2*e+1]=8,e++,s[8]++;for(Z(z,l+1,s),e=0;e<f;e++)C[2*e+1]=5,C[2*e]=j(e,5);O=new D(z,w,u+1,l,g),B=new D(C,k,0,f,g),R=new D(new Array(0),x,0,c,p)}(),q=!0),e.l_desc=new F(e.dyn_ltree,O),e.d_desc=new F(e.dyn_dtree,B),e.bl_desc=new F(e.bl_tree,R),e.bi_buf=0,e.bi_valid=0,W(e)},r._tr_stored_block=J,r._tr_flush_block=function(e,t,r,n){var i,s,a=0;0<e.level?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t<u;t++)if(0!==e.dyn_ltree[2*t])return h;return o}(e)),Y(e,e.l_desc),Y(e,e.d_desc),a=function(e){var t;for(X(e,e.dyn_ltree,e.l_desc.max_code),X(e,e.dyn_dtree,e.d_desc.max_code),Y(e,e.bl_desc),t=c-1;3<=t&&0===e.bl_tree[2*S[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i<n;i++)P(e,e.bl_tree[2*S[i]+1],3);V(e,e.dyn_ltree,t-1),V(e,e.dyn_dtree,r-1)}(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),K(e,e.dyn_ltree,e.dyn_dtree)),W(e),n&&M(e)},r._tr_tally=function(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r<t.length;r++)t[r]=arguments[r+1];var n={callback:e,args:t};return h[o]=n,i(o),o++},e.clearImmediate=f}function f(e){delete h[e]}function c(e){if(u)setTimeout(c,0,e);else{var t=h[e];if(t){u=!0;try{!function(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}(t)}finally{f(e),u=!1}}}}function d(e){e.source===r&&\"string\"==typeof e.data&&0===e.data.indexOf(a)&&c(+e.data.slice(a.length))}}(\"undefined\"==typeof self?void 0===e?this:e:self)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}]},{},[10])(10)});","import JSZip from 'jszip';\nimport { DWGData } from '../types/dwgTypes';\nimport { LoadedCadTile2d, SplitCadManifest, SplitCadManifestNode } from './types';\n\ntype JsonLoader = (url: string) => Promise<any>;\ntype ImageUrlResolver = (entity: any, baseUrl: string) => Promise<string>;\n\n/** CAD 数据源适配器,支持拆分目录、manifest 地址和 .2d zip 包。 */\nexport class CadDataSource {\n private zipObjectUrls: string[] = [];\n\n /** 加载新版 manifest 分包数据,并返回 Loader 可消费的 DWGData 结构。 */\n public async load(url: string): Promise<DWGData> {\n this.clearZipObjectUrls(); \n return this.loadZipData(url); \n }\n\n /** 拉取 JSON 资源;保留为 public,方便后续按视口动态加载 tile。 */\n public async fetchJson(url: string): Promise<any> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n }\n\n /** 组装 manifest/layers/metadata/blocks/tiles,octree 和 tiles 会保留给渲染分组使用。 */\n private async loadSplitData(\n baseUrl: string,\n manifest: SplitCadManifest,\n fetchJson: JsonLoader = (url) => this.fetchJson(url),\n resolveImageUrl: ImageUrlResolver = (entity, sourceBaseUrl) => Promise.resolve(this.resolveImageUrl(entity, sourceBaseUrl)),\n ): Promise<DWGData> {\n const [metadata, layers, blocks, tiles] = await Promise.all([\n fetchJson(this.joinUrl(baseUrl, manifest.metadataUrl ?? 'metadata.json')),\n fetchJson(this.joinUrl(baseUrl, manifest.layersUrl ?? 'layers.json')),\n this.loadBlocks(baseUrl, manifest.blocksUrl ?? 'blocks/index.json', fetchJson),\n this.loadTiles(baseUrl, manifest.root, fetchJson),\n ]);\n\n await this.resolveBlockAssets(blocks, baseUrl, resolveImageUrl);\n\n const entities: any[] = [];\n tiles.forEach((tile) => {\n tile.inserts.forEach((insert) => entities.push(insert));\n });\n\n return {\n version: manifest.version ?? '1.0',\n metadata,\n layers,\n blocks,\n entities,\n octree: manifest.root,\n tiles,\n } as DWGData;\n }\n\n /** blocks/index.json 只保存分包列表,这里全量拉取并建立 block 列表。 */\n private async loadBlocks(baseUrl: string, blocksUrl: string, fetchJson: JsonLoader): Promise<any[]> {\n const index = await fetchJson(this.joinUrl(baseUrl, blocksUrl));\n const parts: string[] = index.parts ?? [];\n const blockParts = await Promise.all(parts.map((partUrl) => this.loadBlockPart(this.joinUrl(baseUrl, partUrl), fetchJson)));\n const blocks: any[] = [];\n blockParts.forEach((part) => {\n const partBlocks = Array.isArray(part?.blocks) ? part.blocks : [];\n partBlocks.forEach((block: any) => blocks.push(block));\n });\n return blocks;\n }\n\n /** block 分包允许缺失或损坏;跳过失败分包,避免单个 JSON 中断整张 2D 图纸加载。 */\n private async loadBlockPart(url: string, fetchJson: JsonLoader): Promise<any> {\n try {\n return await fetchJson(url);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[LoaderModule2d] Skip missing block json: ${url}`, message);\n return { blocks: [] };\n }\n }\n\n /** 给 IMAGE 实体补充浏览器可访问的图片 URL,避免渲染层依赖本机绝对路径。 */\n private async resolveBlockAssets(blocks: any[], baseUrl: string, resolveImageUrl: ImageUrlResolver): Promise<void> {\n await Promise.all(blocks.map(async (block) => {\n const entities = Array.isArray(block?.entities) ? block.entities : [];\n await Promise.all(entities.map(async (entity: any) => {\n if (String(entity?.type).toUpperCase() !== 'IMAGE') return;\n entity.imageUrl = await resolveImageUrl(entity, baseUrl);\n }));\n }));\n }\n\n /** 优先使用 localPath 的文件名;导出器会把图片复制到 manifest 同级目录。 */\n private resolveImageUrl(entity: any, baseUrl: string): string {\n const rawPath = entity.localPath || entity.sourcePath || entity.path || entity.url || '';\n if (/^(https?:)?\\/\\//i.test(rawPath) || rawPath.startsWith('/')) return rawPath;\n const normalized = String(rawPath).replace(/\\\\/g, '/');\n const fileName = normalized.split('/').filter(Boolean).pop();\n return fileName ? this.joinUrl(baseUrl, fileName) : '';\n }\n\n /** 逐个加载 octree tile,并把 tile 内 linkId 回写到节点,供拾取时快速筛选。 */\n private async loadTiles(baseUrl: string, root: SplitCadManifestNode | undefined, fetchJson: JsonLoader): Promise<LoadedCadTile2d[]> {\n const nodes = this.collectTileNodes(root);\n const tiles = await Promise.all(nodes.map(async (node) => {\n const tileUrl = node.tileUrl ?? '';\n const tile = await fetchJson(this.joinUrl(baseUrl, tileUrl));\n const inserts = this.normalizeTileInserts(tile.inserts ?? []);\n node.elements = inserts.map((insert) => insert.linkId ?? insert.id).filter((id) => id != null);\n return {\n id: node.id ?? tile.id ?? tileUrl,\n url: tileUrl,\n node,\n inserts,\n };\n }));\n return tiles;\n }\n\n /** 统一 tile 内 INSERT 字段,后续 block 展开只依赖 transformMatrix,不使用 min/max 修正位置。 */\n private normalizeTileInserts(inserts: any[]): any[] {\n return inserts.map((insert: any) => ({\n ...insert,\n linkId: insert.linkId ?? insert.id,\n type: 'INSERT',\n color: insert.color ?? 0,\n visible: insert.visible ?? true,\n }));\n }\n\n /** 迭代收集 manifest 空间树中实际存在 tile 文件的节点,避免深树递归造成调用栈风险。 */\n private collectTileNodes(root?: SplitCadManifestNode): SplitCadManifestNode[] {\n if (!root) return [];\n const nodes: SplitCadManifestNode[] = [];\n const stack: SplitCadManifestNode[] = [root];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n if (current.tileUrl) nodes.push(current);\n const children = current.children ?? [];\n for (let index = children.length - 1; index >= 0; index -= 1) {\n stack.push(children[index]);\n }\n }\n return nodes;\n }\n\n /** 加载 .2d 压缩包,并按包内 manifest 引用路径读取拆分后的 CAD 数据。 */\n private async loadZipData(url: string): Promise<DWGData> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const zip = await JSZip.loadAsync(await response.arrayBuffer());\n const manifestPath = this.findZipManifestPath(zip);\n const manifest = await this.fetchZipJson(zip, manifestPath);\n if (!this.isSplitManifest(manifest)) {\n throw new Error('[LoaderModule2d] Expected split CAD manifest data in .2d package.');\n }\n\n const baseUrl = this.getZipBasePath(manifestPath);\n return this.loadSplitData(\n baseUrl,\n manifest,\n (sourceUrl) => this.fetchZipJson(zip, sourceUrl),\n (entity, sourceBaseUrl) => this.resolveZipImageUrl(zip, entity, sourceBaseUrl),\n );\n }\n\n /** .2d 是 zip 容器,manifest 可以在根目录或子目录中。 */\n private findZipManifestPath(zip: JSZip): string {\n const names = Object.keys(zip.files).filter((name) => !zip.files[name].dir);\n const rootManifest = names.find((name) => this.normalizeZipPath(name).toLowerCase() === 'manifest.json');\n const manifest = rootManifest ?? names.find((name) => this.normalizeZipPath(name).toLowerCase().endsWith('/manifest.json'));\n if (!manifest) {\n throw new Error('[LoaderModule2d] Missing manifest.json in .2d package.');\n }\n return this.normalizeZipPath(manifest);\n }\n\n /** 从 zip 中读取 JSON,路径规则与原 manifest 拆分目录保持一致。 */\n private async fetchZipJson(zip: JSZip, url: string): Promise<any> {\n if (/^(https?:)?\\/\\//i.test(url)) {\n return this.fetchJson(url);\n }\n\n const zipFile = this.getZipFile(zip, url);\n if (!zipFile) {\n throw new Error(`[LoaderModule2d] Missing file in .2d package: ${url}`);\n }\n return JSON.parse(await zipFile.async('string'));\n }\n\n /** IMAGE 实体改为使用 zip 中解出的 Blob URL,避免继续按外部目录请求图片。 */\n private async resolveZipImageUrl(zip: JSZip, entity: any, baseUrl: string): Promise<string> {\n const rawPath = entity.localPath || entity.sourcePath || entity.path || entity.url || '';\n if (/^(https?:)?\\/\\//i.test(rawPath) || String(rawPath).startsWith('blob:')) return rawPath;\n\n const normalized = this.normalizeZipPath(String(rawPath));\n const fileName = normalized.split('/').filter(Boolean).pop();\n const candidates = [\n this.joinUrl(baseUrl, normalized),\n fileName ? this.joinUrl(baseUrl, fileName) : '',\n normalized,\n fileName ?? '',\n ].filter(Boolean);\n\n const match = candidates.map((candidate) => this.getZipFile(zip, candidate)).find((file): file is JSZip.JSZipObject => !!file);\n if (!match) return '';\n\n const blobUrl = URL.createObjectURL(new Blob([await match.async('arraybuffer')]));\n this.zipObjectUrls.push(blobUrl);\n return blobUrl;\n }\n\n private isSplitManifest(data: any): data is SplitCadManifest {\n return !!data && typeof data === 'object' && (data.splitType === 'octree-2d' || !!data.blocksUrl);\n }\n\n private is2dZipUrl(url: string): boolean {\n return /\\.2d($|[?#])/i.test(url);\n }\n\n private isManifestUrl(url: string): boolean {\n return /manifest\\.json($|\\?)/i.test(url);\n }\n\n private getBaseUrl(url: string): string {\n const cleanUrl = url.split('?')[0];\n return cleanUrl.slice(0, cleanUrl.lastIndexOf('/') + 1);\n }\n\n private getZipBasePath(url: string): string {\n const cleanUrl = this.normalizeZipPath(url);\n const index = cleanUrl.lastIndexOf('/');\n return index >= 0 ? cleanUrl.slice(0, index + 1) : '';\n }\n\n private normalizeDirectoryUrl(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n }\n\n private joinUrl(baseUrl: string, relativeUrl: string): string {\n if (/^(https?:)?\\/\\//i.test(relativeUrl) || relativeUrl.startsWith('/')) return relativeUrl;\n return `${baseUrl}${relativeUrl}`.replace(/([^:]\\/)\\/+/g, '$1');\n }\n\n private normalizeZipPath(path: string): string {\n return String(path).split('?')[0].split('#')[0].replace(/\\\\/g, '/').replace(/^\\/+/, '');\n }\n\n private getZipFile(zip: JSZip, url: string): JSZip.JSZipObject | null {\n const normalized = this.normalizeZipPath(url);\n const exact = zip.file(normalized);\n if (exact) return exact;\n const lowerPath = normalized.toLowerCase();\n const matchedName = Object.keys(zip.files).find((name) => this.normalizeZipPath(name).toLowerCase() === lowerPath);\n return matchedName ? zip.file(matchedName) : null;\n }\n\n private clearZipObjectUrls(): void {\n this.zipObjectUrls.forEach((url) => URL.revokeObjectURL(url));\n this.zipObjectUrls = [];\n }\n}\n","import {\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * @module NURBSUtils\n * @three_import import * as NURBSUtils from 'three/addons/curves/NURBSUtils.js';\n */\n\n/**\n * Finds knot vector span.\n *\n * @param {number} p - The degree.\n * @param {number} u - The parametric value.\n * @param {Array<number>} U - The knot vector.\n * @return {number} The span.\n */\nfunction findSpan( p, u, U ) {\n\n\tconst n = U.length - p - 1;\n\n\tif ( u >= U[ n ] ) {\n\n\t\treturn n - 1;\n\n\t}\n\n\tif ( u <= U[ p ] ) {\n\n\t\treturn p;\n\n\t}\n\n\tlet low = p;\n\tlet high = n;\n\tlet mid = Math.floor( ( low + high ) / 2 );\n\n\twhile ( u < U[ mid ] || u >= U[ mid + 1 ] ) {\n\n\t\tif ( u < U[ mid ] ) {\n\n\t\t\thigh = mid;\n\n\t\t} else {\n\n\t\t\tlow = mid;\n\n\t\t}\n\n\t\tmid = Math.floor( ( low + high ) / 2 );\n\n\t}\n\n\treturn mid;\n\n}\n\n/**\n * Calculates basis functions. See The NURBS Book, page 70, algorithm A2.2.\n *\n * @param {number} span - The span in which `u` lies.\n * @param {number} u - The parametric value.\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @return {Array<number>} Array[p+1] with basis functions values.\n */\nfunction calcBasisFunctions( span, u, p, U ) {\n\n\tconst N = [];\n\tconst left = [];\n\tconst right = [];\n\tN[ 0 ] = 1.0;\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tconst temp = N[ r ] / ( rv + lv );\n\t\t\tN[ r ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tN[ j ] = saved;\n\n\t}\n\n\treturn N;\n\n}\n\n/**\n * Calculates B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n *\n * @param {number} p - The degree of the B-Spline.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points\n * @param {number} u - The parametric point.\n * @return {Vector4} The point for given `u`.\n */\nfunction calcBSplinePoint( p, U, P, u ) {\n\n\tconst span = findSpan( p, u, U );\n\tconst N = calcBasisFunctions( span, u, p, U );\n\tconst C = new Vector4( 0, 0, 0, 0 );\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tconst point = P[ span - p + j ];\n\t\tconst Nj = N[ j ];\n\t\tconst wNj = point.w * Nj;\n\t\tC.x += point.x * wNj;\n\t\tC.y += point.y * wNj;\n\t\tC.z += point.z * wNj;\n\t\tC.w += point.w * Nj;\n\n\t}\n\n\treturn C;\n\n}\n\n/**\n * Calculates basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n *\n * @param {number} span - The span in which `u` lies.\n * @param {number} u - The parametric point.\n * @param {number} p - The degree.\n * @param {number} n - number of derivatives to calculate\n * @param {Array<number>} U - The knot vector.\n * @return {Array<Array<number>>} An array[n+1][p+1] with basis functions derivatives.\n */\nfunction calcBasisFunctionDerivatives( span, u, p, n, U ) {\n\n\tconst zeroArr = [];\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tzeroArr[ i ] = 0.0;\n\n\tconst ders = [];\n\n\tfor ( let i = 0; i <= n; ++ i )\n\t\tders[ i ] = zeroArr.slice( 0 );\n\n\tconst ndu = [];\n\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tndu[ i ] = zeroArr.slice( 0 );\n\n\tndu[ 0 ][ 0 ] = 1.0;\n\n\tconst left = zeroArr.slice( 0 );\n\tconst right = zeroArr.slice( 0 );\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tndu[ j ][ r ] = rv + lv;\n\n\t\t\tconst temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];\n\t\t\tndu[ r ][ j ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tndu[ j ][ j ] = saved;\n\n\t}\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tders[ 0 ][ j ] = ndu[ j ][ p ];\n\n\t}\n\n\tfor ( let r = 0; r <= p; ++ r ) {\n\n\t\tlet s1 = 0;\n\t\tlet s2 = 1;\n\n\t\tconst a = [];\n\t\tfor ( let i = 0; i <= p; ++ i ) {\n\n\t\t\ta[ i ] = zeroArr.slice( 0 );\n\n\t\t}\n\n\t\ta[ 0 ][ 0 ] = 1.0;\n\n\t\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\t\tlet d = 0.0;\n\t\t\tconst rk = r - k;\n\t\t\tconst pk = p - k;\n\n\t\t\tif ( r >= k ) {\n\n\t\t\t\ta[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];\n\t\t\t\td = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];\n\n\t\t\t}\n\n\t\t\tconst j1 = ( rk >= - 1 ) ? 1 : - rk;\n\t\t\tconst j2 = ( r - 1 <= pk ) ? k - 1 : p - r;\n\n\t\t\tfor ( let j = j1; j <= j2; ++ j ) {\n\n\t\t\t\ta[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];\n\t\t\t\td += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];\n\n\t\t\t}\n\n\t\t\tif ( r <= pk ) {\n\n\t\t\t\ta[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];\n\t\t\t\td += a[ s2 ][ k ] * ndu[ r ][ pk ];\n\n\t\t\t}\n\n\t\t\tders[ k ][ r ] = d;\n\n\t\t\tconst j = s1;\n\t\t\ts1 = s2;\n\t\t\ts2 = j;\n\n\t\t}\n\n\t}\n\n\tlet r = p;\n\n\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\t\tders[ k ][ j ] *= r;\n\n\t\t}\n\n\t\tr *= p - k;\n\n\t}\n\n\treturn ders;\n\n}\n\n/**\n * Calculates derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n *\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points\n * @param {number} u - The parametric point.\n * @param {number} nd - The number of derivatives.\n * @return {Array<Vector4>} An array[d+1] with derivatives.\n */\nfunction calcBSplineDerivatives( p, U, P, u, nd ) {\n\n\tconst du = nd < p ? nd : p;\n\tconst CK = [];\n\tconst span = findSpan( p, u, U );\n\tconst nders = calcBasisFunctionDerivatives( span, u, p, du, U );\n\tconst Pw = [];\n\n\tfor ( let i = 0; i < P.length; ++ i ) {\n\n\t\tconst point = P[ i ].clone();\n\t\tconst w = point.w;\n\n\t\tpoint.x *= w;\n\t\tpoint.y *= w;\n\t\tpoint.z *= w;\n\n\t\tPw[ i ] = point;\n\n\t}\n\n\tfor ( let k = 0; k <= du; ++ k ) {\n\n\t\tconst point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );\n\n\t\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\t\tpoint.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = point;\n\n\t}\n\n\tfor ( let k = du + 1; k <= nd + 1; ++ k ) {\n\n\t\tCK[ k ] = new Vector4( 0, 0, 0 );\n\n\t}\n\n\treturn CK;\n\n}\n\n/**\n * Calculates \"K over I\".\n *\n * @param {number} k - The K value.\n * @param {number} i - The I value.\n * @return {number} k!/(i!(k-i)!)\n */\nfunction calcKoverI( k, i ) {\n\n\tlet nom = 1;\n\n\tfor ( let j = 2; j <= k; ++ j ) {\n\n\t\tnom *= j;\n\n\t}\n\n\tlet denom = 1;\n\n\tfor ( let j = 2; j <= i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\tfor ( let j = 2; j <= k - i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\treturn nom / denom;\n\n}\n\n/**\n * Calculates derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n *\n * @param {Array<Vector4>} Pders - Array with derivatives.\n * @return {Array<Vector3>} An array with derivatives for rational curve.\n */\nfunction calcRationalCurveDerivatives( Pders ) {\n\n\tconst nd = Pders.length;\n\tconst Aders = [];\n\tconst wders = [];\n\n\tfor ( let i = 0; i < nd; ++ i ) {\n\n\t\tconst point = Pders[ i ];\n\t\tAders[ i ] = new Vector3( point.x, point.y, point.z );\n\t\twders[ i ] = point.w;\n\n\t}\n\n\tconst CK = [];\n\n\tfor ( let k = 0; k < nd; ++ k ) {\n\n\t\tconst v = Aders[ k ].clone();\n\n\t\tfor ( let i = 1; i <= k; ++ i ) {\n\n\t\t\tv.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = v.divideScalar( wders[ 0 ] );\n\n\t}\n\n\treturn CK;\n\n}\n\n/**\n * Calculates NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n *\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points in homogeneous space.\n * @param {number} u - The parametric point.\n * @param {number} nd - The number of derivatives.\n * @return {Array<Vector3>} array with derivatives for rational curve.\n */\nfunction calcNURBSDerivatives( p, U, P, u, nd ) {\n\n\tconst Pders = calcBSplineDerivatives( p, U, P, u, nd );\n\treturn calcRationalCurveDerivatives( Pders );\n\n}\n\n/**\n * Calculates a rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n *\n * @param {number} p - The first degree of B-Spline surface.\n * @param {number} q - The second degree of B-Spline surface.\n * @param {Array<number>} U - The first knot vector.\n * @param {Array<number>} V - The second knot vector.\n * @param {Array<Array<Vector4>>} P - The control points in homogeneous space.\n * @param {number} u - The first parametric point.\n * @param {number} v - The second parametric point.\n * @param {Vector3} target - The target vector.\n */\nfunction calcSurfacePoint( p, q, U, V, P, u, v, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst temp = [];\n\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\ttemp[ l ] = new Vector4( 0, 0, 0, 0 );\n\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ].clone();\n\t\t\tconst w = point.w;\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\t\t\ttemp[ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\tSw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n/**\n * Calculates a rational B-Spline volume point. See The NURBS Book, page 134, algorithm A4.3.\n *\n * @param {number} p - The first degree of B-Spline surface.\n * @param {number} q - The second degree of B-Spline surface.\n * @param {number} r - The third degree of B-Spline surface.\n * @param {Array<number>} U - The first knot vector.\n * @param {Array<number>} V - The second knot vector.\n * @param {Array<number>} W - The third knot vector.\n * @param {Array<Array<Array<Vector4>>>} P - The control points in homogeneous space.\n * @param {number} u - The first parametric point.\n * @param {number} v - The second parametric point.\n * @param {number} w - The third parametric point.\n * @param {Vector3} target - The target vector.\n */\nfunction calcVolumePoint( p, q, r, U, V, W, P, u, v, w, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst wspan = findSpan( r, w, W );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst Nw = calcBasisFunctions( wspan, w, r, W );\n\tconst temp = [];\n\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\ttemp[ m ] = [];\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\ttemp[ m ][ l ] = new Vector4( 0, 0, 0, 0 );\n\t\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ][ wspan - r + m ].clone();\n\t\t\t\tconst w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[ m ][ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\tSw.add( temp[ m ][ l ].multiplyScalar( Nw[ m ] ).multiplyScalar( Nv[ l ] ) );\n\n\t\t}\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\nexport {\n\tfindSpan,\n\tcalcBasisFunctions,\n\tcalcBSplinePoint,\n\tcalcBasisFunctionDerivatives,\n\tcalcBSplineDerivatives,\n\tcalcKoverI,\n\tcalcRationalCurveDerivatives,\n\tcalcNURBSDerivatives,\n\tcalcSurfacePoint,\n\tcalcVolumePoint,\n};\n","import {\n\tCurve,\n\tVector3,\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * This class represents a NURBS curve.\n *\n * Implementation is based on `(x, y [, z=0 [, w=1]])` control points with `w=weight`.\n *\n * @augments Curve\n * @three_import import { NURBSCurve } from 'three/addons/curves/NURBSCurve.js';\n */\nclass NURBSCurve extends Curve {\n\n\t/**\n\t * Constructs a new NURBS curve.\n\t *\n\t * @param {number} degree - The NURBS degree.\n\t * @param {Array<number>} knots - The knots as a flat array of numbers.\n\t * @param {Array<Vector2|Vector3|Vector4>} controlPoints - An array holding control points.\n\t * @param {number} [startKnot] - Index of the start knot into the `knots` array.\n\t * @param {number} [endKnot] - Index of the end knot into the `knots` array.\n\t */\n\tconstructor( degree, knots, controlPoints, startKnot, endKnot ) {\n\n\t\tsuper();\n\n\t\tconst knotsLength = knots ? knots.length - 1 : 0;\n\t\tconst pointsLength = controlPoints ? controlPoints.length : 0;\n\n\t\t/**\n\t\t * The NURBS degree.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.degree = degree;\n\n\t\t/**\n\t\t * The knots as a flat array of numbers.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.knots = knots;\n\n\t\t/**\n\t\t * An array of control points.\n\t\t *\n\t\t * @type {Array<Vector4>}\n\t\t */\n\t\tthis.controlPoints = [];\n\n\t\t/**\n\t\t * Index of the start knot into the `knots` array.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.startKnot = startKnot || 0;\n\n\t\t/**\n\t\t * Index of the end knot into the `knots` array.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.endKnot = endKnot || knotsLength;\n\n\t\tfor ( let i = 0; i < pointsLength; ++ i ) {\n\n\t\t\t// ensure Vector4 for control points\n\t\t\tconst point = controlPoints[ i ];\n\t\t\tthis.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u\n\n\t\t// following results in (wx, wy, wz, w) homogeneous point\n\t\tconst hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );\n\n\t\tif ( hpoint.w !== 1.0 ) {\n\n\t\t\t// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\t\thpoint.divideScalar( hpoint.w );\n\n\t\t}\n\n\t\treturn point.set( hpoint.x, hpoint.y, hpoint.z );\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\tconst tangent = optionalTarget;\n\n\t\tconst u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );\n\t\tconst ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );\n\t\ttangent.copy( ders[ 1 ] ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.degree = this.degree;\n\t\tdata.knots = [ ...this.knots ];\n\t\tdata.controlPoints = this.controlPoints.map( p => p.toArray() );\n\t\tdata.startKnot = this.startKnot;\n\t\tdata.endKnot = this.endKnot;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.degree = json.degree;\n\t\tthis.knots = [ ...json.knots ];\n\t\tthis.controlPoints = json.controlPoints.map( p => new Vector4( p[ 0 ], p[ 1 ], p[ 2 ], p[ 3 ] ) );\n\t\tthis.startKnot = json.startKnot;\n\t\tthis.endKnot = json.endKnot;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { NURBSCurve };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\n/**\n * @module BufferGeometryUtils\n * @three_import import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';\n */\n\n/**\n * Computes vertex tangents using the MikkTSpace algorithm. MikkTSpace generates the same tangents consistently,\n * and is used in most modelling tools and normal map bakers. Use MikkTSpace for materials with normal maps,\n * because inconsistent tangents may lead to subtle visual issues in the normal map, particularly around mirrored\n * UV seams.\n *\n * In comparison to this method, {@link BufferGeometry#computeTangents} (a custom algorithm) generates tangents that\n * probably will not match the tangents in other software. The custom algorithm is sufficient for general use with a\n * custom material, and may be faster than MikkTSpace.\n *\n * Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.\n *\n * @param {BufferGeometry} geometry - The geometry to compute tangents for.\n * @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.\n * Await `MikkTSpace.ready` before use.\n * @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.\n * Required for normal map conventions in some formats, including glTF.\n * @return {BufferGeometry} The updated geometry.\n */\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Merges a set of geometries into a single instance. All geometries must have compatible attributes.\n *\n * @param {Array<BufferGeometry>} geometries - The geometries to merge.\n * @param {boolean} [useGroups=false] - Whether to use groups or not.\n * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.\n * Instances of {@link InterleavedBufferAttribute} are not supported.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to merge.\n * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Performs a deep clone of the given buffer attribute.\n *\n * @param {BufferAttribute} attribute - The attribute to clone.\n * @return {BufferAttribute} The cloned attribute.\n */\nfunction deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * Interleaves a set of attributes and returns a new array of corresponding attributes that share a\n * single {@link InterleavedBuffer} instance. All attributes must have compatible types.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to interleave.\n * @return {?Array<InterleavedBufferAttribute>} An array of interleaved attributes. If interleave does not succeed, the method returns `null`.\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n/**\n * Returns a new, non-interleaved version of the given attribute.\n *\n * @param {InterleavedBufferAttribute} attribute - The interleaved attribute.\n * @return {BufferAttribute} The non-interleaved attribute.\n */\nfunction deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n/**\n * Deinterleaves all attributes on the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to deinterleave.\n */\nfunction deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Returns the amount of bytes used by all attributes to represent the geometry.\n *\n * @param {BufferGeometry} geometry - The geometry.\n * @return {number} The estimate bytes used.\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * Returns a new geometry with vertices for which all similar vertex attributes (within tolerance) are merged.\n *\n * @param {BufferGeometry} geometry - The geometry to merge vertices for.\n * @param {number} [tolerance=1e-4] - The tolerance value.\n * @return {BufferGeometry} - The new geometry with merged vertices.\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * Returns a new indexed geometry based on `TrianglesDrawMode` draw mode.\n * This mode corresponds to the `gl.TRIANGLES` primitive in WebGL.\n *\n * @param {BufferGeometry} geometry - The geometry to convert.\n * @param {number} drawMode - The current draw mode.\n * @return {BufferGeometry} The new geometry using `TrianglesDrawMode`.\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n *\n * Helpful for Raytracing or Decals (i.e. a `DecalGeometry` applied to a morphed Object with a `BufferGeometry`\n * will use the original `BufferGeometry`, not the morphed/skinned one, generating an incorrect result.\n * Using this function to create a shadow `Object3`D the `DecalGeometry` can be correctly generated).\n *\n * @param {Mesh|Line|Points} object - The 3D object to compute morph attributes for.\n * @return {Object} An object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\n/**\n * Merges the {@link BufferGeometry#groups} for the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @param {number} [creaseAngle=Math.PI/3] - The crease angle in radians.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tdeepCloneAttribute,\n\tdeinterleaveAttribute,\n\tdeinterleaveGeometry,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import * as THREE from 'three';\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport { RenderItem2d } from './types';\nimport { getGeometryBounds, getPointsBounds } from './geometryUtils';\n\ntype Vec2Tuple = [number, number];\n\ninterface HatchLoop {\n type?: boolean;\n points?: Vec2Tuple[];\n}\n\ninterface HatchPatternLine {\n angle?: number;\n basePoint?: Vec2Tuple;\n offset?: Vec2Tuple;\n lineOffset?: number;\n shift?: number;\n dashLengths?: number[];\n}\n\ninterface HatchGradientStop {\n value?: number;\n color?: number;\n rgb?: number[];\n}\n\ninterface HatchGradient {\n enabled?: boolean;\n name?: string;\n angle?: number;\n shift?: number;\n singleColor?: boolean;\n colorTint?: number;\n colors?: HatchGradientStop[];\n}\n\ninterface HatchEntity {\n id?: any;\n linkId?: any;\n layer?: string;\n color?: number;\n rgb?: number[];\n solid?: boolean;\n patternType?: string;\n patternAngle?: number;\n gradient?: HatchGradient;\n loops?: HatchLoop[];\n patternLines?: HatchPatternLine[];\n}\n\ninterface HatchLoopSet {\n outers: Vec2Tuple[][];\n holes: Vec2Tuple[][];\n}\n\nconst EPSILON = 1e-8;\nconst HATCH_Z_OFFSET = 0.001;\nconst UNKNOWN_HATCH_FILL_COLOR = 0x808080;\n\n/** 填充图案渲染器,负责把 CAD HATCH 的边界、洞和 PAT 线族还原成渲染中间态。 */\nexport class HatchPatternRenderer {\n constructor(private readonly engine: any) {}\n\n /** 根据 HATCH 数据生成实心面或图案线;有 patternLines 时优先还原图案。 */\n public create(entity: HatchEntity, baseMatrix: THREE.Matrix4): RenderItem2d[] {\n const loopSet = this.getLoopSet(entity);\n if (loopSet.outers.length === 0) return [];\n\n if (this.isGradientFill(entity)) {\n return this.createGradientItems(entity, baseMatrix, loopSet);\n }\n\n const isSolidFill = this.isSolidFill(entity);\n if (isSolidFill) {\n return this.createSolidItems(entity, baseMatrix, loopSet);\n }\n\n const patternItem = this.createPatternLineItem(entity, baseMatrix, loopSet);\n if (patternItem) return [patternItem];\n\n // 无法还原 PAT 线族时用灰色实心面兜底,避免图案填充整块缺失。\n this.warnUnknownPatternFallback(entity);\n return this.createSolidItems(entity, baseMatrix, loopSet, UNKNOWN_HATCH_FILL_COLOR);\n }\n\n /** 只有明确的 SOLID 才作为实心面;patternType=SolidFill 在当前导出数据里不可靠。 */\n private isSolidFill(entity: HatchEntity): boolean {\n const patternName = String((entity as any).pattern ?? (entity as any).patternName ?? '').toUpperCase();\n return entity.solid === true || patternName === 'SOLID';\n }\n\n private warnUnknownPatternFallback(entity: HatchEntity): void {\n const patternName = (entity as any).pattern ?? (entity as any).patternName ?? 'UNKNOWN';\n if (this.engine.options?.debugHatch === true) {\n console.warn(`[LoaderModule2d] HATCH pattern \"${patternName}\" cannot be rendered, use gray solid fallback.`);\n }\n }\n\n /** 渐变填充要先于 SOLID 名称判断,否则 pattern=SOLID,_O 会被当作普通面。 */\n private isGradientFill(entity: HatchEntity): boolean {\n return entity.gradient?.enabled === true || String(entity.patternType ?? '').toUpperCase() === 'GRADIENTFILL';\n }\n\n /** 将循环按外轮廓和洞拆分;兼容只按顺序导出的数据。 */\n private getLoopSet(entity: HatchEntity): HatchLoopSet {\n const validLoops = (entity.loops ?? [])\n .map((loop) => this.normalizeLoop(loop.points))\n .filter((points): points is Vec2Tuple[] => points.length >= 3);\n if (validLoops.length === 0) return { outers: [], holes: [] };\n\n const typedLoops = (entity.loops ?? []).filter((loop) => this.normalizeLoop(loop.points).length >= 3);\n if (!typedLoops.some((loop) => loop.type === false)) {\n return this.classifyLoopsByContainment(validLoops);\n }\n\n const outers = typedLoops\n .filter((loop) => loop.type !== false)\n .map((loop) => this.normalizeLoop(loop.points));\n const holes = typedLoops\n .filter((loop) => loop.type === false)\n .map((loop) => this.normalizeLoop(loop.points));\n\n if (outers.length > 0) return { outers, holes };\n return { outers: [validLoops[0]], holes: validLoops.slice(1) };\n }\n\n /** 当导出数据没有显式洞标记时,按包含层级用奇偶规则区分外环和洞。 */\n private classifyLoopsByContainment(loops: Vec2Tuple[][]): HatchLoopSet {\n const sorted = [...loops].sort((a, b) => Math.abs(this.signedArea(b)) - Math.abs(this.signedArea(a)));\n const outers: Vec2Tuple[][] = [];\n const holes: Vec2Tuple[][] = [];\n\n sorted.forEach((loop, index) => {\n const sample = new THREE.Vector2(loop[0][0], loop[0][1]);\n const containingCount = sorted\n .slice(0, index)\n .filter((candidate) => this.pointInPolygon(sample, candidate))\n .length;\n if (containingCount % 2 === 0) outers.push(loop);\n else holes.push(loop);\n });\n\n return { outers, holes };\n }\n\n private signedArea(points: Vec2Tuple[]): number {\n let area = 0;\n for (let i = 0; i < points.length; i += 1) {\n const a = points[i];\n const b = points[(i + 1) % points.length];\n area += a[0] * b[1] - b[0] * a[1];\n }\n return area / 2;\n }\n\n /** 去掉重复闭合点和零长度边,降低裁剪时出现 NaN 或极短线段的概率。 */\n private normalizeLoop(points?: Vec2Tuple[]): Vec2Tuple[] {\n const result: Vec2Tuple[] = [];\n (points ?? []).forEach((point) => {\n if (!Array.isArray(point) || point.length < 2) return;\n const next: Vec2Tuple = [Number(point[0]), Number(point[1])];\n if (!Number.isFinite(next[0]) || !Number.isFinite(next[1])) return;\n const last = result[result.length - 1];\n if (!last || Math.hypot(next[0] - last[0], next[1] - last[1]) > EPSILON) result.push(next);\n });\n const first = result[0];\n const last = result[result.length - 1];\n if (first && last && Math.hypot(first[0] - last[0], first[1] - last[1]) <= EPSILON) result.pop();\n return result;\n }\n\n /** 通过 ShapeGeometry 构造实心填充面,洞循环会写入 shape.holes。 */\n private createSolidItems(\n entity: HatchEntity,\n baseMatrix: THREE.Matrix4,\n loopSet: HatchLoopSet,\n colorOverride?: number,\n ): RenderItem2d[] {\n const geometries: THREE.ShapeGeometry[] = [];\n loopSet.outers.forEach((outer) => {\n const shape = this.createShape(outer);\n loopSet.holes.filter((hole) => this.pointInPolygon(new THREE.Vector2(hole[0][0], hole[0][1]), outer)).forEach((hole) => {\n shape.holes.push(this.createPath(hole));\n });\n geometries.push(new THREE.ShapeGeometry(shape));\n });\n if (geometries.length === 0) return [];\n\n const geometry = geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, false);\n geometry.applyMatrix4(baseMatrix);\n const bounds = getGeometryBounds(geometry);\n return [{\n kind: 'hatch',\n layer: entity.layer ?? '0',\n color: colorOverride ?? this.resolveEntityColor(entity),\n linkId: entity.linkId ?? entity.id,\n geometry,\n min: bounds.min,\n max: bounds.max,\n info: entity,\n }];\n }\n\n private createShape(points: Vec2Tuple[]): THREE.Shape {\n const shape = new THREE.Shape();\n shape.moveTo(points[0][0], points[0][1]);\n for (let i = 1; i < points.length; i += 1) shape.lineTo(points[i][0], points[i][1]);\n shape.closePath();\n return shape;\n }\n\n private createPath(points: Vec2Tuple[]): THREE.Path {\n const path = new THREE.Path();\n path.moveTo(points[0][0], points[0][1]);\n for (let i = 1; i < points.length; i += 1) path.lineTo(points[i][0], points[i][1]);\n path.closePath();\n return path;\n }\n\n /** 按 CAD 渐变填充字段生成带顶点色的面,边界和洞仍复用 HATCH loop 裁剪。 */\n private createGradientItems(entity: HatchEntity, baseMatrix: THREE.Matrix4, loopSet: HatchLoopSet): RenderItem2d[] {\n const geometries: THREE.BufferGeometry[] = [];\n loopSet.outers.forEach((outer) => {\n const shape = this.createShape(outer);\n loopSet.holes.filter((hole) => this.pointInPolygon(new THREE.Vector2(hole[0][0], hole[0][1]), outer)).forEach((hole) => {\n shape.holes.push(this.createPath(hole));\n });\n\n const geometry = this.subdivideTriangles(new THREE.ShapeGeometry(shape), this.engine.options?.hatchGradientSubdivisions ?? 3);\n this.applyGradientVertexColors(geometry, outer, entity.gradient);\n geometries.push(geometry);\n });\n if (geometries.length === 0) return [];\n\n const geometry = geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, false);\n geometry.applyMatrix4(baseMatrix);\n const bounds = getGeometryBounds(geometry);\n return [{\n kind: 'hatch',\n layer: entity.layer ?? '0',\n color: this.resolveEntityColor(entity),\n linkId: entity.linkId ?? entity.id,\n geometry,\n useVertexColors: true,\n min: bounds.min,\n max: bounds.max,\n info: entity,\n }];\n }\n\n /** 渐变颜色直接写入顶点色;不同渐变名称用不同的归一化函数模拟 AutoCAD 的填充效果。 */\n private applyGradientVertexColors(geometry: THREE.BufferGeometry, outer: Vec2Tuple[], gradient?: HatchGradient): void {\n const position = geometry.getAttribute('position');\n const colors: number[] = [];\n const stops = this.resolveGradientStops(gradient);\n const bounds = this.getBounds(outer);\n const center = new THREE.Vector2((bounds.minX + bounds.maxX) / 2, (bounds.minY + bounds.maxY) / 2);\n const sizeX = Math.max(bounds.maxX - bounds.minX, EPSILON);\n const sizeY = Math.max(bounds.maxY - bounds.minY, EPSILON);\n const radius = Math.max(Math.hypot(sizeX / 2, sizeY / 2), EPSILON);\n const angle = Number(gradient?.angle ?? 0);\n const axis = new THREE.Vector2(Math.cos(angle), Math.sin(angle)).normalize();\n const normal = new THREE.Vector2(-axis.y, axis.x);\n\n for (let i = 0; i < position.count; i += 1) {\n const point = new THREE.Vector2(position.getX(i), position.getY(i));\n const factor = this.resolveGradientFactor(point, center, axis, normal, sizeX, sizeY, radius, gradient);\n const color = this.sampleGradientColor(stops, factor);\n colors.push(color.r, color.g, color.b);\n }\n geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\n }\n\n /** 顶点色渐变需要面内采样点;递归细分三角形后,矩形上的球形/圆柱渐变不会退化成纯色。 */\n private subdivideTriangles(source: THREE.BufferGeometry, depth: number): THREE.BufferGeometry {\n let geometry = source.index ? source.toNonIndexed() : source.clone();\n const safeDepth = Math.max(0, Math.min(Math.floor(Number(depth) || 0), 5));\n for (let level = 0; level < safeDepth; level += 1) {\n const position = geometry.getAttribute('position');\n const next: number[] = [];\n for (let i = 0; i < position.count; i += 3) {\n const a = new THREE.Vector3(position.getX(i), position.getY(i), position.getZ(i));\n const b = new THREE.Vector3(position.getX(i + 1), position.getY(i + 1), position.getZ(i + 1));\n const c = new THREE.Vector3(position.getX(i + 2), position.getY(i + 2), position.getZ(i + 2));\n const ab = a.clone().lerp(b, 0.5);\n const bc = b.clone().lerp(c, 0.5);\n const ca = c.clone().lerp(a, 0.5);\n this.pushTriangle(next, a, ab, ca);\n this.pushTriangle(next, ab, b, bc);\n this.pushTriangle(next, ca, bc, c);\n this.pushTriangle(next, ab, bc, ca);\n }\n geometry = new THREE.BufferGeometry().setAttribute('position', new THREE.Float32BufferAttribute(next, 3));\n }\n return geometry;\n }\n\n private pushTriangle(target: number[], a: THREE.Vector3, b: THREE.Vector3, c: THREE.Vector3): void {\n target.push(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z);\n }\n\n private resolveGradientFactor(\n point: THREE.Vector2,\n center: THREE.Vector2,\n axis: THREE.Vector2,\n normal: THREE.Vector2,\n sizeX: number,\n sizeY: number,\n radius: number,\n gradient?: HatchGradient,\n ): number {\n const relative = point.clone().sub(center);\n const name = String(gradient?.name ?? 'LINEAR').toUpperCase();\n const shift = Number(gradient?.shift ?? 0);\n const axisSpan = Math.max(Math.abs(axis.x) * sizeX + Math.abs(axis.y) * sizeY, EPSILON);\n const normalSpan = Math.max(Math.abs(normal.x) * sizeX + Math.abs(normal.y) * sizeY, EPSILON);\n let value = 0.5 + relative.dot(axis) / axisSpan + shift;\n\n if (name.includes('CYLINDER')) {\n value = Math.abs(relative.dot(normal)) / (normalSpan / 2);\n } else if (name.includes('SPHERICAL')) {\n value = relative.length() / radius;\n if (name.includes('HEMI')) value = Math.sqrt(value);\n } else if (name.includes('CURVED')) {\n value = Math.pow(Math.abs(relative.dot(axis)) / (axisSpan / 2), 0.65);\n }\n\n if (name.startsWith('INV')) value = 1 - value;\n return THREE.MathUtils.clamp(value, 0, 1);\n }\n\n private resolveGradientStops(gradient?: HatchGradient): Array<{ value: number; color: THREE.Color }> {\n const stops = (gradient?.colors ?? [])\n .map((stop) => ({ value: THREE.MathUtils.clamp(Number(stop.value ?? 0), 0, 1), color: this.resolveGradientStopColor(stop) }))\n .sort((a, b) => a.value - b.value);\n if (stops.length >= 2) return stops;\n if (stops.length === 1) {\n const tint = THREE.MathUtils.clamp(Number(gradient?.colorTint ?? 0), 0, 1);\n return [\n { value: 0, color: stops[0].color.clone().lerp(new THREE.Color(0xffffff), tint) },\n { value: 1, color: stops[0].color },\n ];\n }\n return [\n { value: 0, color: new THREE.Color(0xffffff) },\n { value: 1, color: new THREE.Color(0x000000) },\n ];\n }\n\n /** 渐变颜色兼容当前 rgb 数组格式和旧版数字色值格式。 */\n private resolveGradientStopColor(stop: HatchGradientStop): THREE.Color {\n if (Array.isArray(stop.rgb) && stop.rgb.length >= 3) {\n const [r, g, b] = stop.rgb.map((value) => THREE.MathUtils.clamp(Number(value ?? 0), 0, 255) / 255);\n return new THREE.Color(r, g, b);\n }\n return new THREE.Color(stop.color ?? 0xffffff);\n }\n\n /** HATCH 实体颜色优先读取当前数据的 rgb 数组;缺失时再兼容旧版 color 数字。 */\n private resolveEntityColor(entity: HatchEntity): number {\n if (Array.isArray(entity.rgb) && entity.rgb.length >= 3) {\n const [r, g, b] = entity.rgb.map((value) => Math.round(THREE.MathUtils.clamp(Number(value ?? 0), 0, 255)));\n return (r << 16) | (g << 8) | b;\n }\n return entity.color ?? 0xffffff;\n }\n\n private sampleGradientColor(stops: Array<{ value: number; color: THREE.Color }>, factor: number): THREE.Color {\n if (factor <= stops[0].value) return stops[0].color.clone();\n for (let i = 0; i < stops.length - 1; i += 1) {\n const current = stops[i];\n const next = stops[i + 1];\n if (factor <= next.value + EPSILON) {\n const span = Math.max(next.value - current.value, EPSILON);\n return current.color.clone().lerp(next.color, (factor - current.value) / span);\n }\n }\n return stops[stops.length - 1].color.clone();\n }\n\n /** 生成 PAT 图案线,先按外边界裁剪,再扣除所有洞边界。 */\n private createPatternLineItem(entity: HatchEntity, baseMatrix: THREE.Matrix4, loopSet: HatchLoopSet): RenderItem2d | null {\n const localPoints: THREE.Vector3[] = [];\n const maxSegments = this.engine.options?.hatchPatternMaxSegments ?? 20000;\n let segmentCount = 0;\n\n for (const outer of loopSet.outers) {\n const bounds = this.getBounds(outer);\n const diagonal = Math.hypot(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY);\n if (diagonal < EPSILON) continue;\n\n for (const patternLine of entity.patternLines ?? []) {\n if (segmentCount >= maxSegments) break;\n const familySegments = this.createPatternFamilySegments(entity, patternLine, outer, loopSet.holes, bounds, diagonal, maxSegments - segmentCount);\n familySegments.forEach(([start, end]) => {\n localPoints.push(\n new THREE.Vector3(start.x, start.y, HATCH_Z_OFFSET),\n new THREE.Vector3(end.x, end.y, HATCH_Z_OFFSET),\n );\n });\n segmentCount += familySegments.length;\n }\n }\n\n if (localPoints.length === 0) return null;\n localPoints.forEach((point) => point.applyMatrix4(baseMatrix));\n const bounds = getPointsBounds(localPoints);\n return {\n kind: 'line',\n layer: entity.layer ?? '0',\n color: this.resolveEntityColor(entity),\n linkId: entity.linkId ?? entity.id,\n points: localPoints,\n min: bounds.min,\n max: bounds.max,\n info: entity,\n };\n }\n\n /** 对一个 PAT 线族生成覆盖包围盒的候选长线,并拆成可见线段。 */\n private createPatternFamilySegments(\n entity: HatchEntity,\n patternLine: HatchPatternLine,\n outer: Vec2Tuple[],\n holes: Vec2Tuple[][],\n bounds: { minX: number; minY: number; maxX: number; maxY: number },\n diagonal: number,\n segmentBudget: number,\n ): Array<[THREE.Vector2, THREE.Vector2]> {\n const patternTransform = this.resolvePatternLineTransform(entity, patternLine);\n const dir = patternTransform.dir;\n const normal = new THREE.Vector2(-dir.y, dir.x);\n const base = patternTransform.base;\n const offset = patternTransform.offset;\n let normalStep = offset.dot(normal);\n if (Math.abs(normalStep) < EPSILON) {\n normalStep = Number(patternLine.lineOffset ?? 0);\n }\n if (Math.abs(normalStep) < EPSILON) return [];\n\n const corners = [\n new THREE.Vector2(bounds.minX, bounds.minY),\n new THREE.Vector2(bounds.maxX, bounds.minY),\n new THREE.Vector2(bounds.maxX, bounds.maxY),\n new THREE.Vector2(bounds.minX, bounds.maxY),\n ];\n const baseProjection = base.dot(normal);\n const projections = corners.map((corner) => corner.dot(normal) - baseProjection);\n const minProjection = Math.min(...projections) - diagonal;\n const maxProjection = Math.max(...projections) + diagonal;\n const i0 = Math.floor(Math.min(minProjection / normalStep, maxProjection / normalStep)) - 2;\n const i1 = Math.ceil(Math.max(minProjection / normalStep, maxProjection / normalStep)) + 2;\n const result: Array<[THREE.Vector2, THREE.Vector2]> = [];\n const boundsCenter = new THREE.Vector2((bounds.minX + bounds.maxX) / 2, (bounds.minY + bounds.maxY) / 2);\n\n for (let i = i0; i <= i1 && result.length < segmentBudget; i += 1) {\n const lineAnchor = base.clone().add(offset.clone().multiplyScalar(i));\n // PAT 的 basePoint 可能离图形很远;沿线方向平移不改变无限直线,只用于让有限候选线覆盖当前边界。\n const lineCenter = lineAnchor.clone().add(dir.clone().multiplyScalar(boundsCenter.clone().sub(lineAnchor).dot(dir)));\n const a = lineCenter.clone().add(dir.clone().multiplyScalar(-diagonal * 2));\n const b = lineCenter.clone().add(dir.clone().multiplyScalar(diagonal * 2));\n const clipped = this.clipLineByPolygon(a, b, outer);\n\n clipped.forEach(([start, end]) => {\n this.subtractHoles(start, end, holes).forEach(([visibleStart, visibleEnd]) => {\n this.appendDashedSegment(result, visibleStart, visibleEnd, patternLine.dashLengths, lineAnchor, dir);\n });\n });\n }\n return result.slice(0, segmentBudget);\n }\n\n /** 使用后端展开后的 PAT 线族定义;patternLines 已经包含最终角度和偏移。 */\n private resolvePatternLineTransform(entity: HatchEntity, patternLine: HatchPatternLine): { dir: THREE.Vector2; base: THREE.Vector2; offset: THREE.Vector2 } {\n const angle = Number(patternLine.angle ?? entity.patternAngle ?? 0);\n const dir = new THREE.Vector2(Math.cos(angle), Math.sin(angle)).normalize();\n\n return {\n dir,\n base: this.toVector2(patternLine.basePoint),\n offset: this.toVector2(patternLine.offset),\n };\n }\n\n private toVector2(point?: Vec2Tuple): THREE.Vector2 {\n return new THREE.Vector2(point?.[0] ?? 0, point?.[1] ?? 0);\n }\n\n private getBounds(points: Vec2Tuple[]): { minX: number; minY: number; maxX: number; maxY: number } {\n return {\n minX: Math.min(...points.map((point) => point[0])),\n minY: Math.min(...points.map((point) => point[1])),\n maxX: Math.max(...points.map((point) => point[0])),\n maxY: Math.max(...points.map((point) => point[1])),\n };\n }\n\n /** 线段与多边形裁剪采用“交点参数排序 + 中点内外判断”,适合 HATCH 边界。 */\n private clipLineByPolygon(a: THREE.Vector2, b: THREE.Vector2, polygon: Vec2Tuple[]): Array<[THREE.Vector2, THREE.Vector2]> {\n const tValues = [0, 1];\n for (let i = 0; i < polygon.length; i += 1) {\n const p0 = new THREE.Vector2(polygon[i][0], polygon[i][1]);\n const p1 = new THREE.Vector2(polygon[(i + 1) % polygon.length][0], polygon[(i + 1) % polygon.length][1]);\n const t = this.segmentIntersectionT(a, b, p0, p1);\n if (t !== null && t > EPSILON && t < 1 - EPSILON) tValues.push(t);\n }\n\n const unique = this.dedupeSorted(tValues.sort((x, y) => x - y), 1e-7);\n const result: Array<[THREE.Vector2, THREE.Vector2]> = [];\n for (let i = 0; i < unique.length - 1; i += 1) {\n const t0 = unique[i];\n const t1 = unique[i + 1];\n if (t1 - t0 < 1e-7) continue;\n const mid = this.interpolate2(a, b, (t0 + t1) / 2);\n if (this.pointInPolygon(mid, polygon)) result.push([this.interpolate2(a, b, t0), this.interpolate2(a, b, t1)]);\n }\n return result;\n }\n\n private subtractHoles(a: THREE.Vector2, b: THREE.Vector2, holes: Vec2Tuple[][]): Array<[THREE.Vector2, THREE.Vector2]> {\n let segments: Array<[THREE.Vector2, THREE.Vector2]> = [[a, b]];\n holes.forEach((hole) => {\n const next: Array<[THREE.Vector2, THREE.Vector2]> = [];\n segments.forEach(([start, end]) => {\n const holePieces = this.clipLineByPolygon(start, end, hole);\n next.push(...this.subtractSegments(start, end, holePieces));\n });\n segments = next;\n });\n return segments;\n }\n\n private appendDashedSegment(\n result: Array<[THREE.Vector2, THREE.Vector2]>,\n a: THREE.Vector2,\n b: THREE.Vector2,\n dashLengths?: number[],\n lineAnchor?: THREE.Vector2,\n lineDirection?: THREE.Vector2,\n ): void {\n const length = a.distanceTo(b);\n if (length < EPSILON) return;\n if (!dashLengths?.length) {\n result.push([a, b]);\n return;\n }\n\n const pattern = this.normalizeDashPattern(dashLengths);\n const period = pattern.reduce((sum, item) => sum + item.length, 0);\n if (period < EPSILON) {\n result.push([a, b]);\n return;\n }\n\n // PAT 虚线相位必须相对线族锚点计算;从裁剪边界重新起算会把 CROSS 误画成普通虚线网格。\n const dir = lineDirection?.clone().normalize() ?? b.clone().sub(a).normalize();\n const anchor = lineAnchor ?? a;\n const segmentDirection = b.clone().sub(a).normalize();\n const sign = segmentDirection.dot(dir) >= 0 ? 1 : -1;\n const startPhaseDistance = a.clone().sub(anchor).dot(dir) * sign;\n const startOffsetInPeriod = this.positiveModulo(startPhaseDistance, period);\n let cursor = 0;\n let patternIndex = this.findDashIndex(pattern, startOffsetInPeriod);\n let distanceInCurrentDash = startOffsetInPeriod - pattern[patternIndex].start;\n\n while (cursor < length - EPSILON) {\n const dash = pattern[patternIndex];\n const remainingDash = Math.max(dash.length - distanceInCurrentDash, EPSILON);\n const next = Math.min(length, cursor + remainingDash);\n if (dash.draw) {\n result.push([this.pointAtLength(a, b, cursor), this.pointAtLength(a, b, next)]);\n }\n cursor = next;\n patternIndex = (patternIndex + 1) % pattern.length;\n distanceInCurrentDash = 0;\n }\n }\n\n /** 将 PAT dash 数组转为带累计起点的周期表,0 长点线用很短的可见段表示。 */\n private normalizeDashPattern(dashLengths: number[]): Array<{ length: number; draw: boolean; start: number }> {\n let cursor = 0;\n return dashLengths.map((value) => {\n const rawDash = Number(value ?? 0);\n const item = {\n length: Math.max(Math.abs(rawDash), 0.0005),\n draw: rawDash >= 0,\n start: cursor,\n };\n cursor += item.length;\n return item;\n }).filter((item) => item.length > EPSILON);\n }\n\n private findDashIndex(pattern: Array<{ length: number; draw: boolean; start: number }>, offset: number): number {\n for (let index = pattern.length - 1; index >= 0; index -= 1) {\n if (offset >= pattern[index].start - EPSILON) return index;\n }\n return 0;\n }\n\n private positiveModulo(value: number, period: number): number {\n return ((value % period) + period) % period;\n }\n\n private subtractSegments(a: THREE.Vector2, b: THREE.Vector2, holes: Array<[THREE.Vector2, THREE.Vector2]>): Array<[THREE.Vector2, THREE.Vector2]> {\n const intervals = holes\n .map(([start, end]) => [this.projectT(a, b, start), this.projectT(a, b, end)] as [number, number])\n .map(([start, end]) => [Math.max(0, Math.min(start, end)), Math.min(1, Math.max(start, end))] as [number, number])\n .sort((x, y) => x[0] - y[0]);\n const result: Array<[THREE.Vector2, THREE.Vector2]> = [];\n let cursor = 0;\n\n intervals.forEach(([start, end]) => {\n if (start > cursor + EPSILON) result.push([this.interpolate2(a, b, cursor), this.interpolate2(a, b, start)]);\n cursor = Math.max(cursor, end);\n });\n if (cursor < 1 - EPSILON) result.push([this.interpolate2(a, b, cursor), this.interpolate2(a, b, 1)]);\n return result;\n }\n\n private segmentIntersectionT(a: THREE.Vector2, b: THREE.Vector2, c: THREE.Vector2, d: THREE.Vector2): number | null {\n const r = b.clone().sub(a);\n const s = d.clone().sub(c);\n const denominator = this.cross2(r, s);\n if (Math.abs(denominator) < 1e-10) return null;\n\n const cma = c.clone().sub(a);\n const t = this.cross2(cma, s) / denominator;\n const u = this.cross2(cma, r) / denominator;\n return t >= -1e-8 && t <= 1 + 1e-8 && u >= -1e-8 && u <= 1 + 1e-8 ? t : null;\n }\n\n private pointInPolygon(point: THREE.Vector2, polygon: Vec2Tuple[]): boolean {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i, i += 1) {\n const xi = polygon[i][0];\n const yi = polygon[i][1];\n const xj = polygon[j][0];\n const yj = polygon[j][1];\n const intersects = yi > point.y !== yj > point.y\n && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi + 1e-20) + xi;\n if (intersects) inside = !inside;\n }\n return inside;\n }\n\n private cross2(a: THREE.Vector2, b: THREE.Vector2): number {\n return a.x * b.y - a.y * b.x;\n }\n\n private interpolate2(a: THREE.Vector2, b: THREE.Vector2, t: number): THREE.Vector2 {\n return a.clone().lerp(b, t);\n }\n\n private projectT(a: THREE.Vector2, b: THREE.Vector2, point: THREE.Vector2): number {\n const ab = b.clone().sub(a);\n const denominator = ab.lengthSq();\n if (denominator < 1e-12) return 0;\n return point.clone().sub(a).dot(ab) / denominator;\n }\n\n private pointAtLength(a: THREE.Vector2, b: THREE.Vector2, distance: number): THREE.Vector2 {\n const length = a.distanceTo(b);\n return this.interpolate2(a, b, length < 1e-12 ? 0 : distance / length);\n }\n\n private dedupeSorted(values: number[], epsilon: number): number[] {\n const result: number[] = [];\n values.forEach((value) => {\n if (!result.length || Math.abs(value - result[result.length - 1]) > epsilon) result.push(value);\n });\n return result;\n }\n}\n","import * as THREE from 'three';\r\nimport { NURBSCurve } from 'three/examples/jsm/curves/NURBSCurve.js';\r\nimport { RenderItem2d } from './types';\r\nimport { getGeometryBounds, toVector3 } from './geometryUtils';\r\nimport { TextGeometryFactory } from './TextGeometryFactory';\r\nimport { HatchPatternRenderer } from './HatchPatternRenderer';\r\n\r\n/** 图元几何工厂,负责把 block 内实体转换为渲染中间态。 */\r\nexport class EntityGeometryFactory {\r\n private readonly hatchRenderer: HatchPatternRenderer;\r\n\r\n constructor(\r\n private readonly engine: any,\r\n private readonly textFactory: TextGeometryFactory,\r\n ) {\r\n this.hatchRenderer = new HatchPatternRenderer(engine);\r\n }\r\n\r\n /** 根据实体类型分发到线、文字、填充、图片等具体几何生成逻辑。 */\r\n public create(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n switch (entity.type) {\r\n case 'LINE_GROUP':\r\n case 'LINE':\r\n case 'CIRCLE':\r\n case 'POLYLINE':\r\n case 'SPLINE':\r\n return this.createLineItem(entity, baseMatrix);\r\n case 'MTEXT':\r\n case 'TEXT':\r\n return this.textFactory.create(entity, baseMatrix);\r\n case 'HATCH':\r\n return this.createHatch(entity, baseMatrix);\r\n case 'IMAGE':\r\n return this.createImage(entity, baseMatrix);\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n /** 线类实体统一输出为 LineSegments 所需的点对列表。 */\r\n private createLineItem(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n const points = this.getEntityPoints(entity).map((point) => point.clone().applyMatrix4(baseMatrix));\r\n if (points.length === 0) return [];\r\n return [{\r\n kind: 'line',\r\n layer: entity.layer,\r\n color: entity.color,\r\n lineType: entity.lineType,\r\n lineTypeScale: entity.lineTypeScale,\r\n lineTypePattern: Array.isArray(entity.lineTypePattern) ? entity.lineTypePattern : undefined,\r\n linkId: entity.linkId ?? entity.id,\r\n points,\r\n info: entity,\r\n }];\r\n }\r\n\r\n /** 将各种线类实体转换为未变换的本地坐标点对。 */\r\n private getEntityPoints(entity: any): THREE.Vector3[] {\r\n switch (entity.type) {\r\n case 'LINE_GROUP': \r\n return this.getLineGroupPoints(entity);\r\n case 'LINE': \r\n return [toVector3(entity.startPoint), toVector3(entity.endPoint)];\r\n case 'CIRCLE': \r\n return this.getCirclePoints(entity);\r\n case 'POLYLINE': \r\n return this.getPolylinePoints(entity);\r\n case 'SPLINE': \r\n return this.getSplinePoints(entity);\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n /** 新格式会把同层同色线段预合并成 LINE_GROUP,这里直接展开为点对。 */\r\n private getLineGroupPoints(entity: any): THREE.Vector3[] {\r\n const points: THREE.Vector3[] = [];\r\n (entity.segments ?? []).forEach((segment: number[]) => {\r\n points.push(new THREE.Vector3(segment[0] ?? 0, segment[1] ?? 0, segment[2] ?? 0));\r\n points.push(new THREE.Vector3(segment[3] ?? 0, segment[4] ?? 0, segment[5] ?? 0));\r\n });\r\n return points;\r\n }\r\n\r\n /** 将圆或圆弧离散成 LineSegments 点对。 */\r\n private getCirclePoints(entity: any): THREE.Vector3[] {\r\n const curve = new THREE.EllipseCurve(\r\n entity.center?.[0] ?? 0,\r\n entity.center?.[1] ?? 0,\r\n entity.radius ?? 0,\r\n entity.radius ?? 0,\r\n entity.startAngle ?? 0,\r\n (entity.endAngle ?? Math.PI * 2) - 0.00001,\r\n false,\r\n 0,\r\n );\r\n return this.pointsToSegments(curve.getPoints(this.engine.options?.circleSegments ?? 48).map((point) => new THREE.Vector3(point.x, point.y, entity.center?.[2] ?? 0)));\r\n }\r\n\r\n /** 多段线逐段展开,支持每段起点上的 bulge 圆弧参数。 */\r\n private getPolylinePoints(entity: any): THREE.Vector3[] {\r\n const points: THREE.Vector3[] = [];\r\n const rawPoints = entity.points ?? [];\r\n for (let i = 0; i < rawPoints.length - 1; i += 1) {\r\n this.getPolylineSegmentPoints(rawPoints[i], rawPoints[i + 1]).forEach((point) => {\r\n points.push(point);\r\n });\r\n }\r\n if (entity.closed && rawPoints.length > 1) {\r\n this.getPolylineSegmentPoints(rawPoints[rawPoints.length - 1], rawPoints[0]).forEach((point) => {\r\n points.push(point);\r\n });\r\n }\r\n return points;\r\n }\r\n\r\n /** 根据 bulge = tan(圆心角 / 4) 将单段多段线转换为直线或圆弧采样点对。 */\r\n private getPolylineSegmentPoints(startPoint: any, endPoint: any): THREE.Vector3[] {\r\n const start = toVector3(startPoint);\r\n const end = toVector3(endPoint);\r\n const bulge = Number(startPoint?.bulge ?? 0);\r\n if (!Number.isFinite(bulge) || Math.abs(bulge) < 1e-10) return [start, end];\r\n\r\n const chord = end.clone().sub(start);\r\n const chordLength = chord.length();\r\n if (chordLength < 1e-12) return [start, end];\r\n\r\n // bulge 的符号决定圆弧位于弦线左侧还是右侧。\r\n const includedAngle = 4 * Math.atan(bulge);\r\n const radius = chordLength * (1 + bulge * bulge) / (4 * Math.abs(bulge));\r\n const mid = start.clone().add(end).multiplyScalar(0.5);\r\n const normal = new THREE.Vector3(-chord.y / chordLength, chord.x / chordLength, 0);\r\n const center = mid.clone().add(normal.multiplyScalar(chordLength * (1 - bulge * bulge) / (4 * bulge)));\r\n const startAngle = Math.atan2(start.y - center.y, start.x - center.x);\r\n const segmentCount = Math.max(4, Math.ceil(Math.abs(includedAngle) / (this.engine.options?.polylineArcAngleStep ?? (Math.PI / 18))));\r\n const arcPoints: THREE.Vector3[] = [];\r\n for (let i = 0; i <= segmentCount; i += 1) {\r\n const t = i / segmentCount;\r\n const angle = startAngle + includedAngle * t;\r\n arcPoints.push(new THREE.Vector3(center.x + Math.cos(angle) * radius, center.y + Math.sin(angle) * radius, start.z + (end.z - start.z) * t));\r\n }\r\n return this.pointsToSegments(arcPoints);\r\n }\r\n\r\n /** 样条线使用控制点生成平滑曲线,不强制穿过每一个控制点。 */\r\n private getSplinePoints(entity: any): THREE.Vector3[] {\r\n const controlPoints = (entity.points ?? []).map((point: any) => toVector3(point));\r\n if (controlPoints.length < 2) return [];\r\n const sampled = controlPoints.length === 2 ? controlPoints : this.sampleSplineCurve(controlPoints, entity);\r\n return this.pointsToSegments(sampled);\r\n }\r\n\r\n /** 用 clamped B-spline/NURBS 采样样条;有 knots/weights 时优先使用源数据。 */\r\n private sampleSplineCurve(controlPoints: THREE.Vector3[], spline: any): THREE.Vector3[] {\r\n \r\n const degree = Math.min(Math.max(Number(spline.degree ?? this.engine.options?.splineDegree ?? 6), 1), controlPoints.length - 1);\r\n const knots = Array.isArray(spline.knots) && spline.knots.length === controlPoints.length + degree + 1\r\n ? spline.knots\r\n : this.createClampedUniformKnots(controlPoints.length, degree);\r\n const points = controlPoints.map((point, index) => {\r\n const weight = Array.isArray(spline.weights) ? Number(spline.weights[index] ?? 1) : 1;\r\n return new THREE.Vector4(point.x, point.y, point.z, Number.isFinite(weight) ? weight : 1);\r\n });\r\n // 样条线固定使用较稀疏的采样,避免大图纸中曲线细分过密导致点数和内存快速膨胀。\r\n // const spanCount = Math.max(controlPoints.length - 1, 1);\r\n // const segments = Math.round(THREE.MathUtils.clamp(spanCount * 8, 8, 8));\r\n\r\n // 这个地方,会导致崩溃\r\n let segments = (controlPoints.length - 1) * 2;\r\n\r\n // if(segments>100){\r\n // segments = 100\r\n // }\r\n\r\n\r\n const sampled = new NURBSCurve(degree, knots, points).getPoints(segments);\r\n if (spline.closed === true && sampled.length > 1) sampled.push(sampled[0].clone());\r\n return sampled;\r\n }\r\n\r\n /** 在缺少 knots 的数据里生成首尾夹紧的均匀节点向量。 */\r\n private createClampedUniformKnots(controlPointCount: number, degree: number): number[] {\r\n const knots: number[] = [];\r\n for (let i = 0; i < controlPointCount + degree + 1; i += 1) {\r\n if (i <= degree) knots.push(0);\r\n else if (i >= controlPointCount) knots.push(1);\r\n else knots.push((i - degree) / (controlPointCount - degree));\r\n }\r\n return knots;\r\n }\r\n\r\n /** 将连续采样点转换为 LineSegments 需要的 [p0,p1,p1,p2...] 点对。 */\r\n private pointsToSegments(points: THREE.Vector3[]): THREE.Vector3[] {\r\n const segments: THREE.Vector3[] = [];\r\n for (let i = 0; i < points.length - 1; i += 1) {\r\n segments.push(points[i].clone(), points[i + 1].clone());\r\n }\r\n return segments;\r\n }\r\n\r\n /** HATCH 交给独立渲染器处理,兼容实心填充和 PAT 图案线。 */\r\n private createHatch(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n return this.hatchRenderer.create(entity, baseMatrix);\r\n }\r\n\r\n /** 将 IMAGE 实体转为带 UV 的四边形,纹理由 SceneBatchBuilder 延迟加载。 */\r\n private createImage(entity: any, baseMatrix: THREE.Matrix4): RenderItem2d[] {\r\n const imageUrl = entity.imageUrl || entity.url;\r\n if (!imageUrl) return [];\r\n\r\n const origin = toVector3(entity.position);\r\n const uVector = toVector3(entity.uVector);\r\n const vVector = toVector3(entity.vVector);\r\n const uScale = Number(entity.pixelWidth ?? entity.width ?? 1);\r\n const vScale = Number(entity.pixelHeight ?? entity.height ?? 1);\r\n if (!Number.isFinite(uScale) || !Number.isFinite(vScale) || uScale === 0 || vScale === 0) return [];\r\n\r\n // CAD 导出的 u/vVector 表示单个像素的世界方向,乘以像素尺寸得到图片四角。\r\n const right = uVector.multiplyScalar(uScale);\r\n const up = vVector.multiplyScalar(vScale);\r\n const p0 = origin.clone();\r\n const p1 = origin.clone().add(right);\r\n const p2 = origin.clone().add(right).add(up);\r\n const p3 = origin.clone().add(up);\r\n [p0, p1, p2, p3].forEach((point) => point.applyMatrix4(baseMatrix));\r\n\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute([\r\n p0.x, p0.y, p0.z,\r\n p1.x, p1.y, p1.z,\r\n p2.x, p2.y, p2.z,\r\n p0.x, p0.y, p0.z,\r\n p2.x, p2.y, p2.z,\r\n p3.x, p3.y, p3.z,\r\n ], 3));\r\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute([\r\n 0, 0,\r\n 1, 0,\r\n 1, 1,\r\n 0, 0,\r\n 1, 1,\r\n 0, 1,\r\n ], 2));\r\n geometry.computeVertexNormals();\r\n\r\n const bounds = getGeometryBounds(geometry);\r\n const fade = Number(entity.fade ?? 0);\r\n return [{\r\n kind: 'image',\r\n layer: entity.layer ?? '0',\r\n color: entity.color ?? 0xffffff,\r\n linkId: entity.linkId ?? entity.id,\r\n geometry,\r\n imageUrl,\r\n opacity: Number.isFinite(fade) ? THREE.MathUtils.clamp(1 - fade / 100, 0, 1) : 1,\r\n min: bounds.min,\r\n max: bounds.max,\r\n info: entity,\r\n }];\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\nimport { LoaderModel2d, RenderItem2d } from './types';\r\nimport { getPointsBounds } from './geometryUtils';\r\n\r\n/** 将 RenderItem 按图层和颜色合批成 Three 对象,并维护选择索引。 */\r\nexport class SceneBatchBuilder {\r\n private readonly modelMap = new Map<string, Map<any, THREE.Vector3[]>>();\r\n private readonly hatchMap = new Map<string, RenderItem2d[]>();\r\n private readonly textMap = new Map<string, RenderItem2d[]>();\r\n private readonly imageMap = new Map<string, RenderItem2d[]>();\r\n private readonly textureLoader = new THREE.TextureLoader();\r\n\r\n constructor(\r\n _engine: any,\r\n private readonly model: LoaderModel2d,\r\n private readonly targetGroup: THREE.Group = _engine.modelGroup,\r\n ) {}\r\n\r\n /** 将展开后的渲染项放入当前 tile 的 line/text/hatch/image 合批容器。 */\r\n public addRenderItems(items: RenderItem2d[]): void {\r\n items.forEach((item) => this.addRenderItem(item));\r\n }\r\n\r\n /** 按类别创建最终 Three.js 对象,并加入当前 octree group。 */\r\n public buildSceneObjects(): void {\r\n this.buildImageObjects();\r\n this.buildHatchObjects();\r\n this.buildLineObjects();\r\n this.buildTextObjects();\r\n }\r\n\r\n /** 按 kind 分流,合批 key 使用 layer||color;图片额外按 URL 分组以复用纹理。 */\n public addRenderItem(item: RenderItem2d): void {\n const layerName = `${item.layer}||${item.color}`;\r\n if (item.kind === 'line') {\r\n let modelMap = this.modelMap.get(layerName);\r\n if (!modelMap) {\r\n modelMap = new Map<any, THREE.Vector3[]>();\r\n this.modelMap.set(layerName, modelMap);\r\n }\r\n const points = this.resolveLinePoints(item);\r\n const nodePoints = modelMap.get(item.linkId);\r\n if (nodePoints) points.forEach((point) => nodePoints.push(point));\r\n else modelMap.set(item.linkId, [...points]);\r\n return;\r\n }\r\n\r\n const map = this.getItemMap(item);\r\n const key = item.kind === 'image' ? `${layerName}||${item.imageUrl ?? ''}` : layerName;\r\n const list = map.get(key);\r\n if (list) list.push(item);\r\n else map.set(key, [item]);\r\n }\r\n\r\n private getItemMap(item: RenderItem2d): Map<string, RenderItem2d[]> {\r\n if (item.kind === 'text') return this.textMap;\r\n if (item.kind === 'image') return this.imageMap;\r\n return this.hatchMap;\r\n }\r\n\r\n /** 根据实体或图层线型把原始线段切成可见段,线宽仍沿用当前 LineBasicMaterial。 */\r\n private resolveLinePoints(item: RenderItem2d): THREE.Vector3[] {\r\n const points = item.points ?? [];\r\n const pattern = this.resolveLineTypePattern(item);\r\n if (!pattern) return points;\r\n\r\n const dashedPoints: THREE.Vector3[] = [];\r\n for (let index = 0; index < points.length - 1; index += 2) {\r\n this.applyDashPattern(points[index], points[index + 1], pattern).forEach((point) => dashedPoints.push(point));\r\n }\r\n return dashedPoints;\r\n }\r\n\r\n /** 正数表示画线、负数表示留白;ByLayer 会使用当前图层定义,Continuous 保持实线。 */\r\n private resolveLineTypePattern(item: RenderItem2d): number[] | null {\r\n const layer = this.model.layers.find((layerItem: any) => layerItem.name === item.layer);\r\n const itemLineType = String(item.lineType ?? '').toLowerCase();\r\n const lineType = itemLineType === 'bylayer' || itemLineType === ''\r\n ? String(layer?.lineType ?? '').toLowerCase()\r\n : itemLineType;\r\n if (!lineType || lineType === 'continuous' || lineType === 'byblock') return null;\r\n\r\n const rawPattern: number[] | null = Array.isArray(item.lineTypePattern) && item.lineTypePattern.length > 0\r\n ? item.lineTypePattern\r\n : (Array.isArray(layer?.lineTypePattern) ? layer.lineTypePattern : this.getFallbackLineTypePattern(lineType));\r\n if (!rawPattern || rawPattern.length === 0) return null;\r\n\r\n const scale = this.resolveLineTypeScale(item, layer);\r\n const pattern = rawPattern\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value))\r\n .map((value) => value * scale);\r\n return pattern.some((value) => Math.abs(value) > 1e-12) ? pattern : null;\r\n }\r\n\r\n /** 兼容原始数据未带 pattern、但 lineType 已标识为 DASH/DASHED 的情况。 */\r\n private getFallbackLineTypePattern(lineType: string): number[] | null {\r\n if (lineType.includes('dash')) return [0.25, -0.1];\r\n if (lineType.includes('dot')) return [0, -0.1];\r\n return null;\r\n }\r\n\r\n private resolveLineTypeScale(item: RenderItem2d, layer: any): number {\r\n const rawScale = Number(item.lineTypeScale ?? layer?.lineTypeScale ?? 1);\r\n if (!Number.isFinite(rawScale) || Math.abs(rawScale) < 1e-12) return 1;\r\n return Math.abs(rawScale);\r\n }\r\n\r\n /** 将单条线段按线型 pattern 裁成多段可见线,pattern 每条源线段独立起算。 */\r\n private applyDashPattern(start: THREE.Vector3, end: THREE.Vector3, pattern: number[]): THREE.Vector3[] {\r\n const direction = end.clone().sub(start);\r\n const length = direction.length();\r\n if (length < 1e-12) return [];\r\n\r\n const unit = direction.multiplyScalar(1 / length);\r\n const totalPatternLength = pattern.reduce((sum, value) => sum + Math.abs(value), 0);\r\n const dotLength = Math.max(totalPatternLength * 0.05, length * 0.002, 1e-6);\r\n const result: THREE.Vector3[] = [];\r\n let cursor = 0;\r\n let patternIndex = 0;\r\n\r\n while (cursor < length - 1e-12) {\r\n const sourceLength = pattern[patternIndex % pattern.length];\r\n const isDraw = sourceLength >= 0;\r\n const dashLength = Math.max(Math.abs(sourceLength), dotLength);\r\n const nextCursor = Math.min(cursor + dashLength, length);\r\n\r\n if (isDraw && nextCursor > cursor) {\r\n result.push(\r\n start.clone().add(unit.clone().multiplyScalar(cursor)),\r\n start.clone().add(unit.clone().multiplyScalar(nextCursor)),\r\n );\r\n }\r\n\r\n cursor = nextCursor;\r\n patternIndex += 1;\r\n if (patternIndex > 100000) break;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /** 合并所有线段为 LineSegments,并记录每个 linkId 对应的顶点范围。 */\r\n private buildLineObjects(): void {\r\n this.modelMap.forEach((item, key) => {\r\n const [layerName] = key.split('||');\r\n const points: THREE.Vector3[] = [];\r\n item.forEach((nodePoints) => {\r\n nodePoints.forEach((point) => points.push(point));\r\n });\r\n if (points.length === 0) return;\r\n\r\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n const material = new THREE.LineBasicMaterial({ color: this.resolveColor(key) });\n const lines: any = new THREE.LineSegments(geometry, material);\n lines.name = key;\n // 线段隐藏/恢复需要原始坐标;使用 TypedArray 副本,避免 JS number 数组带来的额外内存膨胀。\n const position = geometry.getAttribute('position');\n lines.clonePoints = position.array.slice();\n lines.materialClone = material.clone();\n\r\n this.targetGroup.add(lines);\r\n const objectIndex = this.targetGroup.children.length - 1;\r\n let index = 0;\r\n item.forEach((nodePoints, linkId) => {\r\n const bounds = getPointsBounds(nodePoints);\r\n this.pushNodeMap(linkId, {\r\n indexes: [objectIndex, index, index + nodePoints.length * 3],\r\n object: lines,\r\n group: this.targetGroup,\r\n kind: 'line',\r\n layer: layerName,\r\n min: bounds.min,\r\n max: bounds.max,\r\n });\r\n index += nodePoints.length * 3;\r\n });\r\n });\r\n }\r\n\r\n /** 合并文字几何和 hitbox;hitbox 材质不可见但仍保留选择索引。 */\r\n private buildTextObjects(): void {\r\n this.textMap.forEach((items, key) => {\r\n const renderItems = items.filter((item) => !!item.geometry);\n const geometries = this.normalizeMeshGeometries(renderItems, false, false);\n if (geometries.length === 0) return;\n const geometry = this.mergeMeshGeometries(geometries);\n const material = new THREE.MeshBasicMaterial({ color: this.resolveColor(key), side: THREE.DoubleSide });\n if (key.includes('_hitbox')) material.visible = false;\n this.addMeshObject(renderItems, key, geometry, geometries, material);\n });\r\n }\r\n\r\n /** 合并填充面,默认使用半透明材质以接近原有显示效果。 */\r\n private buildHatchObjects(): void {\r\n this.hatchMap.forEach((items, key) => {\r\n const renderItems = items.filter((item) => !!item.geometry);\r\n const useVertexColors = renderItems.some((item) => item.useVertexColors === true);\n const geometries = this.normalizeMeshGeometries(renderItems, false, useVertexColors);\n if (geometries.length === 0) return;\n const geometry = this.mergeMeshGeometries(geometries);\n const material = new THREE.MeshBasicMaterial({\n color: useVertexColors ? 0xffffff : this.resolveColor(key),\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: useVertexColors ? 1 : 0.5,\r\n vertexColors: useVertexColors,\r\n });\r\n this.addMeshObject(renderItems, key, geometry, geometries, material);\r\n });\r\n }\r\n\r\n /** 图片按 URL 合并为纹理网格,透明 PNG 直接由材质 alpha 处理。 */\r\n private buildImageObjects(): void {\r\n this.imageMap.forEach((items, key) => {\r\n const renderItems = items.filter((item) => !!item.geometry);\r\n const geometries = this.normalizeMeshGeometries(renderItems, true, false);\r\n if (geometries.length === 0) return;\r\n const imageUrl = renderItems[0]?.imageUrl;\r\n if (!imageUrl) return;\n\n const geometry = this.mergeMeshGeometries(geometries);\n const texture = this.textureLoader.load(imageUrl);\n texture.colorSpace = THREE.SRGBColorSpace;\r\n texture.needsUpdate = true;\r\n const opacity = renderItems.reduce((value, item) => Math.min(value, item.opacity ?? 1), 1);\r\n const material = new THREE.MeshBasicMaterial({\r\n map: texture,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity,\r\n depthWrite: false,\r\n });\r\n this.addMeshObject(renderItems, key, geometry, geometries, material);\n });\n }\n\n /** 合并后保留每个子几何的 group 范围,后续高亮/拾取可按范围临时提取,不再常驻 geometrys 副本。 */\n private mergeMeshGeometries(geometries: THREE.BufferGeometry[]): THREE.BufferGeometry {\n const geometry = geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, true);\n if (geometry.groups.length === 0) {\n const position = geometry.getAttribute('position');\n geometry.addGroup(0, position?.count ?? 0, 0);\n }\n geometry.groups.forEach((group) => {\n group.materialIndex = 0;\n });\n return geometry;\n }\n\r\n /** 统一合批几何属性,避免裁剪后 normal/index/uv 差异导致 mergeGeometries 失败。 */\r\n private normalizeMeshGeometries(items: RenderItem2d[], keepUv: boolean, keepColor: boolean): THREE.BufferGeometry[] {\r\n return items.map((item) => {\r\n const source = item.geometry!;\r\n const geometry = source.index ? source.toNonIndexed() : source.clone();\r\n const position = geometry.getAttribute('position');\r\n const uv = geometry.getAttribute('uv');\r\n const color = geometry.getAttribute('color');\r\n const normalized = new THREE.BufferGeometry();\r\n normalized.setAttribute('position', position.clone());\r\n if (keepUv) {\r\n normalized.setAttribute('uv', uv ? uv.clone() : this.createEmptyUv(position.count));\r\n }\r\n if (keepColor) {\r\n normalized.setAttribute('color', color ? color.clone() : this.createSolidColorAttribute(position.count, item.color));\r\n }\r\n return normalized;\r\n });\r\n }\r\n\r\n /** 图片几何必须带 UV;缺失时补零,保证纹理合批属性一致。 */\r\n private createEmptyUv(vertexCount: number): THREE.BufferAttribute {\r\n return new THREE.Float32BufferAttribute(new Array(vertexCount * 2).fill(0), 2);\r\n }\r\n\r\n /** 渐变填充与普通填充合批时,普通填充需要补齐统一颜色的顶点色。 */\r\n private createSolidColorAttribute(vertexCount: number, colorValue: number): THREE.BufferAttribute {\r\n const color = new THREE.Color(colorValue ?? 0xffffff);\r\n const values: number[] = [];\r\n for (let i = 0; i < vertexCount; i += 1) {\r\n values.push(color.r, color.g, color.b);\r\n }\r\n return new THREE.Float32BufferAttribute(values, 3);\r\n }\r\n\r\n /** 建立 Mesh 并把每个子几何写入 nodeMap,供选择、高亮、隐藏使用。 */\r\n private addMeshObject(\r\n items: RenderItem2d[],\r\n key: string,\r\n geometry: THREE.BufferGeometry,\r\n geometries: THREE.BufferGeometry[],\r\n material: THREE.MeshBasicMaterial,\r\n ): void {\r\n const mesh: any = new THREE.Mesh(geometry, material);\r\n mesh.name = key;\n mesh.materialClone = material.clone();\n mesh.isSplit = false;\n mesh.geometrys = undefined;\n geometries.forEach((item) => {\n if (item !== geometry) item.dispose();\n });\n\n this.targetGroup.add(mesh);\n const objectIndex = this.targetGroup.children.length - 1;\r\n items.forEach((item, index) => {\r\n const linkId = item.linkId ?? item.info?.id;\r\n this.pushNodeMap(linkId, {\r\n indexes: [objectIndex, index],\r\n object: mesh,\r\n group: this.targetGroup,\r\n kind: item.kind,\r\n layer: item.layer,\r\n info: item.info,\r\n min: item.min ?? new THREE.Vector3(),\r\n max: item.max ?? new THREE.Vector3(),\r\n });\r\n this.pushTextSearchItem(item, key);\r\n });\r\n }\r\n\r\n /** 文字搜索只收录真实文字几何,hitbox 仅用于选择,不进入搜索结果。 */\r\n private pushTextSearchItem(item: RenderItem2d, key: string): void {\r\n if (item.kind !== 'text' || key.includes('_hitbox')) return;\r\n const rawText = item.info?.text;\r\n const text = String(rawText ?? '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').trim();\r\n const id = item.linkId ?? item.info?.id;\r\n if (!text || id == null) return;\r\n\r\n this.model.textItems.push({\r\n id: String(id),\r\n text,\r\n layer: item.layer,\r\n min: item.min,\r\n max: item.max,\r\n anchor: item.textAnchor,\r\n info: item.info,\r\n });\r\n }\r\n\r\n /** color=0 或非法颜色时回退到图层颜色。 */\r\n private resolveColor(key: string): number {\r\n const [layerName, colorText] = key.split('||');\r\n let color = Number.parseInt(colorText);\r\n if (color === 0 || Number.isNaN(color)) {\r\n const layer = this.model.layers.find((item: any) => item.name === layerName);\r\n color = layer?.color ?? 0xffffff;\r\n }\r\n return color;\r\n }\r\n\r\n /** 维护 linkId -> 场景对象索引,供选择、高亮和属性查询使用。 */\r\n private pushNodeMap(linkId: any, value: any): void {\r\n if (linkId == null) return;\r\n const key = String(linkId);\r\n const list = this.model.nodeMap.get(key);\r\n if (list) list.push(value);\r\n else this.model.nodeMap.set(key, [value]);\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\nimport { Font } from 'three/examples/jsm/loaders/FontLoader.js';\r\nimport { RenderItem2d } from './types';\r\nimport { composeMatrix, getGeometryBounds } from './geometryUtils';\r\n\r\n/** 文字几何工厂,集中处理 MTEXT/TEXT 的换行、缺字过滤、hitbox 和锚点。 */\r\nexport class TextGeometryFactory {\r\n constructor(\r\n private readonly engine: any,\r\n private readonly font: Font,\r\n ) {}\r\n\r\n /** 将单个文字实体转换为可合批的文字 mesh 和不可见选择 hitbox。 */\r\n public create(entity: any, baseMatrix: THREE.Matrix4 = new THREE.Matrix4()): RenderItem2d[] {\r\n if (!entity.text) return [];\r\n const text = this.normalizeText(entity.text);\r\n if (!text.trim()) return [];\r\n\r\n const curveSegments = this.engine.options?.textCurveSegments ?? 1;\r\n const geometry = this.createTextGeometry(text, entity.height ?? 100, curveSegments);\r\n if (!geometry) return [];\r\n\r\n const textPosition = [...(entity.position ?? [0, 0, 0])];\r\n textPosition[1] = textPosition[1] - (entity.height ?? 0);\r\n const widthScale = this.resolveWidthScale(entity);\r\n const textAnchor = new THREE.Vector3(textPosition[0] ?? 0, textPosition[1] ?? 0, textPosition[2] ?? 0).applyMatrix4(baseMatrix);\r\n const scale = 1.4 * entity.scale\r\n \r\n geometry.applyMatrix4(baseMatrix.clone().multiply(composeMatrix(textPosition, [widthScale*1.4, 1*scale, 1*scale], entity.rotation ?? 0)));\r\n const bounds = getGeometryBounds(geometry);\r\n\r\n const items: RenderItem2d[] = [{\r\n kind: 'text',\r\n layer: entity.layer,\r\n color: entity.color,\r\n linkId: entity.linkId ?? entity.id,\r\n geometry,\r\n min: bounds.min,\r\n max: bounds.max,\r\n textAnchor,\r\n info: entity,\r\n }];\r\n\r\n const hitbox = this.createHitbox(geometry);\r\n if (hitbox) {\r\n const hitboxBounds = getGeometryBounds(hitbox);\r\n items.push({\r\n kind: 'text',\r\n layer: entity.layer,\r\n color: `${entity.color}_hitbox` as any,\r\n linkId: entity.linkId ?? entity.id,\r\n geometry: hitbox,\r\n min: hitboxBounds.min,\r\n max: hitboxBounds.max,\r\n textAnchor,\r\n info: entity,\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /** 兼容新导出数据的 widthScale 和旧数据的 widthFactor,仅压缩或拉伸文字本地 X 方向。 */\r\n private resolveWidthScale(entity: any): number {\r\n const widthScale = Number(entity.widthScale ?? entity.widthFactor ?? 1);\r\n if (!Number.isFinite(widthScale) || Math.abs(widthScale) < 1e-12) return 1;\r\n return widthScale;\r\n }\r\n\r\n /** 统一 CAD 文字里的换行格式,避免 FontLoader 把 CR 当字形查找。 */\r\n public normalizeText(text: any): string {\r\n // FontLoader 不支持 CR/LF 字形,先统一换行,生成几何时再逐行处理。\r\n return String(text ?? '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n }\r\n\r\n /** 收集字体转换所需字符时保留可见字符,换行由几何生成阶段处理。 */\r\n public collectTextChars(text: string): string {\r\n return this.normalizeText(text).replace(/\\n/g, ' ');\r\n }\r\n\r\n /** 多行文字逐行生成 ShapeGeometry,再按行距平移后合并。 */\r\n private createTextGeometry(text: string, height: number, curveSegments: number): THREE.BufferGeometry | null {\r\n const lines = text.split('\\n');\r\n const lineHeight = height * (this.engine.options?.textLineHeight ?? 1.35);\r\n const geometries: THREE.BufferGeometry[] = [];\r\n \r\n lines.forEach((line, index) => {\r\n if (!line) return;\r\n const safeLine = this.getRenderableText(line);\r\n if (!safeLine.trim()) return;\r\n const shapes = this.font.generateShapes(safeLine, height);\r\n const geometry = new THREE.ShapeGeometry(shapes, curveSegments);\r\n geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, -index * lineHeight, 0));\r\n geometries.push(geometry);\r\n });\r\n if (geometries.length === 0) return null;\r\n return geometries.length === 1 ? geometries[0] : BufferGeometryUtils.mergeGeometries(geometries, false);\r\n }\r\n\r\n /** FontLoader 遇到缺字会抛错,渲染前将不可用字符替换为空格。 */\r\n private getRenderableText(text: string): string {\r\n const glyphs = (this.font as any)?.data?.glyphs;\r\n if (!glyphs) return text;\r\n\r\n // 字体不存在的字符会让 FontLoader 抛错;乱码或缺字替换为空格,避免整张图加载中断。\r\n return Array.from(text).map((char) => {\r\n if (char === '\\t') return ' ';\r\n return glyphs[char] ? char : ' ';\r\n }).join('');\r\n }\r\n\r\n /** 根据真实文字包围盒创建不可见平面,供射线选择使用。 */\r\n private createHitbox(geometry: THREE.BufferGeometry): THREE.BufferGeometry | null {\r\n geometry.computeBoundingBox();\r\n const box = geometry.boundingBox;\r\n if (!box) return null;\r\n const width = box.max.x - box.min.x;\r\n const height = box.max.y - box.min.y;\r\n if (width <= 0 || height <= 0) return null;\r\n const hitbox = new THREE.PlaneGeometry(width, height);\r\n hitbox.applyMatrix4(composeMatrix([(box.min.x + box.max.x) / 2, (box.min.y + box.max.y) / 2, 0], [1, 1, 1], 0));\r\n return hitbox;\r\n }\r\n}\r\n","/**\r\n * 2D 数据加载入口。\r\n * 数据读取、图元几何生成、block 展开和场景合批都放在 loader 目录中。\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport { Font } from 'three/examples/jsm/loaders/FontLoader.js';\r\nimport { DWGData, DWGEntity } from '../types/dwgTypes';\r\nimport { FontJsonGenerator } from '../../../common/FontJsonGenerator';\r\nimport { LayerManager } from '../managers/layer/index';\r\nimport { EventType2d } from './eventModule2d';\r\nimport { BlockFlattener } from '../loader/BlockFlattener';\r\nimport { CadDataSource } from '../loader/CadDataSource';\r\nimport { EntityGeometryFactory } from '../loader/EntityGeometryFactory';\r\nimport { SceneBatchBuilder } from '../loader/SceneBatchBuilder';\r\nimport { TextGeometryFactory } from '../loader/TextGeometryFactory';\r\nimport { LoadedCadTile2d, LoaderModel2d } from '../loader/types';\r\n\r\nexport class LoaderModule2d {\r\n private engine: any;\r\n private data: DWGData | null = null;\r\n private enableValidation = true;\r\n public model: LoaderModel2d = this.createEmptyModel();\r\n private font: Font | null = null;\r\n private readonly dataSource = new CadDataSource();\r\n\r\n constructor(engine: any) {\r\n this.engine = engine;\r\n this.engine.modelGroup = new THREE.Group();\r\n this.engine.modelGroup.name = 'model2d';\r\n this.engine.scene.add(this.engine.modelGroup);\r\n this.clearModelGroup();\r\n }\r\n\r\n /**\r\n * 加载 2D CAD 模型。\r\n * 只支持新版分包数据:传入 manifest.json 或 CAD 目录地址。\r\n */\r\n public async loadModel(\r\n url: string,\r\n options: {\r\n chunkSize?: number;\r\n enableChunkedLoading?: boolean;\r\n enableValidation?: boolean;\r\n } = {},\r\n ): Promise<void> {\r\n this.enableValidation = options.enableValidation ?? this.enableValidation;\r\n this.engine.events?.trigger(EventType2d.ModelLoadStart, { url });\r\n\r\n try {\r\n this._emitProgress(10, '请求数据...');\r\n const dwgData = await this.loadData(url);\r\n const parsed = this.parseData(dwgData);\r\n if (!parsed) throw new Error('Failed to parse DWG data');\r\n\r\n this.engine.dwgData = parsed;\n this.data = parsed;\n this._emitProgress(20, '解析数据...');\n await this.buildScene(parsed, {\n chunkSize: options.chunkSize,\n enableChunkedLoading: options.enableChunkedLoading,\n });\n this.applyMetadataViewTransform(parsed);\n this.afterModelLoaded();\n } catch (error) {\r\n console.error('[LoaderModule2d] Model load failed:', error);\r\n this._emitProgress(0, '抱歉,图纸加载失败');\r\n throw error;\r\n }\r\n }\r\n\r\n private async loadData(url: string): Promise<DWGData> {\n return this.dataSource.load(url);\n }\n\n /** 把 metadata 中的整体视图变换应用到 2D 模型最外层 group,避免逐个 tile 或图元重复旋转。 */\n private applyMetadataViewTransform(dwgData: DWGData): void {\n const viewRotation = Number(dwgData.metadata?.viewRotation ?? 0);\n const rotation = Number.isFinite(viewRotation) ? viewRotation : 0;\n this.engine.modelGroup.rotation.set(0, 0, rotation);\n this.engine.modelGroup.updateMatrixWorld(true);\n }\n\r\n /** 做最小结构校验,避免下游几何生成拿到明显非法的数据。 */\r\n private parseData(jsonData: any): DWGData | null {\r\n if (!jsonData) {\r\n console.error('[LoaderModule2d] Empty JSON data');\r\n return null;\r\n }\r\n\r\n if (this.enableValidation && !this.validateDataStructure(jsonData)) {\r\n console.error('[LoaderModule2d] Invalid data structure');\r\n return null;\r\n }\r\n\r\n return jsonData as DWGData;\r\n }\r\n\r\n /** 校验新版 loader 运行所需的核心字段。 */\r\n private validateDataStructure(data: any): boolean {\r\n if (!data.version) console.warn('[LoaderModule2d] Missing version');\r\n if (!data.metadata) console.warn('[LoaderModule2d] Missing metadata');\r\n if (!Array.isArray(data.layers)) {\r\n console.error('[LoaderModule2d] Invalid or missing layers array');\r\n return false;\r\n }\r\n if (!Array.isArray(data.blocks)) {\r\n console.error('[LoaderModule2d] Invalid or missing blocks array');\r\n return false;\r\n }\r\n if (!Array.isArray(data.tiles)) {\r\n console.error('[LoaderModule2d] Invalid or missing tiles array');\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** 构建 2D 场景:字体 -> block 展开 -> 每个 octree tile 单独合批到一个 THREE.Group。 */\r\n private async buildScene(\n dwgData: DWGData,\n options: {\n chunkSize?: number;\n enableChunkedLoading?: boolean;\n } = {},\n ): Promise<void> {\n this.clearModelGroup();\r\n this.model = this.createEmptyModel();\r\n this.model.layers = dwgData.layers;\r\n this._emitProgress(30, '加载字体...');\r\n this.font = await this.loadFont(dwgData);\r\n\r\n this._emitProgress(45, '生成图元...');\r\n const textFactory = new TextGeometryFactory(this.engine, this.font);\r\n const geometryFactory = new EntityGeometryFactory(this.engine, textFactory);\r\n const flattener = new BlockFlattener(geometryFactory);\r\n flattener.setBlocks((dwgData as any).blocks ?? []);\r\n\r\n const tiles = ((dwgData as any).tiles ?? []) as LoadedCadTile2d[];\n const totalTiles = Math.max(tiles.length, 1);\n const chunkSize = Math.max(1, options.chunkSize ?? 2000);\n const enableChunkedLoading = options.enableChunkedLoading ?? true;\n for (let index = 0; index < tiles.length; index += 1) {\n const tile = tiles[index];\n const group = this.createTileGroup(tile);\n this.engine.modelGroup.add(group);\n const batchBuilder = new SceneBatchBuilder(this.engine, this.model, group);\n const linkIds = new Set<string>();\n let renderItemCount = 0;\n let chunkCount = 0;\n\n // 边展开边合批,避免 tile 内生成一个巨大的 renderItems 临时数组导致内存峰值过高。\n for (const item of flattener.iterateRootEntities(tile.inserts ?? [])) {\n if (item?.linkId != null) linkIds.add(String(item.linkId));\n renderItemCount += 1;\n chunkCount += 1;\n batchBuilder.addRenderItem(item);\n\n if (enableChunkedLoading && chunkCount >= chunkSize) {\n chunkCount = 0;\n await this.yieldToBrowser();\n }\n }\n\n group.userData.linkIds = Array.from(linkIds);\n group.userData.renderItemCount = renderItemCount;\n batchBuilder.buildSceneObjects();\n flattener.clearCache();\n\n const progress = 45 + Math.round(((index + 1) / totalTiles) * 45);\n this._emitProgress(progress, `合并图元 ${index + 1}/${totalTiles}...`);\n if (enableChunkedLoading) await this.yieldToBrowser();\n }\n\n this.engine.model = this.model;\n this._emitProgress(100, '加载完成');\n }\n\n /** 分块加载时让出一次事件循环,降低长时间同步展开造成的页面卡死概率。 */\n private async yieldToBrowser(): Promise<void> {\n await new Promise<void>((resolve) => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => resolve());\n return;\n }\n setTimeout(resolve, 0);\n });\n }\n\r\n /** 创建 octree tile 对应的 Three 分组;min/max 只作为空间索引元数据,不参与定位修正。 */\r\n private createTileGroup(tile: LoadedCadTile2d): THREE.Group {\r\n const group = new THREE.Group();\r\n group.name = `octree:${tile.id}`;\r\n group.userData = {\r\n type: 'octree-tile',\r\n tileId: tile.id,\r\n tileUrl: tile.url,\r\n min: tile.node?.min,\r\n max: tile.node?.max,\r\n entityCount: tile.inserts?.length ?? tile.node?.entityCount ?? 0,\r\n };\r\n return group;\r\n }\r\n\r\n /** 按图纸实际文字裁剪字体字符集,降低字体转换成本。 */\n private async loadFont(dwgData: DWGData): Promise<Font> {\n const fontUrl: string = this.engine.options?.fontUrl ?? '/fonts/simfang.ttf';\r\n // 只转换当前图纸用到的字符,避免默认加载整套中文字体导致 JSON 过大和解析过慢。\r\n const json = await FontJsonGenerator.fromUrl(fontUrl, { chars: this.collectTextChars(dwgData) });\r\n return FontJsonGenerator.toThreeFont(json);\r\n }\r\n\r\n /** 从 block 实体中收集需要转换的文字字符;根实体来自 tile insert,不包含真实文字。 */\r\n private collectTextChars(dwgData: DWGData): string {\r\n const chars = new Set<string>([' ']);\r\n const collectFromEntities = (entities?: any[]): void => {\r\n if (!Array.isArray(entities)) return;\r\n entities.forEach((entity: any) => {\r\n if (typeof entity?.text === 'string') {\r\n for (const char of this.normalizeText(entity.text).replace(/\\n/g, ' ')) chars.add(char);\r\n }\r\n });\r\n };\r\n\r\n collectFromEntities((dwgData as any).entities);\r\n ((dwgData as any).blocks ?? []).forEach((block: any) => collectFromEntities(block?.entities));\r\n return Array.from(chars).join('');\r\n }\r\n\r\n /** 统一换行格式,和 TextGeometryFactory 保持一致。 */\r\n private normalizeText(text: any): string {\r\n return String(text ?? '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\r\n }\r\n\r\n /** 场景构建完成后的视图适配、图层管理和事件通知。 */\r\n private afterModelLoaded(): void {\r\n try {\r\n this.engine.fitToView();\r\n } catch (_error) {\r\n // 某些宿主会延迟初始化相机控制器,fit 失败不应中断加载。\r\n }\r\n\r\n if (!this.engine.layerManager) {\r\n this.engine.layerManager = new LayerManager(this.engine);\r\n }\r\n this.engine.layerManager._loadLayers();\r\n const background = this.engine.scene?.background;\r\n const backgroundColor = background instanceof THREE.Color ? background.getHex() : (this.engine.options?.backgroundColor ?? 0x1a1a1a);\r\n this.engine.modelToolModule2d?.updateColorsForBackground(backgroundColor);\r\n this.engine.layerManager.refresh();\r\n this.engine.events?.trigger(EventType2d.ModelLoaded, {});\r\n }\r\n\r\n /** 创建一次加载周期内使用的合批容器。 */\r\n private createEmptyModel(): LoaderModel2d {\r\n return {\r\n layers: [],\r\n modelMap: new Map(),\r\n hatchMap: new Map(),\r\n textMap: new Map(),\r\n imageMap: new Map(),\r\n nodeMap: new Map(),\r\n textItems: [],\r\n };\r\n }\r\n\r\n /** 清空 Three 组内旧模型对象,但保留 modelGroup 实例供外部引用。 */\r\n private clearModelGroup(): void {\n this.engine.modelGroup.rotation.set(0, 0, 0);\n while (this.engine.modelGroup.children.length > 0) {\n const child = this.engine.modelGroup.children[0];\n this.engine.modelGroup.remove(child);\n this.disposeObject3d(child);\n }\n }\n\n /** 释放旧模型占用的 CPU/GPU 资源,避免重复加载或失败重试时内存继续累加。 */\n private disposeObject3d(object: THREE.Object3D): void {\n object.traverse((child: any) => {\n this.disposeGeometry(child.geometry);\n this.disposeGeometryList(child.geometrys);\n this.disposeMaterial(child.material);\n this.disposeMaterial(child.materialClone);\n child.geometrys = undefined;\n child.clonePoints = undefined;\n child.materialClone = undefined;\n });\n }\n\n private disposeGeometry(geometry: THREE.BufferGeometry | undefined): void {\n geometry?.dispose?.();\n }\n\n private disposeGeometryList(geometries: THREE.BufferGeometry[] | undefined): void {\n geometries?.forEach((geometry) => this.disposeGeometry(geometry));\n }\n\n private disposeMaterial(material: THREE.Material | THREE.Material[] | undefined): void {\n if (Array.isArray(material)) {\n material.forEach((item) => this.disposeMaterial(item));\n return;\n }\n if (!material) return;\n Object.values(material).forEach((value: any) => {\n if (value?.isTexture) value.dispose?.();\n });\n material.dispose?.();\n }\n\r\n /** 对外发送加载进度事件。 */\r\n private _emitProgress(progress: number, text: string): void {\r\n this.engine.events?.trigger(EventType2d.ModelLoadProgress, { progress, text });\r\n }\r\n\r\n public getData(): DWGData | null {\r\n return this.data;\r\n }\r\n\r\n public getEntitiesByLayer(layerName: string): DWGEntity[] {\r\n if (!this.data) return [];\r\n return this.data.entities.filter((entity) => entity.layer === layerName);\r\n }\r\n\r\n public getLayers(): DWGData['layers'] {\r\n if (!this.data) return [];\r\n return this.data.layers;\r\n }\r\n\r\n public clear(): void {\r\n this.data = null;\r\n this.engine.dwgData = null;\r\n this.model = this.createEmptyModel();\r\n this.clearModelGroup();\r\n }\r\n\r\n public dispose(): void {\r\n this.clear();\r\n }\r\n}\r\n","import * as THREE from 'three';\r\n\r\n/**\r\n * 世界坐标与屏幕坐标转换工具类\r\n * 提供世界坐标(3D空间坐标)与屏幕坐标(2D像素坐标)之间的双向转换功能\r\n */\r\nexport class WorldToScreen {\r\n private raycaster: THREE.Raycaster;\r\n\r\n /**\r\n * 构造函数\r\n * @param camera - Three.js 相机对象(用于投影计算)\r\n * @param renderer - Three.js 渲染器对象(用于获取画布尺寸)\r\n * @param scene - Three.js 场景对象(用于屏幕坐标转世界坐标时的射线检测,可选)\r\n */\r\n constructor(\r\n private camera: THREE.Camera,\r\n private renderer: THREE.WebGLRenderer,\r\n private scene?: THREE.Scene\r\n ) {\r\n // 初始化射线检测器,用于屏幕坐标转世界坐标\r\n this.raycaster = new THREE.Raycaster();\r\n }\r\n\r\n /**\r\n * 将世界坐标转换为屏幕坐标(归一化坐标,范围 -1 到 1)\r\n * @param worldPos - 世界空间中的3D坐标点\r\n * @returns 归一化的屏幕坐标,x 和 y 的范围都是 -1 到 1\r\n * x: -1 表示屏幕左边缘,1 表示屏幕右边缘\r\n * y: -1 表示屏幕下边缘,1 表示屏幕上边缘\r\n */\r\n public worldToScreenNormalized(worldPos: THREE.Vector3): THREE.Vector2 {\r\n // 克隆坐标点,避免修改原始对象\r\n const pos = worldPos.clone();\r\n // 使用相机的投影矩阵将世界坐标投影到归一化设备坐标(NDC)\r\n pos.project(this.camera);\r\n // 返回归一化的屏幕坐标\r\n return new THREE.Vector2(pos.x, pos.y);\r\n }\r\n\r\n /**\r\n * 将世界坐标转换为屏幕坐标(像素坐标)\r\n * @param worldPos - 世界空间中的3D坐标点\r\n * @returns 屏幕像素坐标,x 和 y 表示在画布上的实际像素位置\r\n * x: 0 表示屏幕左边缘,width 表示屏幕右边缘\r\n * y: 0 表示屏幕上边缘,height 表示屏幕下边缘\r\n */\r\n public worldToScreen(worldPos: THREE.Vector3): THREE.Vector2 {\r\n // 创建一个向量用于存储世界坐标\r\n const vector = new THREE.Vector3();\r\n \r\n // 将世界坐标转换为裁剪空间坐标\r\n vector.copy(worldPos).project(this.camera);\r\n \r\n // 将裁剪空间坐标转换到NDC(标准化设备坐标)\r\n // 在NDC中,x和y的范围是-1到1,z是0到1\r\n vector.x = vector.x * this.renderer.domElement.clientWidth * 0.5;\r\n vector.y = -vector.y * this.renderer.domElement.clientHeight * 0.5; // 注意y轴的反向性\r\n vector.z = (vector.z + 1) * 0.5; // z的范围从-1到1映射到0到1\r\n \r\n // 转换为屏幕坐标,加上窗口的偏移量\r\n vector.x += this.renderer.domElement.clientWidth * 0.5;\r\n vector.y += this.renderer.domElement.clientHeight * 0.5;\r\n \r\n return new THREE.Vector2(vector.x, vector.y);\n }\n\n /**\n * 将世界坐标转换为屏幕坐标,仅在点位于当前相机可见裁剪空间内时返回结果。\n * 透视相机背后的点经过 project 后会翻转到屏幕异常位置,这里提前过滤。\n * @param worldPos - 世界空间中的 3D 坐标点\n * @returns 屏幕像素坐标;如果点不可见或投影结果无效,返回 null\n */\n public worldToScreenIfVisible(worldPos: THREE.Vector3): THREE.Vector2 | null {\n this.camera.updateMatrixWorld(true);\n\n if (this.camera instanceof THREE.PerspectiveCamera) {\n const cameraSpacePos = worldPos.clone().applyMatrix4(this.camera.matrixWorldInverse);\n if (cameraSpacePos.z >= 0) {\n return null;\n }\n }\n\n const vector = worldPos.clone().project(this.camera);\n if (\n !Number.isFinite(vector.x) ||\n !Number.isFinite(vector.y) ||\n !Number.isFinite(vector.z) ||\n vector.z < -1 ||\n vector.z > 1\n ) {\n return null;\n }\n\n const width = this.renderer.domElement.clientWidth;\n const height = this.renderer.domElement.clientHeight;\n\n return new THREE.Vector2(\n vector.x * width * 0.5 + width * 0.5,\n -vector.y * height * 0.5 + height * 0.5\n );\n }\n\n /**\n * 将屏幕坐标(像素坐标)转换为归一化坐标\r\n * @param screenX - 屏幕像素 X 坐标\r\n * @param screenY - 屏幕像素 Y 坐标\r\n * @returns 归一化的屏幕坐标,范围 -1 到 1\r\n */\r\n public screenToNormalized(screenX: number, screenY: number): THREE.Vector2 {\r\n const width = this.renderer.domElement.clientWidth;\r\n const height = this.renderer.domElement.clientHeight;\r\n \r\n const x = (screenX / width) * 2 - 1;\r\n const y = -((screenY / height) * 2 - 1);\r\n \r\n return new THREE.Vector2(x, y);\r\n }\r\n\r\n /**\r\n * 将屏幕坐标(像素坐标)转换为世界坐标\r\n * 使用射线检测,返回与场景中第一个相交对象的世界坐标点\r\n * @param screenX - 屏幕像素 X 坐标\r\n * @param screenY - 屏幕像素 Y 坐标\r\n * @param objects - 可选,指定要检测的对象数组。如果不提供且 scene 存在,则检测场景中的所有对象\r\n * @returns 世界坐标点,如果没有相交则返回 null\r\n */\r\n public screenToWorld(\r\n screenX: number, \r\n screenY: number, \r\n objects?: THREE.Object3D[]\r\n ): THREE.Vector3 | null {\r\n // 如果没有提供场景,无法进行射线检测\r\n if (!this.scene && !objects) {\r\n console.warn('WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标');\r\n return null;\r\n }\r\n\r\n // 将屏幕坐标转换为归一化坐标\r\n const normalized = this.screenToNormalized(screenX, screenY);\r\n \r\n // 设置射线检测器的起点和方向\r\n this.raycaster.setFromCamera(normalized, this.camera);\r\n \r\n // 确定要检测的对象列表\r\n const objectsToTest = objects || this.scene!.children;\r\n \r\n // 执行射线检测,获取所有相交点\r\n const intersects = this.raycaster.intersectObjects(objectsToTest, true);\r\n \r\n // 如果存在相交点,返回第一个相交点的世界坐标\r\n if (intersects.length > 0) {\r\n return intersects[0].point;\r\n }\r\n \r\n // 如果没有相交,返回 null\r\n return null;\r\n }\r\n\r\n /**\r\n * 将屏幕坐标转换为指定深度的世界坐标\r\n * @param screenX - 屏幕像素 X 坐标\r\n * @param screenY - 屏幕像素 Y 坐标\r\n * @param depth - 沿射线方向的距离(世界单位)\r\n * @returns 世界坐标点\r\n */\r\n public screenToWorldWithDepth(\r\n screenX: number, \r\n screenY: number, \r\n depth: number = 0\r\n ): THREE.Vector3 {\r\n const normalized = this.screenToNormalized(screenX, screenY);\r\n this.raycaster.setFromCamera(normalized, this.camera);\r\n const result = new THREE.Vector3();\r\n this.raycaster.ray.at(depth, result);\r\n return result;\r\n }\r\n\r\n /**\r\n * 更新相机引用(当相机发生变化时调用)\r\n * @param camera - 新的相机对象\r\n */\r\n public updateCamera(camera: THREE.Camera): void {\r\n this.camera = camera;\r\n }\r\n\r\n /**\r\n * 更新渲染器引用(当渲染器发生变化时调用)\r\n * @param renderer - 新的渲染器对象\r\n */\r\n public updateRenderer(renderer: THREE.WebGLRenderer): void {\r\n this.renderer = renderer;\r\n }\r\n\r\n /**\r\n * 更新场景引用(当场景发生变化时调用)\r\n * @param scene - 新的场景对象\r\n */\r\n public updateScene(scene: THREE.Scene): void {\r\n this.scene = scene;\r\n }\r\n}\n","import * as THREE from 'three';\r\nimport { WorldToScreen } from '../../../../common/WorldToScreen';\r\n\r\n/** 基于 2D octree 的粗筛拾取管理器。 */\r\nexport class OctreeBox2d {\r\n private engine: any;\n private pickBoxElementIds: any[] = [];\n private worldToScreen: WorldToScreen;\n private readonly invisibleMaterial = new THREE.MeshBasicMaterial({ visible: false });\n private readonly maxHoverLineCoordinateCount = 30000;\n private readonly maxHoverMeshVertexCount = 30000;\n\r\n constructor(engine: any) {\r\n this.engine = engine;\r\n this.pickBoxElementIds = [];\r\n this.worldToScreen = new WorldToScreen(engine.camera, engine.renderer, engine.scene);\r\n }\r\n\r\n public init(): void {\r\n this.pickBoxElementIds = [];\r\n }\r\n\r\n /** 先通过 octree 包围盒筛候选 linkId,再对线和面做精确拾取。 */\r\n public pick2d(rayCaster: any, event: any): any {\r\n const meshs: any[] = [];\r\n const mousePoint = new THREE.Vector2(event.offsetX, event.offsetY);\r\n this.init();\r\n this.RecurrentIteration(rayCaster, this.engine.dwgData?.octree);\r\n\r\n const interList: any[] = [];\r\n this.pickBoxElementIds.forEach((id) => {\r\n const nodes = this.engine.loaderModule2d.model.nodeMap.get(String(id)) ?? this.engine.loaderModule2d.model.nodeMap.get(id);\r\n nodes?.forEach((node: any) => {\r\n if (node == null) return;\r\n const model = this.getNodeObject(node);\n if (model == null) return;\n if (!this.isNodePickable(node, model)) return;\n if (event?.isHover === true && this.isLargeHoverNode(node, model)) return;\n if (model instanceof THREE.LineSegments) {\n const threeBox = new THREE.Box3(node.min, node.max);\r\n const isinter = rayCaster.ray.intersectsBox(threeBox);\r\n if (isinter == null || isinter === false) return;\r\n\r\n const line: any = model;\r\n const ps = line.clonePoints.slice(node.indexes[1], node.indexes[2]);\r\n const points: THREE.Vector3[] = [];\r\n for (let index = 0; index < ps.length / 3; index += 1) {\r\n points.push(new THREE.Vector3(ps[index * 3], ps[index * 3 + 1], ps[index * 3 + 2]));\r\n }\r\n\r\n const screenLines: [THREE.Vector2, THREE.Vector2][] = [];\r\n for (let index = 0; index < points.length / 2; index += 1) {\r\n const start = this.worldToScreen.worldToScreen(points[index * 2]);\r\n const end = this.worldToScreen.worldToScreen(points[index * 2 + 1]);\r\n if (start.distanceTo(end) > 1) screenLines.push([start, end]);\r\n }\r\n\r\n screenLines.forEach((line) => {\r\n const distance = this.pointToLineDistance(mousePoint, line[0], line[1]);\r\n if (distance < 10) {\r\n interList.push({ distance, linkId: id });\r\n }\r\n });\r\n } else {\n const geo = this.getNodeGeometry(model, node);\n if (!geo) return;\n const invisibleMesh: any = new THREE.Mesh(geo, this.invisibleMaterial);\n invisibleMesh.linkId = id;\n meshs.push(invisibleMesh);\n }\n });\n });\n\n const intersects = rayCaster.intersectObjects(meshs, true);\n meshs.forEach((mesh) => {\n mesh.geometry?.dispose?.();\n });\n if (intersects.length > 0) {\n return (intersects[0].object as any).linkId;\n }\r\n if (interList.length > 0) {\r\n interList.sort((a, b) => a.distance - b.distance);\r\n return interList[0].linkId;\r\n }\r\n return null;\r\n }\r\n\r\n /** 分组加载后 nodeMap 会保存真实对象;旧索引只作为兜底。 */\r\n private getNodeObject(node: any): any {\n return node?.object ?? node?.group?.children?.[node.indexes?.[0]] ?? this.engine.modelGroup.children[node.indexes?.[0]];\n }\n\n /** 从合并后的 geometry group 中临时提取单个图元几何,避免加载期常驻每个子 geometry。 */\n private getNodeGeometry(object: any, node: any): THREE.BufferGeometry | null {\n if (Array.isArray(object.geometrys) && object.geometrys[node.indexes[1]]) {\n return object.geometrys[node.indexes[1]].clone();\n }\n\n const geometry = object.geometry as THREE.BufferGeometry | undefined;\n const group = geometry?.groups?.[node.indexes[1]];\n if (!geometry || !group) return null;\n\n const result = new THREE.BufferGeometry();\n Object.keys(geometry.attributes).forEach((name) => {\n const attribute = geometry.getAttribute(name) as THREE.BufferAttribute;\n const itemSize = attribute.itemSize;\n const source = attribute.array as any;\n const start = group.start * itemSize;\n const end = (group.start + group.count) * itemSize;\n result.setAttribute(name, new THREE.BufferAttribute(source.slice(start, end), itemSize, attribute.normalized));\n });\n return result;\n }\n\r\n /** 获取鼠标射线经过的 octree 节点内元素。 */\r\n public RecurrentIteration(rayCaster: any, box: any): void {\r\n if (box == null) return;\r\n const stack = [box];\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!current) continue;\r\n const bounds = this.getBox3(current);\r\n if (bounds && !rayCaster.ray.intersectsBox(bounds)) continue;\r\n\r\n const elements = current.elements ?? [];\r\n elements.forEach((ele: any) => {\r\n if (this.isElementPickable(ele)) this.pickBoxElementIds.push(ele);\r\n });\r\n\r\n const children = current.children ?? [];\r\n for (let index = children.length - 1; index >= 0; index -= 1) {\r\n stack.push(children[index]);\r\n }\r\n }\r\n }\r\n\r\n /** 新版 min/max 是数组,这里也兼容对象形式,避免外部数据轻微差异导致拾取失效。 */\r\n private getBox3(box: any): THREE.Box3 | null {\r\n const min = this.toVector3(box.min);\r\n const max = this.toVector3(box.max);\r\n if (!min || !max) return null;\r\n return new THREE.Box3(\r\n new THREE.Vector3(Math.min(min.x, max.x), Math.min(min.y, max.y), Math.min(min.z, max.z)),\r\n new THREE.Vector3(Math.max(max.x, min.x), Math.max(max.y, min.y), Math.max(max.z, min.z)),\r\n );\r\n }\r\n\r\n private toVector3(value: any): THREE.Vector3 | null {\r\n if (Array.isArray(value)) return new THREE.Vector3(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0);\r\n if (value && typeof value === 'object') return new THREE.Vector3(value.X ?? value.x ?? 0, value.Y ?? value.y ?? 0, value.Z ?? value.z ?? 0);\r\n return null;\r\n }\r\n\r\n /** 隐藏或已经高亮的元素不参与普通拾取,保持原有交互语义。 */\r\n private isElementPickable(ele: any): boolean {\r\n let ids = this.engine.engineStatus2d.hideModels;\r\n if (ids != null && ids.includes(ele)) return false;\r\n ids = this.engine.engineStatus2d.highlightModels;\r\n if (ids != null && ids.includes(ele)) return false;\r\n if (this.engine.layerManager?.isModelVisibleByLayer?.(ele) === false) return false;\r\n return true;\r\n }\r\n\r\n /** 图层隐藏后,命中的子几何不再参与线/面精确拾取。 */\r\n private isNodePickable(node: any, object: any): boolean {\n if (object?.visible === false) return false;\n return this.engine.layerManager?.isLayerVisible?.(node?.layer) !== false;\n }\n\n /** hover 阶段跳过超大节点的精确拾取;click 不带 isHover 标记,仍走完整命中。 */\n private isLargeHoverNode(node: any, object: any): boolean {\n if (object instanceof THREE.LineSegments) {\n return Math.max(0, (node.indexes?.[2] ?? 0) - (node.indexes?.[1] ?? 0)) > this.maxHoverLineCoordinateCount;\n }\n\n const group = object?.geometry?.groups?.[node.indexes?.[1]];\n return (group?.count ?? 0) > this.maxHoverMeshVertexCount;\n }\n\n private pointToLineDistance(point: THREE.Vector2, start: THREE.Vector2, end: THREE.Vector2): number {\n const lineDir = new THREE.Vector2().subVectors(end, start);\r\n const lineLengthSq = lineDir.lengthSq();\r\n if (lineLengthSq < 1e-10) {\r\n return point.distanceTo(start);\r\n }\r\n const toPoint = new THREE.Vector2().subVectors(point, start);\r\n const t = THREE.MathUtils.clamp(toPoint.dot(lineDir) / lineLengthSq, 0, 1);\r\n const projectionPoint = new THREE.Vector2().copy(lineDir).multiplyScalar(t).add(start);\r\n return point.distanceTo(projectionPoint);\r\n }\r\n}\r\n","import {WorldToScreen} from \"../../../../common/WorldToScreen\"\r\nimport * as THREE from 'three';\r\nexport class LinkView2d3d{\r\n private engine:any\r\n // 小组件容器\r\n private widgetContainer: HTMLDivElement | null = null\r\n private widgetCanvas: HTMLCanvasElement | null = null\r\n private widgetCtx: CanvasRenderingContext2D | null = null\r\n // 小组件尺寸\r\n private readonly widgetSize: number = 50\r\n // 拖拽交互状态\r\n private isDragging: boolean = false\r\n private isRotating: boolean = false\r\n private lastMouseX: number = 0\r\n private lastMouseY: number = 0\r\n // 小组件位置(相对于屏幕)\r\n private widgetX: number = this.widgetSize / 2 + 5\r\n private widgetY: number = this.widgetSize / 2 + 5\r\n // 小组件旋转角度\r\n private widgetRotation: number = 0\r\n private rotationStartAngle: number | null = null\r\n private widgetRotationStart: number = 0\r\n private worldToScreen:WorldToScreen\r\n private currentWordPosition:THREE.Vector3 | null = null\r\n private currentWordRotation:number | null = null\r\n private lastCameraWorldPosition: THREE.Vector3 | null = null\r\n // 是否启用状态\r\n private enabled: boolean = true\r\n constructor(engine:any){\r\n this.engine = engine\r\n this.worldToScreen = new WorldToScreen(engine.camera,engine.renderer,engine.scene)\r\n this.initWidget()\r\n this.active()\r\n let this_ = this\r\n this.engine.controlModule2d.panControls.addEventListener('change', () => {\r\n // change 同时包含拖拽和滚轮,无法区分\r\n this_.updateViewPoint()\r\n });\r\n }\r\n\r\n /**\r\n * 切换启用状态\r\n */\r\n public toggle(): boolean {\r\n this.enabled = !this.enabled\r\n if (this.enabled) {\r\n this.active()\r\n if(this.widgetContainer) {\r\n this.widgetContainer.style.display = 'block'\r\n }\r\n } else {\r\n this.disActive()\r\n if(this.widgetContainer) {\r\n this.widgetContainer.style.display = 'none'\r\n }\r\n }\r\n return this.enabled\r\n }\r\n\r\n /**\r\n * 获取启用状态\r\n */\r\n public isEnabled(): boolean {\r\n return this.enabled\r\n }\r\n\r\n // 初始化小组件\r\n private initWidget(){\r\n const dpr = window.devicePixelRatio || 1\r\n\r\n // 创建容器\r\n this.widgetContainer = document.createElement('div')\r\n this.widgetContainer.className = \"MapController\"\r\n this.widgetContainer.style.position = 'absolute'\r\n this.widgetContainer.style.width = `${this.widgetSize}px`\r\n this.widgetContainer.style.height = `${this.widgetSize}px`\r\n this.widgetContainer.style.border = '2px solid rgba(255, 255, 255, 0.4)'\r\n this.widgetContainer.style.borderRadius = '50%'\r\n this.widgetContainer.style.overflow = 'hidden'\r\n this.widgetContainer.style.backgroundColor = 'rgba(26, 26, 46, 0.85)'\r\n this.widgetContainer.style.cursor = 'crosshair'\r\n this.widgetContainer.style.userSelect = 'none'\r\n this.widgetContainer.style.pointerEvents = 'auto'\r\n this.syncWidgetPosition()\r\n\r\n // 创建 canvas 用于绘制方向指示器\r\n this.widgetCanvas = document.createElement('canvas')\r\n this.widgetContainer.className = \"MapController\"\r\n this.widgetCanvas.width = this.widgetSize * dpr\r\n this.widgetCanvas.height = this.widgetSize * dpr\r\n this.widgetCanvas.style.position = 'absolute'\r\n this.widgetCanvas.style.top = '0'\r\n this.widgetCanvas.style.left = '0'\r\n this.widgetCanvas.style.width = `${this.widgetSize}px`\r\n this.widgetCanvas.style.height = `${this.widgetSize}px`\r\n this.widgetCanvas.style.pointerEvents = 'auto' \r\n this.widgetContainer.style.zIndex = '1000'\r\n this.widgetContainer.appendChild(this.widgetCanvas)\r\n\r\n this.widgetCtx = this.widgetCanvas.getContext('2d')\r\n if(this.widgetCtx){\r\n this.widgetCtx.scale(dpr, dpr)\r\n }\r\n\r\n // 绑定事件\r\n this.setupWidgetEvents()\r\n\r\n // 添加到页面\r\n if(this.engine.container){\r\n this.engine.container.appendChild(this.widgetContainer)\r\n }\r\n\r\n // 初始绘制\r\n this.drawWidget()\r\n }\r\n\r\n // 设置小组件事件\r\n private setupWidgetEvents(){\r\n if(!this.widgetContainer) return\r\n\r\n // widgetContainer: 左键拖动组件位置\r\n this.widgetContainer.addEventListener('mousedown', this.onWidgetCanvasMouseDown)\r\n // widgetCanvas: 左键旋转方向\r\n if(this.widgetCanvas){\r\n this.widgetCanvas.addEventListener('mousedown', this.onWidgetCanvasMouseDown)\r\n }\r\n window.addEventListener('mousemove', this.onWidgetMouseMove)\r\n window.addEventListener('mouseup', this.onWidgetMouseUp)\r\n\r\n // 禁用右键菜单\r\n this.widgetContainer.addEventListener('contextmenu', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n })\r\n if(this.widgetCanvas){\r\n this.widgetCanvas.addEventListener('contextmenu', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n })\r\n }\r\n }\r\n \r\n // 鼠标按下 - Canvas(旋转)\r\n private readonly onWidgetCanvasMouseDown = (e: MouseEvent) => {\r\n if(!this.widgetContainer) return\r\n if(e.button == 0){\r\n this.isDragging = false\r\n this.isRotating = true\r\n } else{\r\n this.isDragging = true\r\n this.isRotating = false\r\n }\r\n \r\n this.captureRotationBaseline(e)\r\n\r\n this.lastMouseX = e.clientX\r\n this.lastMouseY = e.clientY\r\n\r\n if(this.widgetContainer){\r\n this.widgetContainer.style.cursor = 'alias'\r\n }\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n // 鼠标移动\r\n private readonly onWidgetMouseMove = (e: MouseEvent) => {\r\n if(!this.isDragging && !this.isRotating) return\r\n\r\n const deltaX = e.clientX - this.lastMouseX\r\n const deltaY = e.clientY - this.lastMouseY\r\n\r\n if(this.isDragging){\r\n // 拖动整个组件\r\n this.widgetX += deltaX\r\n this.widgetY += deltaY\r\n console.log(`[LinkView2d3d] 拖动位置更新: x=${this.widgetX.toFixed(0)}, y=${this.widgetY.toFixed(0)}`)\r\n\r\n this.syncWidgetPosition()\r\n this.handleWidgetPositionControl()\r\n } else if(this.isRotating){\r\n // 旋转指示器\r\n const currentAngle = this.calculatePointerAngle(e)\r\n if(currentAngle !== null){\r\n if(this.rotationStartAngle === null){\r\n this.rotationStartAngle = currentAngle\r\n this.widgetRotationStart = this.widgetRotation\r\n }\r\n const angleDelta = currentAngle - this.rotationStartAngle\r\n this.widgetRotation = this.widgetRotationStart + angleDelta\r\n console.log(`[LinkView2d3d] 旋转角度更新: ${(this.widgetRotation * 180 / Math.PI).toFixed(1)}°`)\r\n this.drawWidget()\r\n this.handleWidgetRotationControl()\r\n }\r\n }\r\n\r\n this.lastMouseX = e.clientX\r\n this.lastMouseY = e.clientY\r\n }\r\n\r\n // 鼠标松开\r\n private readonly onWidgetMouseUp = () => {\r\n if(this.isDragging){\r\n console.log(`[LinkView2d3d] 拖动结束,最终位置: x=${this.widgetX.toFixed(0)}, y=${this.widgetY.toFixed(0)}`)\r\n }\r\n if(this.isRotating){\r\n console.log(`[LinkView2d3d] 旋转结束,最终角度: ${(this.widgetRotation * 180 / Math.PI).toFixed(1)}°`)\r\n }\r\n\r\n this.isDragging = false\r\n this.isRotating = false\r\n this.rotationStartAngle = null\r\n\r\n if(this.widgetContainer){\r\n this.widgetContainer.style.cursor = 'crosshair'\r\n }\r\n }\r\n\r\n // 绘制小组件\r\n private drawWidget(){\r\n const ctx = this.widgetCtx\r\n if(!ctx) return\r\n\r\n const cx = this.widgetSize / 2\r\n const cy = this.widgetSize / 2\r\n\r\n ctx.clearRect(0, 0, this.widgetSize, this.widgetSize)\r\n\r\n ctx.save()\r\n ctx.translate(cx, cy)\r\n ctx.rotate(this.widgetRotation)\r\n\r\n // 绘制视野锥形指示器(类似 miniMap)\r\n const coneLength = 36\r\n const halfAngle = Math.PI / 10 // 15° → 总张角 30°\r\n\r\n // 由内向外渐变:尖端不透明绿 → 外沿完全透明\r\n const grad = ctx.createRadialGradient(0, 0, 2, 0, 0, coneLength)\r\n grad.addColorStop(0, 'rgba(0, 230, 130, 0.9)')\r\n grad.addColorStop(1, 'rgba(0, 230, 130, 0)')\r\n\r\n const lx = -Math.sin(halfAngle) * coneLength\r\n const ly = -Math.cos(halfAngle) * coneLength\r\n const rx = Math.sin(halfAngle) * coneLength\r\n const ry = -Math.cos(halfAngle) * coneLength\r\n\r\n ctx.beginPath()\r\n ctx.moveTo(0, 0)\r\n ctx.lineTo(lx, ly)\r\n ctx.lineTo(rx, ry)\r\n ctx.closePath()\r\n ctx.fillStyle = grad\r\n ctx.fill()\r\n\r\n // 中心圆点(位置指示器)\r\n ctx.fillStyle = 'rgba(255, 255, 255, 0.95)'\r\n ctx.strokeStyle = 'rgba(0, 200, 110, 0.9)'\r\n ctx.lineWidth = 1.5\r\n ctx.beginPath()\r\n ctx.arc(0, 0, 4, 0, Math.PI * 2)\r\n ctx.fill()\r\n ctx.stroke()\r\n\r\n ctx.restore()\r\n }\r\n\r\n // 激活\r\n private active(){\r\n window.addEventListener('D3ViewUpdate', this.listenViewUpdate)\r\n }\r\n // 取消\r\n private disActive(){\r\n window.removeEventListener('D3ViewUpdate', this.listenViewUpdate)\r\n }\r\n\r\n // 清理小组件资源\r\n private disposeWidget(){\r\n if(this.widgetContainer){\r\n this.widgetContainer.removeEventListener('mousedown', this.onWidgetMouseDown)\r\n }\r\n if(this.widgetCanvas){\r\n this.widgetCanvas.removeEventListener('mousedown', this.onWidgetCanvasMouseDown)\r\n }\r\n window.removeEventListener('mousemove', this.onWidgetMouseMove)\r\n window.removeEventListener('mouseup', this.onWidgetMouseUp)\r\n\r\n this.widgetContainer?.remove()\r\n\r\n this.widgetContainer = null\r\n this.widgetCanvas = null\r\n this.widgetCtx = null\r\n }\r\n\r\n // 更新相机位置\r\n private readonly listenViewUpdate = (res:any) =>{\r\n console.log('[LinkView2d3d] 收到视图更新事件', res)\r\n res = res.detail\r\n // 这里可以根据 3D 视图的位置来更新小组件的位置和方向\r\n // 例如:\r\n if(res && res.position){ \r\n this.lastCameraWorldPosition = new THREE.Vector3(res.position.x, res.position.y, res.position.z)\r\n this.currentWordPosition = new THREE.Vector3(res.position.x,-res.position.z,0)\r\n }\r\n \r\n if(res && typeof res.rotation === 'number'){\r\n this.currentWordRotation = res.rotation \r\n }\r\n\r\n this.updateViewPoint()\r\n }\r\n\r\n private updateViewPoint(){\r\n if(this.currentWordPosition){ \r\n let screenPoint = this.worldToScreen.worldToScreen(this.currentWordPosition)\r\n this.widgetX = screenPoint.x\r\n this.widgetY = screenPoint.y\r\n this.syncWidgetPosition()\r\n }\r\n if(this.currentWordRotation !== null){\r\n // 根据相机旋转角度计算widgetRotation\r\n // rotation.y 是偏航角(yaw),用于2D平面旋转\r\n // 加上 Math.PI 是因为3D相机的0°朝向与2D指示器方向需要偏移180°\r\n this.widgetRotation = this.currentWordRotation\r\n this.drawWidget()\r\n } \r\n }\r\n\r\n private syncWidgetPosition(){\r\n if(!this.widgetContainer) return\r\n const halfSize = this.widgetSize / 2\r\n this.widgetContainer.style.left = `${this.widgetX - halfSize}px`\r\n this.widgetContainer.style.top = `${this.widgetY - halfSize}px`\r\n }\r\n\r\n private handleWidgetPositionControl(){\r\n const worldPoint = this.getWidgetWorldPosition()\r\n if(!worldPoint) return\r\n this.currentWordPosition = worldPoint\r\n this.dispatchViewControl('move', { position2d: worldPoint })\r\n }\r\n\r\n private handleWidgetRotationControl(){\r\n this.currentWordRotation = this.widgetRotation\r\n this.dispatchViewControl('rotate', { rotation: this.widgetRotation })\r\n }\r\n\r\n private getWidgetWorldPosition(): THREE.Vector3 | null{\r\n if(!this.engine?.cameraModule2d?.screenToWorld) return null\r\n const point = this.engine.cameraModule2d.screenToWorld(this.widgetX, this.widgetY)\r\n if(!point) return null\r\n\r\n return new THREE.Vector3(point.x, point.y, 0)\r\n }\r\n\r\n private dispatchViewControl(mode:'move'|'rotate'|'both', payload:{ position2d?: THREE.Vector3, rotation?: number }){\r\n const hasPosition = !!payload.position2d\r\n const hasRotation = typeof payload.rotation === 'number'\r\n if(!hasPosition && !hasRotation) return\r\n\r\n if(hasPosition && !this.lastCameraWorldPosition){\r\n console.warn('[LinkView2d3d] 未获取到 3D 相机位置,暂不推送位置控制')\r\n return\r\n }\r\n\r\n const detail:any = {\r\n source: 'LinkView2d3d',\r\n mode\r\n }\r\n\r\n if(payload.position2d && this.lastCameraWorldPosition){\r\n const targetY = this.lastCameraWorldPosition.y\r\n const mappedZ = -payload.position2d.y\r\n detail.position = {\r\n x: payload.position2d.x,\r\n y: targetY,\r\n z: mappedZ\r\n }\r\n this.lastCameraWorldPosition = new THREE.Vector3(payload.position2d.x, targetY, mappedZ)\r\n }\r\n\r\n if(hasRotation){\r\n detail.rotation = payload.rotation\r\n }\r\n\r\n window.dispatchEvent(new CustomEvent('D2ViewControl', { detail }))\r\n }\r\n\r\n private captureRotationBaseline(e: MouseEvent){\r\n const pointerAngle = this.calculatePointerAngle(e)\r\n if(pointerAngle === null){\r\n this.rotationStartAngle = null\r\n return\r\n }\r\n this.rotationStartAngle = pointerAngle\r\n this.widgetRotationStart = this.widgetRotation\r\n }\r\n\r\n private calculatePointerAngle(e: MouseEvent): number | null{\r\n if(!this.widgetContainer) return null\r\n const rect = this.widgetContainer.getBoundingClientRect()\r\n const centerX = rect.left + rect.width / 2\r\n const centerY = rect.top + rect.height / 2\r\n\r\n return Math.atan2(e.clientX - centerX, centerY - e.clientY)\r\n }\r\n\r\n}\r\n","\r\nexport class LinkElement2d3d{\r\n private engine:any;\r\n // 是否启用状态\r\n private enabled: boolean = true;\r\n\r\n constructor(engine:any){\r\n this.engine = engine\r\n this.active()\r\n }\r\n\r\n /**\r\n * 切换启用状态\r\n */\r\n public toggle(): boolean {\r\n this.enabled = !this.enabled\r\n if (this.enabled) {\r\n this.active()\r\n } else {\r\n this.disActive()\r\n }\r\n return this.enabled\r\n }\r\n\r\n /**\r\n * 获取启用状态\r\n */\r\n public isEnabled(): boolean {\r\n return this.enabled\r\n }\r\n\r\n // 激活\r\n private active(){\r\n window.addEventListener('D3ElementClick', this.listenElementClick);\r\n }\r\n // 取消\r\n private disActive(){\r\n window.removeEventListener('D3ElementClick', this.listenElementClick);\r\n }\r\n\r\n\r\n private readonly listenElementClick = (res:any) => {\r\n let id = res.detail.id.toString()\r\n // 判断一下我的模型里面有没有\r\n var node = this.engine.loaderModule2d.model.nodeMap.get(id)\r\n if(node!=null){\r\n this.engine.modelToolModule2d.highlightModel([id])\r\n \r\n this.engine.cameraModule2d.fitToExtents({\r\n min:[node[0].min.x,node[0].min.y],\r\n max:[node[0].max.x,node[0].max.y]\r\n },3);\r\n\r\n }else{\r\n this.engine.modelToolModule2d.unhighlightAllModels()\r\n }\r\n } \r\n}","import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\r\nimport * as THREE from 'three';\r\n\r\n/** 负责 2D 模型的高亮、悬浮高亮和显隐控制。 */\r\nexport class ModelToolModule2d {\r\n private engine: any;\r\n private highlightMaterial: THREE.MeshBasicMaterial;\r\n private hideMaterial: THREE.MeshBasicMaterial;\r\n private translucentMaterial: THREE.MeshBasicMaterial;\r\n private readonly lightBackgroundWhiteColor = 0x000000;\r\n private readonly darkBackgroundWhiteColor = 0xffffff;\r\n private readonly maxHoverLineCoordinateCount = 30000;\r\n private readonly maxHoverMeshVertexCount = 30000;\r\n\r\n constructor(engine_: any) {\r\n this.engine = engine_;\r\n this.highlightMaterial = new THREE.MeshBasicMaterial({\r\n color: 0x00aaff,\r\n depthTest: false,\r\n depthWrite: false,\r\n transparent: true,\r\n opacity: 0.5,\r\n side: THREE.DoubleSide,\r\n });\r\n this.hideMaterial = new THREE.MeshBasicMaterial({\r\n color: 0x000000,\r\n transparent: true,\r\n opacity: 0,\r\n side: THREE.DoubleSide,\r\n });\r\n this.translucentMaterial = new THREE.MeshBasicMaterial({\r\n color: this.getHoverHighlightColor(),\r\n depthTest: false,\r\n depthWrite: false,\r\n transparent: true,\r\n opacity: 0.5,\r\n side: THREE.DoubleSide,\r\n });\r\n\r\n this.highlightMaterial.clippingPlanes = this.engine.sectionPlane;\r\n this.hideMaterial.clippingPlanes = this.engine.sectionPlane;\r\n this.translucentMaterial.clippingPlanes = this.engine.sectionPlane;\r\n }\r\n\r\n /** 拆分合并网格,让单个子几何可以通过 materialIndex 独立高亮或隐藏。 */\r\n public split_merge_model(model: any): void {\r\n if (model.isSplit || model instanceof THREE.InstancedMesh) {\r\n return;\r\n }\r\n const material = model.materialClone.clone();\r\n const newGeometry = Array.isArray(model.geometrys) && model.geometrys.length > 0\r\n ? BufferGeometryUtils.mergeGeometries(model.geometrys, true)\r\n : model.geometry;\r\n newGeometry.groups.forEach((item: any) => {\r\n item.materialIndex = 0;\r\n });\r\n model.geometry = newGeometry;\r\n model.material = [material, this.highlightMaterial, this.translucentMaterial];\r\n model.needsUpdate = true;\r\n model.isSplit = true;\r\n }\r\n\r\n public un_split_merge_model(_model: any): void {}\r\n\r\n /** 分组加载后 nodeMap 直接保存真实对象;旧索引只作为兼容兜底。 */\r\n private getNodeObject(node: any): any {\r\n return node?.object ?? node?.group?.children?.[node.indexes?.[0]] ?? this.engine.modelGroup.children[node.indexes?.[0]];\r\n }\r\n\r\n /** 根据 nodeMap 遍历指定模型节点。 */\r\n private forEachNode(models: any, callback: (node: any, object: any, id: any) => void): void {\r\n (models ?? []).forEach((id: any) => {\r\n const nodes = this.engine.loaderModule2d.model.nodeMap.get(String(id)) ?? this.engine.loaderModule2d.model.nodeMap.get(id);\r\n if (nodes == null) return;\r\n nodes.forEach((node: any) => {\r\n if (node == null || node.indexes == null) return;\r\n const object = this.getNodeObject(node);\r\n if (object == null) return;\r\n callback(node, object, id);\r\n });\r\n });\r\n }\r\n\r\n /** 根据当前 2D 背景亮度选择 hover 高亮色,浅色背景避免继续使用白色。 */\r\n private getHoverHighlightColor(): number {\r\n const background = this.engine.scene?.background;\r\n if (background instanceof THREE.Color) {\r\n const luminance = 0.299 * background.r + 0.587 * background.g + 0.114 * background.b;\r\n return luminance > 0.5 ? 0x66c7ff : 0xffffff;\r\n }\r\n\r\n return this.engine.themeManager?.getTheme?.() === 'light' ? 0x66c7ff : 0xffffff;\r\n }\r\n\r\n /** 白色背景下把原始白色图元显示为黑色,切回黑色背景时恢复白色。 */\r\n public updateColorsForBackground(backgroundColor: number): void {\r\n const isLightBackground = this.isLightBackground(backgroundColor);\r\n this.engine.modelGroup?.traverse?.((object: any) => {\r\n this.updateObjectMaterialColor(object, isLightBackground);\r\n this.updateVertexColors(object, isLightBackground);\r\n });\r\n }\r\n\r\n /** 图层面板和场景对象共享同一套白色转黑色规则。 */\r\n public getDisplayColor(color: number): number {\r\n return this.isCurrentBackgroundLight() && this.isWhiteColor(color) ? this.lightBackgroundWhiteColor : color;\r\n }\r\n\r\n private updateObjectMaterialColor(object: any, isLightBackground: boolean): void {\r\n const originalColor = this.resolveOriginalColor(object);\r\n if (originalColor == null || !this.isWhiteColor(originalColor)) return;\r\n\r\n const displayColor = isLightBackground ? this.lightBackgroundWhiteColor : this.darkBackgroundWhiteColor;\r\n const applyColor = (material: any): void => {\r\n if (material?.color) material.color.setHex(displayColor);\r\n };\r\n\r\n if (Array.isArray(object.material)) object.material.forEach(applyColor);\r\n else applyColor(object.material);\r\n applyColor(object.materialClone);\r\n }\r\n\r\n private updateVertexColors(object: any, isLightBackground: boolean): void {\r\n const geometry = object.geometry as THREE.BufferGeometry | undefined;\r\n const colorAttribute = geometry?.getAttribute('color') as THREE.BufferAttribute | undefined;\r\n if (!geometry || !colorAttribute) return;\r\n\r\n if (!object.userData.originalColorAttribute) {\r\n object.userData.originalColorAttribute = colorAttribute.clone();\r\n }\r\n\r\n const source = object.userData.originalColorAttribute as THREE.BufferAttribute;\r\n const values = colorAttribute.array as ArrayLike<number> & { [index: number]: number };\r\n for (let index = 0; index < source.count; index += 1) {\r\n const r = source.getX(index);\r\n const g = source.getY(index);\r\n const b = source.getZ(index);\r\n const replaceWhite = isLightBackground && this.isWhiteRgb(r, g, b);\r\n values[index * 3] = replaceWhite ? 0 : r;\r\n values[index * 3 + 1] = replaceWhite ? 0 : g;\r\n values[index * 3 + 2] = replaceWhite ? 0 : b;\r\n }\r\n colorAttribute.needsUpdate = true;\r\n }\r\n\r\n private resolveOriginalColor(object: any): number | null {\r\n if (typeof object.userData?.originalDisplayColor === 'number') return object.userData.originalDisplayColor;\r\n\r\n const [layerName, colorText] = String(object.name ?? '').split('||');\r\n let color = Number.parseInt(colorText);\r\n if (color === 0 || Number.isNaN(color)) {\r\n const layer = this.engine.loaderModule2d?.model?.layers?.find((item: any) => item.name === layerName);\r\n color = layer?.color;\r\n }\r\n if (typeof color !== 'number' || Number.isNaN(color)) return null;\r\n\r\n object.userData.originalDisplayColor = color;\r\n return color;\r\n }\r\n\r\n private isCurrentBackgroundLight(): boolean {\r\n const background = this.engine.scene?.background;\r\n if (background instanceof THREE.Color) {\r\n return 0.299 * background.r + 0.587 * background.g + 0.114 * background.b > 0.5;\r\n }\r\n return this.engine.themeManager?.getTheme?.() === 'light';\r\n }\r\n\r\n private isLightBackground(backgroundColor: number): boolean {\r\n const color = new THREE.Color(backgroundColor);\r\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b > 0.5;\r\n }\r\n\r\n private isWhiteColor(color: number): boolean {\r\n return (color & 0xffffff) === 0xffffff;\r\n }\r\n\r\n private isWhiteRgb(r: number, g: number, b: number): boolean {\r\n return r > 0.99 && g > 0.99 && b > 0.99;\r\n }\r\n\r\n public highlightModelHover(models: any[]): void {\r\n models = this.filterVisibleLayerModels(models);\r\n models = this.filterHoverableModels(models);\r\n this.unHighlightModelHover();\r\n if (models.length === 0) return;\r\n this.engine.engineStatus2d.highlightHoverModels = models;\r\n this.translucentMaterial.color.setHex(this.getHoverHighlightColor());\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const line: any = object;\r\n const ps = line.clonePoints.slice(node.indexes[1], node.indexes[2]);\r\n this.highLightRenderLineHover(ps);\r\n } else {\r\n // 面、文字、填充等大图块 hover 只切换 group 材质索引,避免每次悬浮都复制大段 geometry。\r\n this.split_merge_model(object);\r\n const group = object.geometry?.groups?.[node.indexes[1]];\r\n if (group) group.materialIndex = 2;\r\n }\r\n });\r\n }\r\n\r\n public unHighlightModelHover(): void {\r\n const hoverModels = this.engine.engineStatus2d.highlightHoverModels ?? [];\r\n const selectedIds = new Set((this.engine.engineStatus2d.highlightModels ?? []).map((id: any) => String(id)));\r\n this.forEachNode(hoverModels, (node, object, id) => {\r\n if (object instanceof THREE.LineSegments) return;\r\n const group = object.geometry?.groups?.[node.indexes[1]];\r\n if (!group) return;\r\n group.materialIndex = selectedIds.has(String(id)) ? 1 : 0;\r\n });\r\n this.engine.engineStatus2d.highlightHoverModels = [];\r\n this.unhighLightRenderLineHover();\r\n }\r\n\r\n /** 设置模型高亮。 */\r\n public highlightModel(models: any): void {\r\n models = this.filterVisibleLayerModels(models);\r\n if (models.length === 0) return;\r\n this.unHighlightModelHover();\r\n this.engine.engineStatus2d.highlightModels = models;\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const line: any = object;\r\n const ps = line.clonePoints.slice(node.indexes[1], node.indexes[2]);\r\n this.highLightRenderLine(ps);\r\n } else {\r\n this.split_merge_model(object);\r\n object.geometry.groups[node.indexes[1]].materialIndex = 1;\r\n }\r\n });\r\n }\r\n\r\n /** 取消指定模型高亮。 */\r\n public unhighlightModel(models: any): void {\r\n this.forEachNode(models, (node, object) => {\r\n if (!(object instanceof THREE.LineSegments)) {\r\n object.geometry.groups[node.indexes[1]].materialIndex = 0;\r\n }\r\n });\r\n this.unhighLightRenderLine();\r\n }\r\n\r\n /** 取消全部模型高亮。 */\r\n public unhighlightAllModels(isClear: boolean = true): void {\r\n this.engine.engineStatus2d.highlightModels.forEach((model: any) => {\r\n this.unhighlightModel([model]);\r\n });\r\n if (isClear) {\r\n this.engine.engineStatus2d.highlightModels = [];\r\n }\r\n }\r\n\r\n /** 隐藏模型。 */\r\n public hideModel(models: any): void {\r\n this.unhighlightAllModels();\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const positions = object.geometry.attributes.position.array;\r\n for (let index = node.indexes[1]; index < node.indexes[2]; index += 1) {\r\n positions[index] = NaN;\r\n }\r\n object.geometry.attributes.position.needsUpdate = true;\r\n } else {\r\n this.split_merge_model(object);\r\n object.geometry.groups[node.indexes[1]].materialIndex = -1;\r\n }\r\n });\r\n this.engine.engineStatus2d.hideModels.push(...models);\r\n }\r\n\r\n /** 显示模型。 */\r\n public showModel(models: any): void {\r\n this.forEachNode(models, (node, object) => {\r\n if (object instanceof THREE.LineSegments) {\r\n const positions = object.geometry.attributes.position.array;\r\n const line: any = object;\r\n for (let index = node.indexes[1]; index < node.indexes[2]; index += 1) {\r\n positions[index] = line.clonePoints[index];\r\n }\r\n object.geometry.attributes.position.needsUpdate = true;\r\n } else {\r\n this.split_merge_model(object);\r\n object.geometry.groups[node.indexes[1]].materialIndex = 0;\r\n }\r\n });\r\n this.engine.engineStatus2d.hideModels = [];\r\n }\r\n\r\n /** 显示所有模型,恢复隐藏和高亮状态。 */\r\n public showAllModels(): void {\r\n if (this.engine.engineStatus2d.hideModels && this.engine.engineStatus2d.hideModels.length > 0) {\r\n this.showModel(this.engine.engineStatus2d.hideModels);\r\n }\r\n this.engine.engineStatus2d.hideModels = [];\r\n this.unhighlightAllModels();\r\n }\r\n\r\n /** 渲染线段高亮覆盖层。 */\r\n public highLightRenderLine(ps: ArrayLike<number>): void {\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(ps, 3));\r\n const material = new THREE.LineBasicMaterial({\r\n color: 0x00aaff,\r\n depthTest: false,\r\n depthWrite: false,\r\n });\r\n const lines = new THREE.LineSegments(geometry, material);\r\n lines.name = 'HighLight';\r\n lines.renderOrder = 999;\r\n this.engine.modelGroup.add(lines);\r\n }\r\n\r\n public unhighLightRenderLine(): void {\r\n this.engine.modelGroup.children.filter((child: any) => child.name === 'HighLight').forEach((child: any) => {\r\n this.engine.modelGroup.remove(child);\r\n this.disposeTemporaryObject(child);\r\n });\r\n }\r\n\r\n /** 渲染悬浮线段高亮覆盖层。 */\r\n public highLightRenderLineHover(ps: ArrayLike<number>): void {\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(ps, 3));\r\n const material = new THREE.LineBasicMaterial({\r\n color: this.getHoverHighlightColor(),\r\n depthTest: false,\r\n depthWrite: false,\r\n });\r\n const lines = new THREE.LineSegments(geometry, material);\r\n lines.name = 'HighLightHover';\r\n lines.renderOrder = 999;\r\n this.engine.modelGroup.add(lines);\r\n }\r\n\r\n public unhighLightRenderLineHover(): void {\r\n this.engine.modelGroup.children.filter((child: any) => child.name === 'HighLightHover').forEach((child: any) => {\r\n this.engine.modelGroup.remove(child);\r\n this.disposeTemporaryObject(child);\r\n });\r\n }\r\n\r\n /** 移除临时高亮对象时同步释放几何和材质,避免交互后内存残留。 */\r\n private disposeTemporaryObject(object: any): void {\r\n object.geometry?.dispose?.();\r\n const material = object.material;\r\n const disposeMaterial = (item: any): void => {\r\n if (item === this.highlightMaterial || item === this.translucentMaterial || item === this.hideMaterial) return;\r\n item?.dispose?.();\r\n };\r\n if (Array.isArray(material)) material.forEach(disposeMaterial);\r\n else disposeMaterial(material);\r\n }\r\n\r\n /** 图层隐藏的图元不能再被 hover 或选中高亮。 */\r\n private filterVisibleLayerModels(models: any[]): any[] {\r\n return (models ?? []).filter((id: any) => this.engine.layerManager?.isModelVisibleByLayer?.(id) !== false);\r\n }\r\n\r\n /** 过大的图块跳过 hover 高亮,保留点击选中,避免大几何在鼠标移动中反复触发高成本操作。 */\r\n private filterHoverableModels(models: any[]): any[] {\r\n return (models ?? []).filter((id: any) => this.isHoverableModel(id));\r\n }\r\n\r\n private isHoverableModel(id: any): boolean {\r\n const nodes = this.engine.loaderModule2d.model.nodeMap.get(String(id)) ?? this.engine.loaderModule2d.model.nodeMap.get(id);\r\n if (!nodes || nodes.length === 0) return false;\r\n\r\n let lineCoordinateCount = 0;\r\n let meshVertexCount = 0;\r\n for (const node of nodes) {\r\n if (node == null || node.indexes == null) continue;\r\n const object = this.getNodeObject(node);\r\n if (object instanceof THREE.LineSegments) {\r\n lineCoordinateCount += Math.max(0, (node.indexes[2] ?? 0) - (node.indexes[1] ?? 0));\r\n if (lineCoordinateCount > this.maxHoverLineCoordinateCount) return false;\r\n continue;\r\n }\r\n\r\n const group = object?.geometry?.groups?.[node.indexes[1]];\r\n meshVertexCount += group?.count ?? 0;\r\n if (meshVertexCount > this.maxHoverMeshVertexCount) return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","import * as THREE from 'three';\n/**\r\n * 行为处理器 - 管理引擎的交互行为(鼠标、键盘事件等)\r\n * @param engine 引擎实例\r\n * @returns 行为处理器对象\r\n */\r\nexport function HandelBehaved2d(engine: any) {\r\n\r\n\t// 行为处理器内部状态\r\n\tconst _handelBehaved: any = {\n\t\tmouseMoveFrame: null as number | null,\n\t\tlatestMouseMoveEvent: null as any,\n\t\tself: null as any, // 当前激活的行为对象\r\n\t\toptions: null as any, // 行为配置选项\r\n\t\tmouseDownTime: 0, // 鼠标按下时的时间戳\r\n\t\tmouseDownPosition:null, // 鼠标按下的位置\r\n\t\tlastClickTime: 0, // 上次点击时间\r\n\t};\r\n\r\n\t/**\r\n\t * 初始化行为处理器\r\n\t * @param self 要激活的行为对象\r\n\t * @param options 行为配置选项\r\n\t */\r\n\t_handelBehaved.init = function(self: any, options: any): void {\r\n\t\t// 关闭上一个功能\r\n\t\tif (_handelBehaved.self != null && _handelBehaved.self.disActive != null&&_handelBehaved.self.type!=self.type) {\r\n\t\t\t_handelBehaved.self.disActive();\r\n\t\t}\r\n\t\t_handelBehaved.self = self;\r\n\t\t// 一些基本配置\r\n\t\tif(options == null){\r\n\t\t\toptions = {\r\n\t\t\t\tshowCatch: false,\r\n\t\t\t}\r\n\t\t}\r\n\t\t_handelBehaved.options = options;\r\n\t};\r\n\r\n\t/**\r\n\t * 刷帧 - 调用当前行为对象的渲染方法\r\n\t */\r\n\t_handelBehaved.render = function(): void {\r\n\t\tif (_handelBehaved.self && _handelBehaved.self.render != null) {\r\n\t\t\t_handelBehaved.self.render();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * 开启事务 - 激活事件监听(同时支持桌面端和移动端)\r\n\t */\r\n\t_handelBehaved.active = function(): void { \r\n\t\t// 恢复控制器 - 桌面端鼠标事件\r\n\t\tengine.renderer.domElement.addEventListener('mousedown', handle_Mouse_Down);\r\n\t\tengine.renderer.domElement.addEventListener('mouseup', handle_Mouse_Up);\r\n\t\tengine.renderer.domElement.addEventListener('mousemove', handle_Mouse_Move); \r\n\t\t// 移动端触摸事件\r\n\t\tengine.renderer.domElement.addEventListener('touchstart', handle_Touch_Start, { passive: false });\r\n\t\tengine.renderer.domElement.addEventListener('touchend', handle_Touch_End, { passive: false });\r\n\t\tengine.renderer.domElement.addEventListener('touchmove', handle_Touch_Move, { passive: false });\r\n\t\t// 键盘事件\r\n\t\twindow.addEventListener('keydown', handle_key_down);\r\n\t\twindow.addEventListener('keyup', handle_key_up);\r\n\t};\r\n\r\n\t/**\r\n\t * 关闭事务 - 禁用事件监听(同时支持桌面端和移动端)\r\n\t */\r\n\t_handelBehaved.disActive = function(): void {\r\n\t\t// 禁用控制器 - 桌面端鼠标事件\r\n\t\tengine.renderer.domElement.removeEventListener('mousedown', handle_Mouse_Down);\r\n\t\tengine.renderer.domElement.removeEventListener('mouseup', handle_Mouse_Up);\r\n\t\tengine.renderer.domElement.removeEventListener('mousemove', handle_Mouse_Move);\r\n\t\t// 移动端触摸事件\r\n\t\tengine.renderer.domElement.removeEventListener('touchstart', handle_Touch_Start);\r\n\t\tengine.renderer.domElement.removeEventListener('touchend', handle_Touch_End);\r\n\t\tengine.renderer.domElement.removeEventListener('touchmove', handle_Touch_Move);\r\n\t\t// 键盘事件\r\n\t\twindow.removeEventListener('keydown', handle_key_down);\r\n\t\twindow.removeEventListener('keyup', handle_key_up); \n\t\tif (_handelBehaved.mouseMoveFrame != null) {\n\t\t\tcancelAnimationFrame(_handelBehaved.mouseMoveFrame);\n\t\t\t_handelBehaved.mouseMoveFrame = null;\n\t\t\t_handelBehaved.latestMouseMoveEvent = null;\n\t\t}\n\t};\n\r\n\t/**\r\n\t * 处理键盘按下事件\r\n\t * @param event 键盘事件对象\r\n\t */\r\n\tfunction handle_key_down(event: any): void {\r\n\t\t// 处理删除键(Backspace: 8, Delete: 46)\r\n\t\tif (event.keyCode === 8 || event.keyCode === 46) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyDeleteDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyDeleteDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// esc\r\n\t\tif (event.keyCode === 27) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyEscDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyEscDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// enter\r\n\t\tif (event.keyCode === 13) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyEnterDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyEnterDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// space\r\n\t\tif (event.keyCode === 32) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeySpaceDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeySpaceDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// ctrl\r\n\t\tif (event.key === 'Control') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyCtrlDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyCtrlDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// delete\r\n\t\tif (event.key === 'Delete') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyDeleteDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyDeleteDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// shift\r\n\t\tif (event.key === 'Shift') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyShiftDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyShiftDown();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// meta\r\n\t\tif (event.key === 'Meta') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyMetaDown != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyMetaDown();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfunction handle_key_up(event: any): void { \r\n\t\t// alt\r\n\t\tif (event.key === 'Alt') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyAltUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyAltUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// tab\r\n\t\tif (event.key === 'Tab') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyTabUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyTabUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// ctrl\r\n\t\tif (event.key === 'Control') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyCtrlUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyCtrlUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// shift\r\n\t\tif (event.key === 'Shift') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyShiftUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyShiftUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// meta\r\n\t\tif (event.key === 'Meta') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyMetaUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyMetaUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// command\r\n\t\tif (event.key === 'Command') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyCommandUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyCommandUp();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// windows\r\n\t\tif (event.key === 'Windows') {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handelKeyWindowsUp != null) {\r\n\t\t\t\t_handelBehaved.self.handelKeyWindowsUp();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * 将鼠标事件坐标转换为标准化设备坐标(NDC)\r\n\t * @param event 鼠标事件对象\r\n\t * @returns 标准化后的鼠标坐标\r\n\t */\r\n\tfunction getNormalizedMousePosition(event: any): THREE.Vector2 {\r\n\t\tconst mouse = new THREE.Vector2();\r\n\t\tconst width = engine.renderer.domElement.clientWidth;\r\n\t\tconst height = engine.renderer.domElement.clientHeight;\r\n\t\tmouse.x = (event.offsetX / width) * 2 - 1;\r\n\t\tmouse.y = -(event.offsetY / height) * 2 + 1; \r\n\t\treturn mouse;\r\n\t}\r\n\r\n\t/**\r\n\t * 创建射线投射器并设置从相机到鼠标位置的射线\r\n\t * @param event 鼠标事件对象\r\n\t * @returns 配置好的射线投射器\r\n\t */\r\n\tfunction createRaycaster(event: any): THREE.Raycaster {\r\n\t\tconst raycaster = new THREE.Raycaster();\r\n\t\tconst mouse = getNormalizedMousePosition(event);\r\n\t\traycaster.setFromCamera(mouse, engine.camera);\r\n\t\treturn raycaster;\r\n\t}\r\n\r\n\t/**\r\n\t * 为事件对象添加射线投射器和捕捉结果\r\n\t * @param event 鼠标事件对象\r\n\t * @param includeCatch 是否包含捕捉结果\r\n\t */\r\n\tfunction enrichEventWithRaycast(event: any, includeCatch: boolean = false): void {\r\n\t\tconst raycaster = createRaycaster(event);\r\n\t\tevent.raycaster = raycaster;\r\n\t\tif (includeCatch) {\r\n\t\t\tconst catchResult = handle_catch(raycaster,event);\r\n\t\t\tevent.catch = catchResult;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 鼠标按下事件处理\r\n\t * @param event 鼠标事件对象\r\n\t */\r\n\tfunction handle_Mouse_Down(event: any): void {\r\n\t\t// 只处理左键(button === 0)\r\n\t\tif (event.button !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// 记录鼠标按下的时间\r\n\t\t_handelBehaved.mouseDownTime = Date.now();\r\n\t\t_handelBehaved.mouseDownPosition = new THREE.Vector3(event.offsetX,event.offsetY,0)\r\n\t\t \r\n\r\n\r\n\t\t// 如果当前行为对象有处理鼠标按下的方法,则调用\r\n\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseDown != null) { \r\n\t\t\tengine.engineStatus.isFree = true\r\n\t\t\tenrichEventWithRaycast(event, true); \r\n\t\t\tif(event.catch!=null){\r\n\t\t\t\tengine.controlModule.orbitControls.origin.set(event.catch.point.x,event.catch.point.y,event.catch.point.z)\r\n\t\t\t}\r\n\t\t\t_handelBehaved.self.handleMouseDown(event); \r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 鼠标移动事件处理\r\n\t * @param event 鼠标事件对象\r\n\t */\r\n\tfunction handle_Mouse_Move(event: any): void {\n\t\t_handelBehaved.latestMouseMoveEvent = event;\n\t\tif (_handelBehaved.mouseMoveFrame != null) return;\n\n\t\t// hover 拾取和高亮成本较高,合并到每帧最多执行一次,避免大图块在高频 mousemove 下阻塞主线程。\n\t\t_handelBehaved.mouseMoveFrame = requestAnimationFrame(() => {\n\t\t\tconst currentEvent = _handelBehaved.latestMouseMoveEvent;\n\t\t\t_handelBehaved.latestMouseMoveEvent = null;\n\t\t\t_handelBehaved.mouseMoveFrame = null;\n\t\t\tif (!currentEvent) return;\n\n\t\t\tcurrentEvent.isHover = true;\n\t\t\tenrichEventWithRaycast(currentEvent, true);\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseMove != null) {\n\t\t\t\t_handelBehaved.self.handleMouseMove(currentEvent);\n\t\t\t}\n\t\t});\n\t\treturn;\n\t}\n\r\n\t/**\r\n\t * 鼠标弹起事件处理\r\n\t * @param event 鼠标事件对象\r\n\t */\r\n\tfunction handle_Mouse_Up(event: any): void {\r\n\t\t// 只处理左键(button === 0)\r\n\t\tif (event.button !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// 计算鼠标按下到弹起的时间差\r\n\t\tconst nowTime = Date.now();\r\n\t\tconst timeDiff = nowTime - _handelBehaved.mouseDownTime;\r\n\t\tconst current_position = new THREE.Vector3(event.offsetX,event.offsetY,0)\r\n\t\t\r\n\t\t// 如果当前行为对象有处理鼠标弹起的方法,则调用\r\n\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseUp != null) {\r\n\t\t\tenrichEventWithRaycast(event, false);\r\n\t\t\t_handelBehaved.self.handleMouseUp(event);\r\n\t\t}\r\n\t\tconst dis = current_position.distanceTo(_handelBehaved.mouseDownPosition); \r\n\t\t// 判断是否为单击(按下到弹起的时间小于100毫秒)\r\n\t\tif (timeDiff < 100 || dis==0) {\r\n\t\t\tif (_handelBehaved.self && _handelBehaved.self.handleMouseClick != null) {\r\n\t\t\t\tenrichEventWithRaycast(event, true); \r\n\t\t\t\tconst timeDiff_double = nowTime - _handelBehaved.lastClickTime; \r\n\t\t\t\tif(timeDiff_double < 200) { \r\n\t\t\t\t\t// 双击\r\n\t\t\t\t\tif(_handelBehaved.self.handleMouseDoubleClick != null){\r\n\t\t\t\t\t\t_handelBehaved.self.handleMouseDoubleClick(event);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse{ \r\n\t\t\t\t\t// 单击\r\n\t\t\t\t\tif(_handelBehaved.self.handleMouseClick != null){ \r\n\t\t\t\t\t\t_handelBehaved.self.handleMouseClick(event);\r\n\t\t\t\t\t}\r\n\t\t\t\t} \r\n\t\t\t\t_handelBehaved.lastClickTime = Date.now();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 将触摸事件转换为鼠标事件格式\r\n\t * @param touchEvent 触摸事件对象\r\n\t * @returns 转换后的鼠标事件格式对象\r\n\t */\r\n\tfunction convertTouchToMouseEvent(touchEvent: TouchEvent): any {\r\n\t\t// 获取第一个触摸点\r\n\t\tconst touch = touchEvent.touches[0] || touchEvent.changedTouches[0];\r\n\t\tif (!touch) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// 获取 canvas 元素的位置信息\r\n\t\tconst canvas = engine.renderer.domElement;\r\n\t\tconst rect = canvas.getBoundingClientRect();\r\n\r\n\t\t// 计算相对于 canvas 的坐标\r\n\t\tconst offsetX = touch.clientX - rect.left;\r\n\t\tconst offsetY = touch.clientY - rect.top;\r\n\r\n\t\t// 创建类似鼠标事件的对象\r\n\t\tconst mouseEvent = {\r\n\t\t\toffsetX: offsetX,\r\n\t\t\toffsetY: offsetY,\r\n\t\t\tbutton: 0, // 模拟左键\r\n\t\t\tclientX: touch.clientX,\r\n\t\t\tclientY: touch.clientY,\r\n\t\t\tpreventDefault: () => touchEvent.preventDefault(),\r\n\t\t\tstopPropagation: () => touchEvent.stopPropagation(),\r\n\t\t\toriginalEvent: touchEvent // 保留原始触摸事件\r\n\t\t};\r\n\r\n\t\treturn mouseEvent;\r\n\t}\r\n\r\n\t/**\r\n\t * 触摸开始事件处理(移动端)\r\n\t * @param event 触摸事件对象\r\n\t */\r\n\tfunction handle_Touch_Start(event: TouchEvent): void {\r\n\t\t// 阻止默认行为,避免页面滚动\r\n\t\tevent.preventDefault();\r\n\t\t\r\n\t\t// 只处理单点触摸\r\n\t\tif (event.touches.length !== 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// 将触摸事件转换为鼠标事件格式\r\n\t\tconst mouseEvent = convertTouchToMouseEvent(event);\r\n\t\tif (mouseEvent) {\r\n\t\t\t// 调用鼠标按下处理函数\r\n\t\t\thandle_Mouse_Down(mouseEvent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 触摸移动事件处理(移动端)\r\n\t * @param event 触摸事件对象\r\n\t */\r\n\tfunction handle_Touch_Move(event: TouchEvent): void {\r\n\t\t// 阻止默认行为,避免页面滚动\r\n\t\tevent.preventDefault();\r\n\t\t\r\n\t\t// 只处理单点触摸\r\n\t\tif (event.touches.length !== 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// 将触摸事件转换为鼠标事件格式\r\n\t\tconst mouseEvent = convertTouchToMouseEvent(event);\r\n\t\tif (mouseEvent) {\r\n\t\t\t// 调用鼠标移动处理函数\r\n\t\t\thandle_Mouse_Move(mouseEvent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 触摸结束事件处理(移动端)\r\n\t * @param event 触摸事件对象\r\n\t */\r\n\tfunction handle_Touch_End(event: TouchEvent): void {\r\n\t\t// 阻止默认行为\r\n\t\tevent.preventDefault();\r\n\t\t\r\n\t\t// 将触摸事件转换为鼠标事件格式(使用 changedTouches,因为 touchend 时 touches 可能为空)\r\n\t\tconst mouseEvent = convertTouchToMouseEvent(event);\r\n\t\tif (mouseEvent) {\r\n\t\t\t// 调用鼠标弹起处理函数\r\n\t\t\thandle_Mouse_Up(mouseEvent);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * 捕捉功能 - 通过射线投射检测与模型的交点\r\n\t * @param raycaster 射线投射器\r\n\t * @returns 捕捉结果(包含交点和法线),如果没有交点则返回 undefined\r\n\t */\r\n\tfunction handle_catch(raycaster: any,event: any): any { \r\n\t\tvar id = engine.octreeBox2d.pick2d(raycaster,event); \n\t\tif(id==null){\r\n\t\t\treturn null\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tpoint:null,\r\n\t\t\tid:id\r\n\t\t} \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t}\r\n\treturn _handelBehaved;\r\n}\r\n","/**\r\n * 鼠标坐标显示 UI 组件\r\n * 在容器左下角实时显示鼠标世界坐标\r\n */\r\nexport class MouseCoordUI {\r\n private el: HTMLElement;\r\n private xEl: HTMLElement;\r\n private yEl: HTMLElement;\r\n\r\n constructor(container: HTMLElement) {\r\n this.el = document.createElement('div');\r\n this.el.className = 'engine-2d-mouse-coord';\r\n\r\n const label = document.createElement('span');\r\n label.className = 'engine-2d-mouse-coord__label';\r\n label.textContent = '';\r\n\r\n this.xEl = document.createElement('span');\r\n this.xEl.className = 'engine-2d-mouse-coord__value';\r\n this.xEl.textContent = 'X: --';\r\n\r\n this.yEl = document.createElement('span');\r\n this.yEl.className = 'engine-2d-mouse-coord__value';\r\n this.yEl.textContent = 'Y: --';\r\n\r\n this.el.appendChild(label);\r\n this.el.appendChild(this.xEl);\r\n this.el.appendChild(this.yEl);\r\n\r\n container.appendChild(this.el);\r\n }\r\n\r\n public update(x: number, y: number): void {\r\n this.xEl.textContent = `X: ${x.toFixed(0)} mm`;\r\n this.yEl.textContent = `Y: ${y.toFixed(0)} mm`;\r\n }\r\n\r\n public reset(): void {\r\n this.xEl.textContent = 'X: --';\r\n this.yEl.textContent = 'Y: --';\r\n }\r\n\r\n public dispose(): void {\r\n this.el.parentElement?.removeChild(this.el);\r\n }\r\n}\r\n","/**\r\n * 事件类型枚举\r\n */\r\nexport enum EventType {\r\n // 资源类\r\n ModelLoadStart = 'model-load-start',\r\n ModelLoadProgress = 'model-load-progress',\r\n ModelLoaded = 'model-loaded',\r\n ModelError = 'model-error',\r\n\r\n // 交互类\r\n SelectionChanged = 'selection-changed', // data: { ids: string[], modelId: string }\r\n HoverChanged = 'hover-changed', // data: { id: string | null, point: Vector3 }\r\n Click = 'click', // data: MouseEventData\r\n MouseMove = 'mouse-move', // data: MouseEventData - 鼠标移动事件\r\n\r\n // 视图类\r\n CameraChanged = 'camera-changed', // 相机移动时持续触发\r\n CameraIdle = 'camera-idle', // 相机静止后触发\r\n\r\n // 引擎状态\r\n EngineFree = 'engine-free',\r\n EngineBusy = 'engine-busy',\r\n\r\n\r\n // 业务类\r\n // 测量值变化\r\n MeasureChanged = 'measure-changed',\r\n MeasureClick = \"measure-click\",\r\n // 剖切值变化\r\n SectionMove = \"section-move\"\r\n}","import { MouseCoordUI } from '../ui/mouseCoordUI';\r\nimport { EventType } from '../enum/eventType';\r\nexport class InteractionModule2d {\r\n private engine: any;\r\n private behavior: any;\r\n private mouseCoordUI: MouseCoordUI | null = null;\r\n\r\n constructor(engine: any){\r\n this.engine = engine;\r\n }\r\n\r\n\r\n public init(){\r\n this.behavior = this.engine.handelBehaved2d;\r\n this.behavior.init(this)\r\n\r\n const container = this.engine.container as HTMLElement;\r\n // 坐标状态栏默认开启,宿主可在初始化时关闭。\r\n if (container && this.engine.options?.showMouseCoordinates !== false) {\r\n this.mouseCoordUI = new MouseCoordUI(container);\r\n }\r\n }\r\n\r\n\r\n public active(){\r\n this.behavior.active();\r\n }\r\n\r\n public disActive(){\r\n this.behavior.disActive();\r\n }\r\n\r\n // 鼠标移动时,触发模型高亮\r\n private oldId = null\r\n public handleMouseMove(event: any){\r\n if (this.mouseCoordUI && this.engine.cameraModule2d) {\r\n const world = this.engine.cameraModule2d.screenToWorld(event.offsetX, event.offsetY);\r\n this.mouseCoordUI.update(world.x*1000, world.y*1000);\r\n }\r\n // 实现悬浮特效\r\n if(event.catch==null || event.catch.id==null){\r\n this.engine.modelToolModule2d.unHighlightModelHover()\r\n this.oldId =null\r\n return;\r\n }\r\n // 准备高亮模型\r\n let id = event.catch.id;\r\n if (!this.isModelInteractive(id)) {\r\n this.engine.modelToolModule2d.unHighlightModelHover()\r\n this.oldId = null\r\n return\r\n }\r\n if(this.oldId==id){\r\n return\r\n }else{\r\n this.engine.modelToolModule2d.highlightModelHover([id]);\r\n this.oldId = id;\r\n } \r\n }\r\n\r\n // esc 按下,取消高亮\r\n public handelKeyEscDown(_event:any){\r\n this.engine.modelToolModule2d.unhighlightAllModels() \r\n }\r\n\r\n /** 空白处双击恢复到整图适配视角,不影响双击图元的后续扩展。 */\r\n public handleMouseDoubleClick(event: any){\r\n if(event.catch!=null && event.catch.id!=null){\r\n return\r\n }\r\n this.engine.modelToolModule2d.unHighlightModelHover()\r\n this.engine.modelToolModule2d.unhighlightAllModels()\r\n this.engine.fitToView()\r\n }\r\n\r\n\r\n // 业务功能-监听鼠标谈起,点选模型\r\n public handleMouseClick(event: any){ \r\n if(event.catch!=null && this.isModelInteractive(event.catch.id)){ \r\n this.engine.modelToolModule2d.highlightModel([event.catch.id]); \r\n this.engine.events.trigger(EventType.Click, event.catch.id); \r\n\r\n let e = new CustomEvent('D2ElementClick', {\r\n detail: { id:event.catch.id}\r\n });\r\n window.dispatchEvent(e);\r\n\r\n }else{\r\n this.engine.modelToolModule2d.unhighlightAllModels();\r\n\r\n let e = new CustomEvent('D2ElementClick', {\r\n detail: { id:-1}\r\n });\r\n window.dispatchEvent(e);\r\n } \r\n }\r\n\r\n /** 图层隐藏的图元不允许 hover 高亮和点击选中。 */\r\n private isModelInteractive(id: any): boolean {\r\n return this.engine.layerManager?.isModelVisibleByLayer?.(id) !== false;\r\n }\r\n\r\n public dispose(): void {\r\n this.mouseCoordUI?.dispose();\r\n this.mouseCoordUI = null;\r\n }\r\n}\r\n","/**\n * CAD 风格十字光标 UI 组件。\n */\nimport type { CadCursorStyle2d } from '../types/entityTypes';\n\nexport class CadCursorUI {\n private overlay: HTMLElement;\n private hLine: HTMLElement;\n private vLine: HTMLElement;\n private box: HTMLElement;\n private canvas: HTMLElement;\n private container: HTMLElement;\n private readonly style: CadCursorStyle2d;\n\n constructor(container: HTMLElement, canvas: HTMLElement, style: CadCursorStyle2d = 'full-crosshair') {\n this.container = container;\n this.canvas = canvas;\n this.style = style;\n\n canvas.style.cursor = 'none';\n\n this.overlay = document.createElement('div');\n this.overlay.className = `engine-2d-cad-cursor engine-2d-cad-cursor--${style}`;\n\n this.hLine = document.createElement('div');\n this.hLine.className = 'engine-2d-cad-cursor__h';\n\n this.vLine = document.createElement('div');\n this.vLine.className = 'engine-2d-cad-cursor__v';\n\n this.box = document.createElement('div');\n this.box.className = 'engine-2d-cad-cursor__box';\n\n this.overlay.appendChild(this.hLine);\n this.overlay.appendChild(this.vLine);\n this.overlay.appendChild(this.box);\n container.appendChild(this.overlay);\n\n this.hide();\n this.bindEvents();\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener('mousemove', this.onMouseMove);\n this.canvas.addEventListener('mouseenter', this.onMouseEnter);\n this.canvas.addEventListener('mouseleave', this.onMouseLeave);\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n this.hLine.style.top = `${y}px`;\n this.vLine.style.left = `${x}px`;\n\n // 短十字架需要同时更新横线和竖线的中心点。\n if (this.style === 'short-crosshair') {\n this.hLine.style.left = `${x}px`;\n this.vLine.style.top = `${y}px`;\n }\n\n this.box.style.left = `${x}px`;\n this.box.style.top = `${y}px`;\n };\n\n private onMouseEnter = (): void => {\n this.show();\n };\n\n private onMouseLeave = (): void => {\n this.hide();\n };\n\n private show(): void {\n this.overlay.style.visibility = 'visible';\n }\n\n private hide(): void {\n this.overlay.style.visibility = 'hidden';\n }\n\n /** 根据画布背景亮度反转十字光标颜色,保证黑白背景下都有足够对比度。 */\n public setBackgroundColor(color: number): void {\n const r = (color >> 16) & 255;\n const g = (color >> 8) & 255;\n const b = color & 255;\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n const cursorColor = luminance < 0.5 ? 'rgba(255,255,255,0.85)' : 'rgba(0,0,0,0.75)';\n\n this.container.style.setProperty('--e2d-cursor', cursorColor);\n }\n\n public dispose(): void {\n this.canvas.removeEventListener('mousemove', this.onMouseMove);\n this.canvas.removeEventListener('mouseenter', this.onMouseEnter);\n this.canvas.removeEventListener('mouseleave', this.onMouseLeave);\n this.canvas.style.cursor = '';\n this.overlay.parentElement?.removeChild(this.overlay);\n }\n}\n","/**\n * 右键菜单 UI 组件。\n */\n\nexport type ContextMenuAction =\n | 'hideElement'\n | 'showAll'\n | 'hideLayer'\n | 'showAllLayers'\n | 'search'\n | 'layerManage'\n | 'linkElement2d3d'\n | 'linkView2d3d'\n | 'toggleBg';\n\nexport interface ContextMenuItem {\n action: ContextMenuAction;\n label: string;\n /** 分隔线显示在该项上方。 */\n dividerBefore?: boolean;\n}\n\nexport interface ContextMenuItemConfig {\n action: ContextMenuAction;\n label?: string;\n visible?: boolean;\n dividerBefore?: boolean;\n}\n\nconst MENU_ITEMS: ContextMenuItem[] = [\n { action: 'search', label: '搜索' },\n { action: 'hideElement', label: '隐藏元素', dividerBefore: true },\n { action: 'showAll', label: '显示全部' },\n { action: 'hideLayer', label: '隐藏图层', dividerBefore: true },\n { action: 'showAllLayers', label: '显示所有图层' },\n { action: 'layerManage', label: '图层管理', dividerBefore: true },\n { action: 'toggleBg', label: '切换背景' },\n { action: 'linkElement2d3d', label: '模型联动', dividerBefore: true },\n { action: 'linkView2d3d', label: '视角关联' },\n];\n\nexport type ContextMenuCallback = (action: ContextMenuAction) => void;\n\nexport class ContextMenuUI {\n private menu: HTMLElement;\n private container: HTMLElement;\n private canvas: HTMLElement;\n private onAction: ContextMenuCallback;\n private readonly menuItemStates: Map<ContextMenuAction, boolean> = new Map();\n\n constructor(\n container: HTMLElement,\n canvas: HTMLElement,\n onAction: ContextMenuCallback,\n items?: ContextMenuItemConfig[],\n ) {\n this.container = container;\n this.canvas = canvas;\n this.onAction = onAction;\n\n this.menu = this.createMenu(items);\n container.appendChild(this.menu);\n\n this.bindEvents();\n }\n\n private createMenu(items?: ContextMenuItemConfig[]): HTMLElement {\n const menu = document.createElement('div');\n menu.className = 'engine-2d-context-menu';\n\n this.resolveMenuItems(items).forEach((item) => {\n if (item.dividerBefore) {\n const divider = document.createElement('div');\n divider.className = 'engine-2d-context-menu__divider';\n menu.appendChild(divider);\n }\n\n const btn = document.createElement('div');\n btn.className = 'engine-2d-context-menu__item';\n btn.textContent = item.label;\n btn.dataset.action = item.action;\n btn.addEventListener('click', () => {\n this.hide();\n this.onAction(item.action);\n });\n menu.appendChild(btn);\n });\n\n return menu;\n }\n\n /** 按初始化配置解析菜单项顺序和显隐,未传配置时保持默认菜单。 */\n private resolveMenuItems(items?: ContextMenuItemConfig[]): ContextMenuItem[] {\n if (!items || items.length === 0) return MENU_ITEMS;\n return items\n .filter((item) => item.visible !== false)\n .map((item) => {\n const defaults = MENU_ITEMS.find((defaultItem) => defaultItem.action === item.action);\n return {\n action: item.action,\n label: item.label ?? defaults?.label ?? item.action,\n dividerBefore: item.dividerBefore ?? defaults?.dividerBefore,\n };\n });\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener('contextmenu', this.onContextMenu);\n document.addEventListener('mousedown', this.onDocMouseDown);\n document.addEventListener('keydown', this.onEscape);\n }\n\n private onContextMenu = (e: MouseEvent): void => {\n e.preventDefault();\n const rect = this.container.getBoundingClientRect();\n let x = e.clientX - rect.left;\n let y = e.clientY - rect.top;\n\n // 先显示再计算溢出,避免 menu 尺寸为 0。\n this.menu.style.left = `${x}px`;\n this.menu.style.top = `${y}px`;\n this.menu.classList.add('engine-2d-context-menu--visible');\n this.updateMenuItemStyles();\n\n const menuW = this.menu.offsetWidth;\n const menuH = this.menu.offsetHeight;\n const contW = this.container.clientWidth;\n const contH = this.container.clientHeight;\n if (x + menuW > contW) x = contW - menuW - 4;\n if (y + menuH > contH) y = contH - menuH - 4;\n this.menu.style.left = `${x}px`;\n this.menu.style.top = `${y}px`;\n };\n\n private onDocMouseDown = (e: MouseEvent): void => {\n if (!this.menu.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n private onEscape = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.hide();\n };\n\n private hide(): void {\n this.menu.classList.remove('engine-2d-context-menu--visible');\n }\n\n /** 设置菜单项状态,启用项会高亮显示。 */\n public setMenuItemState(action: ContextMenuAction, enabled: boolean): void {\n this.menuItemStates.set(action, enabled);\n }\n\n /** 批量设置菜单项状态。 */\n public setMenuItemStates(states: Partial<Record<ContextMenuAction, boolean>>): void {\n Object.entries(states).forEach(([action, enabled]) => {\n this.menuItemStates.set(action as ContextMenuAction, enabled as boolean);\n });\n }\n\n private updateMenuItemStyles(): void {\n const items = this.menu.querySelectorAll('.engine-2d-context-menu__item');\n items.forEach((item) => {\n const action = (item as HTMLElement).dataset.action as ContextMenuAction;\n const enabled = this.menuItemStates.get(action);\n\n if (enabled) {\n (item as HTMLElement).style.color = '#00e682';\n (item as HTMLElement).style.fontWeight = 'bold';\n } else {\n (item as HTMLElement).style.color = '';\n (item as HTMLElement).style.fontWeight = '';\n }\n });\n }\n\n public dispose(): void {\n this.canvas.removeEventListener('contextmenu', this.onContextMenu);\n document.removeEventListener('mousedown', this.onDocMouseDown);\n document.removeEventListener('keydown', this.onEscape);\n this.menu.parentElement?.removeChild(this.menu);\n }\n}\n","import type { LoadingStyle2d } from '../types/entityTypes';\n\n/**\n * 加载进度 UI 组件\n * 样式 1 为居中卡片,样式 2 为底部进度条。\n */\nexport class LoadingUI {\n private overlay: HTMLElement | null = null;\n private textEl: HTMLElement | null = null;\n private barEl: HTMLElement | null = null;\n private pctEl: HTMLElement | null = null;\n\n constructor(container: HTMLElement, style: LoadingStyle2d = 1) {\n this._build(container, style);\n }\n\n public show(text = '正在加载...', progress = 0): void {\n if (!this.overlay) return;\n this.overlay.style.display = 'flex';\n this._update(text, progress);\n }\n\n public update(text: string, progress: number): void {\n if (this.overlay?.style.display === 'none') return;\n this._update(text, progress);\n }\n\n public hide(): void {\n if (this.overlay) this.overlay.style.display = 'none';\n }\n\n private _update(text: string, progress: number): void {\n const pct = Math.min(100, Math.max(0, Math.round(progress)));\n if (this.textEl) this.textEl.textContent = text;\n if (this.barEl) this.barEl.style.width = `${pct}%`;\n if (this.pctEl) this.pctEl.textContent = `${pct}%`;\n }\n\n private _build(container: HTMLElement, style: LoadingStyle2d): void {\n const overlay = document.createElement('div');\n overlay.style.cssText = this._getOverlayStyle(style);\n this.overlay = overlay;\n\n const panel = style === 2 ? this._buildBottomPanel() : this._buildCardPanel();\n overlay.appendChild(panel);\n container.appendChild(overlay);\n }\n\n private _getOverlayStyle(style: LoadingStyle2d): string {\n if (style === 2) {\n return `\n position:absolute; inset:0;\n display:none; align-items:flex-end; justify-content:center;\n z-index:200; pointer-events:none;\n `;\n }\n\n return `\n position:absolute; inset:0;\n display:none; align-items:center; justify-content:center;\n z-index:200;\n `;\n }\n\n private _buildCardPanel(): HTMLElement {\n const card = document.createElement('div');\n card.style.cssText = `\n display:flex; flex-direction:column; align-items:center; gap:14px;\n padding:28px 36px;\n background:var(--e2d-bg,#1e1f22);\n border:1px solid var(--e2d-border,rgba(255,255,255,0.12));\n border-radius:8px;\n box-shadow:0 8px 32px var(--e2d-shadow-lg,rgba(0,0,0,0.65));\n min-width:200px;\n font-family:system-ui,sans-serif;\n `;\n\n // 样式 1 沿用原来的旋转加载态,保证默认视觉不变。\n const spinnerWrap = document.createElement('div');\n spinnerWrap.style.cssText = 'width:48px; height:48px;';\n spinnerWrap.innerHTML = `\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n <style>\n @keyframes _e2d_spin { to { transform: rotate(360deg); } }\n ._e2d_ring { transform-origin: 24px 24px; animation: _e2d_spin 0.9s linear infinite; }\n </style>\n <circle cx=\"24\" cy=\"24\" r=\"19\" fill=\"none\"\n stroke=\"var(--e2d-border2,#333)\" stroke-width=\"3\"/>\n <g class=\"_e2d_ring\">\n <circle cx=\"24\" cy=\"24\" r=\"19\" fill=\"none\"\n stroke=\"var(--e2d-accent,#4fc3f7)\" stroke-width=\"3\"\n stroke-dasharray=\"30 90\" stroke-linecap=\"round\"/>\n </g>\n </svg>\n `;\n\n const text = document.createElement('div');\n text.style.cssText = `\n font-size:13px; color:var(--e2d-text2,#ccc);\n text-align:center; white-space:nowrap;\n `;\n text.textContent = '正在加载...';\n this.textEl = text;\n\n const track = document.createElement('div');\n track.style.cssText = `\n width:160px; height:3px; border-radius:2px;\n background:var(--e2d-border2,#333); overflow:hidden;\n `;\n const bar = document.createElement('div');\n bar.style.cssText = `\n height:100%; width:0%; border-radius:2px;\n background:var(--e2d-accent,#4fc3f7);\n transition:width 0.25s ease;\n `;\n track.appendChild(bar);\n this.barEl = bar;\n\n const pct = document.createElement('div');\n pct.style.cssText = `\n font-size:12px; color:var(--e2d-text3,rgba(255,255,255,0.35));\n `;\n pct.textContent = '0%';\n this.pctEl = pct;\n\n card.appendChild(spinnerWrap);\n card.appendChild(text);\n card.appendChild(track);\n card.appendChild(pct);\n return card;\n }\n\n private _buildBottomPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.style.cssText = `\n width:100%;\n display:flex; flex-direction:column;\n font-family:system-ui,sans-serif;\n background:var(--e2d-float-bg,rgba(0,0,0,0.72));\n border-top:1px solid var(--e2d-float-border,rgba(255,255,255,0.10));\n box-shadow:0 -8px 24px var(--e2d-shadow,rgba(0,0,0,0.38));\n `;\n\n const row = document.createElement('div');\n row.style.cssText = `\n min-height:34px;\n display:flex; align-items:center; justify-content:space-between; gap:16px;\n padding:0 16px;\n `;\n\n const text = document.createElement('div');\n text.style.cssText = `\n min-width:0;\n font-size:12px; line-height:1.4;\n color:var(--e2d-text2,#ccc);\n white-space:nowrap; overflow:hidden; text-overflow:ellipsis;\n `;\n text.textContent = '正在加载...';\n this.textEl = text;\n\n const pct = document.createElement('div');\n pct.style.cssText = `\n flex:0 0 auto;\n font-size:12px; line-height:1;\n color:var(--e2d-accent,#4fc3f7);\n font-variant-numeric:tabular-nums;\n `;\n pct.textContent = '0%';\n this.pctEl = pct;\n\n const track = document.createElement('div');\n track.style.cssText = `\n width:100%; height:4px;\n background:var(--e2d-border2,#333);\n overflow:hidden;\n `;\n\n const bar = document.createElement('div');\n bar.style.cssText = `\n height:100%; width:0%;\n background:linear-gradient(90deg,var(--e2d-accent,#4fc3f7),#8be9fd);\n box-shadow:0 0 12px rgba(79,195,247,0.45);\n transition:width 0.25s ease;\n `;\n this.barEl = bar;\n\n row.appendChild(text);\n row.appendChild(pct);\n track.appendChild(bar);\n panel.appendChild(row);\n panel.appendChild(track);\n return panel;\n }\n\n public dispose(): void {\n this.overlay?.remove();\n this.overlay = null;\n this.textEl = null;\n this.barEl = null;\n this.pctEl = null;\n }\n}\n","import type { SearchManager, SearchResult } from '../managers/search/index';\n\nconst ICON_SEARCH = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <line x1=\"10\" y1=\"10\" x2=\"14\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nconst ICON_CLOSE = `<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"1\" y1=\"1\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"11\" y1=\"1\" x2=\"1\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport class SearchUI {\n private manager: SearchManager;\n\n private wrapper: HTMLElement;\n private input: HTMLInputElement;\n private clearBtn: HTMLElement;\n private resultList: HTMLElement;\n private statusEl: HTMLElement;\n\n private activeIndex = -1;\n private currentResults: SearchResult[] = [];\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(container: HTMLElement, manager: SearchManager) {\n this.manager = manager;\n\n this.wrapper = this.buildWrapper();\n this.input = this.wrapper.querySelector('.engine-2d-search__input') as HTMLInputElement;\n this.clearBtn = this.wrapper.querySelector('.engine-2d-search__clear') as HTMLElement;\n this.resultList = this.wrapper.querySelector('.engine-2d-search__list') as HTMLElement;\n this.statusEl = this.wrapper.querySelector('.engine-2d-search__status') as HTMLElement;\n\n container.appendChild(this.wrapper);\n this.bindEvents();\n }\n\n /** 构建搜索弹窗,当前搜索仅面向 CAD 文字内容。 */\n private buildWrapper(): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'engine-2d-search';\n wrapper.innerHTML = `\n <div class=\"engine-2d-search__box\">\n <div class=\"engine-2d-search__input-row\">\n <span class=\"engine-2d-search__icon\">${ICON_SEARCH}</span>\n <input\n class=\"engine-2d-search__input\"\n type=\"text\"\n placeholder=\"搜索文字内容\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n <button class=\"engine-2d-search__clear\" title=\"清除\">${ICON_CLOSE}</button>\n </div>\n <div class=\"engine-2d-search__divider\"></div>\n <div class=\"engine-2d-search__status\"></div>\n <ul class=\"engine-2d-search__list\" role=\"listbox\"></ul>\n </div>\n `;\n return wrapper;\n }\n\n private bindEvents(): void {\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('keydown', this.onKeyDown);\n this.clearBtn.addEventListener('click', this.onClear);\n document.addEventListener('mousedown', this.onDocMouseDown);\n document.addEventListener('keydown', this.onEscape);\n }\n\n private onInput = (): void => {\n if (this.debounceTimer !== null) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => this.doSearch(), 150);\n\n const hasText = this.input.value.length > 0;\n this.clearBtn.style.opacity = hasText ? '1' : '0';\n this.clearBtn.style.pointerEvents = hasText ? 'auto' : 'none';\n };\n\n private onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Enter' && this.activeIndex >= 0 && this.currentResults[this.activeIndex]) {\n e.preventDefault();\n this.selectResult(this.currentResults[this.activeIndex]);\n return;\n }\n\n const items = this.resultList.querySelectorAll<HTMLElement>('.engine-2d-search__item');\n if (!items.length) return;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.activeIndex = Math.min(this.activeIndex + 1, items.length - 1);\n this.highlightItem(items);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.activeIndex = Math.max(this.activeIndex - 1, 0);\n this.highlightItem(items);\n }\n };\n\n private onClear = (): void => {\n this.input.value = '';\n this.clearBtn.style.opacity = '0';\n this.clearBtn.style.pointerEvents = 'none';\n this.clearResults();\n this.input.focus();\n };\n\n private onDocMouseDown = (e: MouseEvent): void => {\n if (!this.wrapper.contains(e.target as Node)) {\n this.hide();\n }\n };\n\n private onEscape = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.hide();\n };\n\n private doSearch(): void {\n const query = this.input.value;\n if (!query.trim()) {\n this.clearResults();\n return;\n }\n\n this.currentResults = this.manager.search(query);\n this.activeIndex = this.currentResults.length > 0 ? 0 : -1;\n this.renderResults(this.currentResults, query);\n }\n\n /** 渲染真实文字搜索结果,列表项点击后由 SearchManager 定位。 */\n private renderResults(results: SearchResult[], query: string): void {\n this.resultList.innerHTML = '';\n const divider = this.wrapper.querySelector('.engine-2d-search__divider') as HTMLElement;\n\n if (results.length === 0) {\n this.statusEl.textContent = `未找到与 \"${query}\" 匹配的文字`;\n this.statusEl.style.display = 'block';\n divider.style.display = 'none';\n this.resultList.style.display = 'none';\n return;\n }\n\n this.statusEl.textContent = `找到 ${results.length} 条文字`;\n this.statusEl.style.display = 'block';\n divider.style.display = 'block';\n this.resultList.style.display = 'block';\n\n results.forEach((item, index) => {\n const li = document.createElement('li');\n li.className = 'engine-2d-search__item';\n li.classList.toggle('engine-2d-search__item--active', index === this.activeIndex);\n li.setAttribute('role', 'option');\n li.dataset.index = String(index);\n\n li.innerHTML = `\n <span class=\"engine-2d-search__item-badge\">文字</span>\n <span class=\"engine-2d-search__item-name\">${this.highlight(item.name, query)}</span>\n ${item.layer ? `<span class=\"engine-2d-search__item-layer\">${this.escapeHtml(item.layer)}</span>` : ''}\n ${item.description ? `<span class=\"engine-2d-search__item-desc\">${this.escapeHtml(item.description)}</span>` : ''}\n `;\n\n li.addEventListener('click', () => this.selectResult(item));\n li.addEventListener('mouseenter', () => {\n this.activeIndex = index;\n this.highlightItem(this.resultList.querySelectorAll<HTMLElement>('.engine-2d-search__item'));\n });\n\n this.resultList.appendChild(li);\n });\n }\n\n /** 只高亮连续命中的关键词;模糊命中仍展示完整文字。 */\n private highlight(text: string, query: string): string {\n const escapedText = this.escapeHtml(text);\n const normalizedQuery = query.trim();\n if (!normalizedQuery) return escapedText;\n const escapedQuery = this.escapeRegExp(this.escapeHtml(normalizedQuery));\n return escapedText.replace(new RegExp(`(${escapedQuery})`, 'gi'), '<mark class=\"engine-2d-search__mark\">$1</mark>');\n }\n\n private highlightItem(items: NodeListOf<HTMLElement>): void {\n items.forEach((el, index) => {\n el.classList.toggle('engine-2d-search__item--active', index === this.activeIndex);\n });\n if (this.activeIndex >= 0) {\n items[this.activeIndex]?.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private selectResult(result: SearchResult): void {\n this.manager.onResultSelect(result);\n this.hide();\n }\n\n private clearResults(): void {\n this.resultList.innerHTML = '';\n this.resultList.style.display = 'none';\n this.statusEl.style.display = 'none';\n const divider = this.wrapper.querySelector('.engine-2d-search__divider') as HTMLElement;\n divider.style.display = 'none';\n this.currentResults = [];\n this.activeIndex = -1;\n }\n\n private escapeHtml(value: string): string {\n return String(value ?? '').replace(/[&<>\"']/g, (char) => ({\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n }[char] ?? char));\n }\n\n private escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n public show(): void {\n this.wrapper.classList.add('engine-2d-search--visible');\n requestAnimationFrame(() => this.input.focus());\n }\n\n public hide(): void {\n this.wrapper.classList.remove('engine-2d-search--visible');\n this.clearResults();\n this.input.value = '';\n this.clearBtn.style.opacity = '0';\n this.clearBtn.style.pointerEvents = 'none';\n }\n\n public toggle(): void {\n if (this.wrapper.classList.contains('engine-2d-search--visible')) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n public dispose(): void {\n this.input.removeEventListener('input', this.onInput);\n this.input.removeEventListener('keydown', this.onKeyDown);\n this.clearBtn.removeEventListener('click', this.onClear);\n document.removeEventListener('mousedown', this.onDocMouseDown);\n document.removeEventListener('keydown', this.onEscape);\n this.wrapper.parentElement?.removeChild(this.wrapper);\n if (this.debounceTimer !== null) clearTimeout(this.debounceTimer);\n }\n}\n","import * as THREE from 'three';\nimport { SearchUI } from '../../ui/searchUI';\nimport type { SearchableText2d } from '../../loader/types';\n\nexport interface SearchResult {\n id: string;\n name: string;\n type: string;\n layer?: string;\n description?: string;\n score?: number;\n target?: SearchableText2d;\n}\n\nexport class SearchManager {\n private engine: any;\n private searchUI: SearchUI | null = null;\n\n constructor(engine: any) {\n this.engine = engine;\n\n const container: HTMLElement | null =\n document.getElementById(engine?.options?.containerId ?? '') ??\n engine?.container ?? null;\n\n if (container) {\n this.searchUI = new SearchUI(container, this);\n }\n }\n\n /** 只查询已加载的文字实体,支持连续包含和按字符顺序的模糊匹配。 */\n public search(query: string): SearchResult[] {\n const normalizedQuery = this.normalize(query);\n if (!normalizedQuery) return [];\n\n const textItems: SearchableText2d[] = this.engine.loaderModule2d?.model?.textItems ?? [];\n return textItems\n .map((item) => {\n const score = this.getMatchScore(item.text, normalizedQuery);\n if (score == null) return null;\n return {\n id: item.id,\n name: item.text,\n type: '文字',\n layer: item.layer,\n description: this.getPositionDescription(item),\n score,\n target: item,\n } as SearchResult;\n })\n .filter((item): item is SearchResult => item !== null)\n .sort((a, b) => (b.score ?? 0) - (a.score ?? 0) || a.name.length - b.name.length)\n .slice(0, 100);\n }\n\n /** 点击结果后定位到文字包围盒,并高亮对应文字图元。 */\n public onResultSelect(result: SearchResult): void {\n const target = result.target;\n if (!target) return;\n\n this.engine.modelToolModule2d?.unhighlightAllModels?.();\n this.engine.modelToolModule2d?.highlightModel?.([result.id]);\n this.fitToText(target);\n }\n\n /** 将搜索结果定位到视口中央,极小文字用锚点补一个可见范围。 */\n private fitToText(item: SearchableText2d): void {\n const min = item.min?.clone();\n const max = item.max?.clone();\n const anchor = item.anchor?.clone();\n if ((!min || !max || min.distanceTo(max) < 1e-6) && anchor) {\n const radius = Math.max(Number(item.info?.height ?? 100), 100);\n this.engine.cameraModule2d?.fitToExtents({\n min: [anchor.x - radius, anchor.y - radius, 0],\n max: [anchor.x + radius, anchor.y + radius, 0],\n }, 2, true, 500);\n return;\n }\n\n if (!min || !max) return;\n const size = new THREE.Vector3().subVectors(max, min);\n const padding = Math.max(size.x, size.y) < 1e-6 ? 2 : 2.5;\n this.engine.cameraModule2d?.fitToExtents({\n min: [min.x, min.y, min.z],\n max: [max.x, max.y, max.z],\n }, padding, true, 500);\n }\n\n private getPositionDescription(item: SearchableText2d): string {\n const point = item.anchor ?? item.min;\n if (!point) return '';\n return `X:${point.x.toFixed(0)} Y:${point.y.toFixed(0)}`;\n }\n\n private normalize(value: string): string {\n return String(value ?? '').trim().toLowerCase().replace(/\\s+/g, '');\n }\n\n private getMatchScore(text: string, normalizedQuery: string): number | null {\n const normalizedText = this.normalize(text);\n if (!normalizedText) return null;\n const index = normalizedText.indexOf(normalizedQuery);\n if (index >= 0) return 1000 - index - Math.max(0, normalizedText.length - normalizedQuery.length) * 0.01;\n\n let cursor = 0;\n let gap = 0;\n for (const char of normalizedQuery) {\n const nextIndex = normalizedText.indexOf(char, cursor);\n if (nextIndex < 0) return null;\n gap += nextIndex - cursor;\n cursor = nextIndex + 1;\n }\n return 500 - gap - Math.max(0, normalizedText.length - normalizedQuery.length) * 0.01;\n }\n\n public show(): void { this.searchUI?.show(); }\n public hide(): void { this.searchUI?.hide(); }\n public toggle(): void { this.searchUI?.toggle(); }\n\n public dispose(): void {\n this.searchUI?.dispose();\n this.searchUI = null;\n }\n}\n","/**\r\n * 2D 引擎主题管理器\r\n * 通过在容器元素上切换 CSS 自定义属性实现暗色 / 亮色主题\r\n */\r\n\r\nexport type Theme2d = 'dark' | 'light';\r\n\r\n/** 所有 UI 组件共享的设计 Token */\r\nconst THEME_VARS: Record<Theme2d, Record<string, string>> = {\r\n dark: {\r\n /* 背景 */\r\n '--e2d-bg': '#1e1f22', // 面板主背景\r\n '--e2d-bg2': '#252526', // 次级面板背景(右键菜单)\r\n '--e2d-bg3': '#222222', // 标题栏 / 第三级背景\r\n '--e2d-bg-hover': 'rgba(79,195,247,0.08)', // 列表项悬停(中性蓝调)\r\n '--e2d-bg-accent': '#094771', // 强调悬停(右键菜单项)\r\n '--e2d-icon-bg': 'rgba(255,255,255,0.08)', // 图标按钮背景\r\n '--e2d-icon-bg-hover': 'rgba(255,255,255,0.16)', // 图标按钮悬停背景\r\n\r\n /* 描边 */\r\n '--e2d-border': 'rgba(255,255,255,0.12)', // 面板边框\r\n '--e2d-border2': '#333333', // 行分隔线 / 细描边\r\n\r\n /* 文字 */\r\n '--e2d-text': '#e0e0e0', // 主文字\r\n '--e2d-text2': '#cccccc', // 次级文字\r\n '--e2d-text3': 'rgba(255,255,255,0.35)', // 辅助 / 占位文字\r\n '--e2d-text4': '#666666', // 禁用 / 暗淡文字\r\n '--e2d-text-accent': '#ffffff', // 强调背景上的文字\r\n\r\n /* 强调色 */\r\n '--e2d-accent': '#4fc3f7', // 主强调(搜索标记、光标色值)\r\n\r\n /* 阴影 */\r\n '--e2d-shadow': 'rgba(0,0,0,0.50)', // 普通阴影\r\n '--e2d-shadow-lg': 'rgba(0,0,0,0.65)', // 大阴影\r\n\r\n /* 光标 */\r\n '--e2d-cursor': 'rgba(255,255,255,0.85)', // CAD 十字光标颜色\r\n\r\n /* 滚动条 */\r\n '--e2d-scrollbar': 'rgba(255,255,255,0.15)', // 滚动条滑块\r\n\r\n /* 浮动元素(坐标显示、提示等) */\r\n '--e2d-float-bg': 'rgba(0,0,0,0.65)',\r\n '--e2d-float-border': 'rgba(255,255,255,0.08)',\r\n\r\n /* 图层色块描边 */\r\n '--e2d-swatch-border': '#444444',\r\n\r\n /* 关闭按钮 */\r\n '--e2d-close': '#aaaaaa',\r\n '--e2d-close-hover': '#ffffff',\r\n\r\n /* 图标 */\r\n '--e2d-icon': 'rgba(255,255,255,0.4)',\r\n\r\n /* 坐标显示 */\r\n '--e2d-coord-value': '#76c8ff',\r\n '--e2d-coord-label': 'rgba(255,255,255,0.45)',\r\n },\r\n\r\n light: {\r\n /* 背景 */\r\n '--e2d-bg': '#ffffff',\r\n '--e2d-bg2': '#ffffff',\n '--e2d-bg3': '#eeeeee',\r\n '--e2d-bg-hover': 'rgba(25,118,210,0.06)',\r\n '--e2d-bg-accent': '#e3f2fd',\r\n '--e2d-icon-bg': 'rgba(0,0,0,0.06)',\r\n '--e2d-icon-bg-hover': 'rgba(0,0,0,0.12)',\r\n\r\n /* 描边 */\r\n '--e2d-border': 'rgba(0,0,0,0.12)',\r\n '--e2d-border2': '#e0e0e0',\r\n\r\n /* 文字 */\r\n '--e2d-text': '#1a1a1a',\r\n '--e2d-text2': '#444444',\r\n '--e2d-text3': 'rgba(0,0,0,0.40)',\r\n '--e2d-text4': '#aaaaaa',\r\n '--e2d-text-accent': '#1565c0',\r\n\r\n /* 强调色 */\r\n '--e2d-accent': '#1976d2',\r\n\r\n /* 阴影 */\r\n '--e2d-shadow': 'rgba(0,0,0,0.15)',\r\n '--e2d-shadow-lg': 'rgba(0,0,0,0.22)',\r\n\r\n /* 光标 */\r\n '--e2d-cursor': 'rgba(30,30,30,0.70)',\r\n\r\n /* 滚动条 */\r\n '--e2d-scrollbar': 'rgba(0,0,0,0.18)',\r\n\r\n /* 浮动元素 */\r\n '--e2d-float-bg': '#ffffff',\n '--e2d-float-border': 'rgba(0,0,0,0.10)',\r\n\r\n /* 图层色块描边 */\r\n '--e2d-swatch-border': '#cccccc',\r\n\r\n /* 关闭按钮 */\r\n '--e2d-close': '#777777',\r\n '--e2d-close-hover': '#1a1a1a',\r\n\r\n /* 图标 */\r\n '--e2d-icon': 'rgba(0,0,0,0.45)',\r\n\r\n /* 坐标显示 */\r\n '--e2d-coord-value': '#1976d2',\r\n '--e2d-coord-label': 'rgba(0,0,0,0.50)',\r\n },\r\n};\r\n\r\nexport class ThemeManager {\r\n private container: HTMLElement;\r\n private current: Theme2d;\r\n\r\n constructor(container: HTMLElement, initial: Theme2d = 'dark') {\r\n this.container = container;\r\n this.current = initial;\r\n this._apply(initial);\r\n }\r\n\r\n private _apply(theme: Theme2d): void {\r\n const vars = THEME_VARS[theme];\r\n for (const [key, val] of Object.entries(vars)) {\r\n this.container.style.setProperty(key, val);\r\n }\r\n // data 属性方便外部 CSS 按需覆盖\r\n this.container.setAttribute('data-e2d-theme', theme);\r\n }\r\n\r\n public setTheme(theme: Theme2d): void {\r\n this.current = theme;\r\n this._apply(theme);\r\n }\r\n\r\n public getTheme(): Theme2d {\r\n return this.current;\r\n }\r\n\r\n public toggle(): void {\r\n this.setTheme(this.current === 'dark' ? 'light' : 'dark');\r\n }\r\n\r\n public dispose(): void {\r\n for (const key of Object.keys(THEME_VARS[this.current])) {\r\n this.container.style.removeProperty(key);\r\n }\r\n this.container.removeAttribute('data-e2d-theme');\r\n }\r\n}\r\n","/**\r\n * 2D CAD 浏览引擎内核\r\n * 主入口类,整合所有模块\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport Stats from 'stats.js';\r\nimport { EventModule2d, EventType2d } from './modules/eventModule2d';\r\nimport { SceneModule2d } from './modules/sceneModule2d';\r\nimport { EngineStatus2d } from './status/engineStatus2d.ts'\r\nimport { CameraModule2d } from './modules/cameraModule2d';\r\nimport { RenderModule2d } from './modules/renderModule2d';\r\nimport { ControlModule2d } from './modules/controlModule2d';\r\nimport { LoaderModule2d } from './modules/loaderModule2d';\r\nimport { LayerManager } from './managers/layer/index';\r\nimport { OctreeBox2d } from './managers/octreeBox2d';\r\nimport { LinkView2d3d } from './managers/linkView2d3d'\r\nimport { LinkElement2d3d } from './managers/linkElement2d3d'\r\nimport { ModelToolModule2d } from './modules/modelToolModule2d'\r\nimport { HandelBehaved2d } from './status/handelBehaved2d';\r\nimport { InteractionModule2d } from \"./modules/interactionModule2d\"\r\nimport { Engine2dOptions, PerformanceStats } from './types/entityTypes';\r\nimport { DWGData } from './types/dwgTypes';\r\nimport { CadCursorUI } from './ui/cadCursorUI';\r\nimport { ContextMenuUI } from './ui/contextMenuUI';\r\nimport { LoadingUI } from './ui/loadingUI';\r\nimport { SearchManager } from './managers/search/index';\r\nimport { ThemeManager, Theme2d } from './theme/index';\r\nimport './EngineKernel2d.css';\r\n\r\nexport class EngineKernel2d {\r\n // 配置选项\r\n private options: Engine2dOptions;\r\n private container: HTMLElement | null = null;\r\n\r\n // 渲染循环\r\n private animationId: number | null = null;\r\n private isRendering: boolean = false;\r\n\r\n // 性能监控\r\n private fpsFrameCount: number = 0;\r\n private fpsLastCheck: number = 0;\r\n private currentFps: number = 0;\r\n private enablePerformanceMonitoring: boolean = false;\r\n public stats?: Stats;\r\n\r\n // 核心模块\r\n public modelToolModule2d!:ModelToolModule2d;\r\n public engineStatus2d!:EngineStatus2d;\r\n public octreeBox2d!:OctreeBox2d;\r\n public events!: EventModule2d;\r\n public handelBehaved2d!: any;\r\n public interactionModule2d:InteractionModule2d;\r\n public sceneModule2d!: SceneModule2d;\r\n public cameraModule2d!: CameraModule2d;\r\n public renderModule2d!: RenderModule2d;\r\n public controlModule2d!: ControlModule2d;\r\n public loaderModule2d!: LoaderModule2d;\r\n public layerManager!: LayerManager;\r\n public searchManager!: SearchManager;\r\n public themeManager!: ThemeManager;\r\n private cadCursorUI!: CadCursorUI;\r\n private contextMenuUI!: ContextMenuUI;\r\n private loadingUI!: LoadingUI;\r\n private linkView2d3d!: LinkView2d3d;\r\n private linkElement2d3d!: LinkElement2d3d;\r\n\r\n // Three.js 核心对象\r\n public scene: THREE.Scene | null = null;\r\n public camera: THREE.OrthographicCamera | null = null;\r\n public renderer: THREE.WebGLRenderer | null = null;\r\n\r\n // 数据\r\n public dwgData: DWGData | null = null;\r\n public version: string = '1.0.0';\r\n\r\n constructor(options: Engine2dOptions) {\r\n // 设置一些默认值\r\n this.options = options;\r\n this.options.backgroundColor = this.options.backgroundColor ?? 0x1a1a1a;\r\n this.options.enablePerformanceMonitoring = this.options.enablePerformanceMonitoring ?? false\r\n this.options.showMouseCoordinates = this.options.showMouseCoordinates ?? false\r\n this.options.loadingStyle = this.options.loadingStyle ?? 2;\r\n\r\n\r\n\r\n this.options.contextMenu = this.options.contextMenu ?? {\r\n items:[ \r\n { action: 'hideElement', label: '隐藏模型'}, \r\n { action: 'showAll', label: '显示全部' },\r\n { action: 'hideLayer', label: '隐藏图层' },\r\n { action: 'showAllLayers', label: '显示所有图层' },\r\n { action: 'toggleBg', label: '切换背景',},\r\n { action: 'layerManage', label: '图层管理' }, \r\n { action: 'linkElement2d3d', label: '模型联动', visible: false }\r\n ]\r\n }\r\n\r\n\r\n\r\n\r\n this.enablePerformanceMonitoring = options.enablePerformanceMonitoring ?? false;\r\n\r\n // 获取容器\r\n this.container = document.getElementById(options.containerId);\r\n if (!this.container) {\r\n throw new Error(`Container ${options.containerId} not found`);\r\n }\r\n\r\n // 需要支持多工作空间 第一个是modelspace,后面的时layoutspace\r\n // 初始化引擎\r\n this.initialize();\r\n\r\n\r\n\r\n this.handelBehaved2d = HandelBehaved2d(this)\r\n this.interactionModule2d = new InteractionModule2d(this) \r\n this.interactionModule2d.init()\r\n this.interactionModule2d.active()\r\n \r\n }\r\n\r\n /**\r\n * 初始化引擎\r\n */\r\n private initialize(): void {\r\n // 1. 创建事件系统\r\n this.events = new EventModule2d(false);\r\n\r\n // 2. 创建场景\r\n this.sceneModule2d = new SceneModule2d(this, this.options);\r\n this.scene = this.sceneModule2d.scene;\r\n\r\n // 3. 创建相机\r\n this.cameraModule2d = new CameraModule2d(this, this.container!);\r\n this.camera = this.cameraModule2d.orthographicCamera;\r\n\r\n // 4. 创建渲染器\r\n this.renderModule2d = new RenderModule2d(this, this.container!, this.options);\r\n this.renderer = this.renderModule2d.renderer;\r\n\r\n // 5. 创建控制器\r\n this.controlModule2d = new ControlModule2d(this); \r\n\r\n // 6. 创建数据加载器\r\n this.loaderModule2d = new LoaderModule2d(this);\r\n\r\n // 7. 初始化主题(需在所有 UI 之前)\r\n this.themeManager = new ThemeManager(this.container!);\r\n\r\n // 8. 创建图层管理器\r\n this.layerManager = new LayerManager(this);\r\n\r\n // 9. 创建搜索管理器\r\n this.searchManager = new SearchManager(this);\r\n\r\n // 9.5 加载八叉树\r\n this.octreeBox2d = new OctreeBox2d(this);\r\n this.modelToolModule2d = new ModelToolModule2d(this);\r\n this.engineStatus2d = new EngineStatus2d(this)\r\n this.linkView2d3d = new LinkView2d3d(this)\r\n this.linkElement2d3d = new LinkElement2d3d(this)\r\n // 10. 初始化网格(现在相机已经创建好了)\r\n this.sceneModule2d.initGrid();\r\n\r\n // 初始化 CAD 十字光标\r\n this.cadCursorUI = new CadCursorUI(this.container!, this.renderer!.domElement, this.options.cursorStyle ?? 'short-crosshair');\r\n this.cadCursorUI.setBackgroundColor(this.options.backgroundColor ?? 0x1a1a1a);\r\n\r\n // 初始化加载进度 UI\r\n this.loadingUI = new LoadingUI(this.container!, this.options.loadingStyle);\r\n this.events.on(EventType2d.ModelLoadStart, () => this.loadingUI.show('正在加载...', 0));\r\n this.events.on(EventType2d.ModelLoadProgress, (d) => this.loadingUI.update(d.text, d.progress));\r\n this.events.on(EventType2d.ModelLoaded, () => this.loadingUI.hide());\r\n this.events.on(EventType2d.ModelLoadError, () => this.loadingUI.hide());\r\n\r\n // 初始化右键菜单\r\n this.contextMenuUI = new ContextMenuUI(\r\n this.container!,\r\n this.renderer!.domElement,\r\n (action) => {\r\n if (action === 'search') this.searchManager.show();\r\n if (action === 'layerManage') this.layerManager.toggle();\r\n if(action===\"hideElement\"){\r\n // 隐藏图元\r\n this.modelToolModule2d.hideModel(this.engineStatus2d.highlightModels);\r\n }\r\n if(action===\"showAll\"){\r\n // 显示全部\r\n this.modelToolModule2d.showAllModels();\r\n }\r\n if(action === \"hideLayer\"){\r\n // 隐藏当前高亮图元所在图层\r\n this.hideHighlightedLayers();\r\n }\r\n if(action === \"showAllLayers\"){\r\n // 显示所有图层\r\n this.layerManager.setAllLayersVisible(true);\r\n this.layerManager.refresh();\r\n }\r\n if (action === 'toggleBg') {\r\n const nextTheme = this.themeManager.getTheme() === 'dark' ? 'light' : 'dark';\r\n this.setTheme(nextTheme);\r\n }\r\n if (action === 'linkElement2d3d') {\r\n // 切换二三维图元联动\r\n const enabled = this.linkElement2d3d.toggle();\r\n this.contextMenuUI.setMenuItemState('linkElement2d3d', enabled);\r\n console.log(`[EngineKernel2d] 二三维图元联动: ${enabled ? '已开启' : '已关闭'}`);\r\n }\r\n if (action === 'linkView2d3d') {\r\n // 切换图模关联\r\n const enabled = this.linkView2d3d.toggle();\r\n this.contextMenuUI.setMenuItemState('linkView2d3d', enabled);\r\n console.log(`[EngineKernel2d] 图模关联: ${enabled ? '已开启' : '已关闭'}`);\r\n }\r\n },\r\n this.options.contextMenu?.items,\r\n );\r\n\r\n // 设置菜单项初始状态\r\n this.contextMenuUI.setMenuItemStates({\r\n 'linkElement2d3d': this.linkElement2d3d.isEnabled(),\r\n 'linkView2d3d': this.linkView2d3d.isEnabled()\r\n });\r\n\r\n // 9. 开始渲染循环\r\n this.initStatsMonitor();\r\n this.startRendering();\r\n\r\n console.log(`[EngineKernel2d] 2D Engine initialized (v${this.version})`);\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private startRendering(): void {\r\n if (this.isRendering) return;\r\n\r\n this.isRendering = true;\r\n this.fpsLastCheck = performance.now();\r\n this.animate();\r\n\r\n console.log('[EngineKernel2d] Rendering started');\r\n }\r\n\r\n /**\r\n * 停止渲染循环\r\n */\r\n private stopRendering(): void {\r\n this.isRendering = false;\r\n\r\n if (this.animationId !== null) {\r\n cancelAnimationFrame(this.animationId);\r\n this.animationId = null;\r\n }\r\n\r\n console.log('[EngineKernel2d] Rendering stopped');\r\n }\r\n\r\n /**\r\n * 动画循环\r\n */\r\n private animate = (): void => {\r\n if (!this.isRendering) return;\r\n\r\n this.animationId = requestAnimationFrame(this.animate);\r\n this.stats?.begin();\r\n\r\n // 更新控制器\r\n this.controlModule2d.update();\r\n\r\n // 渲染场景\r\n if (this.scene && this.camera && this.renderer) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 性能监控\r\n if (this.enablePerformanceMonitoring) {\r\n this.updatePerformanceStats();\r\n }\r\n this.stats?.end();\r\n }\r\n\r\n /** 初始化 stats.js 性能监视器,showStats 优先控制可视面板,旧配置 enablePerformanceMonitoring 继续兼容。 */\r\n private initStatsMonitor(): void {\r\n if (!(this.options.showStats ?? this.enablePerformanceMonitoring) || !this.container) return;\r\n\r\n this.stats = new Stats();\r\n this.stats.showPanel(0);\r\n this.stats.dom.className = 'engine-2d-stats-monitor';\r\n this.stats.dom.style.position = 'absolute';\r\n this.stats.dom.style.top = '0px';\r\n this.stats.dom.style.left = '0px';\r\n this.stats.dom.style.zIndex = '1000';\r\n this.container.appendChild(this.stats.dom);\r\n }\r\n\r\n /**\r\n * 更新性能统计\r\n */\r\n private updatePerformanceStats(): void {\r\n this.fpsFrameCount++;\r\n const now = performance.now();\r\n\r\n if (now - this.fpsLastCheck >= 1000) {\r\n this.currentFps = this.fpsFrameCount;\r\n this.fpsFrameCount = 0;\r\n this.fpsLastCheck = now;\r\n\r\n // 触发性能更新事件\r\n this.events.trigger(EventType2d.RenderEnd, {\r\n fps: this.currentFps,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 加载模型\r\n * @param url 模型文件 URL\r\n * @param options 加载选项\r\n * @returns 加载结果\r\n */\r\n public async loadModel(\r\n url: string,\r\n options?: {\r\n chunkSize?: number;\r\n enableChunkedLoading?: boolean;\r\n enableValidation?: boolean;\r\n }\r\n ) {\r\n await this.loaderModule2d.loadModel(url, options);\r\n \r\n\r\n return {};\r\n }\r\n\r\n /**\r\n * 获取图层列表\r\n * @returns 图层数组\r\n */\r\n public getLayers() {\r\n return this.loaderModule2d.getLayers();\r\n }\r\n\r\n /**\r\n * 按图层获取实体\r\n * @param layerName 图层名称\r\n * @returns 实体数组\r\n */\r\n public getEntitiesByLayer(layerName: string) {\r\n return this.loaderModule2d.getEntitiesByLayer(layerName);\r\n }\r\n\r\n /**\r\n * 设置图层可见性\r\n * @param layerName 图层名称\r\n * @param visible 是否可见\r\n */\r\n public setLayerVisible(layerName: string, visible: boolean): void {\r\n this.layerManager?.setLayerVisible(layerName, visible);\r\n }\r\n\r\n /** 隐藏当前选中/高亮图元所在图层,供右键菜单直接调用。 */\r\n private hideHighlightedLayers(): void {\r\n const layerNames = this.getLayersByModelIds(this.engineStatus2d?.highlightModels ?? []);\r\n layerNames.forEach((layerName) => this.layerManager?.setLayerVisible(layerName, false));\r\n this.layerManager?.refresh();\r\n }\r\n\r\n /** 从 nodeMap 中反查图元所在图层;一个 linkId 可能对应多个合批对象。 */\r\n private getLayersByModelIds(modelIds: any[]): string[] {\r\n const layers = new Set<string>();\r\n modelIds.forEach((id) => {\r\n const nodes = this.loaderModule2d?.model?.nodeMap?.get(String(id)) ?? this.loaderModule2d?.model?.nodeMap?.get(id);\r\n nodes?.forEach((node: any) => {\r\n if (node?.layer) layers.add(node.layer);\r\n });\r\n });\r\n return Array.from(layers);\r\n }\r\n\r\n /**\r\n * 切换主题\r\n * @param theme 'dark' | 'light'\r\n */\r\n public setTheme(theme: Theme2d): void {\r\n this.themeManager.setTheme(theme);\r\n const bgColor = theme === 'dark' ? 0x1a1a1a : 0xf0f0f0;\r\n this.setBackgroundColor(bgColor);\r\n }\r\n\r\n /**\r\n * 重置视图\r\n */\r\n public resetView(): void {\r\n if (this.cameraModule2d) {\r\n this.cameraModule2d.resetView();\r\n }\r\n }\r\n\r\n /**\r\n * 适配视图到模型边界\r\n */\r\n public fitToView(): void { \r\n const metadata = this.dwgData?.metadata;\r\n const extents = metadata?.viewExtents ?? metadata?.extents;\r\n if (extents) {\r\n // metadata.viewExtents 是图纸推荐的默认打开范围;缺失时兼容旧数据的模型整体范围。\r\n this.cameraModule2d.fitToExtents(extents);\r\n }\r\n }\r\n\r\n /**\r\n * 设置缩放级别\r\n * @param zoom 缩放级别\r\n */\r\n public setZoom(zoom: number): void {\r\n if (this.cameraModule2d) {\r\n this.cameraModule2d.setZoom(zoom);\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前缩放级别\r\n * @returns 缩放级别\r\n */\r\n public getZoom(): number {\r\n if (this.cameraModule2d) {\r\n return this.cameraModule2d.getZoom();\r\n }\r\n return 1;\r\n }\r\n\r\n /**\r\n * 获取性能统计\r\n * @returns 性能统计信息\r\n */\r\n public getPerformanceStats(): PerformanceStats {\r\n const sceneStats = this.sceneModule2d.getSceneStats();\r\n\r\n return {\r\n fps: this.currentFps,\r\n renderTime: 0, // TODO: 实现渲染时间统计\r\n entityCount: sceneStats.objectCount,\r\n visibleEntityCount: sceneStats.objectCount,\r\n };\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n * @param color 颜色值\r\n */\r\n public setBackgroundColor(color: number): void {\r\n this.options.backgroundColor = color;\r\n if (this.sceneModule2d) {\r\n this.sceneModule2d.setBackgroundColor(color);\r\n }\r\n this.cadCursorUI?.setBackgroundColor(color);\r\n this.modelToolModule2d?.updateColorsForBackground(color);\r\n this.layerManager?.refresh();\r\n }\r\n\r\n /**\r\n * 清空场景\r\n */\r\n public clearScene(): void {\r\n if (this.sceneModule2d) {\r\n this.sceneModule2d.clearScene();\r\n }\r\n }\r\n\r\n /**\r\n * 调整渲染器尺寸\r\n */\r\n public resize(): void {\r\n if (this.renderModule2d) {\r\n const width = this.container?.clientWidth ?? 0;\r\n const height = this.container?.clientHeight ?? 0;\r\n this.renderModule2d.setSize(width, height);\r\n }\r\n }\r\n\r\n /**\r\n * 将主 canvas 转换成图片\r\n * @param options 图片导出选项\r\n * @returns 图片信息(包含 Data URL 和 Blob URL)\r\n */\r\n public captureImage(options?: {\r\n format?: 'png' | 'jpeg' | 'webp';\r\n quality?: number;\r\n filename?: string;\r\n download?: boolean;\r\n transparent?: boolean;\r\n hideGrid?: boolean;\r\n hideAxes?: boolean;\r\n }): {\r\n dataURL: string;\r\n blobURL?: string;\r\n blob?: Blob;\r\n } | null {\r\n if (!this.renderer || !this.sceneModule2d) {\r\n console.error('[EngineKernel2d] Renderer or scene module not initialized');\r\n return null;\r\n }\r\n\r\n const canvas = this.renderer.domElement;\r\n const format = options?.format || 'png';\r\n const quality = options?.quality || 0.92;\r\n const mimeType = `image/${format === 'jpeg' ? 'jpeg' : format}`;\r\n const transparent = options?.transparent ?? false;\r\n const hideGrid = options?.hideGrid ?? true;\r\n const hideAxes = options?.hideAxes ?? true;\r\n\r\n // 保存当前状态\r\n const originalBackground = this.scene?.background ?? null;\r\n let originalGridVisible = false;\r\n let originalAxesVisible = false;\r\n\r\n // 保存网格可见性\r\n if (this.sceneModule2d['adaptiveGrid']) {\r\n originalGridVisible = this.sceneModule2d['adaptiveGrid']['gridGroup']?.visible ?? false;\r\n if (hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(false);\r\n }\r\n }\r\n\r\n // 保存坐标轴可见性\r\n if (this.sceneModule2d['axesHelper']) {\r\n originalAxesVisible = this.sceneModule2d['axesHelper'].visible ?? false;\r\n if (hideAxes) {\r\n this.sceneModule2d.setAxesVisible(false);\r\n }\r\n }\r\n\r\n // 设置透明背景\r\n if (transparent && this.scene) {\r\n this.scene.background = null;\r\n }\r\n\r\n // 强制重新渲染一次以确保获取最新画面\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 获取 Data URL\r\n const dataURL = canvas.toDataURL(mimeType, quality);\r\n\r\n // 恢复背景\r\n if (this.scene) {\r\n this.scene.background = originalBackground;\r\n }\r\n\r\n // 恢复网格可见性\r\n if (this.sceneModule2d['adaptiveGrid'] && hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(originalGridVisible);\r\n }\r\n\r\n // 恢复坐标轴可见性\r\n if (this.sceneModule2d['axesHelper'] && hideAxes) {\r\n this.sceneModule2d.setAxesVisible(originalAxesVisible);\r\n }\r\n\r\n // 再次渲染以恢复显示\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n const result: {\r\n dataURL: string;\r\n blobURL?: string;\r\n blob?: Blob;\r\n } = {\r\n dataURL,\r\n };\r\n\r\n // 如果需要下载\r\n if (options?.download) {\r\n const filename = options.filename || `capture-${Date.now()}.${format}`;\r\n\r\n // 创建临时链接触发下载\r\n const link = document.createElement('a');\r\n link.href = dataURL;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n\r\n console.log(`[EngineKernel2d] Image captured and downloaded: ${filename}`);\r\n } else {\r\n console.log('[EngineKernel2d] Image captured');\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 将主 canvas 转换成图片(异步版本,返回 Blob)\r\n * @param options 图片导出选项\r\n * @returns Promise,包含图片信息(Data URL、Blob URL 和 Blob)\r\n */\r\n public async captureImageAsync(options?: {\r\n format?: 'png' | 'jpeg' | 'webp';\r\n quality?: number;\r\n filename?: string;\r\n download?: boolean;\r\n transparent?: boolean;\r\n hideGrid?: boolean;\r\n hideAxes?: boolean;\r\n }): Promise<{\r\n dataURL: string;\r\n blobURL: string;\r\n blob: Blob;\r\n } | null> {\r\n if (!this.renderer || !this.sceneModule2d) {\r\n console.error('[EngineKernel2d] Renderer or scene module not initialized');\r\n return null;\r\n }\r\n\r\n const canvas = this.renderer.domElement;\r\n const format = options?.format || 'png';\r\n const quality = options?.quality || 0.92;\r\n const mimeType = `image/${format === 'jpeg' ? 'jpeg' : format}`;\r\n const transparent = options?.transparent ?? false;\r\n const hideGrid = options?.hideGrid ?? true;\r\n const hideAxes = options?.hideAxes ?? true;\r\n\r\n // 保存当前状态\r\n const originalBackground = this.scene?.background ?? null;\r\n let originalGridVisible = false;\r\n let originalAxesVisible = false;\r\n\r\n // 保存网格可见性\r\n if (this.sceneModule2d['adaptiveGrid']) {\r\n originalGridVisible = this.sceneModule2d['adaptiveGrid']['gridGroup']?.visible ?? false;\r\n if (hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(false);\r\n }\r\n }\r\n\r\n // 保存坐标轴可见性\r\n if (this.sceneModule2d['axesHelper']) {\r\n originalAxesVisible = this.sceneModule2d['axesHelper'].visible ?? false;\r\n if (hideAxes) {\r\n this.sceneModule2d.setAxesVisible(false);\r\n }\r\n }\r\n\r\n // 设置透明背景\r\n if (transparent && this.scene) {\r\n this.scene.background = null;\r\n }\r\n\r\n // 强制重新渲染一次以确保获取最新画面\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 获取 Data URL\r\n const dataURL = canvas.toDataURL(mimeType, quality);\r\n\r\n // 获取 Blob\r\n const blob = await new Promise<Blob>((resolve) => {\r\n canvas.toBlob((b) => {\r\n if (b) resolve(b);\r\n }, mimeType, quality);\r\n });\r\n\r\n // 创建 Blob URL\r\n const blobURL = URL.createObjectURL(blob);\r\n\r\n // 恢复背景\r\n if (this.scene) {\r\n this.scene.background = originalBackground;\r\n }\r\n\r\n // 恢复网格可见性\r\n if (this.sceneModule2d['adaptiveGrid'] && hideGrid) {\r\n this.sceneModule2d['adaptiveGrid'].setVisible(originalGridVisible);\r\n }\r\n\r\n // 恢复坐标轴可见性\r\n if (this.sceneModule2d['axesHelper'] && hideAxes) {\r\n this.sceneModule2d.setAxesVisible(originalAxesVisible);\r\n }\r\n\r\n // 再次渲染以恢复显示\r\n if (this.scene && this.camera) {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n // 如果需要下载\r\n if (options?.download) {\r\n const filename = options.filename || `capture-${Date.now()}.${format}`;\r\n\r\n // 创建临时链接触发下载\r\n const link = document.createElement('a');\r\n link.href = blobURL;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n\r\n console.log(`[EngineKernel2d] Image captured and downloaded: ${filename}`);\r\n } else {\r\n console.log('[EngineKernel2d] Image captured with Blob URL:', blobURL);\r\n }\r\n\r\n return {\r\n dataURL,\r\n blobURL,\r\n blob,\r\n };\r\n }\r\n\r\n /**\r\n * 销毁引擎\r\n */\r\n public dispose(): void {\r\n console.log('[EngineKernel2d] Disposing engine...');\r\n\r\n // 停止渲染\r\n this.stopRendering();\r\n\r\n // 销毁各模块\r\n this.cadCursorUI?.dispose();\r\n this.contextMenuUI?.dispose();\r\n this.loadingUI?.dispose();\r\n this.searchManager?.dispose();\r\n this.themeManager?.dispose();\r\n this.loaderModule2d?.dispose();\r\n this.controlModule2d?.dispose();\r\n this.renderModule2d?.dispose();\r\n this.cameraModule2d?.dispose();\r\n this.sceneModule2d?.dispose();\r\n this.events?.dispose();\r\n if (this.stats?.dom?.parentElement) {\r\n this.stats.dom.parentElement.removeChild(this.stats.dom);\r\n }\r\n\r\n // 清空引用\r\n this.scene = null;\r\n this.camera = null;\r\n this.renderer = null;\r\n this.dwgData = null;\r\n this.stats = undefined;\r\n\r\n console.log('[EngineKernel2d] Engine disposed');\r\n }\r\n}\r\n\r\n/**\r\n * 创建 2D 引擎实例的工厂函数\r\n * @param options 引擎配置选项\r\n * @returns 2D 引擎实例\r\n */\r\nexport function createEngine2d(options: Engine2dOptions): EngineKernel2d {\r\n return new EngineKernel2d(options);\r\n}\r\n\r\nexport default EngineKernel2d;\r\n"],"names":["f","e","module","this","a","c","u","d","l","k","g","r","h","t","v","m","n","p","q","b","w","EventType2d","EventModule2d","debugMode","type","listener","typeListeners","data","error","onceTypeListeners","set","enabled","GRID_VERTEX_SHADER","GRID_FRAGMENT_SHADER","AdaptiveGrid","THREE","scene","camera","container","loop","spacing","safeSpacing","exponent","base","candidates","candidate","normalized","force","containerWidth","containerHeight","zoom","baseWidth","baseHeight","viewWidth","viewHeight","centerX","centerY","worldPerPixelX","worldPerPixelY","targetSpacing","minorSpacing","state","zoomChanged","spacingChanged","movedX","movedY","widthChanged","heightChanged","containerChanged","planeWidth","planeHeight","visible","largeColor","smallColor","minorOpacity","majorOpacity","SceneModule2d","engine","options","bgColor","size","divisions","color","backgroundColor","object","material","i","includeHelpers","objects","child","meshCount","lineCount","groupCount","EngineStatus2d","CameraModule2d","aspect","frustumHalfHeight","frustumHalfWidth","extents","padding","animated","duration","min","max","center","frustumSize","targetLeft","targetRight","targetTop","targetBottom","targetX","targetY","targetZoom","elapsed","progress","easedProgress","start","target","end","x","y","left","right","top","bottom","cameraX","cameraY","screenX","screenY","vector","worldX","worldY","RenderModule2d","renderer","width","height","startTime","renderTime","pixelRatio","depth","stencil","context","Pan2dControls","domElement","event","deltaX","deltaY","factor","frustumHeight","frustumWidth","worldDeltaX","worldDeltaY","zoomFactor","oldZoom","newZoom","halfW","halfH","rect","ndcX","ndcY","now","touch","damping","ControlModule2d","controls","speed","FontLoader","Loader","manager","url","onLoad","onProgress","onError","scope","loader","FileLoader","text","font","json","Font","direction","shapes","paths","createPaths","pl","chars","scale","line_height","offsetX","offsetY","char","ret","createPath","glyph","path","ShapePath","cpx","cpy","cpx1","cpy1","cpx2","cpy2","outline","FontJsonGenerator","fontUrl","res","buffer","opentype","glyphs","upm","extractChar","parts","bb","ch","glyphIndexMap","cpStr","cp","spGlyph","names","get","familyName","subfamily","commands","contours","entries","solids","entry","holes","solid","hole","contour","index","sample","count","other","shouldBeClockwise","current","closeContour","cmd","segments","segment","points","area","j","point","polygon","inside","pi","pj","LayerPanelUI","delegate","panel","header","title","closeBtn","allRow","allEye","allLabel","next","divider","list","origRender","layer","row","eye","swatch","label","open","el","handle","panelRect","parentRect","ox","oy","onMove","ev","onUp","LayerManager","layers","layerName","name","modelId","nodes","node","root","prefix","obj","activeIds","id","toVector3","getGeometryBounds","geometry","composeMatrix","position_","scale_","rotation_","position","rotation","quaternion","getInsertMatrix","entity","getPointsBounds","BlockFlattener","geometryFactory","blocks","block","entities","blockId","level","cached","origin","baseMatrix","items","blockItems","matrix","clipPolygon","item","cloned","clipped","insertEntity","linkId","textAnchor","bounds","clipTransform","result","parameters","sorted","value","startT","endT","midT","mid","rX","rY","sX","sY","denominator","cax","cay","cross","dot","lengthSq","uv","positions","uvs","hasUv","clipTriangles","readVertex","vertexIndex","vertexCount","offset","subject","clipTriangle","vertex","clippedGeometry","triangles","fallback","triangle","vertices","orientation","output","input","previous","previousInside","currentInside","edgeStart","edgeEnd","edgeX","edgeY","startValue","endValue","s","o","require","A","O","I","_","S","z","C","B","E","R","global","T","D","F","N","U","P","L","Z","W","M","H","G","K","Y","X","V","J","CadDataSource","response","baseUrl","manifest","fetchJson","resolveImageUrl","sourceBaseUrl","metadata","tiles","tile","insert","blocksUrl","blockParts","partUrl","part","message","rawPath","fileName","tileUrl","inserts","stack","children","zip","JSZip","manifestPath","sourceUrl","zipFile","match","file","blobUrl","cleanUrl","relativeUrl","exact","lowerPath","matchedName","findSpan","low","high","calcBasisFunctions","span","saved","rv","lv","temp","calcBSplinePoint","Vector4","Nj","wNj","calcBasisFunctionDerivatives","zeroArr","ders","ndu","s1","s2","rk","pk","j1","j2","calcBSplineDerivatives","nd","du","CK","nders","Pw","calcKoverI","nom","denom","calcRationalCurveDerivatives","Pders","Aders","wders","Vector3","calcNURBSDerivatives","NURBSCurve","Curve","degree","knots","controlPoints","startKnot","endKnot","knotsLength","pointsLength","optionalTarget","hpoint","NURBSUtils.calcBSplinePoint","tangent","NURBSUtils.calcNURBSDerivatives","mergeGeometries","geometries","useGroups","isIndexed","attributesUsed","morphAttributesUsed","attributes","morphAttributes","morphTargetsRelative","mergedGeometry","BufferGeometry","attributesCount","indexOffset","mergedIndex","mergedAttribute","mergeAttributes","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","TypedArray","itemSize","gpuType","arrayLength","attribute","array","BufferAttribute","tupleOffset","EPSILON","HATCH_Z_OFFSET","UNKNOWN_HATCH_FILL_COLOR","HatchPatternRenderer","loopSet","patternItem","patternName","validLoops","typedLoops","outers","loops","last","first","colorOverride","outer","shape","BufferGeometryUtils.mergeGeometries","gradient","colors","stops","sizeX","sizeY","radius","angle","axis","normal","source","safeDepth","ab","bc","ca","relative","shift","axisSpan","normalSpan","stop","tint","localPoints","maxSegments","segmentCount","diagonal","patternLine","familySegments","segmentBudget","patternTransform","dir","normalStep","corners","baseProjection","projections","corner","minProjection","maxProjection","i0","i1","boundsCenter","lineAnchor","lineCenter","visibleStart","visibleEnd","tValues","p0","p1","unique","t0","t1","holePieces","dashLengths","lineDirection","length","pattern","period","sum","anchor","sign","startPhaseDistance","startOffsetInPeriod","cursor","patternIndex","distanceInCurrentDash","dash","remainingDash","rawDash","intervals","cma","xi","yi","xj","yj","distance","values","epsilon","EntityGeometryFactory","textFactory","curve","rawPoints","startPoint","endPoint","bulge","chord","chordLength","includedAngle","startAngle","arcPoints","sampled","spline","weight","controlPointCount","imageUrl","uVector","vVector","uScale","vScale","up","p2","p3","fade","SceneBatchBuilder","_engine","model","targetGroup","modelMap","nodePoints","map","key","dashedPoints","layerItem","itemLineType","lineType","rawPattern","rawScale","unit","totalPatternLength","dotLength","sourceLength","isDraw","dashLength","nextCursor","lines","objectIndex","renderItems","useVertexColors","texture","opacity","group","keepUv","keepColor","colorValue","mesh","rawText","colorText","TextGeometryFactory","curveSegments","textPosition","widthScale","hitbox","hitboxBounds","lineHeight","line","safeLine","box","LoaderModule2d","dwgData","parsed","viewRotation","jsonData","flattener","totalTiles","chunkSize","enableChunkedLoading","batchBuilder","linkIds","renderItemCount","chunkCount","resolve","collectFromEntities","background","WorldToScreen","worldPos","pos","objectsToTest","intersects","OctreeBox2d","rayCaster","meshs","mousePoint","interList","threeBox","isinter","ps","screenLines","geo","invisibleMesh","ele","ids","lineDir","lineLengthSq","toPoint","projectionPoint","LinkView2d3d","this_","dpr","currentAngle","angleDelta","ctx","cx","cy","coneLength","halfAngle","grad","lx","ly","rx","ry","screenPoint","halfSize","worldPoint","mode","payload","hasPosition","hasRotation","detail","mappedZ","pointerAngle","LinkElement2d3d","ModelToolModule2d","engine_","newGeometry","_model","models","callback","isLightBackground","originalColor","displayColor","applyColor","colorAttribute","replaceWhite","hoverModels","selectedIds","isClear","disposeMaterial","lineCoordinateCount","meshVertexCount","HandelBehaved2d","_handelBehaved","self","handle_Mouse_Down","handle_Mouse_Up","handle_Mouse_Move","handle_Touch_Start","handle_Touch_End","handle_Touch_Move","handle_key_down","handle_key_up","getNormalizedMousePosition","mouse","createRaycaster","raycaster","enrichEventWithRaycast","includeCatch","catchResult","handle_catch","currentEvent","nowTime","timeDiff","current_position","dis","convertTouchToMouseEvent","touchEvent","mouseEvent","MouseCoordUI","EventType","InteractionModule2d","world","_event","CadCursorUI","canvas","style","cursorColor","MENU_ITEMS","ContextMenuUI","onAction","menu","btn","defaults","defaultItem","menuW","menuH","contW","contH","action","states","LoadingUI","pct","overlay","card","spinnerWrap","track","bar","ICON_SEARCH","ICON_CLOSE","SearchUI","wrapper","hasText","query","results","li","escapedText","normalizedQuery","escapedQuery","SearchManager","score","normalizedText","gap","nextIndex","THEME_VARS","ThemeManager","initial","theme","vars","val","EngineKernel2d","nextTheme","Stats","modelIds","sceneStats","format","quality","mimeType","transparent","hideGrid","hideAxes","originalBackground","originalGridVisible","originalAxesVisible","dataURL","filename","link","blob","blobURL","createEngine2d"],"mappings":"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","x_google_ignoreList":[0,9,15,17,18,19]}