import { toRaw, watch, reactive } from 'vue' import { custom, } from '@/env' import { diffArrayChange, shallowWatchArray, arrayChildEffectScope, round, } from '@/utils' import { MeasureType, measures, getMeasureIsShow, } from '@/store' import type { Measure, } from '@/store' import type { SDK, Measure as SceneMeasure } from '../sdk' import { unsetFactory } from "@/utils/unset"; const us = unsetFactory() // -----------------测量关联-------------------- const sceneMeasureMap = reactive(new WeakMap()) export const getSceneMeasure = (measure?: Measure | null) => measure && sceneMeasureMap.get(toRaw(measure)) export const getSceneMeasureDesc = (smMeasure: SceneMeasure, measure: Measure) => { const length = measure.type === MeasureType.area ? (smMeasure as unknown as SceneMeasure).getArea() : (smMeasure as unknown as SceneMeasure).getDistance() return round(length.value, 2).toString() } export const associationMessaure = (smMeasure: SceneMeasure, measure: Measure) => { smMeasure.bus.on('update', ([points, modelIds]) => { us.unSet(() => measure.positions = points.map((point, i) => ({ point, modelId: modelIds[i] }))) }) smMeasure.bus.on('highlight', selected => us.unSet(() => measure.selected = selected)) } export const associationMessaures = (sdk: SDK) => { const getMeasures = () => measures.value.filter(getMeasureIsShow) shallowWatchArray(getMeasures, (measures, oldMeasures) => { const { added, deleted } = diffArrayChange(measures, oldMeasures) for (const item of added) { const sceneMeasure = sdk.drawMeasure( item.type, item.positions.map(position => ({...position.point})), item.positions.map(position => position.modelId), ) if (sceneMeasure.destroy) { sceneMeasureMap.set(toRaw(item), sceneMeasure) associationMessaure(sceneMeasure, item) } } for (const item of deleted) { const sceneMeasure = getSceneMeasure(item) sceneMeasure && sceneMeasure.destroy!() sceneMeasureMap.delete(toRaw(item)) } }) arrayChildEffectScope(getMeasures, measure => { watch( () => measure.selected, (selected = false) => us.isUnSet || getSceneMeasure(measure)?.changeSelect(selected) ) watch( () => measure.positions, (positions) => us.isUnSet || getSceneMeasure(measure)?.setPositions( positions.map(position => ({...position.point})), positions.map(position => position.modelId), ) ) watch( () => custom.showMeasures, (show) => { if (!us.isUnSet) { const smMeasure = getSceneMeasure(measure) if (show) { smMeasure?.show() } else { smMeasure?.hide() } } }, { immediate: true } ) }) }