



(一)差别在哪?
“后台交互” 是 ANSYS 二次开发里 “藏起技术细节、提升效率” 的核心功能,很多工程师第一次接触时都会疑惑 “它到底是怎么工作的”。
简单说,后台交互就是 ANSYS 程序在电脑后台自动运行,不弹出任何可视化界面(比如 Mechanical 的程序界面),用户看不到操作过程,只能通过日志或最终结果确认执行状态。它和我们平时 “手动点开 Mechanical 界面、一步步操作” 的 “前台交互” 是完全相反的模式。
对比维度 | 前台交互 | 后台交互 |
界面显示 | 弹出 Mechanical 完整窗口,能看到网格、载荷、结果云图 | 无任何界面,任务管理器里能看到 ANSYS 进程在运行 |
操作干预 | 可以随时暂停、修改参数(比如中途调整网格大小) | 全程自动执行,无法手动干预(除非强制结束进程) |
电脑占用 | 界面会占用屏幕空间,切换窗口时可能卡顿 | 只占系统资源(CPU / 内存),不影响用电脑做其他事(比如写报告、画图纸) |
适用场景 | 脚本调试、参数优化(需要实时看过程) | 批量仿真、客户交付工具(不需要看界面,只要结果) |

# -*- coding: utf-8 -*- # 指定文件编码为UTF-8,确保支持中文注释和路径import os # 导入操作系统接口模块,用于文件路径操作
is_background = True # 后台运行模式标志(True表示非交互模式)
proj_folder = GetProjectDirectory() # 获取当前ANSYS Workbench项目目录路径
# 构建脚本文件路径并统一使用正斜杠(确保跨平台兼容性)
file_script = os.path.join(proj_folder, "script", "script_mechanical.py") # 拼接Mechanical脚本路径
file_script = file_script.replace("\\", "/")
# 构建几何文件路径并统一使用正斜杠
file_geo = os.path.join(proj_folder, "geometry", "geo.scdoc") # 拼接几何模型文件路径
file_geo = file_geo.replace("\\", "/") 在这段代码块中,绝大多数命令在我发布的上一篇文章《Python+ANSYS,打造多工况仿真自动化系统》中均有所提及。与本文所讲内容相关的就是命令is_background = True。
is_background设为True,就是后台运行(不弹 Mechanical 界面);设为False,就是前台运行(弹出界面让你看过程)。
我平时开发时,调试阶段会设成False—— 方便盯着界面看哪里出错了;给客户交付时就改成True,藏起 ANSYS 界面,只给客户看结果。
3、核心函数定义:材料创建
def create_mat(system_mat, mat_name, density, therma_conductivity): """在工程数据系统中创建新材料并定义其物理属性 参数: system_mat: 材料系统对象(工程数据容器) mat_name: 材料名称(字符串) density: 材料密度值(kg/m³) therma_conductivity: 材料热导率值(W/m·°C) """ # 获取工程数据容器 engineeringData1 = system_mat.GetContainer(ComponentName="Engineering Data") # 创建新材料对象 mat = engineeringData1.CreateMaterial(Name=mat_name) # 定义密度属性(带单位说明) mat.CreateProperty(Name='Density').SetData( Variables=['Density'], Values=[["%s [kg m^-3]" % density]] # 格式化为带单位的字符串 ) # 定义热导率属性(带单位说明) mat.CreateProperty(Name='Thermal Conductivity').SetData( Variables=['Thermal Conductivity'], Values=[["%s [W m^-1 C^-1]" % therma_conductivity]] # 格式化为带单位的字符串 )
这个create_mat函数是 “批量建材料” 的核心,解决了手动在 Engineering Data 里点来点去的麻烦。咱们拆解下它的逻辑:
参数设计:函数需要 4 个参数 ——system_mat(材料系统对象,相当于 ANSYS 里的 “工程数据” 模块)、mat_name(材料名)、density(密度)、therma_conductivity(热导率)。这样设计后,想建多少材料,调用多少次函数就行,不用重复写代码。
获取工程数据容器:engineeringData1 = system_mat.GetContainer(...)相当于手动点开 Workbench 里的 “Engineering Data” 模块,拿到操作权限。
创建材料:mat = engineeringData1.CreateMaterial(...)对应手动点击 “创建新材料” 按钮,Name=mat_name就是给材料起名(比如 “Mag2Al”)。
定义属性:重点看SetData里的Values参数,这里用了"%s [kg m^-3]" % density的格式。这是因为 ANSYS 对单位非常敏感,如果你只写 “2560”,它可能默认成 “g/cm³”,结果直接差 1000 倍!带单位字符串能确保 ANSYS 正确识别([kg m^-3]就是千克每立方米,[W m^-1 C^-1]是瓦每米每摄氏度)。
在飞机多层窗导热分析中,按要求需创建4种材料,则重复调用这个函数4次,即可完成材料参数的定义。
# 创建材料系统
template_mat = GetTemplate(TemplateName="EngData") # 获取工程数据模板
system_mat = template_mat.CreateSystem() # 基于模板创建材料系统
# 创建四种工程材料
create_mat(system_mat, "Mag2Al", 2560, 158) # 创建Mag2Al合金材料
create_mat(system_mat, "air", 1.295, 0.024) # 创建空气材料
create_mat(system_mat, "glass", 33, 0.025) # 创建玻璃材料
create_mat(system_mat, "al", 4450, 202) # 创建铝材料
# 创建材料系统
template_mat = GetTemplate(TemplateName="EngData") # 获取工程数据模板
system_mat = template_mat.CreateSystem() # 基于模板创建材料系统
# 创建四种工程材料
create_mat(system_mat, "Mag2Al", 2560, 158) # 创建Mag2Al合金材料
create_mat(system_mat, "air", 1.295, 0.024) # 创建空气材料
create_mat(system_mat, "glass", 33, 0.025) # 创建玻璃材料
create_mat(system_mat, "al", 4450, 202) # 创建铝材料
前两行相当于在 Workbench 左侧拖一个 “Engineering Data” 模块到项目里。GetTemplate是拿 “工程数据” 的模板,CreateSystem是实际创建这个模块。有了它,后面才能在里面建材料。
之后就是调用前面定义的create_mat函数,一次性建四种材料。
如果后续需要加材料,直接再加一行create_mat(...)就行。比如,加个 “铜” 就写:create_mat(system_mat, "copper", 8960, 401),非常方便。
(2)把材料共享给热分析系统
# 获取工程数据组件用于后续共享
engineeringDataComponent1 = system_mat.GetComponent(Name="Engineering Data")# 创建热分析系统并共享工程数据
template_thermal = GetTemplate(TemplateName="Steady-State Thermal", Solver="ANSYS") # 获取稳态热分析模板# 创建热分析系统并共享已定义的材料数据
system_thermal = template_thermal.CreateSystem(
ComponentsToShare=[engineeringDataComponent1], # 共享工程数据组件
Position="Right" # 在Workbench界面右侧创建新系统)这部分解决了 “材料复用” 的问题。手动操作时,建完材料后要在热分析模块里手动关联,脚本里用ComponentsToShare参数,直接把前面建好的材料系统共享给新创建的热分析系统(Steady-State Thermal是稳态热分析模板),避免重复定义材料。
Position="Right"是说在 Workbench 界面里,热分析系统显示在材料系统的右边,和手动拖模块的布局一致,方便调试时查看。
(3)导入几何模型
# 设置几何模型
geo_thermal = system_thermal.GetContainer(ComponentName="Geometry") # 获取几何容器
geo_thermal.SetFile(FilePath=file_geo) # 导入几何模型文件
这两行相当于在热分析系统里双击 “Geometry”,然后选择前面定义好的file_geo路径导入模型。GetContainer(ComponentName="Geometry")是拿到几何模块的操作权限,SetFile是指定要导入的几何文件。
如果你的几何需要参数化(比如窗户厚度可变),可以在这一步后面加geo_thermal.Edit()打开 SpaceClaim 脚本接口,批量修改尺寸参数 。关于这部分,这个我们后面案例再细讲。
(4)控制前台 / 后台交互模式
# 设置分析环境
setup_thermal = system_thermal.GetContainer(ComponentName="Setup") # 获取分析设置容器
setup_thermal.Edit(Interactive=not is_background) # 根据后台标志决定是后台交互还是前台交互
这是实现 “后台 / 前台切换” 的关键代码!setup_thermal是热分析的 “设置” 模块(就是 Mechanical 里划分网格、加边界条件的地方)。
setup_thermal.Edit(Interactive=...)里的Interactive参数:
当is_background=True时,Interactive=not True=False,表示 “非交互模式”(后台运行,不弹 Mechanical 界面);
当is_background=False时,Interactive=not False=True,表示 “交互模式”(前台运行,弹出 Mechanical 界面)。
这就是为什么前面说is_background是 “总开关”—— 改一个参数,就能在调试和交付模式间切换。
# 构建并执行Mechanical脚本命令
command = 'WB.AppletList.Applet("DSApplet").App.Script.doToolsRunMacro("%s")' % file_script
setup_thermal.SendCommand(Command=command) # 在Mechanical环境中执行外部Python脚本这部分是 “调用细节脚本”。前面的脚本解决了 “建材料、关联系统、导入几何”,但具体的网格划分(比如设置网格尺寸 2mm)、加边界条件(比如外表面温度 - 50℃)、求解设置(比如收敛精度 1e-6),这些更细致的操作通常写在script_mechanical.py里(就是前面定义的file_script路径)。
SendCommand相当于在 Mechanical 的命令行里输入指令,让它去运行script_mechanical.py里的内容。这样做的好处是 “分工明确”—— 主脚本管流程,细节脚本管具体操作,后续改网格或边界条件时,只动细节脚本就行。
# -*- coding: utf-8 -*- # 指定文件编码为UTF-8,确保支持中文注释和路径import os # 导入操作系统接口模块,用于文件路径操作# ========================# 用户参数定义# ========================is_background = True # 后台运行模式标志(True表示非交互模式)proj_folder = GetProjectDirectory() # 获取当前ANSYS Workbench项目目录路径# 构建脚本文件路径并统一使用正斜杠(确保跨平台兼容性)file_script = os.path.join(proj_folder, "script", "script_mechanical.py") # 拼接Mechanical脚本路径file_script = file_script.replace("\\", "/") # 构建几何文件路径并统一使用正斜杠file_geo = os.path.join(proj_folder, "geometry", "geo.scdoc") # 拼接几何模型文件路径file_geo = file_geo.replace("\\", "/") # ========================# 核心函数定义# ========================def create_mat(system_mat, mat_name, density, therma_conductivity): """在工程数据系统中创建新材料并定义其物理属性 参数: system_mat: 材料系统对象(工程数据容器) mat_name: 材料名称(字符串) density: 材料密度值(kg/m³) therma_conductivity: 材料热导率值(W/m·°C) """ # 获取工程数据容器 engineeringData1 = system_mat.GetContainer(ComponentName="Engineering Data") # 创建新材料对象 mat = engineeringData1.CreateMaterial(Name=mat_name) # 定义密度属性(带单位说明) mat.CreateProperty(Name='Density').SetData( Variables=['Density'], Values=[["%s [kg m^-3]" % density]] # 格式化为带单位的字符串 ) # 定义热导率属性(带单位说明) mat.CreateProperty(Name='Thermal Conductivity').SetData( Variables=['Thermal Conductivity'], Values=[["%s [W m^-1 C^-1]" % therma_conductivity]] # 格式化为带单位的字符串 )# ========================# 主程序执行# ========================# 创建材料系统template_mat = GetTemplate(TemplateName="EngData") # 获取工程数据模板system_mat = template_mat.CreateSystem() # 基于模板创建材料系统# 创建四种工程材料create_mat(system_mat, "Mag2Al", 2560, 158) # 创建Mag2Al合金材料create_mat(system_mat, "air", 1.295, 0.024) # 创建空气材料create_mat(system_mat, "glass", 33, 0.025) # 创建玻璃材料create_mat(system_mat, "al", 4450, 202) # 创建铝材料# 获取工程数据组件用于后续共享engineeringDataComponent1 = system_mat.GetComponent(Name="Engineering Data")# 创建热分析系统并共享工程数据template_thermal = GetTemplate(TemplateName="Steady-State Thermal", Solver="ANSYS") # 获取稳态热分析模板# 创建热分析系统并共享已定义的材料数据system_thermal = template_thermal.CreateSystem( ComponentsToShare=[engineeringDataComponent1], # 共享工程数据组件 Position="Right" # 在Workbench界面右侧创建新系统)# 设置几何模型geo_thermal = system_thermal.GetContainer(ComponentName="Geometry") # 获取几何容器geo_thermal.SetFile(FilePath=file_geo) # 导入几何模型文件# 设置分析环境setup_thermal = system_thermal.GetContainer(ComponentName="Setup") # 获取分析设置容器setup_thermal.Edit(Interactive=not is_background) # 根据后台标志决定是后台交互还是前台交互# 构建并执行Mechanical脚本命令command = 'WB.AppletList.Applet("DSApplet").App.Script.doToolsRunMacro("%s")' % file_scriptsetup_thermal.SendCommand(Command=command) # 在Mechanical环境中执行外部Python脚本# 完成设置并保存setup_thermal.Exit() # 退出设置编辑器界面Save(Overwrite=True) # 保存项目文件(覆盖现有文件)


