|
@@ -15,7 +15,8 @@ import {
|
|
|
hideLoad,
|
|
|
deepIsRevise,
|
|
|
round,
|
|
|
- togetherCallback
|
|
|
+ togetherCallback,
|
|
|
+ asyncTimeout
|
|
|
} from '@/utils'
|
|
|
import {
|
|
|
dynamicAddedModelIds,
|
|
@@ -31,13 +32,14 @@ import {
|
|
|
getMeasureIsShow,
|
|
|
SceneStatus,
|
|
|
setting,
|
|
|
- caseProject
|
|
|
+ caseProject,
|
|
|
+ getGuidePaths
|
|
|
} from '@/store'
|
|
|
import { currentLayout, RoutesName } from '@/router'
|
|
|
|
|
|
import TaggingComponent from '@/components/tagging/list.vue'
|
|
|
|
|
|
-import type { FuseModel, Tagging, Measure } from '@/store'
|
|
|
+import type { FuseModel, Tagging, Measure, FuseModels, Guide } from '@/store'
|
|
|
import type {
|
|
|
SDK,
|
|
|
SceneModel,
|
|
@@ -66,109 +68,113 @@ export const modelRange: ModelAttrRange = {
|
|
|
const sceneModelMap = reactive(new WeakMap<FuseModel, SceneModel>())
|
|
|
export const getSceneModel = (model?: FuseModel | null) => model && sceneModelMap.get(toRaw(model))
|
|
|
|
|
|
-const associationModels = (sdk: SDK) => {
|
|
|
- const getModels = () => fuseModels.value
|
|
|
- .filter(model => getSceneModel(model) || getFuseModelShowVariable(model).value)
|
|
|
-
|
|
|
- shallowWatchArray(getModels, (models, oldModels) => {
|
|
|
- const { added, deleted } = diffArrayChange(models, oldModels)
|
|
|
- for (const item of added) {
|
|
|
- if (getSceneModel(item)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+const setModels = (models: FuseModels, oldModels: FuseModels) => {
|
|
|
+ const { added, deleted } = diffArrayChange(models, oldModels)
|
|
|
+ for (const item of added) {
|
|
|
+ if (getSceneModel(item)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- if (item.status !== SceneStatus.SUCCESS) {
|
|
|
- item.error = true
|
|
|
- item.loaded = true
|
|
|
- continue;
|
|
|
- }
|
|
|
+ if (item.status !== SceneStatus.SUCCESS) {
|
|
|
+ item.error = true
|
|
|
+ item.loaded = true
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- const itemRaw = toRaw(item)
|
|
|
- let sceneModel: SceneModel
|
|
|
- try {
|
|
|
- sceneModel = sdk.addModel({
|
|
|
- ...itemRaw,
|
|
|
- ...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)
|
|
|
- })
|
|
|
- } catch(e) {
|
|
|
- console.error('模型加载失败', e)
|
|
|
- item.error = true
|
|
|
- return;
|
|
|
- }
|
|
|
+ const itemRaw = toRaw(item)
|
|
|
+ let sceneModel: SceneModel
|
|
|
+ try {
|
|
|
+ sceneModel = sdk.addModel({
|
|
|
+ ...itemRaw,
|
|
|
+ ...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)
|
|
|
+ })
|
|
|
+ } catch(e) {
|
|
|
+ console.error('模型加载失败', e)
|
|
|
+ item.error = true
|
|
|
+ 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(() => {
|
|
|
- transform = { ...transform }
|
|
|
- if (transform.rotation) {
|
|
|
- transform.rotation = {
|
|
|
- x: round(transform.rotation.x, 5),
|
|
|
- y: round(transform.rotation.y, 5),
|
|
|
- z: round(transform.rotation.z, 5),
|
|
|
- }
|
|
|
- }
|
|
|
- if (transform.position) {
|
|
|
- transform.position = {
|
|
|
- x: round(transform.position.x, 5),
|
|
|
- y: round(transform.position.y, 5),
|
|
|
- z: round(transform.position.z, 5),
|
|
|
- }
|
|
|
+ changeId = setTimeout(() => {
|
|
|
+ transform = { ...transform }
|
|
|
+ if (transform.rotation) {
|
|
|
+ transform.rotation = {
|
|
|
+ x: round(transform.rotation.x, 5),
|
|
|
+ y: round(transform.rotation.y, 5),
|
|
|
+ z: round(transform.rotation.z, 5),
|
|
|
}
|
|
|
- delete transform.bottom
|
|
|
- // if (transform.bottom) {
|
|
|
- // transform.bottom = round(transform.bottom, 2)
|
|
|
- // }
|
|
|
- if (transform.scale) {
|
|
|
- transform.scale = round(transform.scale, 2)
|
|
|
- }
|
|
|
-
|
|
|
- const updateKeys = Object.keys(transform)
|
|
|
- const update: any = {}
|
|
|
- for (const key of updateKeys) {
|
|
|
- update[key] = (item as any)[key]
|
|
|
- }
|
|
|
-
|
|
|
- if (deepIsRevise(update, transform)) {
|
|
|
- unSet(() => Object.assign(item, transform))
|
|
|
+ }
|
|
|
+ if (transform.position) {
|
|
|
+ transform.position = {
|
|
|
+ x: round(transform.position.x, 5),
|
|
|
+ y: round(transform.position.y, 5),
|
|
|
+ z: round(transform.position.z, 5),
|
|
|
}
|
|
|
- }, 16)
|
|
|
- })
|
|
|
+ }
|
|
|
+ delete transform.bottom
|
|
|
+ // if (transform.bottom) {
|
|
|
+ // transform.bottom = round(transform.bottom, 2)
|
|
|
+ // }
|
|
|
+ if (transform.scale) {
|
|
|
+ transform.scale = round(transform.scale, 2)
|
|
|
+ }
|
|
|
|
|
|
- sceneModel.bus.on('changeSelect', select => {
|
|
|
- unSet(() => {
|
|
|
- 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
|
|
|
+ const updateKeys = Object.keys(transform)
|
|
|
+ const update: any = {}
|
|
|
+ for (const key of updateKeys) {
|
|
|
+ update[key] = (item as any)[key]
|
|
|
+ }
|
|
|
|
|
|
- custom.showModelsMap.delete(item)
|
|
|
- hideLoad()
|
|
|
+ if (deepIsRevise(update, transform)) {
|
|
|
+ unSet(() => Object.assign(item, transform))
|
|
|
+ }
|
|
|
+ }, 16)
|
|
|
+ })
|
|
|
+
|
|
|
+ sceneModel.bus.on('changeSelect', select => {
|
|
|
+ unSet(() => {
|
|
|
+ if (custom.currentModel === item && !select) {
|
|
|
+ custom.currentModel = null
|
|
|
+ } else if (custom.currentModel !== item && select) {
|
|
|
+ custom.currentModel = item
|
|
|
+ }
|
|
|
})
|
|
|
- sceneModel.bus.on('loadProgress', progress => item.progress = progress)
|
|
|
- }
|
|
|
- for (const item of deleted) {
|
|
|
- console.error('remove')
|
|
|
- getSceneModel(item)?.destroy()
|
|
|
- }
|
|
|
+ })
|
|
|
+ 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) {
|
|
|
+ getSceneModel(item)?.destroy()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const associationModels = (sdk: SDK) => {
|
|
|
+ const getModels = () => fuseModels.value
|
|
|
+ .filter(model => getSceneModel(model) || getFuseModelShowVariable(model).value)
|
|
|
+
|
|
|
+ shallowWatchArray(getModels, (models, oldModels) => {
|
|
|
+ setModels(models, oldModels)
|
|
|
})
|
|
|
|
|
|
arrayChildEffectScope(getModels, item => {
|
|
@@ -366,18 +372,87 @@ const fullView = async (fn: () => void) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export const isScenePlayIng = ref(false)
|
|
|
-export const playSceneGuide = async (paths: SceneGuidePath[], changeIndexCallback?: (index: number) => void, forceFull = false) => {
|
|
|
+export const recovery = async (guide: Guide) => {
|
|
|
+ let rFuseModels: (FuseModel & {viewShow: boolean})[];
|
|
|
+ try {
|
|
|
+ if (!guide.recoveryContent) {
|
|
|
+ throw "没有recovery";
|
|
|
+ }
|
|
|
+ rFuseModels = JSON.parse(guide.recoveryContent);
|
|
|
+ } catch (e) {
|
|
|
+ return () => {};
|
|
|
+ }
|
|
|
+ const initFuseModels = JSON.parse(JSON.stringify(fuseModels.value)) as FuseModels;
|
|
|
+ const initViewShow = fuseModels.value.map(item => custom.showModelsMap.get(item))
|
|
|
+
|
|
|
+
|
|
|
+ console.error(initFuseModels, rFuseModels)
|
|
|
+ const setModels = async (models: (FuseModel & {viewShow: boolean})[]) => {
|
|
|
+ for (let i = 0; i < models.length; i++) {
|
|
|
+ const ndx = fuseModels.value.findIndex(({ modelId }) => modelId === models[i].modelId);
|
|
|
+ if (~ndx) {
|
|
|
+ Object.assign(fuseModels.value[ndx], models[i]);
|
|
|
+ custom.showModelsMap.set(toRaw(fuseModels.value[ndx]), models[i].viewShow)
|
|
|
+ } else {
|
|
|
+ fuseModels.value.push(models[i]);
|
|
|
+ custom.showModelsMap.set(toRaw(models[i]), models[i].viewShow)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // console.log(models)
|
|
|
+ for (let i = 0; i < fuseModels.value.length; i++) {
|
|
|
+ const ndx = models.findIndex(({ modelId }) => modelId === fuseModels.value[i].modelId);
|
|
|
+ if (!~ndx) {
|
|
|
+ fuseModels.value.splice(i, 1);
|
|
|
+ i--
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ await asyncTimeout(100)
|
|
|
+ await new Promise<void>((resolve) => {
|
|
|
+ const stop = watchEffect(() => {
|
|
|
+ if (fuseModelsLoaded.value) {
|
|
|
+ setTimeout(() => stop())
|
|
|
+ resolve()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ for (let i = 0; i < fuseModels.value.length; i++) {
|
|
|
+ const ndx = rFuseModels.findIndex(({ modelId }) => modelId === fuseModels.value[i].modelId);
|
|
|
+ if (!~ndx) {
|
|
|
+ rFuseModels.push({...fuseModels.value[i], viewShow: false})
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ await setModels(rFuseModels);
|
|
|
+ return () =>
|
|
|
+ setModels(initFuseModels.map((item, i) => ({...item, viewShow: initViewShow[i]!})));
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
+export enum ScenePlayIngEnum {
|
|
|
+ ing = 1,
|
|
|
+ stop = 0,
|
|
|
+ ready = 2
|
|
|
+}
|
|
|
+export const isScenePlayIng = ref<ScenePlayIngEnum>(ScenePlayIngEnum.stop)
|
|
|
+let pauseRecovery: () => void
|
|
|
+export const playSceneGuide = async (guide: Guide, changeIndexCallback?: (index: number) => void, forceFull = false) => {
|
|
|
+ const paths = getGuidePaths(guide)
|
|
|
if (isScenePlayIng.value) {
|
|
|
throw new Error('导览正在播放')
|
|
|
}
|
|
|
- isScenePlayIng.value = true
|
|
|
+ isScenePlayIng.value = ScenePlayIngEnum.ready
|
|
|
+ pauseRecovery = await recovery(guide)
|
|
|
+ isScenePlayIng.value = ScenePlayIngEnum.ing
|
|
|
|
|
|
const sceneGuide = sdk.enterSceneGuide(paths)
|
|
|
|
|
|
changeIndexCallback && sceneGuide.bus.on('changePoint', changeIndexCallback)
|
|
|
|
|
|
- const quitHandler = () => (isScenePlayIng.value = false)
|
|
|
+ const quitHandler = pauseSceneGuide
|
|
|
const clearHandler = !forceFull && isEdit.value ? null : await fullView(quitHandler)
|
|
|
if (!clearHandler) {
|
|
|
sysBus.on('leave', quitHandler, { last: true })
|
|
@@ -399,7 +474,8 @@ export const playSceneGuide = async (paths: SceneGuidePath[], changeIndexCallbac
|
|
|
]
|
|
|
|
|
|
await Promise.race(reces)
|
|
|
- isScenePlayIng.value = false
|
|
|
+ pauseSceneGuide()
|
|
|
+
|
|
|
if (clearHandler) {
|
|
|
clearHandler()
|
|
|
} else {
|
|
@@ -410,7 +486,11 @@ export const playSceneGuide = async (paths: SceneGuidePath[], changeIndexCallbac
|
|
|
sceneGuide.bus.off('changePoint')
|
|
|
}
|
|
|
|
|
|
-export const pauseSceneGuide = () => isScenePlayIng.value = false
|
|
|
+export const pauseSceneGuide = () => {
|
|
|
+ console.error('pause?')
|
|
|
+ isScenePlayIng.value = ScenePlayIngEnum.stop
|
|
|
+ pauseRecovery && pauseRecovery()
|
|
|
+}
|
|
|
|
|
|
|
|
|
// -----------------启动关联--------------------
|