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