|
@@ -1,26 +1,27 @@
|
|
<template>
|
|
<template>
|
|
<RightFillPano>
|
|
<RightFillPano>
|
|
- <ui-group :title="`${tagging?.title}放置位置`" class="position-group">
|
|
|
|
|
|
+ <h3>{{ tagging?.title }}放置位置</h3>
|
|
|
|
+ <Collapse v-model:activeKey="showId" ghost accordion expandIconPosition="end">
|
|
<PositionSign
|
|
<PositionSign
|
|
v-for="(position, i) in positions"
|
|
v-for="(position, i) in positions"
|
|
:key="position.id"
|
|
:key="position.id"
|
|
:position="position"
|
|
:position="position"
|
|
:title="`位置${i + 1}`"
|
|
:title="`位置${i + 1}`"
|
|
|
|
+ @applyGlobal="(keys) => applyGlobal(position, keys)"
|
|
@delete="deletePosition(position)"
|
|
@delete="deletePosition(position)"
|
|
- @fixed="flyTaggingPosition(position)"
|
|
|
|
/>
|
|
/>
|
|
- </ui-group>
|
|
|
|
|
|
+ </Collapse>
|
|
</RightFillPano>
|
|
</RightFillPano>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
import PositionSign from "./sign.vue";
|
|
import PositionSign from "./sign.vue";
|
|
import { router } from "@/router";
|
|
import { router } from "@/router";
|
|
-import { Message } from "bill/index";
|
|
|
|
|
|
+import { Dialog, Message } from "bill/index";
|
|
import { RightFillPano } from "@/layout";
|
|
import { RightFillPano } from "@/layout";
|
|
import { asyncTimeout } from "@/utils";
|
|
import { asyncTimeout } from "@/utils";
|
|
import { useViewStack } from "@/hook";
|
|
import { useViewStack } from "@/hook";
|
|
-import { computed, nextTick, ref, watchEffect } from "vue";
|
|
|
|
|
|
+import { computed, nextTick, onUnmounted, ref, watch, watchEffect } from "vue";
|
|
import { sdk } from "@/sdk";
|
|
import { sdk } from "@/sdk";
|
|
import { showTaggingPositionsStack } from "@/env";
|
|
import { showTaggingPositionsStack } from "@/env";
|
|
import {
|
|
import {
|
|
@@ -33,29 +34,38 @@ import {
|
|
getTagging,
|
|
getTagging,
|
|
enterEdit,
|
|
enterEdit,
|
|
} from "@/store";
|
|
} from "@/store";
|
|
|
|
+import { Collapse, CollapsePanel } from "ant-design-vue";
|
|
|
|
|
|
import type { TaggingPosition } from "@/store";
|
|
import type { TaggingPosition } from "@/store";
|
|
import { distance } from "@/utils/math";
|
|
import { distance } from "@/utils/math";
|
|
|
|
|
|
|
|
+const showId = ref<TaggingPosition["id"]>();
|
|
const tagging = computed(() => getTagging(router.currentRoute.value.params.id as string));
|
|
const tagging = computed(() => getTagging(router.currentRoute.value.params.id as string));
|
|
const positions = computed(() => tagging.value && getTaggingPositions(tagging.value));
|
|
const positions = computed(() => tagging.value && getTaggingPositions(tagging.value));
|
|
|
|
|
|
|
|
+watch(showId, (id) => {
|
|
|
|
+ const position = positions.value?.find((item) => item.id === id);
|
|
|
|
+ position && flyTaggingPosition(position);
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+let pop: () => void;
|
|
const flyTaggingPosition = (position: TaggingPosition) => {
|
|
const flyTaggingPosition = (position: TaggingPosition) => {
|
|
|
|
+ pop && pop();
|
|
const model = getFuseModel(position.modelId);
|
|
const model = getFuseModel(position.modelId);
|
|
if (!model || !getFuseModelShowVariable(model).value) {
|
|
if (!model || !getFuseModelShowVariable(model).value) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- const pop = showTaggingPositionsStack.push(ref(new WeakSet([position])));
|
|
|
|
|
|
+ pop = showTaggingPositionsStack.push(ref(new WeakSet([position])));
|
|
sdk.comeTo({
|
|
sdk.comeTo({
|
|
position: position.localPos,
|
|
position: position.localPos,
|
|
modelId: position.modelId,
|
|
modelId: position.modelId,
|
|
dur: 300,
|
|
dur: 300,
|
|
distance: 3,
|
|
distance: 3,
|
|
});
|
|
});
|
|
-
|
|
|
|
- setTimeout(pop, 2000);
|
|
|
|
|
|
+ // setTimeout(pop, 2000);
|
|
};
|
|
};
|
|
|
|
+onUnmounted(() => pop && pop());
|
|
|
|
|
|
const deletePosition = (position: TaggingPosition) => {
|
|
const deletePosition = (position: TaggingPosition) => {
|
|
const index = taggingPositions.value.indexOf(position);
|
|
const index = taggingPositions.value.indexOf(position);
|
|
@@ -64,8 +74,25 @@ const deletePosition = (position: TaggingPosition) => {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
-const cameraPos = ref<SceneLocalPos>();
|
|
|
|
-sdk.sceneBus.on("cameraChange", (pos) => (cameraPos.value = pos));
|
|
|
|
|
|
+const applyGlobal = async (position: TaggingPosition, keys: string | string[]) => {
|
|
|
|
+ if (!(await Dialog.confirm("确定要将此属性应用到所有位置?"))) return;
|
|
|
|
+ keys = Array.isArray(keys) ? keys : [keys];
|
|
|
|
+ for (const current of positions.value!) {
|
|
|
|
+ let val: any = current;
|
|
|
|
+ let newVal: any = position;
|
|
|
|
+ for (let i = 0; i < keys.length; i++) {
|
|
|
|
+ if (i === keys.length - 1) {
|
|
|
|
+ val[keys[i]] = newVal[keys[i]];
|
|
|
|
+ } else {
|
|
|
|
+ val = val[keys[i]];
|
|
|
|
+ newVal = newVal[keys[i]];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+// const cameraPos = ref<SceneLocalPos>();
|
|
|
|
+// sdk.sceneBus.on("cameraChange", (pos) => (cameraPos.value = pos));
|
|
|
|
|
|
watchEffect((onCleanup) => {
|
|
watchEffect((onCleanup) => {
|
|
if (tagging.value) {
|
|
if (tagging.value) {
|
|
@@ -86,9 +113,10 @@ watchEffect((onCleanup) => {
|
|
});
|
|
});
|
|
taggingPositions.value.push(storePosition);
|
|
taggingPositions.value.push(storePosition);
|
|
|
|
|
|
- if (cameraPos.value && distance(cameraPos.value, position.worldPos) > 8) {
|
|
|
|
- flyTaggingPosition(storePosition);
|
|
|
|
- }
|
|
|
|
|
|
+ showId.value = storePosition.id;
|
|
|
|
+ // if (cameraPos.value && distance(cameraPos.value, position.worldPos) > 8) {
|
|
|
|
+ // flyTaggingPosition(storePosition);
|
|
|
|
+ // }
|
|
}
|
|
}
|
|
};
|
|
};
|
|
sdk.layout.addEventListener("click", clickHandler, false);
|
|
sdk.layout.addEventListener("click", clickHandler, false);
|
|
@@ -106,7 +134,15 @@ useViewStack(() => {
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|
|
|
|
|
|
-<style lang="scss" scoped src="./style.scss"></style>
|
|
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+h3 {
|
|
|
|
+ font-family: Microsoft YaHei, Microsoft YaHei;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ font-size: 16px;
|
|
|
|
+ color: #999999;
|
|
|
|
+ margin-bottom: 4px;
|
|
|
|
+}
|
|
|
|
+</style>
|
|
<style lang="scss">
|
|
<style lang="scss">
|
|
.position-group .group-title {
|
|
.position-group .group-title {
|
|
margin-bottom: 0;
|
|
margin-bottom: 0;
|