bill 2 年之前
父節點
當前提交
c53e1925ea

+ 2 - 2
src/components/base/assets/scss/components/_loading.scss

@@ -15,8 +15,8 @@
 
 .ui-loading__box {
     position       : relative;
-    width          : 100px;
-    height         : 100px;
+    width          : 50px;
+    height         : 50px;
     display        : flex;
     align-items    : center;
     justify-content: center;

+ 2 - 0
src/graphic/CanvasStyle/default.js

@@ -232,6 +232,8 @@ export default {
   MeasureLine,
   FreeMeasureLine: MeasureLine,
   PositionLine: MeasureLine,
+  LocationLineByFixPoint: MeasureLine,
+  LocationLineByBasePoint: MeasureLine,
   NormalPoint,
   Measure,
   Element,

+ 35 - 18
src/graphic/Renderer/Draw.js

@@ -833,6 +833,27 @@ export default class Draw {
     this.drawPoint(vector);
   }
 
+  drawLineArrow(line, doubleArrow = false) {
+    const ctx = this.context;
+    const [start, end] = line;
+    const dires = doubleArrow
+      ? [
+          [start, end],
+          [end, start],
+        ]
+      : [[start, end]];
+
+    ctx.save();
+    for (let [start, end] of dires) {
+      const lines = mathUtil.getArrow(start, end);
+      ctx.moveTo(lines[0].x, lines[0].y);
+      ctx.lineTo(lines[1].x, lines[1].y);
+      ctx.lineTo(lines[2].x, lines[2].y);
+    }
+    ctx.stroke();
+    ctx.restore();
+  }
+
   drawArrow(vector) {
     const startReal = dataService.getPoint(vector.startId);
     const start = coordinate.getScreenXY(startReal);
@@ -842,26 +863,11 @@ export default class Draw {
 
     ctx.save();
 
-    const [style] = help.setVectorStyle(this.context, vector);
+    help.setVectorStyle(this.context, vector);
     if (vector.color) {
       ctx.strokeStyle = vector.color;
     }
-
-    const dires =
-      vector.category === UIEvents.DoubleArrow
-        ? [
-            [start, end],
-            [end, start],
-          ]
-        : [[start, end]];
-    for (let [start, end] of dires) {
-      const lines = mathUtil.getArrow(start, end);
-      ctx.moveTo(lines[0].x, lines[0].y);
-      ctx.lineTo(lines[1].x, lines[1].y);
-      ctx.lineTo(lines[2].x, lines[2].y);
-    }
-    ctx.stroke();
-    ctx.restore();
+    this.drawLineArrow([start, end], vector.category === UIEvents.DoubleArrow);
   }
 
   drawMagnifier(vector) {
@@ -1315,7 +1321,7 @@ export default class Draw {
     }
 
     help.drawStyleLine(this.context, [start, end], vector.style, vector.weight);
-
+    // vector.category = VectorCategory.Line.LocationLineByFixPoint;
     switch (vector.category) {
       case VectorCategory.Line.SingleArrowLine:
         this.drawArrow(vector);
@@ -1326,10 +1332,21 @@ export default class Draw {
       case VectorCategory.Line.BaseLine:
         this.drawBaseLineLabel(vector);
         break;
+      case VectorCategory.Line.LocationLineByFixPoint:
+      case VectorCategory.Line.LocationLineByBasePoint:
       case VectorCategory.Line.FreeMeasureLine:
       case VectorCategory.Line.MeasureLine:
       case VectorCategory.Line.PositionLine:
         this.drawLineText(vector, style.text);
+
+        if (
+          [
+            VectorCategory.Line.LocationLineByFixPoint,
+            VectorCategory.Line.LocationLineByBasePoint,
+          ].includes(vector.category)
+        ) {
+          this.drawLineArrow([start, end], true);
+        }
         break;
     }
     this.context.restore();

+ 6 - 2
src/views/graphic/geos/road.vue

@@ -18,7 +18,11 @@ import GraphicAction from "@/components/button-pane/index.vue";
 import VectorEvents from "@/graphic/enum/VectorEvents";
 
 const props = defineProps<{ geo: FocusVector }>();
-const vector = computed(() => dataService.getRoad(props.geo.vectorId));
+const vector = computed(
+  () =>
+    dataService.getRoad(props.geo.vectorId) ||
+    dataService.getCurveRoad(props.geo.vectorId)
+);
 const clickHandlerFactory = (key) => {
   return () => {
     drawRef.value.uiControl.updateVectorForSelectUI(key);
@@ -75,9 +79,9 @@ const menus = ref([
   },
 ]);
 
-console.log(vector.value);
 watchEffect(() => {
   if (vector.value) {
+    console.log(vector.value);
     menus.value[1].disabled =
       vector.value?.leftLanes.length +
         vector.value?.rightLanes.length +

+ 1 - 1
src/views/scene/menus/actions.ts

@@ -199,7 +199,7 @@ const menuActions = {
     );
   },
   [menuEnum.CLEAR]: async (menu, onComplete) => {
-    if (await useConfirm("确认情况?该操作无法撤销")) {
+    if (await useConfirm("确认清空?该操作无法撤销")) {
       list.value = [];
       baseLines.value = [];
       basePoints.value = [];

+ 88 - 80
src/views/scene/menus/menus.ts

@@ -1,42 +1,45 @@
-import {findMenuByAttr, generateMixMenus as generateMixMenusRaw} from '@/utils/menus'
-import {nextTick, ref} from "vue";
-import {useAsyncSDK, useSDK} from "@/hook";
-import {laserModeStack, modeDisabled} from '@/hook/custom/index'
-import {Mode} from "@/sdk";
-import {baseLines} from "@/store/baseLine";
-import {fixPoints} from "@/store/fixPoint";
-import {basePoints} from "@/store/basePoint";
-import {list} from "@/store/measure";
+import {
+  findMenuByAttr,
+  generateMixMenus as generateMixMenusRaw,
+} from "@/utils/menus";
+import { nextTick, ref } from "vue";
+import { useAsyncSDK, useSDK } from "@/hook";
+import { laserModeStack, modeDisabled } from "@/hook/custom/index";
+import { Mode } from "@/sdk";
+import { baseLines } from "@/store/baseLine";
+import { fixPoints } from "@/store/fixPoint";
+import { basePoints } from "@/store/basePoint";
+import { list } from "@/store/measure";
 
 export type MenuRaw = {
-  key: string,
-  text: string,
-  continued?: boolean
-  defaultSelect?: true | (() => boolean),
-  icon?: string,
-  disabled?: boolean | (() => boolean),
-  border?: boolean,
-  children?: MenuRaw[],
-  onClick?: () => void | (() => void)
-}
+  key: string;
+  text: string;
+  continued?: boolean;
+  defaultSelect?: true | (() => boolean);
+  icon?: string;
+  disabled?: boolean | (() => boolean);
+  border?: boolean;
+  children?: MenuRaw[];
+  onClick?: () => void | (() => void);
+};
 
 export enum menuEnum {
-  SAVE = 'save',
-  CLEAR = 'clear',
-  MEASURE_ROW = 'L_LINE',
-  MEASURE_COLUMN = 'V_LINE',
-  MEASURE_FREE = 'LINE',
-  FIX_POINT = 'fixPoint',
-  BASE_LINE = 'baseLine',
-  BASE_POINT = 'basePoint',
+  SAVE = "save",
+  CLEAR = "clear",
+  MEASURE_ROW = "L_LINE",
+  MEASURE_COLUMN = "V_LINE",
+  MEASURE_FREE = "LINE",
+  FIX_POINT = "fixPoint",
+  BASE_LINE = "baseLine",
+  BASE_POINT = "basePoint",
 }
 
-const vView = ref(false)
-useAsyncSDK().then(sdk => {
-  sdk.scene.on('viewChange', (view) => {
-    vView.value = view === "Top" || view === "Bottom"
-  })
-})
+const vView = ref(false);
+useAsyncSDK().then((sdk) => {
+  sdk.scene.on("viewChange", (view) => {
+    vView.value = view === "Top" || view === "Bottom";
+  });
+});
 
 export const menus: MenuRaw[] = [
   // {
@@ -46,10 +49,15 @@ export const menus: MenuRaw[] = [
   // },
   {
     icon: "clear",
-    text: "清",
+    text: "清",
     key: menuEnum.CLEAR,
-    disabled: () => (baseLines.value.length + fixPoints.value.length + list.value.length + basePoints.value.length) === 0,
-    border: true
+    disabled: () =>
+      baseLines.value.length +
+        fixPoints.value.length +
+        list.value.length +
+        basePoints.value.length ===
+      0,
+    border: true,
   },
   {
     icon: "measure",
@@ -61,22 +69,22 @@ export const menus: MenuRaw[] = [
         continued: true,
         text: "水平",
         defaultSelect: true,
-        key: menuEnum.MEASURE_ROW
+        key: menuEnum.MEASURE_ROW,
       },
       {
         icon: "line_v",
         continued: true,
         disabled: () => vView.value,
         text: "垂直",
-        key: menuEnum.MEASURE_COLUMN
+        key: menuEnum.MEASURE_COLUMN,
       },
       {
         icon: "line_f",
         continued: true,
         text: "自由",
-        key: menuEnum.MEASURE_FREE
-      }
-    ]
+        key: menuEnum.MEASURE_FREE,
+      },
+    ],
   },
   {
     icon: "point_f",
@@ -87,30 +95,31 @@ export const menus: MenuRaw[] = [
         defaultSelect: true,
         icon: "point_a",
         text: "固定点",
-        key: menuEnum.FIX_POINT
+        key: menuEnum.FIX_POINT,
       },
-    ]
+    ],
   },
   {
     icon: "standard",
     text: "基准",
     key: "baseLineOrPoint",
     onClick() {
-      const sdk = useSDK()
-      const doms = document.querySelectorAll("#navCube, #home") as NodeListOf<HTMLElement>;
-      laserModeStack.push(ref(Mode.cloud))
-      modeDisabled.push(ref(true))
-      doms.forEach(dom => dom.style.display = "none");
-      nextTick(() => sdk.enterTopView())
-
+      const sdk = useSDK();
+      const doms = document.querySelectorAll(
+        "#navCube, #home"
+      ) as NodeListOf<HTMLElement>;
+      laserModeStack.push(ref(Mode.cloud));
+      modeDisabled.push(ref(true));
+      doms.forEach((dom) => (dom.style.display = "none"));
+      nextTick(() => sdk.enterTopView());
 
       return () => {
-        doms.forEach(dom => dom.style.display = "block");
-        sdk.leaveTopView()
-        modeDisabled.pop()
-        laserModeStack.pop()
-        console.log("pop")
-      }
+        doms.forEach((dom) => (dom.style.display = "block"));
+        sdk.leaveTopView();
+        modeDisabled.pop();
+        laserModeStack.pop();
+        console.log("pop");
+      };
     },
     children: [
       {
@@ -118,44 +127,43 @@ export const menus: MenuRaw[] = [
         icon: "line",
         text: "基准线",
         key: menuEnum.BASE_LINE,
-        disabled: () => !!baseLines.value.length
+        disabled: () => !!baseLines.value.length,
       },
       {
         defaultSelect: true,
         icon: "point",
         continued: true,
         text: "基准点",
-        key: menuEnum.BASE_POINT
+        key: menuEnum.BASE_POINT,
       },
-    ]
-  }
-]
+    ],
+  },
+];
 
 export const generateMixMenus = <T extends {}, K extends keyof MenuRaw>(
   childKey: K,
   generateFn: (men: MenuRaw) => T,
   mainMenus: MenuRaw[] = menus
 ) => {
-  const itemActiveKey = ref("")
+  const itemActiveKey = ref("");
   return {
     ...generateMixMenusRaw(
-        childKey,
-        generateFn,
-        mainMenus,
-        menu => {
-          if (itemActiveKey.value === menu.key) {
-            itemActiveKey.value = null
-          } else {
-            menu.onClick && menu.onClick()
-            itemActiveKey.value = menu.key
-          }
-
-        },
-        () => itemActiveKey.value
-      ),
-    itemActiveKey
-  }
-}
+      childKey,
+      generateFn,
+      mainMenus,
+      (menu) => {
+        if (itemActiveKey.value === menu.key) {
+          itemActiveKey.value = null;
+        } else {
+          menu.onClick && menu.onClick();
+          itemActiveKey.value = menu.key;
+        }
+      },
+      () => itemActiveKey.value
+    ),
+    itemActiveKey,
+  };
+};
 
 export const findMenuByKey = (value: menuEnum) =>
-  findMenuByAttr(value, 'key', menus)
+  findMenuByAttr(value, "key", menus);

+ 62 - 56
src/views/scene/menus/pane.vue

@@ -1,99 +1,106 @@
 <template>
   <ActionMenus
-      v-if="!store.child.value"
-      class="menus"
-      :class="{level: level === 2}"
-      :menus="store.menus as any"
-      :active-key="store.activeMenuKey.value"
-      dire="column"
+    v-if="!store.child.value"
+    class="menus"
+    :class="{ level: level === 2 }"
+    :menus="store.menus as any"
+    :active-key="store.activeMenuKey.value"
+    dire="column"
   />
   <scene-menus
-      v-if="store.child.value"
-      @back="store.child.value = null"
-      :menus="store.child.value as MenuRaw[]"
-      :level="level + 1"
+    :parentKey="store.activeMenuKey.value"
+    v-if="store.child.value"
+    @back="store.child.value = null"
+    :menus="store.child.value as MenuRaw[]"
+    :level="level + 1"
   />
 </template>
 
 <script lang="ts" setup>
 import ActionMenus from "@/components/group-button/index.vue";
-import {generateMixMenus, MenuRaw, menus, findMenuByKey} from './menus'
-import {joinActions} from './actions'
-import {computed, onMounted, onUnmounted, watchEffect} from "vue";
-import {disabledMap} from "@/hook";
+import { generateMixMenus, MenuRaw, menus, findMenuByKey } from "./menus";
+import { joinActions } from "./actions";
+import { computed, onMounted, onUnmounted, ref, watchEffect } from "vue";
+import { disabledMap, laserModeStack } from "@/hook";
+import { Mode } from "@/sdk";
 
 const props = withDefaults(
-  defineProps<{ menus?: MenuRaw[], level?: number }>(),
-  {level: 1}
-)
+  defineProps<{ menus?: MenuRaw[]; level?: number; parentKey?: string }>(),
+  { level: 1 }
+);
 const emit = defineEmits<{
-  (e: 'back'): void,
-  (e: 'enterChild'): void,
-  (e: 'leaveChild'): void,
+  (e: "back"): void;
+  (e: "enterChild"): void;
+  (e: "leaveChild"): void;
 }>();
 const backMenu = {
   icon: "return",
   text: "",
   key: "back",
-  onClick: () => emit("back")
-}
+  onClick: () => emit("back"),
+};
 
-const menusMix = computed(() =>
-  props.level === 1 ? menus : [backMenu, ...props.menus]
-)
-const store = generateMixMenus(
-  'children',
-  m => m,
-  menusMix.value
-)
+const menusMix = computed(() => (props.level === 1 ? menus : [backMenu, ...props.menus]));
+const store = generateMixMenus("children", (m) => m, menusMix.value);
 
 watchEffect(() => {
-  const menu = findMenuByKey(store.itemActiveKey.value as any)
+  const menu = findMenuByKey(store.itemActiveKey.value as any);
   if (menu?.disabled && menu?.disabled()) {
-    store.itemActiveKey.value = null
+    store.itemActiveKey.value = null;
   }
-})
+});
 
 watchEffect((onCleanup) => {
-  const menu = store.activeMenuKey.value && findMenuByKey(store.activeMenuKey.value)
+  const menu = store.activeMenuKey.value && findMenuByKey(store.activeMenuKey.value);
   if (store.child && menu?.onClick) {
-    const leaveHook = menu.onClick()
-    leaveHook && onCleanup(leaveHook)
+    const leaveHook = menu.onClick();
+    leaveHook && onCleanup(leaveHook);
   } else {
-    onCleanup(() => {})
+    onCleanup(() => {});
   }
-})
+});
 
 if (props.level === 1) {
   watchEffect(() => {
-    disabledMap.photo = !store.child.value?.length
-  })
+    disabledMap.photo = !store.child.value?.length;
+  });
   watchEffect(() => {
     if (store.child.value) {
-      emit('enterChild')
+      emit("enterChild");
     } else {
-      emit('leaveChild')
+      emit("leaveChild");
     }
-  })
+  });
 }
 
-onUnmounted(joinActions(store.itemActiveKey));
+const stopWatch = joinActions(store.itemActiveKey);
+onUnmounted(() => {
+  stopWatch();
+  if (props.parentKey === "measure") {
+    laserModeStack.pop();
+  }
+});
 onMounted(() => {
   if (props.level > 1) {
-    const defaultMenu = props.menus.find(menu => {
-      if (typeof menu.defaultSelect === 'function') {
-        return menu.defaultSelect()
+    const defaultMenu = props.menus.find((menu) => {
+      if (typeof menu.defaultSelect === "function") {
+        return menu.defaultSelect();
       } else {
-        return menu.defaultSelect
+        return menu.defaultSelect;
       }
-    })
-    console.log(defaultMenu)
-    store.itemActiveKey.value = defaultMenu?.key
+    });
+    console.log(defaultMenu);
+    store.itemActiveKey.value = defaultMenu?.key;
     // store.activeMenuKey.value =
+    if (props.parentKey === "measure") {
+      laserModeStack.push(ref(Mode.cloud));
+    }
   }
-})
+});
+</script>
+<script lang="ts">
+export default { name: "scene-menus" };
 </script>
-<script lang="ts"> export default {name: 'scene-menus'}</script>
 
 <style lang="scss" scoped>
 .menus {
@@ -107,7 +114,7 @@ onMounted(() => {
 
 <style lang="scss">
 .level div:first-child {
-  background-color: rgba(255, 255, 255, .3);
+  background-color: rgba(255, 255, 255, 0.3);
   height: 50px;
   width: 50px;
   min-width: 50px;
@@ -125,8 +132,7 @@ onMounted(() => {
     left: 10px;
     right: 10px;
     bottom: -15px;
-    background-color: rgba(255, 255, 255, .2);
-
+    background-color: rgba(255, 255, 255, 0.2);
   }
 }
 </style>

+ 6 - 8
src/views/scene/mode.vue

@@ -2,7 +2,7 @@
   <GroupButton
     class="scene-mode-tabs"
     :menus="menus"
-    :active-key="activeKey"
+    :active-key="customMap.mode"
     v-if="!disabledMap.mode"
   />
 </template>
@@ -29,20 +29,18 @@ const tabs = [
 
 const key = params.m + "model";
 
-const activeKey = ref(Number(localStorage.getItem(key) || 0));
 const menus = computed(() =>
   tabs.map((tab) => ({
-    icon: tab.mode === activeKey.value ? tab.activeIcon : tab.icon,
+    icon: tab.mode === customMap.mode ? tab.activeIcon : tab.icon,
     key: tab.mode,
-    onClick: () => (activeKey.value = tab.mode),
+    onClick: () => (customMap.mode = tab.mode),
   }))
 );
-
+customMap.mode = Number(localStorage.getItem(key)) || Mode.pano;
 watch(
-  activeKey,
+  () => customMap.mode,
   () => {
-    customMap.mode = activeKey.value;
-    localStorage.setItem(key, activeKey.value.toString());
+    localStorage.setItem(key, customMap.mode.toString());
   },
   { immediate: true }
 );