
大家好,我是小郭老师,中科院硕士,长期从事 ANSYS 二次开发与仿真流程自动化,曾帮助多个研究所、研究院、国企和大型企业完成 ANSYS 二次开发项目。
做瞬态分析时,很多结论不能只看一张云图。论文、试验报告或后续数据处理,往往需要拿到某个测点随时间变化的等效应力、主应力或其他应力响应曲线。
手工操作通常要经过几步:先按坐标定义测点,再创建结果 Probe,刷新结果,打开 Tabular Data,最后把表格复制到 CSV。测点一多,坐标单位、结果刷新状态和复制列完整性就很难保持一致。
真正决定这条流程能否自动化的,是 Tabular Data 的读取。Mechanical 可以通过鼠标右键导出表格,但这个操作通常不会出现在 Record Script 结果中。脚本因此直接访问 Tabular Data 控件的单元格,再由 Python 写入 CSV,把任意坐标测点的结果时程纳入自动化流程。
我之前发布过一篇文章《测点不在网格节点上,ANSYS Mechanical 还能提取应力吗?》,已经把测点坐标定位到 Mechanical 的局部坐标系中。这一次继续沿着同一条链路,把 Probe 的 Tabular Data 读出来,写成可供论文绘图、数据分析和仿真-实测对比使用的 CSV。
在 Mechanical 中,结果对象通常有两种查看方式:一种是图形窗口里的曲线,另一种是结果对象对应的 Tabular Data 表格。这里的 Table Data 指的是当前结果经过计算后生成的逐行数据表,表格中保存了时间、结果值和结果对象提供的其他字段。

对于瞬态结果,每一行通常对应一个时间点或一个结果步,每一列则对应时间、结果值以及结果对象提供的其他字段。例如 Equivalent Stress 结果的表格中,常见的内容就是时间列和该测点的等效应力列。结果类型、作用域和分析设置不同,表头和列数也会不同,所以脚本没有把列名或列数写死,而是读取当前表格实际显示的行列范围。
Table Data 好用的地方在于,它把“曲线”变成了可以继续处理的数据:
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 的坐标系原点是否就是目标测点;Location Method 是否为 Coordinate System;Result Selection 是否为 Equivalent;如果对象没有生成或表格没有刷新,先检查 Mechanical 对象树中的坐标系、Probe、Location Method 和 Coordinate System Selection,再核对测点坐标与单位。
当前脚本演示一个坐标测点和一个等效应力 Stress Probe,实际项目可以沿着下面几个方向扩展:
这段脚本用于按任意空间坐标创建 Probe 并导出结果表格。进入时间对齐、插值或误差评价前,先核对时间列、单位、插值位置和实测数据的对应关系。
如果要导出温度、位移或其他结果,需要确认对应的 Probe API 和 Tabular Data 支持情况,再将示例中的 AddStressProbe() 换成适用的结果创建方法。结果类型不同,Probe 的属性、表头和可读数据列也可能不同。非节点位置的结果通常是插值结果;如果项目要求读取指定节点 ID 的原始结果,应改用节点提取或 DPF 路线。
瞬态结果导出要把空间测点、Probe 创建、结果刷新、Tabular Data 读取和 CSV 写入连成一条完整链路。
Python 负责稳定地拿到表格数据,时间单位、测点位置、响应含义和实验对比仍然需要结合具体模型进行判断。这样既能减少手工复制,也不会把数据导出误写成自动验证。
你平时做 Mechanical 项目时,最想交给 Python 处理的是哪一步?可以把模型类型、现在最费时间的操作、希望批量处理的对象写在评论区,我后面可以按场景继续拆脚本。