index.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <RightFillPano>
  3. <ui-group :title="`标注${tagging?.title}`" class="position-group">
  4. <PositionSign
  5. v-for="(position, i) in positions"
  6. :key="position.id"
  7. :position="position"
  8. :title="`位置${i + 1}`"
  9. @delete="deletePosition(position)"
  10. @fixed="flyTaggingPosition(position)"
  11. />
  12. </ui-group>
  13. </RightFillPano>
  14. </template>
  15. <script lang="ts" setup>
  16. import PositionSign from './sign.vue'
  17. import { router } from '@/router'
  18. import { Message } from 'bill/index'
  19. import { RightFillPano } from '@/layout'
  20. import { asyncTimeout } from '@/utils'
  21. import { useViewStack } from '@/hook'
  22. import { computed, nextTick, ref, watchEffect } from 'vue';
  23. import { sdk } from '@/sdk'
  24. import { showTaggingPositionsStack } from '@/env'
  25. import {
  26. autoSaveTaggings,
  27. getFuseModel,
  28. getFuseModelShowVariable,
  29. getTaggingPositions,
  30. taggingPositions,
  31. createTaggingPosition,
  32. getTagging,
  33. enterEdit
  34. } from '@/store'
  35. import type { TaggingPosition } from '@/store'
  36. const tagging = computed(() => getTagging(router.currentRoute.value.params.id as string))
  37. const positions = computed(() => tagging.value && getTaggingPositions(tagging.value))
  38. const flyTaggingPosition = (position: TaggingPosition) => {
  39. const model = getFuseModel(position.modelId)
  40. if (!model || !getFuseModelShowVariable(model).value) {
  41. return;
  42. }
  43. const pop = showTaggingPositionsStack.push(ref(new WeakSet([position])))
  44. sdk.comeTo({
  45. position: position.localPos,
  46. modelId: position.modelId,
  47. dur: 300,
  48. distance: 3
  49. })
  50. setTimeout(pop, 2000)
  51. }
  52. const deletePosition = (position: TaggingPosition) => {
  53. const index = taggingPositions.value.indexOf(position)
  54. if (~index) {
  55. taggingPositions.value.splice(index, 1)
  56. }
  57. }
  58. watchEffect((onCleanup) => {
  59. if (tagging.value) {
  60. const clickHandler = async (ev: MouseEvent) => {
  61. await nextTick()
  62. await asyncTimeout()
  63. const position = sdk.getPositionByScreen({
  64. x: ev.clientX,
  65. y: ev.clientY
  66. })
  67. if (!position) {
  68. Message.error('当前位置无法添加')
  69. } else {
  70. const storePosition = createTaggingPosition({
  71. ...position,
  72. taggingId: tagging.value!.id
  73. })
  74. taggingPositions.value.push(storePosition)
  75. }
  76. }
  77. sdk.layout.addEventListener('click', clickHandler, false)
  78. onCleanup(() => {
  79. sdk.layout.removeEventListener('click', clickHandler, false);
  80. })
  81. }
  82. })
  83. useViewStack(autoSaveTaggings)
  84. useViewStack(() => {
  85. enterEdit(() => router.back())
  86. })
  87. </script>
  88. <style lang="scss" scoped src="./style.scss"></style>
  89. <style lang="scss">
  90. .position-group .group-title{
  91. margin-bottom: 0;
  92. }
  93. </style>