如何使用Gmsh从顶点与面创建网格并补全对应代码?
如何使用Gmsh从顶点与面创建网格并补全对应代码?
嘿,我来帮你补全这段Gmsh代码,把顶点和三角面转换成可导出的网格文件~ 先给你放完整代码,再一步步拆解关键逻辑。
import gmsh import numpy as np # Initialize Gmsh gmsh.initialize() # 给模型起个名字,方便管理 gmsh.model.add("CustomCube") vertices = np.array([ [-0.5, -0.5, -0.5], [0.5, -0.5, -0.5], [-0.5, 0.5, -0.5], [0.5, 0.5, -0.5], [-0.5, -0.5, 0.5], [0.5, -0.5, 0.5], [-0.5, 0.5, 0.5], [0.5, 0.5, 0.5]]) faces = np.array([ [2, 1, 0], [1, 2, 3], [4, 2, 0], [2, 4, 6], [1, 4, 0], [4, 1, 5], [6, 5, 7], [5, 6, 4], [3, 6, 7], [6, 3, 2], [5, 3, 7], [3, 5, 1]] ) # Add vertices to Gmsh model for vertex in vertices: gmsh.model.occ.addPoint(*vertex) # ---------------------- 补全的添加面的代码 ---------------------- # 记录已创建的线,避免重复生成相同的边(优化步骤,可选但推荐) created_lines = {} def get_line_id(p1, p2): # 线是无向的,统一用从小到大的点ID作为key,避免重复创建 key = tuple(sorted((p1, p2))) if key not in created_lines: line_id = gmsh.model.occ.addLine(p1, p2) created_lines[key] = line_id return created_lines[key] # 遍历每个三角面,创建几何实体 for face in faces: # 把0-based的顶点索引转换成Gmsh的1-based点ID p1, p2, p3 = face + 1 # 获取三条边的ID(自动去重) l1 = get_line_id(p1, p2) l2 = get_line_id(p2, p3) l3 = get_line_id(p3, p1) # 创建闭合的曲线环(注意线的方向要保持一致,形成闭环) loop_id = gmsh.model.occ.addCurveLoop([l1, l2, l3]) # 用曲线环创建平面曲面 gmsh.model.occ.addPlaneSurface([loop_id]) # 同步几何模型(必须步骤:把occ模块的几何数据导入到主模型) gmsh.model.occ.synchronize() # 生成2D网格(我们创建的是立方体表面,属于2D网格) gmsh.model.mesh.generate(2) # 可选:调整网格精细度,比如设置最大特征长度为0.1 # gmsh.option.setNumber("Mesh.CharacteristicLengthMax", 0.1) # ---------------------- 补全结束 ---------------------- gmsh.write("custom_mesh.msh") # Finalize Gmsh gmsh.finalize()
关键逻辑解释
- 点ID转换:Gmsh的点是从1开始计数的,你提供的
faces数组是0-based索引,所以必须给每个索引加1,才能对应上我们添加的顶点。 - 避免重复创建边:我写了
get_line_id函数,通过排序点ID作为唯一key,确保相同的边只会创建一次,避免生成冗余的几何实体。 - 曲线环与平面曲面:Gmsh的面必须由闭合的曲线环定义,所以每个三角面需要先把三条边组成闭环,再用环创建平面曲面。
- 同步与网格生成:
gmsh.model.occ.synchronize()是必做步骤,把几何构造模块的内容同步到主模型;gmsh.model.mesh.generate(2)用来生成2D网格,如果要生成3D体网格,需要先把面组合成闭合实体,再调用generate(3)。
备注:内容来源于stack exchange,提问作者Uwe.Schneider
相关产品推荐
相关产品推荐

