基于OpenCASCADE7.4+OSG3.6.3+Qt5.12.7的多文档初级CAD/CAE...
基于opencascade7.4osg3.6.3qt5.12.7的多文档初级Cad/cae平台支持十几种格式文件包括step,igs,stl,obj,3dsosg等支持视角切换显示模式切换仿Cad命令注册机制装配体显示模型高亮点选功能着色功能测量功能个性化导出图片功能集成netgen6.2和gmesh8网格划分支持导出stl,obj,osg等格式C前阵子帮实验室改毕设的时候翻了一圈开源CAD工具要么是功能太单一要么是依赖堆得吓人干脆自己攒了个轻量的多文档CAD/CAE小平台基于Occt7.4OSG3.6.3Qt5.12.7折腾俩月总算把基础功能跑通了今天来碎碎念一下。先唠唠技术栈的选择为啥选这仨组合Qt负责UI和多文档窗口是最省心的自带的MDI框架直接就能搞定多文件并行打开OpenCASCADE也就是Occt是开源CAD的顶流底层几何解析、CAD命令逻辑全靠它撑着最后把Occt自带的Viewer换成了OSG主要是后期想加多视角同步、自定义着色、网格叠加这些功能的时候OSG的渲染管线比Occt原生的灵活太多踩坑也更少。先上一段导入STEP文件的代码也是最核心的导入逻辑一开始我直接抄Occt官方样例的导入代码后来改了改适配自己的项目大概长这样// 导入STEP格式文件的核心逻辑 Handle(TDocStd_Document) stepDoc; // 初始化STEP读取器 Handle(XSControl_Reader) reader new XSControl_Reader; IFSelect_ReturnStatus readStatus reader-ReadFile(filePath.toStdString().c_str()); if (readStatus IFSelect_RetDone) { // 读取成功后转移所有根节点 Standard_Integer rootCount reader-NbRootsForTransfer(); for (Standard_Integer i 1; i rootCount; i) { reader-TransferRoot(i); } // 把Occt的模型转成OSG能识别的场景节点 osg::ref_ptrosg::Group modelRoot Occt2OsgConverter::transferDocToOsg(stepDoc-Main()); // 把节点加到当前的多文档子窗口里 currentMdiChild-addModelNode(modelRoot); }这段代码看着简单其实坑挺多的比如Occt默认的三角化精度太低转出来的复杂曲面会破面后来加了个参数让用户自己调精度还有装配体导入的时候内存会暴涨我加了个进度条提示用户别着急关掉程序。仿CAD的命令注册机制省了我好多重复代码最开始加新命令的时候都是直接在主窗口写槽函数后来越攒越多代码乱成一团干脆写了个单例的命令管理器注册和调用都靠它class CommandManager { public: using CmdCallback std::functionvoid(); static CommandManager getInstance() { static CommandManager inst; return inst; } // 注册新命令 void registerCmd(const QString cmdName, CmdCallback callback) { m_cmdMap.insert(cmdName, std::move(callback)); } // 执行命令 void execCmd(const QString cmdName) { if (m_cmdMap.contains(cmdName)) { m_cmdMap[cmdName](); } } private: QHashQString, CmdCallback m_cmdMap; }; // 举个例子注册测量距离的命令 CommandManager::getInstance().registerCmd(measure_distance, [this](){ // 先点选第一个点 gp_Pnt pointA currentView-pickPointFromScene(); // 再点选第二个点 gp_Pnt pointB currentView-pickPointFromScene(); double dist pointA.Distance(pointB); QMessageBox::information(this, 测量结果, QString(两点直线距离%1 mm).arg(dist, 0, f, 2)); });后来再加剖切、高亮、导出这些命令直接注册就行完全不用碰主窗口的代码爽得不行。网格划分这块集成了Netgen和GmshOcct自带的网格划分工具实在太拉胯复杂模型根本跑不动后来直接调用Netgen6.2和Gmsh8的API代码简化一下大概是这样// 调用Netgen生成网格 NETGEN-PROJECT::Mesh* rawMesh NETGEN-PROJECT::GenerateMesh(occtTargetShape, 5.0); // 转成OSG能渲染的面片节点这里要注意坐标系翻转 osg::ref_ptrosg::Geometry meshGeo Netgen2OsgConverter::convert(rawMesh); // 把网格叠加到模型上面 currentView-addOverlayNode(meshGeo);这里踩的最大的坑就是坐标系不统一Netgen默认Y轴朝上Occt是Z轴朝上转的时候要给OSG的节点乘一个旋转矩阵不然网格会歪成麻花。而且导出网格的时候也支持STL、OBJ、OSG格式直接用OSG的writeImageFile就行。其他杂七杂八的功能比如视角切换就是给OSG的相机绑定不同的控制模式正交/透视一键切换显示模式切换改一下OSG的PolygonMode就行线框、着色、隐藏线都能快速切模型高亮就是给选中的节点加一个红色的自发光材质装配体的时候还能单独高亮某个零件点选功能用OSG的PickVisitor点击的时候遍历场景算射线交点再传回给Occt获取精确的几何信息。基于opencascade7.4osg3.6.3qt5.12.7的多文档初级Cad/cae平台支持十几种格式文件包括step,igs,stl,obj,3dsosg等支持视角切换显示模式切换仿Cad命令注册机制装配体显示模型高亮点选功能着色功能测量功能个性化导出图片功能集成netgen6.2和gmesh8网格划分支持导出stl,obj,osg等格式C还有个性化导出图片一开始用Qt的grabWindow但是会把Qt的标题栏也截进去后来换成OSG自带的截图接口想截多大分辨率都没问题osg::ref_ptrosg::Image exportImg new osg::Image; exportImg-allocateImage(3840, 2160, 1, GL_RGBA, GL_UNSIGNED_BYTE); currentView-getCamera()-attach(osg::Camera::COLOR_BUFFER, exportImg); osgDB::writeImageFile(*exportImg, savePath);最后唠唠现状目前这个小平台已经支持STEP、IGS、STL、OBJ、3DS、OSG等十几种格式了多文档切换、装配体树状显示、模型高亮、测量、导出图片这些功能都能用网格划分导出也没问题后续打算加个参数化建模的模块和剖切功能。代码已经开源到Gitee了有兴趣的小伙伴可以去扒拉要是能给个star就更开心了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473311.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!