导读:大家好,我是小郭老师,硕士毕业于中科院,专注于运用 Python 深度集成 ANSYS 进行工程数值计算与仿真自动化开发,精通基于 Python实现ANSYS Workbench众多模块的全流程脚本驱动(建模、求解、后处理),并具备将复杂仿真流程封装为高效、可复用软件工具的专业能力,今天给大家分享一些ANSYS二次开发方面的干货。
春节期间,就有一些学员私信我一个共性难题:在Mechanical中,有些关键参数死活没法参数化,比如多目标优化时的权重设置、螺栓预紧力的大小调整,每次修改都要手动重新操作,反复迭代下来,效率低得让人头疼。
其实很多人不知道,Mechanical自带的Python Code功能,正是解决这类“不可参数化”问题的关键钥匙。今天就从实际工程场景出发,先讲核心技术原理,再上完整实战案例,手把手教你用Python Code实现自定义参数化,看完直接抄作业就能用!
Mechanical的参数化功能虽然强大,但存在明显的“局限性”——只有软件预设的、显示在“Parameters”面板中的参数,才能直接进行参数化设置和迭代分析。

而像学员们提到的「多目标分析权重」「螺栓预紧力」,还有一些自定义载荷、边界条件的细节参数,并不在预设参数列表里,所以没法直接通过常规操作实现参数化。


但幸运的是,ANSYS开放了Python脚本接口,我们可以通过编写Python Code,给Python Code对象添加自定义属性,再通过这些自定义属性,间接实现那些“不可参数化”参数的参数化控制——核心就是用到「Property Provider」功能。
上一篇文章,我们简单介绍了Python Code的基础用法,比如批量导出仿真结果。今天重点讲进阶功能——Property Provider,它的核心作用就是:给Python Code对象添加自定义属性,这些属性既能在Mechanical界面上显示,也能通过脚本API调用,相当于我们自己“造”一个可参数化的参数。
用法非常简单:只需将Python Code对象的PropertyProvider属性,设置为一个实现了IPropertyProvider接口的类实例即可。
关键是——Mechanical已经给我们提供了现成的模板!在Python Code的「Property Provider」标签页中,就能看到默认的模板代码,我们不需要从零编写,只需在此基础上修改、自定义,就能快速添加自己需要的属性。
给大家看一下模板所在的位置:

这个默认的Provider类,已经帮我们做好了3件事,省去了大量重复工作:
自动实现了IPropertyProvider接口(不用我们自己编写接口代码);
添加了AnsGroup辅助类,方便我们在Mechanical细节视图中,对自定义属性进行分组管理;
提供了常用的辅助方法,比如访问自定义属性、控制属性的显示/只读状态等。
创建自定义属性时,需要选择对应的控制类型,不同类型对应不同的用途,工程中最常用的是「Double」类型,我们重点讲。其他3种,我简单带过,避免混淆。
Double:数值类型(最常用),比如螺栓预紧力(N)、载荷大小(MPa)、尺寸参数(mm)等,支持设置数值范围,可直接参数化;
Expression:字符串类型,注意!不是Mechanical的表达式,只是普通字符串,适合存储备注、名称等文本信息;
ApplyCancel:按钮类型,点击后触发对应的操作,适合需要手动触发的脚本逻辑;
Options:下拉选项类型,比如设置材料类型、载荷方向等,可自定义下拉选项内容。
补充一个小知识点:这些基础类型可以扩展,比如Mechanical中的“压力载荷”的范围选择属性(Scoping),就是通过组合Options和ApplyCancel类型实现的。如果需要自定义这类复杂属性,可以参考安装目录下的模板文件:
INSTALL_DIR/aisol/DSPages/Python/mech_templates/property_templates.py这部分是重中之重,也是我们后面实现螺栓预紧力参数化的基础,所有操作都围绕「reload_props()」函数展开。
核心逻辑:创建Provider实例 → 添加属性组(Group)→ 给组添加属性 → 将Provider实例赋值给Python Code对象 → 重新加载属性(Reload)。
以下是完整示例代码,包含注释,可直接copy修改使用:

注意要点:属性名和组名必须唯一,否则会出现报错,后面访问属性时也会出现混乱。
添加完成后,记得在Mechanical中右键Python Code对象,选择「Reload Properties」,自定义属性就会显示在细节视图中了。
操作非常简单:直接删除代码中添加该属性(或组)的相关语句,然后重新加载属性(Reload)即可。
示例:删除上面代码中的Group 2和Property 2,只需删除以下2行代码,再Reload:

提醒:删除属性后,重新加载会重置所有剩余属性,之前设置的属性值会丢失,建议删除前做好备份。
添加属性后,我们需要在脚本中访问它的值,才能实现后续的参数化控制,核心是用到「GetCustomPropertyByPath()」方法。
访问路径规则:组名/属性名(用斜杠分隔),比如“Group 1/Property 1”。
示例1:访问普通Double属性的值(最常用)

示例2:访问扩展属性(如Scoping属性)的值
扩展属性(如Scoping)包含多个子属性,访问时需要加上子属性名,路径规则:组名/扩展属性名/子属性名,比如:

我们添加自定义属性的最终目的,就是实现参数化,这里重点注意:只有Double类型的属性支持参数化,其他类型不支持。
实现步骤:给Double属性设置「CanParameterize = True」,默认是输入参数;如果需要设置为输出参数(比如仿真结果),再添加「ParameterType = ParameterType.Output」。
示例代码(延续上面的案例):

设置完成后,重新加载属性,这些自定义属性就会出现在Mechanical的「Parameters」面板中,和常规参数一样,支持参数化迭代、优化分析了!
如果需要更灵活的属性控制(比如限制输入范围、设置只读、控制显示/隐藏),可以用到Provider类中的回调函数,不需要从零编写,只需修改默认模板即可。
先给大家看一下回调函数的关联逻辑:

作用:控制属性值的有效性,比如设置数值范围,超出范围后,属性会显示黄色警告,Python Code对象会显示“未定义”,避免输入错误参数。
默认逻辑:如果是Double属性,会根据之前设置的ValidRange判断有效性:

作用:设置属性是否为只读,比如一些仿真结果类的输出参数,不允许手动修改,就可以设置为只读。

默认逻辑:返回False(非只读),可自定义修改,示例:将“Property 1”设置为只读:

作用:控制属性的实际赋值,比如设置数值上限,即使用户输入超出上限的值,也会自动调整为上限值。
示例:将“Property 1”的上限设为20,输入21时,自动调整为20:

作用:根据条件控制属性是否在细节视图中显示,比如某些属性只在特定工况下需要显示,其他时候隐藏。
作用:控制属性被访问时的返回值,可根据需求自定义返回逻辑。
如果默认的回调函数满足不了需求,我们可以自定义回调函数,然后将其绑定到对应的属性上。核心要求是,自定义函数的签名,要和Provider类中默认回调函数一致(去掉self参数)。
示例:自定义IsValidCallback,判断Property 1的值是否等于1,等于1则有效,否则无效:

讲完核心技术,我们直接上工程实战案例——卡箍紧固件螺栓预紧力参数化分析,这是很多机械工程师都会遇到的场景,代码可直接copy使用,只需根据自己的模型稍作修改。
某卡箍紧固件用于夹紧圆管,具体工况如下:
圆管材料:铜合金
卡箍紧固件材料:结构钢
摩擦系数:0.15
分析需求:对紧固件的夹紧力(螺栓预紧力)进行参数化分析,求解不同预紧力下,圆管Z方向的变形、卡箍紧固件的最大应力与最大变形。

核心痛点是螺栓预紧力无法直接参数化,每次修改预紧力都要手动调整,迭代分析效率极低。 → 解决方案为,用Python Code添加自定义预紧力属性,实现参数化控制,自动同步修改螺栓预紧力值。
代码分为两部分:reload_props()(添加自定义预紧力属性)和after_object_changed()(属性变化后,自动同步修改螺栓预紧力),完整代码+详细注释如下:


作用:当我们在Parameters面板中修改自定义的“Preload (N)”属性值时,该函数会自动触发,将修改后的值同步到模型中的所有螺栓预紧力载荷上,无需手动修改。

这是 Mechanical 的属性变更回调函数,当修改 Python Code 里自定义的 “Preload (N)” 预紧力参数后,自动把新值同步到模型中所有名为 “Bolt Pretension” 的螺栓预紧力载荷上,实现预紧力的参数化联动。
核心代码语句的介绍如下。
① 过滤无关操作:只响应当前 Python Code 对象的参数修改,避免无关操作触发代码;

② 读参数值:从自定义的 “Parameters/Preload (N)” 属性中读取新的预紧力数值;
preload = this.GetCustomPropertyByPath("Parameters/Preload (N)").Value③ 找目标载荷:定位模型中所有 “Bolt Pretension” 螺栓预紧力对象;
all_prets = DataModel.GetObjectsByName("Bolt Pretension")④ 同步值:按分析步数量,给每个预紧力载荷设置新值(带单位),实现自动更新;

有如下几点需要注意:
① 载荷名必须是 “Bolt Pretension”,否则找不到目标载荷;
✅ 对应代码:all_prets = DataModel.GetObjectsByName("Bolt Pretension")
② 自定义属性路径 “Parameters/Preload (N)” 要和创建时完全一致;
✅ 对应代码:preload = this.GetCustomPropertyByPath("Parameters/Preload (N)").Value


今天通过“螺栓预紧力参数化”这个实战案例,给大家讲清了如何用Python Code+Property Provider,破解Mechanical不可参数化的难题,核心要点总结3句,记牢就能用:
Mechanical预设参数之外的参数,无法直接参数化,但可以用Python Code自定义属性;
Property Provider是核心工具,用于添加自定义属性,重点掌握「Double类型+可参数化设置」;
核心逻辑:自定义可参数化属性 → 编写脚本同步属性值到目标参数 → 实现批量迭代分析,大幅提效。
其实ANSYS二次开发的核心,从来不是“炫技”,而是“解决实际问题”。后续我会继续分享更多ANSYS二次开发实战案例。如果大家在使用过程中遇到问题(比如代码报错、属性不显示、预紧力无法同步),可以在评论区留言,我会逐一回复解答。
最后,记得点赞、在看、转发,关注我,带你解锁更多ANSYS二次开发实战技巧,摆脱重复劳动,高效做仿真!
其实ANSYS二次开发不用追求“高大上”,从实际工程需求出发,用几行代码解决一个具体痛点,就是最实用的开发。比如这个工具,看似简单,却能让工程师从重复的手动操作中解放出来,把时间花在更核心的仿真分析上——这正是二次开发的核心意义。
如果大家还有其他ANSYS使用中的痛点,欢迎在评论区留言,后续会持续分享针对性的二次开发实战案例!此外,欢迎扫描以下二维码问卷,填写你的二次开发需求。

为了更好的分享各种二次开发学习知识,我还创建了二次开发交流群,并于群里分享各种二次开发文章及相关源程序,欢迎大家加入!


点击阅读原文,立即学习《ANSYS Workbench & Mechanical企业级二次开发程序与Python应用入门进阶》,掌握ANSYS Workbench & Mechanical的脚本自动化开发能力。
本课程从基础脚本开发到多工况批量计算的自动化实现,手把手教你用 Python 打通 “仿真流程自动化 - 多工况批量计算” 全链路,让 “重复仿真工作自动化、复杂工况高效计算” 从想法变成日常。
我还为付费用户提供VIP群进行交流、答疑服务、持续加餐内容、提供定制化培训和咨询服务、仿真人才库高薪内推就业、仿真秀还提供奖学金、学完此课程,推荐学习者报名参加工程仿真技术(CAE分析职业能力等级评价证书)。
以下是课程大纲及主要内容:
