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"; // Define the ModuleDefineOption interface export interface ModuleDefineOption { /** * 物流单元类型名称 */ name: string; renderer: BaseRenderer; interaction: BaseInteraction; setter: PropertySetter; entity: new () => BaseEntity; } // Internal storage for module definitions const modules = new Map() 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.`) } modules.set(option.name, option) return option.renderer.init() } /** * 获取模块 * 如果获取不了 直接抛异常 */ export function getModuleOption(name: string): ModuleDefineOption { const module = modules.get(name) if (!module) { throw new Error(`Module with name "${name}" is not defined.`) } return module } /** * 根据物料类型名称, 获取其渲染器 * 如果获取不了 直接抛异常 */ export function getRenderer(name: string): T { const module = getModuleOption(name) return module.renderer as T } /** * 根据物料类型名称, 获取交互控制器 * 如果获取不了 直接抛异常 */ export function getInteraction(name: string): T { const module = getModuleOption(name) return module.interaction as 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 }