diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index d804e7d..3af8535 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -632,6 +632,7 @@ export function load3DModule(arrayBuffer: ArrayBuffer | string, ext: string) { } } + /** * 根据 ItemJson 数据结构, 构建适合 THREE.js 的变换矩阵 */ diff --git a/src/core/base/BaseItemEntity.ts b/src/core/base/BaseItemEntity.ts index d313181..68689c6 100644 --- a/src/core/base/BaseItemEntity.ts +++ b/src/core/base/BaseItemEntity.ts @@ -261,25 +261,16 @@ export default abstract class BaseEntity implements EntityIf, Loadable, Carry, W level: level, cell: cell } - const rack = Model.find(storeItemId) - const rackRenderer = getRenderer(rack.t) + const itemRenderer = getRenderer(item.t) - if (!rackRenderer) { - throw new Error(`Renderer for type ${item.t} not found`) - } if (!itemRenderer) { throw new Error(`Renderer for type ${item.t} not found`) } - const { position, rotation } = rackRenderer.getStorePlacement(this.viewport, item) - if (!position || !rotation) { - throw new Error(`无法获取物品 ${item.id} 的存储位置`) - } - this.getArmObject().clear() itemRenderer.tempViewport = this.viewport - itemRenderer.createOrUpdatePointForRuntime(item, position, rotation) + itemRenderer.createOrUpdatePointForRuntime(item) itemRenderer.tempViewport = null } } diff --git a/src/core/base/BaseRenderer.ts b/src/core/base/BaseRenderer.ts index cb22f7a..972bbd2 100644 --- a/src/core/base/BaseRenderer.ts +++ b/src/core/base/BaseRenderer.ts @@ -5,6 +5,7 @@ import { Line2 } from 'three/examples/jsm/lines/Line2' import { LineWrap } from '@/core/manager/LineSegmentManager.ts' import type { LineLike, Object3DLike } from '@/types/ModelTypes.ts' import { MeshWrap } from '@/core/manager/InstanceMeshManager.ts' +import { getRenderer } from '@/core/manager/ModuleManager.ts' /** * 基本渲染器基类 @@ -95,8 +96,6 @@ export default abstract class BaseRenderer { } this.tempViewport.scene.add(...objects) - // const dragObjects = objects.filter(obj => !!obj.userData.draggable) - //this.tempViewport.dragManager.setDragObjects(dragObjects, 'push') } removeFromScene(...objects: THREE.Object3D[]) { @@ -119,8 +118,8 @@ export default abstract class BaseRenderer { return point } - createOrUpdatePointForRuntime(item: ItemJson, position: THREE.Vector3, rotation: THREE.Quaternion): Object3DLike { - const option = { isRuntime: true, position, rotation } + createOrUpdatePointForRuntime(item: ItemJson): Object3DLike { + const option = { isRuntime: true } return this.createPointForEntity(item, option) } @@ -133,25 +132,44 @@ export default abstract class BaseRenderer { // 由基础类创造一个属于自己的点演示 const point = this.createPointBasic(item, option) let matrix = getMatrixFromTf(item.tf) - if (option?.position instanceof THREE.Vector3 && option?.rotation instanceof THREE.Quaternion) { + + if (item.dt.storeAt?.item) { + // 如果是库存物品, 则需要将位置和角度设置为库存位置 + const rack = this.tempViewport.stateManager.findItemById(item.dt.storeAt?.item) + if (!rack) { + console.error(`Cannot find rack for item ${item.id} at ${item.dt.storeAt?.item}`) + } + const rackRenderer = getRenderer(rack.t) + if (!rackRenderer) { + console.error(`Cannot find renderer for rack type ${rack.t}`) + } + const { position, rotation } = rackRenderer.getStorePlacement(this.tempViewport, item) + if (!position || !rotation) { + console.error(`无法获取物品 ${item.id} 的存储位置`) + } + + option.position = position + option.rotation = rotation + } + + if (_.isArray(option?.position) && _.isArray(option?.rotation)) { matrix = new THREE.Matrix4() matrix.compose( - option.position, - option.rotation, + new THREE.Vector3(option.position[0], option.position[1], option.position[2]), + new THREE.Quaternion().setFromEuler(new THREE.Euler( + THREE.MathUtils.degToRad(option?.rotation[0]), + THREE.MathUtils.degToRad(option?.rotation[1]), + THREE.MathUtils.degToRad(option?.rotation[2]), + 'XYZ' + )), new THREE.Vector3(item.tf[2][0], item.tf[2][1], item.tf[2][2]) ) + // 回写 item 数据 + item.tf[0] = _.cloneDeep(option.position) + item.tf[1] = _.cloneDeep(option.rotation) } - point.setMatrix4(matrix) - // point.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - // - // point.rotation.set( - // THREE.MathUtils.degToRad(item.tf[1][0]), - // THREE.MathUtils.degToRad(item.tf[1][1]), - // THREE.MathUtils.degToRad(item.tf[1][2]) - // ) - // - // point.scale.set(item.tf[2][0], item.tf[2][1], item.tf[2][2]) + point.setMatrix4(matrix) point.visible = ((typeof item.v !== 'undefined') ? item.v : true) return point @@ -267,7 +285,8 @@ export default abstract class BaseRenderer { * 获取物品存放位 * 获取物品存储到地堆货位中,返回可存放的位置和角度一个 Position 和 Rotation */ - getStorePlacement(viewport: Viewport, item: ItemJson): { position: THREE.Vector3, rotation: THREE.Quaternion } { + getStorePlacement(viewport: Viewport, item: ItemJson) + : { position: [number, number, number], rotation: [number, number, number] } { throw new Error(' 不支持库存物品的添加. t=' + this.itemTypeName) } diff --git a/src/core/manager/ModuleManager.ts b/src/core/manager/ModuleManager.ts index 26092ce..c7328de 100644 --- a/src/core/manager/ModuleManager.ts +++ b/src/core/manager/ModuleManager.ts @@ -13,7 +13,6 @@ export interface ModuleDefineOption { renderer?: BaseRenderer; interaction?: BaseInteraction; setter?: PropertySetter; - entity?: new () => BaseEntity; } // Internal storage for module definitions diff --git a/src/core/script/ModelManager.ts b/src/core/script/ModelManager.ts index 709e89e..4be9969 100644 --- a/src/core/script/ModelManager.ts +++ b/src/core/script/ModelManager.ts @@ -1,4 +1,4 @@ -import type Viewport from '@/core/engine/Viewport.ts' +import Viewport from '@/core/engine/Viewport.ts' import { executeTypeScript } from '@/core/script/ScriptSupport.ts' import * as THREE from 'three' import { getMatrixFromTf } from '@/core/ModelUtils.ts' diff --git a/src/editor/Model2DEditor.vue b/src/editor/Model2DEditor.vue index 7b8dd06..0ce66a3 100644 --- a/src/editor/Model2DEditor.vue +++ b/src/editor/Model2DEditor.vue @@ -13,20 +13,19 @@ :type="state?.view3DMode===Constract.Mode3D?'primary':''" @click="state.view3DMode = Constract.Mode3D">3D - - 批量复制 - - - - 添加CAD图纸 - - - - 动画测试 - - + + 批量复制 + + + + 添加CAD图纸 + + + + 动画测试 +
{ this.isCarrying = true this.isLoading = false - const mesh = this.pickupItem(item) - const ptrForkMesh = this.getArmObject() - mesh.position.set(0, 0.1, 0) - mesh.rotation.set(0, THREE.MathUtils.degToRad(90), 0) - ptrForkMesh.add(mesh) } }) })) @@ -45,6 +47,8 @@ export default class Cl2Entity extends BaseEntity { const item = this.viewport.entityManager.findItemById(itemId) this.isCarrying = false this.isUnloading = false + + // 将物品从机械臂上卸下 this.dropItem(item, rackId, bay, level) })) } diff --git a/src/modules/cl2/index.ts b/src/modules/cl2/index.ts index 5619f2e..b8c65c7 100644 --- a/src/modules/cl2/index.ts +++ b/src/modules/cl2/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import Cl2Renderer from './Cl2Renderer.ts' -import Cl2Entity from './Cl2Entity.ts' import Cl2Interaction from './Cl2Interaction.ts' import propertySetter from "./Cl2PropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new Cl2Renderer(ITEM_TYPE_NAME), interaction: new Cl2Interaction(ITEM_TYPE_NAME), setter: propertySetter, - entity: Cl2Entity, }) diff --git a/src/modules/clx/index.ts b/src/modules/clx/index.ts index 2c45f6c..bf4427f 100644 --- a/src/modules/clx/index.ts +++ b/src/modules/clx/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import ClxRenderer from './ClxRenderer.ts' -import ClxEntity from './ClxEntity.ts' import ClxInteraction from './ClxInteraction.ts' import propertySetter from "@/modules/clx/ClxPropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new ClxRenderer(ITEM_TYPE_NAME), interaction: new ClxInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: ClxEntity }) diff --git a/src/modules/gstore/GstoreRenderer.ts b/src/modules/gstore/GstoreRenderer.ts index 82a1fda..de2666c 100644 --- a/src/modules/gstore/GstoreRenderer.ts +++ b/src/modules/gstore/GstoreRenderer.ts @@ -168,7 +168,7 @@ export default class GstoreRenderer extends BaseRenderer { * 获取物品存放位 * 获取物品存储到地堆货位中,返回可存放的位置和角度一个 Position 和 Rotation */ - getStorePlacement(viewport: Viewport, item: ItemJson): { position: THREE.Vector3, rotation: THREE.Quaternion } { + getStorePlacement(viewport: Viewport, item: ItemJson): { position: [number, number, number], rotation: [number, number, number] } { if (!item.dt?.storeAt?.item) { // 没有定义存储位置,返回空对象 //@ts-ignore @@ -177,13 +177,6 @@ export default class GstoreRenderer extends BaseRenderer { // 将这个物品添加到库存中 const me = viewport.entityManager.findItemById(item.dt.storeAt.item) - const position = new THREE.Vector3(...me.tf[0]) - const rotation = new THREE.Quaternion().setFromEuler(new THREE.Euler( - THREE.MathUtils.degToRad(me.tf[1][0]), - THREE.MathUtils.degToRad(me.tf[1][1]), - THREE.MathUtils.degToRad(me.tf[1][2]), - 'XYZ' - )) - return { position, rotation } + return { position: me.tf[0], rotation: me.tf[1] } } } diff --git a/src/modules/gstore/index.ts b/src/modules/gstore/index.ts index 73c42bb..b7b6c78 100644 --- a/src/modules/gstore/index.ts +++ b/src/modules/gstore/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import GstoreRenderer from './GstoreRenderer.ts' -import GstoreEntity from './GstoreEntity.ts' import GstoreInteraction from './GstoreInteraction.ts' import propertySetter from "@/modules/gstore/GstorePropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new GstoreRenderer(ITEM_TYPE_NAME), interaction: new GstoreInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: GstoreEntity, }) diff --git a/src/modules/measure/index.ts b/src/modules/measure/index.ts index 278af5f..bd068f6 100644 --- a/src/modules/measure/index.ts +++ b/src/modules/measure/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import MeasureRenderer from './MeasureRenderer.ts' -import MeasureEntity from './MeasureEntity.ts' import MeasureInteraction from './MeasureInteraction.ts' import propertySetter from "@/modules/measure/MeasurePropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new MeasureRenderer(ITEM_TYPE_NAME), interaction: new MeasureInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: MeasureEntity, }) diff --git a/src/modules/pallet/index.ts b/src/modules/pallet/index.ts index e2b8c86..cd98002 100644 --- a/src/modules/pallet/index.ts +++ b/src/modules/pallet/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import PalletRenderer from './PalletRenderer.ts' -import PalletEntity from './PalletEntity.ts' import PalletInteraction from './PalletInteraction.ts' import propertySetter from "@/modules/pallet/PalletPropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new PalletRenderer(ITEM_TYPE_NAME), interaction: new PalletInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: PalletEntity, }) diff --git a/src/modules/rack/index.ts b/src/modules/rack/index.ts index c64c095..5c70d31 100644 --- a/src/modules/rack/index.ts +++ b/src/modules/rack/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import RackRenderer from './RackRenderer.ts' -import RackEntity from './RackEntity.ts' import RackInteraction from './RackInteraction.ts' import propertySetter from "@/modules/rack/RackPropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new RackRenderer(ITEM_TYPE_NAME), interaction: new RackInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: RackEntity, }) diff --git a/src/modules/shuttle_rack/index.ts b/src/modules/shuttle_rack/index.ts index 95487dd..5ba5242 100644 --- a/src/modules/shuttle_rack/index.ts +++ b/src/modules/shuttle_rack/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import ShuttleRackRenderer from './ShuttleRackRenderer.ts' -import ShuttleRackEntity from './ShuttleRackEntity.ts' import ShuttleRackInteraction from './ShuttleRackInteraction.ts' import propertySetter from "./ShuttleRackPropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new ShuttleRackRenderer(ITEM_TYPE_NAME), interaction: new ShuttleRackInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: ShuttleRackEntity, }) diff --git a/src/modules/tote/index.ts b/src/modules/tote/index.ts index 12b9259..1bbfe7d 100644 --- a/src/modules/tote/index.ts +++ b/src/modules/tote/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import ToteRenderer from './ToteRenderer.ts' -import ToteEntity from './ToteEntity.ts' import ToteInteraction from './ToteInteraction.ts' import propertySetter from './TotePropertySetter.ts' @@ -11,5 +10,4 @@ export default defineModule({ renderer: new ToteRenderer(ITEM_TYPE_NAME), interaction: new ToteInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: ToteEntity }) diff --git a/src/modules/way/index.ts b/src/modules/way/index.ts index 7036b2f..96beaa2 100644 --- a/src/modules/way/index.ts +++ b/src/modules/way/index.ts @@ -1,6 +1,5 @@ import { defineModule } from '@/core/manager/ModuleManager.ts' import WayRenderer from './WayRenderer.ts' -import WayEntity from './WayEntity.ts' import WayInteraction from './WayInteraction.ts' import propertySetter from "@/modules/way/WayPropertySetter.ts"; @@ -11,5 +10,4 @@ export default defineModule({ renderer: new WayRenderer(ITEM_TYPE_NAME), interaction: new WayInteraction(ITEM_TYPE_NAME), setter: propertySetter, - entity: WayEntity, }) diff --git a/src/types/ScriptSupport.d.ts b/src/types/ScriptSupport.d.ts index 5d85824..1ef3628 100644 --- a/src/types/ScriptSupport.d.ts +++ b/src/types/ScriptSupport.d.ts @@ -14,13 +14,6 @@ declare interface Model { getPositionByEntityId(entityId: string): Vector3IF /** - * 创建任务 - * @param agv 任务执行对象 - * @return 返回一个任务管理器实例 - */ - createTask(agv: object): TaskManagerIF - - /** * 根据ID获取 CL2 叉车控制器 */ getCl2(id: string): Cl2If diff --git a/src/types/Types.d.ts b/src/types/Types.d.ts index 6c98ca5..80f1135 100644 --- a/src/types/Types.d.ts +++ b/src/types/Types.d.ts @@ -85,3 +85,9 @@ interface Vector3IF { */ distanceTo(vector: Vector3IF): number; } + +interface QuaternionIF { + x: number, + y: number, + z: number +} diff --git a/src/types/model.d.ts b/src/types/model.d.ts index 986d724..28ee083 100644 --- a/src/types/model.d.ts +++ b/src/types/model.d.ts @@ -40,6 +40,9 @@ interface InteractionCudOption { */ interface RendererCudOption { createFromInteraction?: boolean + /** + * 是否是模拟时创建的实体 + */ isRuntime?: boolean //THREE.Vector3 position?: any