ANSA建立Entity的function是base.CreateEntity,一般需要三個參數,deck、element_type及fields。
deck是solver的種類,type為int,可以從constants模組中取得,例如LS-DYNA為constants.LSDYNA,Nastran則為costants.NASTRAN。
element_type是card的種類,type為str。不同的solver可能會用不同的名稱來描述同一種element_type。例如: shell在Nastran這個deck下稱為SHELL,但在LS-DYNA則稱為ELEMENT_SHELL。如果剛開始接觸ANSA,不太確定element_type的字串時,可以透過GUI的介面確認。
fields是描述這個Entity的內容,type為dict。每一種Entity有不同種類的fields,要想知道該Entity有哪些fields的話,可以透過Entity.card_fields這個function來取得。
舉例來說,這裡我們建立一個座標為(1,2,3)的node Entity。
from ansa import base, constants
def create_node1():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
card_fields = node.card_fields(deck)
print(f'create_node1: {node=}')
print(f'{card_fields=}')
首先我們從ANSA中import base及constants兩個模組,接著照順序定義上述三個參數。
deck為constants.LSDYNA。element_type(變數名為type_)為NODE。fields為{'X': 1, 'Y': 2, 'Z': 3}。查看輸出,發現可順利產生一個id為1的node Entity。
create_node1: node=<Entity: 0x7f67563b6000: type: 1101(1101,N_GRID) id:-1>
藉由node.card_fields則可以觀察這個node Entity所擁有的card_fields。如果想同時建立node Entity並指定其id的話,必須於呼叫base.CreateEntity時,將加入NID這個欄位到上述的fields內。
card_fields=['TYPE', 'NID', 'X', 'Y', 'Z', 'TC', 'RC', 'Name', 'FROZEN_ID', 'FROZEN_DELETE', 'DEFINED', 'AUXILIARY', 'Comment', 'MBContainer', 'MBContainers']
當Entity建立失敗的時候,base.CreateEntity會回傳None。
def create_node2():
deck = constants.LSDYNA
type_ = 'NODE'
wrong_fields = {'X': 1, 'Y': 2, 'z': 3} # 'z' should be 'Z'
node = base.CreateEntity(deck, type_, wrong_fields)
print(f'create_node2: {node=}')
其輸出為:
create_node2: node=None
當需要更多的資訊來debug,可以給定debug=constants.REPORT_ALL。
def create_node3():
deck = constants.LSDYNA
type_ = 'NODE'
wrong_fields = {'X': 1, 'Y': 2, 'z': 3} # 'z' should be 'Z'
node = base.CreateEntity(deck, type_, wrong_fields,
debug=constants.REPORT_ALL)
print(f'create_node3: {node=}')
此時base.CreateEntity會回傳一個具有兩個元素的tuple,第一個元素是回傳值,第二個元素是含有錯誤訊息的dict(如果沒有錯誤訊息,則會是一個空的dict)。
create_node3: node=(None, {'z': {'type': 'error', 'message': 'Field not found!'}})
最後,當遇到無法使用base.CreateEntity來建立想要Entity的時候,通常代表該種Entity有特殊的create function。
如container內的part及group,需使用base.NewPart及base.NewGroup來建立;load curve需使用base.CreateLoadCurve來建立。
ANSA內刪除Entity的function是base.DeleteEntity,一般只需要一個變數,單個Entity或是一個包含多個Entity的list。
def delete_node():
deck = constants.LSDYNA
node1 = base.CreateEntity(deck, 'NODE', {'X': 0, 'Y': 0, 'Z': 0})
node2 = base.CreateEntity(deck, 'NODE', {'X': 10, 'Y': 0, 'Z': 0})
node3 = base.CreateEntity(deck, 'NODE', {'X': 10, 'Y': 10, 'Z': 0})
del_node1 = base.DeleteEntity(node1)
print(f'{del_node1=}')
del_node2_3 = base.DeleteEntity([node2, node3])
print(f'{del_node2_3=}')
如果全部給定的Entity都成功刪除,會回傳0,否則則回傳1。
del_node1=0
del_node2_3=0
如同建立Entity時一樣,偶爾會遇到無法刪除的Entity,此時需要到base模組裡找找,是不是該Entity有特殊的刪除function,如base.DeletePart或base.DeleteCurves等。