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

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

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

本文借助python脚本实现了abaqus脚本捕获几何元素的交、并、差运算。使用方便,效果好!下面介绍python脚本的实现。

s.png  

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

第二步,把所有abaqus 脚本捕获几何元素的交、并、差运算的图2从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)。

s.png

s.png

下面是功能演示的视频链接。

https://www.jishulink.com/college/video/c13623?nagivator=course

5abaqus/python关键基础

如果理解上述代码有困难,或者将上述核心代码利用起来有困难,说明尚未掌握abaqus/python的关键基础知识和技能。推荐加入到huoli主讲的技术邻《abauqs/python关键基础》的学习(https://www.jishulink.com/college/video/c13558),从中能过获得详细的讲解和答疑。本文也是其中的实战案例,参与学习可以获得本文实战层次的代码,并手把手教会。


[1] 如果一个对象是可哈希的,那么它就有一个在其生命周期中都不会改变的哈希值,并且能够和其他对象比较。

该付费内容为:完整源码

包含1个附件 1个视频(时长共 4分42秒 5人购买
(7条)
默认 最新
赞一个,不过Abaqus 内核指令自带有SetByBoolean函数,可以实现求 交 并 差
评论 点赞 1
学习
评论 点赞 1

查看更多评论 >

点赞 38 评论 7 收藏 8
关注