本文介绍PyMeshGen项目近期完成的功能更新,主要包括3D网格处理能力增强、CGNS文件格式支持以及可视化功能的改进。

PyMeshGen是一个基于Python开发的开源网格生成工具,旨在为计算流体力学(CFD)和有限元分析(FEA)提供易用的网格生成解决方案。项目自开源以来,一直致力于降低网格生成算法的学习门槛,为初学者和研究者提供简洁易懂的代码实现。
近期,PyMeshGen进行了一系列更新,主要围绕以下几个方面展开:
本文将详细介绍这些更新的具体内容和实现细节。
CGNS(CFD General Notation System)是CFD领域广泛使用的数据格式标准,许多商业CFD软件(如ANSYS Fluent、OpenFOAM等)都支持该格式。本次更新新增了CGNS文件的读取功能,主要包括以下内容:
核心功能实现
代码结构
CGNS相关功能被组织在独立的模块中,主要包含以下组件:
# CGNS单元类型定义CGNS_CELL_TYPES = {"NODE": 0,"BAR_2": 1,"TRI_3": 2,"QUAD_4": 3,"TETRA_4": 4,"PYRA_5": 5,"PENTA_6": 6,"HEXA_8": 7,# 更多类型...}# CGNS边界条件类型CGNS_BOUNDARY_TYPES = {"BCWall": 2,"BCInlet": 3,"BCOutlet": 4,# 更多类型...}为了支持更多网格文件格式,项目集成了meshio库。meshio是一个功能强大的网格I/O库,支持30多种网格文件格式,包括:
通过meshio的集成,用户可以更方便地导入不同来源的网格文件,提升了工具的通用性。
使用示例
import meshio# 读取网格文件mesh = meshio.read("example.msh")# 获取节点坐标nodes = mesh.points# 获取单元连接关系cells = mesh.cells为了便于调试和问题排查,为FileOperations类添加了日志回调功能。用户可以在文件操作过程中实时获取进度信息和错误提示。
此前PyMeshGen主要支持2D网格生成,本次更新扩展了3D网格的处理能力,新增了四种主流3D单元类型:
实现细节
每种单元类型都实现了以下功能:
以四面体为例,其体积计算实现如下:
deftetrahedron_volume(coords):""" 计算四面体体积 coords: 4个节点的坐标,形状为(4, 3) """ a = coords[1] - coords[0] b = coords[2] - coords[0] c = coords[3] - coords[0] volume = abs(np.dot(a, np.cross(b, c))) / 6.0return volume为了支持3D网格,扩展了几何计算功能模块,主要包括:
这些功能为后续的网格质量评估和优化算法奠定了基础。
将Unstructured_Grid类拆分到独立模块中,使其能够更好地支持3D坐标系统。同时,将Fluent类型定义和VTK单元类型定义也移至独立模块,提升了代码的可维护性。
PyMeshGen基于VTK(Visualization Toolkit)实现网格可视化,本次更新新增了三种渲染模式:
用户可以通过工具栏按钮快速切换不同的渲染模式,以适应不同的查看需求。
实现代码片段
defset_render_mode(self, mode):""" 设置渲染模式 mode: 'solid', 'wireframe', 'points' """for actor in self.actors:if mode == 'solid': actor.GetProperty().SetRepresentationToSurface()elif mode == 'wireframe': actor.GetProperty().SetRepresentationToWireframe()elif mode == 'points': actor.GetProperty().SetRepresentationToPoints() self.render_window.Render()为了提升用户操作体验,添加了便捷的视图控制功能:
这些功能参考了主流CAE软件(如ANSYS、OpenFOAM)的设计,符合工程师的使用习惯。
为部件列表添加了复选框,用户可以独立控制每个部件的显示/隐藏状态。这对于包含多个部件的大型模型特别有用,用户可以:
为了提升代码的可维护性和可扩展性,进行了一系列重构工作:
这些重构使代码结构更加清晰,便于后续的功能扩展和维护。
测试是保证代码质量的重要手段,本次更新增强了测试覆盖率:
测试示例
deftest_cgns_reader():"""测试CGNS文件读取功能""" reader = CGNSReader() mesh = reader.read("test.cgns")assert mesh isnotNoneassert len(mesh.nodes) > 0assert len(mesh.cells) > 0assert len(mesh.boundaries) > 0以下是一个完整的使用示例,展示如何读取CGNS文件并进行可视化:
from PyMeshGen.file_operations import FileOperationsfrom PyMeshGen.mesh_display import MeshDisplay# 创建文件操作对象file_ops = FileOperations()# 读取CGNS文件mesh = file_ops.read_file("example.cgns")# 创建可视化对象display = MeshDisplay()# 显示网格display.set_mesh(mesh)display.set_render_mode('wireframe')display.show()利用meshio的集成功能,可以方便地进行网格格式转换:
import meshio# 读取Fluent格式网格mesh = meshio.read("input.msh")# 导出为VTK格式mesh.write("output.vtk")# 导出为CGNS格式mesh.write("output.cgns")本次更新共完成27个提交,具体统计如下:
主要涉及的文件模块:
# 克隆项目git clone https://github.com/your-repo/PyMeshGen.git# 安装依赖pip install -r requirements.txt# 启动图形界面python start_gui.py根据项目的开发路线图,后续版本将重点推进以下功能:

👇点击左下方“阅读原文”访问项目!
全文结束,感谢观看,创作不易。
😁😁
欢迎关注、留言、点赞、分享、推荐!
👇👇
【往期回顾】
我用DeepSeek-V3.1做了一下PDE编程求解,来看看结果怎么样