ソースを参照

fix: 修复Bug

bill 8 時間 前
コミット
f74b9fb170

+ 3 - 3
public/icons/PullGate.svg

@@ -1,4 +1,4 @@
-<svg width="1001" height="123" viewBox="0 0 1001 123" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M400.5 0.78125V120.781L300.5 0.78125L200.5 120.781L103.849 0.78125L0.5 120.781V0.78125" stroke="black"/>
-<path d="M1000.5 0.78125V120.781L900.5 0.78125L800.5 120.781L703.849 0.78125L600.5 120.781V0.78125" stroke="black"/>
+<svg width="801" height="123" viewBox="0 0 801 123" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M300.5 0.943359V120.943L225.5 0.943359L150.5 120.943L78.012 0.943359L0.5 120.943V0.943359" stroke="black"/>
+<path d="M800.5 0.943359V120.943L725.5 0.943359L650.5 120.943L578.012 0.943359L500.5 120.943V0.943359" stroke="black"/>
 </svg>

+ 4 - 4
public/icons/RollerShutter.svg

@@ -1,8 +1,8 @@
-<svg width="1003" height="127" viewBox="0 0 1003 127" fill="none" xmlns="http://www.w3.org/2000/svg">
+<svg width="1001" height="127" viewBox="0 0 1001 127" fill="none" xmlns="http://www.w3.org/2000/svg">
 <rect x="0.5" y="44.5" width="12" height="80" stroke="black"/>
-<rect x="990.5" y="44.5" width="12" height="80" stroke="black"/>
-<rect x="12.5" y="14.5" width="978" height="90" stroke="black"/>
-<rect x="12.5" y="44.5" width="978" height="30" stroke="black"/>
+<rect x="988.5" y="44.5" width="12" height="80" stroke="black"/>
+<path d="M12.5 14.5H988.5V104.5H12.5V14.5Z" stroke="black"/>
+<path d="M12.5 44.5H988.5V74.5H12.5V44.5Z" stroke="black"/>
 <path d="M325 126L330.5 120.5L325 115" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
 <path d="M654 126L659.5 120.5L654 115" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
 <path d="M330.5 120.5C297.363 120.5 270.5 93.6371 270.5 60.5C270.5 27.3629 297.363 0.5 330.5 0.5" stroke="black" stroke-linecap="round"/>

ファイルの差分が大きいため隠しています
+ 0 - 7
public/icons/cartridge.svg


+ 0 - 7
public/icons/folder_close.svg

@@ -1,11 +1,4 @@
 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g clip-path="url(#clip0_21286_180205)">
 <path d="M13.5 2.5C14.6046 2.5 15.5 3.39543 15.5 4.5V6.5H29.5C30.6046 6.5 31.5 7.39543 31.5 8.5V27.5C31.5 28.6046 30.6046 29.5 29.5 29.5H2.5C1.39543 29.5 0.5 28.6046 0.5 27.5V4.5C0.5 3.39543 1.39543 2.5 2.5 2.5H13.5Z" stroke="black"/>
 <path d="M0.498535 12.5H31.4985" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
-</g>
-<defs>
-<clipPath id="clip0_21286_180205">
-<rect width="32" height="32" fill="white"/>
-</clipPath>
-</defs>
 </svg>

+ 1 - 1
src/core/components/icon/temp-icon.vue

@@ -41,7 +41,7 @@ const store = useStore();
 const history = useHistory();
 watch(
   () => data.value.url,
-  async (url) => {
+  async (url, preUrl) => {
     svg.value = null;
     const svgContent = await getSvgContent(url);
     const content = parseSvgContent(svgContent);

+ 1 - 1
src/core/components/line/renderer/wall/index.vue

@@ -32,7 +32,7 @@ import { computed, watchEffect } from "vue";
 import { useGetDiffLineIconPolygons, useGetExtendPolygon } from "./view";
 import { LineData, LineDataLine } from "../..";
 import { getLinePoints } from "../../attach-server";
-import { flatPositions } from "@/utils/shared";
+import { copy, flatPositions } from "@/utils/shared";
 import SizeLine from "../../../share/size-line.vue";
 import { useFixedScale } from "@/core/hook/use-viewer";
 const props = defineProps<{

+ 2 - 1
src/core/components/line/renderer/wall/view.ts

@@ -33,7 +33,7 @@ export const useGetExtendPolygon = (lineData: Ref<LineData | undefined>) => {
     fixed ? width * scale.value : width;
 
   const getInfoKey = (line: LEJLine) =>
-    line.points.reduce((t, p) => round(p.x, 3) + round(p.y, 3) + t, "") +
+    line.points.reduce((t, p) => round(p.x, 3).toString() + round(p.y, 3).toString() + t, "") +
     line.width;
 
   const setLEJInfo = (
@@ -68,6 +68,7 @@ export const useGetExtendPolygon = (lineData: Ref<LineData | undefined>) => {
       width: getWidth(originLine.strokeWidth, originLine.fixed),
     };
     if (!origin.points[0] || !origin.points[1]) return [];
+
     const key = getInfoKey(origin);
     let originEdges: Pos[] = getLineEdges(origin.points, origin.width);
     const initOriginEdges = [...originEdges];

+ 10 - 5
src/core/components/line/use-draw.ts

@@ -261,16 +261,21 @@ const useDraw = (type: "line" | "lineChunk" = "line") => {
     const update = () => {
       needInputClear && keyInput.clear();
       const msg = setMessage(cur);
-      drawItems[0] = runHook(
-        () =>
-          obj.interactiveFixData({
+      drawItems[0] = runHook(() => {
+        try {
+          return obj.interactiveFixData({
             data: drawItems[0]!,
             info: msg,
             viewTransform: viewTransform.value,
             history,
             store,
-          })!,
-      );
+          })!;
+        } catch (e) {
+          console.log("无法添加, 退出");
+          quitDrawShape()
+          throw e;
+        }
+      });
       isTempDraw = true;
     };
 

+ 3 - 0
src/core/components/serial/serial.vue

@@ -112,6 +112,9 @@ describes.value.content = {
     emit("updateShape", { ...data.value });
   },
   set value(val) {
+    if (val < 0) {
+      val = -val;
+    }
     data.value.content = val.toString();
   },
 };

+ 2 - 1
src/core/components/table/table.vue

@@ -338,9 +338,10 @@ const menuShowHandler = () => {
       label: ui18n.t("shape.table.addCol"),
       handler: () => {
         const tempCol = data.value.content[0][config.colNdx];
+        console.log(tempCol);
         for (let i = 0; i < data.value.content.length; i++) {
           const row = data.value.content[i];
-          row.splice(config.colNdx, 0, { ...tempCol, content: "" });
+          row.splice(config.colNdx + 1, 0, { ...tempCol, content: "" });
         }
         data.value.width += tempCol.width;
         nextTick(() => shape.value?.getNode().fire("bound-change"));

+ 101 - 63
src/core/hook/use-draw.ts

@@ -1,5 +1,10 @@
 import { computed, h, nextTick, reactive, ref, watch, watchEffect } from "vue";
-import { installGlobalVar, useCursor, useRunHook, useStage } from "./use-global-vars";
+import {
+  installGlobalVar,
+  useCursor,
+  useRunHook,
+  useStage,
+} from "./use-global-vars";
 import { useCan, useMode, useOperMode } from "./use-status";
 import {
   Area,
@@ -32,9 +37,8 @@ import { useCurrentZIndex } from "./use-layer";
 import { useViewerTransform } from "./use-viewer";
 import { useMouseShapesStatus } from "./use-mouse-status";
 
-type PayData<T extends ShapeType> = ComponentValue<T, "addMode"> extends "area"
-  ? Area
-  : Pos;
+type PayData<T extends ShapeType> =
+  ComponentValue<T, "addMode"> extends "area" ? Area : Pos;
 
 export enum MessageAction {
   add,
@@ -47,7 +51,7 @@ export type AddMessage<T extends ShapeType> = {
   consumed: PayData<T>[];
   cur?: PayData<T>;
   ndx?: number;
-  attach?: any
+  attach?: any;
   action: MessageAction;
 };
 
@@ -90,7 +94,7 @@ export const useInteractiveDrawShapeAPI = installGlobalVar(() => {
       preset: Partial<DrawItem<T>> = {},
       data?: PayData<T>,
       pixel = false,
-      force = false
+      force = false,
     ) => {
       if (!force && !can.drawMode) {
         throw "当前状态不允许添加";
@@ -119,7 +123,7 @@ export const useInteractiveDrawShapeAPI = installGlobalVar(() => {
       single = false,
       force = false,
       preSelectIds?: string[],
-      callback?: () => void
+      callback?: () => void,
     ) => {
       if (isEnter) {
         leave();
@@ -136,8 +140,8 @@ export const useInteractiveDrawShapeAPI = installGlobalVar(() => {
         preset,
         operate: { single, preSelectIds },
         callback: () => {
-          leave()
-          callback && callback()
+          leave();
+          callback && callback();
         },
       };
       enter();
@@ -187,7 +191,7 @@ export const useDrawRunning = (shapeType?: ShapeType) => {
 
 export const usePointBeforeHandler = (
   enableTransform = false,
-  enableSnap = false
+  enableSnap = false,
 ) => {
   const operMode = useOperMode();
   const conversionPosition = useConversionPosition(enableTransform);
@@ -242,7 +246,7 @@ const useInteractiveDrawTemp = <T extends ShapeType>({
   type: T;
   useIA: InteractiveHook;
   refSelf?: boolean;
-  addBefore?: (item: Area | Pos) => boolean,
+  addBefore?: (item: Area | Pos) => boolean;
   enter?: () => void;
   quit?: () => void;
   getSnapGeo?: (data: DrawItem<T>) => SnapPoint[];
@@ -257,7 +261,7 @@ const useInteractiveDrawTemp = <T extends ShapeType>({
   const conversionPosition = useConversionPosition(true);
   const history = useHistory();
   const store = useStore();
-  const runHook = useRunHook()
+  const runHook = useRunHook();
   const processorIds = processors.register(() => DrawShape);
   const clear = () => {
     beforeHandler.clear();
@@ -279,39 +283,59 @@ const useInteractiveDrawTemp = <T extends ShapeType>({
       beforeHandler.clear();
       let geo: SnapPoint[] | undefined;
       if (items.length && getSnapGeo) {
-        const item = obj.interactiveFixData({
+        try {
+          const item = obj.interactiveFixData({
+            info: {
+              cur: conversionPosition(p),
+              consumed: ia.consumedMessage,
+              action: MessageAction.update,
+            },
+            data: copy(items[0]),
+            history,
+            viewTransform: viewTransform.value,
+            store,
+          } as any);
+          geo = getSnapGeo(item as any);
+        } catch (e) {
+          console.error("--->", e);
+          ia.isRunning.value = false;
+          throw e;
+        }
+      }
+      return beforeHandler.transform(p, geo, !geo);
+    },
+  });
+
+  const addItem = (cur: PayData<T>) => {
+    let item: any = runHook(() => {
+      try {
+        return obj.interactiveToData({
           info: {
-            cur: conversionPosition(p),
+            cur,
             consumed: ia.consumedMessage,
-            action: MessageAction.update,
+            action: MessageAction.add,
           },
-          data: copy(items[0]),
+          preset: ia.preset,
           history,
           viewTransform: viewTransform.value,
           store,
         } as any);
-        geo = getSnapGeo(item as any);
+      } catch (e) {
+        console.error("无法添加", e);
+        quitDrawShape()
       }
-      return beforeHandler.transform(p, geo, !geo);
-    },
-  });
-
-  const addItem = (cur: PayData<T>) => {
-    let item: any = runHook(() => obj.interactiveToData({
-      info: { cur, consumed: ia.consumedMessage, action: MessageAction.add },
-      preset: ia.preset,
-      history,
-      viewTransform: viewTransform.value,
-      store,
-    } as any));
+    });
     if (!item) return;
     item = reactive(item);
 
     const storeAddItem = (cItem: any) => {
-      if (addBefore && !addBefore(ia.consumedMessage[ia.consumedMessage.length - 1])) {
+      if (
+        addBefore &&
+        !addBefore(ia.consumedMessage[ia.consumedMessage.length - 1])
+      ) {
         return;
       }
-      console.log(ia.consumedMessage)
+      console.log(ia.consumedMessage);
       const items = store.getTypeItems(type);
       if (!obj.checkItemData || obj.checkItemData(cItem)) {
         if (items.some((item) => item.id === cItem.id)) {
@@ -339,21 +363,27 @@ const useInteractiveDrawTemp = <T extends ShapeType>({
       watch(
         cur,
         () => {
-          const info = ia.attachInfos?.get(cur as any)
-          obj.interactiveFixData({
-            info: {
-              cur,
-              consumed: ia.consumedMessage,
-              action: MessageAction.update,
-              attach: info
-            },
-            data: item,
-            history,
-            viewTransform: viewTransform.value,
-            store,
-          } as any);
+          const info = ia.attachInfos?.get(cur as any);
+          try {
+            obj.interactiveFixData({
+              info: {
+                cur,
+                consumed: ia.consumedMessage,
+                action: MessageAction.update,
+                attach: info,
+              },
+              data: item,
+              history,
+              viewTransform: viewTransform.value,
+              store,
+            } as any);
+          } catch (e) {
+            console.error("无法添加", e);
+            quitDrawShape()
+            throw e;
+          }
         },
-        { deep: true }
+        { deep: true },
       ),
       // 监听是否消费完毕
       watch(ia.singleDone, () => {
@@ -363,7 +393,7 @@ const useInteractiveDrawTemp = <T extends ShapeType>({
         items.splice(ndx, 1);
         clear();
         stop();
-      })
+      }),
     );
   };
 
@@ -374,7 +404,7 @@ const useInteractiveDrawTemp = <T extends ShapeType>({
       datas.forEach(addItem);
       ia.consume(datas);
     },
-    { immediate: true }
+    { immediate: true },
   );
   return items;
 };
@@ -388,8 +418,8 @@ export const useInteractiveDrawAreas = <T extends ShapeType>(type: T) => {
     useIA: useInteractiveAreas,
     refSelf: type === "arrow",
     addBefore: (data) => {
-      const positions = data as Area
-      return lineLen(positions[0], positions[1]) > 1
+      const positions = data as Area;
+      return lineLen(positions[0], positions[1]) > 1;
     },
     enter() {
       cursorPop = cursor.push("./icons/m_draw.png");
@@ -421,7 +451,7 @@ export const useInteractiveDrawDots = <T extends ShapeType>(type: T) => {
 export const penUpdatePoints = <T extends Pos>(
   transfromPoints: T[],
   cur: T,
-  needClose = false
+  needClose = false,
 ) => {
   const points = [...transfromPoints];
   let oper: "del" | "add" | "set" | "no" = "add";
@@ -485,7 +515,7 @@ export const useInteractiveDrawPen = <T extends ShapeType>(type: T) => {
   const history = useHistory();
   const processors = useStoreRenderProcessors();
   const store = useStore();
-  const runHook = useRunHook()
+  const runHook = useRunHook();
   const viewTransform = useViewerTransform();
   const operMode = useOperMode();
   const processorIds = processors.register(() => {
@@ -528,14 +558,14 @@ export const useInteractiveDrawPen = <T extends ShapeType>(type: T) => {
       typeof ia.preset?.id === "string" &&
       ia.preset?.id &&
       ia.preset.getMessages &&
-      store.getItemById(ia.preset.id)
+      store.getItemById(ia.preset.id),
   );
   const items = reactive([]) as DrawItem<T>[];
   const messages = useHistoryAttach<Pos[]>(
     `${type}-pen`,
     isRuning,
     shape.value ? (ia.preset!.getMessages! as any) : () => [],
-    true
+    true,
   );
   let prev: SnapPoint;
   let firstEntry = true;
@@ -595,13 +625,21 @@ export const useInteractiveDrawPen = <T extends ShapeType>(type: T) => {
     }
     let item: any = items.length === 0 ? null : items[0];
     if (!item) {
-      item = runHook(() => obj.interactiveToData({
-        preset: ia.preset as any,
-        info: setMessage(dot),
-        viewTransform: viewTransform.value,
-        history,
-        store,
-      }));
+      item = runHook(() => {
+        try {
+          return obj.interactiveToData({
+            preset: ia.preset as any,
+            info: setMessage(dot),
+            viewTransform: viewTransform.value,
+            history,
+            store,
+          });
+        } catch (e) {
+          console.error("无法添加", e);
+          quitDrawShape()
+          throw e;
+        }
+      });
       if (!item) return;
       items[0] = item = reactive(item);
     }
@@ -645,7 +683,7 @@ export const useInteractiveDrawPen = <T extends ShapeType>(type: T) => {
             update();
           }
         },
-        { deep: true }
+        { deep: true },
       ),
       // 监听是否消费完毕
       watch(ia.singleDone, () => {
@@ -666,7 +704,7 @@ export const useInteractiveDrawPen = <T extends ShapeType>(type: T) => {
         stopWatch && stopWatch();
         stopWatch = null;
         firstEntry = false;
-      })
+      }),
     );
   };
 
@@ -677,7 +715,7 @@ export const useInteractiveDrawPen = <T extends ShapeType>(type: T) => {
       datas.forEach(addItem);
       ia.consume(datas);
     },
-    { immediate: true }
+    { immediate: true },
   );
   return items;
 };

+ 2 - 0
src/core/hook/use-paste.ts

@@ -97,6 +97,7 @@ export const usePaste = installGlobalVar(() => {
   const stopCopy = listener(window, "copy", copyHandler);
 
   const pasteHandler = (ev: ClipboardEvent) => {
+    console.log('--->', ev)
     if (isEditableElement(ev.target as HTMLElement)) {
       return;
     }
@@ -132,6 +133,7 @@ export const usePaste = installGlobalVar(() => {
         onCleanup(listener(window, "paste", pasteHandler));
       }
     },
+    {immediate: true}
   );
 
   return {

+ 3 - 0
src/core/hook/use-transformer.ts

@@ -14,6 +14,7 @@ import { Pos, vector } from "@/utils/math.ts";
 import { useConversionPosition } from "./use-coversion-position.ts";
 import { getOffset, listener } from "@/utils/event.ts";
 import {
+  asyncTimeout,
   debounce,
   flatPositions,
   mergeFuns,
@@ -61,6 +62,7 @@ export const useTransformer = installGlobalVar(() => {
     useSingleNodeRotation: true,
   }) as TransformerExtends;
   transformer.queueShapes = ref([]);
+  
 
   transformer.on("transformstart.attachText", () => {
     const operateType = transformer.getActiveAnchor() as TransformerVectorType;
@@ -117,6 +119,7 @@ export const useTransformer = installGlobalVar(() => {
     rotateRect.parent!.add(group);
     const update = async () => {
       await nextTick();
+      await asyncTimeout(16)
       setShapeTransform(group, rotateRect.getTransform());
       group.x(group.x() + 8);
       group.y(group.y() + 8);

+ 21 - 11
src/core/html-mount/propertys/components/color.vue

@@ -1,15 +1,20 @@
 <template>
   <div class="color-layout">
-    <span v-for="color in predefineColors" :style="color && { backgroundColor: color }" :class="{
-      weight: color === '#FFFFFF' || color === null,
-      tran: color === null,
-      active: (value && value.toUpperCase() === color) || (value || null) === color,
-    }" @click="
+    <span
+      v-for="color in predefineColors"
+      :style="color && { backgroundColor: color }"
+      :class="{
+        weight: color === '#FFFFFF' || color === null,
+        tran: color === null,
+        active: (value && value.toUpperCase() === color) || value === color,
+      }"
+      @click="
         () => {
           emit('update:value', color);
           emit('change');
         }
-      " />
+      "
+    />
   </div>
 </template>
 
@@ -17,7 +22,11 @@
 import { ref, watchEffect } from "vue";
 import { themeColor } from "@/constant";
 
-const props = defineProps<{ value?: string; canun?: boolean, colors?: (string | null)[] }>();
+const props = defineProps<{
+  value?: string;
+  canun?: boolean;
+  colors?: (string | null)[];
+}>();
 
 const emit = defineEmits<{
   (e: "update:value", val: string | null): string;
@@ -31,19 +40,20 @@ const def = [
   "#FFBE00",
   "#1AAD19",
   themeColor,
-]
+];
 
+console.log(props);
 const predefineColors = ref<Array<string | null>>(def);
 watchEffect(() => {
   if (props.colors?.length) {
-    predefineColors.value = props.colors
+    predefineColors.value = props.colors;
   } else {
-    predefineColors.value = def
+    predefineColors.value = def;
     if (props.canun) {
       predefineColors.value.push(null);
     }
   }
-})
+});
 </script>
 
 <style lang="scss" scoped>

+ 3 - 1
src/core/html-mount/propertys/components/input-num.vue

@@ -2,7 +2,9 @@
   <div>
     <el-input-number
       :controls="false"
-      :modelValue="value ? (props.proportion ? transform(value) : value) : min"
+      :modelValue="
+        typeof value === 'number' ? (props.proportion ? transform(value) : value) : min
+      "
       @update:model-value="(val: any) => props.proportion ? changeHandler(invTransform(val), val) : changeHandler(val, val)"
       @change="$emit('change')"
       style="width: 98px"

+ 7 - 2
src/example/components/slide/slide-icons.vue

@@ -54,7 +54,7 @@ const props = defineProps<{
 }>();
 const emit = defineEmits<{
   (e: "exit"): void;
-  (e: "active", attr: { icon: string; name: string }): void;
+  (e: "active", attr: { icon: string; name: string } | null): void;
 }>();
 
 const drawIcon = async (item: IconItem) => {
@@ -82,7 +82,12 @@ const drawIcon = async (item: IconItem) => {
         url,
         name,
       },
-      true
+      true,
+      undefined,
+      undefined,
+      () => {
+        setTimeout(() => emit("active", null), 32);
+      }
     )
   );
   emit("exit");

+ 4 - 4
src/example/fuse/enter.ts

@@ -17,10 +17,10 @@ window.platform.login = (isBack = true) => {
     platform
       .post("/service/manage/login", {
         password: encodePwd("Aa123456"),
-        // username: "super-admin",
-        // userName: "super-admin",
-        username: "20迈",
-        userName: "20迈",
+        username: "super-admin",
+        userName: "super-admin",
+        // username: "20迈",
+        // userName: "20迈",
         
       })
       .then((res) => {

+ 16 - 3
src/example/fuse/views/overview/header.vue

@@ -11,7 +11,11 @@
         class="nav-tabs"
         @tab-click="goTab"
       >
-        <el-tab-pane :label="route.label" :name="route.name" v-for="route in routes" />
+        <el-tab-pane
+          :label="route.label"
+          :name="route.name"
+          v-for="route in filterRoutes"
+        />
       </el-tabs>
     </template>
   </Header>
@@ -25,7 +29,7 @@ import { selectScene } from "../../../dialog/vr/index.ts";
 import { Scene } from "../../../platform/platform-resource.ts";
 import { getHeaderActions, getImage } from "../../../components/header/actions.ts";
 import { tabulationData, refreshTabulationData, overviewData } from "../../store.ts";
-import { nextTick, onUnmounted, watchEffect } from "vue";
+import { computed, nextTick, onUnmounted, watchEffect } from "vue";
 import { Mode } from "@/constant/mode.ts";
 import { repTabulationStore } from "../tabulation/gen-tab.ts";
 import { router, routes } from "../../router.ts";
@@ -43,6 +47,13 @@ const emit = defineEmits<{
   (e: "selectVR", v: Scene): void;
   (e: "saveAfter"): void;
 }>();
+const filterRoutes = computed(() => {
+  if (!params.value.disableSwitch) {
+    return routes;
+  } else {
+    return routes.filter((route) => route.name !== "tabulation");
+  }
+});
 
 const goTab = async (tab: TabsPaneContext) => {
   if (tab.props.name === "tabulation") {
@@ -250,11 +261,13 @@ onUnmounted(
 
 const gotoTabulation = repeatedlyOnly(async () => {
   await saveHandler();
-  router.push({
+  const link = router.resolve({
     ...router.currentRoute.value,
     name: "tabulation",
     query: params.value,
   } as any);
+  location.replace(link.href);
+  location.reload();
 });
 
 defineExpose({ gotoTabulation, saveHandler });

+ 17 - 4
src/example/fuse/views/tabulation/header.vue

@@ -17,7 +17,11 @@
         class="nav-tabs"
         @tab-click="goTab"
       >
-        <el-tab-pane :label="route.label" :name="route.name" v-for="route in routes" />
+        <el-tab-pane
+          :label="route.label"
+          :name="route.name"
+          v-for="route in filterRoutes"
+        />
       </el-tabs>
     </template>
   </Header>
@@ -33,7 +37,7 @@ import { grayscaleImage } from "@/utils/dom.ts";
 import saveAs from "@/utils/file-serve.ts";
 import { jsPDF } from "jspdf";
 import { getImage as getResourceImage } from "@/utils/resource.ts";
-import { onUnmounted } from "vue";
+import { computed, onUnmounted } from "vue";
 import { tabulationData } from "../../store.ts";
 import { Mode } from "@/constant/mode.ts";
 import { overviewId, params, tabulationId } from "@/example/env.ts";
@@ -47,14 +51,23 @@ import { IRect } from "konva/lib/types";
 
 const props = defineProps<{ title: string }>();
 const emit = defineEmits<{ (e: "screenshot", val: false | number): void }>();
-
+const filterRoutes = computed(() => {
+  if (!params.value.disableSwitch) {
+    return routes;
+  } else {
+    return routes.filter((route) => route.name !== "overview");
+  }
+});
 const goOverview = async () => {
   await saveHandler();
-  router.push({
+  const link = router.resolve({
     ...router.currentRoute.value,
     name: "overview",
     query: params.value,
   } as any);
+
+  location.replace(link.href);
+  location.reload();
 };
 
 const goTab = (tab: TabsPaneContext) => {

+ 20 - 19
src/example/fuse/views/tabulation/index.vue

@@ -28,7 +28,7 @@
     :tab-draw="draw"
     :scale="draw?.viewerConfig.scaleX"
     @change-config="(config) => (originConfig = config)"
-    v-if="overviewData?.store.config?.proportion.scale"
+    v-if="dataLoaded && overviewData?.store.config?.proportion.scale"
   />
   <Dialog />
 </template>
@@ -183,21 +183,13 @@ const setMapHandler = async (config: { url: string; size: Size }) => {
   const updateSerialTable = (autoGen = true) => {
     const d = draw.value;
     const overview = overviewData.value?.store.layers.default;
-    const serials = overview.serial;
+    const serials = overview.serial || [];
     if (!d) {
       return;
     }
     const pack = autoGen
       ? d.history.preventTrack.bind(d.history)
       : (run: () => void) => run();
-    if (!serials?.length) {
-      if (serialTable.value) {
-        pack(() => {
-          d.store.delItem("table", serialTable.value!.id);
-        });
-      }
-      return;
-    }
     const table = serialTable.value || addTable(d as any);
     const syncSerials = serials.map((item) => {
       let desc = "";
@@ -247,15 +239,24 @@ const setMapHandler = async (config: { url: string; size: Size }) => {
       }
     }
 
-    draw.value?.runHook(() => syncTable(table, syncSerials));
+    if (syncSerials.length) {
+      syncSerials.sort((a, b) => Number(a.content) - Number(b.content));
+      draw.value?.runHook(() => syncTable(table, syncSerials));
+    }
 
     if (serialTable.value) {
-      pack(() => {
-        d.store.setItem("table", {
-          id: serialTable.value!.id,
-          value: serialTable.value!,
+      if (!syncSerials.length) {
+        pack(() => {
+          d.store.delItem("table", serialTable.value!.id);
         });
-      });
+      } else {
+        pack(() => {
+          d.store.setItem("table", {
+            id: serialTable.value!.id,
+            value: serialTable.value!,
+          });
+        });
+      }
     } else {
       table.key = tableSerialTableKey;
       pack(() => {
@@ -544,9 +545,9 @@ const setCover = (paperKey: PaperKey, draw: Draw) => {
 let clearDraw: (() => void) | undefined;
 onUnmounted(() => (clearDraw = undefined));
 const dataLoaded = ref(false);
-Promise.all([refreshOverviewData(), refreshTabulationData()]).then(
-  () => (dataLoaded.value = true)
-);
+Promise.all([refreshOverviewData(), refreshTabulationData()]).then(() => {
+  dataLoaded.value = true;
+});
 
 const lowVersionHandler = (_draw: Draw) => {
   // 旧数据处理

+ 1 - 2
src/example/fuse/views/tabulation/overview-viewport.vue

@@ -225,8 +225,7 @@ const updateOrigin = () => {
     }
   }
 
-  const size = canvasSize.value as Size;
-  console.log(size);
+  const size = canvasSize.value || ({ width: 100, height: 100 } as Size);
   // imageScale
   d.config.size = size;
   d.config.labelLineConfig.type = "auto";

+ 1 - 1
src/example/platform/platform-draw.ts

@@ -74,7 +74,7 @@ const getCoverShapes = (cover: SceneResource["cover"]) => {
     for (i = 0; i < item.length - 1; i++) {
       b = onlyId();
       const lId = onlyId();
-      const l = { id: onlyId(), a, b, ...defaultStyle };
+      const l = { id: onlyId(), a, b, ...defaultStyle, strokeWidth: 12 };
       const p = { id: a, ...item[i] };
       geoCtx.add.points[a] = p;
       geoCtx.add.lines[lId] = l;