bill 1 vuosi sitten
vanhempi
commit
2bd00f4639

+ 34 - 34
src/api/setting.ts

@@ -1,58 +1,58 @@
-import { GET_SETTING, UPDATE_SETTING } from './constant'
-import defaultCover from '@/assets/pic.jpg'
-import { params } from '@/env'
-import axios from './instance'
-import { uploadFile } from './sys'
-
+import { GET_SETTING, UPDATE_SETTING } from "./constant";
+import defaultCover from "@/assets/pic.jpg";
+import { params } from "@/env";
+import axios from "./instance";
+import { uploadFile } from "./sys";
+import { FuseModel } from "@/store";
 
 type ServeSetting = {
-  settingsId?: string,
-  pose?: string
+  settingsId?: string;
+  pose?: string;
   lonlat?: number[];
-  cover?: string,
-  back?: string
-}
+  cover?: string;
+  back?: string;
+};
 
 export type Setting = {
-  id?: string,
+  id?: string;
   pose?: {
-    position: SceneLocalPos
-    target: SceneLocalPos
-  },
-  cover: string,
-  back: string,
+    position: SceneLocalPos;
+    target: SceneLocalPos;
+    mode?: "fuse" | "pano" | null;
+    model?: FuseModel | null;
+  };
+  cover: string;
+  back: string;
   lonlat: number[];
   fov?: number;
   openCompass?: boolean;
-}
-
+};
 
-const toLocal = (serviceSetting: ServeSetting) : Setting => ({
+const toLocal = (serviceSetting: ServeSetting): Setting => ({
   id: serviceSetting.settingsId,
   pose: serviceSetting.pose && JSON.parse(serviceSetting.pose),
   cover: serviceSetting.cover || defaultCover,
-  lonlat: serviceSetting.lonlat || [113.600356,22.364093],
-  back: serviceSetting.back || 'none'
-})
+  lonlat: serviceSetting.lonlat || [113.600356, 22.364093],
+  back: serviceSetting.back || "none",
+});
 
 const toService = (setting: Setting): ServeSetting => ({
   settingsId: setting.id,
   pose: setting.pose && JSON.stringify(setting.pose),
   cover: setting.cover,
-  back: setting.back
-})
-
-
+  back: setting.back,
+});
 
 export const fetchSetting = async () => {
-  const data = await axios.get<ServeSetting[]>(GET_SETTING, { params: { caseId: params.caseId } })
-  return toLocal(data[0] || {})
-}
+  const data = await axios.get<ServeSetting[]>(GET_SETTING, {
+    params: { caseId: params.caseId },
+  });
+  return toLocal(data[0] || {});
+};
 
 export const updateSetting = async (setting: Setting) => {
   await axios.post(UPDATE_SETTING, {
     caseId: params.caseId,
-    ...toService(setting)
-  })
-  
-}
+    ...toService(setting),
+  });
+};

+ 16 - 4
src/layout/model-list/index.vue

@@ -4,17 +4,29 @@
       <slot name="action" />
     </template>
     <template #atom="{ item }">
-      <ModelSign :canChange="canChange" :model="item.raw" @delete="modelDelete(item.raw)"
-        @click="(mode: any) => modelChangeSelect(item.raw, mode)" />
+      <ModelSign
+        :canChange="canChange"
+        :model="item.raw"
+        @delete="modelDelete(item.raw)"
+        @click="(mode: any) => modelChangeSelect(item.raw, mode)"
+      />
     </template>
   </List>
 
   <Teleport to="#left-pano" v-if="panoModel">
     <div class="mode-tab strengthen">
-      <div class="mode-icon-layout" @click="custom.showMode = 'fuse'" :class="{ active: custom.showMode === 'fuse' }">
+      <div
+        class="mode-icon-layout"
+        @click="modelChangeSelect(panoModel, 'fuse')"
+        :class="{ active: custom.showMode === 'fuse' }"
+      >
         <ui-icon type="show_3d_n" class="icon" ctrl />
       </div>
-      <div class="mode-icon-layout" @click="custom.showMode = 'pano'" :class="{ active: custom.showMode === 'pano' }">
+      <div
+        class="mode-icon-layout"
+        @click="modelChangeSelect(panoModel, 'pano')"
+        :class="{ active: custom.showMode === 'pano' }"
+      >
         <ui-icon type="show_roaming_n" class="icon" ctrl />
       </div>
     </div>

+ 7 - 4
src/sdk/association/fuseMode.ts

@@ -30,7 +30,7 @@ export const modelRange: ModelAttrRange = {
   scaleRange: { min: 0, max: 200, step: 0.1 },
 };
 
-const sceneModelMap = reactive(new Map<FuseModel, SceneModel>());
+export const sceneModelMap = reactive(new Map<FuseModel, SceneModel>());
 export const getSceneModel = (model?: FuseModel | null) =>
   model && sceneModelMap.get(toRaw(model));
 
@@ -76,7 +76,6 @@ const setModels = (sdk: SDK, models: FuseModels, oldModels: FuseModels) => {
     let changeId: NodeJS.Timeout;
     sceneModel.bus.on("transformChanged", (transform) => {
       clearTimeout(changeId);
-
       changeId = setTimeout(() => {
         transform = { ...transform };
         if (transform.rotation) {
@@ -181,6 +180,10 @@ export const associationModels = (sdk: SDK) => {
       const model = status.active && getSceneModel(status.active)!;
       const oldModel = oldStatus.active && getSceneModel(oldStatus.active)!;
 
+      if (status.showMode !== 'pano' && model) {
+        model && model.changeSelect(true);
+      }
+
       if (model && status.active === oldStatus.active) {
         if (status.showMode === "pano") {
           model && model.flyInPano();
@@ -188,7 +191,6 @@ export const associationModels = (sdk: SDK) => {
           model && model.flyOutPano();
         }
       } else {
-        oldModel && oldModel.changeSelect(false);
         if (oldStatus.showMode !== status.showMode) {
           if (oldStatus.showMode === "pano") {
             oldModel && oldModel.flyOutPano();
@@ -196,7 +198,8 @@ export const associationModels = (sdk: SDK) => {
         }
         if (status.showMode === "pano") {
           model && model.flyInPano();
-          model && model.changeSelect(true);
+        } else {
+          console.log('select')
         }
       }
     }

+ 14 - 1
src/sdk/association/setting.ts

@@ -1,7 +1,8 @@
 import { setting } from "@/store";
 import { nextTick, watchEffect } from "vue";
 import { SDK } from "../sdk";
-
+import { getSceneModel, sceneModelMap } from "./fuseMode";
+import { custom } from '@/env'
 
 export const associationSetting = (sdk: SDK, mountEl: HTMLDivElement) => {
   watchEffect(() => {
@@ -9,7 +10,19 @@ export const associationSetting = (sdk: SDK, mountEl: HTMLDivElement) => {
   });
 
   const stopWatchPose = watchEffect(() => {
+    if (!setting.value?.pose) return;
+
     setting.value && setting.value.pose && sdk.comeTo(setting.value.pose);
+
+    const modelId = setting.value.pose.model?.id
+    if (setting.value.pose.mode === "pano" && modelId) {
+      const fuseModel = Array.from(sceneModelMap.keys()).find(item => item.id === modelId)
+      const sceneModel = getSceneModel(fuseModel);
+      if (fuseModel && sceneModel && sceneModel.supportPano()) {
+        custom.showMode = 'pano'
+        custom.currentModel = fuseModel
+      }
+    }
     nextTick(() => stopWatchPose());
   });
 

+ 1 - 0
src/sdk/cover/index.js

@@ -861,6 +861,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
                     }
                 },
                 changeSelect(state) {
+                    console.error('select', state)
                     if (model) {
                         let fly = viewer.images360.latestRequestMode != 'showPanos'
                         MergeEditor.selectModel(model, state, fly, true)

+ 9 - 5
src/views/setting/index.vue

@@ -33,9 +33,9 @@
 <script lang="ts" setup>
 import { RightFillPano } from "@/layout";
 import { enterEdit, enterOld, setting, isEdit, updataSetting } from "@/store";
-import { reactive, ref, watchEffect } from "vue";
+import { ref, watchEffect } from "vue";
 import { togetherCallback, getFileUrl, loadPack } from "@/utils";
-import { showRightPanoStack, showRightCtrlPanoStack } from "@/env";
+import { showRightPanoStack, showRightCtrlPanoStack, custom } from "@/env";
 import { sdk, SettingResourceType } from "@/sdk";
 
 const backs = ref<{ label: string; type: string; image: string; value: string }[]>([]);
@@ -95,10 +95,15 @@ const enterSetPic = () => {
     const dataURL = await sdk.screenshot(300, 150);
     const res = await fetch(dataURL);
     const blob = await res.blob();
+
     setting.value = {
       ...setting.value!,
       cover: { url: dataURL, blob },
-      pose: sdk.getPose(),
+      pose: {
+        ...sdk.getPose(),
+        mode: custom.showMode,
+        model: custom.currentModel,
+      },
     };
     await updataSetting();
   });
@@ -116,13 +121,12 @@ const changeBack = (back: string) => {
     enterEdit(() => {
       if (!isSave) {
         setting.value!.back = initBack;
-        sdk.setBackdrop(initBack, "", {});
+        sdk.setBackdrop(initBack, SettingResourceType.envImage, {});
       }
       isFirst = true;
     });
     enterOld(async () => {
       isSave = true;
-
       await loadPack(updataSetting());
     });
   }