bill 1 سال پیش
والد
کامیت
88140d9698

+ 1 - 0
src/api/scene.ts

@@ -34,6 +34,7 @@ export const SceneTypeDesc: Record<SceneType, string>  = {
 
 export interface Scene {
   createTime: string
+  createStatus: number
   id: number
   isLaser: boolean
   modelDateType: string

+ 4 - 0
src/api/setting.ts

@@ -9,6 +9,7 @@ type ServeSetting = {
   pose?: string;
   cover?: string;
   back?: string;
+  rotate?: number
   fov: number
   backType?: SettingResourceType;
   mapOpen?: boolean;
@@ -26,6 +27,7 @@ export type Setting = {
   cover: string;
   fov: number
   scale?: number
+  rotate?: number
   back: string;
   openCompass: boolean
   backType: SettingResourceType;
@@ -38,6 +40,7 @@ const toLocal = (serviceSetting: ServeSetting): Setting => ({
   id: serviceSetting.settingsId,
   pose: serviceSetting.pose && JSON.parse(serviceSetting.pose),
   cover: serviceSetting.cover || defaultCover,
+  rotate: serviceSetting.rotate || 0,
   back: serviceSetting.back || "none",
   backType: serviceSetting.backType || SettingResourceType.icon,
   mapOpen: serviceSetting.mapOpen || false,
@@ -52,6 +55,7 @@ const toService = (setting: Setting): ServeSetting => ({
   pose: setting.pose && JSON.stringify(setting.pose),
   cover: setting.cover,
   back: setting.back,
+  rotate: setting.rotate || 0,
   mapType: setting.mapType
 });
 

+ 1 - 1
src/components/tagging/metas/custom.ts

@@ -15,7 +15,7 @@ export const custom = {
     icon: "video",
     upload: true,
     uploadPlace: "上传视频",
-    accept: `.mp4, .mov`,
+    accept: `.mp4, .mov, .m4v`,
     multiple: false,
     name: "视频",
     maxSize: 20 * 1024 * 1024,

+ 5 - 1
src/components/tagging/metas/metas-edit.vue

@@ -8,7 +8,7 @@
         style="margin-right: 10px"
         class="type-span"
       >
-        {{ item.name }}
+        <span>{{ item.name }}</span>
         <ui-input
           class="radio"
           type="radio"
@@ -69,6 +69,10 @@ const emit = defineEmits<{
 <style lang="scss" scoped>
 .type-span {
   margin-top: 10px;
+  margin-right: 4px;
   display: inline-block;
+  > span {
+    margin-right: 5px;
+  }
 }
 </style>

+ 1 - 2
src/components/tagging/metas/style.scss

@@ -118,6 +118,7 @@
   }
 }
 
+
 .hot-item {
   position: absolute;
   cursor: pointer;
@@ -126,10 +127,8 @@
     width: 32px;
     height: 32px;
   }
-
   .hot-bubble {
     cursor: initial;
-
     &.pc {
       width: 400px;
     }

+ 36 - 28
src/components/tagging/sign.vue

@@ -17,36 +17,38 @@
     </ui-tip>
     <div @click.stop>
       <UIBubble class="hot-bubble pc" :show="showContent" type="left" level="center">
-        <h2>{{ tagging.title }}</h2>
-        <div class="content">
-          <div class="show-editor">
-            <QuillEditor
-              readOnly
-              theme="snow"
-              v-model:content="tagging.desc"
-              contentType="html"
-              :enable="false"
-            />
+        <div class="hbp-layout">
+          <h2>{{ tagging.title }}</h2>
+          <div class="content">
+            <div class="show-editor">
+              <QuillEditor
+                readOnly
+                theme="snow"
+                v-model:content="tagging.desc"
+                contentType="html"
+                :enable="false"
+              />
+            </div>
+            <p><span>遗留部位:</span>{{ tagging.part }}</p>
+            <p><span>提取方法:</span>{{ tagging.method }}</p>
+            <p><span>类别:</span>{{ tagging.mtype }}</p>
+            <p><span>类型:</span>{{ tagging.cat }}</p>
+            <p><span>特征描述:</span>{{ tagging.tsms }}</p>
+            <p><span>提取时间:</span>{{ tagging.time }}</p>
+            <p><span>提取人:</span>{{ tagging.principal }}</p>
           </div>
-          <p><span>遗留部位:</span>{{ tagging.part }}</p>
-          <p><span>提取方法:</span>{{ tagging.method }}</p>
-          <p><span>类别:</span>{{ tagging.mtype }}</p>
-          <p><span>类型:</span>{{ tagging.cat }}</p>
-          <p><span>特征描述:</span>{{ tagging.tsms }}</p>
-          <p><span>提取时间:</span>{{ tagging.time }}</p>
-          <p><span>提取人:</span>{{ tagging.principal }}</p>
-        </div>
 
-        <Metas :hot="tagging" @pull="(index) => (pullIndex = index)" :in-full="true" />
+          <Metas :hot="tagging" @pull="(index) => (pullIndex = index)" :in-full="true" />
 
-        <div
-          class="edit-hot"
-          v-if="router.currentRoute.value.name === RoutesName.tagging"
-        >
-          <span @click="$emit('delete')" class="fun-ctrl">
-            <ui-icon type="del" />
-            删除
-          </span>
+          <div
+            class="edit-hot"
+            v-if="router.currentRoute.value.name === RoutesName.tagging"
+          >
+            <span @click="$emit('delete')" class="fun-ctrl">
+              <ui-icon type="del" />
+              删除
+            </span>
+          </div>
         </div>
       </UIBubble>
 
@@ -121,7 +123,7 @@ const isHover = ref(false);
 const queryItems = computed(() =>
   props.tagging.images.map((image) => ({
     type: props.tagging.type,
-    url: image,
+    url: typeof image === "string" ? image : image.url,
   }))
 );
 
@@ -216,4 +218,10 @@ const iconClickHandler = () => {
 .show-editor .ql-container .ql-editor {
   padding: 0;
 }
+.hbp-layout {
+  margin: -20px;
+  padding: 20px;
+  max-height: 500px;
+  overflow-y: auto;
+}
 </style>

+ 71 - 64
src/layout/edit/scene-select.vue

@@ -1,7 +1,7 @@
 <template>
-  <Modal 
+  <Modal
     width="800px"
-    title="添加场景" 
+    title="添加场景"
     :visible="visible"
     @ok="okHandler"
     @cancel="visible = false"
@@ -10,30 +10,32 @@
     class="model-table"
   >
     <div>
-      <div className='model-header'>
-        <p class="header-desc">已选择数据<span>( {{ rowSelection.selectedRowKeys.length }} )</span></p>
+      <div className="model-header">
+        <p class="header-desc">
+          已选择数据<span>( {{ rowSelection.selectedRowKeys.length }} )</span>
+        </p>
         <Search
-          className='content-header-search'
-          placeholder="输入名称搜索" 
+          className="content-header-search"
+          placeholder="输入名称搜索"
           v-model:value="keyword"
           allow-clear
           style="width: 264px"
         />
       </div>
       <div class="table-layout" v-if="filterScenes.length">
-        <Table 
-          :row-key="record => record.modelId"
+        <Table
+          :row-key="(record) => record.modelId"
           :columns="cloumns"
           :rowSelection="rowSelection"
           :data-source="filterScenes"
           :pagination="false"
         />
       </div>
-      <div style="padding: 1px;" v-else>
-        <Empty 
-          :description="keyword.length ? '暂无搜索结果': '暂无结果'" 
+      <div style="padding: 1px" v-else>
+        <Empty
+          :description="keyword.length ? '暂无搜索结果' : '暂无结果'"
           :image="Empty.PRESENTED_IMAGE_SIMPLE"
-          className="ant-empty ant-empty-normal" 
+          className="ant-empty ant-empty-normal"
         />
       </div>
     </div>
@@ -45,91 +47,96 @@
 </template>
 
 <script lang="ts" setup>
-import { Modal, Input, Table, Empty } from 'ant-design-vue'
-import { computed, nextTick, ref, watch, watchEffect } from 'vue';
-import { scenes, save, SceneTypeDesc } from '@/store'
-import { createLoadPack } from '@/utils'
-import { fuseModels, createFuseModels, addFuseModel, fuseModelsLoaded, initialScenes } from '@/store'
+import { Modal, Input, Table, Empty } from "ant-design-vue";
+import { computed, nextTick, ref, watch, watchEffect } from "vue";
+import { scenes, save, SceneTypeDesc } from "@/store";
+import { createLoadPack } from "@/utils";
+import {
+  fuseModels,
+  createFuseModels,
+  addFuseModel,
+  fuseModelsLoaded,
+  initialScenes,
+} from "@/store";
 
-import type { Scene } from '@/api'
+import type { Scene } from "@/api";
 
-type Key = Scene['modelId']
+type Key = Scene["modelId"];
 
-const Search = Input.Search
+const Search = Input.Search;
 
-const selectIds = computed(() => fuseModels.value.map(item => item.modelId))
-const visible = ref(false)
-const keyword = ref('')
-const filterScenes = computed(
-  () => scenes.value
-    .filter(item => item.name && item.modelId && item.name.includes(keyword.value))
-    .map(scene => ({
+const selectIds = computed(() => fuseModels.value.map((item) => item.modelId));
+const visible = ref(false);
+const keyword = ref("");
+const filterScenes = computed(() =>
+  scenes.value
+    .filter((item) => item.name && item.modelId && item.name.includes(keyword.value))
+    .map((scene) => ({
       ...scene,
       createTime: scene.createTime.substr(0, 16),
-      type: SceneTypeDesc[scene.type]
+      type: SceneTypeDesc[scene.type],
     }))
-)
-const selects = ref<Key[]>(selectIds.value)
+);
+const selects = ref<Key[]>(selectIds.value);
 const rowSelection: any = ref({
   selectedRowKeys: selects,
   onChange: (ids: number[]) => {
-    selects.value = Array.from(new Set(ids.concat(selectIds.value)))
+    selects.value = Array.from(new Set(ids.concat(selectIds.value)));
   },
   getCheckboxProps: (record: Scene) => ({
-    disabled: selectIds.value.includes(record.modelId)
-  })
-})
+    disabled: selectIds.value.includes(record.modelId) || record.createStatus === 2,
+  }),
+});
 const cloumns = [
   {
     width: "400px",
-    title: '名称',
-    dataIndex: 'name',
-    key: 'name',
+    title: "名称",
+    dataIndex: "name",
+    key: "name",
   },
   {
-    title: '类型',
-    dataIndex: 'type',
-    key: 'type',
+    title: "类型",
+    dataIndex: "type",
+    key: "type",
   },
   {
-    title: '拍摄/创建时间',
-    dataIndex: 'createTime',
-    key: 'createTime',
-  }
-]
+    title: "拍摄/创建时间",
+    dataIndex: "createTime",
+    key: "createTime",
+  },
+];
 
 const okHandler = createLoadPack(async () => {
   const addPromises = selects.value
-    .filter(modelId => !fuseModels.value.some(model => model.modelId === modelId))
-    .map(modelId => createFuseModels({ modelId }))
-    .map(addFuseModel)
+    .filter((modelId) => !fuseModels.value.some((model) => model.modelId === modelId))
+    .map((modelId) => createFuseModels({ modelId }))
+    .map(addFuseModel);
 
-  await Promise.all(addPromises)
+  await Promise.all(addPromises);
   await new Promise<void>((resolve) => {
     nextTick(() => {
       const stop = watchEffect(() => {
         if (fuseModelsLoaded.value) {
           nextTick(() => {
-            stop()
-            resolve()
-          })
+            stop();
+            resolve();
+          });
         }
-        
-      })
-    })
-  })
-  await save()
-  visible.value = false
-})
+      });
+    });
+  });
+  await save();
+  visible.value = false;
+});
 
 watch(visible, (visible, oldvisible) => {
   if (visible !== oldvisible) {
-    keyword.value = ''
-    selects.value = selectIds.value
+    keyword.value = "";
+    selects.value = selectIds.value;
 
-    visible && initialScenes()
+    visible && initialScenes();
   }
-})
+});
 </script>
 
 <style lang="less" scoped>
@@ -153,4 +160,4 @@ watch(visible, (visible, oldvisible) => {
 .ant-modal-root .ant-table-tbody > tr > td {
   word-break: break-all;
 }
-</style>
+</style>

+ 4 - 4
src/sdk/association.ts

@@ -505,7 +505,7 @@ export const setupAssociation = (mountEl: HTMLDivElement) => {
       associationMessaures(sdk)
       setting.value?.pose && sdk.comeTo(setting.value.pose)
 
-      setBackdrop(setting.value!.back, setting.value!.backType, setting.value!.scale);
+      setBackdrop(setting.value!.back, setting.value!.backType, { scale: setting.value!.scale, rotate: setting.value!.rotate});
       setMap(setting.value!.mapOpen, setting.value!.mapType)
 
       watchEffect(() => {
@@ -521,7 +521,7 @@ export const setupAssociation = (mountEl: HTMLDivElement) => {
 }
 
 
-export const setBackdrop = (back: string, type: SettingResourceType, scale?: number) => {
+export const setBackdrop = (back: string, type: SettingResourceType, tb: {scale?: number, rotate?: number} = { scale: 1, rotate: 0 }) => {
   ;(document.querySelector('#scene-map') as HTMLDivElement)!.style.display =  'none';
   if (type === SettingResourceType.map) {
     if (!caseProject.value!.tmProject?.latlng) {
@@ -535,9 +535,9 @@ export const setBackdrop = (back: string, type: SettingResourceType, scale?: num
     // 'satellite' | 'standard'
 
   } else if (type!== SettingResourceType.icon) {
-    setting.value?.back && sdk.setBackdrop(back, type, scale || 1)
+    setting.value?.back && sdk.setBackdrop(back, type, tb)
   } else {
-    sdk.setBackdrop('none', type, 1)
+    sdk.setBackdrop('none', type, {scale: 1, rotate: 0})
   }
 }
 

+ 1 - 1
src/sdk/sdk.ts

@@ -105,7 +105,7 @@ export type StartMeasure<T extends StoreMeasure['type']> = Measure<T> & {
 export interface SDK {
   layout: HTMLDivElement,
   sceneBus: Emitter<{ 'cameraChange':  SceneLocalPos }>
-  setBackdrop: (drop: string, type: SettingResourceType, scale: number) => void
+  setBackdrop: (drop: string, type: SettingResourceType, tb: {scale?: number, rotate?: number}) => void
   compassVisibility: (visibility: boolean) => void
   addModel: (props: AddModelProps) => SceneModel
   setCameraFov: (fov: number) => void

+ 1 - 1
src/views/fire/index.vue

@@ -19,7 +19,7 @@
         {{ caseProject.tmProject.projectSite }}
       </p>
       <p>
-        <span>勘验信息:</span>
+        <span>天气情况:</span>
         {{ caseProject.tmProject.field7 }}
       </p>
       <p>

+ 24 - 9
src/views/setting/index.vue

@@ -14,7 +14,8 @@
         <ui-icon
           ctrl
           :type="setting?.openCompass ? 'eye-s' : 'eye-n'"
-          @click="changeBack(setting!.back, setting!.backType, !setting!.openCompass, setting!.mapOpen, setting!.mapType, setting!.scale)"
+          @click="changeBack(setting!.back, setting!.backType, !setting!.openCompass, setting!.mapOpen, setting!.mapType, 
+          {scale: setting!.scale!, rotate: setting?.rotate!})"
         />
       </template>
     </ui-group>
@@ -61,7 +62,7 @@
             :key="back.resource"
             class="back-item"
             :class="{ [back.backType]: true, active: setting!.back === back.resource }"
-            @click="setting!.back !== back.resource && changeBack(back.resource, back.backType, setting!.openCompass, setting!.mapOpen, setting!.mapType, setting!.scale)"
+            @click="setting!.back !== back.resource && changeBack(back.resource, back.backType, setting!.openCompass, setting!.mapOpen, setting!.mapType, {scale: setting!.scale!, rotate: setting?.rotate!})"
           >
             <img
               :src="back.resource"
@@ -142,13 +143,25 @@
 
   <Teleport to="#layout-app" v-if="setting?.backType === SettingResourceType.bottomImage">
     <div class="slider-demo-block ant-modal-root">
+      缩放
       <Slider
         :value="setting!.scale || 1"
         vertical
         :min="0.1"
         :step="0.01"
         :max="3"
-        @update:value="(val: any) => changeBack(setting!.back, setting!.backType, setting!.openCompass, setting!.mapOpen, setting!.mapType, val)"
+        @update:value="(val: any) => changeBack(setting!.back, setting!.backType, setting!.openCompass, setting!.mapOpen, setting!.mapType, {scale: val, rotate: setting?.rotate!})"
+      />
+    </div>
+    <div class="slider-demo-block ant-modal-root" style="margin-right: 60px">
+      旋转
+      <Slider
+        :value="setting!.rotate || 0"
+        vertical
+        :min="0.1"
+        :step="0.01"
+        :max="360"
+        @update:value="(val: any) => changeBack(setting!.back, setting!.backType, setting!.openCompass, setting!.mapOpen, setting!.mapType, {scale: setting!.scale!, rotate: val})"
       />
     </div>
   </Teleport>
@@ -217,6 +230,7 @@ const initOpenCompass = setting.value!.openCompass;
 const initopenMap = setting.value!.mapOpen;
 const initmapType = setting.value!.mapType;
 const initScale = setting.value!.scale;
+const initRotate = setting.value!.rotate;
 let isFirst = true;
 const changeBack = (
   back: string,
@@ -224,22 +238,22 @@ const changeBack = (
   openCompass: boolean,
   openMap: boolean,
   mapType: string,
-  scale: number = 1
+  tb: { scale: number; rotate: number } = { scale: 1, rotate: 0 }
 ) => {
   if (type === SettingResourceType.map && !caseProject.value!.tmProject?.latlng) {
     Dialog.alert("当前案件没绑定经纬度,无法开启地图功能");
     return;
   }
 
-  console.error("??", back);
   setting.value!.back = back;
   setting.value!.backType = type;
   setting.value!.openCompass = openCompass;
   setting.value!.mapOpen = openMap;
   setting.value!.mapType = mapType;
-  setting.value!.scale = scale;
+  setting.value!.scale = tb.scale;
+  setting.value!.rotate = tb.rotate;
 
-  setBackdrop(back, type, scale);
+  setBackdrop(back, type, tb);
   setMap(openMap, mapType);
 
   (document.querySelector("#direction") as HTMLDivElement)!.style.display = openCompass
@@ -257,8 +271,9 @@ const changeBack = (
         setting.value!.mapOpen = initopenMap;
         setting.value!.mapType = initmapType;
         setting.value!.scale = initScale;
+        setting.value!.rotate = initRotate;
 
-        setBackdrop(initBack, initType, initScale);
+        setBackdrop(initBack, initType, { scale: initScale, rotate: initRotate });
         setMap(initopenMap, initmapType);
         (document.querySelector(
           "#direction"
@@ -285,7 +300,7 @@ const delBack = (() => {
         setting!.value.openCompass,
         setting!.value.mapOpen,
         setting!.value.mapType,
-        setting!.value.scale
+        { scale: setting!.value.scale!, rotate: setting!.value.rotate! }
       );
     }