There's enough complexities with
Code used in the next sessions:
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 theenumName
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 EnumDictcurrentVals = 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