CameraViewSetting.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <template>
  2. <div>
  3. <div class="toolbarWrapper">
  4. <ViewWindowSetting v-model="viewType" @update:model-value="handleUpdateViewType" />
  5. <FenceToolbar
  6. @remove="handleRemove"
  7. @save="handleSave"
  8. @toggle-editable="toggleEditable"
  9. :is-edit="isEdit"
  10. />
  11. <PresetSelect />
  12. </div>
  13. <div class="cameraViewSettingWrapper">
  14. <FenceEditor ref="fenceEditorRef" />
  15. <div class="cameraVideo"><CameraLiveVideo /></div>
  16. <div class="presetAddWrapper">
  17. <CameraDirectionControl />
  18. <ElButton type="primary" @click="handleAddPreset" size="small">添加预置位</ElButton>
  19. <AddPresetModal
  20. v-if="addPresetModalVisible"
  21. @close="handleClose"
  22. @ok="handleAddPresetOk"
  23. /> </div
  24. ></div>
  25. </div>
  26. </template>
  27. <script lang="ts" setup>
  28. import { ref, watch } from 'vue';
  29. import FenceToolbar from '../FenceToolbar/FenceToolbar.vue';
  30. import FenceEditor from '../FenceEditor/FenceEditor.vue';
  31. import CameraLiveVideo from '../CameraLiveVideo/CameraLiveVideo.vue';
  32. import ViewWindowSetting from '../ViewWindowSetting/ViewWindowSetting.vue';
  33. import PresetSelect from '../PresetSelect/PresetSelect.vue';
  34. import { ViewType } from '../ViewWindowSetting/types';
  35. import useFenceStore from '../../store/useFenceStore';
  36. import AddPresetModal from '../AddPresetModal/AddPresetModal.vue';
  37. import { onMounted } from 'vue';
  38. import usePresetListStore from '../../store/usePresetListStore';
  39. import useCameraDetailStore from '../../store/useCameraDetailStore';
  40. const fenceEditorRef = ref<typeof FenceEditor | null>(null);
  41. const fenceStore = useFenceStore();
  42. const { data, getPresetList } = usePresetListStore();
  43. const cameraDetailStore = useCameraDetailStore();
  44. const viewType = ref<ViewType>(ViewType.window1);
  45. const addPresetModalVisible = ref(false);
  46. const handleClose = () => {
  47. addPresetModalVisible.value = false;
  48. };
  49. const handleAddPresetOk = () => {
  50. getPresetList(cameraDetailStore.cameraId);
  51. handleClose();
  52. };
  53. const handleRemove = () => {
  54. console.log('handleRemove');
  55. fenceEditorRef.value?.remove();
  56. };
  57. const isEdit = ref(true);
  58. /** 退出编辑模式 */
  59. const toggleEditable = (val: boolean) => {
  60. isEdit.value = val;
  61. if (val) {
  62. fenceEditorRef.value?.setEditMode();
  63. } else {
  64. fenceEditorRef.value?.exitEditMode();
  65. }
  66. };
  67. const handleSave = () => {
  68. const json = fenceEditorRef.value?.toObject();
  69. console.log('save json', json);
  70. };
  71. const handleUpdateViewType = (t: ViewType) => {
  72. console.log('viewType', t);
  73. };
  74. const handleUpdatePreset = (val: string) => {
  75. console.log('val', val);
  76. };
  77. watch(
  78. () => fenceStore.serverFencePoints,
  79. (newVal) => {
  80. console.log('newVal', newVal);
  81. if (!newVal) {
  82. fenceEditorRef.value?.clear();
  83. return;
  84. }
  85. // const rawLinePoints = newVal[0];
  86. const rawLinePoints = newVal.map((x) => {
  87. const points: number[] = [];
  88. x.forEach((line) => {
  89. points.push(line[0], line[1]);
  90. });
  91. return points;
  92. });
  93. if (!rawLinePoints) return;
  94. /** 先清空原有的 */
  95. fenceEditorRef.value?.clear();
  96. fenceEditorRef.value?.createLines(rawLinePoints);
  97. },
  98. { immediate: true },
  99. );
  100. const handleAddPreset = () => {
  101. addPresetModalVisible.value = true;
  102. };
  103. onMounted(() => {
  104. const cameraId = cameraDetailStore.cameraId;
  105. if (cameraId) {
  106. getPresetList(cameraId);
  107. }
  108. });
  109. </script>
  110. <style scoped>
  111. .cameraViewSettingWrapper {
  112. position: relative;
  113. width: 720px;
  114. height: 405px;
  115. border: 1px solid #ccc;
  116. }
  117. .cameraVideo {
  118. position: absolute;
  119. background: #ccc;
  120. width: 100%;
  121. height: 100%;
  122. }
  123. .toolbarWrapper {
  124. display: flex;
  125. align-items: center;
  126. margin-left: 25px;
  127. position: relative;
  128. }
  129. .presetAddWrapper {
  130. position: absolute;
  131. bottom: 50px;
  132. right: 50px;
  133. z-index: 10;
  134. }
  135. </style>