Quantcast
Channel: mel wiki
Viewing all articles
Browse latest Browse all 610

PyMel : enum attr access

$
0
0
There's enough complexities with enum attrs they deserve their own section.
Code used in the next sessions:
node = pm.PyNode("null1")
attrName = "myEnum"
enumVals = ["one", "two", "three", "four"]

Add an enum attr:

Note you have to pass in some default value to the enumName arg, or later calls will fail.
pm.addAttr(node, longName=attrName, attributeType="enum", keyable=True, enumName="null")

Query enum attr values:

This query returns an unordered PyMel EnumDict
currentVals = node.myEnum.getEnums() 
This query returns an ordered list:
# attributeQuery returns ["one:two:three:four"]
strVals = pm.attributeQuery(attrName , node=node, listEnum=True)[0]
listVals = strVals.split(":")

Replace the values of the enum attr.

To append, you'd first need to query what was there, and add to it. You must make a string of values separated by colons:
"one:two:three:four" :
enumStr = ":".join(enumVals)
node.myEnum.setEnums(enumStr)

Query the keyframed values of an enum attr:

This creates a list of (frame, enumName) pairs:
keyTimes = pm.keyframe(node.attr(attrName), query=True, timeChange=True)
keyVals = [int(val) for val in pm.keyframe(node.attr(attrName), query=True, valueChange=True)]

strEnumVals = pm.attributeQuery(attrName, node=node, listEnum=True)[0]
listEnumVals = strEnumVals.split(":")
keyedEnumVals = [listEnumVals[i] for i in keyVals]

timeEnumPairs = zip(keyTimes,keyedEnumVals)
print timeEnumPairs
# [(1.0, u"one"), (15.0, u"four"), (35.0, u"two")]
This returns the enum's string value at the current frame:
pm.getAttr(node.attr(attrName), asString=True)
# two

Viewing all articles
Browse latest Browse all 610

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>