From 769183cf485e381b93132f21a3cd8f7b475f5ace Mon Sep 17 00:00:00 2001 From: luoyifan Date: Mon, 26 May 2025 15:02:03 +0800 Subject: [PATCH] =?UTF-8?q?WorldModel=20=E4=B8=96=E7=95=8C=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/designer/Viewport.ts | 2 +- src/designer/WorldModel.ts | 130 ------------------------ src/designer/example1.js | 67 ------------ src/model/WorldModel.ts | 130 ++++++++++++++++++++++++ src/model/example1.js | 92 +++++++++++++++++ src/model/itemTypeDefine/line/LineMeta.ts | 7 ++ src/model/itemTypeDefine/measure/MeasureMeta.ts | 7 ++ src/model/itemTypeDefine/point/PointMeta.ts | 7 ++ src/model/itemTypeDefine/store/QueueMeta.ts | 7 ++ src/modelItem/line/LineMeta.ts | 7 -- src/modelItem/point/PointMeta.ts | 7 -- src/modelItem/store/QueueMeta.ts | 7 -- src/runtime/DefineItem.ts | 6 +- src/types/global.d.ts | 2 +- src/views/ModelMainInit.ts | 2 +- 15 files changed, 256 insertions(+), 224 deletions(-) delete mode 100644 src/designer/WorldModel.ts delete mode 100644 src/designer/example1.js create mode 100644 src/model/WorldModel.ts create mode 100644 src/model/example1.js create mode 100644 src/model/itemTypeDefine/line/LineMeta.ts create mode 100644 src/model/itemTypeDefine/measure/MeasureMeta.ts create mode 100644 src/model/itemTypeDefine/point/PointMeta.ts create mode 100644 src/model/itemTypeDefine/store/QueueMeta.ts delete mode 100644 src/modelItem/line/LineMeta.ts delete mode 100644 src/modelItem/point/PointMeta.ts delete mode 100644 src/modelItem/store/QueueMeta.ts diff --git a/src/designer/Viewport.ts b/src/designer/Viewport.ts index 3bb69c2..fbecc70 100644 --- a/src/designer/Viewport.ts +++ b/src/designer/Viewport.ts @@ -4,7 +4,7 @@ import { AxesHelper, GridHelper, OrthographicCamera, Raycaster, Scene, Vector3, import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' import EsDragControls from './model2DEditor/EsDragControls' import Stats from 'three/examples/jsm/libs/stats.module' -import type WorldModel from '@/designer/WorldModel.ts' +import type WorldModel from '@/model/WorldModel.ts' import $ from 'jquery' import { reactive, watch } from 'vue' import MouseMoveInspect from '@/designer/model2DEditor/tools/MouseMoveInspect.ts' diff --git a/src/designer/WorldModel.ts b/src/designer/WorldModel.ts deleted file mode 100644 index 7eae62b..0000000 --- a/src/designer/WorldModel.ts +++ /dev/null @@ -1,130 +0,0 @@ -import _ from 'lodash' -import Example1 from './example1' -import { markRaw, reactive } from 'vue' -import { Scene } from 'three' -import type Viewport from '@/designer/Viewport.ts' -import * as THREE from 'three' - -/** - * 世界模型 - */ -export default class WorldModel { - data: any = null - allLevels: any = null - sceneMap = new Map() - viewPorts: Viewport[] = [] - - constructor() { - this.init() - this.open() - } - - init() { - window['worldModel'] = this - } - - open() { - if (this.sceneMap.size > 0) { - // 释放旧场景 - this.sceneMap.forEach((scene: Scene) => { - this.sceneDispose(scene) - }) - } - if (this.viewPorts.length > 0) { - // 注销视口 - this.viewPorts.forEach((viewport: Viewport) => { - this.unregisterViewport(viewport) - }) - } - - system.msg('打开世界地图完成') - this.data = markRaw(Example1) - this.allLevels = reactive(this.data.allLevels) - } - - /** - * 获取当前楼层的场景, 如果没有则创建一个新的场景 - * @param floor - */ - getSceneByFloor(floor: string) { - if (this.sceneMap.has(floor)) { - return this.sceneMap.get(floor) - } else { - const scene = this.createScene(floor) - - this.sceneMap.set(floor, scene) - return scene - } - } - - /** - * 创建一个新的场景 - */ - createScene(floor: string) { - const scene = new Scene() - scene.background = new THREE.Color(0xeeeeee) - return scene - } - - /** - * 注册视口 - */ - registerViewport(viewport: Viewport) { - this.viewPorts = this.viewPorts || [] - this.viewPorts.push(viewport) - } - - /** - * 注销视口 - */ - unregisterViewport(viewport: Viewport) { - const index = this.viewPorts.indexOf(viewport) - if (index > -1) { - this.viewPorts.splice(index, 1) - } - } - - /** - * 销毁场景, 释放全部 WebGL 资源 - */ - sceneDispose(scene: Scene = null) { - // 移除旧模型 - if (!scene) { - return - } - - scene.traverse((obj: any) => { - // 释放几何体 - if (obj.geometry) { - obj.geometry.dispose() - } - - // 释放材质 - if (obj.material) { - if (Array.isArray(obj.material)) { - obj.material.forEach(m => m.dispose()) - } else { - obj.material.dispose() - } - } - - // 释放纹理 - if (obj.texture) { - obj.texture.dispose() - } - - // 释放渲染目标 - if (obj.renderTarget) { - obj.renderTarget.dispose() - } - - // 移除事件监听(如 OrbitControls) - if (obj.dispose) { - obj.dispose() - } - }) - - // 清空场景 - scene.children = [] - } -} \ No newline at end of file diff --git a/src/designer/example1.js b/src/designer/example1.js deleted file mode 100644 index b7ac2da..0000000 --- a/src/designer/example1.js +++ /dev/null @@ -1,67 +0,0 @@ -export default { - Tool: { - Group: [], - GlobalVariables: [], - UserCommand: [], - ProcessFlow: [], - Dashboard: [], - DataTable: [], - Trigger: [ - { name: 'OnOpen', fn: '' }, - { name: 'OnReset', fn: '' }, - { name: 'OnStart', fn: '' }, - { name: 'OnStop', fn: '' } - ] - }, - item: [ - { - name: 'f1', - items: [] - } - ], - elevator: [], - wall: [], - pillar: [], - allLevels: [ - { - value: 'F', label: '仓库楼层', - children: [ - { value: '-f1', label: '地下室 (-f1)' }, - { value: 'f1', label: '一楼 (f1)' }, - { value: 'f2', label: '二楼 (f2)' }, - { value: 'OUT', label: '外场 (OUT)' }, - { value: 'fe', label: '楼层电梯 (fe)' } - ] - }, - { - value: 'M', label: '密集库区域', - children: [ - { value: 'm1', label: 'M1 (m1)' }, - { value: 'm2', label: 'M2 (m2)' }, - { value: 'm3', label: 'M3 (m3)' }, - { value: 'm4', label: 'M4 (m4)' }, - { value: 'me', label: '提升机 (me)' } - ] - }, - { - value: 'D', label: '多穿库A', - children: [ - { value: 'd1', label: 'D1 (d1)' }, - { value: 'd2', label: 'D2 (d2)' }, - { value: 'd3', label: 'D3 (d3)' }, - { value: 'd4', label: 'D4 (d4)' }, - { value: 'de1', label: '提升机 (de1)' } - ] - }, - { - value: 'E', label: '多穿库B', - children: [ - { value: 'e1', label: 'E1 (e1)' }, - { value: 'e2', label: 'E2 (e2)' }, - { value: 'e3', label: 'E3 (e3)' }, - { value: 'e4', label: 'E4 (e4)' }, - { value: 'ee1', label: '提升机 (ee1)' } - ] - } - ] -} \ No newline at end of file diff --git a/src/model/WorldModel.ts b/src/model/WorldModel.ts new file mode 100644 index 0000000..7eae62b --- /dev/null +++ b/src/model/WorldModel.ts @@ -0,0 +1,130 @@ +import _ from 'lodash' +import Example1 from './example1' +import { markRaw, reactive } from 'vue' +import { Scene } from 'three' +import type Viewport from '@/designer/Viewport.ts' +import * as THREE from 'three' + +/** + * 世界模型 + */ +export default class WorldModel { + data: any = null + allLevels: any = null + sceneMap = new Map() + viewPorts: Viewport[] = [] + + constructor() { + this.init() + this.open() + } + + init() { + window['worldModel'] = this + } + + open() { + if (this.sceneMap.size > 0) { + // 释放旧场景 + this.sceneMap.forEach((scene: Scene) => { + this.sceneDispose(scene) + }) + } + if (this.viewPorts.length > 0) { + // 注销视口 + this.viewPorts.forEach((viewport: Viewport) => { + this.unregisterViewport(viewport) + }) + } + + system.msg('打开世界地图完成') + this.data = markRaw(Example1) + this.allLevels = reactive(this.data.allLevels) + } + + /** + * 获取当前楼层的场景, 如果没有则创建一个新的场景 + * @param floor + */ + getSceneByFloor(floor: string) { + if (this.sceneMap.has(floor)) { + return this.sceneMap.get(floor) + } else { + const scene = this.createScene(floor) + + this.sceneMap.set(floor, scene) + return scene + } + } + + /** + * 创建一个新的场景 + */ + createScene(floor: string) { + const scene = new Scene() + scene.background = new THREE.Color(0xeeeeee) + return scene + } + + /** + * 注册视口 + */ + registerViewport(viewport: Viewport) { + this.viewPorts = this.viewPorts || [] + this.viewPorts.push(viewport) + } + + /** + * 注销视口 + */ + unregisterViewport(viewport: Viewport) { + const index = this.viewPorts.indexOf(viewport) + if (index > -1) { + this.viewPorts.splice(index, 1) + } + } + + /** + * 销毁场景, 释放全部 WebGL 资源 + */ + sceneDispose(scene: Scene = null) { + // 移除旧模型 + if (!scene) { + return + } + + scene.traverse((obj: any) => { + // 释放几何体 + if (obj.geometry) { + obj.geometry.dispose() + } + + // 释放材质 + if (obj.material) { + if (Array.isArray(obj.material)) { + obj.material.forEach(m => m.dispose()) + } else { + obj.material.dispose() + } + } + + // 释放纹理 + if (obj.texture) { + obj.texture.dispose() + } + + // 释放渲染目标 + if (obj.renderTarget) { + obj.renderTarget.dispose() + } + + // 移除事件监听(如 OrbitControls) + if (obj.dispose) { + obj.dispose() + } + }) + + // 清空场景 + scene.children = [] + } +} \ No newline at end of file diff --git a/src/model/example1.js b/src/model/example1.js new file mode 100644 index 0000000..77c3e94 --- /dev/null +++ b/src/model/example1.js @@ -0,0 +1,92 @@ +export default { + Tool: { + Group: [], + GlobalVariables: [], + UserCommand: [], + ProcessFlow: [], + Dashboard: [], + DataTable: [], + Trigger: [ + { name: 'OnOpen', fn: '' }, + { name: 'OnReset', fn: '' }, + { name: 'OnStart', fn: '' }, + { name: 'OnStop', fn: '' } + ] + }, + item: [ + { + name: 'f1', type: 'floor', uuid: 'f1', + items: [ + { + uuid: 'measure-group', type: 'group', items: [ + { + uuid: 'p1', + type: 'measure', + category: 'line', + pos: [], + rotation: [0, 0, 0], + scale: [1, 1, 1], + link: ['p2'] + }, + { + uuid: 'p2', + type: 'measure', + category: 'line', + pos: [], + rotation: [0, 0, 0], + scale: [1, 1, 1], + link: ['p3'] + }, + { uuid: 'p3', type: 'measure', category: 'line', pos: [], rotation: [0, 0, 0], scale: [1, 1, 1], link: [] } + ] + } + + ] + } + ], + elevator: [], + wall: [], + pillar: [], + allLevels: [ + { + value: 'F', label: '仓库楼层', + children: [ + { value: '-f1', label: '地下室 (-f1)' }, + { value: 'f1', label: '一楼 (f1)' }, + { value: 'f2', label: '二楼 (f2)' }, + { value: 'OUT', label: '外场 (OUT)' }, + { value: 'fe', label: '楼层电梯 (fe)' } + ] + }, + { + value: 'M', label: '密集库区域', + children: [ + { value: 'm1', label: 'M1 (m1)' }, + { value: 'm2', label: 'M2 (m2)' }, + { value: 'm3', label: 'M3 (m3)' }, + { value: 'm4', label: 'M4 (m4)' }, + { value: 'me', label: '提升机 (me)' } + ] + }, + { + value: 'D', label: '多穿库A', + children: [ + { value: 'd1', label: 'D1 (d1)' }, + { value: 'd2', label: 'D2 (d2)' }, + { value: 'd3', label: 'D3 (d3)' }, + { value: 'd4', label: 'D4 (d4)' }, + { value: 'de1', label: '提升机 (de1)' } + ] + }, + { + value: 'E', label: '多穿库B', + children: [ + { value: 'e1', label: 'E1 (e1)' }, + { value: 'e2', label: 'E2 (e2)' }, + { value: 'e3', label: 'E3 (e3)' }, + { value: 'e4', label: 'E4 (e4)' }, + { value: 'ee1', label: '提升机 (ee1)' } + ] + } + ] +} \ No newline at end of file diff --git a/src/model/itemTypeDefine/line/LineMeta.ts b/src/model/itemTypeDefine/line/LineMeta.ts new file mode 100644 index 0000000..7f6fc25 --- /dev/null +++ b/src/model/itemTypeDefine/line/LineMeta.ts @@ -0,0 +1,7 @@ +import { defineItem } from '@/runtime/DefineItem.ts' + +export default defineItem({ + name: 'line', + label: '辅助线', + category: 'line' +}) \ No newline at end of file diff --git a/src/model/itemTypeDefine/measure/MeasureMeta.ts b/src/model/itemTypeDefine/measure/MeasureMeta.ts new file mode 100644 index 0000000..195915c --- /dev/null +++ b/src/model/itemTypeDefine/measure/MeasureMeta.ts @@ -0,0 +1,7 @@ +import { defineItemType } from '@/runtime/DefineItem.ts' + +export default defineItemType({ + name: 'measure', + label: '测量工具', + category: 'line' +}) \ No newline at end of file diff --git a/src/model/itemTypeDefine/point/PointMeta.ts b/src/model/itemTypeDefine/point/PointMeta.ts new file mode 100644 index 0000000..650f231 --- /dev/null +++ b/src/model/itemTypeDefine/point/PointMeta.ts @@ -0,0 +1,7 @@ +import { defineItem } from '@/runtime/DefineItem.ts' + +export default defineItem({ + name: 'point', + label: '辅助点', + category: 'point' +}) \ No newline at end of file diff --git a/src/model/itemTypeDefine/store/QueueMeta.ts b/src/model/itemTypeDefine/store/QueueMeta.ts new file mode 100644 index 0000000..4ab06eb --- /dev/null +++ b/src/model/itemTypeDefine/store/QueueMeta.ts @@ -0,0 +1,7 @@ +import { defineItem } from '@/runtime/DefineItem.ts' + +export default defineItem({ + name: 'queue', + label: '暂存区', + category: 'store' +}) \ No newline at end of file diff --git a/src/modelItem/line/LineMeta.ts b/src/modelItem/line/LineMeta.ts deleted file mode 100644 index 7f6fc25..0000000 --- a/src/modelItem/line/LineMeta.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineItem } from '@/runtime/DefineItem.ts' - -export default defineItem({ - name: 'line', - label: '辅助线', - category: 'line' -}) \ No newline at end of file diff --git a/src/modelItem/point/PointMeta.ts b/src/modelItem/point/PointMeta.ts deleted file mode 100644 index 650f231..0000000 --- a/src/modelItem/point/PointMeta.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineItem } from '@/runtime/DefineItem.ts' - -export default defineItem({ - name: 'point', - label: '辅助点', - category: 'point' -}) \ No newline at end of file diff --git a/src/modelItem/store/QueueMeta.ts b/src/modelItem/store/QueueMeta.ts deleted file mode 100644 index 4ab06eb..0000000 --- a/src/modelItem/store/QueueMeta.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineItem } from '@/runtime/DefineItem.ts' - -export default defineItem({ - name: 'queue', - label: '暂存区', - category: 'store' -}) \ No newline at end of file diff --git a/src/runtime/DefineItem.ts b/src/runtime/DefineItem.ts index cfc9ab6..56de6bb 100644 --- a/src/runtime/DefineItem.ts +++ b/src/runtime/DefineItem.ts @@ -1,7 +1,7 @@ /** * 定义一个 物流单元 */ -export class ItemDefine { +export class ItemTypeDefine { option!: ItemOption constructor(option: ItemOption) { @@ -20,9 +20,9 @@ export interface ItemOption { /** * 定义一个 物流单元 */ -export function defineItem(option: ItemOption): Promise { +export function defineItemType(option: ItemOption): Promise { return new Promise((resolve, reject) => { - const item = new ItemDefine(option) + const item = new ItemTypeDefine(option) resolve(item) }) } \ No newline at end of file diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 7dac369..092c219 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -1,7 +1,7 @@ import _ from 'lodash' import $ from 'jquery' import type System from '@/runtime/System' -import type WorldModel from '@/designer/WorldModel' +import type WorldModel from '@/model/WorldModel' declare global { const $: $ diff --git a/src/views/ModelMainInit.ts b/src/views/ModelMainInit.ts index d996274..15e00f7 100644 --- a/src/views/ModelMainInit.ts +++ b/src/views/ModelMainInit.ts @@ -15,7 +15,7 @@ import ToolsMenu from '@/designer/menus/Tools.ts' import Model3DView from '@/designer/menus/Model3DView.ts' import { forEachMenu } from '@/runtime/DefineMenu.ts' import { normalizeShortKey } from '@/utils/webutils.ts' -import WorldModel from '@/designer/WorldModel.ts' +import WorldModel from '@/model/WorldModel.ts' /** * 初始化模型编辑器的基础控件