From 4ed9cde2a5257d6fe9ae76e2fe09c590eabb6049 Mon Sep 17 00:00:00 2001 From: yvan Date: Mon, 28 Jul 2025 23:06:51 +0800 Subject: [PATCH] =?UTF-8?q?AGV=20ID=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/ModelUtils.ts | 6 +++- src/core/manager/EnvManager.ts | 11 +++--- src/core/manager/amr/AmrMessageManager.ts | 6 ++-- src/core/script/ModelManager.ts | 41 +++++++++++++++------- src/editor/widgets/monitor/MonitorView.vue | 5 ++- src/modules/amr/ptr/PtrObject.ts | 55 +++++++++++++++--------------- src/types/Model.d.ts | 3 +- 7 files changed, 77 insertions(+), 50 deletions(-) diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index 8dea151..2ef5ee2 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -16,6 +16,10 @@ import LineSegmentManager from '@/core/manager/LineSegmentManager.ts' import type InstanceMeshManager from '@/core/manager/InstanceMeshManager.ts' import { MeshWrap } from '@/core/manager/InstanceMeshManager.ts' +export function getAgvItemNameById(agvId: string | number) { + return 'AGV_' + agvId +} + /** * 计算点集凸包(2D) */ @@ -292,7 +296,7 @@ export function processModel(mesh: THREE.Mesh) { -center.z ) geometry.applyMatrix4(translate) - geometry.computeVertexNormals(); + geometry.computeVertexNormals() // 可选:验证最终包围盒 //@ts-ignore diff --git a/src/core/manager/EnvManager.ts b/src/core/manager/EnvManager.ts index 2b88fee..bb915fa 100644 --- a/src/core/manager/EnvManager.ts +++ b/src/core/manager/EnvManager.ts @@ -5,6 +5,7 @@ import type { ErrorWithReasonCode } from 'mqtt/src/lib/shared.ts' import { Request } from '@ease-forge/shared' import AmrMessageManager from '@/core/manager/amr/AmrMessageManager' import { AmrMsg } from '@/core/manager/amr/AmrMessageDefine' +import { getAgvItemNameById } from '@/core/ModelUtils.ts' export default class EnvManager { private amrMessageManager: AmrMessageManager = new AmrMessageManager() @@ -100,7 +101,7 @@ export default class EnvManager { * 处理设备状态消息 */ onDeviceStatusMessage(type, topic, data: AgvStatusVo) { - const object3D = Model.find3D(data.id) + const object3D = Model.find3D(getAgvItemNameById(data.id)) if (object3D) { object3D.agvStatusVo = data } @@ -134,7 +135,7 @@ export default class EnvManager { if (body.after != null) { // 将托盘挪到目标位置 const after = body.after - Model.createInv('pallet', body.lpn, after.rack, after.bay, after.level, after.cell) + Model.createInv('pallet', body.lpn, after.rack, after.bay, after.level, after.cell, after.locCode) } } @@ -157,7 +158,7 @@ export default class EnvManager { const lpn = row.lpn // : "LPN1" const rack = row.rack // : "rack1" const container_type = row.container_type // : "pallet" - Model.createInv(container_type, lpn, rack, bay, level, cell) + Model.createInv(container_type, lpn, rack, bay, level, cell, loc_code) } } @@ -174,7 +175,7 @@ export default class EnvManager { const deviceList: AgvStatusVo[] = deviceRes.data || [] for (const agvState of deviceList) { - const agvItem = Model.find(agvState.id) + const agvItem = Model.find(getAgvItemNameById(agvState.id)) if (!agvItem) { // 还没加载到地图 const item = JSON.parse(agvState.virtualExecutorPayload) @@ -197,6 +198,8 @@ export default class EnvManager { item.tf[1][1] = 90 // 上方 break } + item.id = getAgvItemNameById(agvState.id) + item.dt.vehicleId = agvState.id Model.createExecutor(item) } } diff --git a/src/core/manager/amr/AmrMessageManager.ts b/src/core/manager/amr/AmrMessageManager.ts index da1e117..eef8591 100644 --- a/src/core/manager/amr/AmrMessageManager.ts +++ b/src/core/manager/amr/AmrMessageManager.ts @@ -1,6 +1,7 @@ import {AmrMsg, AmrMsg10010, AmrMsg10050, AmrMsg10060, AmrMsg10110, AmrMsg10120, AmrMsg20000Base, AmrMsg20020, AmrMsg20060} from '@/core/manager/amr/AmrMessageDefine' import Cl23dObject from '@/modules/amr/ptr/cl2/Cl23dObject' import Viewport from '@/core/engine/Viewport' +import { getAgvItemNameById } from '@/core/ModelUtils.ts' export default class AmrMessageManager { @@ -9,9 +10,8 @@ export default class AmrMessageManager { } handleMessage(topic, amrMsg: AmrMsg) { - const vehicleId = parseInt(topic.replace('/wcs_server/', '')) - const amrItem = this.viewport.entityManager.findObjectById(vehicleId + '') as Cl23dObject + const amrItem = Model.find3D(getAgvItemNameById(vehicleId)) as Cl23dObject switch (amrMsg.id) { // AMR作业指令 10010 case 10010: @@ -64,7 +64,7 @@ export default class AmrMessageManager { handleStatusMessage(topic, amrMsg: AmrMsg) { const vehicleId = amrMsg.content.VehicleId - const amrItem = this.viewport.entityManager.findObjectById(vehicleId + '') as Cl23dObject + const amrItem = Model.find3D(getAgvItemNameById(vehicleId)) as Cl23dObject switch (amrMsg.id) { case 20020: amrItem.handle20020Message(amrMsg.content as AmrMsg20020) diff --git a/src/core/script/ModelManager.ts b/src/core/script/ModelManager.ts index d5bfc05..03a19a0 100644 --- a/src/core/script/ModelManager.ts +++ b/src/core/script/ModelManager.ts @@ -17,12 +17,12 @@ export default class ModelManager implements IControls, Model { } getClx(id: string): ClxIf { - throw new Error("不支持 ClxIf"); + throw new Error('不支持 ClxIf') // return new ClxEntity(this.viewport, id) } getFm600(id: string): Fm600If { - throw new Error("不支持 Fm600If"); + throw new Error('不支持 Fm600If') // return new FM600Entity(this.viewport, id) } @@ -113,18 +113,33 @@ export default class ModelManager implements IControls, Model { this.viewport.runtimeManager.addEntity(item) } - createInv(boxType: ContainerT, lpn: string, rack: string, bay?: number, level?: number, cell?: number): void { + createInv(boxType: ContainerT, lpn: string, rack: string, bay?: number, level?: number, cell?: number, locCode?: string): void { const scale = getRenderer(boxType).defaultScale - this.viewport.runtimeManager.addEntity({ - id: lpn, - t: boxType as string, - tf: [[-5000, -1, 0], [0, 0, 0], [scale.x, scale.y, scale.z]], - v: true, - dt: { - in: [], out: [], center: [], - storeAt: { item: rack, bay, level, cell } - } - }) + if (_.startsWith(locCode, 'AGV_')) { + // 库存在 AGV 上 + this.viewport.runtimeManager.addEntity({ + id: lpn, + t: boxType as string, + tf: [[-5000, -1, 0], [0, 0, 0], [scale.x, scale.y, scale.z]], + v: true, + dt: { + in: [], out: [], center: [], + storeAt: { item: locCode, bay, level, cell } + } + }) + + }else { + this.viewport.runtimeManager.addEntity({ + id: lpn, + t: boxType as string, + tf: [[-5000, -1, 0], [0, 0, 0], [scale.x, scale.y, scale.z]], + v: true, + dt: { + in: [], out: [], center: [], + storeAt: { item: rack, bay, level, cell } + } + }) + } // 这一段代码不要删除,他是用向正式环境提交数据用的 /* diff --git a/src/editor/widgets/monitor/MonitorView.vue b/src/editor/widgets/monitor/MonitorView.vue index f98a528..cb360e3 100644 --- a/src/editor/widgets/monitor/MonitorView.vue +++ b/src/editor/widgets/monitor/MonitorView.vue @@ -73,6 +73,7 @@