首页/文章/ 详情

编程:10分钟了解ANSA的API

1年前浏览1446

大家好,我是团长。
本期开始进入ANSA的高级功能的分享:二次开发。


首先我们必须来讲讲API。
什么是API呢?
     
   

   

   
   

 

百科-API:

应用程序接口(Application Program Interface)。    

   
API就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的 API 而使操作系统去执行应用程序的命令。    

   
 

 


简单来说,API就是一个接口,用户可以通过这个接口去操纵ANSA,即用户可以用自编程序去让ANSA执行某些操作。

本文目录:
1、ANSA的脚本编辑器(script editor)
2、ANSA中的模块(Module)
3、在ANSA中访问数据
3.1、ANSA中的【实体】Entity
3.2、ANSA中的属性卡片怎么修改?
3.3、ANSA中如何检索到实体(Retrieving Entities)
3.3.1、base.CollectEntities的使用示例
3.3.2、base.NametoEnts的使用示例
3.3.3、base.GetEntity的使用示例

3.4、如何创建实体

3.5、数据的管理

3.5.1、Model Browser - Parts, Groups

3.5.2、Includes Manager

3.5.3、Sets管理器






以下正文





1、ANSA的脚本编辑器(script editor)

而在API中,最重要的就是Sript Editor了。这个是ANSA自带的一个程序编译环境。
打开方式如下:


也可以直接通过工具栏的图标进入:


都会打开以下的界面,用户可以利用这个编辑器对既有文件或者新建文件进行内容编辑。


这个窗口中最中心处就是编译窗口(editor),右边是函数搜索工具,双击搜索到的函数,就会在下方的Help栏出现相关函数的用法及例子,然后用户在编译窗口编译的程序执行(Run)后,也会在下方的Output栏出现程序的执行信息。


2、ANSA中的模块(Module)


其实称Modules为【包】更合适,ANSA API中包含一系列函数(Functions)和类(Classes),这些函数和类都是可以直接用来跟ANSA 界面沟通的。不同的函数和类基于不同的特点被分到不同的Python包里,用户必须在程序中导入这些包后,才能使用包里的函数和类。


在ANSA中最基础的包是【base】,因为有关topo、deck、visibility、和element的处理函数都在这个包里,然后与deck紧密相关的包还有【constants】,这个包里包含了ANSA中的所有常量(constant)和相关函数,一般deck的指定都需要通过constant这个包来指引,如下所示。






from ansa import constants
constants.NASTRANconstants.ABAQUS

3、在ANSA中访问数据


3.1、 ANSA中的【实体】Entity

ANSA数据库中的Entity,可以是一个Node、一个Element、一个Property、或者一个Connection,他们都是类(base.Entity)里的一个对象(Object)。每个对象都有相同的状态和属性。通过使用特定的函数,可以直接创建实体或者检索到实体。


有一些非常好用的获得实体属性的方法如下:

_id:返回实体的id号

_name:返回实体的名称

_comment:返回实体的注释内容

postion:返回实体点的坐标


举个栗子,要获得一个节点的名称和id号可以这么来:



name = node._namenid = node._id

然后为了改变这个节点的位置,我们可以直接赋值给它一个元组,如下。


print(node.position) # Prints the current node's positionnode.position = (6,7,4) # Set the node's coordinates to x=6, y=7, z=4

3.2、ANSA中的属性卡片怎么修改?

在ansa中大多数实体都有个卡片定义其所有相关属性。每个实体的类型都非常重要,因为大多数情况下我们需要指定类型后才能找到进一步找到这个实体。一般来讲,实体的类型都展示在卡片的最上方(如下图所示的CQUAD4[SHELL])。需要注意的是实体的类型在不同DECK模块下会有所区别,比如shell单元在NASTRAN模块下的类型是【SHELL】,在LS-DYNA模块下类型是【ELEMENT_SHELL】。


3.3 ANSA中如何检索到实体(Retrieving Entities)

ANSA中有很多方法可以从数据库中检索到Entities,批量检索可以用:
base.NametoEnts:根据名称检索实体
base.CollectEntities:根据其它指定条件检索特定实体
如果只想找到某个单个实体可以用:
base.GetEntity:通过ID找到某个实体

3.3.1 base.CollectEntities的使用示例

例1

例中ents即所有检索到的NASTRAN模块下的PSHELL和PSOLID类型的实体。程序最终会打印出检索到的实体个数。












import ansafrom ansa import basefrom ansa import constants
def main():    #Define the keywords of the entities that you want to collect in a tuple.    #These keywords are taken from the title of their cards.    search_types = ('PSHELL', 'PSOLID')    ents = base.CollectEntities(constants.NASTRAN, None, search_types)    print('Number of entities collected:', len(ents))

例2

例中展示了一种特殊的【通配符字符串】:__PROPERTIES__、__MATERIALS__,它们直接指代了数据库中的所有Property和Material,通过搭配CollectEntities函数可以直接检索出所有的Property和Material,各自存放在all_props中和all_mats中,程序最终会打印检索到的Property的个数Material的个数。







def main():    all_props = base.CollectEntities(constants.NASTRAN, None, '__PROPERTIES__')    print('Number of properties collected:', len(all_props))
   all_mats = base.CollectEntities(constants.NASTRAN, None, '__MATERIALS__')    print('Number of materials collected:', len(all_mats))

例3

此例展示了如何在已有集 合中检索新的对象(即在父类实体集中检索子类实体)。首先所有检索到的SHELL实体被保存到shells中,随后继续在shells中继续检索GRID实体,并保存到grids中。










def main():    #First collect the shells of the whole database.    shells = base.CollectEntities(constants.NASTRAN, None, "SHELL")    print('Number of shells:', len(shells))
   #Then collect the grids of these shells.    grids = base.CollectEntities(constants.NASTRAN, shells, "GRID")    print('Number of grids used from shells:', len(grids))

例4

此例为对例3的扩展。如果不指定子类类型(将第三个参数设为False),我们可以在父类实体集中检索所有类型,适用的父类实体集有SETs、PARTs、Connections。本例即展示了如何在已有的SETs实体中检索所有类型的子实体。










def main():    #Collect the sets of the database.    sets = base.CollectEntities(constants.NASTRAN, None, "SET")    print('Number of sets:', len(sets))
   #Collect all the entities that belong to these sets.    ents = base.CollectEntities(constants.NASTRAN, sets, False)    print('Number of entities in sets:', len(ents))

例5

本例展示了如何在当前可见对象里检索实体。我们只需要将制定一个特殊参数filter_visible为True即可。





def main():    shells = base.CollectEntities(constants.NASTRAN, None, 'SHELL', filter_visible=True)    print('Number of visible shells:', len(shells))

例6

我们来看一个更完整全面的实例。我们需要检索模型中所有x坐标小于某个给定值(val)的节点,并对这些节点的名称进行重新命名,新名称为:“NODE WITH ID: <id> AND XCOORD: <xcoord>”,括号内的参数需要自动填入每个节点自己的信息。我们需要用到两个函数来搭配,一个是CollectEntities,另一个是set_entity_values(也可以用base.SetEntityCardValues)。


















from ansa import basefrom ansa import constants
def rename_nodes(val):    # Collect all nodes    nodes = base.CollectEntities(constants.NASTRAN, None, 'GRID')
   nodes_list = []    for node in nodes:        if node.position[0] < val:            nodes_list.append(node)            name = 'NODE WITH ID: %d AND XCOORD: %.5f' % (node._id, node.position[0])            node.set_entity_values(constants.NASTRAN, {'Name': name})
   print('Number of nodes with x coordinate less than %d: %s' % (val, len(nodes_list)))    return nodes_list

3.3.2 base.NametoEnts的使用示例

我们可以用名称来检索对应的实体。我们需要使用到base.NameToEnts。因为是根据名称检索到的实体,因此实例类型可能不止一种,比如同一个名称可能会检索出材料,也可以检索到一个单元,那么如何把他们区分开来呢,我们搭配使用Entity.ansa_type是可很不错的选择。以下展示根据“Default”这个关键字来检索出所有的实体,并判断,将PSHELL和PSOLID分开保存到不同的列表里。





















def main():    #Collect entities that satisfy the searching pattern    ents = base.NameToEnts("^Default.*")    if not ents:        print('No entities were found.')        return
   pshells = []    psolids = []
   for ent in ents:        #Distinguish the type of entity        if ent.ansa_type(constants.NASTRAN) == "PSHELL":            pshells.append(ent)        if ent.ansa_type(constants.NASTRAN) == "PSOLID":            psolids.append(ent)
   print('The collected PSHELLS:', pshells)    print('The collected PSOLIDS:', psolids)

3.3.3 base.GetEntity的使用示例


通过GetEntity这个关键字的单复数我们就能看出来,这个函数只能找到一个实体。而找到实体的方式也只能通过某个实体的id号来检索。下面这个例子就告诉我们如何找到一个id为100的节点。






def GetSingleEntity():    node = base.GetEntity(constants.NASTRAN, 'GRID', 100)    print('The retrieved node:', node._id)


这里分享一个小技巧。

Property是有很多种类的(比如它可能是一个PSHELL也可以是一个PSOLID),如果你不想具体去指定这个类型,可以用“__PROPERTIES__”这个关键字去代替所有的PROPERTY类型,类似的用法还有“__MATERIALS__”、“__MBCONTAINERS__”,分别用来检索所有的材料和模型树。


3.4 如何创建实体


上面展示了如何找到要修改的实体对象,并如何修改实体的具体参数。接下来讲讲如何创建一个实体。要用到的函数是:base.CreateEntity。需要指出的是,在创建一个实体前,必须先定义好这个实体的具体参数,参数可以打包放在一个字典里。(在创建过程中,有些不是很必要的参数,如果没有被你特殊指定,则会自动被赋值。)以下展示了如何根据一个坐标来创建一个节点。






def CreateGrid():    fields = {'X1': 3.5, 'X2': 10.8, 'X3': 246.7}    new_grid = base.CreateEntity(constants.NASTRAN, 'GRID', fields)    print('The id of the new grid:', new_grid._id)

3.5 数据的管理

在我们检索出一个实体或者创建出一个实体后,我们经常需要将之归类到某个实体集里,比如一个SET里,一个Group里,一个Include里,或者一个Part里等等。下面是一些在非常简单的场景中使用上述实体集的示例。

3.5.1 Model Browser - Parts, Groups

模型浏览器(Model Browser)是一个GUI窗口,用户可以在其中查看所有现有的组和零件(Groups、Parts),以及其中包含的所有实体。为了创建新组或新零件,必须使用函数base.NewGroup和base.NewPart。此外,为了在零件中添加数据甚至在组中添加零件,必须使用函数base.SetEntityPart。

假设我们要创建一个名为“ foo”的组(Group),其中包含一个名为“ bar”的部件(Part),并向其中添加用户可以从ANSA界面中选择的任意数量的单元。下面的示例演示如何实现此目的:



















import ansafrom ansa import base
def main():    # Let the user pick the elements from the interface    elems = base.PickEntities(0, '__ELEMENTS__')    print('Number of elements picked:', len(elems))
   # Create the group and the part    group = base.NewGroup('foo')    part = base.NewPart('bar')
   # Add the part to the group    base.SetEntityPart(part, group)
   # Add the elements to the part    base.SetEntityPart(elems, part)


新生成的Group里有Part,Part里有Element,如下所示。



3.5.2 Includes Manager

子文件管理器(Includes Manager)处理数据库的所有子文件类型的实体,类似于模型浏览器(Model Browser)和零件(Parts)。可以使用base.CreateEntity函数创建子文件。然后使用base.AddToInclude函数将实体添加到任何子文件中。


作为示例,我们可以创建一个子文件并在其中添加一些单元:
















import ansafrom ansa import base
def main():    elems = base.PickEntities(0, '__ELEMENTS__')    print('Number of elements picked:', elems)
   # Create the include entity    include = base.CreateEntity(0, 'INCLUDE')    print('The created Include:', include._id)
   # Add the elements to the include    base.AddToInclude(include, elems)

我们将自己选择的单元添加到一个子文件中,子文件由系统自动命名。结果如下所示:


3.5.3 Sets管理器

SET是一个实体,可以保存任何种类的ANSA实体,以便组织这些数据或对其进行大量操作。为了创建一个集 合,必须使用函数base.CreateEntity,并且为了在其中添加实体,必须使用函数base.AddToSet。


下面显示了一个简单的示例,其中将属性添加到新创建的SET中:

















import ansafrom ansa import basefrom ansa import constants
def main():    # Retrieve the Property    prop = base.GetEntity(constants.NASTRAN, '__PROPERTIES__', 600)
   # Create a set    my_set = base.CreateEntity(constants.NASTRAN, 'SET', {'Name': 'SetWithProp'})    print('The created Set:', my_set._id)
   # Add the property to the set    base.AddToSet(my_set, prop)

我们找到一个编号为100的PROPERTY,并将其放到一个名称为“SetWithProp”的SET里,如下所示:


注意:
如果您要创建一个名称与现有名称相同的集 合,则函数base.CreateEntity()将返回None。这是因为,与许多其他ANSA实体一样,ANSA中的集 合是由其唯一名称而非ID标识的。为了确保始终创建集 合,可以成功实现新建实体功能,该函数在集 合名称的末尾附加一个递增的数字:




















import ansafrom ansa import basefrom ansa import constants
def create_set(name):    my_set = base.CreateEntity(constants.NASTRAN, 'SET', {'Name': name})
   n = 1    while not my_set:        my_set = base.CreateEntity(constants.NASTRAN, 'SET', {'Name': name + str(n)})        n += 1
   return my_set


name = "test"create_set(name)

这样每次运行程序都会成功,名称则以此增加尾号以示区别,如下所示:


为了完成本教程,我们来看一个结合了上述API函数的示例。


首先假设,我们想找到x坐标小于1600的所有节点,并相应地重命名它们,如前面的示例所示。然后,我们希望将所有这些标识的节点添加到名为“ MyTempSet”的集 合中,但我们还要确保始终创建此集 合(要避免命名冲突)。

































import ansafrom ansa import basefrom ansa import constants
def _create_set(name):    my_set = base.CreateEntity(constants.NASTRAN, 'SET', {'Name': name})
   n = 1    while not my_set:        my_set = base.CreateEntity(constants.NASTRAN, 'SET', {'Name': name + str(n)})        n += 1
   return my_set
def _rename_nodes(val):    nodes = base.CollectEntities(constants.NASTRAN, None, 'GRID')    nodes_list = []    for node in nodes:        if node.position[0] < val:            nodes_list.append(node)            name = 'NODE WITH ID: %d AND XCOORD: %.5f' % (node._id, node.position[0])            node.set_entity_values(constants.NASTRAN, {'Name': name})
   return nodes_list
def main():    nodes = _rename_nodes(1600)    my_set = _create_set('MyTempSet')    base.AddToSet(my_set, nodes)
main()


以上程序运行就可以得到得到以下的结果,新建了一个MyTempSet的SET组,并把所有X坐标小于1600的节点保存在其中。



相应的所有被选中的节点也被改了名字。



要注意的是,我们为函数base.AddToSet()提供了一个包含所有节点的列表。这与将检索到的每个实体对象都调用函数相比,将所有实体对象收集到列表中并仅调用一次函数要快得多。


通常,提供实体对象列表并且仅调用一次函数时,其工作速度会大大提高。


来源:CAEer
LS-DYNA二次开发ANSA材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-27
最近编辑:1年前
团长
硕士 | 白车身结构设... 专注ANSA使用技巧-微信公众号『C...
获赞 114粉丝 929文章 135课程 6
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈