bill 2 месяцев назад
Родитель
Сommit
6423abf56f

+ 1 - 1
src/api/material.ts

@@ -154,7 +154,7 @@ export const syncMaterialAll = async () => {
 };
 };
 
 
 export const addMaterial = (file: File) => {
 export const addMaterial = (file: File) => {
-  return axios<string>({
+  return axios<any>({
     method: "POST",
     method: "POST",
     url: ADD_MATERIAL,
     url: ADD_MATERIAL,
     data: jsonToForm({ file }),
     data: jsonToForm({ file }),

BIN
src/components/materials/image1.png


BIN
src/components/materials/image2.png


+ 105 - 0
src/components/materials/loc-upload.vue

@@ -0,0 +1,105 @@
+<template>
+  <Modal
+    width="600px"
+    :title="$t('fuse.localUpload')"
+    :open="visible"
+    @ok="okHandler"
+    :afterClose="afterClose"
+    @cancel="emit('update:visible', false)"
+    :okText="$t('sys.upload.name1')"
+    :cancelText="$t('sys.cancel')"
+    class="model-table"
+  >
+    <ui-input
+      width="200px"
+      style="display: none"
+      class="input"
+      ref="inputRef"
+      :accept="ft"
+      :maxSize="maxSize"
+      @update:modelValue="(file: File) => uploadHandler(file)"
+      type="file"
+    >
+      <template v-slot:replace>
+        <Button type="primary" ghost ref="btn" style="width: 100%">
+          <ui-icon type="add" class="icon" />{{ $t("sys.upload.place1") }}
+        </Button>
+      </template>
+    </ui-input>
+    <div class="bund">
+      <h4>{{ $t("fuse.modelUpload.title0") }}</h4>
+      <p>
+        {{ $t("fuse.modelUpload.desc0") }}
+      </p>
+      <img src="./image1.png" />
+    </div>
+    <div class="bund">
+      <h4>{{ $t("fuse.modelUpload.title1") }}</h4>
+      <p>
+        {{ $t("fuse.modelUpload.desc1") }}
+      </p>
+      <img src="./image2.png" />
+    </div>
+  </Modal>
+</template>
+
+<script lang="ts" setup>
+import { Modal, Table, Empty, Button } from "ant-design-vue";
+import { getSizeStr } from "@/utils";
+import { addMaterial, Material } from "@/api/material";
+import { computed, ref } from "vue";
+
+const props = defineProps<{
+  uploadFormat?: string[];
+  format?: string[];
+  maxSize?: number;
+  visible: boolean;
+  count?: number;
+  readonly?: boolean;
+  groupIds: number[];
+  useType?: string;
+  afterClose?: () => void;
+}>();
+
+const emit = defineEmits<{
+  (e: "update:visible", v: boolean): void;
+  (e: "selectMaterials", v: Material[]): void;
+}>();
+
+const ft = computed(() => {
+  const ft = props.uploadFormat || props.format;
+  if (!ft) return void 0;
+  return ft.map((t) => `.${t}`).join(",");
+});
+
+const inputRef = ref();
+const okHandler = () => {
+  console.log(inputRef.value.vmRef);
+  inputRef.value.vmRef.input.click();
+};
+
+const uploadHandler = async (file: File) => {
+  const m = await addMaterial(file);
+  emit("selectMaterials", [{ ...m, uploadId: m.id }]);
+};
+</script>
+
+<style lang="less" scoped>
+.bund {
+  &:not(:first-child) {
+    margin-top: 20px;
+  }
+  h4 {
+    margin-bottom: 4px;
+    color: #fff;
+  }
+  p {
+    margin-bottom: 10px;
+    color: #ccc;
+  }
+
+  img {
+    width: 200px;
+  }
+}
+</style>

+ 34 - 0
src/components/materials/quisk.ts

@@ -1,5 +1,6 @@
 import { mount } from "@/utils";
 import { mount } from "@/utils";
 import Materials from "./index.vue";
 import Materials from "./index.vue";
+import Materials1 from "./loc-upload.vue";
 import { Material } from "@/api/material";
 import { Material } from "@/api/material";
 import { reactive } from "vue";
 import { reactive } from "vue";
 
 
@@ -32,3 +33,36 @@ export const selectMaterials = async (props: {
     const umMount = mount(document.querySelector("#app")!, Materials, mprops);
     const umMount = mount(document.querySelector("#app")!, Materials, mprops);
   });
   });
 };
 };
+
+
+
+export const selectMaterials1 = async (props: {
+  uploadFormat?: string[],
+  format?: string[];
+  isSystem?: number,
+  maxSize?: number;
+  count?: number
+  readonly?: boolean;
+  groupIds?: number[]
+  useType?: string
+} = {}) => {
+  return new Promise<Material[] | null>((resolve) => {
+    const mprops = reactive({
+      ...props,
+      visible: true,
+      onSelectMaterials: (val: Material[]) => {
+        resolve(val);
+        mprops.visible = false
+      },
+      "onUpdate:visible": () => {
+        mprops.visible = false
+        resolve(null);
+      },
+      afterClose() {
+        umMount();
+      }
+    })
+    const umMount = mount(document.querySelector("#app")!, Materials1, mprops);
+  });
+};
+

+ 8 - 0
src/lang/locales/zh.json

@@ -107,7 +107,14 @@
     "join": "拼接",
     "join": "拼接",
     "label": "融合场景",
     "label": "融合场景",
     "len": "长度",
     "len": "长度",
+    "localUpload": "本地上传",
     "model": "三维模型",
     "model": "三维模型",
+    "modelUpload": {
+      "desc0": "仅支持OSGB格式模型,请将文件使用ZIP打包后上传,确保压缩包内包含Data文件夹和XML文件,且不得包含任何子文件夹,同时文件名请避免使用中文。如图:",
+      "desc1": "仅支持OBJ格式模型,请将文件使用ZIP打包后上传,确保压缩包内包含贴图、模型和MTL文件,且不得包含任何子文件夹,同时文件名请避免使用中文。如图:",
+      "title0": "倾斜摄影模型上传要求",
+      "title1": "其他模型上传要求"
+    },
     "move": "移动",
     "move": "移动",
     "name": "多元融合",
     "name": "多元融合",
     "opacity": "模型不透明度",
     "opacity": "模型不透明度",
@@ -337,6 +344,7 @@
       "lenErr": "最多仅支持{maxLen}个文件!",
       "lenErr": "最多仅支持{maxLen}个文件!",
       "maxLen": "个数不超过 {maxLen}个",
       "maxLen": "个数不超过 {maxLen}个",
       "maxSize": "大小不超过 {sizeStr},",
       "maxSize": "大小不超过 {sizeStr},",
+      "name1": "上传",
       "normalizeScale": "宽*高比例 {scale},",
       "normalizeScale": "宽*高比例 {scale},",
       "place1": "上传文件",
       "place1": "上传文件",
       "previewErr": "预览加载失败!",
       "previewErr": "预览加载失败!",

+ 4 - 4
src/layout/edit/scene-select.vue

@@ -61,7 +61,7 @@
       <template #overlay>
       <template #overlay>
         <Menu>
         <Menu>
           <MenuItem @click="visible = true">{{ $t("scene.manage") }}</MenuItem>
           <MenuItem @click="visible = true">{{ $t("scene.manage") }}</MenuItem>
-          <MenuItem @click="selectModel">{{ $t("material.name") }}</MenuItem>
+          <MenuItem @click="selectModel">{{ $t("fuse.localUpload") }}</MenuItem>
         </Menu>
         </Menu>
       </template>
       </template>
     </Dropdown>
     </Dropdown>
@@ -94,7 +94,7 @@ import {
 
 
 import { fetchScenesAll, SceneType, uploadMaterialToModel, type Scene } from "@/api";
 import { fetchScenesAll, SceneType, uploadMaterialToModel, type Scene } from "@/api";
 import { activeModel, getSceneModel } from "@/sdk";
 import { activeModel, getSceneModel } from "@/sdk";
-import { selectMaterials } from "@/components/materials/quisk";
+import { selectMaterials, selectMaterials1 } from "@/components/materials/quisk";
 import { lang, ui18n } from "@/lang";
 import { lang, ui18n } from "@/lang";
 import { custom } from "@/env";
 import { custom } from "@/env";
 import { actionItems, currentItem } from "@/views/merge";
 import { actionItems, currentItem } from "@/views/merge";
@@ -255,14 +255,14 @@ watch(visible, (visible, oldvisible) => {
 });
 });
 
 
 const selectModel = async () => {
 const selectModel = async () => {
-  let list = await selectMaterials({
+  let list = await selectMaterials1({
     uploadFormat: ["zip"],
     uploadFormat: ["zip"],
     format: ["obj", "ply", "las", "laz", "b3dm", "shp", "osgb", "glb"],
     format: ["obj", "ply", "las", "laz", "b3dm", "shp", "osgb", "glb"],
     maxSize: 2 * 1024 * 1024 * 1024,
     maxSize: 2 * 1024 * 1024 * 1024,
   });
   });
+  debugger
   if (!list?.length) return;
   if (!list?.length) return;
   list = list.filter(item => item.uploadId)
   list = list.filter(item => item.uploadId)
-
   // const modelList = await Promise.all(list.map(item => uploadMaterialToModel(item.uploadId!)))
   // const modelList = await Promise.all(list.map(item => uploadMaterialToModel(item.uploadId!)))
   const attachs: any[] = []
   const attachs: any[] = []
   for (let i = 0; i < list.length; i++) {
   for (let i = 0; i < list.length; i++) {