measure.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { toRaw, watch, reactive } from 'vue'
  2. import {
  3. custom,
  4. } from '@/env'
  5. import {
  6. diffArrayChange,
  7. shallowWatchArray,
  8. arrayChildEffectScope,
  9. round,
  10. } from '@/utils'
  11. import {
  12. MeasureType,
  13. measures,
  14. getMeasureIsShow,
  15. } from '@/store'
  16. import type { Measure, } from '@/store'
  17. import type {
  18. SDK,
  19. Measure as SceneMeasure
  20. } from '../sdk'
  21. import { unsetFactory } from "@/utils/unset";
  22. const us = unsetFactory()
  23. // -----------------测量关联--------------------
  24. const sceneMeasureMap = reactive(new WeakMap<Measure , SceneMeasure>())
  25. export const getSceneMeasure = (measure?: Measure | null) => measure && sceneMeasureMap.get(toRaw(measure))
  26. export const getSceneMeasureDesc = (smMeasure: SceneMeasure, measure: Measure) => {
  27. const length = measure.type === MeasureType.area
  28. ? (smMeasure as unknown as SceneMeasure<MeasureType.area>).getArea()
  29. : (smMeasure as unknown as SceneMeasure<MeasureType.free>).getDistance()
  30. return round(length.value, 2).toString()
  31. }
  32. export const associationMessaure = <T extends MeasureType>(smMeasure: SceneMeasure<T>, measure: Measure<T>) => {
  33. smMeasure.bus.on('update', ([points, modelIds]) => {
  34. us.unSet(() => measure.positions = points.map((point, i) => ({ point, modelId: modelIds[i] })))
  35. })
  36. smMeasure.bus.on('highlight', selected => us.unSet(() => measure.selected = selected))
  37. }
  38. export const associationMessaures = (sdk: SDK) => {
  39. const getMeasures = () => measures.value.filter(getMeasureIsShow)
  40. shallowWatchArray(getMeasures, (measures, oldMeasures) => {
  41. const { added, deleted } = diffArrayChange(measures, oldMeasures)
  42. for (const item of added) {
  43. const sceneMeasure = sdk.drawMeasure(
  44. item.type,
  45. item.positions.map(position => ({...position.point})),
  46. item.positions.map(position => position.modelId),
  47. )
  48. if (sceneMeasure.destroy) {
  49. sceneMeasureMap.set(toRaw(item), sceneMeasure)
  50. associationMessaure(sceneMeasure, item)
  51. }
  52. }
  53. for (const item of deleted) {
  54. const sceneMeasure = getSceneMeasure(item)
  55. sceneMeasure && sceneMeasure.destroy!()
  56. sceneMeasureMap.delete(toRaw(item))
  57. }
  58. })
  59. arrayChildEffectScope(getMeasures, measure => {
  60. watch(
  61. () => measure.selected,
  62. (selected = false) => us.isUnSet || getSceneMeasure(measure)?.changeSelect(selected)
  63. )
  64. watch(
  65. () => measure.positions,
  66. (positions) => us.isUnSet || getSceneMeasure(measure)?.setPositions(
  67. positions.map(position => ({...position.point})),
  68. positions.map(position => position.modelId),
  69. )
  70. )
  71. watch(
  72. () => custom.showMeasures,
  73. (show) => {
  74. if (!us.isUnSet) {
  75. const smMeasure = getSceneMeasure(measure)
  76. if (show) {
  77. smMeasure?.show()
  78. } else {
  79. smMeasure?.hide()
  80. }
  81. }
  82. },
  83. { immediate: true }
  84. )
  85. })
  86. }