diff --git a/src/designer/Viewport.ts b/src/designer/Viewport.ts index 05f1483..cf8c274 100644 --- a/src/designer/Viewport.ts +++ b/src/designer/Viewport.ts @@ -9,7 +9,7 @@ import { reactive, watch } from 'vue' import type { ITool } from '@/designer/model2DEditor/tools/ITool.ts' import { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer' import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer' -import { getAllItemTypes } from '@/runtime/DefineItemType.ts' +import { getAllItemTypes } from '@/model/itemType/ItemTypeDefine.ts' import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts' import type Toolbox from '@/model/itemType/Toolbox.ts' diff --git a/src/designer/model2DEditor/EsDragControls.ts b/src/designer/model2DEditor/EsDragControls.ts index 1824455..a51fd69 100644 --- a/src/designer/model2DEditor/EsDragControls.ts +++ b/src/designer/model2DEditor/EsDragControls.ts @@ -2,7 +2,7 @@ import { DragControls } from './DragControls.js' import * as THREE from 'three' import type Viewport from '@/designer/Viewport.ts' import Constract from '@/designer/Constract.ts' -import { getItemTypeByName } from '@/runtime/DefineItemType.ts' +import { getItemTypeByName } from '@/model/itemType/ItemTypeDefine.ts' import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts' import { markRaw } from 'vue' diff --git a/src/model/ModelUtils.ts b/src/model/ModelUtils.ts index 148a1df..89ca158 100644 --- a/src/model/ModelUtils.ts +++ b/src/model/ModelUtils.ts @@ -1,7 +1,7 @@ import * as THREE from 'three' import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts' import type { ItemJson } from '@/model/WorldModelType.ts' -import { getAllItemTypes, getItemTypeByName } from '@/runtime/DefineItemType.ts' +import { getAllItemTypes, getItemTypeByName } from '@/model/itemType/ItemTypeDefine.ts' import type Viewport from '@/designer/Viewport.ts' import { computeBoundsTree, disposeBoundsTree } from 'three-mesh-bvh' import { Vector2 } from 'three/src/math/Vector2' diff --git a/src/model/itemType/ItemType.ts b/src/model/itemType/ItemType.ts index 67ae75c..ed1eb1a 100644 --- a/src/model/itemType/ItemType.ts +++ b/src/model/itemType/ItemType.ts @@ -53,7 +53,7 @@ export default abstract class ItemType { /** * 添加到 scene 后的回调 */ - afterAddScene(viewport:Viewport, scene: THREE.Scene, objects: THREE.Object3D[]): void { + afterAddScene(viewport: Viewport, scene: THREE.Scene, objects: THREE.Object3D[]): void { } /** diff --git a/src/model/itemType/ItemTypeDefine.ts b/src/model/itemType/ItemTypeDefine.ts index a2f2125..1dcfeb2 100644 --- a/src/model/itemType/ItemTypeDefine.ts +++ b/src/model/itemType/ItemTypeDefine.ts @@ -1,4 +1,65 @@ +import _ from 'lodash' import type ItemType from '@/model/itemType/ItemType.ts' +import * as THREE from 'three' + +const itemTypes: Record = {} +window['itemTypes'] = itemTypes + +/** + * 定义一个 物流单元 + */ +export function defineItemType(option: ItemTypeDefineOption) { + itemTypes[option.name] = option + option.clazz.name = option.name + option.clazz.option = option + return option +} + +export function getItemTypeByName(type: string): ItemTypeDefineOption { + const itemType = _.get(itemTypes, type) + if (!itemType) { + console.warn(`未找到物流单元类型定义: ${type}`) + return + } + return itemType +} + +export function getAllItemTypes(): ItemTypeDefineOption[] { + return Object.values(itemTypes) +} + + +/** + * "点"对象类型的,基础元数据 + */ +export const BASIC_META_OF_POINT: ItemTypeMeta = [ + { field: 'uuid', editor: 'uuid' }, + { field: 'name', editor: 'string' }, + { editor: 'transform' }, + { field: 'color', editor: 'color' }, + { editor: '-' }, + { editor: 'in_out_center' } +] + +/** + * "物流运输单元"对象类型的,基础元数据, 排在后面的 + */ +export const BASIC_META_OF_POINT2: ItemTypeMeta = [ + { field: 'userData.selectable', editor: 'checkbox' }, + { field: 'userData.protected', editor: 'checkbox' }, + { field: 'visible', editor: 'checkbox' } +] + +/** + * "线"对象类型的,基础元数据 + */ +export const BASIC_META_OF_LINE: ItemTypeMeta = [] + +/** + * "线"对象类型的,基础元数据, 排在后面的 + */ +export const BASIC_META_OF_LINE2: ItemTypeMeta = [] + export type ActionType = /** @@ -23,4 +84,20 @@ export interface ItemTypeDefineOption { label: string actionType: ActionType clazz: ItemType + + getMeta(object: THREE.Object3D): ItemTypeMeta } + + +/** + * 单元类型元数据 + */ +export type ItemTypeMeta = ItemTypeMetaItem[] + +export type ItemTypeMetaItem = { + field?: string + editor: 'uuid' | 'string' | 'number' | + 'color' | 'transform' | '-' | + 'select' | 'checkbox' | 'text' | + 'in_out_center' | 'group_button' +} \ No newline at end of file diff --git a/src/model/itemType/ItemTypeLine.ts b/src/model/itemType/ItemTypeLine.ts index bbdd634..62629a6 100644 --- a/src/model/itemType/ItemTypeLine.ts +++ b/src/model/itemType/ItemTypeLine.ts @@ -4,7 +4,6 @@ import type { ItemJson } from '@/model/WorldModelType.ts' import type WorldModel from '@/model/WorldModel.ts' import type Viewport from '@/designer/Viewport.ts' import { findObject3DByCondition, findObject3DById } from '@/model/ModelUtils.ts' -import type { Line2 } from 'three/examples/jsm/lines/Line2.js' let pmFn @@ -110,7 +109,8 @@ export default abstract class ItemTypeLine extends ItemType { actionType: item.a, label: item.l, color: item.c, - selectable: true + selectable: true, + protected: false, }) point.rotation.set( diff --git a/src/model/itemType/line/conveyor/ConveyorMeta.ts b/src/model/itemType/line/conveyor/ConveyorMeta.ts index f5f600b..fffba71 100644 --- a/src/model/itemType/line/conveyor/ConveyorMeta.ts +++ b/src/model/itemType/line/conveyor/ConveyorMeta.ts @@ -1,4 +1,4 @@ -import { defineItemType } from '@/runtime/DefineItemType.ts' +import { defineItemType } from '@/model/itemType/ItemTypeDefine.ts' import Conveyor from './Conveyor.ts' export default defineItemType({ diff --git a/src/model/itemType/measure/MeasureMeta.ts b/src/model/itemType/measure/MeasureMeta.ts index 42220ec..f1c5fc6 100644 --- a/src/model/itemType/measure/MeasureMeta.ts +++ b/src/model/itemType/measure/MeasureMeta.ts @@ -1,9 +1,36 @@ -import { defineItemType } from '@/runtime/DefineItemType.ts' +import * as THREE from 'three' import Measure from '@/model/itemType/measure/Measure.ts' +import { + defineItemType, + BASIC_META_OF_POINT, + BASIC_META_OF_POINT2, + BASIC_META_OF_LINE, + BASIC_META_OF_LINE2, + type ItemTypeMeta +} from '@/model/itemType/ItemTypeDefine.ts' export default defineItemType({ name: 'measure', label: '测量距离', actionType: 'ln', - clazz: new Measure() + clazz: new Measure(), + + /** + * 获取单元类型的元数据 + */ + getMeta(object: THREE.Object3D): ItemTypeMeta { + if (object.name === Measure.LINE_NAME) { + return [ + ...BASIC_META_OF_LINE, + ...BASIC_META_OF_LINE2 + ] + + } else if (object.name === Measure.POINT_NAME) { + return [ + ...BASIC_META_OF_POINT, + ...BASIC_META_OF_POINT2 + ] + } + return [] + } }) \ No newline at end of file