今天群里又有需求为查询属性的默认值,即在创建属性时设置的default值。我本回想起以前在哪听说过获取属性默认值需要用到api,用在一些常规属性操作命令中确实也只看到getMax或者getMin等标志。即便在修改属性的编辑器窗口中也没有修改默认值的地方。在国内外翻遍了搜索引擎问遍了各个群聊,卡了一天后终于找到几种获取方法了。鉴于国内外都没有太多相关代码示例,遂做此文章以便后来者参考。
cmds:
虽然在getAttr中没有相关标志,其实我们可以逆向思维。在设置属性时,肯定有标志可以填写默认值,而这个标志有可能支持-q来查询。所以我们可以去cmds.addAttr中查找,果不其然,在其标志中的defaultValue(dv)支持查询。我们可以直接使用它来查询属性默认值。
import maya.cmds as mc
#假设我已经拥有一个曲线且为它添加了属性为aaa的浮点型属性,且默认值为3。
print mc.addAttr('nurbsCircle1.aaa', q = 1, dv = 1)
>>>3.0
除此之外,还可以用更专业的命令attributeQuery来查询,这个命令的使用方法还于一般方法不同。
import maya.cmds as mc
#假设我已经拥有一个曲线且为它添加了属性为aaa的浮点型属性,且默认值为3。
print mc.attributeQuery('aaa', n = mc.ls(sl = 1)[0], ld = 1)
>>>[3.0]
这里返回的是一个列表,但其元素仍然是浮点。如果你是是用的其它类型的属性,也可以直接使用这两个命令来查询。
maya.api
使用api时就比较复杂了。首先需要将节点转为一个mobject对象,再用这个对象的某属性来得到默认值。
由此我们分成三部:1.将节点生成MObject对象
2.生成属性对象
3.通过属性对应的类型指针来承接默认值并读取
import pymel.core as pm
import maya.OpenMaya as om
pm_node = pm.ls(sl = 1)[0]
api_node = pm_node.__apimobject__()
getDefault方法属于MFnNumericAttribute命令,实例化这个命令需要一个属性对象。
import pymel.core as pm
import maya.OpenMaya as om
pm_node = pm.ls(sl = 1)[0]
api_node = pm_node.__apimobject__()
node_n = om.MFnDependencyNode(api_node)
plug_n = node_n.findPlug('aaa')
numFn = om.MFnNumericAttribute(plug_n.attribute())
随即我们需要实例化一个指针来承接返回的默认值。但指针有多钟类型,需要使用对应的指针类型才能承接到默认值,如int类型和float类型不是同一个指针类型。这里示例的默认值是浮点类型,所以指针使用double类型。
import pymel.core as pm
import maya.OpenMaya as om
pm_node = pm.ls(sl = 1)[0]
api_node = pm_node.__apimobject__()
node_n = om.MFnDependencyNode(api_node)
plug_n = node_n.findPlug('aaa')
numFn = om.MFnNumericAttribute(plug_n.attribute())
float_tul = om.MScriptUtil()
u_ptr = float_tul.asDoublePtr()
numFn.getDefault(u_ptr)
print om.MScriptUtil.getDouble(u_ptr)
>>>3.0
相关api方法可以访问这里 ,使用其它as…ptr类型指针可以获取其它默认值。
由此,api和cmds两种方法都示例完毕,如果你对此感兴趣,可以下载我的示例代码进行实验。链接在下方。