文档模型架构
文档模型是应用程序的骨干,将整个用户项目表示为对象的层次树。它被设计为响应式、可序列化和易于遍历的。
概述
架构基于 组合设计模式。一个抽象基类 DocItem 定义了文档树中可以存在的所有对象(例如图层、工件、组)的通用接口。这允许统一处理复杂的嵌套结构。
模型的关键原则包括:
- 树结构:
Doc对象作为树的根。每个项(根除外)都有一个parent并可以有多个children。 - 响应式: 模型使用信号/槽系统(
blinker)。当项被更改时,它发出信号。父项监听其子项的信号并将它们"冒泡"上树。这允许高级组件如Pipeline通过连接到根Doc对象上的单个信号来监听文档中的任何更改。系统分别跟踪内容更改和变换更改以进行高效更新。 - 变换层次结构: 每个
DocItem都有一个局部变换Matrix。项在"世界"(主画布)中的最终位置、缩放和旋转是其自身局部矩阵和所有祖先的世界矩阵的乘积。 - 数据解耦:
WorkPiece的视觉或原始数据不直接存储在其中。相反,WorkPiece持有一个 UID,引用Doc上中央注册表中的ImportSource对象。这将文档结构与数据管理解耦,使模型更轻 量和灵活。
类继承
此图显示类层次结构。作为文档空间树一部分的每个对象都继承自抽象基类 DocItem,获得核心功能如父级、变换和信号冒泡。
DocItem:提供组合模式实现的抽象基础。- 所有其他类都是
DocItem的具体实现,每个在文档结构中都有专门的角色。
对象组合
此图说明了类的实例如何组装成完整的文档。它显示了对象之间的父子关系和引用。
Doc是顶层对象。它 包含 一个或多个Layer和StockItem。它还 管理 项目中所有ImportSource的注册表。- 每个
Layer包含 用户的内容:WorkPiece和Group。关键是,Layer还 拥有一个Workflow。 Workflow包含 有序的Step列表,定义该图层的制造过程。Group是一个容器,可以容纳WorkPiece和其他Group,允许嵌套变换。WorkPiece是基本设计元素。它不直接存储其原始数据。相反,它通过 UID 引用ImportSource。它还 拥有 自己的Geometry(矢量数据)并可以有Tab列表。
DocItem 描述
-
DocItem(抽象)- 角色: 所有树节点的抽象基类。
- 关键属性:
uid、parent、children、matrix、updated信号、transform_changed信号。提供核心组合模式逻辑。
-
Doc- 角色: 文档树的根。
- 关键属性:
children(Layers、StockItems)、import_sources(将 UID 映射到ImportSource对象的字典)、active_layer。
-
Layer- 角色: 内容的主要组织单位。图层将一组工件与单个制造工作流程相关联。
- 关键属性:
children(WorkPieces、Groups、一个 Workflow)、visible、stock_item_uid。
-
Group- 角色: 其他
DocItem(WorkPiece、Group)的容器。允许作为单个单元变换一组项。
- 角色: 其他
-
WorkPiece- 角色: 表示画布上的单个有形设计元素(例如导入的 SVG)。
- 关键属性:
vectors(Geometry对象)、import_source_uid、tabs、tabs_enabled。其vectors被归一化为 1x1 盒子,所有缩放和定位由其变换matrix处理。
-
Workflow- 角色: 有序的处理指令序列。由
Layer拥有。 - 关键属性:
children(有序的Step列表)。
- 角色: 有序的处理指令序列。由
-
Step- 角色:
Workflow中的单个处理指令(例如"轮廓切割"或"光栅雕刻")。它是一个配置对象,保存定义要使用的生产者、修改器和转换器的字典。
- 角色:
-
StockItem- 角色: 表示文档中的一块物理材料,由其自己的矢量
geometry定义。Layer可以分配给特定的库存项。
- 角色: 表示文档中的一块物理材料,由其自己的矢量