TDocStd_Document
是 OCCT 数据框架(TDF)中管理文档(Document)的核心组件,主要用于存储、操作和序列化基于标签(Label)和属性(Attribute)的层次化数据。以下是对文档的逐层解析:
1. 核心功能概述
TDocStd_Document
继承自 CDM_Document
,是 TDF(TDataStd 数据框架)的入口点,提供以下核心功能:
- 数据存储:通过
TDF_Data
管理标签(TDF_Label
)和属性(TDF_Attribute
)的树形结构。 - 事务管理:支持事务(Transaction)操作(如
OpenCommand
/CommitCommand
),允许撤销(Undo)和重做(Redo)。 - 持久化:支持文档的保存、加载,并管理修改状态(
IsSaved
/IsChanged
)。 - 引用与更新:处理外部引用变更时的依赖更新(
UpdateReferences
)和文档重计算(Recompute
)。
2. 关键成员与方法
数据管理
Main()
返回文档的根标签(0:1
),是数据树的起点。GetData()
/SetData()
访问或设置底层的TDF_Data
对象(实际存储数据的容器)。IsEmpty()
检查根标签是否为空(无属性)。
事务与修改跟踪
- 事务控制
NewCommand()
:开始新事务(可撤销的原子操作)。CommitCommand()
/AbortCommand()
:提交或中止事务。HasOpenCommand()
:检查是否有未提交的事务。
- 撤销/重做
Undo()
/Redo()
:基于TDF_Delta
记录的数据变更实现回退或重做。SetUndoLimit()
:限制撤销步骤的最大数量。
持久化与状态
StorageFormat()
返回文档的存储格式标识(如文件扩展名)。IsSaved()
/SetSaved()
标记文档是否已保存到文件。IsChanged()
检查自上次保存后是否有未提交的修改。
高级功能
- 嵌套事务
SetNestedTransactionMode()
允许嵌套事务(如子操作在父事务中回滚)。 - 增量压缩
InitDeltaCompaction()
和PerformDeltaCompaction()
合并多个Delta
以减少内存占用。 - 空标签处理
SetEmptyLabelsSavingMode()
控制是否保存无属性的标签。
3. 设计模式与技术亮点
- 命令模式(Command Pattern)
通过事务(Command
)封装数据修改,支持撤销/重做。 - 观察者模式
SetModified()
和PurgeModified()
跟踪标签的修改状态,触发更新。 - 数据版本控制
StorageFormatVersion()
管理文档格式的兼容性(如不同 OCCT 版本间的迁移)。
4. 典型使用场景
// 创建文档
Handle(TDocStd_Document) doc = new TDocStd_Document("MyFormat");
// 获取根标签并添加数据
TDF_Label root = doc->Main();
TDataStd_Integer::Set(root, 42); // 添加整数属性
// 开始事务并修改数据
doc->OpenCommand();
TDataStd_Integer::Set(root, 100);
doc->CommitCommand();
// 撤销操作
if (doc->GetAvailableUndos() > 0)
doc->Undo(); // 恢复值为42
5. 注意事项
- 内存管理
文档需通过Handle
(智能指针)管理,避免内存泄漏(见构造函数注释)。 - 性能
频繁的撤销操作可能占用大量内存(Delta
链),需合理设置UndoLimit
。 - 线程安全
文档操作默认非线程安全,需外部同步。
6. 总结
TDocStd_Document
是 OCCT 中连接应用程序与数据框架的桥梁,提供了完整的数据存储、事务管理和版本控制功能。其设计兼顾灵活性与性能,适合需要复杂数据建模的应用(如 CAD、CAE 工具)。理解其核心机制(如事务、标签属性模型)是高效使用 OCCT 的关键。