diff --git a/src/model/ModelUtils.ts b/src/model/ModelUtils.ts index 4bd21f5..31c01c4 100644 --- a/src/model/ModelUtils.ts +++ b/src/model/ModelUtils.ts @@ -26,7 +26,7 @@ export function deletePointByKeyboard() { return } - if(!selectedObject.userData?.type){ + if (!selectedObject.userData?.type) { system.msg('选中的对象没有类型信息') return } @@ -77,7 +77,7 @@ export function quickCopyByMouse() { // console.log('intersections:', intersections) // 如果不在线上,查找0.2米内的有效点 Object3D, 如果有,则以这个点为起点, 延伸同类型的点,并让他们相连 - findObject3DByCondition(viewport.scene, object => { + const r = findObject3DByCondition(viewport.scene, object => { // 判断 object 是否是有效的 Object3D, 并且是当前 viewport 的对象 if (object instanceof THREE.Object3D && object.visible && object.userData.type && viewport.toolbox[object.userData.type]) { @@ -97,6 +97,11 @@ export function quickCopyByMouse() { } return false }) + + if (!r || r.length === 0) { + system.msg('鼠标所在位置,没有可复制的对象') + return + } } // @@ -181,6 +186,19 @@ export function calcPositionUseSnap(e: MouseEvent, point: THREE.Vector3) { return point } +export function getAllControlPoints(): THREE.Object3D[] { + const allPoints: THREE.Object3D[] = [] + + getAllItemTypes().forEach((itemType: ItemTypeDefineOption) => { + if (itemType.clazz && itemType.clazz.pointArray) { + // 将每个 ItemType 的点添加到结果数组中 + allPoints.push(...itemType.clazz.pointArray) + } + }) + + return allPoints +} + /** * 在给定的场景中查找具有指定 uuid 的 Object3D 对象 */ diff --git a/src/model/itemType/ToolboxLine.ts b/src/model/itemType/ToolboxLine.ts index 60857d3..7a07543 100644 --- a/src/model/itemType/ToolboxLine.ts +++ b/src/model/itemType/ToolboxLine.ts @@ -1,7 +1,7 @@ import * as THREE from 'three' import Toolbox from '@/model/itemType/Toolbox.ts' import type ItemTypeLine from '@/model/itemType/ItemTypeLine.ts' -import { findObject3DById } from '@/model/ModelUtils.ts' +import { findObject3DById, getAllControlPoints } from '@/model/ModelUtils.ts' import EventBus from '@/runtime/EventBus' /** @@ -24,13 +24,13 @@ export default class ToolboxLine extends Toolbox { afterMoveTemplateLine(line: THREE.Mesh, startPoint: THREE.Object3D, endPoint: THREE.Object3D) { } - afterDeleteLine(line: THREE.Object3D, point: THREE.Object3D, relationPointIds: string[]) { + afterDeleteLine(line: THREE.Object3D, point: THREE.Object3D) { } stop() { super.stop() - this.tempLine && this.viewport.scene.remove(this.tempLine) + this.tempLine && this.removeFromScene(this.tempLine) this.tempLine = undefined } @@ -44,9 +44,9 @@ export default class ToolboxLine extends Toolbox { * 删除点 */ deletePoint(point: THREE.Object3D) { - const relationPointIds = [] + const allPoints = getAllControlPoints() - const deletedPoints = _.remove(this.itemType.pointArray, (p) => p.uuid === point.uuid) + const deletedPoints = _.remove(getAllControlPoints(), (p) => p.uuid === point.uuid) if (!deletedPoints || deletedPoints.length !== 1) { console.warn('没有找到要删除的点:', point.uuid) return @@ -62,15 +62,10 @@ export default class ToolboxLine extends Toolbox { } // 找出与这个点相关的其他点 - this.itemType.pointArray.forEach(p => { + allPoints.forEach(p => { if (p.userData.center) { - relationPointIds.push(..._.filter(p.userData.center, i => i === point.uuid)) _.remove(p.userData.center, i => i === point.uuid) - - relationPointIds.push(..._.filter(p.userData.in, i => i === point.uuid)) _.remove(p.userData.in, i => i === point.uuid) - - relationPointIds.push(..._.filter(p.userData.out, i => i === point.uuid)) _.remove(p.userData.out, i => i === point.uuid) } }) @@ -79,7 +74,7 @@ export default class ToolboxLine extends Toolbox { _.forEach(point.userData.lines, (line) => { const lineObject = findObject3DById(this.viewport.scene, line) this.removeFromScene(lineObject) - this.afterDeleteLine(lineObject, point, relationPointIds) + this.afterDeleteLine(lineObject, point) }) // 从场景中删除点 @@ -136,7 +131,7 @@ export default class ToolboxLine extends Toolbox { if (this.startPoint) { this.afterAddPoint(this.startPoint, catchPoint) } - this.tempLine && this.viewport.scene.remove(this.tempLine) + this.tempLine && this.removeFromScene(this.tempLine) this.tempLine = undefined return } @@ -147,7 +142,7 @@ export default class ToolboxLine extends Toolbox { return } - this.tempLine && this.viewport.scene.remove(this.tempLine) + this.tempLine && this.removeFromScene(this.tempLine) this.tempLine = undefined return r } diff --git a/src/model/itemType/measure/MeasureToolbox.ts b/src/model/itemType/measure/MeasureToolbox.ts index f68fe44..a40b908 100644 --- a/src/model/itemType/measure/MeasureToolbox.ts +++ b/src/model/itemType/measure/MeasureToolbox.ts @@ -29,7 +29,7 @@ export default class MeasureToolbox extends ToolboxLine { super.stop() // 清除临时标签 - this.tempLabel && this.viewport.scene.remove(this.tempLabel) + this.tempLabel && this.removeFromScene(this.tempLabel) this.tempLabel = undefined } @@ -39,7 +39,7 @@ export default class MeasureToolbox extends ToolboxLine { return } - this.tempLabel && this.viewport.scene.remove(this.tempLabel) + this.tempLabel && this.removeFromScene(this.tempLabel) this.tempLabel = undefined } @@ -51,10 +51,6 @@ export default class MeasureToolbox extends ToolboxLine { this.measure.group.add(object) } - removeFromScene(object: THREE.Object3D) { - this.measure.group.remove(object) - } - afterMoveTemplateLine(line: THREE.Mesh, startPoint: THREE.Object3D, endPoint: THREE.Object3D) { super.afterMoveTemplateLine(line, startPoint, endPoint) @@ -67,8 +63,8 @@ export default class MeasureToolbox extends ToolboxLine { this.addOrUpdateTempLabel(line, label, position) } - afterDeleteLine(line: THREE.Object3D, point: THREE.Object3D, relationPointIds: string[]) { - super.afterDeleteLine(line, point, relationPointIds) + afterDeleteLine(line: THREE.Object3D, point: THREE.Object3D) { + super.afterDeleteLine(line, point) // 删除临时标签 if (line?.userData?.labelId) {