opencascade 源码学习 XmlDrivers-XmlDrivers

news2025/3/26 6:34:06

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 相关类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ccfcsp3302相似度计算

//相似度计算 #include<iostream> #include<set>//不重复 #include<string> using namespace std; int main() {int n, m;cin >> n >> m;set<string>str1;set<string>str2;for(int i0;i<n;i){string s;cin>>s;for(int j0;…

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具&#xff0c; DeepSeek:DeepSeek Kimi: Kimi - 会推理解析&#xff0c;能深度思考的AI助手 1、提示词&#xff1a; 你能帮我生成一个知识图谱吗&#xff0c;等一下我会给你一篇文章&#xff0c;帮我从内容中提取关键要素&#xff0c;然后以N…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

剑指小米特斯拉:秦L EV上市11.98万起

3月23日&#xff0c;比亚迪王朝网推出全新中级纯电轿车秦L EV&#xff0c;价格区间为11.98万-13.98万元&#xff0c;瞬间火爆市场。 依托e平台3.0 Evo技术赋能&#xff0c;秦L EV以“国潮设计、智能座舱、越级空间、高效安全、高阶智驾”五大核心优势&#xff0c;直击年轻用户痛…

蓝桥杯高频考点——并查集(心血之作)

并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1&#xff08;50分&#xff09;solution 2&#xff08;100分&#xff09; 按秩(树高)合并按大小合并 TA Can Do What & why learning 从字面意思上来理解就是&#xff0c;合并&a…

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

Redisson 分布式锁原理

加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey&#xff0c;itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…

【STM32】SPI通信外设硬件SPI读写W25Q64

SPI通信协议和W25Q64存储器芯片解读笔记&#xff1a; 【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&…

Spring JDBC Template与事务管理:基于XML与注解的实战指南

摘要 本文深入解析Spring JDBC Template与事务管理的核心技术&#xff0c;结合XML配置与注解方式两种主流方案&#xff0c;通过转账案例完整演示数据库操作与事务管理的最佳实践。文章涵盖JDBC Template的核心用法、事务配置语法、常见问题及性能优化建议&#xff0c;帮助开发…

【Keil5-开发技巧】

Keil5-开发技巧 ■ Keil5利用AStyle插件格式化代码第一步:下载AStyle插件第二步:添加AStyle插件第三步:AStyle插件介绍■ 一键转UTF-8编码■ Keil5利用AStyle插件格式化代码 第一步:下载AStyle插件 AStyle下载 第二步:添加AStyle插件 解压后 astyle-3.6.7-x64 在重命…

电脑上不了网普通用户排除方法

1&#xff1a;首先通过电脑的运行/CMD/ipconfig /all 命令查看电脑的ip地址是否正常如图&#xff1a; 2&#xff1a;在命令行中运行&#xff1a;ping 127.0.0.1 如图则正常&#xff0c;否则要重新安装网卡驱动 程序。 3&#xff1a;用ping命令&#xff0c;ping一下同网段的电…

【C#】WinForm自定义控件及窗体

前言 WinForm&#xff08;Windows Forms&#xff09;是Microsoft.NET框架中的技术&#xff0c;用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…

基于虚拟知识图谱的语义化决策引擎

在数字化转型浪潮中&#xff0c;企业数据资产的价值释放面临两大挑战&#xff1a;海量异构数据的整合困局与业务-技术语义鸿沟。本文解析飞速创软灵燕智能体平台的创新解决方案——通过构建业务语义驱动的虚拟知识图谱系统&#xff0c;实现企业数据的智能认知与决策赋能。 一、…

HarmonyOS:@AnimatableExtend 装饰器自学指南

在最近的项目开发中&#xff0c;我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中&#xff0c;我发现了 AnimatableExtend 装饰器&#xff0c;它为实现动画效果提供了一种非常灵活且强大的方式。然而&#xff0c;在学习这个装饰器的过程中&#xff0c;我发现相关的…

kubernetes|云原生|kubeadm-1.25.7集群单master+外部etcd集群+kubeadm-init+cri-docker文件形式快速部署

一、 前言和写作原因 本文做一个kubernetes集群部署记录&#xff0c;实在是部署的东西太多了&#xff0c;害怕忘记&#xff0c;kubernetes集群的部署又细节比较多&#xff0c;因此&#xff0c;在这里做一个尽量详细的记录 三个VMware虚拟机&#xff0c;IP分别为192.168.123.…

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器&#xff0c;需要解析mp3文件&#xff0c;于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…

新能源汽车充换站如何实现光储充一体化管理?

长三角某换电站光伏板晒到发烫&#xff0c;却因电网限电被迫切机&#xff1b;北京五环充电站每月多缴6万超容费&#xff1b;深圳物流车充电高峰排队3小时...当95%的充换站深陷“用不起绿电、扛不住扩容、算不清碳账”困局&#xff0c;安科瑞用一组真实数据撕开行业潜规则&#…

【数据分享】2000—2024年我国省市县三级逐年归一化植被指数(NDVI)数据(年平均值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年平均值。&#xff01;该数据来源于NASA定期发布的MOD13A3数据集&#xff01;很多小伙伴拿到数据后…

【leetcode题解】链表

目录 链表 两数相加 两两交换链表中的节点 重排链表 合并 K 个升序链表&#xff08;困难&#xff09; K 个一组翻转链表 链表 1. 常用技巧 画图&#xff01;&#xff01;&#xff01;&#xff08;直观形象&#xff0c;便于我们理解&#xff09;引入虚拟“头”节点&#xf…

Windows打开ftp局域网共享

前提是windows已经设置好开机账号密码了&#xff0c;否则教程不适用 第一先打开电脑ftp共享配置 点击保存即可 2.设置要共享到其他电脑的文件路径&#xff08;如果你要共享整个盘你就设置整个盘&#xff0c;如果是共享盘中某文件就设置某文件&#xff0c;这里是某文件&#x…