使用 Python 从 ANSYS Mechanical 中导出表格数据
抽象的:
ANSYS Mechanical 提供 Python 脚本环境,允许用户自动控制功能并在 ANSYS Mechanical 环境中收集结果。ANSYS 为其所有产品提供了大量文档,但有些功能仍未记录。
其中一个功能与表格结果数据的提取有关。
这篇文章探讨如何使用 Python 提取表格结果数据并将其导出到 CSV 文件。
细节:
对于许多结果类型,存在一种将结果导出到文件的 Python 方法,但是,并非所有结果类型都支持此功能,如果支持,人们可能希望对收集的数据及其使用方式进行更多的控制。
下图所示的 Python 脚本功能使用“未知控件”访问表格数据窗格。
尽管我想重点介绍导出表格数据的功能,但最简单的示例还必须包含其他功能,才能使此示例有意义。我将详细解释所有这些功能,以便我们能够专注于用于表格数据的这个未知控件。
我的示例检查了应用于简单悬臂梁的应力线性化结果,该悬臂梁受到弯曲载荷并作为静态结构分析求解。结果如下所示:
模型树显示“线性化等效应力”结果。画布显示 3D 模型、图例和应力分类线。图表显示线性化应力结果,这些结果在“表格数据”窗格中列出。
为了清楚起见,我可以右键单击“线性等效应力”并选择“导出文本文件”。
然而,这种方法并没有教会我们任何有关 ANSYS Mechanical 中的 Python 脚本的知识,而且它并不适合实现自动化。
我们还可以请求使用 ANSYS Mechanical 中的 Python 将此结果导出到文本文件。我们通过访问“自动化”功能区并左键单击“脚本”来执行此操作。ANSYS Mechanical 界面右侧将出现两个新窗格:“编辑器”位于顶部,而“Shell”位于底部。我可以为上面显示的模型输入以下三个命令并导出相同的文本文件:
sol=模型.分析[0].解决方案
linres=sol.Children[3]
linres.ExportToTextFile("D:\LinearizedStress.txt")
好的,这是朝着正确方向迈出的一步。三行代码看起来真的很简单。但现实情况是,我不能只为任何模型编写这三行代码,并期望成功导出此文本文件。通常,我会通过在“Shell”中执行命令进行一些搜索,直到找到我想要的内容,然后我可以将其转换为“编辑器”中的脚本,以进行重复的自动化。由于这些细节不是本次讨论的重点,我将继续讨论。
假设我已经编写脚本一段时间了,在此期间,我访问了不同的 ANSYS 资源来键入以导出该表格数据。如果您知道要搜索的内容,则不太可能在在线帮助中找到它。我确实找到了两个资源,它们在这里:
https ://forum.ansys.com/forums/topic/tabular-data-extraction/
https://www.linkedin.com/pulse/script-tip-friday-connecting-mechanical-excel-structural-analysis/
每个例子都提供了对同一事物的不同视角。下面,我将给出第三个视角,希望这个视角能够基于我最初的前提(基于这些表格数据生成 CSV 文件)更加直接。
这是我的基本脚本,可以直接输入到 ANSYS Mechanical 脚本编辑器中:
导入 csv
def writeCSV(文件名,数据):
# 将 Python 列表写入 CSV 文件的函数
使用 open(filename, 'wb') 作为 csvfile:
spamwriter = csv.writer(csvfile, 分隔符=',',
quotechar='|', 引用=csv.QUOTE_MINIMAL)
对于数据中的行:
spamwriter.writerow(行)
感兴趣的结果 = []
ResultsOfInterest.append('线性化等效应力')
导入wbjn
cmd = '返回值(GetUserFilesDirectory())'
用户目录 = wbjn.ExecuteCommand(ExtAPI,cmd)
分析编号=0
解决方案=模型.分析[分析编号].解决方案
对于 j,枚举中的项目(解决方案.Children):
如果 item.GetType() == Ansys.ACT.Automation.Mechanical.Results.LinearizedStressResults.LinearizedEquivalentStress:
如果项目名称在 ResultsOfInterest 中:
项目.激活()
数据=[]
删除数据[:]
窗格=ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)
Con = Pane.ControlUnknown
对于范围内的 R(1,Con.RowsCount+1):
数据.附加([])
对于范围内的 C(2,Con.ColumnsCount+1):
数据[-1].附加(Con.cell(R,C).文本)
writeCSV(user_dir + "/" + Model.Analyses[AnalysisNumber].Name + " – " + item.Name + ".csv", 数据)
打印(“脚本已完成!”)
打印(””)
print("打开文件:" + chr(34) + user_dir + chr(92) + Model.Analyses[AnalysisNumber].Name + " – " + item.Name + ".csv" + chr(34))
现在让我们分解一下这里的内容以便澄清。此 Python 脚本包含以下四个元素:
- 可以过滤特定的 ANSYS 结果名称
- 需要为此特定模型设置 ANSYS 分析编号
- 可以在脚本收集正确结果之前过滤特定的“结果类型”
- 将读取 ANSYS 结果的“表格数据”并将其打印到 CSV 文件中
使用图片(为了清晰起见带有一些颜色),让我们检查一下每个元素的组成。
过滤特定的 ANSYS 结果名称:
上面用粉色突出显示的是定义列表的地方,但此列表仅包含一个名为“线性等效应力”的项目。我可以列出任意多个特定结果。如果我有多个相似的结果,但只对具有此特定名称的结果感兴趣,那么此方法将允许我根据结果对象名称进行筛选。
设置 ANSYS 分析编号:
相同的代码,只是用粉红色突出显示了不同的行。ANSYS 从“零”开始索引项目。因此,在我的模型中,我进行的第一个也是唯一的分析是静态结构分析。由于这是“第一个”分析,我输入“0”来表示该分析编号……完成!
设置“结果类型”:
简短的回答是,这不是您知道的值。您需要使用脚本“Shell”查询模型树中的结果项,并查询“Name”和“GetType()”以获取感兴趣的结果项。我将在不同的演示中探讨如何执行此操作,但对于线性化等效应力结果,建议类型为:
“Ansys.ACT.Automation.Mechanical.Results.LinearizedStressResults.LinearizedEquivalentStress”
如果不过滤结果类型,我可能会尝试提取不存在的特定类型的结果数据。这是选择性控制的又一个级别。
阅读“表格数据”:
最后,这就是我们来到这里的原因!
在此突出显示的部分中,“数据”收集并保存我们将从表格数据中提取的所有内容,然后用于生成 CSV 文件。
我们将“Pane”(顺便说一下,“Pane”是我选择称呼这个对象,你可以根据自己的喜好来命名)定义为一个编程对象,它等同于:
ExtAPI.UserInterface.GetPane(MechanicalPanelEnum.TabularData)
这部分还好。下一行仍是神秘的。我们定义一个名为“Con”的控件,相当于:
窗格.ControlUnknown
现在我可以使用我的新对象“Con”执行操作,从表格数据中提取数据,但请记住,在“Con”后输入一个点“。”不会为您提供可用函数的准确或完整列表。以下是我使用过的一些函数(可能还有更多):
连接行数 | (返回一个整数) |
连接列数 | (返回一个整数) |
Con.cell(R,C).文本 | (其中 R 和 C 是整数) |
Con.Cell(1,C).CheckStateChecked | (布尔值返回 True 或 False) |
如果我们在 Excel 中打开导出的 CSV,则其内容如下:
可以对 ANSYS Mechanical 中的任何表格结果类型重复此过程。
作者:David WangYang