From 85f7b943135dd507cc9a10ac355fa93081023f4f Mon Sep 17 00:00:00 2001 From: xudan Date: Mon, 27 Oct 2025 16:59:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(scene-editor):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5=E7=8A=B6=E6=80=81=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=8C=E6=94=B9=E5=96=84=E7=94=A8=E6=88=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/scene-editor.vue | 121 ++++++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 48 deletions(-) diff --git a/src/pages/scene-editor.vue b/src/pages/scene-editor.vue index 6bcfc61..9f5b286 100644 --- a/src/pages/scene-editor.vue +++ b/src/pages/scene-editor.vue @@ -60,43 +60,48 @@ const normalizeSceneJson = (raw: unknown): unknown => { //#region 接口 const readScene = async () => { - const res = await getSceneById(props.id); - title.value = res?.label ?? ''; - const sceneJson = normalizeSceneJson(res?.json); + isImporting.value = true; + try { + const res = await getSceneById(props.id); + title.value = res?.label ?? ''; + const sceneJson = normalizeSceneJson(res?.json); - requireImportTransform.value = false; - // 适配不同的场景数据格式 - if (Array.isArray(sceneJson)) { - if (sceneJson.length > 0) { - // 多楼层 - floorScenes.value = sceneJson; - floorImportFlags.value = new Array(sceneJson.length).fill(false); + requireImportTransform.value = false; + // 适配不同的场景数据格式 + if (Array.isArray(sceneJson)) { + if (sceneJson.length > 0) { + // 多楼层 + floorScenes.value = sceneJson; + floorImportFlags.value = new Array(sceneJson.length).fill(false); + currentFloorIndex.value = 0; + previousFloorIndex.value = 0; + editor.value?.load(floorScenes.value[0], editable.value, undefined, floorImportFlags.value[0] ?? false); + } else { + // 空数组 + message.warn('场景文件为空数组'); + floorScenes.value = [{}]; // 创建一个默认的空楼层 + floorImportFlags.value = [false]; + currentFloorIndex.value = 0; + previousFloorIndex.value = 0; + editor.value?.load('{}', editable.value, undefined, false); + } + } else if (sceneJson && typeof sceneJson === 'object' && Object.keys(sceneJson).length > 0) { + // 单楼层,统一为多楼层数组格式 + floorScenes.value = [sceneJson]; + floorImportFlags.value = [false]; currentFloorIndex.value = 0; previousFloorIndex.value = 0; editor.value?.load(floorScenes.value[0], editable.value, undefined, floorImportFlags.value[0] ?? false); } else { - // 空数组 - message.warn('场景文件为空数组'); + message.warn('场景文件为空或格式不正确'); floorScenes.value = [{}]; // 创建一个默认的空楼层 floorImportFlags.value = [false]; currentFloorIndex.value = 0; previousFloorIndex.value = 0; editor.value?.load('{}', editable.value, undefined, false); } - } else if (sceneJson && typeof sceneJson === 'object' && Object.keys(sceneJson).length > 0) { - // 单楼层,统一为多楼层数组格式 - floorScenes.value = [sceneJson]; - floorImportFlags.value = [false]; - currentFloorIndex.value = 0; - previousFloorIndex.value = 0; - editor.value?.load(floorScenes.value[0], editable.value, undefined, floorImportFlags.value[0] ?? false); - } else { - message.warn('场景文件为空或格式不正确'); - floorScenes.value = [{}]; // 创建一个默认的空楼层 - floorImportFlags.value = [false]; - currentFloorIndex.value = 0; - previousFloorIndex.value = 0; - editor.value?.load('{}', editable.value, undefined, false); + } finally { + isImporting.value = false; } }; @@ -208,6 +213,8 @@ const isMultiFloor = computed(() => floorScenes.value.length > 1); const requireImportTransform = ref(false); // 新增:逐楼层是否需要反向坐标转换的标记(与 floorScenes 对齐) const floorImportFlags = ref([]); +// 新增:导入场景时的加载状态 +const isImporting = ref(false); onMounted(() => { document.title = '场景编辑器'; @@ -345,6 +352,7 @@ const openImportModal = () => { }; const handleImportConfirm = async () => { + isImporting.value = true; try { /* NORMAL_IMPORT_DISABLED if (importMode.value === 'normal') { @@ -417,7 +425,7 @@ const handleImportConfirm = async () => { console.log('[MapConverter] OriginalProperties by floor:', OriginalProperties.value); console.log('[MapConverter] Request payload (object):', payload); console.log('[MapConverter] Request payload (JSON):', JSON.stringify(payload, null, 2)); - message.info('已在控制台打印请求参数'); + // message.info('已在控制台打印请求参数'); } catch { // } @@ -496,10 +504,13 @@ const handleImportConfirm = async () => { } catch (error) { console.error('导入失败:', error); message.error(`导入失败: ${(error as Error).message || '请检查文件格式或内容。'}`); + } finally { + isImporting.value = false; } }; const processAndLoadSceneData = async (sceneData: any) => { + isImporting.value = true; try { // 检查导入的数据是数组(多楼层)还是对象(单楼层) if (Array.isArray(sceneData)) { @@ -552,33 +563,43 @@ const processAndLoadSceneData = async (sceneData: any) => { message.error('导入失败:文件不是有效的JSON格式或数据无法加载。'); // 抛出错误以确保上层可以捕获 throw error; + } finally { + isImporting.value = false; } }; const importSmapModalVisible = ref(false); const handleImportSmapConfirm = async ({ smapFile, keepProperties }: { smapFile: File; keepProperties: boolean }) => { - let sceneJson: string | null = null; - if (keepProperties) { - // Update mode - const currentSceneJson = editor.value?.save(); - if (!currentSceneJson) { - message.error('无法获取当前场景数据,请确保场景不为空'); - return; + isImporting.value = true; + try { + let sceneJson: string | null = null; + if (keepProperties) { + // Update mode + const currentSceneJson = editor.value?.save(); + if (!currentSceneJson) { + message.error('无法获取当前场景数据,请确保场景不为空'); + return; + } + const sceneBlob = new Blob([currentSceneJson], { type: 'application/json' }); + const sceneFile = new File([sceneBlob], `${title.value || 'current'}.scene`, { + type: 'application/json', + }); + sceneJson = await convertSmapToScene(smapFile, sceneFile); + } else { + // Create mode + sceneJson = await convertSmapToScene(smapFile); } - const sceneBlob = new Blob([currentSceneJson], { type: 'application/json' }); - const sceneFile = new File([sceneBlob], `${title.value || 'current'}.scene`, { - type: 'application/json', - }); - sceneJson = await convertSmapToScene(smapFile, sceneFile); - } else { - // Create mode - sceneJson = await convertSmapToScene(smapFile); - } - if (sceneJson) { - requireImportTransform.value = true; - editor.value?.load(sceneJson, editable.value, undefined, requireImportTransform.value); + if (sceneJson) { + requireImportTransform.value = true; + editor.value?.load(sceneJson, editable.value, undefined, requireImportTransform.value); + } + } catch (error) { + console.error('导入 SMAP 文件失败:', error); + message.error('导入 SMAP 文件失败'); + } finally { + isImporting.value = false; } }; @@ -748,7 +769,7 @@ const handleFloorChange = async (value: any) => { {{ $t('推送') }} - + {{ $t('导入') }}