Gmsh是一个免费的带有内置前后期处理机制的三维有限元网格生成器。其设计的目标是要提供一个快速轻便的具有可控参数功能和先进的可视化能力的网格生成工具。Gmsh主要围绕四个单元:几何,网格,求解和后处理。这些可控参数的输入可以在交互式的图形界面方式,或在ASCII文本文件中使用gmsh自己的脚本语言得以实现。
打算采用OCCT建模->gmsh网格生成与求解->VTK显示的方式来做一个框架
OCC->gmsh几何信息输入:
gmsh使用occ作为几何内核 相应的操作类都在namespace gmsh::model::occ中 熟悉相关命令之后可以很方便的直接绘图
也可以直接传TopoDS_Shape值作为几何信息 亦支持STL BREP STEP和IGES等格式的输入
1 STL
STL文件用于表示三角形网格的文件格式 其文件格式非常简单 应用很广泛 是最多快速原型系统所应用的标准文件类型
STL的OCCT生成比较麻烦 原有的类是对三角化面片类Handle_PolyTriangulation进行操作 只能写一个面片的信息
方法为遍历三角化的各个网格 然后输出相应的几何信息
改写后传参为shape 对其中每个面进行遍历三角化后写信息
Standard_Boolean writeASCII(const TopoDS_Shape& shape,FILE* theFile,Handle(Message_ProgressIndicator)& theProgInd, double deflection)
{
static const Standard_Integer IND_THRESHOLD = 1000; // increment the indicator every 1k triangles
// note that space after 'solid' is necessary for many systems
if (fwrite("solid \n", 1, 7, theFile) != 7)
{
return Standard_False;
}
for (TopExp_Explorer aFaceExplorer(shape, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()) {
TopoDS_Face face = TopoDS::Face(aFaceExplorer.Current());
TopLoc_Location location;
BRepMesh_IncrementalMesh(face, deflection);
Handle_Poly_Triangulation theMesh = BRep_Tool::Triangulation(face, location);
char aBuffer[512];
memset(aBuffer, 0, sizeof(aBuffer));
Message_ProgressSentry aPS(theProgInd, "Triangles", 0,
theMesh->NbTriangles(), IND_THRESHOLD);
const TColgp_Array1OfPnt& aNodes = theMesh->Nodes();
const Poly_Array1OfTriangle& aTriangles = theMesh->Triangles();
const Standard_Integer NBTriangles = theMesh->NbTriangles();
Standard_Integer anElem[3] = { 0, 0, 0 };
for (Standard_Integer aTriIter = 1; aTriIter <= NBTriangles; ++aTriIter)
{
const Poly_Triangle& aTriangle = aTriangles(aTriIter);
aTriangle.Get(anElem[0], anElem[1], anElem[2]);
const gp_Pnt aP1 = aNodes(anElem[0]);
const gp_Pnt aP2 = aNodes(anE