From 5df9ef6943d800d42d417e7728788131623bf11d Mon Sep 17 00:00:00 2001 From: yvan Date: Tue, 3 Jun 2025 00:23:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/ModelUtils.ts | 62 ++++++++++++++++++-------------------- src/core/controls/SelectInspect.ts | 15 +++++++-- src/core/manager/StateManager.ts | 2 +- src/runtime/EventBus.ts | 2 +- 4 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index a28e093..1712690 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -5,6 +5,7 @@ import type Viewport from '@/core/engine/Viewport' import { computeBoundsTree, disposeBoundsTree } from 'three-mesh-bvh' import { Vector2 } from 'three/src/math/Vector2' import type Toolbox from '@/model/itemType/Toolbox.ts' +import EventBus from '@/runtime/EventBus.ts' /** * 确保所有实体之间的关系满足一致性: @@ -113,38 +114,35 @@ export function parseLineId(lineId): [LinkType, string, string] { } export function deletePointByKeyboard() { - system.msg('Delete not impleted yet') - // const viewport: Viewport = window['viewport'] - // if (!viewport) { - // system.msg('没有找到当前视图') - // return - // } - // - // // 按下 Delete 键,删除当前选中的点 - // if (!viewport.state.selectedObject) { - // system.msg('没有选中任何点') - // return - // } - // - // const selectedObject = viewport.state.selectedObject - // if (!(selectedObject instanceof THREE.Object3D)) { - // system.msg('选中的对象不是有效的点') - // return - // } - // - // if (!selectedObject.userData?.type) { - // system.msg('选中的对象没有类型信息') - // return - // } - // - // const toolbox: Toolbox = viewport.toolbox[selectedObject.userData.type] - // if (!toolbox) { - // system.msg('没有找到对应的工具箱') - // return - // } - // - // viewport.state.cursorMode = 'normal' - // toolbox.deletePoint(selectedObject) + const viewport: Viewport = window['viewport'] + if (!viewport) { + system.msg('没有找到当前视图') + return + } + + const entityId = viewport.state.selectedEntityId + if (!entityId) { + system.msg('没有选中任何点') + return + } + + const stateManager = viewport.stateManager + viewport.stateManager.beginStateUpdate() + _.remove(stateManager.vdata.items, (item) => item.id === entityId) + viewport.stateManager.endStateUpdate() + + if (viewport.state.selectedEntityId === entityId) { + viewport.state.selectedObject = undefined + viewport.state.selectedItem = undefined + viewport.state.selectedEntityId = undefined + viewport.state.selectedObjectMeta = undefined + } + + EventBus.dispatch('entityDeleted', { + deleteEntityId: entityId + }) + + system.msg('删除完成') } export function escByKeyboard() { diff --git a/src/core/controls/SelectInspect.ts b/src/core/controls/SelectInspect.ts index 49feb42..3395731 100644 --- a/src/core/controls/SelectInspect.ts +++ b/src/core/controls/SelectInspect.ts @@ -1,11 +1,9 @@ import * as THREE from 'three' import type IControls from './IControls' -import { watch } from 'vue' import type Viewport from '@/core/engine/Viewport' import { Line2 } from 'three/examples/jsm/lines/Line2.js' import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' -import { getItemTypeByName } from '@/model/itemType/ItemTypeDefine.ts' import EventBus from '@/runtime/EventBus' let pdFn, pmFn, puFn @@ -66,6 +64,15 @@ export default class SelectInspect implements IControls { EventBus.on('selectedObjectChanged', (data) => { this.updateSelectionBox(this.viewport.state.selectedObject) }) + + EventBus.on('entityDeleted', (data) => { + const id = data.deleteEntityId + + // 如果删除的是当前选中对象,则清除选中状态 + if (this.viewport.state.selectedEntityId === id) { + this.updateSelectionBox(null) + } + }) } /** @@ -74,6 +81,10 @@ export default class SelectInspect implements IControls { updateSelectionBox(selectedObject: THREE.Object3D) { this.disposeSelectionBox() + if (!selectedObject) { + return + } + const expandAmount = 0.2 // 扩展包围盒的大小 // 避免某些蒙皮网格的帧延迟效应(e.g. Michelle.glb) selectedObject.updateWorldMatrix(false, true) diff --git a/src/core/manager/StateManager.ts b/src/core/manager/StateManager.ts index ed5d569..6fda8b3 100644 --- a/src/core/manager/StateManager.ts +++ b/src/core/manager/StateManager.ts @@ -424,7 +424,7 @@ export default class StateManager { * @private */ private fullSync() { - + // 修补关系数据, 确保 center / in / out 关系满足一致性 this.vdata.items = ensureEntityRelationsConsistency(this.vdata.items) this.entityManager.beginEntityUpdate() diff --git a/src/runtime/EventBus.ts b/src/runtime/EventBus.ts index b64515c..46ca995 100644 --- a/src/runtime/EventBus.ts +++ b/src/runtime/EventBus.ts @@ -2,7 +2,7 @@ import mitt from 'mitt' const instance = mitt() -export type DispatchNames = 'selectedObjectChanged' | 'catalogChanged' | 'dataLoadComplete' +export type DispatchNames = 'selectedObjectChanged' | 'catalogChanged' | 'dataLoadComplete' | 'entityDeleted' export default { dispatch(name: DispatchNames, data?: any) {