實體(Entity)—ANSA二次開發(fā)的基礎(chǔ)

Entity簡介

我們在ANSA中看到的點、線、面、各種類型的網(wǎng)格、單元等等都被稱為Entity。

大家可以這么理解,在地球上我們有不同的工種:醫(yī)生、工人、工程師、老師........但是擔任這么多不同的職業(yè)的都是人。而ANSA就是地球,點、線、面等就是統(tǒng)稱為人(Entity)的不同工種,他們一起組成的整個人類社會,也就是有限元模型。

Entity屬性

那我們把ANSA中的元素即Entity比作不同工種的人。那么人就會有一些最基本的屬性,比如說姓名、身高、體重等等,同樣ANSA中即使不同種類的Entity也都會的屬性。

當然有可能出現(xiàn)有的人雖然有體重這個屬性,但是他不知道,例如女生的體重從來都是個謎!!!!!

ANSA中有些Entity的屬性存在,但是為空。這是因為你沒有將屬性賦予給他,比如說Entity的名字,不進行設(shè)置默認是空字符串。

下面是一些常用的Entity屬性,當然有些屬性是某些Entity特有的。

  • _id (int)  —— 在相同種類Entity中的id號

  •    _name (string)—— 該Entity的名字,當然如果沒有返回的是空字符串

  •    _edge_index (int)——     不是所有的Entity都有,我也不知道代表啥

  •    _comment (string)——   該Entity的描述,類似于個人簡介

  •    _bname   (string)——     以二進制命名的名字

  •    _bcomment (string)——   以二進制表示的Entity的描述

  •    position (object)——        Entity的位置信息,但是只有以下種類的Entity有這個屬性:

                GRIDs, MORPH POINTs, CONNECTION:SpotWeld_Points,CONNECTION:GumDropsCONNECTION:Bolts, CONNECTION:Robscans, CONNECTION:Points,TARGET POINTs, POINTs, CENTERs, HOT POINTs, CONNECTOR ENTITY,    GENERIC_ENTITIES_BUILDER, GEB_BC, GEB_OR, GEB_MT,GEB_SB, GEB_GN, A_POINT, LC_POINT.

Entity方法

上面我們知道Entity有著不同的屬性,那我們?nèi)绾潍@得這些屬性,如何修改這些屬性?

下面就介紹一下Entity的不同方法

  • __init__ 這個方法負責初始化Entity類

  • ansa_type 返回該Entity在不同deck中的類型,比如說點在ABAQUS中叫NODE,在NASTRAN中叫GRID

  • card_fields 返回該Entity的各種參數(shù)組成的列表,這里的參數(shù)時在ANSA中點擊不同deck中INFO彈出界面所顯示的內(nèi)容,下面是GUI中在ABAQUS中現(xiàn)實的殼單元參數(shù)與使用card_fields方法打印出來的參數(shù)對比,可以發(fā)現(xiàn)兩者完全一樣。

實體(Entity)—ANSA二次開發(fā)的基礎(chǔ)的圖1

  • get_entity_values 獲取該Entity指定參數(shù)的值,例如可以查詢上面圖片中Shell單元的ID,PID等等

  • is_visable 返回布爾值,該Entity在屏幕中可見返回True,否則返回False

  • set_entity_values 設(shè)置該Entity指定參數(shù)的值

Entity屬性與方法使用實例

Entity屬性使用實例

上面只是了解Entity屬性與方法的大致含義,接下來通過一個小例子來融會貫通一下

首先打開ANSA,隨便導(dǎo)入一個有限元模型,打開ScriptEdit,新建一個文件。

接下來導(dǎo)入我們所需要用到的庫

import ansa
from ansa import base
from ansa import constants

這里我的模型是Abaqus的,所以將deck設(shè)置為Abaqus

import ansa
from ansa import base
from ansa import constants

deck = constants.ABAQUS

需要解釋一下,具體的deck名稱其實就是下圖中紅色方框的名字,不知道的直接點開deck查看就可以了

實體(Entity)—ANSA二次開發(fā)的基礎(chǔ)的圖2

下面我們先使用 base.CollectEntities()函數(shù)搜索模型中所有點、殼網(wǎng)格類型的Entity,這個函數(shù)我在以后的文章中會具體講解使用方法及注意事項,這里大家只需要知道它能夠搜集模型中Entity并返回這種類型Entity組成的列表。

可以看到共有161552個節(jié)點、146895個殼單元

import ansa
from ansa import base
from ansa import constants

deck = constants.ABAQUS

Nodes = base.CollectEntities(deck,None,"NODE",recursive=True)
Shells = base.CollectEntities(deck,None,"SHELL",recursive=True)
print(len(Nodes)) print(len(Shells))

實體(Entity)—ANSA二次開發(fā)的基礎(chǔ)的圖3

下面我們選取兩種Entity列表中的第一個Entity作為研究對象

import ansa
from ansa import base
from ansa import constants

deck = constants.ABAQUS

Nodes = base.CollectEntities(deck,None,"NODE",recursive=True)
Shells = base.CollectEntities(deck,None,"SHELL",recursive=True)

Node = Node[0] Shell = Shells[0]

首先我們通過將兩種Entity的屬性打印出來,這里需要明確一個概念,ANSA中base.Entity實際上是一個class,因此我們可以通過使用使用python內(nèi)置函數(shù)操作屬性。

  •   getattr(obj, name[, default]):訪問對象的屬性,如果存在返回對象屬性的值,否則拋出AttributeError異常。

  •  hasattr(obj,name):檢查是否存在某個屬性,存在返回True,否則返回False。

  •  setattr(obj,name,value):設(shè)置一個屬性。如果屬性不存在,會創(chuàng)建一個新屬性,該函數(shù)無返回值。若存在則更新這個值。

  •  delattr(obj, name):刪除屬性,如果屬性不存在則拋出AttributeError異常,該函數(shù)也無返回值。

這里使用hasattr()判斷該Entity是否有這個屬性,使用getattr()獲得該屬性的值

import ansa
from ansa import base
from ansa import constants

deck = constants.ABAQUS

Nodes = base.CollectEntities(deck,None,"NODE",recursive=True)
Shells = base.CollectEntities(deck,None,"SHELL",recursive=True)
print(len(Nodes))
print(len(Shells))

Node = Nodes[0]
Shell = Shells[0] print(dir(base.Entity))
attributes = ["_id" ,"_name","_edge_index" ," _comment"  ,"position"  ,"_bname","_bcomment"]
for i in attributes:
         if hasattr(Node,i):
                  print("The {} of NODE in ABAQUS is {}".format(i,getattr(Node,i)),end="\n")
         else:
                  print(" NODE in ABAQUS has no such attribute:{}".format(i),end="\n")
                 
 print("-"*50)
 for i in attributes:
          if hasattr(Shell,i):
                 print("The {} of SHELL in ABAQUS is {}".format(i,getattr(Shell,i)),end="\n")
          else:  
                 print(" SHELL in ABAQUS has no such attribute:{}".format(i),end="\n")

打印出來的結(jié)果如下

實體(Entity)—ANSA二次開發(fā)的基礎(chǔ)的圖4

可以看到NODE Entity的name,bname,_bcomment為空,沒有_comment屬性

可以看到SHELL Entity的name,bname,_bcomment為空,沒有_comment和position屬性

Entity方法使用實例

  • ansa_type

使用時Entity.ansa_type(deck),返回字符串

print("The Node in ABAQUS deck's ansa_type is {}".format(Node.ansa_type(deck)))

輸出為

The Node in ABAQUS deck's ansa_type is NODE
  • card_fields

使用時Entity.card_fields(deck),返回字符串組成的列表,實際上就是各個Entity在ANSA INFO界面中的各種參數(shù)

The
 Node in ABAQUS deck's card_fields is ['ID', 'X', 'Y', 'Z', 'SYSTEM', 
'TRANSFORM', 'Name', 'FROZEN_ID', 'FROZEN_DELETE', 'AUXILIARY', 
'DEFINED', 'Comment', 'MBContainer', 'MBContainers']
  • get_entity_values

使用時,Entity.get_entityvalues(deck,(a,b....)),其中a,b...就是由 上述card_fields返回的值,這個方法的返回值時字典。

dict= Shell.get_entity_values(deck,("ID","PID"))
print("The ID and PID of Shell in ABAQUS is {} and {}".format(dict["ID"],dict["PID"]))

輸出為

The ID and PID of Shell in ABAQUS is 1 and <Entity: 0x000001A20C9C1080: type: 1301(1301,N_PSHELL) id:7673>
  • set_entity_values

使用時Entity.set_entity_values(deck,(a:value1,b:value2....))

假設(shè)我們要將Node的ID從2換成9999999

a = Node.get_entity_values(deck,("ID",))
print("the oringinal ID of Node is {}".format(a))

Node.set_entity_values(deck,{"ID":9999999})

b = Node.get_entity_values(deck,("ID",))
print("the changed ID of Node is {}".format(b))

打印結(jié)果為:

the oringinal ID of Node is {'ID': 2}
the changed ID of Node is {'ID': 9999999}

這里要特別注意一點,我們在修改一個Entity的ID或其他屬性時,有的時候修改完了后發(fā)現(xiàn)原來Entity的屬性值并沒有改變,這種情況一般是由于你所修改的ID已經(jīng)被其他同類的Entity所占有。例如,我們這里打印出前10個Shell的ID

for i in range(100):
    print(Shells[i].get_entity_values(deck,("ID",)))

  • 輸出:

實體(Entity)—ANSA二次開發(fā)的基礎(chǔ)的圖5

我們將ID為1的shell的ID改為2,看看會出現(xiàn)什么結(jié)果

Shell1 = Shells[0] print(Shell1.get_entity_values(deck,("ID",)))
Shell1.set_entity_values(deck,{"ID":2})

print(Shell1.get_entity_values(deck,("ID",)))

輸出:

The oringinal Id of Shell1 is {'ID': 1}
The changed Id of Shell1 is {'ID': 1}

可以看到ID并未發(fā)生改變,這一點是大家需要注意的地方,而且要注意通過CollectEntities()所返回的Entity列表的排列順序是根據(jù)Entity的ID進行排列的,在改變Entity的ID后其位置也發(fā)生了變化,所以之后進行索引時就不能按照list[index]的方式進行索引。這個后面的文章會更加詳細、深入的講解。

  • is_usable

使用時Entity.is_usable()

這個函數(shù)相當于GUI界面中右鍵某個實體中的“Reference”

如果該實體被其他實體引用,則返回True,否則返回False

例如節(jié)點組成一個單元,那么這個節(jié)點就是被單元引用的

登錄后免費查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項目客服
  • 培訓(xùn)客服
  • 平臺客服

TOP

5
8