abaqus 腳本捕獲幾何元素的交、并、差運算

abaqus 腳本捕獲幾何元素的交、并、差運算

abaqus自帶了捕獲幾何元素的方法,可以在python腳本中捕獲abaqus幾何體的“點、線、面、體”對象或網格模型的各種元素,這在技術鄰文章里有詳細的介紹(http://www.yqgqt.org.cn/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

下面是功能演示的視頻鏈接。

http://www.yqgqt.org.cn/college/video/c13623?nagivator=course

5、abaqus/python關鍵基礎

如果理解上述代碼有困難,或者將上述核心代碼利用起來有困難,說明尚未掌握abaqus/python的關鍵基礎知識和技能。推薦加入到huoli主講的技術鄰《abauqs/python關鍵基礎》的學習(http://www.yqgqt.org.cn/college/video/c13558),從中能過獲得詳細的講解和答疑。本文也是其中的實戰案例,參與學習可以獲得本文實戰層次的代碼,并手把手教會。


[1] 如果一個對象是可哈希的,那么它就有一個在其生命周期中都不會改變的哈希值,并且能夠和其他對象比較。

以下內容為付費內容,請購買后觀看

   6人購買

完整源碼

App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

38
7
9