用occ生成的box(TopoDS_Shape),导入gmsh库中划分网格,什么也没有,是哪里用的不对吗??

用occ生成的box(TopoDS_Shape),导入gmsh库中划分网格,什么也没有,是哪里用的不对吗??

关注引自免费微信小程序:皆我百晓生
首先,从您提供的代码片段中可以看到,您尝试使用OpenCASCADE(OCC)库创建一个立方体,并将其导入到Gmsh中进行网格划分。然而,在使用gmsh::model::occ::importShapesNativePointer函数时,可能存在问题导致无法生成网格。
在您的代码中,有几点需要注意和修正:
您没有正确设置几何对象的坐标系。Gmsh默认在原点处生成几何实体,但OCC创建的box位于世界坐标系的某个位置,可能不在原点(0, 0, 0)。虽然对于简单的立方体这通常不是问题,但在处理复杂几何形状时可能会出现问题。
Gmsh的importShapesNativePointer函数需要将OCC的TopoDS_Shape转换为Gmsh能够识别的格式,同时,它可能还需要与Gmsh模型的当前上下文相匹配。确保在调用该函数前已经正确设置了模型的上下文或单位。
您没有添加任何实体标签(dimTags),这可能导致Gmsh无法正确识别导入的几何形状并为之生成网格。尽管有时候Gmsh可以自动分配标签,但在某些情况下仍需手动指定。
针对上述情况,您可以尝试以下修改后的代码:
#include "stdafx.h"
#include <iostream>
#include <BRepPrimAPI_MakeBox.hxx>
#include <TopoDS_Shape.hxx>
#include <gp_Pnt.hxx>
#include <gp_Ax3.hxx>
#include <gmsh.h>
using namespace std;
int main()
{
cout << "occ建模,gmsh划分网格" << endl;
double l = 10; // 立方体边长
gmsh::initialize();
gmsh::option::setNumber("General.Terminal", 1);
gmsh::option::setNumber("Mesh.Algorithm", 1);
gmsh::option::setNumber("Mesh.Algorithm3D", 1);
gmsh::option::setNumber("Mesh.MinimumCirclePoints", 20);
gmsh::option::setNumber("Mesh.MeshSizeMax", 2);
// 创建一个位于原点的立方体
gp_Pnt origin(0, 0, 0);
gp_Ax3 ax3(origin, gp_Dir(0, 0, 1), gp_Dir(1, 0, 0));
TopoDS_Shape box = BRepPrimAPI_MakeBox(l, l, l, ax3).Shape();
// 创建一个空的dimTags向量
std::vector<std::pair<int, int>> dimTags;
// 将OCC形状导入到Gmsh模型中
gmsh::model::occ::importShapes(&box, dimTags);
// 同步Gmsh模型
gmsh::model::occ::synchronize();
// 在整个模型上生成网格
gmsh::model::mesh::generate(2);
// 写出.msh文件
gmsh::write("GmshTest1.msh");
// 关闭Gmsh库
gmsh::finalize();
system("pause");
return 0;
}
这段代码做了如下改动:
gmsh::model::occ::importShapesNativePointer调用为gmsh::model::occ::importShapes,因为目前Gmsh的文档推荐使用这个版本。请注意,即使按照以上修改,如果Gmsh还是不能生成网格,请检查Gmsh版本以及OCC与Gmsh之间的兼容性问题。有时不同版本间的接口可能会有所变化。此外,确保Gmsh能正确读取和解析OCC产生的几何数据也是关键。如果问题依然存在,建议查看Gmsh的日志输出以获取更详细的错误信息。