我们知道Maya属性有多个性质,比如是否是数组之类的等等,但是其中有几个属性:writable, readable, connectable, hidden 却是比较容易混淆的,而且事实上,Maya自身对这几个属性也没有处理的很好,内部有一个Bug正在处理这个问题。
让我们来看下目前Maya这几个属性的现状和功能:
Writable: 字母意思很容易理解,设置属性是否可写,参考开发文档,表示这个属性是否可以作为连接的目标属性,另外也提到,如果这个属性的writable 为false的话,setAttr 是无法改变属性值的,事实是否如此呢?我做了一个简单的实验,结果如下:
sphere -n earth;
addAttr -sn t1 -ln test1 -w 0 -r 0 -h 0;
getAttr earth.t1;
// Result: 0 //
setAttr earth.t1 8;
getAttr earth.t1;
// Result: 8 //
connectAttr earth.t1 pPlane1.translateX;
// Error: line 1: Connection not made: 'earth.test1' -> 'pPlane1.translateX'. Source attribute must be readable. //
// Error: line 1: The attribute 'earth.test1' cannot be connected to 'pPlane1.translateX'. //
connectAttr pPlane1.translateX earth.t1;
// Error: line 1: The attribute 'pPlane1.translateX' cannot be connected to 'earth.test1'. //
我们可以发现,确实,该属性不能作为连接的目标属性了,但是setAttr 确依然能起作用。
Readable: 和writable类似,表示这个属性是否可以作为连接的源属性,如果为false的话,那从上面的例子可以看到,是无法作为源属性来连接了,这个是没有问题的,但是同样要注意的是,getAttr 依然能够作用在该属性上。
Hidden: 该属性是用于设置是否能够在属性编辑器上显示,但是要注意的是,参考我们上面的例子,虽然我设置了Hidden 为false,也就是说该属性能够显示,但是结果在属性编辑器中却没有显示出来,这是为什么呢?查看了代码,原来要想显示的话,必须同时具备两个条件,第一是Hidden属性为false,这个上面例子test1属性是符合的,但另外一条是该属性必须是可写的,也就是说writable必须要为true,那这条就不符合了,所以没有显示出来。也就说是,只要这个属性writable 是false,那不管Hidden 是什么值,都不会显示。
Connectable: 这个标记在Mel命令addAttr 中没有暴露出来,但是我们可以用MFnAttribute::setConnectable () 函数初始化的时候去设置,这个是什么意思呢?表明了函数是否可以连接,但是事实上,这个标记没有起到应有的作用,我们参看以下Python代码例子:
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
#- create numeric test attribution
nAttr = OpenMaya.MFnNumericAttribute()
test2 = nAttr.create( "test2", "t2", OpenMaya.MFnNumericData.kDouble, 0.0 )
nAttr.setStorable(0);
#nAttr.setWritable(0);
#nAttr.setReadable(0);
nAttr.setConnectable(0);
nAttr.setHidden(0);
#- create a sphere and get it
cmds.sphere( name='earth' )
mObj1 = OpenMaya.MObject()
mSel = OpenMaya.MSelectionList()
mSel.add("earth")
mSel.getDependNode(0,mObj1)
#- use MDagModifier to add dynamic attribute to the Maya Node.
dagModifier = OpenMaya.MDagModifier()
dagModifier.addAttribute(mObj1, test2)
dagModifier.doIt()
创建了test2 属性后,我们还是做和上面一样的连接,结果是:
connectAttr pPlane1.translateX earth.t2;
// Error: line 1: The attribute 'earth.test2' cannot be connected to 'pPlane1.translateX'. //
connectAttr earth.t2 pPlane1.translateX;
// Result: Connected earth.test2 to pPlane1.translate.translateX. //
可以做为源属性来连接,却不能作为目标属性来连接,而此时的readable 和writable 都为true.
addAttr -q -w earth.t2;
// Result: 1 //
addAttr -q -r earth.t2;
// Result: 1 //
大家可能要问,那这个connectable是用来干嘛的呢?为啥会这样?其实,我前面也提到过了,这个行为是一个不一致的行为,也是Maya内部的一个Bug,后续正在改进。如果大家用到这些标记的话,就一定要注意下。另外,如果这个问题修复掉后,我也会及时通知大家:)
祝大家开发好运!