From 51878c8aa6a4a1f09b5f5d00887eba70c19e6a69 Mon Sep 17 00:00:00 2001 From: luoyifan Date: Thu, 12 Jun 2025 23:40:28 +0800 Subject: [PATCH] =?UTF-8?q?Way=20=E7=82=B9=E4=BD=8D=E7=9A=84=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/ModelUtils.ts | 3 ++- src/core/base/BaseInteraction.ts | 3 ++- src/core/base/BaseRenderer.ts | 13 ++++++++++ src/core/manager/InstanceMeshManager.ts | 10 +++++++ src/example/ExampleUtil.js | 46 +++++++++++++++++++++++++++++++++ src/example/example1.js | 11 +++++--- src/modules/way/WayRenderer.ts | 8 +++--- 7 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index 147ec2d..c6ec134 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -65,7 +65,8 @@ export function getLinkDirection(viewport: Viewport, linkName: string, start: It } - throw new Error(`无法判断 ${start.id} 和 ${end.id} 之间的连接关系`) + // 他们之间没有连接关系 + return { lineId, direction: '' } } export function setUserDataForItem(item: ItemJson, object: Object3DLike) { diff --git a/src/core/base/BaseInteraction.ts b/src/core/base/BaseInteraction.ts index bec6aa2..f41dee6 100644 --- a/src/core/base/BaseInteraction.ts +++ b/src/core/base/BaseInteraction.ts @@ -7,6 +7,7 @@ import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial' import { numberToString } from '@/utils/webutils.ts' import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer' +import type { Object3DLike } from '@/types/ModelTypes.ts' let pdFn, pmFn, puFn @@ -40,7 +41,7 @@ export default abstract class BaseInteraction { // 连线起点 linkStartPointId: string - linkStartPointObject: THREE.Object3D + linkStartPointObject: Object3DLike templineMaterial = new LineMaterial({ color: 0xE63C17, // 主颜色 diff --git a/src/core/base/BaseRenderer.ts b/src/core/base/BaseRenderer.ts index 3b6c42b..5088df4 100644 --- a/src/core/base/BaseRenderer.ts +++ b/src/core/base/BaseRenderer.ts @@ -6,6 +6,7 @@ import InstancePointManager, { PointManageWrap } from '@/core/manager/InstancePo import Constract from '@/core/Constract.ts' import LineSegmentManager, { LineManageWrap } from '@/core/manager/LineSegmentManager.ts' import type { Object3DLike } from '@/types/ModelTypes.ts' +import { InstanceMeshWrap } from '@/core/manager/InstanceMeshManager.ts' /** * 基本渲染器基类 @@ -152,6 +153,18 @@ export default abstract class BaseRenderer { const object = this.tempViewport.entityManager.findObjectById(id) if (object instanceof THREE.Object3D) { this.removeFromScene(object) + + } else if (object instanceof PointManageWrap) { + // 如果是 PointManageWrap, 则需要调用管理器的删除方法 + object.manager.deletePoint(id) + + } else if (object instanceof InstanceMeshWrap) { + // 如果是 PointManageWrap, 则需要调用管理器的删除方法 + object.manager.delete(id) + + } else if (object instanceof LineManageWrap) { + // 如果是 PointManageWrap, 则需要调用管理器的删除方法 + object.manager.deleteLine(id) } this.tempViewport.entityManager.deleteEntityOnly(id) diff --git a/src/core/manager/InstanceMeshManager.ts b/src/core/manager/InstanceMeshManager.ts index 8e550d2..f59a898 100644 --- a/src/core/manager/InstanceMeshManager.ts +++ b/src/core/manager/InstanceMeshManager.ts @@ -2,6 +2,7 @@ import * as THREE from 'three' import type Viewport from '@/core/engine/Viewport.ts' import InstanceMeshBlock from '@/core/manager/InstanceMeshBlock.ts' import { PointManageWrap } from '@/core/manager/InstancePointManager.ts' +import { Matrix4 } from 'three/src/math/Matrix4' export default class InstanceMeshManager { private __uuidMap = new Map() @@ -150,6 +151,15 @@ export class InstanceMeshWrap { name: string visible: boolean + get position(): THREE.Vector3 { + const m = new THREE.Matrix4() + this.manager.blocks[this.blockIndex].instancedMesh.getMatrixAt(this.meshIndex, m) + + const pos = new THREE.Vector3() + m.decompose(pos, new THREE.Quaternion(), new THREE.Vector3()) + return pos + } + constructor(entityId: string, manager: InstanceMeshManager, blockIndex: number, meshIndex: number, userData?: any) { this.uuid = system.createUUID() this.entityId = entityId diff --git a/src/example/ExampleUtil.js b/src/example/ExampleUtil.js index 71fd118..18be015 100644 --- a/src/example/ExampleUtil.js +++ b/src/example/ExampleUtil.js @@ -135,6 +135,52 @@ export function buildAgvPerformanceData(t, rows, cols) { // 与前一个点进行连线 if (row > 0 && col > 0) { const preXNode = data.get('wp_' + (row - 1) + '_' + (col)) + node.dt.in.push(preXNode.id) + preXNode.dt.out.push(node.id) + + const preYNode = data.get('wp_' + (row) + '_' + (col - 1)) + node.dt.in.push(preYNode.id) + preYNode.dt.out.push(node.id) + + } else if (row > 0) { + const preXNode = data.get('wp_' + (row - 1) + '_' + (col)) + node.dt.in.push(preXNode.id) + preXNode.dt.out.push(node.id) + + } else if (col > 0) { + const preYNode = data.get('wp_' + (row) + '_' + (col - 1)) + node.dt.in.push(preYNode.id) + preYNode.dt.out.push(node.id) + } + + } + } + + return Array.from(data.values()) +} + +/** + * 构建AGV性能数据 + * @param rows 行数 + * @param cols 列数 + */ +export function buildCenterLinkPerformanceData(t, rows, cols) { + const spacingX = 1.25 // X轴间距 + const spacingZ = 1.25 // Y轴间距 + + // 创建一个二维数组来存储点阵数据 + const data = new Map() + for (let row = 0; row < rows; row++) { + for (let col = 0; col < cols; col++) { + // 计算每个点的坐标 + const node = createAgvNode(t, row, col) + node.tf[0][0] = row * spacingX + node.tf[0][2] = col * spacingZ + data.set(node.id, node) + + // 与前一个点进行连线 + if (row > 0 && col > 0) { + const preXNode = data.get('wp_' + (row - 1) + '_' + (col)) node.dt.center.push(preXNode.id) preXNode.dt.center.push(node.id) diff --git a/src/example/example1.js b/src/example/example1.js index 462b108..aff836d 100644 --- a/src/example/example1.js +++ b/src/example/example1.js @@ -1,4 +1,4 @@ -import { buildAgvPerformanceData, buildPointPerformanceData, buildRackPerformanceData } from '@/example/ExampleUtil.js' +import { buildAgvPerformanceData, buildCenterLinkPerformanceData, buildPointPerformanceData, buildRackPerformanceData } from '@/example/ExampleUtil.js' export default { project_uuid: 'example1', @@ -391,6 +391,10 @@ export default { items: buildAgvPerformanceData('way', 100, 100) }, { + catalogCode: '__f4', t: 'floor', + items: buildCenterLinkPerformanceData('measure', 100, 100) + }, + { catalogCode: '__f2', t: 'floor', items: buildPointPerformanceData('pallet', 200, 500) }, @@ -552,9 +556,10 @@ export default { { label: '仓库楼层', // 目录分组名 items: [ + { catalogCode: '__f1', label: '路径压力测试 (-f1)' }, + { catalogCode: '__f2', label: '箱子压力测试 (-f2)' }, { catalogCode: '__f3', label: '货架压力测试 (-f3)' }, - { catalogCode: '__f2', label: '箱子压力测试 (-f2)' }, // 目录项 - { catalogCode: '__f1', label: '路径压力测试 (-f1)' }, // 目录项 + { catalogCode: '__f4', label: '标尺压力测试 (-f4)' }, { catalogCode: 'f1', label: '一楼 (f1)' }, { catalogCode: 'f2', label: '二楼 (f2)' }, { catalogCode: 'f3', label: '三楼 (f3)' }, diff --git a/src/modules/way/WayRenderer.ts b/src/modules/way/WayRenderer.ts index e89f527..a240aad 100644 --- a/src/modules/way/WayRenderer.ts +++ b/src/modules/way/WayRenderer.ts @@ -106,7 +106,7 @@ export default class WayRenderer extends BaseRenderer { if (start.t === this.itemTypeName && end.t === this.itemTypeName) { return this._createOrUpdateGuideway(start, end, type) } else { - throw new Error('目前只支持二维码站点之间的连接') + // throw new Error('目前只支持二维码站点之间的连接') } } @@ -116,7 +116,7 @@ export default class WayRenderer extends BaseRenderer { this._createOrUpdateGuideway(start, end, type) } else { - throw new Error('目前只支持二维码站点之间的连接') + // throw new Error('目前只支持二维码站点之间的连接') } } @@ -215,7 +215,7 @@ export default class WayRenderer extends BaseRenderer { deleteLine(start: ItemJson, end: ItemJson, type: LinkType, option?: RendererCudOption) { - if (start.t === this.itemTypeName && end.t === this.itemTypeName) { + if ((start.t === this.itemTypeName || start.t === 'unknown') && (end.t === this.itemTypeName || end.t === 'unknown')) { // 二维码站点之间的连接 const lineId = getCargoLineId(WayRenderer.GUIDEWAY_LINE_NAME, start.id, end.id) const object = this.tempViewport.entityManager.findLineObjectById(lineId) @@ -233,7 +233,7 @@ export default class WayRenderer extends BaseRenderer { this.tempViewport.entityManager.deleteLineObjectOnly(lineId) } else { - throw new Error('目前只支持二维码站点之间的连接') + // throw new Error('目前只支持二维码站点之间的连接') } }