diff --git a/src/assets/images/ptr/ptr.png b/src/assets/images/ptr/ptr.png new file mode 100644 index 0000000..b65c957 Binary files /dev/null and b/src/assets/images/ptr/ptr.png differ diff --git a/src/core/manager/WorldModel.ts b/src/core/manager/WorldModel.ts index ce62347..f9666ae 100644 --- a/src/core/manager/WorldModel.ts +++ b/src/core/manager/WorldModel.ts @@ -5,6 +5,8 @@ import Measure from '@/modules/measure' import Way from '@/modules/way' import Gstore from '@/modules/gstore' import Rack from '@/modules/rack' +import Pallet from "@/modules/pallet" +import Ptr from "@/modules/ptr" import StateManager from '@/core/manager/StateManager.ts' export interface WorldModelState { @@ -66,7 +68,9 @@ export default class WorldModel { Measure, Way, Gstore, - Rack + Rack, + Pallet, + Ptr ]).then(() => { console.log('世界模型初始化完成') diff --git a/src/example/example1.js b/src/example/example1.js index 746bb0e..9202110 100644 --- a/src/example/example1.js +++ b/src/example/example1.js @@ -83,7 +83,7 @@ export default { tf: [[-1, 0.1, 3.5], [0, 0, 0], [1.5, 0.25, 0.1]], dt: { rackDepth: 1, // 货架深度 - rackWidth: 8, + rackWidth: 7, rackHeight: 4.2, levelCount: 3, // 总层数 bayCount: 5, // 总列数 @@ -92,13 +92,13 @@ export default { columnSpacing: 1, // 支脚跨越 bays: [ // 每列的配置 { - bayWidth: 1.6, // 列的宽度 + bayWidth: 1.4, // 列的宽度 levelHeight: [ 1.4, 1.4, 1.4 ] // 每层的高度 }, - {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, - {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, - {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, - {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + {bayWidth: 1.4, levelHeight: [ 1.4, 1.4, 1.4 ]}, + {bayWidth: 1.4, levelHeight: [ 1.4, 1.4, 1.4 ]}, + {bayWidth: 1.4, levelHeight: [ 1.4, 1.4, 1.4 ]}, + {bayWidth: 1.4, levelHeight: [ 1.4, 1.4, 1.4 ]}, ] } }, @@ -136,14 +136,38 @@ export default { id: '6UhIIw9QPYh6acwyW8OSGs', t: 'gstore', v: true, - tf: [[-1, 0.1, 0.75], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], storeWidth: 1.2, storeDepth: 1.2 } + tf: [[-1, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } }, { id: '1D0WSRPj8JJJwIcmA0UMqG', t: 'gstore', v: true, - tf: [[0.75, 0.1, 0.75], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], storeWidth: 1.2, storeDepth: 1.2 } + tf: [[0.75, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } + }, { + id: 'pallet1', + t: 'pallet', + v: true, + tf: [[0.75, 0.075, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } + }, { + id: 'pallet2', + t: 'pallet', + v: true, + tf: [[3, 0.075, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } + }, { + id: 'ptr1', + t: 'ptr', + v: true, + tf: [[0.75, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]], + dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 } + }, { + id: 'ptr2', + t: 'ptr', + v: true, + tf: [[3, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]], + dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 } } ] } diff --git a/src/modules/gstore/GstoreRenderer.ts b/src/modules/gstore/GstoreRenderer.ts index 96785d6..2f7ea83 100644 --- a/src/modules/gstore/GstoreRenderer.ts +++ b/src/modules/gstore/GstoreRenderer.ts @@ -33,7 +33,7 @@ export default class GstoreRenderer extends BaseRenderer { const point = objects[0] point.position.y = this.defulePositionY - point.scale.set(item.dt.storeWidth, this.defaultScale.y, item.dt.storeDepth) + // point.scale.set(item.dt.storeWidth, this.defaultScale.y, item.dt.storeDepth) point.rotation.set( THREE.MathUtils.degToRad(this.defaultRotation.x), THREE.MathUtils.degToRad(this.defaultRotation.y), @@ -50,44 +50,41 @@ export default class GstoreRenderer extends BaseRenderer { throw new Error('not allow store line.') } - createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D[] { + createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D[] { // 创建平面几何体 - + if (!item.dt.storeWidth || !item.dt.storeDepth) { + return [] + } const group = new THREE.Group() group.name = GstoreRenderer.POINT_NAME // 绘制背景矩形框 - const planeGeometry = new THREE.PlaneGeometry(1, 1); - planeGeometry.rotateX(-Math.PI / 2) + const planeGeometry = new THREE.PlaneGeometry(item.dt.storeWidth, item.dt.storeDepth); + planeGeometry.rotateX(Math.PI / 2) const planeMaterial = new THREE.MeshBasicMaterial({ - color: 'white', + color: '#dee8ee', transparent: true, // 启用透明 - opacity: 0.2, // 50%透明度 + opacity: 0.5, // 50%透明度 depthWrite: false, // 防止深度冲突 side: THREE.DoubleSide // 双面渲染:ml-citation{ref="5,8" data="citationList"} }); const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial); group.add(planeMesh) - if (!item.dt.storeWidth || !item.dt.storeDepth) { - return [group] - } - // 绘制边框 const lineXLen = item.dt.storeWidth - this.defaultLineWidth const lineYLen = item.dt.storeDepth - this.defaultLineWidth const lineGeometry = new LineGeometry().setPositions([ - -(lineXLen/2),-(lineYLen/2),0, - lineXLen/2,-(lineYLen/2),0, - lineXLen/2,lineYLen/2,0, - -(lineXLen/2),lineYLen/2,0, - -(lineXLen/2),-(lineYLen/2),0 + -(lineXLen/2),0,-(lineYLen/2), + lineXLen/2,0,-(lineYLen/2), + lineXLen/2,0,lineYLen/2, + -(lineXLen/2),0,lineYLen/2, + -(lineXLen/2),0,-(lineYLen/2) ]); - lineGeometry.rotateX(-Math.PI / 2) const lineMaterial = new LineMaterial({ color: '#038217', - linewidth: 0.05, + linewidth: this.defaultLineWidth, worldUnits: true, resolution: new THREE.Vector2(window.innerWidth, window.innerHeight), side: THREE.DoubleSide @@ -96,7 +93,14 @@ export default class GstoreRenderer extends BaseRenderer { const line = new Line2(lineGeometry, lineMaterial); group.add(line as THREE.Object3D) - return [group] + // 设置位置 + group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) + const points = [group] + this.fillObjectUserDataFromItem(item, ...points) + this.afterCreateOrUpdatePoint(item, option, points) + this.tempViewport.entityManager.appendObject(item.id, points) + this.appendToScene(...points) + return points } dispose() { diff --git a/src/modules/pallet/PalletEntity.ts b/src/modules/pallet/PalletEntity.ts new file mode 100644 index 0000000..9cf671f --- /dev/null +++ b/src/modules/pallet/PalletEntity.ts @@ -0,0 +1,5 @@ +import BaseEntity from '@/core/base/BaseItemEntity.ts' + +export default class PalletEntity extends BaseEntity { + +} diff --git a/src/modules/pallet/PalletInteraction.ts b/src/modules/pallet/PalletInteraction.ts new file mode 100644 index 0000000..c01c91b --- /dev/null +++ b/src/modules/pallet/PalletInteraction.ts @@ -0,0 +1,22 @@ +import BaseInteraction from '@/core/base/BaseInteraction.ts' +import * as THREE from 'three' + +export default class PalletInteraction extends BaseInteraction { + + get isSinglePointMode(): boolean { + return true + } + + constructor(itemTypeName: string) { + super(itemTypeName) + } + + createPointOfItem(item: ItemJson, point: THREE.Vector3): ItemJson { + item = super.createPointOfItem(item, point) + + // 创建一个地堆货架 + item.dt.palletWidth = 1 // 宽度 + item.dt.palletDepth = 1.2 // 深度 + return item + } +} diff --git a/src/modules/pallet/PalletMeta.ts b/src/modules/pallet/PalletMeta.ts new file mode 100644 index 0000000..d39f5d0 --- /dev/null +++ b/src/modules/pallet/PalletMeta.ts @@ -0,0 +1,49 @@ +import type { IMeta } from '@/core/base/IMeta.ts' + +export default [ + { field: 'uuid', editor: 'UUID', label: 'uuid', readonly: true, category: 'basic' }, + { field: 'name', editor: 'TextInput', label: '名称', category: 'basic' }, + { field: 'dt.label', editor: 'TextInput', label: '标签', category: 'basic' }, + { editor: 'TransformEditor', category: 'basic' }, + { field: 'dt.color', editor: 'Color', label: '颜色', category: 'basic' }, + { editor: '-', category: 'basic' }, + + { field: 'dt.palletWidth', editor: 'NumberInput', label: '托盘深度', category: 'basic' }, + { field: 'dt.palletDepth', editor: 'NumberInput', label: '托盘深度', category: 'basic' }, + /** + * dt.bays 5列3层货架示例 + * { + * dt: { + * rackDepth: 1.1, // 货架深度 + * levelCount: 3, // 总层数 + * bayCount: 5, // 总列数 + * hideFloor: false, // 隐藏底板 + * extendColumns: true, // 扩展挡板 + * columnSpacing: 1, // 支脚跨越 + * bays: [ // 每列的配置 + * { + * bayWidth: 1.6, // 列的宽度 + * levelHeight: [ 1.4, 1.4, 1.4 ] // 每层的高度 + * }, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * ] + * } + * } + * + * + * + * + * + * + * + */ + + + { field: 'tf', editor: 'InOutCenterEditor', category: 'basic' }, + { field: 'dt.selectable', editor: 'Switch', label: '可选中', category: 'basic' }, + { field: 'dt.protected', editor: 'Switch', label: '受保护', category: 'basic' }, + { field: 'visible', editor: 'Switch', label: '可见', category: 'basic' } +] as IMeta diff --git a/src/modules/pallet/PalletRenderer.ts b/src/modules/pallet/PalletRenderer.ts new file mode 100644 index 0000000..c1ca858 --- /dev/null +++ b/src/modules/pallet/PalletRenderer.ts @@ -0,0 +1,115 @@ +import * as THREE from 'three' +import BaseRenderer from '@/core/base/BaseRenderer.ts' +import { Line2 } from 'three/examples/jsm/lines/Line2.js' +import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js' +import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' +import {decimalSumBy} from "@/core/ModelUtils"; +import Constract from '@/core/Constract.ts' + +/** + * 货架货位渲染器 + */ +export default class PalletRenderer extends BaseRenderer { + static POINT_NAME = 'pallet' + + pointMaterial: THREE.Material + + /** + * 默认点的高度, 防止和地面重合 + */ + readonly defulePositionY: number = Constract.HEIGHT_WAY + readonly defaultScale: THREE.Vector3 = new THREE.Vector3(1, 1, 1) + readonly defaultRotation: THREE.Vector3 = new THREE.Vector3(0, 0, 0) + readonly defaultLineWidth: number = 0.15 + + constructor(itemTypeName: string) { + super(itemTypeName) + } + + /** + * 所有的点,必须使用 storeWidth/storeDepth, 改TF无效 + */ + override afterCreateOrUpdatePoint(item: ItemJson, option: RendererCudOption, objects: THREE.Object3D[]) { + super.afterCreateOrUpdatePoint(item, option, objects) + + const point = objects[0] + // point.position.y = this.defulePositionY + + //point.scale.set(_.sumBy(item.dt.bays, b=>b.bayWidth), this.defaultScale.y, item.dt.rackDepth) + point.rotation.set( + THREE.MathUtils.degToRad(this.defaultRotation.x), + THREE.MathUtils.degToRad(this.defaultRotation.y), + THREE.MathUtils.degToRad(this.defaultRotation.z) + ) + } + + + createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): THREE.Object3D[] { + throw new Error('not allow store line.') + } + + updateLine(start: ItemJson, end: ItemJson, type: LinkType, option?: RendererCudOption) { + throw new Error('not allow store line.') + } + + + createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D[] { + // 创建平面几何体 + if (!item.dt.palletWidth || !item.dt.palletDepth) { + return [] + } + + const group = new THREE.Group() + group.name = PalletRenderer.POINT_NAME + + // 绘制背景矩形框 + const planeGeometry = new THREE.PlaneGeometry(item.dt.palletWidth - this.defaultLineWidth, item.dt.palletDepth - this.defaultLineWidth); + planeGeometry.rotateX(Math.PI / 2) + const planeMaterial = new THREE.MeshBasicMaterial({ + color: '#029de5', + side: THREE.DoubleSide // 双面渲染:ml-citation{ref="5,8" data="citationList"} + }); + const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial); + group.add(planeMesh) + + // 绘制边框 + const lineXLen = item.dt.palletWidth - this.defaultLineWidth + const lineYLen = item.dt.palletDepth - this.defaultLineWidth + + const lineGeometry = new LineGeometry().setPositions([ + -(lineXLen/2),0,-(lineYLen/2), + lineXLen/2,0,-(lineYLen/2), + lineXLen/2,0,lineYLen/2, + -(lineXLen/2),0,lineYLen/2, + -(lineXLen/2),0,-(lineYLen/2) + ]); + const lineMaterial = new LineMaterial({ + color: '#029de5', + linewidth: this.defaultLineWidth, + worldUnits: true, + resolution: new THREE.Vector2(window.innerWidth, window.innerHeight), + side: THREE.DoubleSide + }); + // + const line = new Line2(lineGeometry, lineMaterial); + group.add(line as THREE.Object3D) + // 设置位置 + group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) + + const points = [group] + this.fillObjectUserDataFromItem(item, ...points) + this.afterCreateOrUpdatePoint(item, option, points) + this.tempViewport.entityManager.appendObject(item.id, points) + this.appendToScene(...points) + return points + } + + dispose() { + super.dispose() + this.pointMaterial?.dispose() + } + + createPointBasic(item: ItemJson, option?: RendererCudOption): Object3D[] { + return []; + } +} diff --git a/src/modules/pallet/index.ts b/src/modules/pallet/index.ts new file mode 100644 index 0000000..d49b5d9 --- /dev/null +++ b/src/modules/pallet/index.ts @@ -0,0 +1,15 @@ +import { defineModule } from '@/core/manager/ModuleManager.ts' +import PalletRenderer from './PalletRenderer.ts' +import PalletEntity from './PalletEntity.ts' +import PalletMeta from './PalletMeta.ts' +import PalletInteraction from './PalletInteraction.ts' + +export const ITEM_TYPE_NAME = 'pallet' + +export default defineModule({ + name: ITEM_TYPE_NAME, + renderer: new PalletRenderer(ITEM_TYPE_NAME), + interaction: new PalletInteraction(ITEM_TYPE_NAME), + meta: PalletMeta, + entity: PalletEntity +}) diff --git a/src/modules/ptr/PtrEntity.ts b/src/modules/ptr/PtrEntity.ts new file mode 100644 index 0000000..468396a --- /dev/null +++ b/src/modules/ptr/PtrEntity.ts @@ -0,0 +1,5 @@ +import BaseEntity from '@/core/base/BaseItemEntity.ts' + +export default class PtrEntity extends BaseEntity { + +} diff --git a/src/modules/ptr/PtrInteraction.ts b/src/modules/ptr/PtrInteraction.ts new file mode 100644 index 0000000..39ac680 --- /dev/null +++ b/src/modules/ptr/PtrInteraction.ts @@ -0,0 +1,22 @@ +import BaseInteraction from '@/core/base/BaseInteraction.ts' +import * as THREE from 'three' + +export default class PtrInteraction extends BaseInteraction { + + get isSinglePointMode(): boolean { + return true + } + + constructor(itemTypeName: string) { + super(itemTypeName) + } + + createPointOfItem(item: ItemJson, point: THREE.Vector3): ItemJson { + item = super.createPointOfItem(item, point) + + // 创建一个地堆货架 + item.dt.palletWidth = 1 // 宽度 + item.dt.palletDepth = 1.2 // 深度 + return item + } +} diff --git a/src/modules/ptr/PtrMeta.ts b/src/modules/ptr/PtrMeta.ts new file mode 100644 index 0000000..d39f5d0 --- /dev/null +++ b/src/modules/ptr/PtrMeta.ts @@ -0,0 +1,49 @@ +import type { IMeta } from '@/core/base/IMeta.ts' + +export default [ + { field: 'uuid', editor: 'UUID', label: 'uuid', readonly: true, category: 'basic' }, + { field: 'name', editor: 'TextInput', label: '名称', category: 'basic' }, + { field: 'dt.label', editor: 'TextInput', label: '标签', category: 'basic' }, + { editor: 'TransformEditor', category: 'basic' }, + { field: 'dt.color', editor: 'Color', label: '颜色', category: 'basic' }, + { editor: '-', category: 'basic' }, + + { field: 'dt.palletWidth', editor: 'NumberInput', label: '托盘深度', category: 'basic' }, + { field: 'dt.palletDepth', editor: 'NumberInput', label: '托盘深度', category: 'basic' }, + /** + * dt.bays 5列3层货架示例 + * { + * dt: { + * rackDepth: 1.1, // 货架深度 + * levelCount: 3, // 总层数 + * bayCount: 5, // 总列数 + * hideFloor: false, // 隐藏底板 + * extendColumns: true, // 扩展挡板 + * columnSpacing: 1, // 支脚跨越 + * bays: [ // 每列的配置 + * { + * bayWidth: 1.6, // 列的宽度 + * levelHeight: [ 1.4, 1.4, 1.4 ] // 每层的高度 + * }, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * {bayWidth: 1.6, levelHeight: [ 1.4, 1.4, 1.4 ]}, + * ] + * } + * } + * + * + * + * + * + * + * + */ + + + { field: 'tf', editor: 'InOutCenterEditor', category: 'basic' }, + { field: 'dt.selectable', editor: 'Switch', label: '可选中', category: 'basic' }, + { field: 'dt.protected', editor: 'Switch', label: '受保护', category: 'basic' }, + { field: 'visible', editor: 'Switch', label: '可见', category: 'basic' } +] as IMeta diff --git a/src/modules/ptr/PtrRenderer.ts b/src/modules/ptr/PtrRenderer.ts new file mode 100644 index 0000000..3de33b7 --- /dev/null +++ b/src/modules/ptr/PtrRenderer.ts @@ -0,0 +1,98 @@ +import * as THREE from 'three' +import BaseRenderer from '@/core/base/BaseRenderer.ts' +import { Line2 } from 'three/examples/jsm/lines/Line2.js' +import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js' +import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' +import {decimalSumBy} from "@/core/ModelUtils"; +import Constract from '@/core/Constract.ts' +import ptrUrl from '@/assets/images/ptr/ptr.png' + +/** + * ptr侧叉渲染器 + */ +export default class PtrRenderer extends BaseRenderer { + static POINT_NAME = 'ptr' + + pointMaterial: THREE.Material + + /** + * 默认点的高度, 防止和地面重合 + */ + readonly defulePositionY: number = Constract.HEIGHT_WAY + readonly defaultScale: THREE.Vector3 = new THREE.Vector3(1, 1, 1) + readonly defaultRotation: THREE.Vector3 = new THREE.Vector3(0, 0, 0) + readonly defaultLineWidth: number = 0.15 + + constructor(itemTypeName: string) { + super(itemTypeName) + } + + /** + * 所有的点,必须使用 storeWidth/storeDepth, 改TF无效 + */ + override afterCreateOrUpdatePoint(item: ItemJson, option: RendererCudOption, objects: THREE.Object3D[]) { + super.afterCreateOrUpdatePoint(item, option, objects) + + const point = objects[0] + // point.position.y = this.defulePositionY + // point.scale.set(_.sumBy(item.dt.bays, b=>b.bayWidth), this.defaultScale.y, item.dt.rackDepth) + point.rotation.set( + THREE.MathUtils.degToRad(this.defaultRotation.x), + THREE.MathUtils.degToRad(this.defaultRotation.y), + THREE.MathUtils.degToRad(this.defaultRotation.z) + ) + } + + + createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): THREE.Object3D[] { + throw new Error('not allow store line.') + } + + updateLine(start: ItemJson, end: ItemJson, type: LinkType, option?: RendererCudOption) { + throw new Error('not allow store line.') + } + + + createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D[] { + // 创建平面几何体 + if (!item.dt.ptrWidth || !item.dt.ptrDepth) { + return [] + } + + const textureLoader = new THREE.TextureLoader() + const texture = textureLoader.load(ptrUrl) + + const group = new THREE.Group() + group.name = PtrRenderer.POINT_NAME + + // 绘制背景矩形框 + const planeGeometry = new THREE.PlaneGeometry(item.dt.ptrWidth, item.dt.ptrDepth); + planeGeometry.rotateX(-Math.PI / 2) + planeGeometry.rotateY(-Math.PI / 2) + const planeMaterial = new THREE.MeshLambertMaterial({ + map: texture, // 颜色贴图 + transparent: true, // 允许透明纹理 + }); + const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial); + group.add(planeMesh) + + // 设置位置 + group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) + + const points = [group] + this.fillObjectUserDataFromItem(item, ...points) + this.afterCreateOrUpdatePoint(item, option, points) + this.tempViewport.entityManager.appendObject(item.id, points) + this.appendToScene(...points) + return points + } + + dispose() { + super.dispose() + this.pointMaterial?.dispose() + } + + createPointBasic(item: ItemJson, option?: RendererCudOption): Object3D[] { + return []; + } +} diff --git a/src/modules/ptr/index.ts b/src/modules/ptr/index.ts new file mode 100644 index 0000000..7627f9b --- /dev/null +++ b/src/modules/ptr/index.ts @@ -0,0 +1,15 @@ +import { defineModule } from '@/core/manager/ModuleManager.ts' +import PtrRenderer from './PtrRenderer.ts' +import PtrEntity from './PtrEntity.ts' +import PtrMeta from './PtrMeta.ts' +import PtrInteraction from './PtrInteraction.ts' + +export const ITEM_TYPE_NAME = 'ptr' + +export default defineModule({ + name: ITEM_TYPE_NAME, + renderer: new PtrRenderer(ITEM_TYPE_NAME), + interaction: new PtrInteraction(ITEM_TYPE_NAME), + meta: PtrMeta, + entity: PtrEntity +}) diff --git a/src/modules/rack/RackInteraction.ts b/src/modules/rack/RackInteraction.ts index 7a7b41d..93c0262 100644 --- a/src/modules/rack/RackInteraction.ts +++ b/src/modules/rack/RackInteraction.ts @@ -15,8 +15,8 @@ export default class RackInteraction extends BaseInteraction { item = super.createPointOfItem(item, point) // 创建一个地堆货架 - item.dt.storeWidth = 1.2 // 宽度 - item.dt.storeDepth = 1.2 // 深度 + item.dt.rackWidth = 3 // 宽度 + item.dt.rackDepth = 1 // 深度 return item } } diff --git a/src/modules/rack/RackRenderer.ts b/src/modules/rack/RackRenderer.ts index 9089001..8701a83 100644 --- a/src/modules/rack/RackRenderer.ts +++ b/src/modules/rack/RackRenderer.ts @@ -55,6 +55,9 @@ export default class RackRenderer extends BaseRenderer { createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D[] { // 创建平面几何体 + if (!item.dt.bays || !item.dt.rackDepth) { + return [] + } const group = new THREE.Group() group.name = RackRenderer.POINT_NAME @@ -82,9 +85,6 @@ export default class RackRenderer extends BaseRenderer { const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial) group.add(planeMesh) - if (!item.dt.bays || !item.dt.rackDepth) { - return [group] - } // 绘制边框 const lineXLen = rackWidth - this.defaultLineWidth @@ -99,7 +99,7 @@ export default class RackRenderer extends BaseRenderer { ]) const lineMaterial = new LineMaterial({ color: '#0d89a5', - linewidth: 0.05, + linewidth: this.defaultLineWidth, worldUnits: true, resolution: new THREE.Vector2(window.innerWidth, window.innerHeight), side: THREE.DoubleSide