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 删除,避免模型树中残留无用草图。回放时若重复执行,这一步能防止同名草图冲突。

三、从录制脚本到参数化函数

录制脚本最大的问题是“写死”:尺寸、名称、坐标全部固定。参数化的目标是把这些可变项提取为函数参数,使同一段逻辑能生成不同规格的模型。改造原则有三条:

  1. 把几何尺寸、坐标、名称等字面量替换为形参;
  2. 在函数开头做必要的清理(如删除同名部件),保证可重复执行;
  3. 把 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) 动态计算,避免草图平面过小导致几何超出边界。

宏录制 → 代码分析 → 参数化回放 CAE GUI 操作 Create Part Sketch rectangle BaseSolidExtrude 输入尺寸 / 确认 (录制期间避免视图旋转) 录制 abaqusMacros.py def makePlate(): ConstrainedSketch(...) rectangle(point1, point2) BaseSolidExtrude(depth=5) 硬编码:100, 60, 5, 'Plate' 分析 参数化函数 def makePlate(L, W, T, partName, modelName) if partName in m.parts: del ... rectangle((0,0), (L,W)) BaseSolidExtrude(depth=T) 可重复执行 · 多规格复用 回放调用 makePlate(100, 60, 5, 'PlateA') makePlate(200, 80, 8, 'PlateB') makePlate(150, 50, 3, 'PlateC') 同一函数 → 不同几何 调用 结果验证 模型树出现 PlateA/B/C 尺寸与参数一致 无残留 __profile__ 草图 重复执行不报错

四、回放的三种方式与常见问题

参数化函数写好后,回放有三种途径:

  • 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正确性”,又获得了手写代码的简洁与可复用性。

需要强调的是,录制得到的代码是“操作的回声”,不是“设计的表达”。真正的二次开发能力,体现在能否从录制结果中识别出哪些是本质建模逻辑、哪些是界面副作用,并把前者提炼为带参数的、可组合的函数。做到这一点,脚本录制才真正成为二次开发的加速器,而不是一堆只能跑一次的“死代码”。