getMask()函数探讨:Abaqus Part对象常用成员函数

最近工作之余,想制作一个自动对多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函数。这样就完美了。

OK,通过如上的介绍,相信有心人完全可以自己解决这个小问题。附件就是这个小插件啦。期待各位的使用反馈。

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空