在建立Entity
時,需要輸入字串,有的時候要大寫,有的時候有標點符號,甚至有些時候有底線,實在記不太起來...更何況即使記憶力超群,也很難控制不會打錯字。舉例來說,假設我們想要建立一張LS-DYNA的一號材料卡,在ANSA的element type
需要輸入MAT1 MAT_ELASTIC
,MAT1
與MAT_ELASTIC
中間需要空格,而MAT_ELASTIC
中間需要有底線,是不是不太容易記呢?
我們的作法是建立一個class
,並繼承str
跟Enum
,裡面的每一個東西都是一個member
,名字可以自己定義,value
則儲存ANSA API真正會用到的字串。這樣一來我們在coding的時候就可以利用IDE自動提示的功能,只需要輸入Enum
的class
名,再輸入.
,就可以選到自己定義的member
名。
我們可以建立一個schemas.py
,將Enum
存在裡面,以下列出幾種我們常用的Enum
給大家參考。
# schemas.py
from enum import Enum
class GeneralEntityNames(str, Enum):
PART: str = 'part'
SET: str = 'set'
CONTACT: str = 'contact'
MATERIAL: str = 'material'
PROPERTY: str = 'property'
SECTION: str = 'section'
CURVE: str = 'curve'
class AutoCreatedEntityNames(str, Enum):
PART: str = 'auto_part_'
SET: str = 'auto_set_'
CONTACT: str = 'auto_contact_'
MATERIAL: str = 'auto_material_'
PROPERTY: str = 'auto_property_'
SECTION: str = 'auto_section_'
CURVE: str = 'auto_curve_'
class MatType(str, Enum):
MAT1_MAT_ELASTIC: str = 'MAT1 MAT_ELASTIC'
class ContactType(str, Enum):
TYPE0_SEGMENT_SET: str = '0: Segment set'
TYPE1_SHELL_SET: str = '1: Shell set'
TYPE2_PART_SET: str = '2: Part set'
TYPE3_PART_ID: str = '3: Part id'
TYPE4_NODE_SET: str = '4: Node set'
TYPE5_ALL: str = '5: All'
TYPE6_EXEMPTED: str = '6: Exempted'
class ContactTypeName(str, Enum):
AUTOMATIC_SURFACE_TO_SURFACE: str = 'AUTOMATIC_SURFACE_TO_SURFACE'
class LSDYNAType(str, Enum):
ALL: str = '__ALL_ENTITIES__'
PART: str = 'ANSAPART'
NODE: str = 'NODE'
ELEMENT: str = '__ELEMENTS__'
SOLID: str = 'ELEMENT_SOLID'
SHELL: str = 'ELEMENT_SHELL'
PROPERTY: str = '__PROPERTIES__'
MATERIAL: str = '__MATERIALS__'
SET: str = 'SET'
CONTACT: str = 'CONTACT'
SEGMENT: str = 'SEGMENT'
class SecType(str, Enum):
SECTION_SHELL: str = 'SECTION_SHELL'
SECTION_SOLID: str = 'SECTION_SOLID'
class ShellType(str, Enum):
TRIA: str = 'TRIA'
QUAD: str = 'QUAD'
class SolidType(str, Enum):
TETRA: str = 'TETRA'
HEXA: str = 'HEXA'
class ControlCardType(str, Enum):
CONTROL: str = 'CONTROL'
DATABASE: str = 'DATABASE'
class BCType(str, Enum):
BOUNDARY_SPC_SET: str = 'BOUNDARY_SPC(SET)'
INITIAL_VELOCITY_SET: str = 'INITIAL_VELOCITY_SET'
另外值得一提的是,當面對下面這樣的情況:
keys = {'CONTACT',
'INITIAL_VELOCITY_SET',
'BOUNDARY_SPC(SET)'}
base.SetEntityVisibilityValues(deck, {key: 'on' for key in keys})
你可能一開始會傾向改為:
keys = {LSDYNAType.CONTACT,
BCType.BOUNDARY_SPC_SET,
BCType.INITIAL_VELOCITY_SET}
base.SetEntityVisibilityValues(deck, {key: 'on' for key in keys})
但實際上應該要寫為:
keys = {LSDYNAType.CONTACT,
BCType.BOUNDARY_SPC_SET,
BCType.INITIAL_VELOCITY_SET}
base.SetEntityVisibilityValues(deck, {key.value: 'on' for key in keys})
原因是LSDYNAType.CONTACT
,BCType.BOUNDARY_SPC_SET
及BCType.INITIAL_VELOCITY_SET
本質上還是Enum
,只是當需要用到string representation的時候,可以使用Enum
來作為所代表的字串。所以當我們是真的想要取出這些Enum
所代表的字串時,需要明確地使用value
去取出來。
最後,是否要將所有字串都用Enum
來取代呢?我們認為倒也未必,有些比較少用到或是一個project裡只用到一兩次的字串,就沒有建立相對應的Enum
,不然有時候光要想起或找出那個Enum
名字,就會花不少時間。總之,先不用想著如何最佳化code,但當你發現常打錯,或是覺得每次都要打很長一串覺得心累的時候,就是時候來個Enum
了。
相關Enum
代換後的結果,請參考本日的box_drop.py
。