{"version":3,"file":"index-GxSkv9Ih.mjs","sources":["../../src/renderers/Cad/toolbar.tsx","../../src/renderers/Cad/index.tsx"],"sourcesContent":["import React from 'react';\nimport { RotateCcw, Grid3x3, Axis3d, Box } from 'lucide-react';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface CadRendererHandle {\n  resetView: () => void;\n  toggleWireframe: () => void;\n  toggleGrid: () => void;\n  toggleAxes: () => void;\n}\n\nexport interface CadToolbarContext {\n  cadRef: React.RefObject<CadRendererHandle | null>;\n  wireframe: boolean;\n  showGrid: boolean;\n  showAxes: boolean;\n  t: Translator;\n}\n\nexport function getCadToolbarGroups(ctx: CadToolbarContext): ToolbarGroup[] {\n  return [\n    {\n      items: [\n        {\n          type: 'button',\n          icon: <RotateCcw className=\"rfp-w-4 rfp-h-4\" />,\n          tooltip: ctx.t('toolbar.reset'),\n          action: () => ctx.cadRef.current?.resetView(),\n        },\n      ],\n    },\n    {\n      items: [\n        {\n          type: 'button',\n          icon: <Box className=\"rfp-w-4 rfp-h-4\" />,\n          tooltip: ctx.wireframe ? ctx.t('cad.solid') : ctx.t('cad.wireframe'),\n          active: ctx.wireframe,\n          action: () => ctx.cadRef.current?.toggleWireframe(),\n        },\n        {\n          type: 'button',\n          icon: <Grid3x3 className=\"rfp-w-4 rfp-h-4\" />,\n          tooltip: ctx.t('cad.grid'),\n          active: ctx.showGrid,\n          action: () => ctx.cadRef.current?.toggleGrid(),\n        },\n        {\n          type: 'button',\n          icon: <Axis3d className=\"rfp-w-4 rfp-h-4\" />,\n          tooltip: ctx.t('cad.axes'),\n          active: ctx.showAxes,\n          action: () => ctx.cadRef.current?.toggleAxes(),\n        },\n      ],\n    },\n  ];\n}\n","import { useEffect, useRef, useState, forwardRef, useImperativeHandle, useCallback } from 'react';\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\nimport { DXFLoader } from 'three-dxf-loader';\nimport { STLLoader } from 'three/examples/jsm/loaders/STLLoader';\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport type { RendererHandle } from '../base.types';\nimport { getCadToolbarGroups } from './toolbar';\n\nexport interface CadRendererProps {\n  url: string;\n  file?: File;\n  fileName?: string;\n}\n\nexport const CadRenderer = forwardRef<RendererHandle, CadRendererProps>(({ url, file, fileName }, ref) => {\n  const t = useTranslator();\n  const fetcher = useFetcher();\n  const containerRef = useRef<HTMLDivElement>(null);\n  const sceneRef = useRef<THREE.Scene | null>(null);\n  const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);\n  const rendererRef = useRef<THREE.WebGLRenderer | null>(null);\n  const controlsRef = useRef<OrbitControls | null>(null);\n  const modelRef = useRef<THREE.Object3D | null>(null);\n  const gridRef = useRef<THREE.GridHelper | null>(null);\n  const axesRef = useRef<THREE.AxesHelper | null>(null);\n  const cadRef = useRef<any>(null);\n\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<string | null>(null);\n  const [wireframe, setWireframe] = useState(false);\n  const [showGrid, setShowGrid] = useState(true);\n  const [showAxes, setShowAxes] = useState(true);\n\n  const listenersRef = useRef<Set<() => void>>(new Set());\n\n  const notifyToolbarChange = useCallback(() => {\n    listenersRef.current.forEach((listener) => listener());\n  }, []);\n\n  // 获取文件扩展名\n  const getExtension = (url: string, fileName?: string, file?: File): string => {\n    // 优先从 file.name 获取\n    if (file?.name) {\n      return file.name.split('.').pop()?.toLowerCase() || '';\n    }\n    // 其次从 fileName 获取\n    if (fileName) {\n      return fileName.split('.').pop()?.toLowerCase() || '';\n    }\n    // 最后从 URL 获取（但 blob URL 没有扩展名）\n    return url.split('.').pop()?.toLowerCase().split('?')[0] || '';\n  };\n\n  // 释放 THREE.js 资源\n  const disposeThreeResources = useCallback((obj: THREE.Object3D) => {\n    obj.traverse((child: any) => {\n      if (child.geometry) {\n        child.geometry.dispose();\n      }\n      if (child.material) {\n        if (Array.isArray(child.material)) {\n          child.material.forEach((mat: any) => {\n            disposeMaterial(mat);\n          });\n        } else {\n          disposeMaterial(child.material);\n        }\n      }\n    });\n  }, []);\n\n  const disposeMaterial = (material: any) => {\n    if (material.map) material.map.dispose();\n    if (material.lightMap) material.lightMap.dispose();\n    if (material.bumpMap) material.bumpMap.dispose();\n    if (material.normalMap) material.normalMap.dispose();\n    if (material.specularMap) material.specularMap.dispose();\n    if (material.envMap) material.envMap.dispose();\n    material.dispose();\n  };\n\n  // 重置视图\n  const resetView = useCallback(() => {\n    if (!controlsRef.current || !cameraRef.current || !modelRef.current) return;\n\n    const box = new THREE.Box3().setFromObject(modelRef.current);\n    const center = box.getCenter(new THREE.Vector3());\n    const size = box.getSize(new THREE.Vector3());\n    const maxDim = Math.max(size.x, size.y, size.z);\n    const fov = cameraRef.current.fov * (Math.PI / 180);\n    let cameraZ = Math.abs(maxDim / 2 / Math.tan(fov / 2));\n    cameraZ *= 1.5;\n\n    cameraRef.current.position.set(center.x + cameraZ, center.y + cameraZ, center.z + cameraZ);\n    cameraRef.current.lookAt(center);\n    controlsRef.current.target.copy(center);\n    controlsRef.current.update();\n  }, []);\n\n  // 切换线框模式\n  const toggleWireframe = useCallback(() => {\n    setWireframe((prev) => {\n      const newWireframe = !prev;\n      if (modelRef.current) {\n        modelRef.current.traverse((child: THREE.Object3D) => {\n          if (child instanceof THREE.Mesh) {\n            const material = child.material;\n            if (material) {\n              if (Array.isArray(material)) {\n                material.forEach((mat: any) => {\n                  mat.wireframe = newWireframe;\n                });\n              } else {\n                (material as any).wireframe = newWireframe;\n              }\n            }\n          }\n        });\n      }\n      notifyToolbarChange();\n      return newWireframe;\n    });\n  }, [notifyToolbarChange]);\n\n  // 切换网格\n  const toggleGrid = useCallback(() => {\n    setShowGrid((prev) => {\n      const newShow = !prev;\n      if (gridRef.current) {\n        gridRef.current.visible = newShow;\n      }\n      notifyToolbarChange();\n      return newShow;\n    });\n  }, [notifyToolbarChange]);\n\n  // 切换坐标轴\n  const toggleAxes = useCallback(() => {\n    setShowAxes((prev) => {\n      const newShow = !prev;\n      if (axesRef.current) {\n        axesRef.current.visible = newShow;\n      }\n      notifyToolbarChange();\n      return newShow;\n    });\n  }, [notifyToolbarChange]);\n\n  // 构建 cadRef handle\n  cadRef.current = {\n    resetView,\n    toggleWireframe,\n    toggleGrid,\n    toggleAxes,\n  };\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      getToolbarGroups: () => {\n        return getCadToolbarGroups({\n          cadRef: { current: cadRef.current },\n          wireframe,\n          showGrid,\n          showAxes,\n          t,\n        });\n      },\n      onToolbarChange: (listener: () => void) => {\n        listenersRef.current.add(listener);\n        return () => {\n          listenersRef.current.delete(listener);\n        };\n      },\n    }),\n    [wireframe, showGrid, showAxes, t]\n  );\n\n  useEffect(() => {\n    if (!containerRef.current) return;\n\n    const container = containerRef.current;\n    const width = container.clientWidth;\n    const height = container.clientHeight;\n\n    // 创建 AbortController 来支持取消请求\n    const abortController = new AbortController();\n    let animationId: number;\n    let isCleanedUp = false;\n\n    // 初始化场景\n    const scene = new THREE.Scene();\n    scene.background = new THREE.Color(0x1a1a1a);\n    sceneRef.current = scene;\n\n    // 初始化相机\n    const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 10000);\n    camera.position.set(100, 100, 100);\n    cameraRef.current = camera;\n\n    // 初始化渲染器\n    const renderer = new THREE.WebGLRenderer({ antialias: true });\n    renderer.setSize(width, height);\n    renderer.setPixelRatio(window.devicePixelRatio);\n    container.appendChild(renderer.domElement);\n    rendererRef.current = renderer;\n\n    // 初始化控制器\n    const controls = new OrbitControls(camera, renderer.domElement);\n    controls.enableDamping = true;\n    controls.dampingFactor = 0.05;\n    controlsRef.current = controls;\n\n    // 添加灯光\n    const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);\n    scene.add(ambientLight);\n\n    const directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.8);\n    directionalLight1.position.set(1, 1, 1);\n    scene.add(directionalLight1);\n\n    const directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.4);\n    directionalLight2.position.set(-1, -1, -1);\n    scene.add(directionalLight2);\n\n    // 添加网格\n    const grid = new THREE.GridHelper(200, 20, 0x444444, 0x222222);\n    grid.visible = showGrid;\n    scene.add(grid);\n    gridRef.current = grid;\n\n    // 添加坐标轴\n    const axes = new THREE.AxesHelper(100);\n    axes.visible = showAxes;\n    scene.add(axes);\n    axesRef.current = axes;\n\n    // 加载模型 - 优先使用 File 对象，回退到 fetcher\n    const ext = getExtension(url, fileName, file);\n    let loader: any;\n\n    // 创建 LoadingManager\n    const manager = new THREE.LoadingManager();\n\n    if (ext === 'dxf') {\n      loader = new DXFLoader();\n    } else if (ext === 'stl') {\n      loader = new STLLoader(manager);\n    } else if (ext === 'obj') {\n      loader = new OBJLoader(manager);\n    } else if (ext === 'gltf' || ext === 'glb') {\n      loader = new GLTFLoader(manager);\n    } else {\n      setError(t('cad.parse_failed'));\n      setLoading(false);\n      return;\n    }\n\n    // 如果有 File 对象，直接读取；否则使用 fetcher\n    const loadPromise = file\n      ? file.arrayBuffer()\n      : fetcher(url, { signal: abortController.signal }).then((response) => {\n          if (isCleanedUp) return undefined;\n          if (!response.ok) throw new Error('Failed to fetch file');\n          return response.arrayBuffer();\n        });\n\n    loadPromise\n      .then((data: ArrayBuffer | undefined) => {\n        if (isCleanedUp || !data) return;\n\n        if (ext === 'stl') {\n          const object = loader.parse(data);\n          handleLoadSuccess(object, ext, scene, camera, controls);\n        } else if (ext === 'obj') {\n          // OBJLoader 需要字符串，转换 ArrayBuffer\n          const decoder = new TextDecoder('utf-8');\n          const text = decoder.decode(data);\n          const object = loader.parse(text);\n          handleLoadSuccess(object, ext, scene, camera, controls);\n        } else if (ext === 'gltf' || ext === 'glb') {\n          loader.parse(\n            data,\n            '',\n            (gltf: any) => {\n              if (!isCleanedUp) {\n                handleLoadSuccess(gltf, ext, scene, camera, controls);\n              }\n            },\n            (err: Error) => handleLoadError(err)\n          );\n        } else if (ext === 'dxf') {\n          // DXFLoader 需要字符串\n          const decoder = new TextDecoder('utf-8');\n          const text = decoder.decode(data);\n\n          // three-dxf-loader 对某些实体（如 3D polyface mesh）会生成 undefined 顶点，\n          // 导致 THREE.BufferGeometry.setFromPoints 抛 \"reading 'x'\"。\n          // 临时 patch 过滤坏点，加载完成后立即恢复。\n          const origSetFromPoints = (THREE.BufferGeometry.prototype as any).setFromPoints;\n          (THREE.BufferGeometry.prototype as any).setFromPoints = function (points: any[]) {\n            const filtered = (points || []).filter(\n              (p: any) => p && p.x !== undefined && p.y !== undefined\n            );\n            return origSetFromPoints.call(this, filtered);\n          };\n\n          try {\n            (loader as any).loadString(\n              text,\n              (dxfData: any) => {\n                if (!isCleanedUp) {\n                  // three-dxf-loader 返回的是 { entity: Object3D }\n                  const obj = dxfData?.entity || dxfData;\n                  handleLoadSuccess(obj, ext, scene, camera, controls);\n                }\n              },\n              (err: Error) => {\n                handleLoadError(err);\n              }\n            );\n          } catch (err: any) {\n            // loadString 可能同步抛出解析错误\n            handleLoadError(err);\n          } finally {\n            (THREE.BufferGeometry.prototype as any).setFromPoints = origSetFromPoints;\n          }\n        }\n      })\n      .catch((err) => {\n        if (!isCleanedUp) {\n          handleLoadError(err);\n        }\n      });\n\n    // 处理加载成功\n    const handleLoadSuccess = (\n      object: any,\n      ext: string,\n      scene: THREE.Scene,\n      camera: THREE.PerspectiveCamera,\n      controls: OrbitControls\n    ) => {\n      if (isCleanedUp) return;\n\n      // 验证对象有效性\n      if (!object) {\n        setError(t('cad.parse_failed'));\n        setLoading(false);\n        return;\n      }\n\n      let model: THREE.Object3D;\n\n      if (ext === 'stl') {\n        // STL 返回 geometry\n        const geometry = object as THREE.BufferGeometry;\n        const material = new THREE.MeshPhongMaterial({\n          color: 0x888888,\n          flatShading: true,\n          side: THREE.DoubleSide,\n        });\n        model = new THREE.Mesh(geometry, material);\n      } else if (ext === 'gltf' || ext === 'glb') {\n        // GLTF/GLB 返回 { scene, ... }\n        model = object.scene as THREE.Object3D;\n      } else {\n        // DXF 和 OBJ 返回 Object3D\n        model = object as THREE.Object3D;\n\n        // 为没有材质的对象添加默认材质\n        model.traverse((child: THREE.Object3D) => {\n          if (child instanceof THREE.Mesh && !child.material) {\n            child.material = new THREE.MeshPhongMaterial({\n              color: 0x888888,\n              side: THREE.DoubleSide,\n            });\n          }\n        });\n      }\n\n      scene.add(model);\n      modelRef.current = model;\n\n      // 自动调整视角\n      const box = new THREE.Box3().setFromObject(model);\n      const center = box.getCenter(new THREE.Vector3());\n      const size = box.getSize(new THREE.Vector3());\n      const maxDim = Math.max(size.x, size.y, size.z);\n      const fov = camera.fov * (Math.PI / 180);\n      let cameraZ = Math.abs(maxDim / 2 / Math.tan(fov / 2));\n      cameraZ *= 1.5;\n\n      camera.position.set(center.x + cameraZ, center.y + cameraZ, center.z + cameraZ);\n      camera.lookAt(center);\n      controls.target.copy(center);\n      controls.update();\n\n      setLoading(false);\n      notifyToolbarChange();\n    };\n\n    // 处理加载错误\n    const handleLoadError = (err: Error) => {\n      if (isCleanedUp) return;\n      if (err.name === 'AbortError') {\n        return;\n      }\n      setError(t('cad.load_failed'));\n      setLoading(false);\n    };\n\n    // 动画循环\n    const animate = () => {\n      if (isCleanedUp) return;\n      animationId = requestAnimationFrame(animate);\n      controls.update();\n      renderer.render(scene, camera);\n    };\n    animate();\n\n    // 处理窗口大小变化\n    const handleResize = () => {\n      if (!container || isCleanedUp) return;\n      const newWidth = container.clientWidth;\n      const newHeight = container.clientHeight;\n      camera.aspect = newWidth / newHeight;\n      camera.updateProjectionMatrix();\n      renderer.setSize(newWidth, newHeight);\n    };\n    window.addEventListener('resize', handleResize);\n\n    // 清理\n    return () => {\n      isCleanedUp = true;\n      abortController.abort();\n      if (animationId) {\n        cancelAnimationFrame(animationId);\n      }\n      window.removeEventListener('resize', handleResize);\n\n      // 释放 THREE.js 资源\n      if (modelRef.current) {\n        disposeThreeResources(modelRef.current);\n        scene.remove(modelRef.current);\n        modelRef.current = null;\n      }\n      if (gridRef.current) {\n        gridRef.current.geometry.dispose();\n        (gridRef.current.material as any).dispose();\n        scene.remove(gridRef.current);\n        gridRef.current = null;\n      }\n      if (axesRef.current) {\n        axesRef.current.geometry.dispose();\n        (axesRef.current.material as any).dispose();\n        scene.remove(axesRef.current);\n        axesRef.current = null;\n      }\n\n      controls.dispose();\n      renderer.dispose();\n      if (container && renderer.domElement && container.contains(renderer.domElement)) {\n        container.removeChild(renderer.domElement);\n      }\n    };\n  }, [url, t, notifyToolbarChange, disposeThreeResources, file, fetcher]);\n\n  return (\n    <div ref={containerRef} className=\"rfp-relative rfp-w-full rfp-h-full rfp-bg-media-bg\">\n      {/* 错误覆盖层 */}\n      {error && (\n        <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-3 rfp-z-10\">\n          <div className=\"rfp-text-center\">\n            <p className=\"rfp-text-fg-primary\">{error}</p>\n          </div>\n        </div>\n      )}\n\n      {/* 加载覆盖层 */}\n      {loading && (\n        <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-3 rfp-z-10\">\n          <div className=\"rfp-text-center\">\n            <div className=\"rfp-inline-block rfp-w-8 rfp-h-8 rfp-border-4 rfp-border-spinner-track rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n            <p className=\"rfp-mt-4 rfp-text-fg-secondary\">{t('cad.loading')}</p>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n});\n\nCadRenderer.displayName = 'CadRenderer';\n"],"names":["getCadToolbarGroups","ctx","jsx","RotateCcw","_a","Box","Grid3x3","Axis3d","CadRenderer","forwardRef","url","file","fileName","ref","t","useTranslator","fetcher","useFetcher","containerRef","useRef","sceneRef","cameraRef","rendererRef","controlsRef","modelRef","gridRef","axesRef","cadRef","loading","setLoading","useState","error","setError","wireframe","setWireframe","showGrid","setShowGrid","showAxes","setShowAxes","listenersRef","notifyToolbarChange","useCallback","listener","getExtension","disposeThreeResources","obj","child","mat","disposeMaterial","material","resetView","box","THREE","center","size","maxDim","fov","cameraZ","toggleWireframe","prev","newWireframe","toggleGrid","newShow","toggleAxes","useImperativeHandle","useEffect","container","width","height","abortController","animationId","isCleanedUp","scene","camera","renderer","controls","OrbitControls","ambientLight","directionalLight1","directionalLight2","grid","axes","ext","loader","manager","DXFLoader","STLLoader","OBJLoader","GLTFLoader","response","data","object","handleLoadSuccess","text","gltf","err","handleLoadError","origSetFromPoints","points","filtered","p","dxfData","model","geometry","animate","handleResize","newWidth","newHeight","jsxs"],"mappings":"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"}