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 } }