From 0863fda6a4729ce56f1036830b5aa1277c39602c Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Fri, 21 Mar 2025 11:04:39 -0400 Subject: [PATCH] [3d] add support to export different formats (#3176) Co-authored-by: github-actions --- src/components/load3d/Load3D.vue | 18 ++ src/components/load3d/Load3DControls.vue | 40 ++++- src/components/load3d/Load3DScene.vue | 8 +- src/components/load3d/LoadingOverlay.vue | 11 +- .../load3d/controls/ExportControls.vue | 81 +++++++++ src/extensions/core/load3d/Load3d.ts | 42 +++++ src/extensions/core/load3d/LoaderManager.ts | 11 ++ src/extensions/core/load3d/ModelExporter.ts | 163 ++++++++++++++++++ src/extensions/core/load3d/ModelManager.ts | 4 + src/extensions/core/load3d/interfaces.ts | 2 + src/locales/en/main.json | 5 +- src/locales/fr/main.json | 3 + src/locales/ja/main.json | 3 + src/locales/ko/main.json | 3 + src/locales/ru/main.json | 3 + src/locales/zh/main.json | 3 + 16 files changed, 386 insertions(+), 14 deletions(-) create mode 100644 src/components/load3d/controls/ExportControls.vue create mode 100644 src/extensions/core/load3d/ModelExporter.ts diff --git a/src/components/load3d/Load3D.vue b/src/components/load3d/Load3D.vue index f2d6f60b76..cbbc41b68d 100644 --- a/src/components/load3d/Load3D.vue +++ b/src/components/load3d/Load3D.vue @@ -54,6 +54,7 @@ @updateUpDirection="handleUpdateUpDirection" @updateMaterialMode="handleUpdateMaterialMode" @updateEdgeThreshold="handleUpdateEdgeThreshold" + @exportModel="handleExportModel" /> @@ -72,6 +73,7 @@ import { } from '@/extensions/core/load3d/interfaces' import type { CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { ComponentWidget } from '@/scripts/domWidget' +import { useToastStore } from '@/stores/toastStore' const { widget } = defineProps<{ widget: ComponentWidget @@ -183,6 +185,22 @@ const handleUpdateMaterialMode = (value: MaterialMode) => { node.properties['Material Mode'] = value } +const handleExportModel = async (format: string) => { + if (!load3DSceneRef.value?.load3d) { + useToastStore().addAlert('No 3D scene to export') + return + } + + try { + await load3DSceneRef.value.load3d.exportModel(format) + } catch (error) { + console.error('Error exporting model:', error) + useToastStore().addAlert( + `Failed to export model as ${format.toUpperCase()}` + ) + } +} + const listenMaterialModeChange = (mode: MaterialMode) => { materialMode.value = mode diff --git a/src/components/load3d/Load3DControls.vue b/src/components/load3d/Load3DControls.vue index d407b45f7c..07c51ae8c7 100644 --- a/src/components/load3d/Load3DControls.vue +++ b/src/components/load3d/Load3DControls.vue @@ -16,14 +16,14 @@ >
@@ -70,6 +70,12 @@ @updateLightIntensity="handleUpdateLightIntensity" ref="lightControlsRef" /> + +