opencascade 源码学习 XmlDrivers-XmlDrivers
OpenCASCADE 中的 XmlDrivers
是用于处理 XML 格式的 CAD 数据持久化模块,属于 OCAF(Open CASCADE Application Framework) 的一部分。它允许将 OCAF 文档(包含 CAD 数据、属性、关系等)序列化为 XML 文件,或从 XML 文件反序列化加载数据。以下是 XmlDrivers
的基本用法和步骤:
1. 核心功能
- 保存 OCAF 文档:将
TDocStd_Document
保存为 XML 文件。 - 加载 OCAF 文档:从 XML 文件恢复
TDocStd_Document
。 - 支持数据类型:几何形状、颜色、层、名称等属性。
2. 使用步骤
(1) 初始化 XmlDrivers 插件
在使用 XmlDrivers
前,需注册 XML 格式的驱动到 OCAF 应用程序中。通常通过以下方式初始化:
#include <XmlDrivers.hxx>
#include <Plugin_Macro.hxx>
// 注册 XML 驱动
Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger();
XmlDrivers::DefineFormat(aMsgMgr);
(2) 创建 OCAF 应用程序
创建支持 XML 持久化的 OCAF 应用程序对象:
#include <TDocStd_Application.hxx>
Handle(TDocStd_Application) app = TDocStd_Application::GetInstance();
(3) 保存文档到 XML
将 OCAF 文档保存为 XML 文件:
#include <TDocStd_Document.hxx>
#include <PCDM_StoreStatus.hxx>
// 创建新文档
Handle(TDocStd_Document) doc;
app->NewDocument("XmlOcaf", doc);
// ... 在此向文档中添加数据(形状、属性等) ...
// 保存文档
TCollection_ExtendedString xmlFilePath = "/path/to/save.xml";
PCDM_StoreStatus status = app->SaveAs(doc, xmlFilePath);
if (status == PCDM_SS_OK) {
std::cout << "文档保存成功!" << std::endl;
}
(4) 从 XML 加载文档
从 XML 文件恢复 OCAF 文档:
Handle(TDocStd_Document) restoredDoc;
TCollection_ExtendedString xmlFilePath = "/path/to/save.xml";
// 加载文档
if (app->Open(xmlFilePath, restoredDoc) == PCDM_RS_OK) {
std::cout << "文档加载成功!" << std::endl;
}
// ... 使用恢复的文档数据 ...
3. 关键类与 API
XmlDrivers
:提供 XML 驱动的注册方法DefineFormat()
。TDocStd_Application
:OCAF 应用程序,管理文档生命周期。TDocStd_Document
:存储 CAD 数据和属性的文档对象。PCDM_Reader
/PCDM_Writer
:XML 读写器的基类,实际使用XmlDrivers
的具体实现。
4. 示例代码(完整流程)
Handle(Poly_Triangulation) aResMesh;
// Some code to generate or create a valid mesh object
// aResMesh = transferTriangleWithPointNormalsUVIndices(aTriangleWithPointNormalsUVIndices, aPoints, aPointsSize, anUVPoints, aPreparedNorms, myScaleUnit);
BRep_Builder aBuilder;
// Tool to work with shapes
TopoDS_Face aFace = TopoDS::Face(shas.GetThis());
// New TopoDS_Shape object
aBuilder.MakeFace(aFace, aResMesh);
// Now we have a TopoDS_Shape, that can be used to set for a XBF document
// The next code to set a shape to the Document
Handle(TDocStd_Document) aDoc;
Handle(TDocStd_Application) anApp = new TDocStd_Application;
// Initialize standard document formats at creation - they should
// be available even if this DRAW plugin is not loaded by pload command
StdLDrivers::DefineFormat(anApp);
BinLDrivers::DefineFormat(anApp);
XmlLDrivers::DefineFormat(anApp);
StdDrivers::DefineFormat(anApp);
BinDrivers::DefineFormat(anApp);
XmlDrivers::DefineFormat(anApp);
TCollection_ExtendedString format;
anApp->NewDocument(format,aDoc);
Handle(XCAFDoc_ShapeTool) aShTool =new XCAFDoc_ShapeTool();
//aShTool->Set(aDoc->Main());
aShTool->SetShape(aDoc->Main(),aFace);
// Additionally you can link a color and another attributes.
// Write a Gltf(glb)
RWGltf_CafReader aReader;
TCollection_AsciiString ddd = "d:/test.glb";
Message_ProgressRange ddddddd;
aReader.Perform(ddd, ddddddd);
5. 注意事项
- 依赖库:确保链接了
TKXmlXCAF
、TKLCAF
等模块。 - 异常处理:使用
try-catch
捕获Standard_Failure
异常。 - 版本兼容性:不同 OpenCASCADE 版本的 XML 格式可能不兼容。
- 数据完整性:确保文档中所有数据支持序列化(如自定义属性需实现存储机制)。
6. XML 文件结构
生成的 XML 文件包含:
Document
根节点:描述文档类型和版本。Labels
和Attributes
:存储文档树结构和属性数据。Shapes
:几何形状的 Base64 编码(通过BinTools
转换)。
通过上述步骤,你可以轻松实现 OCAF 文档与 XML 文件之间的转换。如果需要扩展功能(如自定义属性序列化),可参考 OpenCASCADE 文档实现 XmlMDataStd
相关类。