123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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<Measure , SceneMeasure>())
- 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<MeasureType.area>).getArea()
- : (smMeasure as unknown as SceneMeasure<MeasureType.free>).getDistance()
- return round(length.value, 2).toString()
- }
- export const associationMessaure = <T extends MeasureType>(smMeasure: SceneMeasure<T>, measure: Measure<T>) => {
- 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 }
- )
- })
- }
|