
大家好,我是小郭老师,中科院硕士,长期从事 ANSYS 二次开发与仿真流程自动化。
在普通 Python 环境里,把一组数据画成曲线图,通常会直接调用 Matplotlib。
但 ANSYS Mechanical 命令框使用的是 Python 2.7 / IronPython 环境,很多 CPython 生态里的库不能直接调用,Matplotlib 就不适合作为 Mechanical 内部脚本的默认方案。
这篇文章的重点,就是在 Mechanical 这个环境里自己实现一套 Matplotlib 风格的轻量绘图函数。
它的用法仍然接近 figure()、plot()、title()、xlabel()、ylabel()、legend() 和 savefig() 这一套习惯,但底层不依赖 Matplotlib,而是调用 IronPython 可以访问的 .NET System.Drawing 绘图能力。
有了这套函数后,Mechanical 结果对象中的 Table Data 就可以在命令框内直接转换成曲线图。用户不需要先copy表格、再到 Excel 或外部 Python 环境里二次处理,脚本可以直接读取表格数据并导出 PNG 图片。
前面的文章里,我们已经介绍过如何从 Mechanical 后处理结果中读取 Table Data,包括云图结果的最大值、最小值、平均值,或者特定测点位置上的结果值。这一篇继续往后走一步:在 Mechanical 命令框中读取 Table Data,并直接绘制曲线图,导出为 PNG 图片。
本文使用的 Case 是一个 Temperature 结果对象。
在 Mechanical 中激活该结果后,Tabular Data 面板会显示对应的结果表格。对于瞬态结果,这张表通常包含时间列和结果列。时间列适合作为曲线横轴,温度结果列适合作为曲线纵轴。如果表格中包含多个结果列,也可以绘制成多条曲线,并用图例区分。
本文的目标不是把 Table Data 导出去以后再处理,而是在 Mechanical 命令框内完成从表格到曲线图的转换。脚本需要完成几件事:
Temperature 的结果对象;这样得到的 PNG 图片可以直接进入后续报告整理,也可以和前面介绍过的极值读取、测点数据读取组合成更完整的 Mechanical 后处理自动化流程。
这个功能分成两层:第一层读取 Table Data,第二层绘制曲线图。
读取 Table Data 仍然依赖 Mechanical 的界面对象。脚本先激活目标结果对象,再获取 Tabular Data 面板,通过底层表格控件读取行数、列数和单元格文本。读取完成后,表格会被整理成一个二维列表,第一行作为表头,后面的行作为数据。
绘图部分的接口参考 Matplotlib 的使用习惯,但底层没有调用 Matplotlib,而是使用 IronPython 可以访问的 .NET 绘图能力。底层调用的是 System.Drawing,主要包括:
Bitmap:创建图片画布;Graphics:在画布上绘制坐标轴、网格、文字和曲线;Pen:控制线条颜色和粗细;Font:控制标题、坐标轴标签和刻度文字;Color:定义曲线、网格和背景颜色;PointF:保存曲线上的像素坐标点。整体流程如下:

第一步,在 Mechanical 命令框中运行脚本,并导入自定义的 MechanicalPlot 绘图函数。
第二步,通过对象名称查找目标结果。本文的 Case 使用的是 Temperature 结果对象。
第三步,激活目标结果对象。Mechanical 的 Tabular Data 面板会随当前激活对象变化,因此读取表格前必须先执行激活动作。
第四步,从 Tabular Data 面板的底层控件中读取行数、列数和单元格文本,把界面表格转换成 Python 二维列表。
第五步,解析表头和数据列。脚本默认把第 2 列作为时间列,把后续列作为结果列。如果后续有多列结果,就自动绘制多条曲线。
第六步,调用绘图函数完成坐标轴、网格、刻度、曲线、标题、坐标轴标签和图例绘制,并将图片保存为 PNG 文件。

读取 Table Data 的关键是先激活结果对象。Mechanical 的 Tabular Data 面板会随着当前激活对象变化,如果不先激活目标结果,读取到的表格可能不是当前想处理的结果。
关键片段如下:
def read_tabular_data(result_obj):
result_obj.Activate()
pane_tabular = ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)
control = pane_tabular.ControlUnknown
num_columns = control.ColumnsCount + 1
num_rows = control.RowsCount + 1
table = []
for row in range(1, num_rows):
values = []
for col in range(1, num_columns):
values.append(control.cell(row, col).Text)
table.append(values)
return table这里通过 ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData) 获取 Tabular Data 面板,再从底层控件中读取单元格文本。由于表格里读出来的是字符串,真正绘图前需要把对应列转换成浮点数。
def column_to_float_list(table, col):
values = []
for row in table[1:]:
values.append(float(row[col]))
return values绘图时,表头用于生成曲线名称,第 2 列作为时间列,后续结果列作为纵轴数据列。这样一张 Table Data 中如果包含多个结果列,就可以自动生成多条曲线。
def plot_result_columns(plt, table):
header = table[0]
t = column_to_float_list(table, 1)
result_col_count = len(header) - 2
labels = []
for col in range(2, len(header)):
y = column_to_float_list(table, col)
label = label_text(header[col])
labels.append(label)
plt.plot(t, y, label=label)
if result_col_count > 1:
plt.legend()
return labels绘图函数内部会创建高分辨率 Bitmap 画布,再通过 Graphics 绘制坐标轴、网格线、刻度文字、曲线、标题和图例。真实数据点会先按照 x/y 数据范围映射成图片中的像素坐标,然后用 DrawLines 绘制成曲线。
当前这个轻量绘图函数已经实现了接近 Matplotlib 的常用接口。也就是说,在 Mechanical 命令框里可以按照熟悉的绘图思路组织代码:
plt.figure()
plt.plot(t, y, label=label)
plt.title("Temperature Result")
plt.xlabel("Time [s]")
plt.ylabel("Temperature [degC]")
plt.legend()
plt.savefig(output_path)这里需要注意,表头中如果包含角度符号,脚本会将其替换成 deg,用于提高 Python 2.7 / IronPython 环境中的文本稳定性。这个处理只影响图例和坐标轴标签,不改变结果数据本身。


在这个 Case 中,脚本会查找名为 Temperature 的结果对象,并读取该对象当前显示的 Table Data。
运行后,命令框中会先输出 Mechanical 当前项目的用户文件目录:
User files directory: ...随后会输出 PNG 图片导出路径:
PNG exported: ...\mechanical_plot_temperature.png最终生成的图片文件名为:
mechanical_plot_temperature.png这张图片保存在 Mechanical 当前项目的 User Files 目录中。打开图片后,可以看到 Temperature 结果对应的曲线图:横轴为时间,纵轴为温度结果;如果 Table Data 中包含多列结果,图片中会显示多条曲线,并通过图例区分。
导出的曲线图如下:

复核时可以回到 Mechanical 的 Temperature 结果对象,打开 Tabular Data 面板,对照检查三点:
第一,曲线横轴是否对应 Table Data 中的时间列。
第二,曲线数量是否对应 Table Data 中的结果列数量。
第三,纵轴标签和图例名称是否来自表头信息。
如果这三项一致,说明从 Table Data 读取、数据列解析到 PNG 绘图导出的链路是对应的。
这个绘图方法可以继续扩展到更多 Mechanical 后处理场景。
第一,可以用于 Probe 结果曲线。只要 Probe 对象的 Table Data 中包含时间列和结果列,就可以沿用相同的读取与绘图逻辑。
第二,可以用于多个结果分量对比。例如某些结果对象的 Table Data 中包含多个方向分量或多个位置结果,脚本可以自动绘制多条曲线,并通过图例区分。
第三,可以加入 CSV 同步导出。曲线图适合报告展示,CSV 适合论文数据整理和后续复算,两者可以从同一份 Table Data 中同时生成。
第四,可以扩展坐标轴格式控制。例如固定 y 轴范围、控制刻度数量、调整图例位置,或者根据结果类型自动设置坐标轴标题。
第五,可以和报告自动生成流程结合。Mechanical 内部完成结果读取和图片导出后,后续再由报告脚本统一引用这些 PNG 图片,减少手动截图和手动整理。
这套方法的核心,是把 Mechanical 后处理界面中的 Table Data 转成可以自动绘制的曲线数据。
Table Data 的读取仍然走 Mechanical 结果对象和 Tabular Data 面板;曲线绘制则使用 Python 2.7 / IronPython 可以调用的 .NET System.Drawing 能力完成。最终得到的是一张可直接用于报告整理的 PNG 图片。
对于 ANSYS Mechanical 有限元后处理来说,这个能力适合放在结果自动导出链路里:先读取云图或测点结果,再整理 Table Data,最后把关键曲线图保存出来。
如果你对 mechanical_plot 里面更细的实现感兴趣,比如坐标映射、刻度绘制、纵轴文字旋转、图例布局这些底层细节,可以私信我。