|
@@ -1,220 +1,238 @@
|
|
-import {
|
|
|
|
- SDK,
|
|
|
|
- SceneModel,
|
|
|
|
- ModelAttrRange, } from '../sdk'
|
|
|
|
-import { toRaw, watch, reactive } from 'vue'
|
|
|
|
-import {
|
|
|
|
- custom,
|
|
|
|
- getResource
|
|
|
|
-} from '@/env'
|
|
|
|
-import {
|
|
|
|
- diffArrayChange,
|
|
|
|
- shallowWatchArray,
|
|
|
|
|
|
+import { SDK, SceneModel, ModelAttrRange } from "../sdk";
|
|
|
|
+import { toRaw, watch, reactive } from "vue";
|
|
|
|
+import { custom, getResource } from "@/env";
|
|
|
|
+import {
|
|
|
|
+ diffArrayChange,
|
|
|
|
+ shallowWatchArray,
|
|
arrayChildEffectScope,
|
|
arrayChildEffectScope,
|
|
showLoad,
|
|
showLoad,
|
|
hideLoad,
|
|
hideLoad,
|
|
deepIsRevise,
|
|
deepIsRevise,
|
|
round,
|
|
round,
|
|
-} from '@/utils'
|
|
|
|
-import {
|
|
|
|
|
|
+} from "@/utils";
|
|
|
|
+import {
|
|
dynamicAddedModelIds,
|
|
dynamicAddedModelIds,
|
|
- fuseModels,
|
|
|
|
- getFuseModelShowVariable,
|
|
|
|
|
|
+ fuseModels,
|
|
|
|
+ getFuseModelShowVariable,
|
|
SceneType,
|
|
SceneType,
|
|
SceneStatus,
|
|
SceneStatus,
|
|
- FuseModel, FuseModels
|
|
|
|
-} from '@/store'
|
|
|
|
-import { currentLayout, RoutesName } from '@/router'
|
|
|
|
-import { isUnSet, unSet } from '@/utils/unset'
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ FuseModel,
|
|
|
|
+ FuseModels,
|
|
|
|
+} from "@/store";
|
|
|
|
+import { currentLayout, RoutesName } from "@/router";
|
|
|
|
+import { isUnSet, unSet } from "@/utils/unset";
|
|
|
|
|
|
// -----------------模型关联--------------------
|
|
// -----------------模型关联--------------------
|
|
|
|
|
|
-export const modelRange: ModelAttrRange = {
|
|
|
|
|
|
+export const modelRange: ModelAttrRange = {
|
|
opacityRange: { min: 0, max: 100, step: 0.1 },
|
|
opacityRange: { min: 0, max: 100, step: 0.1 },
|
|
bottomRange: { min: -30, max: 70, step: 0.1 },
|
|
bottomRange: { min: -30, max: 70, step: 0.1 },
|
|
- scaleRange: { min: 0, max: 200, step: 0.1 }
|
|
|
|
-}
|
|
|
|
|
|
+ scaleRange: { min: 0, max: 200, step: 0.1 },
|
|
|
|
+};
|
|
|
|
|
|
-const sceneModelMap = reactive(new WeakMap<FuseModel, SceneModel>())
|
|
|
|
-export const getSceneModel = (model?: FuseModel | null) => model && sceneModelMap.get(toRaw(model))
|
|
|
|
|
|
+const sceneModelMap = reactive(new WeakMap<FuseModel, SceneModel>());
|
|
|
|
+export const getSceneModel = (model?: FuseModel | null) =>
|
|
|
|
+ model && sceneModelMap.get(toRaw(model));
|
|
|
|
|
|
const setModels = (sdk: SDK, models: FuseModels, oldModels: FuseModels) => {
|
|
const setModels = (sdk: SDK, models: FuseModels, oldModels: FuseModels) => {
|
|
- const { added, deleted } = diffArrayChange(models, oldModels)
|
|
|
|
|
|
+ const { added, deleted } = diffArrayChange(models, oldModels);
|
|
for (const item of added) {
|
|
for (const item of added) {
|
|
-
|
|
|
|
if (getSceneModel(item)) {
|
|
if (getSceneModel(item)) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
if (item.status !== SceneStatus.SUCCESS) {
|
|
if (item.status !== SceneStatus.SUCCESS) {
|
|
- item.error = true
|
|
|
|
- item.loaded = true
|
|
|
|
|
|
+ item.error = true;
|
|
|
|
+ item.loaded = true;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- const itemRaw = toRaw(item)
|
|
|
|
- let sceneModel: SceneModel
|
|
|
|
|
|
+ const itemRaw = toRaw(item);
|
|
|
|
+ let sceneModel: SceneModel;
|
|
try {
|
|
try {
|
|
sceneModel = sdk.addModel({
|
|
sceneModel = sdk.addModel({
|
|
...itemRaw,
|
|
...itemRaw,
|
|
...modelRange,
|
|
...modelRange,
|
|
- mode: RoutesName.signModel === currentLayout.value! ? 'single' : 'many',
|
|
|
|
- isDynamicAdded: dynamicAddedModelIds.value.some(id => itemRaw.id === id),
|
|
|
|
- type: [SceneType.SWSS, SceneType.SWYDSS].includes(item.type) ? 'laser' : item.modelType,
|
|
|
|
- url: [SceneType.SWSS, SceneType.SWYDSS].includes(item.type) ? item.url : item.url && getResource(item.url),
|
|
|
|
- fromType: item.type
|
|
|
|
- })
|
|
|
|
- } catch(e) {
|
|
|
|
- console.error('模型加载失败', e)
|
|
|
|
- item.error = true
|
|
|
|
|
|
+ mode: RoutesName.signModel === currentLayout.value! ? "single" : "many",
|
|
|
|
+ isDynamicAdded: dynamicAddedModelIds.value.some(
|
|
|
|
+ (id) => itemRaw.id === id
|
|
|
|
+ ),
|
|
|
|
+ type: [SceneType.SWSS, SceneType.SWYDSS].includes(item.type)
|
|
|
|
+ ? "laser"
|
|
|
|
+ : item.modelType,
|
|
|
|
+ url: [SceneType.SWSS, SceneType.SWYDSS].includes(item.type)
|
|
|
|
+ ? item.url
|
|
|
|
+ : item.url && getResource(item.url),
|
|
|
|
+ fromType: item.type,
|
|
|
|
+ });
|
|
|
|
+ } catch (e) {
|
|
|
|
+ console.error("模型加载失败", e);
|
|
|
|
+ item.error = true;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- sceneModelMap.set(itemRaw, sceneModel)
|
|
|
|
|
|
+ sceneModelMap.set(itemRaw, sceneModel);
|
|
|
|
|
|
- let changeId: NodeJS.Timeout
|
|
|
|
- sceneModel.bus.on('transformChanged', transform => {
|
|
|
|
- clearTimeout(changeId)
|
|
|
|
|
|
+ let changeId: NodeJS.Timeout;
|
|
|
|
+ sceneModel.bus.on("transformChanged", (transform) => {
|
|
|
|
+ clearTimeout(changeId);
|
|
|
|
|
|
changeId = setTimeout(() => {
|
|
changeId = setTimeout(() => {
|
|
- transform = { ...transform }
|
|
|
|
|
|
+ transform = { ...transform };
|
|
if (transform.rotation) {
|
|
if (transform.rotation) {
|
|
transform.rotation = {
|
|
transform.rotation = {
|
|
x: round(transform.rotation.x, 5),
|
|
x: round(transform.rotation.x, 5),
|
|
y: round(transform.rotation.y, 5),
|
|
y: round(transform.rotation.y, 5),
|
|
z: round(transform.rotation.z, 5),
|
|
z: round(transform.rotation.z, 5),
|
|
- }
|
|
|
|
|
|
+ };
|
|
}
|
|
}
|
|
if (transform.position) {
|
|
if (transform.position) {
|
|
transform.position = {
|
|
transform.position = {
|
|
x: round(transform.position.x, 5),
|
|
x: round(transform.position.x, 5),
|
|
y: round(transform.position.y, 5),
|
|
y: round(transform.position.y, 5),
|
|
z: round(transform.position.z, 5),
|
|
z: round(transform.position.z, 5),
|
|
- }
|
|
|
|
|
|
+ };
|
|
}
|
|
}
|
|
- delete transform.bottom
|
|
|
|
|
|
+ delete transform.bottom;
|
|
// if (transform.bottom) {
|
|
// if (transform.bottom) {
|
|
// transform.bottom = round(transform.bottom, 2)
|
|
// transform.bottom = round(transform.bottom, 2)
|
|
// }
|
|
// }
|
|
if (transform.scale) {
|
|
if (transform.scale) {
|
|
- transform.scale = round(transform.scale, 2)
|
|
|
|
|
|
+ transform.scale = round(transform.scale, 2);
|
|
}
|
|
}
|
|
|
|
|
|
- const updateKeys = Object.keys(transform)
|
|
|
|
- const update: any = {}
|
|
|
|
|
|
+ const updateKeys = Object.keys(transform);
|
|
|
|
+ const update: any = {};
|
|
for (const key of updateKeys) {
|
|
for (const key of updateKeys) {
|
|
- update[key] = (item as any)[key]
|
|
|
|
|
|
+ update[key] = (item as any)[key];
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
if (deepIsRevise(update, transform)) {
|
|
if (deepIsRevise(update, transform)) {
|
|
- unSet(() => Object.assign(item, transform))
|
|
|
|
|
|
+ unSet(() => Object.assign(item, transform));
|
|
}
|
|
}
|
|
- }, 16)
|
|
|
|
- })
|
|
|
|
|
|
+ }, 16);
|
|
|
|
+ });
|
|
|
|
|
|
- sceneModel.bus.on('changeSelect', select => {
|
|
|
|
|
|
+ sceneModel.bus.on("changeSelect", (select) => {
|
|
unSet(() => {
|
|
unSet(() => {
|
|
- if (custom.currentModel === item && !select) {
|
|
|
|
- custom.currentModel = null
|
|
|
|
- } else if (custom.currentModel !== item && select) {
|
|
|
|
- custom.currentModel = item
|
|
|
|
|
|
+ if (custom.showMode === "fuse") {
|
|
|
|
+ if (custom.currentModel === item && !select) {
|
|
|
|
+ custom.currentModel = null;
|
|
|
|
+ } else if (custom.currentModel !== item && select) {
|
|
|
|
+ custom.currentModel = item;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- })
|
|
|
|
- })
|
|
|
|
- showLoad()
|
|
|
|
- sceneModel.bus.on('loadDone', () => {
|
|
|
|
- item.loaded = true
|
|
|
|
- hideLoad()
|
|
|
|
- })
|
|
|
|
- sceneModel.bus.on('loadError', () => {
|
|
|
|
- item.error = true
|
|
|
|
- item.show = false
|
|
|
|
-
|
|
|
|
- custom.showModelsMap.delete(item)
|
|
|
|
- hideLoad()
|
|
|
|
- })
|
|
|
|
- sceneModel.bus.on('loadProgress', progress => item.progress = progress)
|
|
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ showLoad();
|
|
|
|
+ sceneModel.bus.on("loadDone", () => {
|
|
|
|
+ item.loaded = true;
|
|
|
|
+ hideLoad();
|
|
|
|
+ });
|
|
|
|
+ sceneModel.bus.on("loadError", () => {
|
|
|
|
+ item.error = true;
|
|
|
|
+ item.show = false;
|
|
|
|
+
|
|
|
|
+ custom.showModelsMap.delete(item);
|
|
|
|
+ hideLoad();
|
|
|
|
+ });
|
|
|
|
+ sceneModel.bus.on("loadProgress", (progress) => (item.progress = progress));
|
|
}
|
|
}
|
|
for (const item of deleted) {
|
|
for (const item of deleted) {
|
|
- console.error('销毁', item)
|
|
|
|
- getSceneModel(item)?.destroy()
|
|
|
|
|
|
+ console.error("销毁", item);
|
|
|
|
+ getSceneModel(item)?.destroy();
|
|
}
|
|
}
|
|
-}
|
|
|
|
-
|
|
|
|
|
|
+};
|
|
|
|
|
|
export const associationModels = (sdk: SDK) => {
|
|
export const associationModels = (sdk: SDK) => {
|
|
- const getModels = () => fuseModels.value
|
|
|
|
- .filter(model => getSceneModel(model) || getFuseModelShowVariable(model).value)
|
|
|
|
-
|
|
|
|
|
|
+ watch(
|
|
|
|
+ () => ({
|
|
|
|
+ showMode: custom.showMode,
|
|
|
|
+ active: custom.currentModel,
|
|
|
|
+ }),
|
|
|
|
+ (status, _, onCleanup) => {
|
|
|
|
+ if (status.showMode !== "pano" || !status.active) return;
|
|
|
|
+ const sceneModel = getSceneModel(status.active);
|
|
|
|
+ sceneModel?.flyInPano();
|
|
|
|
+
|
|
|
|
+ onCleanup(() => {
|
|
|
|
+ sceneModel?.flyOutPano();
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ const getModels = () =>
|
|
|
|
+ fuseModels.value.filter(
|
|
|
|
+ (model) => getSceneModel(model) || getFuseModelShowVariable(model).value
|
|
|
|
+ );
|
|
|
|
+
|
|
shallowWatchArray(getModels, (models, oldModels) => {
|
|
shallowWatchArray(getModels, (models, oldModels) => {
|
|
- setModels(sdk, models, oldModels)
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- arrayChildEffectScope(getModels, item => {
|
|
|
|
|
|
+ setModels(sdk, models, oldModels);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ arrayChildEffectScope(getModels, (item) => {
|
|
const stopLoadedWatch = watch(
|
|
const stopLoadedWatch = watch(
|
|
() => item.loaded,
|
|
() => item.loaded,
|
|
(loaded) => {
|
|
(loaded) => {
|
|
if (loaded) {
|
|
if (loaded) {
|
|
- const modelShow = getFuseModelShowVariable(item)
|
|
|
|
|
|
+ const modelShow = getFuseModelShowVariable(item);
|
|
watch(
|
|
watch(
|
|
- () => item.bottom,
|
|
|
|
- () => isUnSet || getSceneModel(item)?.changeBottom(item.bottom),
|
|
|
|
|
|
+ () => item.bottom,
|
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeBottom(item.bottom)
|
|
// { immediate: true }
|
|
// { immediate: true }
|
|
- )
|
|
|
|
|
|
+ );
|
|
watch(
|
|
watch(
|
|
- () => item.opacity,
|
|
|
|
- () => isUnSet || getSceneModel(item)?.changeOpacity(item.opacity),
|
|
|
|
|
|
+ () => item.opacity,
|
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeOpacity(item.opacity)
|
|
// { immediate: true }
|
|
// { immediate: true }
|
|
- )
|
|
|
|
|
|
+ );
|
|
watch(
|
|
watch(
|
|
- () => item.scale,
|
|
|
|
- () => isUnSet || getSceneModel(item)?.changeScale(item.scale),
|
|
|
|
|
|
+ () => item.scale,
|
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeScale(item.scale)
|
|
// { immediate: true }
|
|
// { immediate: true }
|
|
- )
|
|
|
|
|
|
+ );
|
|
watch(
|
|
watch(
|
|
- () => item.position,
|
|
|
|
|
|
+ () => item.position,
|
|
() => {
|
|
() => {
|
|
if (!isUnSet) {
|
|
if (!isUnSet) {
|
|
- getSceneModel(item)?.changePosition(item.position)
|
|
|
|
|
|
+ getSceneModel(item)?.changePosition(item.position);
|
|
}
|
|
}
|
|
- },
|
|
|
|
|
|
+ }
|
|
// { immediate: true }
|
|
// { immediate: true }
|
|
- )
|
|
|
|
|
|
+ );
|
|
watch(
|
|
watch(
|
|
- () => item.rotation,
|
|
|
|
|
|
+ () => item.rotation,
|
|
() => {
|
|
() => {
|
|
if (!isUnSet) {
|
|
if (!isUnSet) {
|
|
- getSceneModel(item)?.changeRotation(item.rotation)
|
|
|
|
|
|
+ getSceneModel(item)?.changeRotation(item.rotation);
|
|
}
|
|
}
|
|
- },
|
|
|
|
|
|
+ }
|
|
// { immediate: true }
|
|
// { immediate: true }
|
|
- )
|
|
|
|
|
|
+ );
|
|
watch(
|
|
watch(
|
|
- () => modelShow.value,
|
|
|
|
|
|
+ () => modelShow.value,
|
|
() => {
|
|
() => {
|
|
- const sceneModel = getSceneModel(item)
|
|
|
|
|
|
+ const sceneModel = getSceneModel(item);
|
|
if (!isUnSet && sceneModel) {
|
|
if (!isUnSet && sceneModel) {
|
|
- sceneModel.changeSelect(false)
|
|
|
|
- sceneModel.changeShow(modelShow.value)
|
|
|
|
|
|
+ sceneModel.changeSelect(false);
|
|
|
|
+ sceneModel.changeShow(modelShow.value);
|
|
}
|
|
}
|
|
- },
|
|
|
|
|
|
+ },
|
|
{ immediate: true }
|
|
{ immediate: true }
|
|
- )
|
|
|
|
|
|
+ );
|
|
|
|
|
|
watch(
|
|
watch(
|
|
() => custom.currentModel === item,
|
|
() => custom.currentModel === item,
|
|
(selected) => {
|
|
(selected) => {
|
|
- isUnSet || console.log(item.title, selected, getSceneModel(item))
|
|
|
|
- isUnSet || getSceneModel(item)?.changeSelect(selected)
|
|
|
|
|
|
+ isUnSet || console.log(item.title, selected, getSceneModel(item));
|
|
|
|
+ isUnSet || getSceneModel(item)?.changeSelect(selected);
|
|
}
|
|
}
|
|
- )
|
|
|
|
|
|
+ );
|
|
|
|
|
|
- stopLoadedWatch()
|
|
|
|
|
|
+ stopLoadedWatch();
|
|
}
|
|
}
|
|
- },
|
|
|
|
|
|
+ }
|
|
// { immediate: true }
|
|
// { immediate: true }
|
|
- )
|
|
|
|
- })
|
|
|
|
-}
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
|
|
+};
|