一言以蔽之,BinMDataStd
是 OpenCASCADE Technology (OCCT) 库中一个核心的持久化 (Persistence) 模块,专门负责将 OCAF (Open CASCADE Application Framework) 文档中的标准数据属性 (Standard Attributes) 以二进制格式进行存取。
简单来说,当您需要将一个包含几何、元数据、参数等信息的 OCCT 模型保存成一个二进制文件(通常是 .cfs
或自定义后缀)时,就是 BinMDataStd
这个模块在幕后工作,将内存中的数据对象“翻译”成二进制流写入文件;反之,当您打开这个文件时,它再将二进制流“翻译”回内存中的数据对象。
## 核心概念:OCAF 与持久化
要理解 BinMDataStd
,首先要了解 OCAF 的基本思想:
-
OCAF (Open CASCADE Application Framework): 这是 OCCT 的数据框架。它不像传统的 CAD 文件格式那样直接存储几何,而是使用一个通用的数据结构:标签-属性 (Label-Attribute) 模型。
- 标签 (Label): 树状结构中的节点,用来组织数据。
- 属性 (Attribute): 附着在标签上的具体数据,例如一个点的坐标、一条线的长度、一个零件的名称等。
-
持久化 (Persistence): 指的是将内存中 OCAF 的标签-属性树结构保存到磁盘文件(序列化),以及从文件中恢复它们(反序列化)的过程。OCCT 提供了两种主要的持久化机制:
- 二进制持久化 (
Bin
): 速度快,文件小,但不可读。BinMDataStd
就属于这一类。 - XML 持久化 (
Xml
): 速度慢,文件大,但人类可读,易于调试。对应的模块是XmlMDataStd
。
- 二进制持久化 (
## BinMDataStd
的作用:驱动程序 (Driver) 模式 ⚙️
BinMDataStd
的核心设计是驱动程序模式 (Driver Pattern)。OCAF 中有各种各样的标准属性(定义在 TDataStd
工具包中),例如整数、实数、字符串、数组等。BinMDataStd
为每一种标准属性都提供了一个专门的 “驱动程序”,负责处理该特定类型属性的二进制读写。
这就是您列表中看到的 ...Driver
文件的由来。每个 Driver
都是一个 C++ 类,它知道如何:
- 写入 (Write/Store): 从一个给定的属性对象(如
TDataStd_Integer
)中提取出原始值(如int
),然后按照二进制格式写入到输出流中。 - 读取 (Read/Retrieve): 从输入流中读取二进制数据,创建一个新的、空的属性对象(如
new TDataStd_Integer()
),然后用读取到的数据来填充它。
一个具体的例子:BinMDataStd_RealDriver
BinMDataStd_RealDriver.hxx/.cxx
这对文件定义了BinMDataStd_RealDriver
类。- 它的目标是处理
TDataStd_Real
属性,这个属性在 OCAF 中用于存储一个浮点数 (Standard_Real
,即double
)。 - 保存时: 当持久化系统遇到一个
TDataStd_Real
属性时,它会调用BinMDataStd_RealDriver
的写入方法。这个方法会执行类似attribute->GetValue()
的操作来获取double
值,然后将这个double
的二进制表示写入文件流。 - 读取时: 当从文件加载时,系统会调用
BinMDataStd_RealDriver
的读取方法。这个方法会从文件流中读取 8 个字节(一个double
的大小),将其解释为一个double
值,然后创建一个新的TDataStd_Real
属性,并通过attribute->SetValue()
将该值设置进去。
## 文件列表详解
以下是文件列表及其对应处理的 OCAF 标准属性:
文件名 (Driver Name) | 对应的 OCAF 属性 (TDataStd_... ) | 功能描述 |
---|---|---|
BinMDataStd_AsciiStringDriver | TDataStd_AsciiString | 存储和读取一个 ASCII 字符串。 |
BinMDataStd_IntegerDriver | TDataStd_Integer | 存储和读取一个整数。 |
BinMDataStd_RealDriver | TDataStd_Real | 存储和读取一个实数(浮点数)。 |
BinMDataStd_IntegerArrayDriver | TDataStd_IntegerArray | 存储和读取一个整数数组。 |
BinMDataStd_RealArrayDriver | TDataStd_RealArray | 存储和读取一个实数数组。 |
BinMDataStd_BooleanArrayDriver | TDataStd_BooleanArray | 存储和读取一个布尔值数组。 |
BinMDataStd_ExtStringArrayDriver | TDataStd_ExtStringArray | 存储和读取一个宽字符串(支持 Unicode)数组。 |
BinMDataStd_IntegerListDriver | TDataStd_IntegerList | 存储和读取一个整数列表。 |
BinMDataStd_RealListDriver | TDataStd_RealList | 存储和读取一个实数列表。 |
BinMDataStd_BooleanListDriver | TDataStd_BooleanList | 存储和读取一个布尔值列表。 |
BinMDataStd_ExtStringListDriver | TDataStd_ExtStringList | 存储和读取一个宽字符串列表。 |
BinMDataStd_TreeNodeDriver | TDataStd_TreeNode | 存储和读取树节点属性,用于构建除主标签树外的自定义树结构。 |
BinMDataStd_Reference... | TDataStd_Reference... | 存储对其他标签的引用。 |
BinMDataStd_UAttributeDriver | TDF_UAttribute | 存储用户自定义属性的 GUID,用于识别和加载非标准属性。 |
BinMDataStd_ExpressionDriver | TDataStd_Expression | 存储和读取一个数学表达式。 |
BinMDataStd_VariableDriver | TDataStd_Variable | 存储一个带单位的变量。 |
... | ... | 其他驱动程序遵循相同的模式。 |
## 如何协同工作 🗄️
这些 Driver
类本身并不独立工作。它们被一个更上层的持久化管理器(如 BinDrivers
插件)所注册和调用。
- 应用程序启动时: 加载
BinDrivers
插件,该插件会创建一个工厂,将每种属性的类型 (Standard_Type
) 与其对应的BinMDataStd
驱动程序实例关联起来。 - 保存文档时: 应用程序调用保存功能。持久化管理器会遍历 OCAF 文档中的所有标签和属性。
- 查找驱动: 对于遇到的每一个属性,管理器会查询其类型,并在工厂中找到对应的
Driver
。例如,看到TDataStd_IntegerArray
,就找到BinMDataStd_IntegerArrayDriver
。 - 调用驱动: 管理器调用该
Driver
的写入方法,将属性数据写入文件。 - 读取文档时: 过程相反。管理器从文件中读取属性的类型信息,查找并调用相应
Driver
的读取方法来重建属性对象。
## 总结 ✅
BinMDataStd
是 OCCT 持久化框架的基石之一。它通过一个属性类型对应一个驱动程序的清晰模式,实现了对 OCAF 标准数据的高效、可靠的二进制序列化和反序列化,是任何需要保存和加载 OCAF 文档的 OCCT 应用程序都离不开的功能族。