bill пре 2 месеци
родитељ
комит
54b67a6a8b

+ 28 - 12
src/core/hook/use-global-vars.ts

@@ -396,20 +396,32 @@ export const useTempStatus = installGlobalVar(() => {
 
 const getFilters = <T>() => {
   type Val = (d: T) => T
-  const globalFilter = ref<{[key in ShapeType]?: Val}>({})
-  const shapeFilter = ref<Record<string, Val>>({})
-  const setShapeFilter = (id: string, descs?: Val) => {
-    if (!descs) {
-      delete shapeFilter.value[id]
+  const globalFilter = ref<{[key in ShapeType]?: Val[]}>({})
+  const shapeFilter = ref<Record<string, Val[]>>({})
+  const setShapeFilter = (id: string, descs: Val) => {
+    if (shapeFilter.value[id]) {
+      shapeFilter.value[id].push(descs)
     } else {
-      shapeFilter.value[id] = descs
+      shapeFilter.value[id] = [descs]
+    }
+    return () => {
+      if (shapeFilter.value[id]) {
+        const ndx = shapeFilter.value[id].indexOf(descs)
+        shapeFilter.value[id].splice(ndx, 1)
+      }
     }
   }
-  const setFilter = (type: ShapeType, descs?: Val) => {
-    if (!descs) {
-      delete globalFilter.value[type]
+  const setFilter = (type: ShapeType, descs: Val) => {
+    if (globalFilter.value[type]) {
+      globalFilter.value[type].push(descs)
     } else {
-      globalFilter.value[type] = descs
+      globalFilter.value[type] = [descs]
+    }
+    return () => {
+      if (globalFilter.value[type]) {
+        const ndx = globalFilter.value[type].indexOf(descs)
+        globalFilter.value[type].splice(ndx, 1)
+      }
     }
   }
 
@@ -419,10 +431,14 @@ const getFilters = <T>() => {
     getFilter(type: ShapeType, id: string) {
       return (menus: T) => {
         if (globalFilter.value[type]) {
-          menus = globalFilter.value[type](menus)
+          for (const filter of globalFilter.value[type]) {
+            menus = filter(menus)
+          }
         }
         if (shapeFilter.value[id]) {
-          menus = shapeFilter.value[id](menus)
+          for (const filter of shapeFilter.value[id]) {
+            menus = filter(menus)
+          }
         }
         return menus
       }

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

@@ -27,7 +27,7 @@ import { useProportion } from "@/core/hook/use-proportion";
 import { ElSlider } from "element-plus";
 
 const props = defineProps<{
-  data: Record<string, any>;
+  data?: Record<string, any>;
   value: number;
   min?: number;
   max?: number;
@@ -44,8 +44,6 @@ const emit = defineEmits<{
 const changeHandler = (val: number) => {
   emit("update:value", val);
 };
-
-console.log(proportion.value.scale, props.value);
 </script>
 
 <style lang="scss" scoped>

+ 33 - 39
src/example/fuse/views/defStyle.ts

@@ -44,31 +44,27 @@ export const tabCustomStyle = (p: PaperKey, draw: Draw) => {
     "triangle",
     "polygon",
   ] as ShapeType[];
-  types.forEach((type) => {
-    draw.mountFilter.setMenusFilter(type, (data) => {
-      data.strokeWidth.props = {
-        ...data.strokeWidth.props,
-        proportion: true,
-        step: 0.1,
-        min: 0.1,
-        max: 10,
-      };
-      return data;
-    });
-  });
-  draw.mountFilter.setMenusFilter('serial', data => {
-    data = {...data}
-    delete data.fontStyle
-    return data
-  })
 
   const backs = [
-    () => {
-      types.forEach((type) => {
-        draw.mountFilter.setMenusFilter(type);
-      });
-      draw.mountFilter.setMenusFilter('serial')
-    },
+    mergeFuns(
+      types.map((type) =>
+        draw.mountFilter.setMenusFilter(type, (data) => {
+          data.strokeWidth.props = {
+            ...data.strokeWidth.props,
+            proportion: true,
+            step: 0.1,
+            min: 0.1,
+            max: 10,
+          };
+          return data;
+        })
+      )
+    ),
+    draw.mountFilter.setMenusFilter("serial", (data) => {
+      data = { ...data };
+      delete data.fontStyle;
+      return data;
+    }),
     setDefStyle(
       iconDefStyle,
       {
@@ -100,15 +96,14 @@ export const tabCustomStyle = (p: PaperKey, draw: Draw) => {
       () =>
         draw.store.getTypeItems("table").filter((item) => item.key === joinKey),
       (serialTables, _, onCleanup) => {
-        const fns = serialTables.map((item) => {
-          draw.mountFilter.setShapeMenusFilter(item.id, item => {
-            const c = {...item}
-            delete c.align
-            return c
+        const fns = serialTables.map((item) =>
+          draw.mountFilter.setShapeMenusFilter(item.id, (item) => {
+            const c = { ...item };
+            delete c.align;
+            return c;
           })
-          return () => draw.menusFilter.setShapeMenusFilter(item.id)
-        });
-        onCleanup(mergeFuns(fns))
+        );
+        onCleanup(mergeFuns(fns));
       },
       { immediate: true }
     ),
@@ -118,15 +113,14 @@ export const tabCustomStyle = (p: PaperKey, draw: Draw) => {
 };
 
 export const overviewCustomStyle = (draw: Draw) => {
-  draw.mountFilter.setMenusFilter("icon", (data) => {
-    data.strokeWidth.props = {
-      ...data.strokeWidth.props,
-      proportion: true,
-    };
-    return data;
-  });
   const backs = [
-    () => draw.mountFilter.setMenusFilter("icon"),
+    draw.mountFilter.setMenusFilter("icon", (data) => {
+      data.strokeWidth.props = {
+        ...data.strokeWidth.props,
+        proportion: true,
+      };
+      return data;
+    }),
     setDefStyle(
       iconDefStyle,
       {

+ 71 - 68
src/example/fuse/views/tabulation/index.vue

@@ -120,11 +120,16 @@ const init = async (draw: Draw) => {
 };
 watch(draw, (draw, _, onCleanup) => {
   if (draw) {
-    for (const type in components) {
-      draw.menusFilter.setMenusFilter(type as ShapeType, (items) => {
-        return items.filter((item) => item.label !== "隐藏");
-      });
-    }
+    const quits: (() => void)[] = [
+      mergeFuns(
+        Object.keys(components).map((type) =>
+          draw.menusFilter.setMenusFilter(type as ShapeType, (items) => {
+            return items.filter((item) => item.label !== "隐藏");
+          })
+        )
+      ),
+    ];
+
     let des = false;
     let unInit: () => void;
     init(draw).then((_unInit) => {
@@ -134,10 +139,11 @@ watch(draw, (draw, _, onCleanup) => {
         _unInit();
       }
     });
-    onCleanup(() => {
+    quits.push(() => {
       unInit && unInit();
       des = true;
     });
+    onCleanup(mergeFuns(quits));
   }
 });
 
@@ -157,39 +163,37 @@ watch(cover, (cover, _, onCleanup) => {
     return;
   const mountMenus = draw.value.mountFilter;
   const menusFilter = draw.value.menusFilter;
-
-  menusFilter.setShapeMenusFilter(cover.id, () => []);
-  mountMenus.setShapeMenusFilter(cover.id, (des) => ({
-    ...des,
-    scale: {
-      type: "fixProportion",
-      label: "缩放比例",
-      "layout-type": "row",
-      get value() {
-        return coverScale.value;
+  const quits = [
+    menusFilter.setShapeMenusFilter(cover.id, () => []),
+    mountMenus.setShapeMenusFilter(cover.id, (des) => ({
+      ...des,
+      scale: {
+        type: "fixProportion",
+        label: "缩放比例",
+        "layout-type": "row",
+        get value() {
+          return coverScale.value;
+        },
+        set value(val) {
+          coverScale.value = val;
+        },
+        props: { min: 1 },
       },
-      set value(val) {
-        coverScale.value = val;
+      showScale: {
+        type: "check",
+        label: "显示比例",
+        "layout-type": "row",
+        get value() {
+          return (cover as any).showScale || false;
+        },
+        set value(val) {
+          (cover as any).showScale = val;
+        },
+        props: {},
       },
-      props: { min: 1 },
-    },
-    showScale: {
-      type: "check",
-      label: "显示比例",
-      "layout-type": "row",
-      get value() {
-        return (cover as any).showScale || false;
-      },
-      set value(val) {
-        (cover as any).showScale = val;
-      },
-      props: {},
-    },
-  }));
-  onCleanup(() => {
-    mountMenus.setShapeMenusFilter(cover.id);
-    menusFilter.setShapeMenusFilter(cover.id);
-  });
+    })),
+  ];
+  onCleanup(mergeFuns(quits));
 });
 
 const coverScaleText = computed(() => {
@@ -229,38 +233,37 @@ watch(compass, (compass, _, onCleanup) => {
   if (!compass || !draw.value) return;
   const mountMenus = draw.value.mountFilter;
   const menusFilter = draw.value.menusFilter;
-  menusFilter.setShapeMenusFilter(compass.id, () => []);
-  mountMenus.setShapeMenusFilter(compass.id, (des) => ({
-    // ...des,
-    rotate: {
-      type: "num",
-      label: "旋转角度",
-      default: 0,
-      props: {
-        min: 0,
-        max: 360,
-      },
-      "layout-type": "column",
-      sort: 3,
-      get value() {
-        return round((new Transform(compass.mat).decompose().rotation + 360) % 360, 1);
-      },
-      set value(val) {
-        const config = new Transform(compass.mat).decompose();
-        compass.mat = new Transform()
-          .translate(config.x, config.y)
-          .scale(config.scaleX, config.scaleY)
-          .rotate(MathUtils.degToRad(val)).m;
-        nextTick(() => {
-          draw.value?.stage!.findOne(`#${compass.id}`)?.fire("bound-change");
-        });
+  const quits = [
+    menusFilter.setShapeMenusFilter(compass.id, () => []),
+    mountMenus.setShapeMenusFilter(compass.id, (des) => ({
+      // ...des,
+      rotate: {
+        type: "num",
+        label: "旋转角度",
+        default: 0,
+        props: {
+          min: 0,
+          max: 360,
+        },
+        "layout-type": "column",
+        sort: 3,
+        get value() {
+          return round((new Transform(compass.mat).decompose().rotation + 360) % 360, 1);
+        },
+        set value(val) {
+          const config = new Transform(compass.mat).decompose();
+          compass.mat = new Transform()
+            .translate(config.x, config.y)
+            .scale(config.scaleX, config.scaleY)
+            .rotate(MathUtils.degToRad(val)).m;
+          nextTick(() => {
+            draw.value?.stage!.findOne(`#${compass.id}`)?.fire("bound-change");
+          });
+        },
       },
-    },
-  }));
-  onCleanup(() => {
-    mountMenus.setShapeMenusFilter(compass.id);
-    menusFilter.setShapeMenusFilter(compass.id);
-  });
+    })),
+  ];
+  onCleanup(mergeFuns(quits));
 });
 
 const title = computed(() => tabulationData.value?.title || "图纸");

+ 4 - 2
src/example/platform/platform-draw.ts

@@ -89,8 +89,8 @@ const getResourceLayers = (data: AIExposeData) => {
   return data.floors
     .map((floor) => {
       let box: SceneFloor["box"];
-      if (true) {
-      // if (!floor.box || !floor.box.bound.x_max || !floor.box.bound.z_max) {
+      // if (true) {
+      if (!floor.box || !floor.box.bound.x_max || !floor.box.bound.z_max) {
         const xs = floor.geos.flatMap((item) => item.map((p) => p.x));
         const ys = floor.geos.flatMap((item) => item.map((p) => p.y));
         const zs = floor.geos.flatMap((item) => item.map((p) => p.z));
@@ -115,6 +115,8 @@ const getResourceLayers = (data: AIExposeData) => {
       } else {
         box = floor.box;
       }
+      box.bound.z_min = -999999;
+      box.bound.z_max = 999999;
 
       console.log("楼层范围", box.bound.z_min, box.bound.z_max);
       return {