当前位置: 首页 > news >正文

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. 注意事项

  • 依赖库:确保链接了 TKXmlXCAFTKLCAF 等模块。
  • 异常处理:使用 try-catch 捕获 Standard_Failure 异常。
  • 版本兼容性:不同 OpenCASCADE 版本的 XML 格式可能不兼容。
  • 数据完整性:确保文档中所有数据支持序列化(如自定义属性需实现存储机制)。

6. XML 文件结构

生成的 XML 文件包含:

  • Document 根节点:描述文档类型和版本。
  • LabelsAttributes:存储文档树结构和属性数据。
  • Shapes:几何形状的 Base64 编码(通过 BinTools 转换)。

通过上述步骤,你可以轻松实现 OCAF 文档与 XML 文件之间的转换。如果需要扩展功能(如自定义属性序列化),可参考 OpenCASCADE 文档实现 XmlMDataStd 相关类。

相关文章:

  • MyBatis面试常见问题
  • Post-Training Quantization, PTQ
  • 深入探索JVM字节码增强技术与调优实践
  • 基于Python+Django的二手房信息管理系统
  • 用于DiffTraj的行人轨迹数据预处理
  • 程序员学商务英语之Making Business Calls
  • 每日一题--内存池
  • 嵌入式软件开发--面试总结
  • VLLM专题(三十九)—自动前缀缓存(二)
  • 【资源损坏类故障】:详细了解坏块
  • Redis解决缓存击穿问题——两种方法
  • 【踩坑实录】-The function STRING takes only primitive types
  • Netty源码—1.服务端启动流程二
  • extern和static的作用(有例子)
  • 【AI绘图模型介绍】Checkpoint / LoRA / VAE / Embeddings 模型是什么?
  • Java:Apache HttpClient中HttpRoute用法的介绍
  • 如何让节卡机器人精准对点?
  • 基于基于eFish-SBC-RK3576工控板的智慧城市边缘网关
  • 3.3 二分查找专题: LeetCode 35. 搜索插入位置
  • 事务隔离级别是?
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • 奈雪的茶叫停“能喝奶茶就不要喝水”宣传,当地市监称不要误导消费者
  • 昂立教育:去年减亏1.39亿元,今年以“利润持续增长”为核心目标
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电
  • 李在明涉嫌违反《公职选举法》案将于5月1日宣判
  • 自称“最美”通缉犯出狱当主播?央广网:三观怎能跟着“五官”跑