前言
Python是Abaqus内置的内核脚本语言,通过脚本化建模和后处理能减少很多重复的工作。
网上关于使用Python进行Abaqus二次开发的中文教程很少,主要学习途径包括:
- Abaqus官方文档(以下简称文档)
- 《Abaqus二次开发手册》(以下简称手册)
- abqpy 库(为代码提供类型注解和函数注释)
- 自行通过Abaqus宏录制功能和解释器窗口摸索
推荐从手册第四章开始阅读学习,期间多动手在Abaqus里调试探索 如果有更新的书就用更新的吧,这本手册前三章很多内容没有学习价值。文档和abqpy库可以作为学习中的参考资料。
abaqusMacros.py文件就能实时查看了由于Abaqus在2024版本将Python版本由2.7提升到了3.10.5,本文代码全程基于Abaqus2024版本 没人2025年了还想用Python2写代码吧==
本文不重复文档和手册已经详细介绍的内容,仅针对自己学习中遇到的问题进行扩展。阅读本文需要的前置知识:
- 已完成手册第四章略读
- 有Python基础
- 熟练Abaqus基本操作
部件及其实例
Abaqus目前提供了完整的前处理功能,从建模到划分网格都能在cae中完成。所以,Part和PartInstance对象下会引用到相当多的数据信息,包括几何,特征历史,集,网格,截面分配等。以下内容关于Part和PartInstance类组合的子对象及方法。
几何对象序列
初次接触Python二次开发遇到最大的问题莫过于如何选取自己需要的几何对象,这也是脚本操作相较于GUI操作最大的难点之一。两种直接从几何对象序列获取部分对象的方法:索引(切片)和掩码(单个索引返回的是一个几何对象,而切片、掩码返回Sequence对象),在手册里和其他地方都不推荐使用,因为目标对象的索引或掩码几乎只能从录制脚本过程中获取,而且当有新的特征生成时,索引和掩码一般会发生变化。
由手册可知,几何对象序列分为Array和Sequence,前者实际上还针对不同种类的几何对象细分(以下通称为Array类),一般直接被Part或PartInstance对象引用;后者通过Array对象切片或掩码得到。后者包含了前者的所有方法。 所以为什么要做区分啊!

FaceArray类的继承链
Sequence类的继承链所以要在脚本中从几何对象序列中获取目标对象,一般都是使用序列对象自带的选取方法,比如最基础的findAt(),作用是寻找与点球有交集的几何对象。 真的很难用啊必须要避开多个对象重合的点…但是又不得不用它
Sequence对象中调用findAt()并不会只从该Sequence对象内查找几何对象,而是始终从其所属的Part或PartInstance对象引用的所有该类几何对象(也就是那个Array对象)中查找。此外还有getBy...()的一系列方法,可以通过长方体、圆柱体、球体框选对象。要理解这几个方法的作用首先要知道序列对象还有另一个方法:getBoundingBox(),如字面意思,返回的是空间中能包含序列里所有几何对象的立方体(包围盒)的坐标信息(是一个字典,具体看文档吧)。但困惑的是单个几何对象没有这个方法…总之我理解为每个序列都有自己的包围盒,而序列对象的getBy...()一系列方法就是返回包围盒最大且被包围在指定空间内里的子序列。
就getByBoundingBox()方法而言,其六个参数都是可选的,我测试后认为某个参数如果不传入值,效果相当于这个参数的值为无穷。
getByBoundingBox(zMin=0.0, zMax=0.0)获取的是位于xy平面内的几何对象序列。findAt()方法根据输入的参数返回单个几何对象或Sequence对象,但getBy...()这系列方法返回的一定是Sequence对象。 文档里提到getBy...()返回的是Array对象但我验证后确实是Sequence对象…虽然目前看起来它们确实没区别但是描述不到位很让我抓狂区域类
手册里这部分的概念讲得稍微有些模糊。区域类包括Region,Set,Surface三种类。
Region其实就是GUI里手动选择几何对象场景(如设置边界条件选择的对象)时临时创建的一个集合,这个集合在哪里创建就只能在哪里查看。在脚本里使用Region对象基本也是临时创建即用即弃。
Set对应的是树状图里的“集”。Surface对应的是树状图里的“表面”。前者可以储存所有几何对象序列、单元和单元节点。后者可以储存带方向信息的边,面和单元表面。 带方向信息的面就是相互作用模块时除了选面还要确定法向方向的那种吧…用得不多还不太了解,以后再补充
Set对象使用print()输出如下:

不要误以为它是一个字典!这里所有的“键”其实都是Set对象的属性。
Set对象可以随时创建,随时查看和修改。Part对象和Assembly对象都有独立的sets仓库(在GUI里的树状图可以看到,部件和装配里都有“集”,也就是sets仓库),通过哪个对象的Set()方法创建的集就储存在哪个对象的库中。
Region对象和Set对象基本在任何场景都可以替代使用,区别就是Region对象是一个临时对象,而Set对象会一直储存在sets仓库里(和GUI里的临时选择区域或者选择创建好的集是一样的)。
值得注意的是,虽然GUI里树状图内的实例没有“集”,但其实每个实例都继承了其Part对象的sets。所以在Part对象下创建好Set对象,将其装配后依然可以从实例获取它,从而避免重复创建相同的集。这点在GUI里也可以看出来。
# 在Part对象中获取底面并创建集
bottom_faces = part.faces.getByBoundingBox(zMin=0.0, zMax=0.0)
bottom_set = part.Set(name='BottomFace', faces=bottom_faces)
# 获取装配和实例对象
asm = mdb.models[modelname].rootAssembly
inst = asm.Instance(name=partname, part=part, dependent=ON)
# 施加对称边界条件,集合从PartInstance对象里选择
mdb.models[modelname].ZsymmBC(name='fix-bottom', createStepName='Initial',
region=inst.sets['BottomFace'], localCsys=None)
# 像这样从Part对象里选择集是错误的!
mdb.models[modelname].ZsymmBC(name='fix-bottom', createStepName='Initial',
region=bottom_set, localCsys=None)
PartInstance对象继承的集合,无论实例是否独立集的另外一个作用是“保存”即将被拆分的几何对象,这里保存的意思并不是指保留原几何对象,而是指自动更新为拆分后的新对象。当调用Part对象的“拆分”方法后,其中很多几何对象都会被拆分为新的几何对象,而原几何对象被删除。如果想在拆分后使用拆分前的几何对象区域,最好的办法就是在拆分前把它(们)保存为Set对象,这样在拆分后,这个Set对象原本储存的几何对象会变为拆分后的数个新几何对象。(GUI操作里同样适用,这样可以避免一个个点选拆分后的几何对象)
Part对象划分为例,说明集的作用
sk = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=20.0)
sk.Line(point1=(0.0, 0.0), point2=(4, 0.0))
part = mdb.models['Model-1'].Part(name='Part-1', dimensionality=TWO_D_PLANAR,
type=DEFORMABLE_BODY)
part.BaseWire(sketch=sk)
lines = part.edges
line = lines[0]
part.Set(name='Line', edges=(lines,), )
print("原集:", part.sets["Line"].edges)
# 输出 原集: ['Edge object']
part.PartitionEdgeByPoint(edge=line, point=part.InterestingPoint(edge=line,
rule=MIDDLE))
print("新集:", part.sets["Line"].edges)
# 输出 新集: ['Edge object', 'Edge object']
print(line)
# 输出 ({'featureName': 'Wire-1', 'index': 0, 'instanceName': None, 'isReferenceRep': False, 'pointOn': ((0.5, 0.0, 0.0),)})
# line储存的始终是索引,划分后索引已经指向了新的几何线段Set对象会在拆分后自动更新内部几何对象序列的掩码。一旦拆分,即使是指向Set对象里几何对象序列的变量也会出错,需要更新一次变量此外,Part和PartInstance对象还提供了SetByBoolean()方法来对两个集进行布尔运算得到新集。灵活运用该方法可以得到到很多通过常规选取方法难以选中的对象。
特征构造方法
Feature对象的属性只有name和id,所以一般只关心创建Feature对象的方法。
创建Feature对象的方法在文档中存在两个相同标题不同内容的页面(Feature object,Feature object)介绍, 我没有建过比较复杂的模型所以用过的方法不多,也许区别是前一个页面的方法可以在Part和rootAssembly两种对象中使用,而后一个页面作为一般特征构造方法只能从Part对象中调用 ,基本上每个方法在GUI页面中都有操作一一对应。
划分网格
划分网格方法通过尝试录制脚本很容易上手,这里记录一下踩过的坑。
Sequence对象,但传入其中一个对象调用完seedEdgeByBias()方法后,另一个Sequence对象的掩码居然变了…….我在一个简单的模型上测试了一下发现为边布种又没有改变其他边的索引,实在不能想通为什么。所以最好把布种操作视为和划分操作一样可能会改变几何对象的索引吧,一旦调用之后就要重新从集里获取几何序列对象。