ANSA二次开发基础:实体(Entity)概念

Entity简介

我们在ANSA中看到的点、线、面、各种类型的网格、单元等等都被称为Entity。

大家可以这么理解,在地球上我们有不同的工种:医生、工人、工程师、老师........但是担任这么多不同的职业的都是人。而ANSA就是地球,点、线、面等就是统称为人(Entity)的不同工种,他们一起组成的整个人类社会,也就是有限元模型。

Entity属性

那我们把ANSA中的元素即Entity比作不同工种的人。那么人就会有一些最基本的属性,比如说姓名、身高、体重等等,同样ANSA中即使不同种类的Entity也都会的属性。

当然有可能出现有的人虽然有体重这个属性,但是他不知道,例如女生的体重从来都是个谜!!!!!

ANSA中有些Entity的属性存在,但是为空。这是因为你没有将属性赋予给他,比如说Entity的名字,不进行设置默认是空字符串。

下面是一些常用的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有着不同的属性,那我们如何获得这些属性,如何修改这些属性?

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

  • __init__ 这个方法负责初始化Entity类
  • ansa_type 返回该Entity在不同deck中的类型,比如说点在ABAQUS中叫NODE,在NASTRAN中叫GRID
  • card_fields 返回该Entity的各种参数组成的列表,这里的参数时在ANSA中点击不同deck中INFO弹出界面所显示的内容,下面是GUI中在ABAQUS中现实的壳单元参数与使用card_fields方法打印出来的参数对比,可以发现两者完全一样。


实体(Entity)—ANSA二次开发的基础的图1


  • get_entity_values 获取该Entity指定参数的值,例如可以查询上面图片中Shell单元的ID,PID等等
  • is_visable 返回布尔值,该Entity在屏幕中可见返回True,否则返回False
  • set_entity_values 设置该Entity指定参数的值


Entity属性与方法使用实例

Entity属性使用实例

上面只是了解Entity属性与方法的大致含义,接下来通过一个小例子来融会贯通一下

首先打开ANSA,随便导入一个有限元模型,打开ScriptEdit,新建一个文件。

接下来导入我们所需要用到的库

import ansafrom ansa import basefrom ansa import constants

这里我的模型是Abaqus的,所以将deck设置为Abaqus

import ansafrom ansa import basefrom ansa import constantsdeck = constants.ABAQUS

需要解释一下,具体的deck名称其实就是下图中红色方框的名字,不知道的直接点开deck查看就可以了


实体(Entity)—ANSA二次开发的基础的图2


下面我们先使用 base.CollectEntities()函数搜索模型中所有点、壳网格类型的Entity,这个函数我在以后的文章中会具体讲解使用方法及注意事项,这里大家只需要知道它能够搜集模型中Entity并返回这种类型Entity组成的列表。

可以看到共有161552个节点、146895个壳单元

import ansafrom ansa import basefrom ansa import constantsdeck = constants.ABAQUSNodes = base.CollectEntities(deck,None,"NODE",recursive=True)Shells = base.CollectEntities(deck,None,"SHELL",recursive=True)print(len(Nodes))
print(len(Shells))


实体(Entity)—ANSA二次开发的基础的图3


下面我们选取两种Entity列表中的第一个Entity作为研究对象

import ansafrom ansa import basefrom ansa import constantsdeck = constants.ABAQUSNodes = 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内置函数操作属性。

  • getattr(obj, name[, default]):访问对象的属性,如果存在返回对象属性的值,否则抛出AttributeError异常。
  • hasattr(obj,name):检查是否存在某个属性,存在返回True,否则返回False。
  • setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新属性,该函数无返回值。若存在则更新这个值。
  • delattr(obj, name):删除属性,如果属性不存在则抛出AttributeError异常,该函数也无返回值。

这里使用hasattr()判断该Entity是否有这个属性,使用getattr()获得该属性的值

import ansafrom ansa import basefrom ansa import constantsdeck = constants.ABAQUSNodes = 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")

打印出来的结果如下


实体(Entity)—ANSA二次开发的基础的图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界面中的各种参数

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....))

假设我们要将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))

打印结果为:

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

这里要特别注意一点,我们在修改一个Entity的ID或其他属性时,有的时候修改完了后发现原来Entity的属性值并没有改变,这种情况一般是由于你所修改的ID已经被其他同类的Entity所占有。例如,我们这里打印出前10个Shell的ID

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


实体(Entity)—ANSA二次开发的基础的图5


我们将ID为1的shell的ID改为2,看看会出现什么结果

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并未发生改变,这一点是大家需要注意的地方,而且要注意通过CollectEntities()所返回的Entity列表的排列顺序是根据Entity的ID进行排列的,在改变Entity的ID后其位置也发生了变化,所以之后进行索引时就不能按照list[index]的方式进行索引。这个后面的文章会更加详细、深入的讲解。

  • is_usable

使用时Entity.is_usable()

这个函数相当于GUI界面中右键某个实体中的“Reference”

如果该实体被其他实体引用,则返回True,否则返回False

例如节点组成一个单元,那么这个节点就是被单元引用的


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空