本文主要介绍了ANSA二次开发的基本概念和操作,包括实体、属性、方法等。文章通过实例讲解了如何使用Python对ANSA进行二次开发,并介绍了作者原创的《ANSA二次开发从入门到精通22讲》精品课程,该课程通过代码讲解实例演练的方法深入浅出地从实体概念及用法、几何清理、网格划分、连接转换及实例化和GUI界面设计五个方面进行讲解,后续还为订阅用户提供答疑交流服务。
导读:大家好,我是ANS攻城狮,硕士毕业于北京航空航天大学,目前在一家新能源车企工作。擅长Ansa、Hypermesh前处理软件;Optistruct、Abaqus求解器;Meta、Hyperview后处理软件。可以熟练使用python对Ansa及Meta进行二次开发,提升工作效率。先前我在仿真秀发布了《少走弯路!基于Python的ANSA二次开发学习路线》,收到了订阅用户的好评和认可,自今日起,我计划把自己在学习和应用ANSA二次开发工程中一些经验和心得,以系列文章形式分享给大家,。
在接触ANSA二次开发时最常做的就是对ANSA中的“实体”—Entity进行操作。这里说的实体大家可以理解为在ANSA中看到的基本所有可以通过鼠标选择以及操作的元素。
我们在ANSA中看到的点、线、面、各种类型的网格、甚至连接触对都可以被称为实体。其实最常见的实体就是在我们左侧模型树中看到的,如下图所示。
在ANSA二次开发中通过下属命令打印实体的类型,可以看到ANSA二次开发中的实体是Python中类的概念。
这也很好理解,实体中不管是点、线、面这些几何元素,还是壳网格、实体网格这些单元,亦或是属性、材料等都是由自己的名字、ID、comment一些通用的属性。创建一个Class-类作为所有实体的父类,然后再继承这个父类,通过增添不同的属性形成新的子类,这样做既能够提高代码使用效率,还能够使得更好地封装代码。
后面几期的文章中我也会用实例来带大家练习类这个概念如何在ANSA二次开发中应用,它是如何提高我们代码开发的效率的。本文章主要聚焦点则是在“实体”概念的讲解。回归正题,既然作为Python语言中的类,那么必然有两个最基本的“属性”:(1)类属性、(2)类方法。下面我们注意详细讲解实体的这两种“属性”。
1、Entity属性
那我们把ANSA中的元素即Entity比作不同工种的人。那么人就会有一些最基本的属性,比如说姓名、身高、体重等等,同样ANSA中即使不同种类的Entity也都会的属性。
ANSA中有些Entity的属性存在,但是为空。这是因为你没有将属性赋予给他,比如说Entity的名字,不进行设置默认是空字符串。
下面是一些常用的Entity属性,当然有些属性是某些Entity特有的。
(1)_id (int) —— 在相同种类Entity中的id号
(2) _name (string)—— 该Entity的名字,当然如果没有返回的是空字符串
(3)_edge_index (int)—— 不是所有的Entity都有,我也不知道代表啥
(4) _comment (string)—— 该Entity的描述,类似于个人简介
(5) _bname (string)—— 以二进制命名的名字
(6) _bcomment (string)—— 以二进制表示的Entity的描述
(7)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的不同方法
(1)__init__ 这个方法负责初始化Entity类
(2)ansa_type 返回该Entity在不同deck中的类型,比如说点在ABAQUS中叫NODE,在NASTRAN中叫GRID
(3)card_fields 返回该Entity的各种参数组成的列表,这里的参数时在ANSA中点击不同deck中INFO弹出界面所显示的内容,下面是GUI中在ABAQUS中现实的壳单元参数与使用card_fields方法打印出来的参数对比,可以发现两者完全一样。
(4)get_entity_values 获取该Entity指定参数的值,例如可以查询上面图片中Shell单元的ID,PID等等
(5)is_visable 返回布尔值,该Entity在屏幕中可见返回True,否则返回False
(6)set_entity_values 设置该Entity指定参数的值
以上就是笔者关于ANSA二次开发中实体的一些基础概念以及理解。接下来,我会用例子详细讲解实体的属性以及方法的应用。
1、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查看就可以了
下面我们先使用 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))
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)
首先我们通过将两种Entity的属性打印出来, ANSA中base.Entity是一个class,因此我们可以通过使用使用python内置函数操作属性。
(1)getattr(obj, name[, default]):访问对象的属性,如果存在返回对象属性的值,否则抛出AttributeError异常。
(2)hasattr(obj,name):检查是否存在某个属性,存在返回True,否则返回False。
(3)setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新属性,该函数无返回值。若存在则更新这个值。
(4)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")
打印出来的结果如下
可以看到NODE Entity的name,bname,_bcomment为空,没有_comment属性
可以看到SHELL Entity的name,bname,_bcomment为空,没有_comment和position属性
2、Entity方法使用实例
(1)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
(2)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']
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>
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}
for i in range(100): print(Shells[i].get_entity_values(deck,("ID",)))
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}
好了以上就是关于“实体”的属性以及方法一些最基础的用法。配合上其他的命令你就能玩转ANSA二次开发了
以下是课程安排
ANSA二次开发从入门到精通22讲:轻松掌握基于python的ANSA二次开发
此外,笔者为所有订阅用户提供知识圈答疑服务和VIP用户交流群。并附赠课程相关资料等(平台支持自行开具电子发票)。
熟练运用Ansa二次开发进行几何清理
熟练运用Ansa二次开发进行网格划分
熟练运用Ansa二次开发进行常见连接(焊点、焊线、螺栓、胶粘)的转换与实体化
熟练运用Ansa二次开发进行GUI界面设计,提高程序交互性
熟练掌握Ansa二次开发中Python的常用数据类型及语法
学习型仿真工程师
有限元分析兴趣爱好者和结构工程师
理工科在校生和教师
希望通过二次开发简化工作、提高效率的工程师
3、读者福利
读者福利:请在文章附件直接下载以下学习资料,如果遇到麻烦,请在文章下方留言或联系平台客服领取。