还在用APDL?你Out了!快使用ANSYS ACT及其强大的API编写脚本,我们可以轻松地自动化Mechanical的日常任务,固化仿真分析流程,极大提升工作效率。
脚本是指使用编程语言与软件产品进行交互和修改。Workbench Mechanical支持两种脚本语言:JavaScript和ACT Python,两者都暂不支持脚本录制,只能基于API编写。ACT 自动化API是基于Python语言,允许我们自动化Mechanical仿真过程(网格划分、模型设置、后处理等)和获取或设置与本地Mechanical对象的相关数据,这在此之前需要使用JavaScript,现在可以使用IronPython编写实现自动化脚本。Python是一种面向对象、解释型的高级编程语言,语法简洁、优雅、编写的程序易读,易于学习和掌握,适用于非高级开发人员。对于Mechanical脚本开发来说,JavaScript脚本开发目前没有公开的API文档可供参考。ANSYS提供了非常详细和全面的基于Python的ACT开发文档,而且正在逐步扩展和完善ACT开发���能,所以说基于Python的ACT开发代表了以后ANSYS二次开发的发展方向。微信后台回复关键字:“ACT开发文档”,即可获得18.0~2019R3的ACT开发文档。在尝试编写Mechanical自动化脚本之前,我们首先应该熟悉IronPython2.7的使用方法,然后需要了解Mechanical中ACT控制台、对象结构、如何访问对象及其子对象、如何设置和修改对象的属性值等。
2.1 ACT控制台
Mechanical中的ACT控制台提供ACT Python脚本命令的输入,以便我们开发和调试脚本代码。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875259_zzmx99.jpg?imageView2/0)
打开后的ACT控制台如下所示。通过控制台窗口以交互式执行脚本命令,我们可以:
为扩展的ACT插件查找合适命令;
访问和设置Mechanical中对象数据;
在开发插件之前测试脚本代码;
调试开发的ACT插件。
ACT控制台支持多行脚本命令编辑、代码自动缩进、代码自动补全、代码高亮、历史记录和代码片段管理,常用的快捷键如下。
ACT控制台提供智能的自动补全功能,这意味着它考虑了括号或引号等语法元素。当在编辑器中输入句点时,命令行上方将显示一个可滚动的建议列表,方便我们快速完成脚本命令键入。
每个代码补全建议都有一个带有字母和颜色编码的图标:
- 方形图标中的字母描述了成员的类型,如P代表属性(Property),M代表方法(Method)。
- 圆形图标中的字母描述所选成员的返回值类型,如C表示类(Class),E表示枚举(Enumeration)。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875008_dwnvb4.jpg?imageView2/0)
ACT自动化API提供对Mechanical结构树中所有对象的访问权限,允许我们创建对象、删除对象或修改对象属性。
- 通过ACT访问Mechanical结构树时,ExtAPI.DataModel.Project是所有对象的根节点。
- 脚本对象访问遵循和Mechanical结构树相同的结构,从这里我们可以访问所有子节点上的对象。
- 例如访问Mesh对象,我们输入ExtAPI.DataModel.Project.Model.Mesh,或者可简写为Model.Mesh;可以采用相同方式访问模型所有第一级对象(如Geometry、CoordinateSystems等)。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875605_4wan5s.jpg?imageView2/0)
- 除了Environment对象(如边界载荷、后处理等)之外,结构树中的所有对象都遵循单例模式,即第一级对象的实例对象不可能同时存在两个。
- Environment对象作为第一级对象的子对象,存在一个或多个实例对象,不存在直接的访问点。例如,我们可以添加多个Pressure载荷,如果要想访问这些对象,就必须通过Children属性或GetChildren方法访问。
如上所述,对于能在Mechanical结构树中存在多个实例的对象,不存在直接的访问点。①引用父对象实例,使用Children属性或者GetChildren方法,获得所有子对象列表。②通过列表索引或对象名称(Name)引用的方式去获得子对象。下面我们通过一个实例演练一下。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875549_qkmxm8.jpg?imageView2/0)
- 上面模型中,可以直接通过结构树访问Named Selections对象,并将实例对象赋值给变量nsObject;
- 然后获取nsObject对象的Children属性得到子对象列表;也可以基于父对象中子对象的枚举类型,使用GetChildren方法获得子对象列表,方法需要传入两个参数:①枚举类型 (DataModelObjectCategory),指定要查找的对象的类别。②布尔类型,指定是否递归地检索子类。
- 最后通过nsList的列表索引访问子对象;获得子对象之后,我们可以访问它们的Name属性,然后在控制台打印出来,代码和结果如下。nsObject = Model.NamedSelections
# 三种方法获取Named Selections对象的子对象列表
nsList = nsObject.Children
nsList = nsObject.GetChildren(DataModelObjectCategory.NamedSelection,True)
nsList = DataModel.GetObjectsByType(DataModelObjectCategory.NamedSelection)
# 列表索引方式获得子对象实例
nsFixed = nsObject.Children[0]
nsPress = nsObject.Children[1]
nsBracket = nsObject.Children[2]
# 访问子对象的Name属性,打印到控制台
print nsFixed.Name, nsPress.Name, nsBracket.Name
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875947_857few.jpg?imageView2/0)
- 上面代码中,我们通过列表索引获取子对象,同样也能通过其名称引用子对象实例,封装的代码方法如下:# 给定Named Selection名称获取子对象实例def GetLocByName(ns_name):
for ns in Model.NamedSelections.Children:
if ns.Name == ns_name: return ns
nsFixed = GetLocByName("FixedSurface")
nsPress = GetLocByName("PressSurface")
nsBracket = GetLocByName("BracketBody")
Mechanical结构树中的第一级对象都可作为父对象添加子对象;在界面上我们可以选中父对象,然后单击右键会出现菜单,选择Insert项下的子菜单项就可添加子对象。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875456_q4ydju.jpg?imageView2/0)
ACT自动化API中,要想添加子对象到结构树中,首先要获得其父对象实例,然后调用父对象的addObjectName()方法,其中ObjectName是所需对象的名称;最后需要设置子对象的属性参数。例如,我们在静结构 (Static Structure) 分析下添加一个Force载荷,可输入以下代码:
#1.To get the static structural analysis object, type:
analysisObj = Model.Analyses[0]
#2.To create the force and assign it to a variable, type AddForce()
force = analysisObj.AddForce()
#3.Now we can manipulate the created force's property using
force.TypeHereAProperty = TypeHerePropertyValue
一旦我们获得Mechanical对象的实例后,就可以在ACT控制台中,通过脚本命令读取和修改界面上详细视图(Details View)中对应的属性参数。在Mechanical中属性值常见的有6种输入类型:Number、Enumeration、Bool、Quantity、Scoping和Magnitude,下面我们详细介绍一下使用方法。对象详细视图下需要输入无单位数值的项,属性值应该赋予对应Number值类型,如int整形。例如更改分析设置中的计算步数,输入如下。对象详细视图中提供下拉框选择的选项,属性值应赋予对应的Enumeration值类型,如下设置属性SolverType值为SolverType.Direct枚举类型。对象详细视图中需要只选择On和Off的选项,属性值应赋予对应的Bool类型。比如激活分析设置中的大变形选项,输入如下。对象详细视图中需要输入带单��数值的项,属性值应赋予对应的Quality类型:类型为Quantity(‘value[unit]’)。例如,更改网格单元格尺寸为2mm,输入如下。对象详细视图中Scope组中需要指定Geometry的项,对象的Location属性应赋予对应的Scoping值类型。Mechanical提供两种指定方式:Geometry Selection和Named Selection。例如,添加一个Pressure载荷,并指定加载的边界位置,我们采用两种方式实现,输入如下。
- Geometry Selection选择:需要先创建一个SelectionInfo对象,然后将几何实体赋予SelectionInfo对象的Entities属性,最后指定给压力载荷对象的Location属性。
- Named Selection选择:需要得到Named Selections下子对象的实例,然后指定给压力载荷对象的Location属性。
对象详细视图中需要输入Magnitude值的项,属性值应赋予Magnitude值类型;Mechanical中提供三种输入模式:①公式输入②表格数据③常数类型。例如,我们继续以(5)中的压力载荷对象,给定载荷数值大小。
云图输出首先需要创建后处理对象,然后激活对象让其高亮显示,最后使用Graphics.ExportImage方法,指定输出的图片路径即可。例如,我们创建一个总变形云图,然后输出照片,代码示例如下。
total_deform = Model.Analyses[0].Solution.AddTotalDeformation()total_deform.EvaluateAllResults()total_deform.Activate()Graphics.ExportImage("E:\\Workdata\\total.png")
在Workbench脚本中可以通过SendCommand命令将ACT Python命令发送Mechanical去执行,以实现仿真流程的集成,代码示例如下所示。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815875722_6yqxiq.jpg?imageView2/0)
4、案例练习
本期中我们可以基于SCDM脚本建模生成的模型,在Mechanical中使用ACT Python脚本实现自动化仿真分析。
![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1595815874774_m7h5z4.jpg?imageView2/0)
使用SCDM创建模型和Mechanical仿真设置过程大家可以参照上一篇文章,然后参照本期内容,自己上手编写自动化脚本吧。