深入解析 OCCT 持久化核心:BinMDataStd 驱动族

一言以蔽之,BinMDataStd 是 OpenCASCADE Technology (OCCT) 库中一个核心的持久化 (Persistence) 模块,专门负责将 OCAF (Open CASCADE Application Framework) 文档中的标准数据属性 (Standard Attributes) 以二进制格式进行存取

简单来说,当您需要将一个包含几何、元数据、参数等信息的 OCCT 模型保存成一个二进制文件(通常是 .cfs 或自定义后缀)时,就是 BinMDataStd 这个模块在幕后工作,将内存中的数据对象“翻译”成二进制流写入文件;反之,当您打开这个文件时,它再将二进制流“翻译”回内存中的数据对象。


## 核心概念:OCAF 与持久化

要理解 BinMDataStd,首先要了解 OCAF 的基本思想:

  1. OCAF (Open CASCADE Application Framework): 这是 OCCT 的数据框架。它不像传统的 CAD 文件格式那样直接存储几何,而是使用一个通用的数据结构:标签-属性 (Label-Attribute) 模型

    • 标签 (Label): 树状结构中的节点,用来组织数据。
    • 属性 (Attribute): 附着在标签上的具体数据,例如一个点的坐标、一条线的长度、一个零件的名称等。
  2. 持久化 (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_AsciiStringDriverTDataStd_AsciiString存储和读取一个 ASCII 字符串。
BinMDataStd_IntegerDriverTDataStd_Integer存储和读取一个整数。
BinMDataStd_RealDriverTDataStd_Real存储和读取一个实数(浮点数)。
BinMDataStd_IntegerArrayDriverTDataStd_IntegerArray存储和读取一个整数数组。
BinMDataStd_RealArrayDriverTDataStd_RealArray存储和读取一个实数数组。
BinMDataStd_BooleanArrayDriverTDataStd_BooleanArray存储和读取一个布尔值数组。
BinMDataStd_ExtStringArrayDriverTDataStd_ExtStringArray存储和读取一个宽字符串(支持 Unicode)数组。
BinMDataStd_IntegerListDriverTDataStd_IntegerList存储和读取一个整数列表。
BinMDataStd_RealListDriverTDataStd_RealList存储和读取一个实数列表。
BinMDataStd_BooleanListDriverTDataStd_BooleanList存储和读取一个布尔值列表。
BinMDataStd_ExtStringListDriverTDataStd_ExtStringList存储和读取一个宽字符串列表。
BinMDataStd_TreeNodeDriverTDataStd_TreeNode存储和读取树节点属性,用于构建除主标签树外的自定义树结构。
BinMDataStd_Reference...TDataStd_Reference...存储对其他标签的引用。
BinMDataStd_UAttributeDriverTDF_UAttribute存储用户自定义属性的 GUID,用于识别和加载非标准属性。
BinMDataStd_ExpressionDriverTDataStd_Expression存储和读取一个数学表达式。
BinMDataStd_VariableDriverTDataStd_Variable存储一个带单位的变量。
......其他驱动程序遵循相同的模式。

## 如何协同工作 🗄️

这些 Driver 类本身并不独立工作。它们被一个更上层的持久化管理器(如 BinDrivers 插件)所注册和调用。

  1. 应用程序启动时: 加载 BinDrivers 插件,该插件会创建一个工厂,将每种属性的类型 (Standard_Type) 与其对应的 BinMDataStd 驱动程序实例关联起来。
  2. 保存文档时: 应用程序调用保存功能。持久化管理器会遍历 OCAF 文档中的所有标签和属性。
  3. 查找驱动: 对于遇到的每一个属性,管理器会查询其类型,并在工厂中找到对应的 Driver。例如,看到 TDataStd_IntegerArray,就找到 BinMDataStd_IntegerArrayDriver
  4. 调用驱动: 管理器调用该 Driver 的写入方法,将属性数据写入文件。
  5. 读取文档时: 过程相反。管理器从文件中读取属性的类型信息,查找并调用相应 Driver 的读取方法来重建属性对象。

## 总结 ✅

BinMDataStd 是 OCCT 持久化框架的基石之一。它通过一个属性类型对应一个驱动程序的清晰模式,实现了对 OCAF 标准数据的高效、可靠的二进制序列化和反序列化,是任何需要保存和加载 OCAF 文档的 OCCT 应用程序都离不开的功能族。

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心瞳几何原语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值