此前的文章介绍过ANSA的API,介绍过ANSA中的Python语言基础,也介绍了如何使用Script Editor进行脚本调试,如何用ANSA调用自编脚本。。。如此我们便已经基本具备了利用ANSA进行二次开发的能力了。基于此,我们来牛刀小试。用脚本的方式来实现材料定义。
【背景】首先,大家是否有过这样的感受,例如在做碰撞、白车身强度等分析时,我们要对整个模型进行材料赋值时,面临几百个Property,得挨个点击鼠标,每个Property分配特定的材料ID。那么有没有办法能够一键完成上面的操作,解放双手呢?【2】、ansa.base.CollectEntities(deck, containers, search_types, recursive, filter_visible, prop_from_entities, mat_from_entities, model_browser_filter, no_expand_types)这个函数相当重要,在脚本开发中会用得较多,它相当于一个收集器,将我们需要的收集的如prop、node、element等放入一个列表中,接下来就可以用for循环遍历来对该列表中的每一个元素进行同样的操作了。一般只需要设置前3个参数,deck是第一个参数,可将deck设置成当面的模块,如LS-DYNA模块下则为constants.LSDYNA,ABAQUS模块下则为constants.ABAQUS,以此类推;第2个一般设置为None;第3个设置我们需要收集的数据类型,如,LSDYNA模块下收集单元element则为ELEMENT_SHELL(可以用对应的info命令查看相关类型的指定关键字),其余的参数可以自行查阅并探索其中的用法哦。现在我们拿收集单元示范下,先编辑以下代码并保存为【xxxxx.py】文件,然后按图1所示通过Load Script导入刚刚创建的py文件,可以看到图3所示按钮,单击收集单元,此时界面左下角显示图4信息。根据代码,第1次打印的是一个列表,for循环后面是打印的列表的每个元素。import ansa
from ansa import base
from ansa import constants
@ansa.session.defbutton("测试", "收集单元")
def test():
elems = base.CollectEntities(constants.LSDYNA, None, 'ELEMENT_SHELL')
print(elems)
for elem in elems:
print(elem)
【2】、ansa.base.GetEntityCardValues(deck, entity, fields)第1个参数同上一个函数,示例中我们暂设为constants.LSDYNA,第2个参数设置为elem(这里为一个变量),第3个参数设置我们需要获得的数据(为1个元祖)。现在我们要获得每个单元所在的PID,如图4(一个prop的所有单元应该都是有同一个PID号,此例子应该都为20000008),代码如下:import ansa
from ansa import base
from ansa import constants
@ansa.session.defbutton("测试", "获取PID")
def test():
elems = base.CollectEntities(constants.LSDYNA, None, 'ELEMENT_SHELL')
for elem in elems:
val = base.GetEntityCardValues(constants.LSDYNA, elem, ('PID',))
print(val.get('PID'))
【3】、ansa.base.SetEntityCardValues(deck, entity, fields, items, debug)用法和第2个函数类似,前两个参数和第二个一样,第3个参数为一个字典形式的数据,用于更新数据,现在我们将上面所有单元的PID更改为10000,代码如下:import ansa
from ansa import base
from ansa import constants
@ansa.session.defbutton("测试", "修改PID")
def test():
elems = base.CollectEntities(constants.LSDYNA, None, 'ELEMENT_SHELL')
for elem in elems:
base.SetEntityCardValues(constants.LSDYNA, elem, {'PID': 10000})
介绍完以上3个函数,可以直接上今天的主角了,废话不多说了,上代码吧,LS-DYNA模板下更新材料属性。
import ansa
from ansa import base
from ansa import constants
@ansa.session.defbutton("脚本", "更新材料属性")
def auto_update_mat():
"""
更新材料属性
"""
sets = ['SECTION_SHELL', 'SECTION_SOLID']
props = base.CollectEntities(constants.LSDYNA, None, sets)
# 获取每个part的名称
for prop in props:
val = base.GetEntityCardValues(constants.LSDYNA, prop, ('Name',))
prop_name = val.get('Name')
# 更新材料部分
if prop_name.find('DC01') > -1:
mid = 10001 #DC01材料所对应的材料ID号
elif prop_name.find('DC03') > -1:
mid = 10002
elif prop_name.find('DC04') > -1:
mid = 10003
elif prop_name.find('DC06') > -1:
mid = 10004
elif prop_name.find('B250P1') > -1:
mid = 10005
elif prop_name.find('Patch') > -1:
mid = 10006
elif prop_name.find('Spot') > -1:
mid = 10007
else:
mid = 10001
base.SetEntityCardValues(constants.LSDYNA, prop, {'MID': mid})
# 更新属性部分
if prop_name.find('T0070') > -1:
pid = 1001 #0.7mm属性所对应的属性ID号
elif prop_name.find('T0080') > -1:
pid = 1002
elif prop_name.find('T0100') > -1:
pid = 1003
elif prop_name.find('T0120') > -1:
pid = 1004
elif prop_name.find('T0140') > -1:
pid = 1005
elif prop_name.find('T0150') > -1:
pid = 1006
elif prop_name.find('Patch') > -1:
pid = 1007
elif prop_name.find('Spot') > -1:
pid = 1100
else:
pid = 1001
base.SetEntityCardValues(constants.LSDYNA, prop, {'SECID': pid})
通过如上的代码,我们便可以根据零件的PROPERTY名称,匹配相应的材料属性卡片,实现零件的材料赋值。