4. 脚本录制与回放
在Abaqus/CAE中,几乎每一次鼠标点击、每一个对话框确认,最终都会落到内核命令上。宏录制(Macro Recording)正是把这层“内核命令”暴露出来的最直接手段:它把GUI操作翻译成Python语句,保存为 abaqusMacros.py 中的函数。掌握录制与回放,是二次开发从“手写API”转向“从已有操作反推代码”的关键一步。
一、宏录制的工作机制
宏录制并不是“录屏”,它记录的是CAE在响应GUI操作时向内核发送的命令。当你在模型树中点击“Create Part”、在视口里拉伸草图、在对话框里输入尺寸并点击OK,CAE内部依次调用 mdb.models['Model-1'].Part(...)、ConstrainedSketch、sketch.Line(...)、s.BaseSolidExtrude(...) 等内核函数。宏录制器把这些调用按顺序写入文件,因此录制得到的代码天然就是可执行的Python脚本。
启动方式:菜单 File → Macro Manager,在对话框中点击 Create,输入宏名称(例如 makePlate),选择保存位置(默认写入工作目录下的 abaqusMacros.py),点击 Continue 后录制开始。此时CAE界面右上角会出现红色录制指示。完成操作后回到 Macro Manager 点击 Stop Recording。录制期间应避免无关的视图旋转、缩放等操作,否则这些也会被写入脚本,造成回放时视口跳动。
abaqusMacros.py。若该文件已存在,新宏会以追加方式写入,因此多次录制后文件会包含多个函数,回放时按函数名调用即可。二、录制代码的结构分析
下面是一段典型的录制结果(示例,参数为教学假设值):
# -*- coding: mbcs -*-
from abaqus import *
from abaqusConstants import *
from caeModules import *
def makePlate():
"""Create a 100x60x5 plate."""
mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=200.0)
mdb.models['Model-1'].sketches['__profile__'].rectangle(
point1=(0.0, 0.0), point2=(100.0, 60.0))
mdb.models['Model-1'].Part(dimensionality=THREE_D,
type=DEFORMABLE_BODY, name='Plate')
mdb.models['Model-1'].parts['Plate'].BaseSolidExtrude(
sketch=mdb.models['Model-1'].sketches['__profile__'],
depth=5.0)
del mdb.models['Model-1'].sketches['__profile__']
逐层拆解这段代码,可以看到录制脚本的固定骨架:
- 导入区:
from abaqus import *提供mdb、session等全局对象;from abaqusConstants import *提供THREE_D、DEFORMABLE_BODY等枚举常量;from caeModules import *加载各模块的扩展方法。这三行是回放脚本能独立运行的前提。 - 函数封装:录制内容被包在
def makePlate():中,函数名即宏名。回放时只需makePlate()即可重放全部操作。 - 对象路径:所有操作都通过
mdb.models['Model-1']逐级定位。模型名、部件名、草图名都是硬编码字符串,这正是参数化改造的切入点。 - 临时对象清理:草图
__profile__在拉伸完成后被del删除,避免模型树中残留无用草图。回放时若重复执行,这一步能防止同名草图冲突。
三、从录制脚本到参数化函数
录制脚本最大的问题是“写死”:尺寸、名称、坐标全部固定。参数化的目标是把这些可变项提取为函数参数,使同一段逻辑能生成不同规格的模型。改造原则有三条:
- 把几何尺寸、坐标、名称等字面量替换为形参;
- 在函数开头做必要的清理(如删除同名部件),保证可重复执行;
- 把
mdb.models['Model-1']中的模型名也参数化,便于在多模型场景下复用。
改造后的版本:
def makePlate(L=100.0, W=60.0, T=5.0,
partName='Plate', modelName='Model-1'):
m = mdb.models[modelName]
if partName in m.parts.keys():
del m.parts[partName]
m.ConstrainedSketch(name='__profile__', sheetSize=2*max(L, W))
m.sketches['__profile__'].rectangle(
point1=(0.0, 0.0), point2=(L, W))
m.Part(dimensionality=THREE_D, type=DEFORMABLE_BODY,
name=partName)
m.parts[partName].BaseSolidExtrude(
sketch=m.sketches['__profile__'], depth=T)
del m.sketches['__profile__']
此时调用 makePlate(200, 80, 8, 'PlateB') 就能生成一块200×80×8的板,而无需重新录制。注意 sheetSize 用 2*max(L,W) 动态计算,避免草图平面过小导致几何超出边界。
四、回放的三种方式与常见问题
参数化函数写好后,回放有三种途径:
- Macro Manager 回放:在对话框中选中宏,点击
Play,CAE会执行对应函数。适合快速验证录制结果。 - File → Run Script:直接运行一个
.py文件。文件末尾需显式调用函数,例如makePlate(200, 80, 8, 'PlateB'),否则只定义不执行。 - 命令行回放:
abaqus cae script=make_plate.py,适合批处理与自动化建模。
回放中最常见的三类问题及处理:
| 现象 | 原因 | 处理 |
|---|---|---|
报错 NameError: name 'THREE_D' is not defined | 缺少 from abaqusConstants import * | 补齐导入语句 |
报错 KeyError: 'Plate' 或部件已存在 | 重复回放时同名部件冲突 | 函数开头判断并删除同名部件 |
| 草图尺寸超出平面边界 | sheetSize 小于几何尺寸 | 用 2*max(L,W) 动态设置 |
session.viewports['Viewport: 1'].view.fitView() 等视图命令在批处理模式下可能因无图形界面而报错。参数化时应删除或注释掉纯视图操作,只保留建模内核命令。五、录制与手写的配合策略
宏录制适合“不知道API怎么写”的场景:先在GUI里做一遍,看CAE生成了什么代码,再照着改。但录制代码往往冗长、含冗余视图操作、命名不通用,因此推荐的工作流是:录制 → 阅读 → 删减 → 参数化 → 封装为模块。把常用建模动作(建板、开孔、倒角、赋材料、划网格)分别录制成独立函数,统一放入一个 modeling_lib.py,后续脚本通过 import modeling_lib 调用。这样既保留了录制带来的“API正确性”,又获得了手写代码的简洁与可复用性。
需要强调的是,录制得到的代码是“操作的回声”,不是“设计的表达”。真正的二次开发能力,体现在能否从录制结果中识别出哪些是本质建模逻辑、哪些是界面副作用,并把前者提炼为带参数的、可组合的函数。做到这一点,脚本录制才真正成为二次开发的加速器,而不是一堆只能跑一次的“死代码”。