From 06fdbfe2c11d429714c715da61f1a476f2dbb49f Mon Sep 17 00:00:00 2001 From: lizw-2015 <1183409807@qq.com> Date: Fri, 6 Jun 2025 16:51:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor(property):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 IMeta接口,改为使用 PropertySetter - 新增 PropertyPanel 组件用于渲染属性 - 修改 ModuleManager 中的 meta 为 setter - 更新各模块的元数据文件,使用新的 PropertySetter 结构 --- src/core/ModelUtils.ts | 4 +- src/core/base/IMeta.ts | 20 -- src/core/base/PropertyTypes.ts | 34 +++ src/core/controls/EsDragControls.ts | 5 +- src/core/controls/SelectInspect.ts | 13 +- src/core/engine/Viewport.ts | 7 +- src/core/manager/ModuleManager.ts | 12 +- src/editor/widgets/property/PropertyPanel.vue | 112 ++++++++ .../widgets/property/PropertyPanelConstant.ts | 58 ++++ src/editor/widgets/property/PropertyPanelTypes.ts | 7 + src/editor/widgets/property/PropertyPanelUtils.ts | 0 src/editor/widgets/property/PropertyView.vue | 296 ++++++++++----------- src/modules/gstore/GstoreMeta.ts | 14 - src/modules/gstore/GstorePropertySetter.ts | 12 + src/modules/gstore/index.ts | 14 +- src/modules/measure/MeasureMeta.ts | 15 -- src/modules/measure/MeasurePropertySetter.ts | 12 + src/modules/measure/index.ts | 14 +- src/modules/pallet/PalletMeta.ts | 49 ---- src/modules/pallet/PalletPropertySetter.ts | 20 ++ src/modules/pallet/index.ts | 12 +- src/modules/ptr/PtrMeta.ts | 49 ---- src/modules/ptr/PtrPropertySetter.ts | 20 ++ src/modules/ptr/index.ts | 12 +- src/modules/rack/RackMeta.ts | 55 ---- src/modules/rack/RackPropertySetter.ts | 64 +++++ src/modules/rack/index.ts | 12 +- src/modules/way/WayMeta.ts | 14 - src/modules/way/WayPropertySetter.ts | 12 + src/modules/way/index.ts | 14 +- src/pages/DataForm01.vue | 3 +- 31 files changed, 544 insertions(+), 441 deletions(-) create mode 100644 src/core/base/PropertyTypes.ts create mode 100644 src/editor/widgets/property/PropertyPanel.vue create mode 100644 src/editor/widgets/property/PropertyPanelConstant.ts create mode 100644 src/editor/widgets/property/PropertyPanelTypes.ts create mode 100644 src/editor/widgets/property/PropertyPanelUtils.ts delete mode 100644 src/modules/gstore/GstoreMeta.ts create mode 100644 src/modules/gstore/GstorePropertySetter.ts delete mode 100644 src/modules/measure/MeasureMeta.ts create mode 100644 src/modules/measure/MeasurePropertySetter.ts delete mode 100644 src/modules/pallet/PalletMeta.ts create mode 100644 src/modules/pallet/PalletPropertySetter.ts delete mode 100644 src/modules/ptr/PtrMeta.ts create mode 100644 src/modules/ptr/PtrPropertySetter.ts delete mode 100644 src/modules/rack/RackMeta.ts create mode 100644 src/modules/rack/RackPropertySetter.ts delete mode 100644 src/modules/way/WayMeta.ts create mode 100644 src/modules/way/WayPropertySetter.ts diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index ebfce4f..297b984 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -2,9 +2,7 @@ import * as THREE from 'three' import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts' import { getAllItemTypes, getItemTypeByName } from '@/model/itemType/ItemTypeDefine.ts' import type Viewport from '@/core/engine/Viewport' -import { computeBoundsTree, disposeBoundsTree } from 'three-mesh-bvh' import { Vector2 } from 'three/src/math/Vector2' -import type Toolbox from '@/model/itemType/Toolbox.ts' import EventBus from '@/runtime/EventBus.ts' import Decimal from 'decimal.js' @@ -174,7 +172,7 @@ export function deletePointByKeyboard() { viewport.state.selectedObject = undefined viewport.state.selectedItem = undefined viewport.state.selectedEntityId = undefined - viewport.state.selectedObjectMeta = undefined + viewport.state.selectedObjectSetter = undefined } EventBus.dispatch('entityDeleted', { diff --git a/src/core/base/IMeta.ts b/src/core/base/IMeta.ts index 356693f..3654060 100644 --- a/src/core/base/IMeta.ts +++ b/src/core/base/IMeta.ts @@ -31,23 +31,3 @@ export const BASIC_META_OF_LINE: ItemTypeMeta = [] * "线"对象类型的,基础元数据, 排在后面的 */ export const BASIC_META_OF_LINE2: ItemTypeMeta = [] - -/** - * 属性面板元数据声明, 第一级 category, 第二级 tabName, 第三级 MetaItem - */ -export type IMeta = MetaItem[] - -/** - * PropertyPanelConfig interface - * Defines the structure of property panel configurations. - */ -export interface MetaItem { - field?: string; - editor: string; - editorProps?: any; - label?: string; - readonly?: boolean; - category?: string; - - [key: string]: any; -} \ No newline at end of file diff --git a/src/core/base/PropertyTypes.ts b/src/core/base/PropertyTypes.ts new file mode 100644 index 0000000..872496b --- /dev/null +++ b/src/core/base/PropertyTypes.ts @@ -0,0 +1,34 @@ +import type { FormField } from "@/components/data-form/DataFormTypes.ts"; + +interface PropertyFieldSetter extends FormField { +} + +interface PropertyFlattenSetter { + /** label宽度 */ + labelWidth?: string | number; + /** 表单字段大小 */ + size?: "" | "small" | "default" | "large"; + /** 设置器集合 */ + fields: Array; +} + +interface PropertySetterGroup extends PropertyFlattenSetter { + /** 分组标题 */ + title: string; + /** 是否展开状态(默认为true) */ + expand?: boolean; +} + +interface PropertySetter { + /** 最上面平铺的设置器 */ + flatten?: PropertyFlattenSetter; + /** 设置器分组集合 */ + groups?: Array; +} + +export type { + PropertyFieldSetter, + PropertyFlattenSetter, + PropertySetterGroup, + PropertySetter, +} diff --git a/src/core/controls/EsDragControls.ts b/src/core/controls/EsDragControls.ts index 83f4935..145097a 100644 --- a/src/core/controls/EsDragControls.ts +++ b/src/core/controls/EsDragControls.ts @@ -1,11 +1,8 @@ import * as THREE from 'three' import { DragControls } from './DragControls.js' import type Viewport from '@/core/engine/Viewport.ts' -import { getItemTypeByName } from '@/model/itemType/ItemTypeDefine' -import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine' -import { markRaw } from 'vue' import EventBus from '@/runtime/EventBus' -import { getInteraction, getMeta } from '@/core/manager/ModuleManager.ts' +import { getInteraction } from '@/core/manager/ModuleManager.ts' import type BaseInteraction from '@/core/base/BaseInteraction.ts' // dragControls 绑定函数 diff --git a/src/core/controls/SelectInspect.ts b/src/core/controls/SelectInspect.ts index b8c7bf4..cf74775 100644 --- a/src/core/controls/SelectInspect.ts +++ b/src/core/controls/SelectInspect.ts @@ -6,8 +6,7 @@ import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' import EventBus from '@/runtime/EventBus' import { markRaw } from 'vue' -import { getMeta } from '@/core/manager/ModuleManager.ts' -import MouseMoveInspect from '@/core/controls/MouseMoveInspect.ts' +import { getSetter } from '@/core/manager/ModuleManager.ts' import Constract from '@/core/Constract.ts' let pdFn, pmFn, puFn @@ -346,13 +345,13 @@ export default class SelectInspect implements IControls { this.viewport.state.selectedObject = markRaw(object) this.viewport.state.selectedItem = markRaw(item) this.viewport.state.selectedEntityId = entityId - this.viewport.state.selectedObjectMeta = getMeta(itemTypeName) + this.viewport.state.selectedObjectSetter = getSetter(itemTypeName) EventBus.dispatch('selectedObjectChanged', { viewport: markRaw(this.viewport), selectedObject: this.viewport.state.selectedObject, selectedItem: this.viewport.state.selectedItem, selectedEntityId: this.viewport.state.selectedEntityId, - selectedObjectMeta: this.viewport.state.selectedObjectMeta + selectedObjectSetter: this.viewport.state.selectedObjectSetter, }) } } else { @@ -360,13 +359,13 @@ export default class SelectInspect implements IControls { this.viewport.state.selectedObject = null this.viewport.state.selectedItem = null this.viewport.state.selectedEntityId = null - this.viewport.state.selectedObjectMeta = null + this.viewport.state.selectedObjectSetter = null EventBus.dispatch('selectedObjectChanged', { viewport: markRaw(this.viewport), selectedObject: null, selectedItem: null, selectedEntityId: null, - selectedObjectMeta: null + selectedObjectSetter: null, }) } } @@ -402,7 +401,7 @@ export default class SelectInspect implements IControls { multiSelectedObjects.push(object) multiSelectedItems.push(item) multiSelectedEntityIds.push(object.userData.entityId) - multiSelectedObjectMetas.push(getMeta(object.userData.t)) + // multiSelectedObjectMetas.push(getMeta(object.userData.t)) } } } diff --git a/src/core/engine/Viewport.ts b/src/core/engine/Viewport.ts index 8928f32..01ffd67 100644 --- a/src/core/engine/Viewport.ts +++ b/src/core/engine/Viewport.ts @@ -8,8 +8,8 @@ import { markRaw, reactive, toRaw, watch } from 'vue' import type IControls from '../controls/IControls' import { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer' import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer' -import { getAllItemTypes, type ItemTypeMeta } from '@/model/itemType/ItemTypeDefine.ts' import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts' +import { getAllItemTypes } from '@/model/itemType/ItemTypeDefine.ts' import SceneHelp from './SceneHelp' import SelectInspect from '../controls/SelectInspect' @@ -22,6 +22,7 @@ import StateManager from '@/core/manager/StateManager.ts' import EventBus from '@/runtime/EventBus.ts' import Constract from '@/core/Constract.ts' import type { IMeta } from '@/core/base/IMeta.ts' +import type { PropertySetter } from "@/core/base/PropertyTypes.ts"; /** * 视窗对象 @@ -72,7 +73,7 @@ export default class Viewport { selectedObject: undefined, selectedItem: undefined, selectedEntityId: undefined, - selectedObjectMeta: undefined, + selectedObjectSetter: undefined, multiSelectedObjects: [], multiSelectedItems: [], @@ -567,7 +568,7 @@ export interface ViewportState { selectedObject: THREE.Object3D | undefined selectedItem: ItemJson | undefined selectedEntityId: string | undefined - selectedObjectMeta: IMeta | undefined + selectedObjectSetter: PropertySetter | undefined /** * 红选的对象集 diff --git a/src/core/manager/ModuleManager.ts b/src/core/manager/ModuleManager.ts index 85ad441..e6cb43c 100644 --- a/src/core/manager/ModuleManager.ts +++ b/src/core/manager/ModuleManager.ts @@ -1,8 +1,8 @@ import * as THREE from 'three' import BaseRenderer from '@/core/base/BaseRenderer' import BaseInteraction from '@/core/base/BaseInteraction' -import type { IMeta } from '@/core/base/IMeta' import BaseEntity from '@/core/base/BaseItemEntity' +import type { PropertySetter } from "@/core/base/PropertyTypes.ts"; // Define the ModuleDefineOption interface export interface ModuleDefineOption { @@ -12,7 +12,7 @@ export interface ModuleDefineOption { name: string; renderer: BaseRenderer; interaction: BaseInteraction; - meta: IMeta; + setter: PropertySetter; entity: new () => BaseEntity; } @@ -61,13 +61,9 @@ export function getInteraction(name: string): T { return module.interaction as T } -/** - * 根据物料类型名称, 获取元数据 - * 如果获取不了 直接抛异常 - */ -export function getMeta(name: string): T { +export function getSetter(name: string) { const module = getModuleOption(name) - return module.meta as T + return module.setter; } /** diff --git a/src/editor/widgets/property/PropertyPanel.vue b/src/editor/widgets/property/PropertyPanel.vue new file mode 100644 index 0000000..eec5d11 --- /dev/null +++ b/src/editor/widgets/property/PropertyPanel.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/editor/widgets/property/PropertyPanelConstant.ts b/src/editor/widgets/property/PropertyPanelConstant.ts new file mode 100644 index 0000000..5f8ec3c --- /dev/null +++ b/src/editor/widgets/property/PropertyPanelConstant.ts @@ -0,0 +1,58 @@ +import type { DataFormProps } from "@/components/data-form/DataFormTypes.ts"; +import type { PropertyFieldSetter } from "@/core/base/PropertyTypes.ts"; + +const defDataFormProps: DataFormProps = { + columnCount: 1, + layout: "onlyLabelFixed", + labelWidth: "100px", + size: "small", +}; + +const basicFieldsSetter: Array = [ + { + dataPath: 'id', label: '唯一ID', input: 'Input', + inputProps: { + readonly: true, + }, + }, + { + dataPath: 'name', label: '名称', input: 'Input', + inputProps: {}, + }, + { + dataPath: 'visible', label: '可见', input: 'Checkbox', + inputProps: {}, + }, + { + dataPath: 'dt.selectable', label: '可选中', input: 'Checkbox', + inputProps: {}, + }, + { + dataPath: 'dt.protected', label: '受保护', input: 'Checkbox', + inputProps: {}, + }, + { + dataPath: 'dt.label', label: '标签', input: 'Input', + inputProps: {}, + }, + { + dataPath: 'dt.color', label: '颜色', input: 'ColorPicker', + inputProps: {}, + }, + // { + // dataPath: 'tf', input: 'TransformEditor', + // inputProps: { + // }, + // }, + // { + // dataPath: 'dt', input: 'InOutCenterEditor', + // inputProps: { + // }, + // }, +]; + + +export { + defDataFormProps, + basicFieldsSetter, +} diff --git a/src/editor/widgets/property/PropertyPanelTypes.ts b/src/editor/widgets/property/PropertyPanelTypes.ts new file mode 100644 index 0000000..cce2686 --- /dev/null +++ b/src/editor/widgets/property/PropertyPanelTypes.ts @@ -0,0 +1,7 @@ +interface PropertyPanelProps { + +} + +export type { + PropertyPanelProps, +} diff --git a/src/editor/widgets/property/PropertyPanelUtils.ts b/src/editor/widgets/property/PropertyPanelUtils.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/editor/widgets/property/PropertyView.vue b/src/editor/widgets/property/PropertyView.vue index 447c0da..e0e211c 100644 --- a/src/editor/widgets/property/PropertyView.vue +++ b/src/editor/widgets/property/PropertyView.vue @@ -1,188 +1,164 @@