tangning пре 1 дан
родитељ
комит
63be31d7df

Разлика између датотеке није приказан због своје велике величине
+ 67894 - 0
public/kankan-sdk-deps.js


Разлика између датотеке није приказан због своје велике величине
+ 100655 - 0
public/kankan-sdk.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
public/kankan-sdk.js.map


+ 8 - 4
public/model.html

@@ -24,8 +24,11 @@
         z-index: 999;
       }
     </style>
-    <script src="/sdk/kankan-sdk-deps.js"></script>
-    <script src="/sdk/kankan-sdk.js"></script>
+    <!-- <script src="/sdk/kankan-sdk-deps.js"></script>
+    <script src="/sdk/kankan-sdk.js"></script> -->
+    <script src="./kankan-sdk-deps.js?v=4.12.1-alpha.18-1774943964518"></script>
+    <script src="./kankan-sdk.js?v=4.12.1-alpha.18-1774943964518"></script>
+
   </head>
   <body>
     <div class="scene"></div>
@@ -38,8 +41,9 @@
       window.__sdk = new KanKan({
         dom: ".scene",
         num: "SG-hx-7R336wSsXwL",
-        server: "/",
-        resource: "/oss/",
+        server: "./",
+        resource: "./oss/",
+        isRouteSnap : true 
       });
       __sdk.render();
     </script>

+ 5 - 0
src/view/material/quisk.ts

@@ -2,6 +2,7 @@ import AddCaseFile from "./addCaseFile.vue";
 import exportPhotos from "./exportPhotos.vue";
 import AddLibrary from "./addLibrary.vue";
 import AddScenes from "./addScenes.vue";
+import tableModel from "./tableScene/tableModel.vue";
 import rollMakingList from "./rollMakingList.vue";
 import AddScenesImg from "./AddScenesImg.vue";
 import setType from "./setType.vue";
@@ -36,6 +37,10 @@ export const addrollMaking = quiskMountFactory(rollMakingList, {
   width: 1000,
 });
 
+export const tableModelScene = quiskMountFactory(tableModel, {
+  title: "实景三维",
+  width: 800,
+});
 
 export const addLibraryFile = quiskMountFactory(AddLibrary, {
   title: "上传文件",

+ 80 - 61
src/view/material/sceneImg.vue

@@ -234,11 +234,8 @@
                   :icon="Download"
                   >下载</el-button
                 >
-                <el-button
-                  class="newbut"
-                  style="display: none;"
-                  :icon="Edit"
-                  @click="handleAIdrawCasePhotos"
+                <!-- style="display: none;" -->
+                <el-button class="newbut" :icon="Edit" @click="openAIdrawCase"
                   >AI制卷</el-button
                 >
               </div>
@@ -253,7 +250,10 @@
                   <div class="text">
                     {{ items.name }}
                   </div>
-                  <div class="operation" v-if="!show && childrenList.value == items.id">
+                  <div
+                    class="operation"
+                    v-if="!show && childrenList.value == items.id"
+                  >
                     <el-icon title="下载" @click="exportToPDF(false, items)"
                       ><Download
                     /></el-icon>
@@ -520,7 +520,7 @@
 <script setup lang="ts">
 import viewImg from "@/components/viewImg/list.vue";
 import { computed, ref, reactive } from "vue";
-import { addCaseScenes, exportCasePhotos } from "./quisk";
+import { addCaseScenes, exportCasePhotos, tableModelScene } from "./quisk";
 import showpages from "./showpages.vue";
 import {
   updateByTreeFileLists,
@@ -732,17 +732,21 @@ function getList(refresh = false) {
   getCasePhotoRollList(caseId.value).then((res) => {
     casePhotoList.value = res || [];
     let count = 0;
-    casePhotoList.value = res.map(ele => {
+    casePhotoList.value = res.map((ele) => {
       let content = ele.content && JSON.parse(ele.content);
-      let number = content.pages?.length
+      let number = content.pages?.length;
       count = count + number;
       return {
         ...ele,
         pageCount: count - number,
-      }
-    })
-    if (active1.value == "照片卷" && casePhotoList.value && casePhotoList.value.length) {
-      let item =  res.find((ele) => ele.id == casePhotoItem.value.id) || res[0];
+      };
+    });
+    if (
+      active1.value == "照片卷" &&
+      casePhotoList.value &&
+      casePhotoList.value.length
+    ) {
+      let item = res.find((ele) => ele.id == casePhotoItem.value.id) || res[0];
       handlItem2(item);
     }
   });
@@ -1147,22 +1151,37 @@ async function handledrawCasePhotos(val) {
 }
 function frameLoad(sdk) {
   // 这里可以获取到mesh方法
-      console.log("返回数据",sdk)
-  sdk.Scene.whenLoaded(()=>{
-      console.log("返回数据",sdk.Camera.getPose())
-  })
-  
+  const player = sdk.core.get("Player");
+  sdk.Scene.on("loaded", () => {
+    // if (isTest) {
+      player.model.panos.list.forEach((pano) => pano.addLabel2());
+    // } else {
+    //   sdk.core.get("SceneRenderer").suspend();
+    // }
+  });
+  console.log("--------frameLoad!---------");
+  const list = sdk.Camera.routeSnapGenerate();
+  console.log("返回数据", list);
+  // sdk.Scene.whenLoaded(()=>{
+  //     console.log("返回数据",sdk.Camera.getPose())
+  // })
+}
+async function openAIdrawCase() {
+  const { num } = await tableModelScene({ numList: [] });
+  selectNum = num;
+  handleAIdrawCasePhotos(num);
+  console.log("返回数据", num);
 }
-function handleAIdrawCasePhotos() {
+function handleAIdrawCasePhotos(num) {
   const iframe = document.getElementById("iframe-outside");
-  console.log(iframe, 'iframe');
+  console.log(iframe, "iframe");
   if (iframe && iframe.classList.contains("show") == false) {
-      iframe.classList.add("show");
-      iframe.onload = () => {
-      console.log(iframe.contentWindow, 'contentWindow');
-        frameLoad(iframe.contentWindow.__sdk);
-      };
-      iframe.src = "http://192.168.0.125:1804/mix3d/model.html?m=SG-hx-ICEhhEnyQp2";
+    iframe.classList.add("show");
+    iframe.onload = () => {
+      console.log(iframe.contentWindow, "contentWindow");
+      frameLoad(iframe.contentWindow.__sdk);
+    };
+    iframe.src = "./model.html?m=" + num;
   }
 }
 const handleView = (src) => {
@@ -1236,9 +1255,9 @@ const exportToPDF = async (isAll, item) => {
 const handleOpen = (val) => {
   // 关闭时重置到照片卷标签页
   if (!val) {
-    setTimeout(()=>{
+    setTimeout(() => {
       handleClick({ paneName: "照片卷" });
-    }, 500)
+    }, 500);
   } else {
     console.log("handleOpen");
     // 初始化汇总数据结构
@@ -1490,39 +1509,39 @@ const handleOpen = (val) => {
   }
 }
 
-      #iframe-hiddens,
-      #iframe-outside {
-        display: none;
-        position: absolute;
-        z-index: -999;
-        width: 600px;
-        height: 500px;
-        pointer-events: none;
-      }
-      #iframe-hiddens.show {
-        display: block;
-        visibility: hidden;
-        right: 0;
-        bottom: 0;
-      }
-      #iframe-hiddens.visible {
-        pointer-events: all;
-        display: block;
-        visibility: visible;
-        z-index: 999;
-      }
-      #iframe-outside.show {
-        display: block;
-        left: -9999px;
-      }
-      #iframe-outside.visible {
-        pointer-events: all;
-        display: block;
-        left: auto;
-        right: 0;
-        bottom: 0;
-        z-index: 999;
-      }
+#iframe-hiddens,
+#iframe-outside {
+  display: none;
+  position: absolute;
+  z-index: -999;
+  width: 600px;
+  height: 500px;
+  pointer-events: none;
+}
+#iframe-hiddens.show {
+  display: block;
+  visibility: hidden;
+  right: 0;
+  bottom: 0;
+}
+#iframe-hiddens.visible {
+  pointer-events: all;
+  display: block;
+  visibility: visible;
+  z-index: 999;
+}
+#iframe-outside.show {
+  display: block;
+  left: -9999px;
+}
+#iframe-outside.visible {
+  pointer-events: all;
+  display: block;
+  left: auto;
+  right: 0;
+  bottom: 0;
+  z-index: 999;
+}
 </style>
 
 

+ 43 - 0
src/view/material/tableScene/list.vue

@@ -0,0 +1,43 @@
+<template>
+  <com-head :options="headOptions" v-model="params.pagging.state.query.isObj">
+    <el-form label-width="84px" inline>
+      <slot name="header" />
+      <el-form-item class="searh-btns" style="grid-area: 1 / 6 / 2 / 4">
+        <el-button style="visibility: hidden;" type="primary" @click="params.pagging.refresh">查询</el-button>
+        <el-button class="float-right" type="primary" plain @click="params.pagging.queryReset"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </com-head>
+
+  <div class="body-layer">
+    <slot name="content" />
+    <com-pagination
+      @size-change="params.pagging.changPageSize"
+      @current-change="params.pagging.changPageCurrent"
+      :current-page="params.pagging.state.pag.currentPage"
+      :page-size="params.pagging.state.pag.size"
+      :total="params.pagging.state.pag.total"
+    />
+  </div>
+</template>
+
+<script setup lang="ts">
+import comHead from "@/components/head/index.vue";
+import comPagination from "@/components/pagination/index.vue";
+import { SceneType } from "@/store/scene";
+import { SceneTypeDesc } from "@/constant/scene";
+import { useScenePaggingParams } from "./pagging";
+const props = defineProps<{ params: ReturnType<typeof useScenePaggingParams>, upload: boolean }>();
+
+const headOptions = [
+  // { value: SceneType.SWKK, name: SceneTypeDesc[SceneType.SWKK] },
+  // { value: SceneType.SWKJ, name: SceneTypeDesc[SceneType.SWKJ] },
+  // { value: SceneType.SWSS, name: SceneTypeDesc[SceneType.SWSS] },
+  // { value: SceneType.SWSSMX, name: SceneTypeDesc[SceneType.SWSSMX] },
+  // { value: SceneType.SWYDSS, name: SceneTypeDesc[SceneType.SWYDSS] },
+  // { value: SceneType.SWYDMX, name: SceneTypeDesc[SceneType.SWYDMX] },
+  // { value: SceneType.SWMX, name: SceneTypeDesc[SceneType.SWMX] },
+];
+</script>

+ 144 - 0
src/view/material/tableScene/modelContent.vue

@@ -0,0 +1,144 @@
+<template>
+  <div class="body-head">
+    <el-tooltip
+      class="item"
+      effect="dark"
+      :content="`请上传${format}(支持obj/ply/las/osgb/b3dm格式的数据),大小在${size}以内 `"
+      placement="bottom-start"
+      ><el-upload
+        class="upload-demo"
+        :multiple="false"
+        :limit="1"
+        :accept="accept"
+        :show-file-list="false"
+        :http-request="() => {}"
+        :file-list="fileList"
+        :disabled="percentage || !operateIsPermissionByPath('sync')"
+        :before-upload="uploadCheck"
+      >
+        <el-button v-pdpath="'sync'" type="primary">
+          <el-icon><Upload /></el-icon>{{ percentage ? "文件上传中" : "上传数据" }}
+        </el-button>
+      </el-upload>
+    </el-tooltip>
+  </div>
+
+  <el-table
+    :data="pagging.state.table.rows"
+    tooltip-effect="dark"
+    style="width: 100%"
+    size="large"
+  >
+    <el-table-column label="序号" width="70" v-slot:default="{ $index }">
+      <div style="text-align: center">
+        {{ pagging.state.pag.size * (pagging.state.pag.currentPage - 1) + $index + 1 }}
+      </div>
+    </el-table-column>
+    <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 }">
+      {{ getStatusText(row) }}
+    </el-table-column>
+    <el-table-column label="所属架构" prop="deptName"></el-table-column>
+  </el-table>
+
+  <el-dialog
+    :model-value="!!percentage"
+    :show-close="false"
+    title="文件上传中"
+    :close-on-click-modal="false"
+  >
+    <el-progress :percentage="percentage" />
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import {
+  ModelSceneStatus,
+  ModelScene,
+  cancelUploadModelScene,
+  uploadModelScene,
+  delModelScene,
+  getModelSceneStatus,
+} from "@/store/scene";
+import {
+  ModelMaxSize,
+  ModelSceneStatusDesc,
+  ModelSupportFormats,
+  SceneTypePaths,
+} from "@/constant/scene";
+import { confirm } from "@/helper/message";
+import { useUpload } from "@/hook/upload";
+import { ScenePagging } from "./pagging";
+import { watchPolling } from "@/hook/watchPolling";
+import { operateIsPermissionByPath } from "@/directive/permission";
+
+const props = defineProps<{ pagging: ScenePagging }>();
+
+const getStatusText = (scene: ModelScene) => {
+  let desc = ModelSceneStatusDesc[scene.createStatus];
+  if (scene.createStatus === ModelSceneStatus.RUN && scene.progress) {
+    desc += ` ${scene.progress}% `;
+  } else if (scene.createStatus === ModelSceneStatus.SUCCESS) {
+    desc = scene.createTime;
+  }
+  return desc;
+};
+
+const delOrCancel = async (scene: ModelScene) => {
+  const isDel = scene.createStatus !== ModelSceneStatus.RUN;
+  const msg = isDel ? "确定要删除此数据?" : "确定要取消上传吗?";
+
+  if (await confirm(msg)) {
+    isDel ? await delModelScene(scene) : await cancelUploadModelScene(scene);
+    props.pagging.refresh();
+  }
+};
+
+const editHanlder = async (scene: ModelScene) => {
+  if (await editModelScene({ model: scene })) {
+    props.pagging.refresh();
+  }
+};
+
+const {
+  percentage,
+  upload: uploadCheck,
+  fileList,
+  size,
+  format,
+  removeFile,
+  accept,
+} = useUpload({
+  maxSize: ModelMaxSize,
+  formats: ModelSupportFormats,
+  upload: async (file, onPercentage) => {
+    try {
+      await uploadModelScene(file, onPercentage);
+      props.pagging.refresh();
+    } catch {}
+    removeFile();
+  },
+});
+
+// 处理后台正在处理的模型类
+const refreshStatus = (models: ModelScene[]) => {
+  const refreshStatusAll = models.map(async (scene) => {
+    const { status, progress } = await getModelSceneStatus(scene);
+    scene.createStatus = status;
+    scene.progress = progress;
+    if (status == ModelSceneStatus.SUCCESS) {
+      props.pagging.refresh();
+    }
+  });
+  return Promise.all(refreshStatusAll);
+};
+
+watchPolling(() => {
+  const payload = (props.pagging.state.table.rows as ModelScene[]).filter(
+    (item) => item.createStatus === ModelSceneStatus.RUN
+  );
+  return { start: payload.length > 0, payload };
+}, refreshStatus);
+</script>

+ 62 - 0
src/view/material/tableScene/pagging.ts

@@ -0,0 +1,62 @@
+import { usePagging } from "@/hook/pagging";
+import { SceneType, getScenePagging } from "@/store/scene";
+import { computed, reactive, watch, watchEffect } from "vue";
+
+export const useScenePaggingParams = () => {
+  const pagging = usePagging({
+    get: getScenePagging,
+    paramsTemlate: {
+      isObj: 1,
+      sceneType: 0, //SceneType.SWKK,
+      sceneName: "",
+      modelTitle: "",
+      deptId: "",
+      snCode: "",
+    },
+  });
+
+  const isSwmx = computed(() => pagging.state.query.type === SceneType.SWMX);
+  const keyword = computed({
+    get: () =>
+      isSwmx.value
+        ? pagging.state.query.modelTitle
+        : pagging.state.query.sceneName,
+    set: (val: string) => {
+      pagging.state.query.modelTitle = val;
+      pagging.state.query.sceneName = val;
+    },
+  });
+  const sceneType = computed({
+    get: () => pagging.state.query.sceneType,
+    set: (val) => {
+      pagging.state.query.sceneType = val;
+    },
+  });
+
+  let oldSnCode = pagging.state.query.snCode;
+  watchEffect(() => {
+    if (isSwmx.value) {
+      oldSnCode = pagging.state.query.snCode;
+      pagging.state.query.snCode = "";
+    } else {
+      pagging.state.query.snCode = oldSnCode;
+    }
+  });
+
+  watch(
+    () => pagging.state.query.type,
+    () => {
+      pagging.state.pag.currentPage = 1;
+    }
+  );
+
+  const queryResetRaw = pagging.queryReset;
+  pagging.queryReset = () => {
+    const type = pagging.state.query.type;
+    queryResetRaw();
+    pagging.state.query.type = type;
+  };
+
+  return reactive({ pagging, keyword, isSwmx, sceneType });
+};
+export type ScenePagging = ReturnType<typeof useScenePaggingParams>["pagging"];

+ 98 - 0
src/view/material/tableScene/sceneContent.vue

@@ -0,0 +1,98 @@
+<template>
+  <el-table
+    class="mybody-head myhideselecTable"
+    :data="pagging.state.table.rows"
+    ref="tableRef"
+    tooltip-effect="dark"
+    style="width: 100%;height: 250px;"
+    :height="250"
+    size="large"
+    @selection-change="changeSelection"
+    @select="handleSelect"
+  >
+    <!-- -1 计算失败  0 计算中 1 计算成功并可以外网访问,不能编辑 2计算成功只能内网,能编辑 -->
+    <el-table-column type="selection" :selectable="selectable" width="55" />
+    <!-- <el-table-column label="序号" width="70" v-slot:default="{ $index }">
+      <div style="text-align: center">
+        {{ pagging.state.pag.size * (pagging.state.pag.currentPage - 1) + $index + 1 }}
+      </div>
+    </el-table-column> -->
+    <el-table-column width="450" label="场景标题" show-overflow-tooltip prop="sceneName"></el-table-column>
+    <!-- <el-table-column label="案件名称" prop="snCode"></el-table-column> -->
+    <!-- <el-table-column label="浏览数量" prop="viewCount"></el-table-column> -->
+    <el-table-column label="创建时间" prop="createTime" v-slot:default="{ row }">
+      {{ row.createTime.substr(0, 16) }}
+    </el-table-column>
+    <!-- <el-table-column label="状态" v-slot:default="{ row }: { row: QuoteScene }">
+      {{ row.statusString }}
+    </el-table-column> -->
+  </el-table>
+</template>
+
+<script setup lang="ts">
+
+import { getSceneListTree } from "@/store/case";
+import { QuoteSceneStatusDesc } from "@/constant/scene";
+import { confirm } from "@/helper/message";
+import { router } from "@/router";
+import { useScenePaggingParams, ScenePagging } from "./pagging";
+import { QuiskExpose } from "@/helper/mount";
+import { onMounted, ref, watch, watchEffect, computed, nextTick } from "vue";
+// const params = useScenePaggingParams();
+const props = defineProps<{ pagging: ScenePagging, numList: Array<string>, noEditList: Array<string> }>();
+const caseId = computed(() => (router.currentRoute.value?.params?.caseId));
+const tableRef = ref(null);
+const numList = ref([]);
+
+const pagScenes = props.pagging.state.table.rows;
+// caseScenes.value = getSceneListTree()
+const submit = async () => {
+  return numList.value
+  }
+defineExpose<QuiskExpose>({
+  submit
+});
+
+
+
+const isObj = ref(props.pagging.state.query?.isObj);
+const selectable = (row) => {
+  // let selectlist = selectList.find(item => item.type == params.pagging.state.query?.isObj)?.numList;
+  // if (row.inCase) return false;
+  if (props.numList.includes(row.num)) return false;
+  return row.statusString == '计算成功'// && !selectlist.includes(row.num)
+}
+
+let changIng = false;
+
+watchEffect(() => {
+  const type = props.pagging.state.query.isObj;
+  if (!tableRef.value) return;
+}, { flush: 'post' });
+
+// 勾选时:先清空,再选中当前行
+const handleSelect = (selection, row) => {
+  if (!tableRef.value) return;
+  tableRef.value.clearSelection()
+  tableRef.value.toggleRowSelection(row, true)
+  numList.value = row
+}
+const changeSelection = async (selectScenes) => {
+  numList.value = selectScenes[0] || null
+};
+</script>
+<style scoped lang="scss">
+.mybody-head{
+    flex: auto !important;
+}
+</style>
+
+<style lang="scss">
+.myhideselecTable {
+    .el-table__header-wrapper {
+      .el-checkbox__input {
+        display: none !important;
+      }
+    }
+  }
+</style>

+ 52 - 0
src/view/material/tableScene/tableModel.vue

@@ -0,0 +1,52 @@
+<template>
+  <List :params="params" upload>
+    <template v-slot:header>
+      <el-form-item label="场景名称:" style="width: 250px">
+        <el-input v-model="params.keyword" placeholder="请输入"></el-input>
+      </el-form-item>
+    </template>
+    <template v-slot:content>
+      <component
+        :is="component"
+        :numList="[]"
+        :noEditList="noEditList"
+        :pagging="params.pagging"
+        ref="contentRef"
+      />
+    </template>
+  </List>
+</template>
+
+<script setup lang="ts">
+import comSelect from "@/components/company-select/index.vue";
+import List from "./list.vue";
+import SceneContent from "./sceneContent.vue";
+import ModelContent from "./modelContent.vue";
+import { useScenePaggingParams } from "./pagging";
+import { QuiskExpose } from "@/helper/mount";
+import { computed, ref } from "vue";
+defineProps<{ numList: Array<string>, noEditList: Array<string> }>();
+const options = [
+  {
+    value: 0,
+    label: "我的场景",
+  },
+  {
+    value: 1,
+    label: "共享场景",
+  },
+];
+
+const params = useScenePaggingParams();
+console.log("params.isSwmx", params.isSwmx, "ModelContent");
+const component = computed(() => (params.isSwmx ? ModelContent : SceneContent));
+const contentRef = ref(null);
+const submit = async () => {
+  // replaceCaseScenes(props.caseId, caseScenes.value)
+  return await contentRef.value?.submit();
+  // console.log("submit", caseScenes.value);
+};
+defineExpose<QuiskExpose>({
+  submit,
+});
+</script>