@eternalheart/vue-file-preview 1.6.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/README.zh-CN.md +6 -5
- package/lib/chunks/{index-DD9QZ4a2.mjs → index-04rWay5r.mjs} +13 -13
- package/lib/chunks/{index-DD9QZ4a2.mjs.map → index-04rWay5r.mjs.map} +1 -1
- package/lib/chunks/{index-CdUSfYfF.mjs → index-BG-e_YTm.mjs} +26 -26
- package/lib/chunks/{index-CdUSfYfF.mjs.map → index-BG-e_YTm.mjs.map} +1 -1
- package/lib/chunks/{index-DcLACobl.mjs → index-BJ9Jd5fz.mjs} +22 -22
- package/lib/chunks/{index-DcLACobl.mjs.map → index-BJ9Jd5fz.mjs.map} +1 -1
- package/lib/chunks/{index-C-ikNsDh.mjs → index-BRH8E5yi.mjs} +21 -21
- package/lib/chunks/{index-C-ikNsDh.mjs.map → index-BRH8E5yi.mjs.map} +1 -1
- package/lib/chunks/{index-D-YwSyrE.mjs → index-Bicn2NYv.mjs} +25 -25
- package/lib/chunks/{index-D-YwSyrE.mjs.map → index-Bicn2NYv.mjs.map} +1 -1
- package/lib/chunks/{index-C1Ev7K-W.mjs → index-BkcwI2qf.mjs} +2 -2
- package/lib/chunks/{index-C1Ev7K-W.mjs.map → index-BkcwI2qf.mjs.map} +1 -1
- package/lib/chunks/index-C38FDG67.mjs +2530 -0
- package/lib/chunks/index-C38FDG67.mjs.map +1 -0
- package/lib/chunks/{index-EPkoXaAV.mjs → index-CK5v4U-z.mjs} +2 -2
- package/lib/chunks/{index-EPkoXaAV.mjs.map → index-CK5v4U-z.mjs.map} +1 -1
- package/lib/chunks/{index-Dcruruhk.mjs → index-CTcS-MsV.mjs} +2 -2
- package/lib/chunks/{index-Dcruruhk.mjs.map → index-CTcS-MsV.mjs.map} +1 -1
- package/lib/chunks/index-CcjZzhj5.mjs +377 -0
- package/lib/chunks/index-CcjZzhj5.mjs.map +1 -0
- package/lib/chunks/{index-CKKL3xiq.mjs → index-CfzeM7g7.mjs} +32 -32
- package/lib/chunks/{index-CKKL3xiq.mjs.map → index-CfzeM7g7.mjs.map} +1 -1
- package/lib/chunks/{index-DxSw5Ekp.mjs → index-CgYTaOkd.mjs} +2 -2
- package/lib/chunks/{index-DxSw5Ekp.mjs.map → index-CgYTaOkd.mjs.map} +1 -1
- package/lib/chunks/{index-Cl9ZiWVl.mjs → index-CxFwOWi1.mjs} +2 -2
- package/lib/chunks/{index-Cl9ZiWVl.mjs.map → index-CxFwOWi1.mjs.map} +1 -1
- package/lib/chunks/{index-B3Bv_Etp.mjs → index-D0Zr3fiq.mjs} +14 -14
- package/lib/chunks/{index-B3Bv_Etp.mjs.map → index-D0Zr3fiq.mjs.map} +1 -1
- package/lib/chunks/{index-Cy83gsDL.mjs → index-DHEHo8Oq.mjs} +76 -76
- package/lib/chunks/{index-Cy83gsDL.mjs.map → index-DHEHo8Oq.mjs.map} +1 -1
- package/lib/chunks/{index-DL3qn-zG.mjs → index-DLQiuuqn.mjs} +2 -2
- package/lib/chunks/{index-DL3qn-zG.mjs.map → index-DLQiuuqn.mjs.map} +1 -1
- package/lib/chunks/{index-BAbJRSyS.mjs → index-DLaaej5b.mjs} +633 -627
- package/lib/chunks/{index-BAbJRSyS.mjs.map → index-DLaaej5b.mjs.map} +1 -1
- package/lib/chunks/{index-CLDPeQbI.mjs → index-DlmsnYdv.mjs} +20 -20
- package/lib/chunks/{index-CLDPeQbI.mjs.map → index-DlmsnYdv.mjs.map} +1 -1
- package/lib/chunks/{index-BMz5d0Rs.mjs → index-Yie5jBdV.mjs} +15 -15
- package/lib/chunks/{index-BMz5d0Rs.mjs.map → index-Yie5jBdV.mjs.map} +1 -1
- package/lib/chunks/{index-Dqqq0VnB.mjs → index-r9hisC9w.mjs} +2 -2
- package/lib/chunks/{index-Dqqq0VnB.mjs.map → index-r9hisC9w.mjs.map} +1 -1
- package/lib/chunks/psdLoader-D5CkupyY-DMppLen1.mjs +79 -0
- package/lib/chunks/psdLoader-D5CkupyY-DMppLen1.mjs.map +1 -0
- package/lib/chunks/{tiffLoader-CTFKVLqJ-B84NfwhR.mjs → tiffLoader-CmUAD1vO-DABms0J3.mjs} +7 -7
- package/lib/chunks/tiffLoader-CmUAD1vO-DABms0J3.mjs.map +1 -0
- package/lib/chunks/{useShikiHighlight-CIk_v_UB.mjs → useShikiHighlight-ChY7TOSl.mjs} +2 -2
- package/lib/chunks/{useShikiHighlight-CIk_v_UB.mjs.map → useShikiHighlight-ChY7TOSl.mjs.map} +1 -1
- package/lib/index.cjs +47 -47
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.mjs +5 -5
- package/lib/renderers/Image/index.vue.d.ts.map +1 -1
- package/lib/renderers/Pdf/index.vue.d.ts.map +1 -1
- package/package.json +1 -1
- package/lib/chunks/index-2RMNnT0y.mjs +0 -363
- package/lib/chunks/index-2RMNnT0y.mjs.map +0 -1
- package/lib/chunks/index-M_Nf3MY5.mjs +0 -2458
- package/lib/chunks/index-M_Nf3MY5.mjs.map +0 -1
- package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs +0 -73
- package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs.map +0 -1
- package/lib/chunks/tiffLoader-CTFKVLqJ-B84NfwhR.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-C1Ev7K-W.mjs","sources":["../../src/renderers/Cad/toolbar.ts","../../src/renderers/Cad/index.vue"],"sourcesContent":["import { RotateCcw, Grid3x3, Axis3d, Box } from 'lucide-vue-next';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface CadToolbarContext {\n cadRef: { resetView: () => void; toggleWireframe: () => void; toggleGrid: () => void; toggleAxes: () => void } | 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,\n tooltip: ctx.t('toolbar.reset'),\n action: () => ctx.cadRef?.resetView(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: Box,\n tooltip: ctx.wireframe ? ctx.t('cad.solid') : ctx.t('cad.wireframe'),\n active: ctx.wireframe,\n action: () => ctx.cadRef?.toggleWireframe(),\n },\n {\n type: 'button',\n icon: Grid3x3,\n tooltip: ctx.t('cad.grid'),\n active: ctx.showGrid,\n action: () => ctx.cadRef?.toggleGrid(),\n },\n {\n type: 'button',\n icon: Axis3d,\n tooltip: ctx.t('cad.axes'),\n active: ctx.showAxes,\n action: () => ctx.cadRef?.toggleAxes(),\n },\n ],\n },\n ];\n}\n","<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch } from 'vue';\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 '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { ToolbarEventEmitter } from '../base.types';\nimport type { RendererHandle } from '../base.types';\nimport { getCadToolbarGroups } from './toolbar';\n\ninterface Props {\n url: string;\n file?: File;\n fileName?: string;\n}\n\nconst props = defineProps<Props>();\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\n\nconst containerRef = ref<HTMLDivElement | null>(null);\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst wireframe = ref(false);\nconst showGrid = ref(true);\nconst showAxes = ref(true);\n\nlet scene: THREE.Scene | null = null;\nlet camera: THREE.PerspectiveCamera | null = null;\nlet renderer: THREE.WebGLRenderer | null = null;\nlet controls: OrbitControls | null = null;\nlet model: THREE.Object3D | null = null;\nlet grid: THREE.GridHelper | null = null;\nlet axes: THREE.AxesHelper | null = null;\nlet animationId: number | null = null;\nlet abortController: AbortController | null = null;\nlet isCleanedUp = false;\n\nconst toolbarEmitter = new ToolbarEventEmitter();\n\n// 获取文件扩展名\nconst 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// 重置视图\nconst resetView = () => {\n if (!controls || !camera || !model) return;\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\n// 切换线框模式\nconst toggleWireframe = () => {\n wireframe.value = !wireframe.value;\n if (model) {\n model.traverse((child: any) => {\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 = wireframe.value;\n });\n } else {\n material.wireframe = wireframe.value;\n }\n }\n }\n });\n }\n toolbarEmitter.notify();\n};\n\n// 切换网格\nconst toggleGrid = () => {\n showGrid.value = !showGrid.value;\n if (grid) {\n grid.visible = showGrid.value;\n }\n toolbarEmitter.notify();\n};\n\n// 切换坐标轴\nconst toggleAxes = () => {\n showAxes.value = !showAxes.value;\n if (axes) {\n axes.visible = showAxes.value;\n }\n toolbarEmitter.notify();\n};\n\n// 暴露 RendererHandle 接口\ndefineExpose<RendererHandle>({\n getToolbarGroups: () => {\n return getCadToolbarGroups({\n cadRef: { resetView, toggleWireframe, toggleGrid, toggleAxes },\n wireframe: wireframe.value,\n showGrid: showGrid.value,\n showAxes: showAxes.value,\n t: t.value,\n });\n },\n onToolbarChange: (listener: () => void) => {\n return toolbarEmitter.subscribe(listener);\n },\n});\n\n// 释放 THREE.js 资源\nconst disposeThreeResources = (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\nconst 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// 初始化场景\nconst initScene = () => {\n if (!containerRef.value) return;\n\n // 重置清理状态\n isCleanedUp = false;\n abortController = new AbortController();\n\n const container = containerRef.value;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // 创建场景\n scene = new THREE.Scene();\n scene.background = new THREE.Color(0x1a1a1a);\n\n // 创建相机\n camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 10000);\n camera.position.set(100, 100, 100);\n\n // 创建渲染器\n renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setSize(width, height);\n renderer.setPixelRatio(window.devicePixelRatio);\n container.appendChild(renderer.domElement);\n\n // 创建控制器\n controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.dampingFactor = 0.05;\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 grid = new THREE.GridHelper(200, 20, 0x444444, 0x222222);\n grid.visible = showGrid.value;\n scene.add(grid);\n\n // 添加坐标轴\n axes = new THREE.AxesHelper(100);\n axes.visible = showAxes.value;\n scene.add(axes);\n\n // 加载模型\n loadModel();\n\n // 动画循环\n const animate = () => {\n if (isCleanedUp) return;\n animationId = requestAnimationFrame(animate);\n controls?.update();\n if (scene && camera && renderer) {\n renderer.render(scene, camera);\n }\n };\n animate();\n\n // 处理窗口大小变化\n window.addEventListener('resize', handleResize);\n};\n\n// 加载模型\nconst loadModel = () => {\n if (!scene || !camera || !controls || isCleanedUp) return;\n\n const ext = getExtension(props.url, props.fileName, props.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 error.value = t.value('cad.parse_failed');\n loading.value = false;\n return;\n }\n\n // 处理加载成功\n const handleLoadSuccess = (object: any, ext: string) => {\n if (isCleanedUp) return;\n\n // 验证对象有效性\n if (!object) {\n error.value = t.value('cad.parse_failed');\n loading.value = false;\n return;\n }\n\n let loadedModel: 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 loadedModel = new THREE.Mesh(geometry, material);\n } else if (ext === 'gltf' || ext === 'glb') {\n // GLTF/GLB 返回 { scene, ... }\n loadedModel = object.scene as THREE.Object3D;\n } else {\n // DXF 和 OBJ 返回 Object3D\n loadedModel = object as THREE.Object3D;\n\n // 为没有材质的对象添加默认材质\n loadedModel.traverse((child: any) => {\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(loadedModel);\n model = loadedModel;\n\n // 自动调整视角\n const box = new THREE.Box3().setFromObject(loadedModel);\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 loading.value = false;\n toolbarEmitter.notify();\n };\n\n // 处理加载错误\n const handleLoadError = (err: any) => {\n if (isCleanedUp) return;\n if (err.name === 'AbortError') {\n return;\n }\n error.value = t.value('cad.load_failed');\n loading.value = false;\n };\n\n // 如果有 File 对象,直接读取;否则使用 fetcher\n const loadPromise = props.file\n ? props.file.arrayBuffer()\n : fetcher.value(props.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);\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);\n } else if (ext === 'gltf' || ext === 'glb') {\n loader.parse(\n data,\n '',\n (gltf: any) => {\n if (!isCleanedUp) {\n handleLoadSuccess(gltf, ext);\n }\n },\n (err: any) => 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);\n }\n },\n (err: any) => {\n handleLoadError(err);\n }\n );\n } catch (err) {\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// 处理窗口大小变化\nconst handleResize = () => {\n if (!containerRef.value || !camera || !renderer || isCleanedUp) return;\n const newWidth = containerRef.value.clientWidth;\n const newHeight = containerRef.value.clientHeight;\n camera.aspect = newWidth / newHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(newWidth, newHeight);\n};\n\n// 清理\nconst cleanup = () => {\n isCleanedUp = true;\n if (abortController) {\n abortController.abort();\n }\n if (animationId !== null) {\n cancelAnimationFrame(animationId);\n animationId = null;\n }\n window.removeEventListener('resize', handleResize);\n\n // 释放 THREE.js 资源\n if (model) {\n disposeThreeResources(model);\n scene?.remove(model);\n model = null;\n }\n if (grid) {\n grid.geometry.dispose();\n (grid.material as any).dispose();\n scene?.remove(grid);\n grid = null;\n }\n if (axes) {\n axes.geometry.dispose();\n (axes.material as any).dispose();\n scene?.remove(axes);\n axes = null;\n }\n\n controls?.dispose();\n renderer?.dispose();\n if (containerRef.value && renderer?.domElement && containerRef.value.contains(renderer.domElement)) {\n containerRef.value.removeChild(renderer.domElement);\n }\n\n scene = null;\n camera = null;\n renderer = null;\n controls = null;\n};\n\nonMounted(() => {\n initScene();\n});\n\nonUnmounted(() => {\n cleanup();\n});\n\nwatch(() => props.url, () => {\n cleanup();\n loading.value = true;\n error.value = null;\n if (containerRef.value) {\n initScene();\n }\n});\n</script>\n\n<template>\n <div ref=\"containerRef\" class=\"vfp-relative vfp-w-full vfp-h-full vfp-bg-media-bg\">\n <!-- 错误覆盖层 -->\n <div\n v-if=\"error\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-3 vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <p class=\"vfp-text-fg-primary\">{{ error }}</p>\n </div>\n </div>\n\n <!-- 加载覆盖层 -->\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-3 vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div class=\"vfp-inline-block vfp-w-8 vfp-h-8 vfp-border-4 vfp-border-spinner-track vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\" />\n <p class=\"vfp-mt-4 vfp-text-fg-secondary\">{{ t('cad.loading') }}</p>\n </div>\n </div>\n </div>\n</template>\n"],"names":["getCadToolbarGroups","ctx","RotateCcw","_a","Box","Grid3x3","Axis3d","props","__props","t","useTranslator","fetcher","useFetcher","containerRef","ref","loading","error","wireframe","showGrid","showAxes","scene","camera","renderer","controls","model","grid","axes","animationId","abortController","isCleanedUp","toolbarEmitter","ToolbarEventEmitter","getExtension","url","fileName","file","_b","_c","resetView","box","THREE","center","size","maxDim","fov","cameraZ","toggleWireframe","child","material","mat","toggleGrid","toggleAxes","__expose","listener","disposeThreeResources","obj","disposeMaterial","initScene","container","width","height","OrbitControls","ambientLight","directionalLight1","directionalLight2","loadModel","animate","handleResize","ext","loader","manager","DXFLoader","STLLoader","OBJLoader","GLTFLoader","handleLoadSuccess","object","loadedModel","geometry","handleLoadError","err","response","data","text","gltf","origSetFromPoints","points","filtered","p","dxfData","newWidth","newHeight","cleanup","onMounted","onUnmounted","watch","_createElementBlock","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_unref"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BkcwI2qf.mjs","sources":["../../src/renderers/Cad/toolbar.ts","../../src/renderers/Cad/index.vue"],"sourcesContent":["import { RotateCcw, Grid3x3, Axis3d, Box } from 'lucide-vue-next';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport type { Translator } from '@eternalheart/file-preview-core';\n\nexport interface CadToolbarContext {\n cadRef: { resetView: () => void; toggleWireframe: () => void; toggleGrid: () => void; toggleAxes: () => void } | 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,\n tooltip: ctx.t('toolbar.reset'),\n action: () => ctx.cadRef?.resetView(),\n },\n ],\n },\n {\n items: [\n {\n type: 'button',\n icon: Box,\n tooltip: ctx.wireframe ? ctx.t('cad.solid') : ctx.t('cad.wireframe'),\n active: ctx.wireframe,\n action: () => ctx.cadRef?.toggleWireframe(),\n },\n {\n type: 'button',\n icon: Grid3x3,\n tooltip: ctx.t('cad.grid'),\n active: ctx.showGrid,\n action: () => ctx.cadRef?.toggleGrid(),\n },\n {\n type: 'button',\n icon: Axis3d,\n tooltip: ctx.t('cad.axes'),\n active: ctx.showAxes,\n action: () => ctx.cadRef?.toggleAxes(),\n },\n ],\n },\n ];\n}\n","<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch } from 'vue';\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 '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { ToolbarEventEmitter } from '../base.types';\nimport type { RendererHandle } from '../base.types';\nimport { getCadToolbarGroups } from './toolbar';\n\ninterface Props {\n url: string;\n file?: File;\n fileName?: string;\n}\n\nconst props = defineProps<Props>();\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\n\nconst containerRef = ref<HTMLDivElement | null>(null);\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst wireframe = ref(false);\nconst showGrid = ref(true);\nconst showAxes = ref(true);\n\nlet scene: THREE.Scene | null = null;\nlet camera: THREE.PerspectiveCamera | null = null;\nlet renderer: THREE.WebGLRenderer | null = null;\nlet controls: OrbitControls | null = null;\nlet model: THREE.Object3D | null = null;\nlet grid: THREE.GridHelper | null = null;\nlet axes: THREE.AxesHelper | null = null;\nlet animationId: number | null = null;\nlet abortController: AbortController | null = null;\nlet isCleanedUp = false;\n\nconst toolbarEmitter = new ToolbarEventEmitter();\n\n// 获取文件扩展名\nconst 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// 重置视图\nconst resetView = () => {\n if (!controls || !camera || !model) return;\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\n// 切换线框模式\nconst toggleWireframe = () => {\n wireframe.value = !wireframe.value;\n if (model) {\n model.traverse((child: any) => {\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 = wireframe.value;\n });\n } else {\n material.wireframe = wireframe.value;\n }\n }\n }\n });\n }\n toolbarEmitter.notify();\n};\n\n// 切换网格\nconst toggleGrid = () => {\n showGrid.value = !showGrid.value;\n if (grid) {\n grid.visible = showGrid.value;\n }\n toolbarEmitter.notify();\n};\n\n// 切换坐标轴\nconst toggleAxes = () => {\n showAxes.value = !showAxes.value;\n if (axes) {\n axes.visible = showAxes.value;\n }\n toolbarEmitter.notify();\n};\n\n// 暴露 RendererHandle 接口\ndefineExpose<RendererHandle>({\n getToolbarGroups: () => {\n return getCadToolbarGroups({\n cadRef: { resetView, toggleWireframe, toggleGrid, toggleAxes },\n wireframe: wireframe.value,\n showGrid: showGrid.value,\n showAxes: showAxes.value,\n t: t.value,\n });\n },\n onToolbarChange: (listener: () => void) => {\n return toolbarEmitter.subscribe(listener);\n },\n});\n\n// 释放 THREE.js 资源\nconst disposeThreeResources = (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\nconst 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// 初始化场景\nconst initScene = () => {\n if (!containerRef.value) return;\n\n // 重置清理状态\n isCleanedUp = false;\n abortController = new AbortController();\n\n const container = containerRef.value;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // 创建场景\n scene = new THREE.Scene();\n scene.background = new THREE.Color(0x1a1a1a);\n\n // 创建相机\n camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 10000);\n camera.position.set(100, 100, 100);\n\n // 创建渲染器\n renderer = new THREE.WebGLRenderer({ antialias: true });\n renderer.setSize(width, height);\n renderer.setPixelRatio(window.devicePixelRatio);\n container.appendChild(renderer.domElement);\n\n // 创建控制器\n controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.dampingFactor = 0.05;\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 grid = new THREE.GridHelper(200, 20, 0x444444, 0x222222);\n grid.visible = showGrid.value;\n scene.add(grid);\n\n // 添加坐标轴\n axes = new THREE.AxesHelper(100);\n axes.visible = showAxes.value;\n scene.add(axes);\n\n // 加载模型\n loadModel();\n\n // 动画循环\n const animate = () => {\n if (isCleanedUp) return;\n animationId = requestAnimationFrame(animate);\n controls?.update();\n if (scene && camera && renderer) {\n renderer.render(scene, camera);\n }\n };\n animate();\n\n // 处理窗口大小变化\n window.addEventListener('resize', handleResize);\n};\n\n// 加载模型\nconst loadModel = () => {\n if (!scene || !camera || !controls || isCleanedUp) return;\n\n const ext = getExtension(props.url, props.fileName, props.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 error.value = t.value('cad.parse_failed');\n loading.value = false;\n return;\n }\n\n // 处理加载成功\n const handleLoadSuccess = (object: any, ext: string) => {\n if (isCleanedUp) return;\n\n // 验证对象有效性\n if (!object) {\n error.value = t.value('cad.parse_failed');\n loading.value = false;\n return;\n }\n\n let loadedModel: 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 loadedModel = new THREE.Mesh(geometry, material);\n } else if (ext === 'gltf' || ext === 'glb') {\n // GLTF/GLB 返回 { scene, ... }\n loadedModel = object.scene as THREE.Object3D;\n } else {\n // DXF 和 OBJ 返回 Object3D\n loadedModel = object as THREE.Object3D;\n\n // 为没有材质的对象添加默认材质\n loadedModel.traverse((child: any) => {\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(loadedModel);\n model = loadedModel;\n\n // 自动调整视角\n const box = new THREE.Box3().setFromObject(loadedModel);\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 loading.value = false;\n toolbarEmitter.notify();\n };\n\n // 处理加载错误\n const handleLoadError = (err: any) => {\n if (isCleanedUp) return;\n if (err.name === 'AbortError') {\n return;\n }\n error.value = t.value('cad.load_failed');\n loading.value = false;\n };\n\n // 如果有 File 对象,直接读取;否则使用 fetcher\n const loadPromise = props.file\n ? props.file.arrayBuffer()\n : fetcher.value(props.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);\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);\n } else if (ext === 'gltf' || ext === 'glb') {\n loader.parse(\n data,\n '',\n (gltf: any) => {\n if (!isCleanedUp) {\n handleLoadSuccess(gltf, ext);\n }\n },\n (err: any) => 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);\n }\n },\n (err: any) => {\n handleLoadError(err);\n }\n );\n } catch (err) {\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// 处理窗口大小变化\nconst handleResize = () => {\n if (!containerRef.value || !camera || !renderer || isCleanedUp) return;\n const newWidth = containerRef.value.clientWidth;\n const newHeight = containerRef.value.clientHeight;\n camera.aspect = newWidth / newHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(newWidth, newHeight);\n};\n\n// 清理\nconst cleanup = () => {\n isCleanedUp = true;\n if (abortController) {\n abortController.abort();\n }\n if (animationId !== null) {\n cancelAnimationFrame(animationId);\n animationId = null;\n }\n window.removeEventListener('resize', handleResize);\n\n // 释放 THREE.js 资源\n if (model) {\n disposeThreeResources(model);\n scene?.remove(model);\n model = null;\n }\n if (grid) {\n grid.geometry.dispose();\n (grid.material as any).dispose();\n scene?.remove(grid);\n grid = null;\n }\n if (axes) {\n axes.geometry.dispose();\n (axes.material as any).dispose();\n scene?.remove(axes);\n axes = null;\n }\n\n controls?.dispose();\n renderer?.dispose();\n if (containerRef.value && renderer?.domElement && containerRef.value.contains(renderer.domElement)) {\n containerRef.value.removeChild(renderer.domElement);\n }\n\n scene = null;\n camera = null;\n renderer = null;\n controls = null;\n};\n\nonMounted(() => {\n initScene();\n});\n\nonUnmounted(() => {\n cleanup();\n});\n\nwatch(() => props.url, () => {\n cleanup();\n loading.value = true;\n error.value = null;\n if (containerRef.value) {\n initScene();\n }\n});\n</script>\n\n<template>\n <div ref=\"containerRef\" class=\"vfp-relative vfp-w-full vfp-h-full vfp-bg-media-bg\">\n <!-- 错误覆盖层 -->\n <div\n v-if=\"error\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-3 vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <p class=\"vfp-text-fg-primary\">{{ error }}</p>\n </div>\n </div>\n\n <!-- 加载覆盖层 -->\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-3 vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div class=\"vfp-inline-block vfp-w-8 vfp-h-8 vfp-border-4 vfp-border-spinner-track vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\" />\n <p class=\"vfp-mt-4 vfp-text-fg-secondary\">{{ t('cad.loading') }}</p>\n </div>\n </div>\n </div>\n</template>\n"],"names":["getCadToolbarGroups","ctx","RotateCcw","_a","Box","Grid3x3","Axis3d","props","__props","t","useTranslator","fetcher","useFetcher","containerRef","ref","loading","error","wireframe","showGrid","showAxes","scene","camera","renderer","controls","model","grid","axes","animationId","abortController","isCleanedUp","toolbarEmitter","ToolbarEventEmitter","getExtension","url","fileName","file","_b","_c","resetView","box","THREE","center","size","maxDim","fov","cameraZ","toggleWireframe","child","material","mat","toggleGrid","toggleAxes","__expose","listener","disposeThreeResources","obj","disposeMaterial","initScene","container","width","height","OrbitControls","ambientLight","directionalLight1","directionalLight2","loadModel","animate","handleResize","ext","loader","manager","DXFLoader","STLLoader","OBJLoader","GLTFLoader","handleLoadSuccess","object","loadedModel","geometry","handleLoadError","err","response","data","text","gltf","origSetFromPoints","points","filtered","p","dxfData","newWidth","newHeight","cleanup","onMounted","onUnmounted","watch","_createElementBlock","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_unref"],"mappings":"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"}
|