From c19f6d6fbc0ac3c84a78359d5b8d80aa145d11d8 Mon Sep 17 00:00:00 2001 From: luoyifan Date: Sun, 22 Jun 2025 19:50:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BE=AA=E7=8E=AF=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E9=97=AE=E9=A2=98=E3=80=81=E4=B8=96=E7=95=8C=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E6=9C=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/ModelUtils.ts | 3 +- src/core/base/BaseRenderer.ts | 2 + src/core/manager/CodeDropper.ts | 6 +- src/core/manager/ModuleManager.ts | 44 +- src/core/manager/WorldModel.ts | 41 +- src/editor/CatalogDefine.vue | 2 +- src/editor/Model2DEditor.vue | 1 + src/editor/ModelMain.vue | 33 +- src/editor/ModelMainInit.ts | 5 +- src/editor/menus/FileMenu.ts | 181 +++--- src/editor/widgets/modeltree/ModeltreeViewJs.js | 1 + src/main.ts | 2 +- src/modules/agv1/index.ts | 7 +- src/modules/carton/index.ts | 13 +- src/modules/charger/index.ts | 13 +- src/modules/cl2/index.ts | 13 +- src/modules/clx/index.ts | 14 +- src/modules/gstore/index.ts | 13 +- src/modules/measure/MeasureRenderer.ts | 3 + src/modules/measure/index.ts | 15 +- src/modules/pallet/index.ts | 13 +- src/modules/rack/RackRenderer.ts_back | 760 ------------------------ src/modules/rack/index.ts | 13 +- src/modules/shuttle_rack/index.ts | 13 +- src/modules/tote/index.ts | 7 +- src/modules/way/index.ts | 13 +- src/types/global.d.ts | 3 +- 27 files changed, 232 insertions(+), 1002 deletions(-) delete mode 100644 src/modules/rack/RackRenderer.ts_back diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index 10c28b8..3ce1871 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -1,7 +1,6 @@ import * as THREE from 'three' import type Viewport from '@/core/engine/Viewport' import { Vector2 } from 'three/src/math/Vector2' -import EventBus from '@/runtime/EventBus.ts' import Decimal from 'decimal.js' import type { LineLike, Object3DLike } from '@/types/ModelTypes.ts' import axios from 'axios' @@ -9,7 +8,7 @@ import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader' import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader' import { TDSLoader } from 'three/examples/jsm/loaders/TDSLoader' import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader' -import { LineSegments2 } from 'three/examples/jsm/lines/LineSegments2' +import { worldModel } from '@/core/manager/WorldModel.ts' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial' import { Line2 } from 'three/examples/jsm/lines/Line2' import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry' diff --git a/src/core/base/BaseRenderer.ts b/src/core/base/BaseRenderer.ts index 6dc1650..e8e48d6 100644 --- a/src/core/base/BaseRenderer.ts +++ b/src/core/base/BaseRenderer.ts @@ -7,6 +7,8 @@ import type { LineLike, Object3DLike } from '@/types/ModelTypes.ts' import { MeshWrap } from '@/core/manager/InstanceMeshManager.ts' import { getRenderer } from '@/core/manager/ModuleManager.ts' +debugger + /** * 基本渲染器基类 * 定义了点 / 线如何渲染到 Three.js 场景中. diff --git a/src/core/manager/CodeDropper.ts b/src/core/manager/CodeDropper.ts index d05c009..191b029 100644 --- a/src/core/manager/CodeDropper.ts +++ b/src/core/manager/CodeDropper.ts @@ -42,7 +42,7 @@ export default class CodeDropper extends BaseInteraction { droppedItemCallback: (item: ItemJson, pos: THREE.Vector3, evt: MouseEvent) => boolean } -defineModule({ - name: 'CodeDropper', +const ITEM_NAME = 'CodeDropper' +defineModule(ITEM_NAME, () => ({ interaction: CodeDropper.INSTANCE -}) +})) diff --git a/src/core/manager/ModuleManager.ts b/src/core/manager/ModuleManager.ts index c7328de..92f1a6a 100644 --- a/src/core/manager/ModuleManager.ts +++ b/src/core/manager/ModuleManager.ts @@ -1,17 +1,20 @@ -import * as THREE from 'three' import BaseRenderer from '@/core/base/BaseRenderer' import BaseInteraction from '@/core/base/BaseInteraction' -import BaseEntity from '@/core/base/BaseItemEntity' -import type { PropertySetter } from "@/core/base/PropertyTypes.ts"; +import type { PropertySetter } from '@/core/base/PropertyTypes.ts' // Define the ModuleDefineOption interface export interface ModuleDefineOption { /** - * 物流单元类型名称 + * 渲染器 */ - name: string; renderer?: BaseRenderer; + /** + * 交互管理器 + */ interaction?: BaseInteraction; + /** + * 属性元数据 + */ setter?: PropertySetter; } @@ -22,12 +25,19 @@ window['modules'] = modules /** * 模块管理器 */ -export function defineModule(option: ModuleDefineOption): Promise { - if (modules.has(option.name)) { - throw new Error(`Module with name "${option.name}" is already defined.`) +export function defineModule(name: string, optionFn: () => ModuleDefineOption): Promise { + if (modules.has(name)) { + throw new Error(`Module with name "${name}" is already defined.`) } - modules.set(option.name, option) - return option.renderer?.init() + return new Promise((resolve) => { + if (typeof optionFn !== 'function') { + console.log(`Module "${name}" is not a function, using it directly.`) + debugger + } + const option = optionFn() + modules.set(name, option) + option.renderer?.init().then(resolve) + }) } /** @@ -62,17 +72,5 @@ export function getInteraction(name: string): T { export function getSetter(name: string) { const module = getModuleOption(name) - return module.setter; -} - -/** - * 根据物料类型名称, 获取实体类 - * 如果获取不了 直接抛异常 - */ -export function createEntity(name: string, itemjson: ItemJson, objects: THREE.Object3D[]): T { - const module = getModuleOption(name) - const v = new module.entity() as T - v.setItem(itemjson) - v.setObjects(objects) - return v + return module.setter } diff --git a/src/core/manager/WorldModel.ts b/src/core/manager/WorldModel.ts index 4f9a839..28f9944 100644 --- a/src/core/manager/WorldModel.ts +++ b/src/core/manager/WorldModel.ts @@ -1,18 +1,6 @@ import _, { cloneDeep } from 'lodash' import { reactive, watch } from 'vue' import EventBus from '@/runtime/EventBus' -import Measure from '@/modules/measure' -import Way from '@/modules/way' -import Gstore from '@/modules/gstore' -import Rack from '@/modules/rack' -import ShuttleRack from '@/modules/shuttle_rack' -import Pallet from '@/modules/pallet' -import Tote from '@/modules/tote' -// import Agv1 from '@/modules/agv1' -import Carton from '@/modules/carton' -import Cl2 from '@/modules/cl2' -import Clx from '@/modules/clx' -import Charger from '@/modules/charger' import StateManager from '@/core/manager/StateManager.ts' import { getQueryParams, setQueryParam } from '@/utils/webutils.ts' import localforage from 'localforage' @@ -68,7 +56,7 @@ export default class WorldModel { isLoading: false, isRunning: false, isVirtual: false, - timeRate: 1, + timeRate: 1 } }) @@ -101,18 +89,17 @@ export default class WorldModel { init() { // 观察 this.state.catalogCode 的变化, 如果变化就调用 catalogCodeChange 方法 return Promise.all([ - Measure, - Way, - Gstore, - Rack, - ShuttleRack, - Pallet, - Tote, - Carton, - Cl2, - Clx, - // Agv1, - Charger + import('../../modules/measure'), + import('../../modules/way'), + import('../../modules/gstore'), + import('../../modules/rack'), + import('../../modules/shuttle_rack'), + import('../../modules/pallet'), + import('../../modules/tote'), + import('../../modules/carton'), + import('../../modules/cl2'), + import('../../modules/clx'), + import('../../modules/charger') ]).then(() => { console.log('世界模型初始化完成') @@ -241,3 +228,7 @@ export default class WorldModel { }) } } + +const worldModel = new WorldModel() +debugger +export { worldModel } diff --git a/src/editor/CatalogDefine.vue b/src/editor/CatalogDefine.vue index ad15034..a0dc1e5 100644 --- a/src/editor/CatalogDefine.vue +++ b/src/editor/CatalogDefine.vue @@ -3,6 +3,7 @@ import { computed, createVNode, reactive, useTemplateRef } from "vue"; import { ElButton, ElSpace, ElTree } from "element-plus"; import YvSrcEditor from "@/components/YvSrcEditor.vue"; import DataForm from "@/components/data-form/DataForm.vue"; +import {worldModel} from '@/core/manager/WorldModel.ts' import lodash from "lodash"; defineOptions({ @@ -39,7 +40,6 @@ interface CatalogDefineData { // 内部数据 const data: CatalogDefineData = {}; const tree = useTemplateRef>("treeRef"); -const worldModel = computed(() => window['worldModel']); const catalog = computed>(() => { // state.forceUpdateForCatalog; return worldModel.value?.state?.catalog; diff --git a/src/editor/Model2DEditor.vue b/src/editor/Model2DEditor.vue index a2db3d8..85946bf 100644 --- a/src/editor/Model2DEditor.vue +++ b/src/editor/Model2DEditor.vue @@ -104,6 +104,7 @@ import { renderIcon, setQueryParam } from '@/utils/webutils' import { createVNode, defineComponent, markRaw } from 'vue' import Viewport from '@/core/engine/Viewport' import Constract from '@/core/Constract' +import { worldModel } from '@/core/manager/WorldModel.ts' import EventBus from '@/runtime/EventBus' import SceneHelp from '@/core/engine/SceneHelp' import BulkCopy from './BulkCopy.vue' diff --git a/src/editor/ModelMain.vue b/src/editor/ModelMain.vue index a1a0ae5..be15ba1 100644 --- a/src/editor/ModelMain.vue +++ b/src/editor/ModelMain.vue @@ -9,10 +9,10 @@
-
+
+ v-model="worldModelState.currentEnvId">