首页/文章/ 详情

ANSA二次开发基础-实体的应用实例

1年前浏览10249

上篇文章《ANSA二次开发基础-实体概念与理解》中我们讲解的ANSA 二次开发中“实体”概念。相信大家对于“实体”已经有了基础的了解。为了更加深入了解实体的属性与方法,我们下面用例子来联系一下。

Entity属性与方法使用实例

Entity属性使用实例

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

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

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

import ansa
from ansa import base
from ansa import constants

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

import ansa
from ansa import base
from ansa import constants

deck = constants.ABAQUS

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

image.png

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

可以看到共有161552个节点、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))

image.png

下面我们选取两种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内置函数操作属性。

·          getattr(obj, name[, default]):访问对象的属性,如果存在返回对象属性的值,否则抛出AttributeError异常。

·         hasattr(obj,name):检查是否存在某个属性,存在返回True,否则返回False。

·         setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新属性,该函数无返回值。若存在则更新这个值。

·         delattr(obj, name):删除属性,如果属性不存在则抛出AttributeError异常,该函数也无返回值。

这里使用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")

打印出来的结果如下

image.png

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

·        输出:

image.png

我们将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

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

好了以上就是关于“实体”的属性以及方法一些最基础的用法。配合上其他的命令你就能玩转ANSA二次开发了

我是ANSA攻城狮,下次见,同学们!

image.png

代码&命令二次开发网格处理几何处理汽车新能源静力学结构基础ANSA
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-04-04
最近编辑:1年前
ANSA攻城狮
硕士 | 仿真工程师 用编程解放双手
获赞 136粉丝 213文章 14课程 7
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈