shuizls 2024-02-01 18:10 采纳率: 0%
浏览 274
已结题

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

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

img

  • 写回答

15条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-01 18:11
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    首先,从您提供的代码片段中可以看到,您尝试使用OpenCASCADE(OCC)库创建一个立方体,并将其导入到Gmsh中进行网格划分。然而,在使用gmsh::model::occ::importShapesNativePointer函数时,可能存在问题导致无法生成网格。

    在您的代码中,有几点需要注意和修正:

    1. 您没有正确设置几何对象的坐标系。Gmsh默认在原点处生成几何实体,但OCC创建的box位于世界坐标系的某个位置,可能不在原点(0, 0, 0)。虽然对于简单的立方体这通常不是问题,但在处理复杂几何形状时可能会出现问题。

    2. Gmsh的importShapesNativePointer函数需要将OCC的TopoDS_Shape转换为Gmsh能够识别的格式,同时,它可能还需要与Gmsh模型的当前上下文相匹配。确保在调用该函数前已经正确设置了模型的上下文或单位。

    3. 您没有添加任何实体标签(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;
    }
    

    这段代码做了如下改动:

    • 使用gp_Ax3来创建位于原点的立方体,确保与Gmsh的默认坐标一致。
    • 修改了gmsh::model::occ::importShapesNativePointer调用为gmsh::model::occ::importShapes,因为目前Gmsh的文档推荐使用这个版本。

    请注意,即使按照以上修改,如果Gmsh还是不能生成网格,请检查Gmsh版本以及OCC与Gmsh之间的兼容性问题。有时不同版本间的接口可能会有所变化。此外,确保Gmsh能正确读取和解析OCC产生的几何数据也是关键。如果问题依然存在,建议查看Gmsh的日志输出以获取更详细的错误信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 创建了问题 2月1日