abaqus 腳本捕獲幾何元素的交、并、差運算
abaqus 腳本捕獲幾何元素的交、并、差運算
abaqus自帶了捕獲幾何元素的方法,可以在python腳本中捕獲abaqus幾何體的“點、線、面、體”對象或網格模型的各種元素,這在技術鄰文章里有詳細的介紹(http://www.yqgqt.org.cn/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關鍵基礎》的學習(http://www.yqgqt.org.cn/college/video/c13558),從中能過獲得詳細的講解和答疑。本文也是其中的實戰案例,參與學習可以獲得本文實戰層次的代碼,并手把手教會。
[1] 如果一個對象是可哈希的,那么它就有一個在其生命周期中都不會改變的哈希值,并且能夠和其他對象比較。
以下內容為付費內容,請購買后觀看
6人購買
完整源碼
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP





















