今天的標題是"取得及更新Entity Card Values",而不是"更新Entity"。
原因是Entity在建立之後,我們不太會去對Entity本身做改變,一般想改動的是其card values,也就是fields的部份。
要取得及更新Entity Card Values,需要使用getter及setter function(雖然這看起來不太pythonic, we know...)。
要改變card values有兩種方法:
base.GetEntityCardValues及SetEntityCardValues。Entity本身的get_entity_values及set_entity_values。我們比較習慣後者,所以以此為我們的coding style。
舉例來說,下面我們先建立一個座標為(1,2,3)的node Entity,接著利用Entity.set_entity_values將X座標改為10。
def get_set_node_card_values():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
set_ret = node.set_entity_values(deck, {'X': 10})
print(f'{set_ret=}')
card_values = node.get_entity_values(deck, tuple(fields.keys()))
print(f'{card_values=}')
如果set成功的話會回傳0,否則則回傳非零值。
如果get成功的話會回傳一個dict,key為所要求的field,value為其card value,
否則會回傳一個空的dict。
觀察card_values可知,我們已經成功將X座標改為10。
set_ret=0
card_values={'X': 10.0, 'Y': 2.0, 'Z': 3.0}
舉個get及set失敗的例子來說。
def get_set_node_card_values_failed():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
set_ret = node.set_entity_values(deck, {'A': 10})
print(f'{set_ret=}')
card_values = node.get_entity_values(deck, ['A'])
print(f'{card_values=}')
由於A並不存在node的fields內,所以set會失敗,回傳值為1。
同理get也會失敗,回傳值為空的dict。
set_ret=1
card_values={}
對於一些少遇見的Entity,我們並不熟悉其有哪些fields可以控制,此時可以先利用Entity的card_fields取得fields,再搭配get_entity_values來觀察其card values。
def get_all_node_card_values():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
fields = node.card_fields(deck)
card_values = node.get_entity_values(deck, fields)
print(f'{card_values=}')
其輸出為:
card_values={'TYPE': '*NODE', 'NID': 1, 'X': 10.0, 'Y': 2.0, 'Z': 3.0, 'TC': '0: none', 'RC': '0: none', 'Name': '', 'FROZEN_ID': 'NO', 'FROZEN_DELETE': 'NO', 'DEFINED': 'YES', 'AUXILIARY': 'NO', 'Comment': '', 'MBContainer': None, 'MBContainers': []}
另外,每個Entity有一些常用的attribute,不需使用getter,就可以直接存取,像是Entity._name、Entity_id及Entity._comment。
比較特別的是point-like Entity,可以利用Entity.position來直接get及set其座標。所以這個例題比較有效率的寫法會是下面這樣。
def get_set_node_card_values_fast():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
node.position = (10, 2, 3)
print(f'{node.position=}')
其輸出為:
node.position=(10.0, 2.0, 3.0)
關於ANSA的CRUD操作,於今天告一段落。[Day06]開始,我們將利用這些操作,建立一個box drop project。
除了需要使用getter及setter有些不Pythonic外,我們覺得ANSA API使用上比較麻煩的地方是,每一種CRUD操作,對於成功或失敗,會回傳不同的值。所以有時在debug時,需要來回穿梭於回傳值及手冊間,難道這是BETA CAE Systems想讓我們多熟悉手冊而特意安排的(苦笑)?