程序整体流程如下图:

一、配置

1.配置OCC

需要先编译好OCC库,我的编译目录为“OCCBuild”目录。

在自建项目中,项目属性》》VC++目录》》添加包含目录“OCCBuild\inc”,添加库目录“OCCBuild\win64\vc14\libd”。链接器》》输入》》添加如下附加依赖项:

TKBin.lib
TKBinL.lib
TKBinTObj.lib
TKBinXCAF.lib
TKBO.lib
TKBool.lib
TKBRep.lib
TKCAF.lib
TKCDF.lib
TKDCAF.lib
TKDFBrowser.lib
TKDraw.lib
TKernel.lib
TKFeat.lib
TKFillet.lib
TKG2d.lib
TKG3d.lib
TKGeomAlgo.lib
TKGeomBase.lib
TKHLR.lib
TKIGES.lib
TKLCAF.lib
TKMath.lib
TKMesh.lib
TKMeshVS.lib
TKOffset.lib
TKOpenGl.lib
TKPrim.lib
TKQADraw.lib
TKRWMesh.lib
TKService.lib
TKShapeView.lib
TKShHealing.lib
TKStd.lib
TKStdL.lib
TKSTEP.lib
TKSTEP209.lib
TKSTEPAttr.lib
TKSTEPBase.lib
TKSTL.lib
TKTInspector.lib
TKTInspectorAPI.lib
TKTObj.lib
TKTObjDRAW.lib
TKToolsDraw.lib
TKTopAlgo.lib
TKTopTest.lib
TKTreeModel.lib
TKV3d.lib
TKVCAF.lib
TKView.lib
TKViewerTest.lib
TKVInspector.lib
TKVRML.lib
TKXCAF.lib
TKXDEDRAW.lib
TKXDEIGES.lib
TKXDESTEP.lib
TKXMesh.lib
TKXml.lib
TKXmlL.lib
TKXmlTObj.lib
TKXmlXCAF.lib
TKXSBase.lib
TKXSDRAW.lib

2.配置Gmsh

需要先编译好Gmsh,我的Gmsh源码目录为“GmshSource”,编译目录为“GmshBuild”,编译过程可以参考我的另一篇博客:编译Gmsh,生成dll和lib文件,在自建程序中使用Gmsh函数_我只知道我要大开杀戒的博客-CSDN博客
        在自建项目中,项目属性》》VC++目录》》添加包含目录“GmshSource\api”,添加库目录“GmshBuild\Debug”。链接器》》输入》》添加附加依赖项“gmsh.lib”。

将“GmshBuild\Debug\gmsh.dll”拷贝到自建项目的“x64\Debug”目录下。(如果运行程序时还是报错无法找到gmsh.dll文件,就把gmsh.dll拷贝到“C:\Windows\System32”目录下)

3.配置OSG

需要先编译好OSG,我将 OSG编译目录中的bin目录、lib目录 和 OSG源码目录中的include目录 和 OSG Data目录 统一放在OSGComp目录下。(大致记得是这样,可以去找一找别的OSG编译教程,记不太清了)

在自建项目中,项目属性》》VC++目录》》添加包含目录“OSGComp\include”,添加库目录“OSGComp\lib”。链接器》》输入》》添加如下附加依赖项:

OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib

4.添加头文件

添加OCC所需头文件,此处我做的实验是创建立方体,构建倒角。

#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopExp_Explorer.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepFilletAPI_MakeFillet.hxx>

添加Gmsh所需头文件。

#include <gmsh.h>
using namespace gmsh;

添加OSG所需头文件。

#include <Windows.h>//系统Windows头文件为部分OSG操作提供支持
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/LineWidth>

二、执行OCC建模操作

调用BRepBuilderAPI_MakeBox函数构建拓扑立方体,通过TopExp_Explorer遍历拓扑体的所有边并添加到圆角构建器中,最后获取圆角构建器构建圆角后的新拓扑体。

    TopoDS_Shape box = BRepPrimAPI_MakeBox(10,10,10);BRepFilletAPI_MakeFillet filletMaker(box);TopExp_Explorer explorer(box, TopAbs_EDGE);while (explorer.More()) {filletMaker.Add(1, TopoDS::Edge(explorer.Current()));explorer.Next();}TopoDS_Shape blendShape = filletMaker.Shape();

三、Gmsh离散化

我并没有对Gmsh进行进一步细致的学习,所以这里直接使用了潇湘散人大神的博客中的离散化测试相关代码,附出处:

使用VS2015编译gmsh4.8 with opencascade7.4,并用gmsh.lib创建简单工程测试网格_XXM的博客-CSDN博客

但是此处注意不要调用recombine这个Mesh重组方法,不然Mesh获取会出错。

 double lc = 1;initialize();option::setNumber("General.Terminal", 1);option::setNumber("Mesh.Algorithm", 1);option::setNumber("Mesh.Algorithm3D", 1);option::setNumber("Mesh.MinimumCirclePoints", 20);option::setNumber("Mesh.MeshSizeMax", 2);std::vector<std::pair<int, int>> dimTags;model::occ::importShapesNativePointer(&blendShape,dimTags);model::occ::synchronize();model::mesh::generate(3);

在我们的程序中,需要对Gmsh中生成的Mesh数据进行解析,获取所有的三角形顶点,作为OSG中的显示数据(此处有个问题,我没有找到获取Mesh法线的方法,所以只能通过三角形的顶点的关联边叉乘进行计算...希望有大神可以解答这个问题)。通过getNodes函数获取顶点信息,通过getElements函数获取三角形顶点索引信息,通过索引找到每个三角形的顶点,然后计算法线信息。

gmsh::model::mesh::getNodes(nodeTags, nodeCoords, nodeParams, dim, tag, includeBoundary);
gmsh::model::mesh::getElements(elemTypes, elemTags, elemNodeTags, dim, tag);
for (int i = 0; i < elemNodeTags[1].size(); i += 3)
{//三角形的三个点的索引int id1 = elemNodeTags[1][i] - 1;int id2 = elemNodeTags[1][i + 1] - 1;int id3 = elemNodeTags[1][i + 2] - 1;//下面部分由于与OSG函数关联,所以只写了Gmsh相关的伪代码//通过顶点索引找到顶点://第一个顶点(nodeCoords[3 * id1], nodeCoords[3 * id1 + 1], nodeCoords[3 * id1 + 2])//第二个顶点(nodeCoords[3 * id2], nodeCoords[3 * id2 + 1], nodeCoords[3 * id2 + 2])//第三个顶点(nodeCoords[3 * id3], nodeCoords[3 * id3 + 1], nodeCoords[3 * id3 + 2])//法线计算//normal1 = Cross((node2-node1),(node3-node1)).normalize();//normal2 = Cross((node1-node2),(node1-node2)).normalize();//normal3 = Cross((node1-node3),(node2-node3)).normalize();
}
gmsh::finalize()

四、OSG显示

创建场景树节点Geode保存物体显示数据,将顶点、法线分别放入两个序列vertiecs、normals中(此处我把每个面片的边也绘制出来,通过lineVertices保存了每个线段的顶点信息)。在Geode节点添加三角面片顶点序列、法线序列显示数据和线段顶点序列显示数据。视景器添加Geode节点,绘制。

osg::ref_ptr<osg::Geode> geode = new osg::Geode();
osg::ref_ptr<osg::Geometry> triGeom = new osg::Geometry();
osg::ref_ptr<osg::Geometry> lineGeom = new osg::Geometry();
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
osg::ref_ptr<osg::Vec3Array> lineVertices = new osg::Vec3Array();
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array();for (int i = 0; i < elemNodeTags[1].size(); i += 3)
{//插入三角形顶点vertices->push_back(osg::Vec3(nodeCoords[3 * id1], nodeCoords[3 * id1 + 1], nodeCoords[3 * id1 + 2]));vertices->push_back(osg::Vec3(nodeCoords[3 * id2], nodeCoords[3 * id2 + 1], nodeCoords[3 * id2 + 2]));vertices->push_back(osg::Vec3(nodeCoords[3 * id3], nodeCoords[3 * id3 + 1], nodeCoords[3 * id3 + 2]));//插入线段顶点lineVertices->push_back(osg::Vec3(nodeCoords[3 * id1], nodeCoords[3 * id1 + 1], nodeCoords[3 * id1 + 2]));lineVertices->push_back(osg::Vec3(nodeCoords[3 * id2], nodeCoords[3 * id2 + 1], nodeCoords[3 * id2 + 2]));lineVertices->push_back(osg::Vec3(nodeCoords[3 * id2], nodeCoords[3 * id2 + 1], nodeCoords[3 * id2 + 2]));lineVertices->push_back(osg::Vec3(nodeCoords[3 * id3], nodeCoords[3 * id3 + 1], nodeCoords[3 * id3 + 2]));lineVertices->push_back(osg::Vec3(nodeCoords[3 * id3], nodeCoords[3 * id3 + 1], nodeCoords[3 * id3 + 2]));lineVertices->push_back(osg::Vec3(nodeCoords[3 * id1], nodeCoords[3 * id1 + 1], nodeCoords[3 * id1 + 2]));//插入法线normals->push_back(osg::Vec3(normal1.X(), normal1.Y(), normal1.Z()));normals->push_back(osg::Vec3(normal2.X(), normal2.Y(), normal2.Z()));normals->push_back(osg::Vec3(normal3.X(), normal3.Y(), normal3.Z()));
}//添加三角网格信息
triGeom->setVertexArray(vertices.get());
triGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, vertices->size()));
triGeom->setNormalArray(normals.get());
triGeom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);geode->addDrawable(triGeom.get());//添加线段信息
lineGeom->setVertexArray(lineVertices.get());
lineGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, lineVertices->size()));
osg::ref_ptr<osg::LineWidth> lw = new osg::LineWidth(2.0);//设置现款
lineGeom->getOrCreateStateSet()->setAttribute(lw, osg::StateAttribute::ON);geode->addDrawable(lineGeom.get());//视景器添加节点并显示
osgViewer::Viewer myViewer;
myViewer.setUpViewInWindow(100, 100, 800, 600);
myViewer.setSceneData(geode);
myViewer.run();

五、运行结果

也可以通过gmsh的importShapes函数直接导入step文件并显示,如下图:

源码可以从此处下载:

TestProject.zip-C++文档类资源-CSDN下载

欢迎各位支持一下博主,赚个辛苦费,不想花钱的友友私信我就好,我看到消息之后可以免费提供。

集成Opencascade+Gmsh+OSG的CAD测试程序相关推荐

  1. 基于opencascade与osg的CAD探索之osg拾取点线面

    拾取在CAD中经常用到,是交互中比较常用的方式,本人利用osg渲染stp模型,并实现了拾取功能! 在osg中实现拾取的思路就是重写osgGA::GUIEventHandler,利用线段或者射线求交即可 ...

  2. 基于OCC与OSG的CAD平台构建值gmsh划分效果测试

    大半年没更新博客了,目前处在项目的重构中,一时没有增加特别的功能模块,所以本文主要是对gmsh网格划分模块的一个效果展示,更多功能将持续改进中........... 零.模型前瞻 一.gmsh的波前法 ...

  3. 基于OCC+OSG的CAD之GMSH与Netgen网格连贯性测试

         本文是对前几次的博客的一个扩展,本文的重点在于对于多个子实体(有接触性的)划分网格时,经常出现网格在子实体边界不连贯的问题,考虑到之前本人仅仅对这些子实体简单的进行了组装(OCC接口是Mak ...

  4. 基于opencascade+osg的CAD平台探索之二维图拉伸测试

    之前完善了二维草图功能,包括动态绘制基本图形:圆,矩形,多边形,椭圆,b样条以及他们的组合体!后面进一步完善了捕捉功能,今天测试了一下二维草图拉伸效果!!代码比较简单,因为occ有相应的接口!话不多说 ...

  5. CAD、PDM、ERP集成系统的功能级实施

    [摘自:计算机世界报 ] 目前,我国大多数国有企业正在进行由粗放型管理到精细管理.由经验管理为主到科学管理为主的两个根本性转变.大多数国有企业面临的主要问题有:如何解决多品种小批量问题;如何缩短产品的 ...

  6. Spring+SpringMVC+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  7. arcgis加载dwg显示一个点_shp文件转为dwg之后在arcgis下打开属性表有高程信息但在cad里面打开为何没高程 - 地学 - 小木虫 - 学术 科研 互动社区...

    2.1方法一:使用属性分层 3.在属性表里选择"Selected By Attribute",通过属性值区分图层 4.经过这样的区分就可以选定图层了 5.保存选定的图层为SHP 6 ...

  8. arccatalog点要素显示不完_shp文件转为dwg之后在arcgis下打开属性表有高程信息但在cad里面打开为何没高程 - 地学 - 小木虫 - 学术 科研 互动社区...

    2.1方法一:使用属性分层 3.在属性表里选择"Selected By Attribute",通过属性值区分图层 4.经过这样的区分就可以选定图层了 5.保存选定的图层为SHP 6 ...

  9. PLM、ERP、APS、MES几种信息系统的数据集成

    因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩分享 导读:本文就PLM.ERP.APS.MES各自功能和相互之间需要通信的基础数据进行探讨,分析 ...

最新文章

  1. GDB 调试 Mysql 实战(二)GDB 调试打印
  2. html5 css3 设计模式,html5+css3设计模式
  3. Linux 下安装与卸载JDK
  4. JSON数据格式详解
  5. 说说图片加载不出来_晒晒我的新家,朋友都说好看,恨不得天天宅在卧室不出来...
  6. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails
  7. 玩转oracle 11g(25):手工删除oracle归档日志后操作步骤 和修改用户默认解锁时间
  8. Android学习笔记——Handler(二)
  9. windows iis 部署 django项目
  10. 敏捷 橄榄球运动_为什么我为大学橄榄球博客选择Wordpress
  11. Hprose开源的高性能远程对象服务引擎
  12. 白事碰上红事,徐渭应景吟诗
  13. 这次,华为选择了湖南大学、湘潭大学
  14. WebView 监听 H5 下载
  15. 分数换算小数补0法_小学数学常用公式大全(单位换算表),替孩子收藏一份...
  16. **旅行-interveiw
  17. 调用高德接口查询经纬度(根据地址)
  18. scrapy 远程登录控制台
  19. GCN图卷积神经网络综述
  20. C/C++实现文件加密器

热门文章

  1. 感恩美文:生命中总有一些人值得感恩
  2. 爬取中国福彩网并做可视化分析
  3. 北京羽毛球场馆全攻略
  4. Apache Kafka教程A系列:简单生产者示例
  5. 一般论文投稿应该注意哪些要求
  6. 加入收藏js代码 兼容所有浏览器
  7. ubuntu 安装搜狗打字法
  8. linux上安装java失败,Linux下安装jdk失败怎么办
  9. 不怕神一样的对手,就怕猪一样的队友
  10. vs2013运行c语言出现:无法查找或打开 PDB 文件问题解决