abaqus 脚本捕获几何元素的交、并、差运算

abaqus 脚本捕获几何元素的交、并、差运算
abaqus自带了捕获几何元素的方法,可以在python脚本中捕获abaqus几何体的“点、线、面、体”对象或网格模型的各种元素,这在技术邻文章里有详细的介绍(https://www.jishulink.com/content/post/331773)。但是,abaqus不支持对捕获的几何元素序列进行集合运算,面对一些复杂的选择集只能用序列连接的方法来实现。
本文借助python脚本实现了abaqus脚本捕获几何元素的交、并、差运算。使用方便,效果好!下面介绍python脚本的实现。

1、“几何序列”的限制
“几何序列”是abaqus/cae中的一种数据类型,其本质是python列表。“交、并、差运算”是python集合数据类型自带的集合运算功能。在python脚本中,一个可哈希[1]序列能够简单快速的转化为集合,实现元素的去重目标,并且进行交、并、差运算后,再转化成序列。以此实现python序列的交、并、差运算。
虽然abaqus几何序列本质是python列表,但经过封装后被限制了“修改”操作,加之几何序列的元素没有定义哈希运算,所以几何序列不能转化为集合直接实现“交、并、差运算”。
2、绕过限制,迂回实现目标
实现目标的障碍摆在眼前,要么突破abaqus的源码,放开几何序列的修改限制,为几何序列的元素定义哈希运算。要么从abaqus的框架中跳出来,用python的原生功能来实现目标。权衡之下,前一种思路有杀鸡用牛刀的感觉,后面一种思路合理且难度可控。决定跳出abaqus框架,绕过几何序列的种种限制,迂回实现目标。
第一步,跳出abaqus框架,绕过几何序列的限制。这里用到了“遍历”几何序列获取元素的特性。用下面的简单代码,把几何序列成功转化为python列表,跳出了abaqus框架。
# newlist是python空列表 # seq是abaqus的几何序列<type ‘FaceArray’>,其中的元素是面对象<type ‘Face’> newlist = [] for face in seq: newlist.append(face)
经过以上代码,得到的列表内所有元素与原来的几何序列一致,因为元素没有定义哈希运算不能够转化为python集合。
第二步,“以彼之矛,攻彼之盾”,封装abaqus对象,实现列表转集合。abaqus通过封装python的列表得到几何序列,添加了很多限制;同理,我们可以通过封装abaqus对象(本例中是面对象<type ‘Face’>),获得哈希运算的功能,列表顺利转化为集合。
以下代码是封装abaqus对象的自定义类:
# obj 是需要封装的abaqus对象 class Hashobj(object): def __init__(self, obj): self.obj = obj def __eq__(self, other): return self.obj == other.obj def __hash__(self): return hash(self.obj.featureName) ^ \ hash(self.obj.index) ^ \ hash(self.obj.instanceName) ^ \ hash(self.obj.isReferenceRep) ^ \ hash(self.obj.pointOn)
结合第二步的功能,第一步中的代码可以写成一个函数,并且直接返回根据列表转化而来的集合。代码如下:
# newlist是python空列表 # seq是abaqus的几何序列<type ‘FaceArray’>,其中的元素用obj代表 def turn2set(seq): newlist = [] for obj in seq: newlist.append(Hashobj(obj)) return set(newlist)
3、水到渠成,实现交、并、差运算
只要调用前文给出的turn2set函数,就可以把几何序列转化为python集合,实现交、并、差运算的代码就十分简单了。
# seq1、seq2是abaqus的几何序列<type ‘FaceArray’> # set1、set2是从seq1、seq2转化而成的python集合 # operation是标记运算类型的字符串 def seq_operation(seq1, seq2, operation): set1 = turn2set(seq1)set2 = turn2set(seq2) # 交集 If operation == ‘intersect’: res = list(set1 & set2) # 差集 If operation == ‘except': res = list(set1 - set2) # 并集 If operation == ‘union': res = list(set1 | set2) return res
仔细看上面 seq_operation 函数的返回值,发现返回值 res 其实是python列表,而且列表中的元素是经过 Hashobj 这个自定义类封装的对象,并非原来的abaqus对象。所以这个返回结果在abaqus中是无法直接使用的。为此,我们还要逆向多走两步。
第一步,从Hashobj封装的对象中取出原来的abaqus对象。这步的代码非常简单:
# item代表res列表中的元素 item.obj
第二步,把所有从Hashobj对象中取出的abaqus对象定义为一个python序列。借助abaqus中生成几何序列的方法将python序列转为几何序列。这步的代码也简单,而且似曾相识:
# inputSeq是由Hashobj对象中取出的abaqus对象为元素构成的列表 # part.FaceArray是abaqus中将python序列转化为几何序列(本例为面序列)的方法 inputSeq= [] for item in res: inputSeq.append(item.obj) import part part.FaceArray(inputSeq)
以上就是用python脚本实现abaqus几何序列的交、并、差运算的方法及完整核心代码 。如果要使用这个功能,只需要将seq_operation函数与最后的代码整合在一起就能方便的使用了。当然,本例只是针对abaqus里面的面序列,还有边序列、点序列、体序列,只需要做相应调整就能实现。
4、功能演示
在下方的付费附件中,提供了基于上述核心代码的完整代码。完整代码的模块结构如下图所示,并且增加了异常反馈的功能,也增加了直接使用交、并、差运算的接口函数(seq_intersect、seq_union、seq_except)。
5、abaqus/python关键基础
如果理解上述代码有困难,或者将上述核心代码利用起来有困难,说明尚未掌握abaqus/python的关键基础知识和技能。推荐加入到huoli主讲的技术邻《abauqs/python关键基础》的学习(https://www.jishulink.com/college/video/c13558),从中能过获得详细的讲解和答疑。本文也是其中的实战案例,参与学习可以获得本文实战层次的代码,并手把手教会。
[1] 如果一个对象是可哈希的,那么它就有一个在其生命周期中都不会改变的哈希值,并且能够和其他对象比较。
以下内容为付费内容,请购买后观看
包含1个文件、1个视频 6人购买
完整源码
- App下载
- 项目客服
- 培训客服
- 平台客服
TOP