首页/文章/ 详情

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

23天前浏览16273

本文摘要(由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 constantsdeck = constants.ABAQUS

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

        下面我们先使用 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列表中的第一个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)

            首先我们通过将两种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 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")

              打印出来的结果如下

              可以看到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
                                  最近编辑:23天前
                                  仿真圈
                                  技术圈粉 知识付费 学习强国
                                  获赞 9014粉丝 20377文章 3157课程 204
                                  点赞
                                  收藏
                                  未登录
                                  还没有评论

                                  课程
                                  培训
                                  服务
                                  行家

                                  VIP会员 学习 福利任务 兑换礼品
                                  下载APP
                                  联系我们
                                  帮助与反馈