You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()

关键逻辑解释

  1. 点ID转换:Gmsh的点是从1开始计数的,你提供的faces数组是0-based索引,所以必须给每个索引加1,才能对应上我们添加的顶点。
  2. 避免重复创建边:我写了get_line_id函数,通过排序点ID作为唯一key,确保相同的边只会创建一次,避免生成冗余的几何实体。
  3. 曲线环与平面曲面:Gmsh的面必须由闭合的曲线环定义,所以每个三角面需要先把三条边组成闭环,再用环创建平面曲面。
  4. 同步与网格生成:gmsh.model.occ.synchronize()是必做步骤,把几何构造模块的内容同步到主模型;gmsh.model.mesh.generate(2)用来生成2D网格,如果要生成3D体网格,需要先把面组合成闭合实体,再调用generate(3)。

备注:内容来源于stack exchange,提问作者Uwe.Schneider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:43:10