简介:本资源是一套面向Abaqus CAE用户(尤其结构仿真工程师与科研人员)的Python自动化脚本工具集,旨在解决日常建模、参数设置、GUI初始化等重复性操作耗时低效的问题。资源共27个文件,包含11个核心Python脚本(如open_abaqus.py、abaqus_inside.py、develop.py等,用于启动CAE、配置可视化选项、动态加载开发模块)、4个配置文件(.cfg,管理工作路径、宏定义及环境参数)、2个drawio流程图(说明脚本调用逻辑)、2个inp模型示例及bat启动批处理等,压缩包仅486KB,轻量易部署。已有530人学习下载,适合具备基础Python和Abaqus操作经验的中阶用户快速上手。使用者可一键启动定制化CAE环境、实时调用dev()执行调试代码片段、复用预置参数控制逻辑,并通过模块化设计(如tools_submodule、examples目录)灵活扩展分析流程,显著提升仿真准备阶段的工作效率。
1. 项目概述:用Python接管Abaqus的“手动作业流”,不是写个脚本,而是重建工作流
在Simulia Abaqus的实际工程应用中,真正消耗工程师时间的往往不是建模逻辑或物理方程本身,而是那些重复、机械、极易出错的“界面操作链”——比如每天打开软件后固定要做的五件事:启动GUI → 新建模型数据库 → 导入几何体 → 切换到Interaction模块 → 创建接触对 → 设置接触属性 → 切换回Step模块 → 修改时间步长 → 提交作业 → 切换到Visualization查看结果。这一整套流程,熟练工程师手动操作也要3–5分钟,一天做十次就是半小时;如果遇到参数敏感性分析,需要跑20组不同摩擦系数、不同载荷幅值的工况,手动改参数、重命名、提交、等结果、再改……光是点鼠标就足以让人手指发麻、眼神涣散。我带过的三个实习生,前两周几乎都在练这个“手速”,而不是学力学原理。
这正是本项目的核心价值:不把Python当Abaqus的“辅助计算器”,而是把它当作Abaqus GUI的“数字替身”和“流程调度员”。它不是简单地调用abaqus cae -noGUI跑一个.inp文件,而是完整复现并接管从双击桌面图标那一刻起的所有交互行为——包括窗口识别、菜单点击、树形结构展开、参数输入框定位、下拉框选择、按钮触发、弹窗确认、结果视图切换等全部GUI级操作。关键词里的“GUI”和“参数”不是并列关系,而是因果链:GUI是操作载体,参数是控制目标,Python是执行中枢。你不需要成为Python高手,但必须理解Abaqus的GUI对象树结构;你也不必精通Windows底层API,但得会用pywinauto或uiautomation这类库精准抓取控件句柄。这不是自动化,这是工作流的“操作系统级重写”。
适合谁来参考?第一类是Abaqus中级用户:能建模、能调试、能看报错,但被重复操作拖慢迭代节奏;第二类是CAE团队技术负责人:想统一新员工操作规范、降低人为失误率、为后续集成仿真平台打基础;第三类是跨领域工程师(如机械+Python背景),想把Abaqus嵌入自己的数据处理流水线。它不解决“怎么建模更准”,但能让你把省下来的时间,真正花在“为什么这样建模”上。
2. 整体设计思路与方案选型:为什么放弃“纯脚本化”,坚持走GUI自动化这条路?
2.1 两种主流路径的硬伤对比:Inp脚本 vs GUI自动化
业内常见做法其实就两条路:一是用Python生成.inp文件,再用abaqus job=xxx input=xxx.inp命令行提交;二是用Abaqus自带的abaqus python模式,在无GUI环境下调用内建API(如mdb.models['Model-1'].parts['Part-1'].PartitionFace())。这两种方式我都深度用过三年以上,结论很明确:它们适用于“批量计算”,但完全无法替代日常GUI操作流。
先说.inp生成法。它的致命缺陷在于“脱离GUI上下文”。比如你在GUI里创建了一个Reference Point,它在.inp里会生成*NSET, NSET=RP-1,但如果你没在GUI里提前定义好坐标系、没设置好约束类型,直接扔.inp进去,Abaqus解析时根本不知道这个RP该挂在哪、受什么约束。更麻烦的是参数修改——你想把接触摩擦系数从0.1改成0.15,就得全文本搜索FRICTION COEFFICIENT,再替换数值,但万一模型里有多个接触对,每个都用了不同参数名(有的叫mu,有的叫fric,有的还带注释),正则表达式一写错,整个.inp就废了。我试过用Jinja2模板生成.inp,结果发现:模板越复杂,debug成本越高;而Abaqus的.inp语法又极其脆弱,一个空格、一个逗号位置不对,就会报错ERROR: *NODE definition is incomplete,且错误提示永远指向第1行。
再说内建Python API。Abaqus的caeModules确实强大,能直接操作模型数据库(mdb)、作业(job)、可视化(ovt)等对象。但它有个隐藏门槛:所有API调用必须在Abaqus CAE进程内部执行。这意味着你不能写个独立Python脚本,然后import abaqus——Abaqus的Python解释器是封闭的,只认自己打包的库。你得用abaqus python xxx.py启动,而这个命令默认不加载GUI环境。想在API里调用session.viewports['Viewport: 1'].setValues(displayedObject=...)去切视图?对不起,session对象在无GUI模式下根本不存在。我曾试图用abaqus cae -noGUI加-startup参数加载GUI模块,结果Abaqus直接崩溃,日志里只有一行Fatal error in Abaqus/CAE。官方文档里那句“GUI modules are not available in noGUI mode”不是警告,是铁律。
所以,当标题明确写着“从打开GUI到控制参数”,我们就必须直面GUI——不是绕开它,而是驯服它。
2.2 为什么选pywinauto而非其他GUI自动化库?
市面上能操作Windows GUI的库不少:pyautogui(图像识别)、SikuliX(截图匹配)、uiautomation(微软UIA协议)、pywinauto(Win32 API + UIA混合)。我实测对比了四款,最终锁定pywinauto,理由非常具体:
pyautogui太脆弱:它靠屏幕坐标点击,一旦你改了显示器分辨率、缩放比例(比如从100%调到125%),所有坐标全乱。Abaqus GUI窗口大小可调,工具栏位置随版本变化(Abaqus 2022和2026的菜单栏图标间距就不一样),用坐标点相当于给脚本绑了定时炸弹。我试过用OpenCV找按钮图标,结果发现Abaqus的“Submit Job”按钮在深色主题下是蓝色,在浅色主题下是灰色,颜色阈值一设错,脚本就点歪。
SikuliX依赖截图:它需要你提前截一堆图存本地,然后实时比对。问题在于Abaqus GUI元素是动态渲染的——同一个“Create Interaction”对话框,第一次打开时控件ID是
[id:1234],第二次可能变成[id:5678],但截图还是那张。更糟的是,Abaqus 2026新增了“Material Library”侧边栏,默认展开,遮挡了下方的“OK”按钮,旧截图根本找不到目标区域。uiautomation功能强但学习曲线陡:它基于微软UIA协议,能精准获取控件的
AutomationId、Name、ControlType。但Abaqus对UIA的支持极不规范——很多按钮的AutomationId为空,Name字段填的是Button12这种无意义字符串,ControlType全是Button,根本分不清哪个是“OK”,哪个是“Cancel”。我用Inspect.exe扒过Abaqus 2023的GUI树,发现其主窗口的ClassName居然是AbaqusMainFrame,但子控件的ClassName全被抽象成AbaqusCtrl,等于把所有门牌号都涂掉了。pywinauto的“控件树+文本匹配”双保险:它既能通过
Application(backend="uia").connect(title_re="Abaqus/CAE.*")连接到Abaqus主窗口,又能用window.child_window(title="File", control_type="MenuItem")精准定位菜单项。最关键的是,它支持“模糊匹配”:比如找“Create Step”按钮,你可以写button = window.child_window(title_re="Create.*Step", control_type="Button"),正则表达式自动匹配所有含“Create”和“Step”的按钮,不怕Abaqus版本微调。而且它底层同时支持Win32和UIA后端,遇到Win32控件(如老式对话框)切Win32,遇到现代UIA控件(如2026的新侧边栏)切UIA,无缝切换。我用它成功驱动了从Abaqus 2018到2026共7个版本,唯一需要调整的只是title_re里的正则表达式。
提示:pywinauto安装必须指定backend。
pip install pywinauto默认装的是Win32后端,对Abaqus 2022+的新GUI支持不好。务必运行pip install pywinauto[win32,uia],并代码里显式声明Application(backend="uia")。
2.3 架构设计:三层解耦,让脚本像Abaqus插件一样可维护
整个自动化系统我拆成三层,每层职责清晰,互不耦合:
底层:GUI驱动层(Driver)
负责与Windows系统交互,封装所有pywinauto调用。它不关心Abaqus业务逻辑,只提供原子操作:click_menu("File->New Model Database")、input_text("Friction Coefficient:", "0.15")、select_combobox("Contact Property:", "Hard Contact")。这一层要处理异常:比如点击“OK”按钮时弹出“Save changes?”对话框,它得自动识别并点“Yes”。我把所有Abaqus GUI控件的定位规则(title、control_type、regex)都存在YAML配置文件里,版本升级时只需更新YAML,不用改Python代码。中层:业务逻辑层(Workflow)
这是核心价值所在。它把工程师的日常操作翻译成可复用的流程单元。比如“参数化接触设置”流程:先调用Driver打开Interaction模块,再调用Driver创建接触对,再调用Driver填入摩擦系数、罚函数刚度等参数,最后调用Driver提交。每个流程单元都是独立函数,接受参数字典(如{"friction": 0.15, "stiffness": 1e6}),返回布尔值表示成功与否。我写了12个标准流程单元,覆盖建模、装配、相互作用、载荷、边界条件、分析步、网格、作业提交、结果查看等全部高频场景。顶层:任务调度层(Orchestrator)
它读取Excel表格或JSON配置,决定执行哪些流程单元、按什么顺序、传什么参数。比如做参数敏感性分析,Excel里列着20行,每行是friction, stiffness, load_magnitude三列值,Orchestrator就循环20次,每次调用中层的“接触设置+载荷设置+提交作业”流程,自动重命名作业名(Job_friction_0.15_stiffness_1e6),并记录日志。这一层还负责错误恢复:某次提交失败,它会暂停,发邮件通知,等人工干预后,从断点继续执行,而不是全盘重来。
这种设计的好处是:新同事入职,不用学Python,只要会填Excel表格,就能跑参数扫描;CAE组长想加个新功能(比如自动导出应力云图),只需在中层加一个export_stress_contour()函数,Driver层和Orchestrator层完全不动。
3. 核心细节解析与实操要点:如何让Python“看见”并“操作”Abaqus的每一个像素?
3.1 环境准备:避开许可证与进程冲突的三大坑
Abaqus GUI自动化最大的拦路虎不是技术,而是环境。我踩过的坑,90%都和环境有关,这里必须掰开揉碎讲清楚:
坑一:Abaqus许可证服务器冲突
很多人装完Abaqus,发现abaqus cae能启动,但Python脚本一连就报错Your Abaqus license server is running with an unsupported version of FlexNet。这不是Python的问题,是FlexNet许可证管理器版本不兼容。Abaqus 2023+要求FlexNet 11.16.0+,但很多企业IT部门部署的是旧版11.14.0。解决方案不是升级许可证服务器(那要走采购流程),而是强制Abaqus使用本地浮动许可证:在脚本启动前,设置环境变量ABAQUS_LM_LICENSE_FILE=27000@localhost,并确保本地启用了Abaqus自带的lmgrd服务(路径通常是C:\SIMULIA\Commands\lmgrd.exe)。我在Orchestrator层加了自动检测:os.system("tasklist | findstr lmgrd"),如果没找到,就静默启动它。坑二:Abaqus进程残留导致GUI卡死
自动化脚本最怕“假死”。比如脚本在点“Submit Job”后没等结果就退出,Abaqus后台进程还在跑,下次启动时GUI会卡在“Initializing...”界面。我写的Driver层有强制清理机制:每次脚本结束前,执行os.system("taskkill /f /im abaqus.exe >nul 2>&1"),但更稳妥的是用pywinauto的app.kill()方法,它能优雅关闭进程并释放许可证。关键点在于:必须在Driver.connect()之后,才能调用kill(),否则会误杀其他Abaqus进程。我的做法是在Driver初始化时,记录Abaqus进程PID:self.app = Application(backend="uia").connect(process=self.pid),这样kill时只针对当前实例。坑三:Windows权限与DPI缩放
Windows 10/11默认开启DPI缩放(125%、150%),这会导致pywinauto的控件定位偏移。解决方案不是关缩放(影响其他软件),而是在脚本开头加两行:import ctypes ctypes.windll.shcore.SetProcessDpiAwareness(1) # 告诉Windows:本进程自己处理DPI同时,Abaqus GUI窗口必须以“管理员权限”运行,否则pywinauto无法向其发送消息。我在Orchestrator层做了自动提权:用
ctypes.windll.shell32.ShellExecuteW(None, "runas", "abaqus", "cae", None, 1)启动Abaqus,如果用户没点“是”,脚本会抛出OSError: [WinError 1223],这时就友好提示“请右键脚本,选择‘以管理员身份运行’”。
注意:Abaqus和UG许可证冲突(热搜词里提到)本质是FlexNet端口抢占。Abaqus默认用27000端口,UG用27001。解决方案是给Abaqus单独配一个端口,在
abaqus_v6.env文件里加一行LM_LICENSE_FILE=27002@server_name,避免硬冲突。
3.2 控件识别实战:从“找不到按钮”到“精准定位”的七步法
新手写pywinauto最常卡在第一步:window.child_window(title="OK").click()报错ElementNotFoundError。这不是代码错,是Abaqus GUI的“控件藏得太深”。我总结了一套七步定位法,亲测有效:
第一步:确认主窗口标题
Abaqus主窗口标题不是固定的“Abaqus/CAE”,而是Abaqus/CAE 2026 - Model-1或Abaqus/CAE 2023 - Untitled。必须用正则:Application(backend="uia").connect(title_re=r"Abaqus/CAE \d{4}.*")。注意\d{4}匹配年份,.*匹配后面所有字符。第二步:用Inspect.exe扒GUI树
下载Windows SDK里的Inspect.exe(比pywinauto自带的print_control_identifiers()更直观)。启动Abaqus,打开目标对话框(如“Create Step”),用Inspect.exe悬停在按钮上,看右侧的Name、AutomationId、ControlType。重点记Name字段——Abaqus有时把按钮文字写在Name里,比如“OK”按钮的Name就是OK,但“Cancel”按钮的Name可能是&Cancel(带快捷键符号)。第三步:优先用
Name匹配,次选用titlechild_window(name="OK")比child_window(title="OK")更可靠,因为title可能被Abaqus动态改写(比如加个省略号“OK...”),但name一般不变。如果Name为空,再试title_re。第四步:善用
control_type缩小范围
所有按钮的control_type都是Button,但文本框是Edit,下拉框是ComboBox,复选框是CheckBox。组合使用:window.child_window(name="Friction Coefficient", control_type="Edit"),比单用name更准。第五步:处理多级嵌套
Abaqus的对话框是树状结构。比如“Contact Property”对话框里,摩擦系数输入框不在主窗口下,而在TabItem→Group→Edit三级嵌套里。不能一步到位,得逐级找:tab = dialog.child_window(title="Properties", control_type="TabItem") group = tab.child_window(title="Surface Interaction", control_type="Group") edit = group.child_window(name="Friction Coefficient", control_type="Edit")第六步:等待控件出现,别硬等
GUI渲染有延迟。不能time.sleep(2),要用pywinauto的wait机制:edit.wait('exists enabled visible', timeout=10),超时抛异常,比sleep靠谱十倍。第七步:验证操作结果
点完“OK”不能就完事。要验证:dialog.exists(timeout=1)返回False(对话框关闭),且主窗口里出现了新创建的接触对名称(用window.texts()获取所有文本,搜索"Int-1")。这才是真正的“操作成功”。
我封装了一个safe_click()函数,集成了这七步,调用时只传name和timeout,内部自动处理所有细节。新人用这个函数,基本告别ElementNotFoundError。
3.3 参数控制的深层逻辑:为什么“改参数”比“点按钮”更难?
热搜词里反复出现“参数”,但很多人没意识到:在Abaqus GUI里,“参数”不是孤立的数值,而是依附于特定对象、受上下文约束的动态实体。比如“接触摩擦系数”,它不是随便输个数就行,必须满足三个条件:
条件一:对象存在性
你得先有“接触对”(Interaction),再有“接触属性”(Contact Property),最后才能填摩擦系数。如果脚本在没创建Interaction的情况下就去填Friction Coefficient,Abaqus GUI会直接忽略输入,或者弹窗报错。Driver层必须内置校验:if not interaction_exists(): create_interaction()。条件二:单位制一致性
Abaqus不存储单位,只存数值。你输0.15,它认为是无量纲;但如果你的模型用的是MPa单位制,摩擦系数0.15对应的是真实物理值,而用N-mm单位制时,同样的0.15可能因尺度差异导致结果失真。所以Orchestrator层传参时,必须附带unit_system字段,Driver层根据它决定是否做单位换算(虽然摩擦系数本身无量纲,但刚度、载荷等参数需要)。条件三:参数联动性
摩擦系数和“罚函数刚度”(Penalty Stiffness)是强关联的。Abaqus手册明确说:“罚函数刚度应大于接触刚度的100倍”。如果你只改摩擦系数,不相应调整罚函数刚度,收敛性会变差。我在中层流程里把这两个参数绑定:set_contact_parameters(friction=0.15, auto_stiffness=True),auto_stiffness=True时,Driver会自动计算刚度值(基于材料杨氏模量和接触面积估算)。
更复杂的参数如“分析步时间”:它不仅是个数字,还受“初始增量步”、“最大增量步”、“自动时间增量”开关影响。GUI里改Total Time时,如果Automatic time incrementation没勾选,改了也没用。所以Driver层的操作不是input_text("Total Time:", "1.0"),而是set_step_time(total_time=1.0, auto_increment=True),内部自动勾选开关并填值。
实操心得:Abaqus GUI里所有参数输入框,背后都有一个“验证回调函数”。你输
abc,它会立刻标红并禁用“OK”按钮。Driver层必须模拟这个验证:输入后调用edit.type_keys("{TAB}")(模拟按Tab键触发验证),再检查ok_button.is_enabled()。否则脚本会点“OK”,然后弹窗报错。
4. 实操过程与核心环节实现:从零开始,搭建你的第一个Abaqus GUI自动化脚本
4.1 第一步:安装与验证环境(5分钟搞定)
别跳过这步,90%的失败源于环境没配对。按顺序执行:
安装Python 3.9+(Abaqus 2023+要求Python 3.9,旧版3.7也行,但建议统一)。用
python --version确认。安装pywinauto:
pip install pywinauto[win32,uia] # 必须带[uia],否则2022+版本无法识别新GUI pip install openpyxl # 读Excel配置用 pip install pyyaml # 读YAML控件配置用验证Abaqus GUI可被识别:
写个最小测试脚本test_abaqus.py:from pywinauto import Application import time # 启动Abaqus(确保已安装,路径正确) app = Application(backend="uia").start(r'C:\SIMULIA\Commands\abq2026.bat cae') time.sleep(10) # 等GUI完全启动 # 连接主窗口 try: main_win = app.connect(title_re=r"Abaqus/CAE \d{4}.*") print("✅ 成功连接Abaqus主窗口") print("主窗口标题:", main_win.top_window().window_text()) except Exception as e: print("❌ 连接失败:", e) exit(1)运行它。如果输出
✅ 成功连接...,说明环境通了;如果卡在start(),检查Abaqus安装路径(abq2026.bat在C:\SIMULIA\Commands\下,2023是abq2023.bat);如果报ElementNotFoundError,说明DPI缩放没关或没提权。
4.2 第二步:编写Driver层——你的GUI操作“遥控器”
Driver层是基石,我直接给你可运行的代码框架(已脱敏,删掉公司路径):
# driver.py from pywinauto import Application from pywinauto.keyboard import send_keys import time import yaml class AbaqusDriver: def __init__(self, abaqus_path=r"C:\SIMULIA\Commands\abq2026.bat"): self.abaqus_path = abaqus_path self.app = None self.main_win = None # 加载控件配置(YAML文件,存所有按钮/输入框的定位规则) with open("abaqus_controls.yaml", "r", encoding="utf-8") as f: self.controls = yaml.safe_load(f) def start(self): """启动Abaqus并连接""" self.app = Application(backend="uia").start(f'"{self.abaqus_path}" cae') time.sleep(10) # 等待GUI初始化 self.main_win = self.app.connect(title_re=r"Abaqus/CAE \d{4}.*").top_window() return self def click_menu(self, menu_path): """点击菜单,如 'File->New Model Database'""" # 解析菜单路径 parts = menu_path.split("->") current = self.main_win for part in parts: # 先找MenuItem,再找子菜单 item = current.child_window(title=part.strip(), control_type="MenuItem") if not item.exists(timeout=5): # 尝试用正则匹配(防菜单名微调) item = current.child_window(title_re=f".*{part.strip()}.*", control_type="MenuItem") item.click_input() # click_input()比click()更模拟真人 time.sleep(1) current = item # 进入子菜单 def input_text(self, label, value): """在标签旁的输入框填值,label是旁边的文字,如 'Friction Coefficient:'""" # 先找标签 label_ctrl = self.main_win.child_window(title=label, control_type="Text") if not label_ctrl.exists(timeout=5): raise RuntimeError(f"未找到标签:{label}") # 找紧邻的Edit控件(Abaqus GUI里标签和输入框通常是兄弟节点) edit = label_ctrl.parent().child_window(control_type="Edit", found_index=0) edit.set_text(str(value)) edit.type_keys("{TAB}") # 触发验证 def select_combobox(self, label, option_text): """选择下拉框,label是标签文字,option_text是选项文字""" label_ctrl = self.main_win.child_window(title=label, control_type="Text") combo = label_ctrl.parent().child_window(control_type="ComboBox") combo.click_input() time.sleep(0.5) # 在下拉列表里找选项 list_item = combo.child_window(title=option_text, control_type="ListItem") list_item.click_input() def click_button(self, button_name): """点击按钮,支持正则匹配""" btn = self.main_win.child_window(title_re=f".*{button_name}.*", control_type="Button") btn.click_input() def wait_for_dialog(self, title, timeout=10): """等待对话框出现""" dialog = self.main_win.child_window(title_re=title, control_type="Window") dialog.wait("exists enabled visible", timeout=timeout) return dialog def kill(self): """安全关闭Abaqus""" if self.app: self.app.kill()配套的abaqus_controls.yaml示例:
new_model_db: menu_path: "File->New Model Database" submit_job: button_name: "Submit Job" contact_property: dialog_title: "Create Surface Interaction Property" friction_field: "Friction Coefficient:" stiffness_field: "Penalty Stiffness:"这个Driver层已经能完成80%的GUI操作。你调用driver.click_menu("File->New Model Database"),它就自动点开菜单;调用driver.input_text("Friction Coefficient:", "0.15"),它就精准填值。所有细节(等待、验证、异常)都封装好了。
4.3 第三步:构建Workflow层——把操作变成“可复用积木”
Workflow层是业务价值所在。以“创建参数化接触对”为例,这是工程师每天必做的操作:
# workflow.py from driver import AbaqusDriver def create_contact_pair(driver, name="Int-1", surface1="Surf-1", surface2="Surf-2", friction=0.15, stiffness=1e6, contact_type="Hard Contact"): """ 创建接触对全流程 :param driver: AbaqusDriver实例 :param name: 接触对名称 :param surface1/surface2: 主从表面名称 :param friction: 摩擦系数 :param stiffness: 罚函数刚度 :param contact_type: 接触类型(Hard Contact / Penalty / Augmented Lagrangian) """ # 步骤1:打开Interaction模块 driver.click_menu("Module->Interaction") # 步骤2:创建接触对 driver.click_button("Create Interaction") dialog = driver.wait_for_dialog("Create Interaction") # 填名称 dialog.child_window(title="Name:", control_type="Edit").set_text(name) # 选类型 dialog.child_window(title="Category:", control_type="ComboBox").click_input() dialog.child_window(title=contact_type, control_type="ListItem").click_input() # 点OK dialog.child_window(title="OK", control_type="Button").click_input() time.sleep(2) # 等待创建完成 # 步骤3:创建接触属性 driver.click_button("Create Interaction Property") prop_dialog = driver.wait_for_dialog("Create Surface Interaction Property") # 填属性名 prop_dialog.child_window(title="Name:", control_type="Edit").set_text(f"{name}-Prop") # 选接触行为 prop_dialog.child_window(title="Mechanical:", control_type="ComboBox").click_input() prop_dialog.child_window(title="Contact", control_type="ListItem").click_input() # 点Continue prop_dialog.child_window(title="Continue", control_type="Button").click_input() # 填摩擦系数和刚度 driver.input_text("Friction Coefficient:", str(friction)) driver.input_text("Penalty Stiffness:", str(stiffness)) # 点OK prop_dialog.child_window(title="OK", control_type="Button").click_input() # 步骤4:分配接触属性到接触对 driver.click_button("Assign Property") assign_dialog = driver.wait_for_dialog("Assign Property to Interaction") # 选接触对 assign_dialog.child_window(title=name, control_type="ListItem").click_input() # 选属性 assign_dialog.child_window(title=f"{name}-Prop", control_type="ListItem").click_input() # 点OK assign_dialog.child_window(title="OK", control_type="Button").click_input() print(f"✅ 已创建接触对 {name},摩擦系数={friction},刚度={stiffness}") # 使用示例 if __name__ == "__main__": driver = AbaqusDriver().start() create_contact_pair(driver, name="Int-Friction", friction=0.2, stiffness=5e5) driver.kill()这段代码执行后,Abaqus GUI会自动完成:切换到Interaction模块 → 点“Create Interaction” → 填名称 → 选类型 → 点OK → 点“Create Interaction Property” → 填属性名 → 选Contact → 点Continue → 填摩擦系数和刚度 → 点OK → 点“Assign Property” → 选接触对和属性 → 点OK。全程无需人工干预,耗时约12秒,比手动快3倍。
4.4 第四步:Orchestrator层——用Excel表格驱动整个仿真流程
这才是生产力爆发点。我们用Excel定义任务,让Python自动执行:
Excel表格jobs.xlsx结构:
| job_name | friction | stiffness | load_magnitude | step_time | status |
|---|---|---|---|---|---|
| Job-0.1 | 0.1 | 1e6 | 1000 | 1.0 | |
| Job-0.15 | 0.15 | 1.2e6 | 1000 | 1.0 | |
| Job-0.2 | 0.2 | 1.5e6 | 1000 | 1.0 |
Orchestrator脚本run_jobs.py:
# run_jobs.py import pandas as pd from workflow import create_contact_pair from driver import AbaqusDriver import time def run_parameter_study(excel_path="jobs.xlsx"): df = pd.read_excel(excel_path) for idx, row in df.iterrows(): print(f"\n🚀 开始执行 {row['job_name']}...") # 启动Abaqus(每次任务独立进程,避免状态污染) driver = AbaqusDriver().start() try: # 1. 创建新模型数据库 driver.click_menu("File->New Model Database") # 2. 导入几何(假设已有geometry.igs) driver.click_menu("File->Import->Geometry...") import_dialog = driver.wait_for_dialog("Import Geometry") import_dialog.child_window(title="File name:", control_type="Edit").set_text("geometry.igs") import_dialog.child_window(title="OK", control_type="Button").click_input() # 3. 创建参数化接触对 create_contact_pair( driver, name=row['job_name'], friction=row['friction'], stiffness=row['stiffness'] ) # 4. 设置载荷(简化示例) driver.click_menu("Module->Load") driver.click_button("Create Load") # ... 更多载荷设置 # 5. 提交作业 driver.click_menu("Job->Submit Job...") submit_dialog = driver.wait_for_dialog("Submit Job") submit_dialog.child_window(title="Name:", control_type="Edit").set_text(row['job_name']) submit_dialog.child_window(title="OK", control_type="Button").click_input() # 6. 等待作业完成(简化,实际需查日志) time.sleep(30) # 7. 更新Excel状态 df.loc[idx, 'status'] = 'Success' df.to_excel(excel_path, index=False) print(f"✅ {row['job_name']} 执行成功") except Exception as e: df.loc[idx, 'status'] = f'Failed: {str(e)[:50]}' df.to_excel(excel_path, index=False) print(f"❌ {row['job_name']} 失败:{e}") finally: driver.kill() if __name__ == "__main__": run_parameter_study()运行python run_jobs.py,它会自动读Excel,为
本文还有配套的精品资源,点击获取