Forráskód Böngészése

Merge branch 'dev' of http://192.168.0.115:3000/bill/fuse-code into dev

xzw 1 éve
szülő
commit
d318f0b8d5

+ 1 - 1
src/api/fuse-model.ts

@@ -57,7 +57,7 @@ const serviceToLocal = (serviceModel: ServiceFuseModel, test = false): FuseModel
   position: serviceModel.transform.position,
   rotation: serviceModel.transform.rotation,
   id: serviceModel.fusionNumId.toString(),
-  url: serviceModel.sceneData ? (serviceModel.sceneData.type === SceneType.SWSS ? serviceModel.sceneData.num : serviceModel.sceneData.modelGlbUrl) : '',
+  url: serviceModel.sceneData ? ([SceneType.SWSS, SceneType.SWYDSS].includes(serviceModel.sceneData.type) ? serviceModel.sceneData.num : serviceModel.sceneData.modelGlbUrl) : '',
   title: serviceModel.sceneData ? (serviceModel.sceneData?.name || serviceModel.sceneData.sceneName || serviceModel.sceneData.modelTitle) : '-',
   modelId: serviceModel.sceneData?.modelId,
   fusionId: serviceModel.fusionId,

+ 6 - 2
src/api/scene.ts

@@ -8,7 +8,9 @@ export enum SceneType {
   SWKJ = 1,
   SWSS = 2,
   SWMX = 3,
-  SWSSMX = 4
+  SWSSMX = 4,
+  SWYDSS = 5,
+  SWYDMX = 6,
 }
 
 export enum SceneStatus {
@@ -25,7 +27,9 @@ export const SceneTypeDesc: Record<SceneType, string>  = {
   [SceneType.SWKJ]: '双目转台',
   [SceneType.SWSS]: '激光转台点云场景',
   [SceneType.SWMX]: '三维模型',
-  [SceneType.SWSSMX]: '激光转台Mesh场景'
+  [SceneType.SWSSMX]: '激光转台Mesh场景',
+  [SceneType.SWYDSS]: '激光移动点云场景',
+  [SceneType.SWYDMX]: '激光移动Mesh场景'
 }
 
 export interface Scene {

+ 1 - 0
src/components/list/index.vue

@@ -59,6 +59,7 @@ defineEmits<{ (e: 'changeSelect', item: Item): void }>()
     .atom-content {
       padding: 20px 0;
       border-bottom: 1px solid rgba(255,255,255,0.16);
+      
     }
   }
 }

+ 4 - 4
src/env/index.ts

@@ -46,21 +46,21 @@ params.share = Boolean(Number(params.share))
 params.single = Boolean(Number(params.single))
 export enum appType {
   fire = "1",
-  jmfire = "3",
+  xmfire = "3",
   criminal = "2"
 }
 export const appStyleImport = {
   [appType.fire]: () => import('../assets/style/fire.less'),
-  [appType.jmfire]: () => import('../assets/style/fire.less'),
+  [appType.xmfire]: () => import('../assets/style/fire.less'),
   [appType.criminal]: () => import('../assets/style/criminal.less'),
 }
 export const appBackRoot = {
   [appType.fire]: "/fire",
-  [appType.jmfire]: "/jmfire",
+  [appType.xmfire]: "/xmfire",
   [appType.criminal]: "/criminal"
 }
 export const routeIncludeFire = (type: appType) => 
-  [appType.fire, appType.jmfire].includes(type)
+  [appType.fire, appType.xmfire].includes(type)
 
 export type Params = { 
   caseId: number,

+ 1 - 1
src/layout/edit/fuse-edit.vue

@@ -69,7 +69,7 @@ router.beforeEach(async (to, from, next) => {
 })
 watch(router.currentRoute, (_n, _, onClean) => {
   const meta = currentMeta.value
-  if (meta && 'full' in meta && meta.full) {
+  if (meta && 'full' in meta && (meta as any).full) {
     enterEdit(() => {
       if (!history.state.back) {
         router.replace({ name: RoutesName.merge })

+ 2 - 2
src/layout/pwd.vue

@@ -1,10 +1,10 @@
 <template>
-  <Modal width="400px" title="访问密码" :visible="visible" centered class="model-table" :closable="false">
+  <Modal width="400px" title="访问密码" :visible="visible" centered  class="model-table" :closable="false">
     <template #footer>
       <Button key="submit" type="primary" @click="okHandler">确定</Button>
     </template>
     <FormItem label="访问密码" name="password">
-      <InputPassword v-model:value="password" />
+      <InputPassword v-model:value="password" placeholder="请输入" />
     </FormItem>
   </Modal>
 </template>

+ 3 - 2
src/layout/scene-list/index.vue

@@ -90,8 +90,9 @@ const stopWatch = watch(list, () => {
   p {
     height: 1.5em;
     overflow: hidden;
-    word-break: break-all;
-    text-overflow: ellipsis
+    text-overflow: ellipsis;
+    word-break: keep-all;
+    line-height: 1.5em;
   }
 }
 

+ 0 - 1
src/main.ts

@@ -15,7 +15,6 @@ app.use(router)
 app.mount('#app')
 
 appStyleImport[params.app]()
-
 watchEffect((onCleanup) => {
   if ([RoutesName.show, RoutesName.signModel].includes(currentLayout.value!)) {
 

+ 20 - 7
src/model/app.vue

@@ -44,6 +44,7 @@ export const Model = defineComponent({
             } catch(e) {
               console.error(e)
             }
+            url.value = ""
             setTimeout(() => url.value = newURL, 300)
           } else {
             url.value = newURL
@@ -62,7 +63,9 @@ export const Model = defineComponent({
         [SceneType.SWKJ]: `/swkk/spg.html?m=${scene.value.num}`,
         [SceneType.SWSS]: `/swss/index.html?m=${scene.value.num}`,
         [SceneType.SWSSMX]: `/swkk/spg.html?m=${scene.value.num}`,
-        [SceneType.SWMX]: `index.html?caseId=${params.caseId}&app=${params.app}&modelId=${scene.value.num}&share=1#sign-model`
+        [SceneType.SWMX]: `index.html?caseId=${params.caseId}&app=${params.app}&modelId=${scene.value.num}&share=1#sign-model`,
+        [SceneType.SWYDSS]: `/swss/index.html?m=${scene.value.num}`,
+        [SceneType.SWYDMX]: `/swkk/spg.html?m=${scene.value.num}`,
       }
       setUrl(urls[type])
     })
@@ -97,16 +100,26 @@ export const Model = defineComponent({
 
     // 处理iframe 定制页面
     watch(
-      () => scene.value && scene.value.type, 
-      (type, oldType, onCleanup) => {
+      () => [scene.value && scene.value.type, url.value], 
+      ([type], oldType, onCleanup) => {
         if (type === false) {
           // 手动渲染融合场景
-          (window as any).viewer.setDisplay(true)
+          console.log("手动渲染!");
+          setTimeout(() => {
+            (window as any).viewer.setDisplay(true)
+          }, 100)
         };
 
         const interval = setInterval(async () => {
-          const target = iframeRef.value?.contentWindow?.document?.head
-          if (!target) return;
+          let doc: Document | undefined
+          try {
+            doc = iframeRef.value?.contentWindow?.document!
+          } catch {
+            clearInterval(interval);
+          }
+          if (!doc || !doc.querySelector("div")) return;
+          console.error(doc, doc.head)
+          const target = doc.head
           clearInterval(interval);
           ;(window as any).iframeCreated && (window as any).iframeCreated(iframeRef.value);
           if (type === SceneType.SWSS) {
@@ -123,7 +136,7 @@ export const Model = defineComponent({
         }, 16);
         onCleanup(() => clearInterval(interval));
       }, 
-      {flush: 'post'}
+      {flush: 'post', immediate: true}
     )
 
     return {

+ 6 - 1
src/model/index.ts

@@ -56,7 +56,12 @@ const _loadModel = (() => {
 
 
 let isInitial = false
-export const loadModel = (modelType: ModelType): Promise<ModelExpose> => {
+export const loadModel = async (modelType: ModelType): Promise<ModelExpose> => {
+  // 给 vue 加载时间,防止一进入就直接加载模型导致 vue 尚未初始化
+  if (!isInitial) {
+    await new Promise((resolve) => setTimeout(resolve, 10));
+  }
+
   const modelPromise = _loadModel(modelType)
   if (!isInitial) {
     if (!appEl.value) {

+ 3 - 2
src/model/platform.ts

@@ -147,7 +147,8 @@ export async function exposeFactory(type: ModelType, win?: any): Promise<ModelEx
       }
     }
   }
-  platforms[SceneType.SWSSMX] = platforms[SceneType.SWKJ] = platforms[SceneType.SWKK]
+  platforms[SceneType.SWYDSS] = platforms[SceneType.SWSS]
+  platforms[SceneType.SWYDMX] = platforms[SceneType.SWSSMX] = platforms[SceneType.SWKJ] = platforms[SceneType.SWKK]
   platforms[SceneType.SWMX] = {
     getSDK: async () => findObjectAttr(win , '__sdk'),
     expose: platforms[fuseModel].expose
@@ -158,7 +159,7 @@ export async function exposeFactory(type: ModelType, win?: any): Promise<ModelEx
   }
 
   const sdk: any = await Promise.race([
-    asyncTimeout(10000)
+    asyncTimeout(100000)
       .then(() => Promise.reject(new Error('加载超时'))),
     platforms[sceneType].getSDK()
   ])

+ 80 - 89
src/router/constant.ts

@@ -1,133 +1,124 @@
 export enum RoutesName {
   // 编辑融合页面
-  fuseEdit = 'fuseEdit',
-  
+  fuseEdit = "fuseEdit",
+
   // 独立,配准、设置比例
-  registration = 'registration',
-  proportion = 'proportion',
+  registration = "registration",
+  proportion = "proportion",
 
   // 菜单,独立编辑融合页面
-  fuseEditSwitch = 'fuseEditSwitch',
-  merge = 'merge',
-  tagging = 'tagging',
-  taggingPosition = 'taggingPosition',
-  guide = 'guide',
-  measure = 'measure',
-  setting = 'setting',
-  
-  // 编辑场景,提取视图,录制视频
-  sceneEdit = 'sceneEdit',
-  record = 'record',
-  view = 'view',
-
+  fuseEditSwitch = "fuseEditSwitch",
+  merge = "merge",
+  tagging = "tagging",
+  taggingPosition = "taggingPosition",
+  guide = "guide",
+  measure = "measure",
+  setting = "setting",
 
+  // 编辑场景,提取视图,录制视频
+  sceneEdit = "sceneEdit",
+  record = "record",
+  view = "view",
 
   // 展示界面,包括融合和独立场景
-  show = 'show',
+  show = "show",
   // 汇总
-  summaryShow = 'summaryShow',
-  recordShow = 'recordShow',
-  viewShow = 'viewShow',
-  folderShow = 'folderShow',
+  summaryShow = "summaryShow",
+  recordShow = "recordShow",
+  viewShow = "viewShow",
+  folderShow = "folderShow",
   // 火调信息详情页
-  fireInfo = 'fireInfo',
-
+  fireInfo = "fireInfo",
 
   // 单模型展示
-  signModel = 'signModel',
-  error = "error"
+  signModel = "signModel",
+  error = "error",
 }
 
-
 export const paths = {
-  [RoutesName.error]: '/error',
-  [RoutesName.fuseEdit]: '/fuseEdit',
+  [RoutesName.error]: "/error",
+  [RoutesName.fuseEdit]: "/fuseEdit",
 
-  [RoutesName.fuseEditSwitch]: '',
-  [RoutesName.merge]: 'merge',
-  [RoutesName.registration]: 'registration/:id',
-  [RoutesName.proportion]: 'proportion/:id',
+  [RoutesName.fuseEditSwitch]: "",
+  [RoutesName.merge]: "merge",
+  [RoutesName.registration]: "registration/:id",
+  [RoutesName.proportion]: "proportion/:id",
 
-  [RoutesName.tagging]: 'tagging',
-  [RoutesName.taggingPosition]: 'taggingPosition/:id',
-  [RoutesName.guide]: 'path',
-  [RoutesName.measure]: 'measure',
-  [RoutesName.setting]: 'setting',
-  
-  [RoutesName.sceneEdit]: '/sceneEdit',
-  [RoutesName.record]: 'record',
-  [RoutesName.view]: 'view',
+  [RoutesName.tagging]: "tagging",
+  [RoutesName.taggingPosition]: "taggingPosition/:id",
+  [RoutesName.guide]: "path",
+  [RoutesName.measure]: "measure",
+  [RoutesName.setting]: "setting",
 
-  [RoutesName.show]: '/show',
-  [RoutesName.fireInfo]: 'fireInfo',
-  [RoutesName.summaryShow]: 'summary',
-  [RoutesName.recordShow]: 'record',
-  [RoutesName.viewShow]: 'view',
-  [RoutesName.folderShow]: 'folder',
-  
-  [RoutesName.signModel]: '/sign-model'
-}
+  [RoutesName.sceneEdit]: "/sceneEdit",
+  [RoutesName.record]: "record",
+  [RoutesName.view]: "view",
+
+  [RoutesName.show]: "/show",
+  [RoutesName.fireInfo]: "fireInfo",
+  [RoutesName.summaryShow]: "summary",
+  [RoutesName.recordShow]: "record",
+  [RoutesName.viewShow]: "view",
+  [RoutesName.folderShow]: "folder",
+
+  [RoutesName.signModel]: "/sign-model",
+};
 
 export const metas = {
   [RoutesName.merge]: {
-    icon: 'joint',
-    title: '拼接',
-    sysTitle: '多元融合'
+    icon: "joint",
+    title: "拼接",
+    sysTitle: "多元融合",
   },
-  [RoutesName.proportion]: { full: true,
-    sysTitle: '多元融合' },
-  [RoutesName.registration]: { full: true,
-    sysTitle: '多元融合' },
+  [RoutesName.proportion]: { full: true, sysTitle: "多元融合" },
+  [RoutesName.registration]: { full: true, sysTitle: "多元融合" },
   [RoutesName.tagging]: {
-    icon: 'label',
-    title: '标注',
-    sysTitle: '多元融合'
+    icon: "label",
+    title: "标注",
+    sysTitle: "多元融合",
   },
   [RoutesName.guide]: {
-    icon: 'path',
-    title: '路径',
-    sysTitle: '多元融合'
+    icon: "path",
+    title: "路径",
+    sysTitle: "多元融合",
   },
   [RoutesName.measure]: {
-    icon: 'nav-measure',
-    title: '测量',
-    sysTitle: '多元融合'
+    icon: "nav-measure",
+    title: "测量",
+    sysTitle: "多元融合",
   },
   [RoutesName.setting]: {
-    icon: 'nav-setup',
-    title: '设置',
-    sysTitle: '多元融合'
+    icon: "nav-setup",
+    title: "设置",
+    sysTitle: "多元融合",
   },
 
-  [RoutesName.view]: { sysTitle: '视图提取' },
-  [RoutesName.record]: { sysTitle: '屏幕录制' },
-  [RoutesName.show]: { sysTitle: '' },
-
+  [RoutesName.view]: { sysTitle: "视图提取" },
+  [RoutesName.record]: { sysTitle: "屏幕录制" },
+  [RoutesName.show]: { sysTitle: "" },
 
   [RoutesName.summaryShow]: {
-    icon: 'list-view',
-    title: '汇总'
+    icon: "list-view",
+    title: "汇总",
   },
   [RoutesName.viewShow]: {
-    icon: 'list-scene',
-    title: '视图',
-    
+    icon: "list-scene",
+    title: "视图",
   },
   [RoutesName.fireInfo]: {
-    icon: 'list-detail',
-    title: '案件信息',
-    
+    icon: "list-detail",
+    title: "案件信息",
   },
   [RoutesName.recordShow]: {
-    icon: 'list-record',
-    title: '录屏'
+    icon: "list-record",
+    title: "录屏",
   },
   [RoutesName.folderShow]: {
-    icon: 'list-file',
-    title: '卷宗'
+    icon: "list-file",
+    title: "卷宗",
   },
   [RoutesName.error]: {
-    title: '错误页面'
+    title: "错误页面",
   },
-}
-export const ViewHome = RoutesName.merge
+};
+export const ViewHome = RoutesName.merge;

+ 2 - 3
src/sdk/association.ts

@@ -84,14 +84,13 @@ const associationModels = (sdk: SDK) => {
       const itemRaw = toRaw(item)
       let sceneModel: SceneModel
       try {
-        console.log(item.type === SceneType.SWSS ? 'laser' : item.modelType, item)
         sceneModel = sdk.addModel({
           ...itemRaw,
           ...modelRange,
           mode: RoutesName.signModel === currentLayout.value! ? 'single' : 'many',
           isDynamicAdded: dynamicAddedModelIds.value.some(id => itemRaw.id === id),
-          type: item.type === SceneType.SWSS ? 'laser' : item.modelType,
-          url: item.type === SceneType.SWSS ? item.url : item.url && getResource(item.url)
+          type: [SceneType.SWSS, SceneType.SWYDSS].includes(item.type) ? 'laser' : item.modelType,
+          url: [SceneType.SWSS, SceneType.SWYDSS].includes(item.type) ? item.url : item.url && getResource(item.url)
         })
       } catch(e) {
         console.error('模型加载失败', e)

+ 1 - 1
src/views/guide/sign.vue

@@ -59,7 +59,7 @@ const actions = {
       // autoDownload: false,
       // systemAudio: true,
       // debug: true,
-      resolution: '1080p',
+      resolution: '4k',
       autoDownload: false,
       platform: 'canvas',
       

BIN
src/views/setting/images/lantianbaiyun.png


BIN
src/views/setting/images/pic_bw@2x.png


BIN
src/views/setting/images/pic_cd@2x.png


BIN
src/views/setting/images/pic_dl@2x.png


BIN
src/views/setting/images/pic_hmm@2x.png


BIN
src/views/setting/images/pic_hmm_hdr@2x.png


BIN
src/views/setting/images/pic_ltby@2x.png


BIN
src/views/setting/images/pic_ltby_hdr@2x.png


BIN
src/views/setting/images/pic_wymb@2x.png


BIN
src/views/setting/images/pic_xk@2x.png


BIN
src/views/setting/images/pic_xk_hdr@2x.png


BIN
src/views/setting/images/pic_yj@2x.png


BIN
src/views/setting/images/pic_yk@2x.png


BIN
src/views/setting/images/乌云密布.jpg


BIN
src/views/setting/images/傍晚.jpg


BIN
src/views/setting/images/夜空.jpg


BIN
src/views/setting/images/草地.jpg


BIN
src/views/setting/images/蓝天白云.jpg


BIN
src/views/setting/images/道路.jpg


+ 16 - 19
src/views/setting/index.vue

@@ -32,30 +32,27 @@
 
 <script lang="ts" setup>
 import { RightFillPano } from '@/layout'
-import ltby from './images/pic_ltby@2x.png'
-import hmm from './images/pic_hmm@2x.png'
-import xk from './images/pic_xk@2x.png'
-import yk from './images/pic_yj@2x.png'
-import hmm360 from './images/pic_hmm_hdr@2x.png'
-import ltby360 from './images/pic_ltby_hdr@2x.png'
-import yk360 from './images/lantianbaiyun.png'
-import xk360 from './images/pic_xk_hdr@2x.png'
 import { enterEdit, enterOld, setting, isEdit, updataSetting } from '@/store'
-import { reactive, ref } from 'vue'
+import { reactive, ref, watchEffect } from 'vue'
 import { togetherCallback, getFileUrl, loadPack } from '@/utils'
 import { showRightPanoStack, showRightCtrlPanoStack } from '@/env'
 import { sdk } from '@/sdk'
 
-const backs = reactive([
-  { label: '无', type: 'icon', image: 'icon-without', value: 'none' },
-  { label: '蓝天白云', type: 'img', image: ltby, value: ltby360 },
-  { label: '灰蒙蒙', type: 'img', image: hmm, value: hmm360 },
-  { label: '星空', type: 'img', image: xk, value: xk360 },
-  { label: '夜间', type: 'img', image: yk, value: yk360 },
-  { label: '灰色', type: 'color', image: '#333333', value: '#333' },
-  { label: '黑色', type: 'color', image: '#000000', value: '#000' },
-  { label: '白色', type: 'color', image: '#ffffff', value: '#fff' },
-])
+const backs = ref<{ label: string, type: string, image: string, value: string}[]>([])
+watchEffect(async () => {
+  backs.value = [
+      { label: '无', type: 'icon', image: 'icon-without', value: 'none' },
+      { label: '蓝天白云', type: 'img', image: (await import("./images/pic_ltby@2x.png")).default, value: (await import("./images/蓝天白云.jpg")).default },
+      { label: '乌云密布', type: 'img', image: (await import("./images/pic_wymb@2x.png")).default, value: (await import("./images/乌云密布.jpg")).default},
+      { label: '夜空', type: 'img', image: (await import("./images/pic_yk@2x.png")).default, value: (await import("./images/夜空.jpg")).default },
+      { label: '草地', type: 'img', image: (await import("./images/pic_cd@2x.png")).default, value: (await import("./images/草地.jpg")).default },
+      { label: '道路', type: 'img', image: (await import("./images/pic_dl@2x.png")).default, value: (await import("./images/道路.jpg")).default },
+      { label: '傍晚', type: 'img', image: (await import("./images/pic_bw@2x.png")).default, value: (await import("./images/傍晚.jpg")).default },
+      { label: '灰色', type: 'color', image: '#333333', value: '#333' },
+      { label: '黑色', type: 'color', image: '#000000', value: '#000' },
+      { label: '白色', type: 'color', image: '#ffffff', value: '#fff' },
+  ]
+})
 
 const enterSetPic = () => {
   enterEdit(

+ 3 - 1
src/views/sign-model/index.vue

@@ -24,7 +24,9 @@ const loadSignModel = async () => {
       scene = mscene
     }
   } else if ('m' in params) {
-    const scenes = await fetchScenesAll({ numList: [params.m!], type: SceneType.SWSSMX })
+    const SSscenes = await fetchScenesAll({ numList: [params.m!], type: SceneType.SWSSMX })
+    const YDscenes = await fetchScenesAll({ numList: [params.m!], type: SceneType.SWYDMX })
+    const scenes = [...SSscenes, ...YDscenes]
     scene = scenes.find(scene => scene.num === params.m)
     console.log(scene)
   }