iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Software Development

或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA系列 第 9

[Day09] - Box Drop Project精進計畫(1) - 建立Enum

  • 分享至 

  • xImage
  •  

在建立Entity時,需要輸入字串,有的時候要大寫,有的時候有標點符號,甚至有些時候有底線,實在記不太起來...更何況即使記憶力超群,也很難控制不會打錯字。舉例來說,假設我們想要建立一張LS-DYNA的一號材料卡,在ANSA的element type需要輸入MAT1 MAT_ELASTICMAT1MAT_ELASTIC中間需要空格,而MAT_ELASTIC中間需要有底線,是不是不太容易記呢?

我們的作法是建立一個class,並繼承strEnum,裡面的每一個東西都是一個member,名字可以自己定義,value則儲存ANSA API真正會用到的字串。這樣一來我們在coding的時候就可以利用IDE自動提示的功能,只需要輸入Enumclass名,再輸入.,就可以選到自己定義的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.CONTACTBCType.BOUNDARY_SPC_SETBCType.INITIAL_VELOCITY_SET本質上還是Enum,只是當需要用到string representation的時候,可以使用Enum來作為所代表的字串。所以當我們是真的想要取出這些Enum所代表的字串時,需要明確地使用value去取出來。

最後,是否要將所有字串都用Enum來取代呢?我們認為倒也未必,有些比較少用到或是一個project裡只用到一兩次的字串,就沒有建立相對應的Enum,不然有時候光要想起或找出那個Enum名字,就會花不少時間。總之,先不用想著如何最佳化code,但當你發現常打錯,或是覺得每次都要打很長一串覺得心累的時候,就是時候來個Enum了。

備註

相關Enum代換後的結果,請參考本日的box_drop.py

Code

本日程式碼傳送門


上一篇
[Day08] - Box Drop Project精進大綱
下一篇
[Day10] - Box Drop Project精進計畫(2) - 建立容易辨識的Entity名
系列文
或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言