You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.0 KiB
120 lines
3.0 KiB
import * as THREE from 'three'
|
|
import BaseEntity from '@/core/base/BaseItemEntity.ts'
|
|
import type Viewport from '@/core/engine/Viewport.ts'
|
|
import gsap from 'gsap'
|
|
import { nextTick } from 'vue'
|
|
import Cl23dObject from "./Cl23dObject";
|
|
/**
|
|
* CL2 机械臂实体类
|
|
* 0.4m/ss // a max 1.2m/s
|
|
* 90 = 3.5s cl2
|
|
* 90 = 5s // cLX
|
|
*/
|
|
export default class Cl2Entity extends BaseEntity {
|
|
constructor(viewport: Viewport, id: string) {
|
|
super(viewport, id)
|
|
}
|
|
|
|
|
|
|
|
|
|
// 抬
|
|
addArmRaise(height: number) {
|
|
// super.addArmRaise(height)
|
|
this.taskQueue.add(this.createTask('ARM_RAISE',
|
|
() => this.cl2Object.animationUpFork(height)
|
|
))
|
|
}
|
|
|
|
// 降
|
|
addArmLower() {
|
|
// super.addArmLower()
|
|
this.taskQueue.add(this.createTask('ARM_LOWER',
|
|
() => this.cl2Object.animationDownFork()
|
|
))
|
|
}
|
|
|
|
// 伸
|
|
addArmExtender(z: number = 1.2) {
|
|
// super.addArmExtender()
|
|
this.taskQueue.add(this.createTask('ARM_EXTEND',
|
|
() => this.cl2Object.animationShowFork(z)
|
|
))
|
|
}
|
|
|
|
// 缩
|
|
addArmRetractor() {
|
|
// super.addArmRetractor()
|
|
this.taskQueue.add(this.createTask('ARM_RETRACT',
|
|
() => this.cl2Object.animationHideFork()
|
|
))
|
|
}
|
|
// 装
|
|
addLoad(item: string): void {
|
|
|
|
const ptrForkMesh = this.getArmObject()
|
|
this.taskQueue.add(this.createTask('LOAD', async () => {
|
|
// 实际业务中应包含装载逻辑
|
|
this.isCarrying = true
|
|
this.isLoading = true
|
|
// 将物品拾取到机械臂上
|
|
const mesh = this.pickupItem(item)
|
|
mesh.position.set(0, 0, -0.15)
|
|
mesh.rotation.set(0, THREE.MathUtils.degToRad(90), 0)
|
|
ptrForkMesh.add(mesh)
|
|
}))
|
|
|
|
this.taskQueue.add(this.createTask('ARM_RAISE',
|
|
()=>{
|
|
return new Promise(resolve => {
|
|
gsap.to(ptrForkMesh.position, {
|
|
y: ptrForkMesh.position.y + 0.2,
|
|
duration: 1,
|
|
ease: 'sine.inOut',
|
|
onComplete: () => {
|
|
this.isCarrying = true
|
|
this.isLoading = false
|
|
resolve()
|
|
}
|
|
})
|
|
})
|
|
}))
|
|
}
|
|
|
|
// 卸
|
|
addUnload(itemId: string, rackId: string, bay?: number, level?: number, cell?: number): void {
|
|
this.taskQueue.add(this.createTask('UNLOAD', async () => {
|
|
const item = this.viewport.entityManager.findItemById(itemId)
|
|
this.isCarrying = false
|
|
this.isUnloading = false
|
|
|
|
// 将物品从机械臂上卸下
|
|
this.dropItem(item, rackId, bay, level)
|
|
}))
|
|
}
|
|
|
|
// 帮助方法:获取机械臂对象
|
|
getArmObject(): THREE.Object3D | undefined {
|
|
const agv = this.object as THREE.Group
|
|
if (agv.children.length > 1) {
|
|
const pillar = agv.children[1]
|
|
if (pillar.children.length > 1) {
|
|
return pillar.children[1]
|
|
}
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
// 帮助方法:获取机械臂立柱
|
|
getArmPillar(): THREE.Object3D | undefined {
|
|
const agv = this.object as THREE.Group
|
|
if (agv.children.length > 1) {
|
|
return agv.children[1]
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
get cl2Object(): Cl23dObject {
|
|
return this.object as Cl23dObject
|
|
}
|
|
}
|
|
|