• Maya 属性关于 writable, readable, connectable, hidden 的一些说明


    我们知道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,后续正在改进。如果大家用到这些标记的话,就一定要注意下。另外,如果这个问题修复掉后,我也会及时通知大家:)

    祝大家开发好运!

  • 相关阅读:
    C#的拓展方法
    敲代码
    获取GridView的rowdata
    C#为控件增加或删除委托
    ul嵌套ul IE7下空白行解决方案
    C#设置日期为指定的月份和日子
    web多选上传插件Uploadify
    如何通过key获取value值,键找值!多线程单利模式 3月15日第三版 希望各位路过的高手批评指正 给出更优秀的代码方便后来人
    IE条件语句,IE hack大全
    实现“记录用户登录时间和退出时间,同时记录用户IP,并且要记录用户IP对应的省和城市地址”
  • 原文地址:https://www.cnblogs.com/johnonsoftware/p/3573278.html
Copyright © 2020-2023  润新知