mottosso / cmdx

Fast and persistent subset of maya.cmds
https://mottosso.com/cmdx
BSD 2-Clause "Simplified" License
193 stars 36 forks source link

attributes' default value not saved in scene #34

Open benblo opened 4 years ago

benblo commented 4 years ago

If I create an attribute with a default value, but don't change it, the value is lost after saving & reloading the scene. I don't know if it's by design or not, but I do see the default value I set appear correctly in the attribute editor, so it's extremely confusing to have the attribute be wiped after reloading the scene.

Here's an all-in-one example:

# create new scene, no prompt
cmds.file(new=True, force=True) # new file, no prompt

sphere = cmdx.encode(cmds.sphere()[0])
sphere.add_attr(cmdx.String("string_1", default="1"))
sphere.add_attr(cmdx.String("string_2", default="2"))
sphere.add_attr(cmdx.String("string_3", default="3"))
sphere["string_1"] = "1a"  # will be saved
sphere["string_2"] = "2"   # will be lost!
                           # string_3 will also be lost!

# save & reload scene, no prompt
scene_path = "test.ma"
cmds.file(rename=scene_path)
cmds.file(save=True, type="mayaAscii")
cmds.file(scene_path, open=True, force=True)
wougzy commented 4 years ago

That's probably because Maya doesn't support default values for non numeric types. You can't even do that manually.

String.default() should be removed to avoid confusion (or at least removed at addAttr)

mottosso commented 4 years ago

Strange that it assigns the value at all. :/

We could remove it, but I think we should handle it instead. No reason this shouldn't work other than a Maya API limitation, and we can just regularly assign it post-creation to keep all attributes uniform and working as expected.

Anyone interested in tackling this?

benblo commented 4 years ago

I have a workaround already, it’s ugly but I can kick a PR tomorrow-ish. What’s weird is the OM API accepts the default for TypedAttr, it’s even custom handled by cmdx to convert the python str to MObj (plus reassigning the same value doesn’t trigger a dirty so the default is tracked)... so it really looks like it should work, it’s just not saved in scene.