当前位置:首页>python>论文里的有限元瞬态应力曲线怎么导出?用 Python 读取 ANSYS Mechanical 任意测点结果

论文里的有限元瞬态应力曲线怎么导出?用 Python 读取 ANSYS Mechanical 任意测点结果

  • 2026-10-06 05:58:16
论文里的有限元瞬态应力曲线怎么导出?用 Python 读取 ANSYS Mechanical 任意测点结果

论文里的有限元瞬态应力曲线怎么导出?用 Python 读取 ANSYS Mechanical 任意测点结果

需求描述:测点结果不应该靠手工复制

大家好,我是小郭老师,中科院硕士,长期从事 ANSYS 二次开发与仿真流程自动化,曾帮助多个研究所、研究院、国企和大型企业完成 ANSYS 二次开发项目。

做瞬态分析时,很多结论不能只看一张云图。论文、试验报告或后续数据处理,往往需要拿到某个测点随时间变化的等效应力、主应力或其他应力响应曲线。

手工操作通常要经过几步:先按坐标定义测点,再创建结果 Probe,刷新结果,打开 Tabular Data,最后把表格复制到 CSV。测点一多,坐标单位、结果刷新状态和复制列完整性就很难保持一致。

真正决定这条流程能否自动化的,是 Tabular Data 的读取。Mechanical 可以通过鼠标右键导出表格,但这个操作通常不会出现在 Record Script 结果中。脚本因此直接访问 Tabular Data 控件的单元格,再由 Python 写入 CSV,把任意坐标测点的结果时程纳入自动化流程。

我之前发布过一篇文章《测点不在网格节点上,ANSYS Mechanical 还能提取应力吗?》,已经把测点坐标定位到 Mechanical 的局部坐标系中。这一次继续沿着同一条链路,把 Probe 的 Tabular Data 读出来,写成可供论文绘图、数据分析和仿真-实测对比使用的 CSV。

Table Data 为什么值得单独读取

在 Mechanical 中,结果对象通常有两种查看方式:一种是图形窗口里的曲线,另一种是结果对象对应的 Tabular Data 表格。这里的 Table Data 指的是当前结果经过计算后生成的逐行数据表,表格中保存了时间、结果值和结果对象提供的其他字段。

对于瞬态结果,每一行通常对应一个时间点或一个结果步,每一列则对应时间、结果值以及结果对象提供的其他字段。例如 Equivalent Stress 结果的表格中,常见的内容就是时间列和该测点的等效应力列。结果类型、作用域和分析设置不同,表头和列数也会不同,所以脚本没有把列名或列数写死,而是读取当前表格实际显示的行列范围。

Table Data 好用的地方在于,它把“曲线”变成了可以继续处理的数据:

  • • 保留时间列和响应列,便于导入 Excel、Python 或 MATLAB 做峰值、均值和时间区间分析;
  • • 直接读取当前结果对象的表头和显示单位,导出文件更容易和 Mechanical 界面逐项核对;
  • • 不需要手工拖动曲线、抄写数据或复制不完整的列,多个测点和多个结果对象可以沿用同一套读取逻辑;
  • • CSV 文件可以作为论文绘图、试验对比和后续批处理的输入,避免每次重新打开工程再复制一遍。

Table Data 反映的是当前 Probe、当前单位系统和当前显示精度;如果测点不在网格节点上,结果通常来自有限元结果插值。进入时间对齐或高精度数值计算前,还要结合具体需求核对单位、插值位置和数据精度。

脚本实现思路

这段脚本的逻辑可以分成三层。第一层是测点定义:脚本把输入坐标转换成局部坐标系,让坐标系原点承担测点位置。这样,测点定位依赖空间坐标,而不是依赖某个恰好存在的网格节点。

第二层是结果生成:脚本进入当前分析的 Solution,创建 Stress Probe,并把 Probe 的定位方式设为坐标系,同时指定提取等效应力。随后调用 EvaluateAllResults(),让 Mechanical 完成结果计算并刷新当前 Probe 对应的 Tabular Data。

第三层是数据导出:脚本激活 Probe,使 Tabular Data 面板切换到目标结果;再通过表格控件获取实际的行数和列数,逐个读取单元格显示文本,最后写入 CSV。这里读取的是当前结果表格已经显示的内容,因此表头、时间列、单位和结果列都来自当前 Probe 的实际表格。

整体执行过程可以理解为下面六步:

第一步,脚本设置标准 MKS 单位,并接收目标测点坐标。

第二步,脚本创建局部坐标系,将其原点设置为目标坐标。这个坐标可以落在单元内部、单元边界或其他没有网格节点的位置。

第三步,脚本在当前分析的 Solution 下创建 Stress Probe,使用坐标系定位,并将结果类型限定为 Equivalent。

第四步,脚本调用 EvaluateAllResults(),让 Probe 完成计算并刷新 Tabular Data。

第五步,脚本激活 Probe,取得 MechanicalPanelEnum.TabularData 对应的面板控件。

第六步,脚本根据表格实际的行列范围读取每个单元格文本,并使用 csv.writer 写入带 UTF-8 BOM 的 CSV 文件。

源码及其讲解

读取表格时,脚本激活当前 Probe,再读取它显示的 Tabular Data:

stress_probe.Activate()pane_tabular = ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)control = pane_tabular.ControlUnknownnum_columns = control.ColumnsCount + 1num_rows = control.RowsCount + 1for row in range(1, num_rows):    for col in range(1, num_columns):        cell_value = control.cell(row, col).Text

这种方式拿到的是 Mechanical 当前表格中的显示文本,能够保留表头、时间列、单位格式以及应力结果列的实际显示内容。最后通过 GetUserFilesDirectory() 获取 Mechanical 用户文件目录,输出 stress_monitor.csv,避免把路径写死在某个工程目录里:

cmd = "returnValue(GetUserFilesDirectory())"user_files_dir = wbjn.ExecuteCommand(ExtAPI, cmd)file_path = os.path.join(user_files_dir, "stress_monitor.csv")

脚本运行结果

脚本会创建坐标系原点位于目标位置的 Stress Probe,并将等效应力的 Tabular Data 写入 Mechanical 用户文件目录下的 stress_monitor.csv。即使坐标位置没有对应的网格节点,也可以通过 Probe 获取该位置的应力响应。

运行后的对象和文件关系如下:

运行完成后,回到 Mechanical 对象树和导出文件中复核表头、时间列、响应列和数据行数。重点检查:

  • • monitor_point 的坐标系原点是否就是目标测点;
  • • 测点坐标是否使用 MKS 单位,是否落在预期位置;
  • • Stress Probe 的 Location Method 是否为 Coordinate System;
  • • Stress Probe 的 Result Selection 是否为 Equivalent;
  • • Tabular Data 的行列数是否与结果对象对应;
  • • 时间列和响应列的单位是否能与实验数据对应;
  • • 等效应力曲线的峰值位置是否符合该测点的结构响应。

如果对象没有生成或表格没有刷新,先检查 Mechanical 对象树中的坐标系、Probe、Location Method 和 Coordinate System Selection,再核对测点坐标与单位。

脚本扩展方向

当前脚本演示一个坐标测点和一个等效应力 Stress Probe,实际项目可以沿着下面几个方向扩展:

  1. 1. 从 CSV 或 Excel 读取多组坐标,批量创建坐标系和 Probe,并按测点名称分别输出文件。
  2. 2. 建立结果类型与 Probe 创建方法的映射,同时导出温度、应力、位移等不同响应。
  3. 3. 在 CSV 中增加测点名称、坐标、单位和结果类型等元数据,方便后续与实测数据逐列对应。
  4. 4. 将导出结果接入时间对齐、插值、峰值提取和仿真-实测对比流程,形成完整的时程数据处理链路。

技术边界

这段脚本用于按任意空间坐标创建 Probe 并导出结果表格。进入时间对齐、插值或误差评价前,先核对时间列、单位、插值位置和实测数据的对应关系。

如果要导出温度、位移或其他结果,需要确认对应的 Probe API 和 Tabular Data 支持情况,再将示例中的 AddStressProbe() 换成适用的结果创建方法。结果类型不同,Probe 的属性、表头和可读数据列也可能不同。非节点位置的结果通常是插值结果;如果项目要求读取指定节点 ID 的原始结果,应改用节点提取或 DPF 路线。

总结

瞬态结果导出要把空间测点、Probe 创建、结果刷新、Tabular Data 读取和 CSV 写入连成一条完整链路。

Python 负责稳定地拿到表格数据,时间单位、测点位置、响应含义和实验对比仍然需要结合具体模型进行判断。这样既能减少手工复制,也不会把数据导出误写成自动验证。

你平时做 Mechanical 项目时,最想交给 Python 处理的是哪一步?可以把模型类型、现在最费时间的操作、希望批量处理的对象写在评论区,我后面可以按场景继续拆脚本。

最新文章

随机文章