實體(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)兩者完全一樣。

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查看就可以了

下面我們先使用 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列表中的第一個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é)果如下

可以看到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",)))
輸出:

我們將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é)點就是被單元引用的
工程師必備
- 項目客服
- 培訓(xùn)客服
- 平臺客服
TOP




















