mayamel

Can you alter a Custom Attribute's enum list in Maya?


I'm adding a custom attribute that is an enum list to some of my nodes. I can easily do this with addAttr. But I don't see a way to later add a new enum value or change the enum list. Is that possible?

I have found a way to do this but it seems there should be an easier way. For my workaround, if the attribute exists I grab its value and delete the attribute. Then I add the revised attribute back into the node and set its value to the old value. By changing $enumValues I can edit the list of enums. (Note I only plan to add values not delete values) This script demonstrates my workaround:

string $attrName = "MaterialType";
string $enumValues = "Water:Sky:Terrain:Building:Road:";
string $selected[] = `ls -sl`;
if(`size $selected` == 1)
{
    string $attrFullName = $selected[0]+"."+$attrName;
    $existingValue = 0;
    if(attributeExists($attrName, $selected[0]))
    {
        $existingValue = `getAttr $attrFullName`;
        deleteAttr $attrFullName;
    }   
    addAttr -ln $attrName -at "enum" -en $enumValues $selected;
    setAttr $attrFullName $existingValue;
}
else
{
    print "You must have 1 object and only 1 object selected\n";
};

Worth mentioning, if I run this script it does change the enum's values but these changes don't show up in Maya's interface until I close the file and reopen the file.

Any suggestions on how to do this more gracefully would be appreciated.


Solution

  • What you're doing - deleting the attribute and re-adding -- is unfortunately the only way to do this. Maya enums are pretty lame.

    The attribute should be working correctly after the script is done - you may need to deselect and reselect it to properly refresh the attribute editor. You can check it with an listAttr -ud on your object after the script runs - you should see your attribute name in the results, even if the UI has not refreshed.