diff --git a/src/core/manager/EnvManager.ts b/src/core/manager/EnvManager.ts index 0364545..cf1022c 100644 --- a/src/core/manager/EnvManager.ts +++ b/src/core/manager/EnvManager.ts @@ -70,7 +70,7 @@ export default class EnvManager { keepalive: 60 }) - await LCC.loadExecutor() + await this.loadExecutorToModel() this.client.on('connect', this.onMqttConnect) this.client.on('message', this.onMqttMessage) @@ -83,6 +83,47 @@ export default class EnvManager { } } + // 加载执行器到3D视图上 + async loadExecutorToModel() { + if (!window['Model']) { + return + } + + const deviceRes = await LCC.queryDeviceInfoList() + if (!deviceRes.success) { + return + } + + const deviceList: AgvStatusVo[] = deviceRes.data || [] + for (const agvState of deviceList) { + const agvItem = Model.find(agvState.id) + if (!agvItem) { + // 还没加载到地图 + const item = JSON.parse(agvState.virtualExecutorPayload) + const pos = Model.getPositionByLogicXY(agvState.logicX, agvState.logicY) + if (pos) { + item.tf[0] = [pos.x, pos.y, agvState.z] + } + switch (_.toLower(agvState.direction)) { + // right=0/left=180/up=90/down=-90 + case 'right': + item.tf[1][1] = 0 // 右侧 + break + case 'left': + item.tf[1][1] = 180 // 左侧 + break + case 'down': + item.tf[1][1] = -90 // 下方 + break + case 'up': + item.tf[1][1] = 90 // 上方 + break + } + Model.createExecutor(item) + } + } + } + async disconnectEnv() { system.showLoading() try { diff --git a/src/core/script/LCCScript.ts b/src/core/script/LCCScript.ts index ab4af78..d2cbb91 100644 --- a/src/core/script/LCCScript.ts +++ b/src/core/script/LCCScript.ts @@ -90,59 +90,59 @@ export default class LCCScript implements LCC { }) } - queryDeviceInfoList(): Promise> { + queryDeviceInfoList(): Promise> { return Request.request.post('/api/workbench/LccController@queryDeviceInfoList', { projectUUID: worldModel.state.project_uuid, envId: worldModel.state.runState.currentEnvId }) } - // 从后台读取所有车 - async loadExecutor(): Promise { - const res = await Request.request.post('/api/workbench/LccController@loadExecutor', { - projectUuid: worldModel.state.project_uuid, - envId: worldModel.state.runState.currentEnvId - }) - - for (const row of res.data) { - const executor_id = row.executor_id - const payload = JSON.parse(row.virtual_executor_payload) - // 车所在的标记位置,及方向 11_4:RIGHT - const [wayPointId, direction] = _.split(row.virtual_location_at, ':') - - if (window['Model']) { - const point = Model.find(wayPointId) - if (!point) { - console.error(`Waypoint with ID ${wayPointId} not found for executor ${executor_id}.`) - continue - } - - const item = _.cloneDeep(payload) - item.id = executor_id - item.tf[0] = _.cloneDeep(point.tf[0]) - switch (_.toLower(direction)) { - // right=0/left=180/up=90/down=-90 - case 'right': - item.tf[1][1] = 0 // 右侧 - break - case 'left': - item.tf[1][1] = 180 // 左侧 - break - case 'down': - item.tf[1][1] = -90 // 下方 - break - case 'up': - item.tf[1][1] = 90 // 上方 - break - } - if (row.virtual_floor_code === worldModel.state.catalogCode) { - Model.createExecutor(item) - } - } - } - - return res.data - } + // // 从后台读取所有车 + // async loadExecutor(): Promise { + // const res = await Request.request.post('/api/workbench/LccController@loadExecutor', { + // projectUuid: worldModel.state.project_uuid, + // envId: worldModel.state.runState.currentEnvId + // }) + // + // for (const row of res.data) { + // const executor_id = row.executor_id + // const payload = JSON.parse(row.virtual_executor_payload) + // // 车所在的标记位置,及方向 11_4:RIGHT + // const [wayPointId, direction] = _.split(row.virtual_location_at, ':') + // + // if (window['Model']) { + // const point = Model.find(wayPointId) + // if (!point) { + // console.error(`Waypoint with ID ${wayPointId} not found for executor ${executor_id}.`) + // continue + // } + // + // const item = _.cloneDeep(payload) + // item.id = executor_id + // item.tf[0] = _.cloneDeep(point.tf[0]) + // switch (_.toLower(direction)) { + // // right=0/left=180/up=90/down=-90 + // case 'right': + // item.tf[1][1] = 0 // 右侧 + // break + // case 'left': + // item.tf[1][1] = 180 // 左侧 + // break + // case 'down': + // item.tf[1][1] = -90 // 下方 + // break + // case 'up': + // item.tf[1][1] = 90 // 上方 + // break + // } + // if (row.virtual_floor_code === worldModel.state.catalogCode) { + // Model.createExecutor(item) + // } + // } + // } + // + // return res.data + // } /** * 脚本打印日志 diff --git a/src/core/script/ModelManager.ts b/src/core/script/ModelManager.ts index 55c1160..3105d63 100644 --- a/src/core/script/ModelManager.ts +++ b/src/core/script/ModelManager.ts @@ -142,6 +142,9 @@ this.viewport.stateManager.update(({ getEntity, putEntity, addEntity }) => { getPositionByLogicXY(logicX: number, logicY: number): THREE.Vector3 { const item = this.viewport.entityManager.findItemByLogicXY(logicX, logicY) + if (!item) { + return null + } const matrix = getMatrixFromTf(item.tf) const position = new THREE.Vector3() matrix.decompose(position, new THREE.Quaternion(), new THREE.Vector3()) diff --git a/src/editor/widgets/monitor/MonitorView.vue b/src/editor/widgets/monitor/MonitorView.vue index 9cc02d0..405b984 100644 --- a/src/editor/widgets/monitor/MonitorView.vue +++ b/src/editor/widgets/monitor/MonitorView.vue @@ -1,11 +1,15 @@