|
@@ -1,6 +1,11 @@
|
|
|
import { sdk } from './sdk'
|
|
|
import { toRaw, ref, watch, nextTick } from 'vue'
|
|
|
-import { viewModeStack, showLeftPanoStack, custom, getResource } from '@/env'
|
|
|
+import {
|
|
|
+ viewModeStack,
|
|
|
+ showLeftPanoStack,
|
|
|
+ custom,
|
|
|
+ getResource
|
|
|
+} from '@/env'
|
|
|
import {
|
|
|
mount,
|
|
|
diffArrayChange,
|
|
@@ -19,13 +24,33 @@ import {
|
|
|
sysBus,
|
|
|
getFuseModelShowVariable,
|
|
|
SceneType,
|
|
|
- backupFuseModels
|
|
|
+ backupFuseModels,
|
|
|
+ MeasureType,
|
|
|
+ measures
|
|
|
} from '@/store'
|
|
|
|
|
|
import TaggingComponent from '@/components/tagging/list.vue'
|
|
|
|
|
|
-import type { SDK, SceneModel, SceneGuidePath, ModelAttrRange } from '.'
|
|
|
-import { FuseModel, Tagging } from '@/store'
|
|
|
+import type { FuseModel, Tagging, Measure } from '@/store'
|
|
|
+import type {
|
|
|
+ SDK,
|
|
|
+ SceneModel,
|
|
|
+ SceneGuidePath,
|
|
|
+ ModelAttrRange,
|
|
|
+ Measure as SceneMeasure
|
|
|
+} from '.'
|
|
|
+
|
|
|
+let isUnSet = false
|
|
|
+const unSet = ((fn: () => void) => {
|
|
|
+ nextTick(() => {
|
|
|
+ isUnSet = true
|
|
|
+ fn()
|
|
|
+ nextTick(() => isUnSet = false)
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+
|
|
|
+// -----------------模型关联--------------------
|
|
|
|
|
|
export const modelRange: ModelAttrRange = {
|
|
|
opacityRange: { min: 0, max: 100, step: 0.1 },
|
|
@@ -37,15 +62,6 @@ const sceneModelMap = new WeakMap<FuseModel, SceneModel>()
|
|
|
export const getSceneModel = (model?: FuseModel | null) => model && sceneModelMap.get(toRaw(model))
|
|
|
|
|
|
const associationModels = (sdk: SDK) => {
|
|
|
- let isUnSet = false
|
|
|
- const unSet = ((fn: () => void) => {
|
|
|
- nextTick(() => {
|
|
|
- isUnSet = true
|
|
|
- fn()
|
|
|
- nextTick(() => isUnSet = false)
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
const getModels = () => fuseModels.value
|
|
|
shallowWatchArray(getModels, (models, oldModels) => {
|
|
|
const { added, deleted } = diffArrayChange(models, oldModels)
|
|
@@ -123,12 +139,37 @@ const associationModels = (sdk: SDK) => {
|
|
|
(loaded) => {
|
|
|
if (loaded) {
|
|
|
const modelShow = getFuseModelShowVariable(item)
|
|
|
- watch(() => item.bottom, () => isUnSet || getSceneModel(item)?.changeBottom(item.bottom), {immediate: true})
|
|
|
- watch(() => item.opacity, () => isUnSet || getSceneModel(item)?.changeOpacity(item.opacity), {immediate: true})
|
|
|
- watch(() => item.scale, () => isUnSet || getSceneModel(item)?.changeScale(item.scale), {immediate: true})
|
|
|
- watch(() => item.position, () => isUnSet || getSceneModel(item)?.changePosition(item.position), {immediate: true})
|
|
|
- watch(() => item.rotation, () => isUnSet || getSceneModel(item)?.changeRotation(item.rotation), {immediate: true})
|
|
|
- watch(() => modelShow.value, () => isUnSet || getSceneModel(item)?.changeShow(modelShow.value), {immediate: true})
|
|
|
+ watch(
|
|
|
+ () => item.bottom,
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeBottom(item.bottom),
|
|
|
+ { immediate: true }
|
|
|
+ )
|
|
|
+ watch(
|
|
|
+ () => item.opacity,
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeOpacity(item.opacity),
|
|
|
+ { immediate: true }
|
|
|
+ )
|
|
|
+ watch(
|
|
|
+ () => item.scale,
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeScale(item.scale),
|
|
|
+ { immediate: true }
|
|
|
+ )
|
|
|
+ watch(
|
|
|
+ () => item.position,
|
|
|
+ () => isUnSet || getSceneModel(item)?.changePosition(item.position),
|
|
|
+ { immediate: true }
|
|
|
+ )
|
|
|
+ watch(
|
|
|
+ () => item.rotation,
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeRotation(item.rotation),
|
|
|
+ { immediate: true }
|
|
|
+ )
|
|
|
+ watch(
|
|
|
+ () => modelShow.value,
|
|
|
+ () => isUnSet || getSceneModel(item)?.changeShow(modelShow.value),
|
|
|
+ { immediate: true }
|
|
|
+ )
|
|
|
+
|
|
|
stopLoadedWatch()
|
|
|
}
|
|
|
}
|
|
@@ -136,6 +177,9 @@ const associationModels = (sdk: SDK) => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+// -----------------热点关联--------------------
|
|
|
+
|
|
|
const associationTaggings = (el: HTMLDivElement) => {
|
|
|
const getTaggings = () => taggings.value
|
|
|
const taggingVMs = new WeakMap<Tagging, ReturnType<typeof mount>>()
|
|
@@ -153,6 +197,50 @@ const associationTaggings = (el: HTMLDivElement) => {
|
|
|
}
|
|
|
|
|
|
|
|
|
+// -----------------测量关联--------------------
|
|
|
+
|
|
|
+const sceneMeasureMap = new WeakMap<Measure , SceneMeasure>()
|
|
|
+export const getSceneMeasure = (measure?: Measure | null) => measure && sceneMeasureMap.get(toRaw(measure))
|
|
|
+
|
|
|
+export const associationMessaure = <T extends MeasureType>(smMeasure: SceneMeasure<T>, measure: Measure<T>) => {
|
|
|
+ smMeasure.bus.on('update', ([points, modelIds]) => {
|
|
|
+ unSet(() => {
|
|
|
+ measure.positions = points.map((point, i) => ({ point, modelId: modelIds[i] }))
|
|
|
+ measure.desc = measure.type === MeasureType.area
|
|
|
+ ? (smMeasure as unknown as SceneMeasure<MeasureType.area>).getArea().toString()
|
|
|
+ : (smMeasure as unknown as SceneMeasure<MeasureType.free>).getDistance().toString()
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ smMeasure.bus.on('highlight', selected => unSet(() => measure.selected = selected))
|
|
|
+}
|
|
|
+
|
|
|
+const associationMessaures = (sdk: SDK) => {
|
|
|
+ const getMeasures = () => measures.value
|
|
|
+
|
|
|
+ shallowWatchArray(getMeasures, (measures, oldMeasures) => {
|
|
|
+ const { added, deleted } = diffArrayChange(measures, oldMeasures)
|
|
|
+ for (const item of added) {
|
|
|
+ const sceneMeasure = sdk.drawMeasure(item.type, item.positions)
|
|
|
+ associationMessaure(sceneMeasure, item)
|
|
|
+ sceneMeasureMap.set(item, sceneMeasure)
|
|
|
+ }
|
|
|
+ for (const item of deleted) {
|
|
|
+ const sceneMeasure = getSceneMeasure(item)
|
|
|
+ sceneMeasure && sceneMeasure.destroy()
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ arrayChildEffectScope(getMeasures, measure => {
|
|
|
+ watch(
|
|
|
+ () => measure.selected,
|
|
|
+ (selected = false) => isUnSet || getSceneMeasure(measure)?.changeSelect(selected))
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// -----------------导览关联--------------------
|
|
|
+
|
|
|
const fullView = async (fn: () => void) => {
|
|
|
const popViewMode = togetherCallback([
|
|
|
viewModeStack.push(ref('full')),
|
|
@@ -219,7 +307,10 @@ export const playSceneGuide = async (paths: SceneGuidePath[], changeIndexCallbac
|
|
|
export const pauseSceneGuide = () => isScenePlayIng.value = false
|
|
|
|
|
|
|
|
|
+// -----------------启动关联--------------------
|
|
|
+
|
|
|
export const setupAssociation = (mountEl: HTMLDivElement) => {
|
|
|
associationModels(sdk)
|
|
|
associationTaggings(mountEl)
|
|
|
+ associationMessaures(sdk)
|
|
|
}
|