今天跟[Day26],我們來學學如何建立segment。
咦?可能有先進會問segment誰不會建呀,是不是沒東西可以寫,想騙文章數呀?
請先不要著急,我們想做到的是當目標為1st order solid element時,產生如往常一般的segment;但是當目標為2nd order element時,我們會產生細化的segment,如此才能真正展現2nd order solid element的效力呀。
細化的情況,可以點選下圖後,觀看影片:
今天我們先講解核心概念,[Day26]再細部討論code。
首先,假想我們手上有一個solidfacet Entity,我們透過Entity.get_entity_values看看裡面有些什麼資訊。
{'EID': 1,
'PID': <Entity: 0x7fcd67c80928: type: 1302(1302,N_PSOLID) id:1>,
'Name': '',
'FROZEN_ID': 'NO',
'FROZEN_DELETE': 'NO',
'FROZEN': 'NO',
'Comment': ''}
經過觀察,發現裡面並沒有Node Entity的順序,這樣無法建立segment。
所幸,天無絕人之路,正當我們束手無策時,想到了dir,如果我們直接觀察Entity本身,也就是dir(Entity)會不會有更多資訊呢?
['__class__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'_ansaType',
'_bcomment',
'_bname',
'_cardFields',
'_comment',
'_edge_index',
'_id',
'_isDefunct',
'_name',
'_type', # Yes!
'active',
'ansa_type',
'card_fields',
'get_entity_values',
'is_usable',
'module',
'position',
'set_entity_values']
其中_type是我們的曙光。
TETRA element,那麼_type會是3715~3718的整數。HEXA element,那麼_type會是3715~3720的整數。原來_type就是ANSA用來儲存這個solidfacet是solid哪一個面的資訊。
這麼一來從_type我們就可以取得該面的node id及其順序。
Entity.get_entity_values得到EID,再進而得到Solid Entity,再透過base.CreateShellsFromSolidFacets得到此solid Entity的shell Entity。shell Entity同時含有從_type中萃取的node id。這麼一來,如果是1st order solid element,我們取到的就是一般的shell element;但如果是2nd order solid element,我們取到的就會是含有中點的2nd order shell element 。我們觀察2nd order shell element的node順序可以發現,中點的產生也是有所規律,逆時針所產生的。這麼一來,我們就可以看著node的順序,人工寫出想要的細化segment順序。
覺得過程有點曲折嗎?Maybe...我們也不是一拿到題目,就想到可以這麼做的,也是邊想邊試才找出方法。二次開發的過程裡,大部分時間都是折磨的,但是在磨練中我們茁壯,做出了許多大家認為無法自動化的工具,解決使用者的痛點。享受折磨的過程,痛飲找出解法的成就,或許這就是CAE二次開發工程師的浪漫吧!