Jelajahi Sumber

修改bug 去除激光页面的跳转obj

bill 1 tahun lalu
induk
melakukan
cd09c146d3

+ 3 - 1
src/app/criminal/view/example/index.vue

@@ -15,7 +15,9 @@
     <div class="body-head">
       <h3 style="visibility: hidden">案件列表</h3>
       <div class="table-ctrl-right">
-        <el-button type="primary" @click="addHandler"> 新增案件 </el-button>
+        <el-button type="primary" @click="addHandler" v-pdpath="['add']">
+          新增案件
+        </el-button>
       </div>
     </div>
 

+ 6 - 0
src/view/case/addCaseFile.vue

@@ -92,3 +92,9 @@ defineExpose<QuiskExpose>({
   },
 });
 </script>
+
+<style scoped>
+.upload-demo {
+  overflow: hidden;
+}
+</style>

+ 7 - 0
src/view/case/draw/selectFuseImage.vue

@@ -53,6 +53,7 @@ import {
   getQuery,
   FuseImageType,
   fuseImageJoinHot,
+  fuseIframeHandler,
 } from "@/view/case/help";
 import { computed, nextTick, onMounted, ref, watchEffect } from "vue";
 import { QuiskExpose } from "@/helper/mount";
@@ -79,6 +80,12 @@ const iframeRef = ref<HTMLIFrameElement>();
 const imageBlob = ref<Blob | null>(null);
 const coverUrl = computed(() => imageBlob.value && URL.createObjectURL(imageBlob.value));
 
+watchEffect((onClanup) => {
+  if (iframeRef.value) {
+    onClanup(fuseIframeHandler(iframeRef.value));
+  }
+});
+
 const refreshBlob = async () => {
   if (!iframeRef.value) {
     return;

+ 76 - 33
src/view/case/help.ts

@@ -10,6 +10,7 @@ import { CaseTagging } from "@/store/caseTagging";
 import { ModelScene, QuoteScene, Scene, SceneType } from "@/store/scene";
 import { transformSWToken, user } from "@/store/user";
 import { base64ToBlob, drawImage } from "@/util";
+import { ref, watchEffect } from "vue";
 
 export type MenuItem = {
   key: string;
@@ -104,59 +105,101 @@ export enum FuseImageType {
   LASER,
 }
 
-// 获取fuse场景截图
-export type FuseImageRet = { type: FuseImageType; blob: Blob | null };
-export const getFuseImage = async (
-  iframe: HTMLIFrameElement,
-  width: number = 500,
-  height: number = width
-) => {
+export const getSceneIframe = (iframe: HTMLIFrameElement) => {
   const iframeElement = iframe.contentWindow?.document.documentElement;
-
   if (!iframeElement) {
     return null;
   }
   const extIframe = iframeElement.querySelector(
     ".external"
   ) as HTMLIFrameElement;
-  const targetIframe = extIframe || iframe;
+  return extIframe || iframe;
+};
+
+export const getIframeSceneType = async (iframe: HTMLIFrameElement) => {
+  const targetIframe = getSceneIframe(iframe);
+  if (!targetIframe) {
+    return null;
+  }
   const targetWindow: any = targetIframe.contentWindow;
   const fuseCnavas = targetWindow.document.querySelector(
     ".scene-canvas > canvas"
   ) as HTMLElement;
 
   if (fuseCnavas) {
-    const dataURL = await targetWindow.sdk.screenshot(
-      targetIframe.offsetWidth,
-      targetIframe.offsetHeight
-    );
-    const res = await fetch(dataURL);
-    const blob = await res.blob();
-    return { type: FuseImageType.FUSE, blob };
+    return { type: FuseImageType.FUSE, sdk: targetWindow.sdk };
   }
   const isLaser = targetWindow.document.querySelector(".laser-layer");
+  return {
+    type: isLaser ? FuseImageType.LASER : FuseImageType.KANKAN,
+    sdk: await targetWindow.__sdk,
+  };
+};
 
-  if (isLaser) {
-    const sdk = await targetWindow.__sdk;
-    return new Promise<FuseImageRet>((resolve) => {
-      sdk.scene.screenshot(width, height).done((data: string) => {
-        resolve({ type: FuseImageType.FUSE, blob: base64ToBlob(data) });
-      });
-    });
-  } else {
-    const sdk = targetWindow.__sdk;
-    return new Promise<FuseImageRet>((resolve) => {
-      sdk.Camera.screenshot(
+// 处理融合iframe页面
+export const fuseIframeHandler = (iframe: HTMLIFrameElement) => {
+  const currentType = ref<FuseImageType>();
+  const interval = setInterval(async () => {
+    const typeMap = await getIframeSceneType(iframe);
+    currentType.value = typeMap?.type;
+  }, 100);
+
+  const stopWatch = watchEffect((onCleanup) => {
+    if (currentType.value === FuseImageType.LASER) {
+      const $iframe = getSceneIframe(iframe)!;
+      const target = $iframe.contentWindow!.document.head;
+      const $style = document.createElement("style");
+      $style.type = "text/css";
+      var textNode = document.createTextNode(`
+        .mode-tab > .model-mode-tab.strengthen {
+          display: none
+        }
+      `);
+      $style.appendChild(textNode);
+      target.appendChild($style);
+    }
+  });
+
+  return () => {
+    clearInterval(interval);
+    stopWatch();
+  };
+};
+
+// 获取fuse场景截图
+export type FuseImageRet = { type: FuseImageType; blob: Blob | null };
+export const getFuseImage = async (
+  iframe: HTMLIFrameElement,
+  width: number = 500,
+  height: number = width
+) => {
+  const typeMap = await getIframeSceneType(iframe);
+  let blob: Blob | null = null;
+
+  switch (typeMap?.type) {
+    case FuseImageType.FUSE:
+      const dataURL = await typeMap.sdk.screenshot(width, height);
+      const res = await fetch(dataURL);
+      blob = await res.blob();
+      break;
+    case FuseImageType.KANKAN:
+      const result = await typeMap.sdk.Camera.screenshot(
         [{ width: width, height: width, name: "2k" }],
         false
-      ).then((result: any) => {
-        resolve({
-          type: FuseImageType.KANKAN,
-          blob: base64ToBlob(result[0].data),
-        });
+      );
+      blob = base64ToBlob(result[0].data);
+      break;
+    case FuseImageType.LASER:
+      blob = await new Promise<Blob | null>((resolve) => {
+        typeMap.sdk.scene
+          .screenshot(width, height)
+          .done((data: { dataUrl: string }) =>
+            resolve(base64ToBlob(data.dataUrl))
+          );
       });
-    });
+      break;
   }
+  return { type: typeMap?.type, blob };
 };
 
 // 处理fuse融合一起的图,将热点加入图片内

+ 4 - 2
src/view/vrmodel/modelContent.vue

@@ -8,7 +8,7 @@
       :show-file-list="false"
       :http-request="() => {}"
       :file-list="fileList"
-      :class="{ disabled: percentage }"
+      :disabled="percentage || !operateIsPermissionByPath('sync')"
       :before-upload="uploadCheck"
     >
       <el-button v-pdpath="'sync'" type="primary">
@@ -31,9 +31,10 @@
     <el-table-column label="标题" prop="modelTitle"></el-table-column>
     <el-table-column label="原始数据格式" prop="modelDateType"></el-table-column>
     <el-table-column label="大小" prop="modelSize"></el-table-column>
-    <el-table-column label="状态" v-slot:default="{ row }: { row: ModelScene }">
+    <el-table-column label="上传时间" v-slot:default="{ row }: { row: ModelScene }">
       {{ getStatusText(row) }}
     </el-table-column>
+    <el-table-column label="所属架构" prop="deptName"></el-table-column>
     <el-table-column label="操作" v-slot:default="{ row }">
       <span
         class="oper-span"
@@ -84,6 +85,7 @@ import { useUpload } from "@/hook/upload";
 import { ScenePagging } from "./pagging";
 import { watchPolling } from "@/hook/watchPolling";
 import { OpenType, openSceneUrl } from "../case/help";
+import { operateIsPermissionByPath } from "@/directive/permission";
 
 const props = defineProps<{ pagging: ScenePagging }>();
 

+ 1 - 1
vite.config.ts

@@ -3,7 +3,7 @@ import vue from "@vitejs/plugin-vue";
 import { resolve } from "path";
 import ElementPlus from "unplugin-element-plus/vite";
 
-let app = "criminal";
+let app = "fire";
 if (process.argv.length > 3) {
   app = process.argv[process.argv.length - 1].trim();
 }