首页/文章/ 详情

getMask()讨论:Abaqus Part对象的成员变量常用函数

1年前浏览607

    最近工作之余,想制作一个自动对多cell的Part进行skin并建立相应set的小插件。我的目的是对该Part中各个cell分别进行skin,以便于将来赋予不同的属性。这样可以有效的减少输出结果文件的大小。

    本以为这应该是一个极其简单的小问题,不会浪费我太多的精力。但是当开始写程序的时候才发现一个巨大的坑点:Part对象的Skin函数不接受列表类型的参数或者数组类型的参数,它只接受ABAQUS特定的几何数组类型或者序列类型,按理说list类型属于序列类型,但是该函数并不接受。如果通过getSequenceFromMask生成可用faces,mask究竟如何获得又是一个问题。

    mask为什么难以获得呢?因为getMask()函数是FaceArray对象的成员函数,而该对象的建立是通过part对象建立的(p.faces),它会生成所有faces的合集(比如[0,1,2,3,4,5,6]),而我要进行skin的cell只包含这些faces中的一部分,并且编号是随机的不可预测的,但是组成该cell的face编号可以通过c.getFaces()((2,3.4,5))。按照我最初的想法,我有了这些面的ID号,把它们从p.faces中读取出来重新组合就可以了,但是组合完成的类型是list,Skin函数不接受它作为参数。我尝试了多种方法均不能将最终的结果转化成Skin可以使用的格式。并且由于组合后的不是abaqus的几何数组类型,所以它并没有getMask()方法,也就无法通过该方法获得可以使用的mask。

    无奈之下只好使用getSequenceFromMask函数,这就要解决一个麻烦的问题:getSequenceFromMask的mask值究竟怎么来?目前看来唯一的办法就是解密getMask()函数。(未知原因,公司网络连接不了ABAQUS帮助文件。)

 我使用如下命令获取目标part的faces信息,得知共有47个面:

>>> p = mdb.models['G101ABS'].parts['G101ABS-qiaoguan-banhuang-1']

>>> f = p.faces

>>> len(f)

47

>>> 

我想先看一下,如果我想选择所有面,mask是多少:

>>> f.getMask()

("('[#ffffffff #7fff ]',),",)

>>> 

好吧,我看出来了这是一个十六进制的东西,但是完全搞不明白这堆乱码究竟怎么来的...

我想看看编号是0的面的mask是多少:

>>> f0=f[:1]

>>> f0.getMask()

("('[#1 ]',),",)

>>> 

我想看看编号是1的面的mask是多少:

>>> f1=f[1:2]

>>> f1.getMask()

("('[#2 ]',),",)

>>> 

不出所料,那么编号2的面mask会是3吗:

>>> f2=f[2:3]

>>> f2.getMask()

("('[#4 ]',),",)

>>> 

好吧竟然是4,那么编号3的面mask会是多少呢?

>>> f3=f[3:4]

>>> f3.getMask()

("('[#8 ]',),",)

>>> 

那么编号4的面mask会是多少呢?

>>> f4=f[4:5]

>>> f4.getMask()

("('[#10 ]',),",)

>>> 

好吧不出意外是16(说过啦,mask是十六进制的)。这让我想起了初中数学对我来说噩梦难度的找规律填数字问题。这到底是一个什么规律呢?各位客官也许已经有了发现,不如让我试试编号是[1,2,3]组合的mask是多少吧:

>>> f123=f[1:4]

>>> f123.getMask()

("('[#e ]',),",)

>>> 

结果是e(14),非常漂亮的2+4+8。

到这里大家可以想象一下:有一根导线将这47个face按照顺序串在一起,每一个face都是一个小灯泡,你需要哪个,哪个就亮而其余的都是暗的,然后它们组成了美丽的二进制数字:所以1是1,01是2,001是4,0001是8,00001是16,0111是14。规律好像被我们找到了。不过还有一个问题啊,还记得这个吗?

>>> f.getMask()

("('[#ffffffff #7fff ]',),",)

>>> 

这个#ffffffff #7fff 是什么鬼啊?哦哦,应该是ABAQUS希望每32个灯泡一组吧?那就试试吧,看看32号面(第33个面,因为第一面的id是0)的mask是多少吧,应该会是# #1 吧?

>>> f32=f[32:33]

>>> f32.getMask()

("('[#0 #1 ]',),",)

>>> 

好的,没问题!到这里我应该是顺利的找出了getMask()的计算方法了,但是我还是不会设置ABAQUS特有的几何数组唉,那只能自己制作一个getmask函数来代替getMask函数来生成期待已久的mask啦。getmask()函数接受正整数list类型参数生成该list的mask。

通过实践顺利完成了对多cell的part进行逐一skin的功能。

等等,还有一个大问题,这些cell都是有公用面的,那么skin出来的face再赋予属性,岂不是相当于公用面赋予了多余的属性?如此看来,还需要对c.getFaces()生成的list进行更进一步的剔除相同项之后再使用自己的getmask函数。这样就完美了。

来源:SimCoder
Abaqus
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-02-02
最近编辑:1年前
签我的导演他姓张
本科 怕什么真理无穷进一寸有一寸欣喜
获赞 47粉丝 39文章 44课程 0
点赞
收藏
未登录
还没有评论

课程
培训
服务
行家

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