TrackMeasure.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <template>
  2. <div class="photo-btn">
  3. <ButtonPane class="item fun-ctrl" :size="80" @click="callback">
  4. <ui-icon type="return" class="icon" />
  5. </ButtonPane>
  6. <ButtonPane class="item fun-ctrl" :size="80" @click="active = !active">
  7. <ui-icon type="line_h" class="icon" :class="{ active }" />
  8. </ButtonPane>
  9. </div>
  10. </template>
  11. <script setup lang="ts">
  12. import UiIcon from "@/components/base/components/icon/index.vue";
  13. import ButtonPane from "@/components/button-pane/index.vue";
  14. import {
  15. startMeasure,
  16. stopMeasure,
  17. SuccessMeasureAtom,
  18. } from "@/views/scene/linkage/measure";
  19. import { onActivated, onMounted, ref, watchEffect, nextTick } from "vue";
  20. import { tempMeasures } from "@/store/measure";
  21. import { measureDisabledStack } from "@/hook/custom";
  22. import { useSDK } from "@/hook";
  23. const props = defineProps<{ onConfirm: (data: SuccessMeasureAtom) => void }>();
  24. const active = ref(false);
  25. const callback = () => {
  26. props.onConfirm(tempMeasures.value[0] as any);
  27. tempMeasures.value = [];
  28. };
  29. watchEffect(() => {
  30. if (active.value) {
  31. tempMeasures.value = [];
  32. startMeasure("L_LINE", "red").then((measure) => {
  33. if (measure) {
  34. active.value = null;
  35. tempMeasures.value = [measure];
  36. nextTick(() => {
  37. const canvas = useSDK().carry.measureMap.get(measure);
  38. canvas.bus.on("update", (pos) => {
  39. measure.length = canvas.getDistance().value;
  40. });
  41. });
  42. }
  43. });
  44. } else {
  45. stopMeasure();
  46. }
  47. });
  48. </script>
  49. <style lang="scss" scoped>
  50. .photo-btn {
  51. position: absolute;
  52. transform: translateY(-50%);
  53. top: 50%;
  54. left: 15px;
  55. z-index: 1000;
  56. .item {
  57. position: static;
  58. margin: 20px 0;
  59. }
  60. .icon {
  61. &.active {
  62. color: var(--colors-primary-base);
  63. }
  64. position: absolute;
  65. left: 50%;
  66. transform: translateX(-50%);
  67. font-size: 28px;
  68. }
  69. }
  70. </style>