首页/文章/ 详情

玩转ANSA二次开发-1:详解实体属性与方法及案例实操

5月前浏览35733

本文摘要(由AI生成):

本文主要介绍了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二次开发实体概念详解

后面几期的文章中我也会用实例来带大家练习类这个概念如何在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:PointsTARGET POINTs, POINTs, CENTERs, HOT POINTs, CONNECTOR ENTITY,    GENERIC_ENTITIES_BUILDER, GEB_BC, GEB_OR, GEB_MTGEB_SB, GEB_GN, A_POINT, LC_POINT.
2、Entity方法

上面我们知道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二次开发中实体的一些基础概念以及理解。接下来,我会用例子详细讲解实体的属性以及方法的应用。

三、Entity属性与方法使用实例

1、Entity属性使用实例

首先打开ANSA,随便导入一个有限元模型,打开ScriptEdit,新建一个文件。接下来导入我们所需要用到的库




import ansafrom ansa import basefrom ansa import constants

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






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

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

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

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










import ansafrom ansa import basefrom 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 ansafrom ansa import basefrom 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 ansafrom ansa import basefrom 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']
(3)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>
(4)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",)))
 输出:

我们将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]的方式进行索引。
(5)is_usable:使用时Entity.is_usable(),这个函数相当于GUI界面中右键某个实体中的“Reference”,如果该实体被其他实体引用,则返回True,否则返回False,例如节点组成一个单元,那么这个节点就是被单元引用的

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

四、我们ANSA二次开发精品课

笔者原创的ANSA二次开发从入门到精通22讲精品课,基于Python对Ansa23进行二次开发(适用于低版本Ansa)。课程通过代码讲解实例演练的方法深入浅出地从:实体概念及用法、几何清理、网格划分、连接转换及实例化和GUI界面设计五个方面进行讲解,后续还为订阅用户提供答疑交流服务。

以下是课程安排

ANSA二次开发从入门到精通22讲:轻松掌握基于python的ANSA二次开发


此外,笔者为所有订阅用户提供知识圈答疑服务VIP用户交流群。并附赠课程相关资料等(平台支持自行开具电子发票)。

1、你将学到  
  • 基于各种工程实例的Ansa二次开发案例讲解过程
  • 熟练运用Ansa二次开发进行几何清理

  • 熟练运用Ansa二次开发进行网格划分

  • 熟练运用Ansa二次开发进行常见连接(焊点、焊线、螺栓、胶粘)的转换与实体化

  • 熟练运用Ansa二次开发进行GUI界面设计,提高程序交互性

  • 熟练掌握Ansa二次开发中Python的常用数据类型及语法

  • 赠课程全套资料和模型,并提供VIP订阅用户交流,赠知识圈答疑服务
2、适合哪些人学习  
 
  • 学习型仿真工程师

  • 有限元分析兴趣爱好者和结构工程师

  • 理工科在校生和教师

  • 希望通过二次开发简化工作、提高效率的工程师

  • ANSA软件用户和兴趣爱好者

3、读者福利

读者福利:请在文章附件直接下载以下学习资料,如果遇到麻烦,请在文章下方留言或联系平台客服领取。

以上资料已经收录到CAE仿真入门学习包,欢迎大家朋友圈收藏领取。见文末图片。  
作者:ANSA攻城狮   仿真秀专栏作者
声明:本文首发仿真秀App,部分图片和内容转自网如有不当请联系我们,欢迎分享,禁止私自转载,转载请联系我们。
 


来源:仿真秀App


附件

免费链接.txt
Abaqus二次开发通用航空航天电子ANSApython新能源材料螺栓
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-04-07
最近编辑:5月前
仿真圈
技术圈粉 知识付费 学习强国
获赞 9772粉丝 21178文章 3417课程 215
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈