Browse Source

节点删除

master
修宁 7 months ago
parent
commit
5df9ef6943
  1. 62
      src/core/ModelUtils.ts
  2. 15
      src/core/controls/SelectInspect.ts
  3. 2
      src/core/manager/StateManager.ts
  4. 2
      src/runtime/EventBus.ts

62
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() {

15
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)

2
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()

2
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) {

Loading…
Cancel
Save