CameraViewSetting.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <template>
  2. <div>
  3. <div class="toolbarWrapper">
  4. <ViewWindowSetting v-model="viewType" @update:model-value="handleUpdateViewType" />
  5. <FenceToolbar
  6. :style="{ visibility: drawable ? 'visible' : 'hidden' }"
  7. @remove="handleRemove"
  8. @save="handleSave"
  9. @toggle-editable="toggleEditable"
  10. :is-edit="isEdit"
  11. />
  12. <PresetSelect />
  13. </div>
  14. <div class="cameraViewSettingWrapper">
  15. <FenceEditor ref="fenceEditorRef" />
  16. <div class="cameraVideo"><CameraLiveVideo /></div>
  17. <div class="presetAddWrapper">
  18. <CameraDirectionControl />
  19. <ElButton type="primary" @click="handleAddPreset" size="small">添加预置位</ElButton>
  20. <AddPresetModal
  21. v-if="addPresetModalVisible"
  22. @close="handleClose"
  23. @ok="handleAddPresetOk"
  24. /> </div
  25. ></div>
  26. </div>
  27. <div class="cameraParamsSettingWrapper">
  28. <div class="cameraParamsSetting">
  29. <CameraParams :detail="cameraParamsDetail" />
  30. </div>
  31. <div class="algorithmsSetting"> <AlgorithmsSetting /> </div>
  32. </div>
  33. </template>
  34. <script lang="ts" setup>
  35. import { computed, ref, watch } from 'vue';
  36. import FenceToolbar from '../FenceToolbar/FenceToolbar.vue';
  37. import FenceEditor from '../FenceEditor/FenceEditor.vue';
  38. import CameraLiveVideo from '../CameraLiveVideo/CameraLiveVideo.vue';
  39. import ViewWindowSetting from '../ViewWindowSetting/ViewWindowSetting.vue';
  40. import PresetSelect from '../PresetSelect/PresetSelect.vue';
  41. import { ViewType } from '../ViewWindowSetting/types';
  42. import useFenceStore from '../../store/useFenceStore';
  43. import AddPresetModal from '../AddPresetModal/AddPresetModal.vue';
  44. import { onMounted } from 'vue';
  45. import usePresetListStore from '../../store/usePresetListStore';
  46. import useCameraDetailStore from '../../store/useCameraDetailStore';
  47. import useCameraAlgoStore from '../../store/useCameraAlgoStore';
  48. import AlgorithmsSetting from '../AlgorithmsSetting/AlgorithmsSetting.vue';
  49. import CameraParams from '../CameraParams/CameraParams.vue';
  50. import { ElMessage } from 'element-plus';
  51. const fenceEditorRef = ref<typeof FenceEditor | null>(null);
  52. const fenceStore = useFenceStore();
  53. const presetStore = usePresetListStore();
  54. const cameraDetailStore = useCameraDetailStore();
  55. const cameraAlgoStore = useCameraAlgoStore();
  56. const viewType = ref<ViewType>(ViewType.window1);
  57. const addPresetModalVisible = ref(false);
  58. const cameraParamsDetail = ref({});
  59. const handleClose = () => {
  60. addPresetModalVisible.value = false;
  61. };
  62. const handleAddPresetOk = () => {
  63. presetStore.getPresetList(cameraDetailStore.cameraId);
  64. handleClose();
  65. };
  66. const handleRemove = () => {
  67. console.log('handleRemove');
  68. fenceEditorRef.value?.remove();
  69. };
  70. const isEdit = ref(false);
  71. /** 退出编辑模式 */
  72. const toggleEditable = (val: boolean) => {
  73. isEdit.value = val;
  74. if (val) {
  75. fenceEditorRef.value?.setEditMode();
  76. } else {
  77. fenceEditorRef.value?.exitEditMode();
  78. }
  79. };
  80. const handleSave = () => {
  81. const json = fenceEditorRef.value?.toObject();
  82. console.log('save json', json);
  83. const cameraId = cameraDetailStore.cameraId;
  84. if (!cameraId) {
  85. ElMessage.error('未选中相机');
  86. return;
  87. }
  88. const algoId = cameraAlgoStore.selectedAlgoId;
  89. if (!algoId) {
  90. ElMessage.error('未选中算法');
  91. return;
  92. }
  93. const presetToken = presetStore.currentPresetToken;
  94. if (!presetToken) {
  95. ElMessage.error('未选中预置位');
  96. return;
  97. }
  98. fenceStore
  99. .saveFence({
  100. cameraId: cameraId,
  101. algoId: algoId,
  102. presetToken,
  103. electronicFencePolygon: JSON.stringify(json),
  104. })
  105. ?.then((res) => {
  106. ElMessage.success('更新成功');
  107. });
  108. };
  109. const handleUpdateViewType = (t: ViewType) => {
  110. console.log('viewType', t);
  111. };
  112. const handleUpdatePreset = (val: string) => {
  113. console.log('val', val);
  114. };
  115. watch(
  116. () => fenceStore.serverFencePoints,
  117. (newVal) => {
  118. console.log('newVal', newVal);
  119. if (!newVal) {
  120. fenceEditorRef.value?.clear();
  121. return;
  122. }
  123. // const rawLinePoints = newVal[0];
  124. const rawLinePoints = newVal.map((x) => {
  125. const points: number[] = [];
  126. x.forEach((line) => {
  127. points.push(line[0], line[1]);
  128. });
  129. return points;
  130. });
  131. if (!rawLinePoints) return;
  132. /** 先清空原有的 */
  133. fenceEditorRef.value?.clear();
  134. fenceEditorRef.value?.createLines(rawLinePoints);
  135. },
  136. { immediate: true },
  137. );
  138. watch(
  139. () => cameraAlgoStore.selectedAlgoDetail?.status,
  140. (newVal) => {
  141. if (newVal) {
  142. fenceEditorRef.value?.setEditMode();
  143. } else {
  144. fenceEditorRef.value?.exitEditMode();
  145. }
  146. },
  147. {
  148. immediate: true,
  149. deep: true,
  150. },
  151. );
  152. const drawable = computed(() => {
  153. if (!presetStore.currentPresetToken) return false;
  154. if (!cameraAlgoStore.selectedAlgoId) return false;
  155. if (!cameraAlgoStore.selectedAlgoDetail?.electronicFenceBool) return false;
  156. return true;
  157. });
  158. const handleAddPreset = () => {
  159. addPresetModalVisible.value = true;
  160. };
  161. onMounted(() => {
  162. const cameraId = cameraDetailStore.cameraId;
  163. if (cameraId) {
  164. presetStore.getPresetList(cameraId);
  165. }
  166. });
  167. </script>
  168. <style scoped>
  169. .cameraViewSettingWrapper {
  170. position: relative;
  171. width: 720px;
  172. height: 405px;
  173. border: 1px solid #ccc;
  174. }
  175. .cameraVideo {
  176. position: absolute;
  177. background: #ccc;
  178. width: 100%;
  179. height: 100%;
  180. }
  181. .toolbarWrapper {
  182. display: flex;
  183. align-items: center;
  184. margin-left: 25px;
  185. position: relative;
  186. }
  187. .presetAddWrapper {
  188. position: absolute;
  189. bottom: 50px;
  190. right: 50px;
  191. z-index: 10;
  192. }
  193. .cameraParamsSettingWrapper {
  194. display: flex;
  195. margin-top: 10px;
  196. }
  197. .algorithmsSetting {
  198. flex: 1;
  199. min-height: 300px;
  200. margin-left: 10px;
  201. border-left: 1px solid #ccc;
  202. padding-left: 15px;
  203. }
  204. .cameraParamsSetting {
  205. flex-basis: 330px;
  206. flex-shrink: 0;
  207. }
  208. </style>