How to insert a shader UserData field
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 25/11/2012 at 03:26, xxxxxxxx wrote:
Hi People.
I am trying to insert a shader field into the UserData of an object. It almost works, but there is a problem I could not yet solve. The UserData field is inserted successfully and shows up in the Attribute Manager. But I cannot insert a shader into it, it just doesn't work. When viewing the field in the UserData manager, I can see the "Interface" part missing.
"Shader Field" was inserted by my code, "Data" was inserted using the UserData manager.
This is the exact code I use:
def add_shader_pressed(self, op) : name = c4d.gui.RenameDialog('Shader Field') if not name: return accept = c4d.BaseContainer() accept.SetString(c4d.Tbaselist2d, "") container = c4d.BaseContainer() container.SetString(c4d.DESC_NAME, name) container.SetString(c4d.DESC_SHORT_NAME, name) container.SetLong(c4d.DESC_VERSION, c4d.DESC_VERSION_ALL) container.SetBool(c4d.DESC_ANIMATE, True) container.SetLong(c4d.DESC_CUSTOMGUI, c4d.CUSTOMGUI_TEXBOX) container.SetContainer(c4d.DESC_ACCEPT, accept) container.SetBool(c4d.DESC_SCALEH, True) container.SetLong(c4d.DESC_PARENTGROUP, c4d.ID_USERDATA) # Search for a free UserData id. free_id = 1 userdata = sorted(op.GetUserDataContainer(), key=lambda x: x[0][0].id) for id, data in userdata: uid = id[1].id if uid >= free_id: free_id = uid + 1 # Insert the shader field into the objects' UserData. descid = c4d.DescID(c4d.DescLevel(700), c4d.DescLevel(free_id)) success = op.SetUserDataContainer(descid, container) if not success: c4d.gui.MessageDialog('fatal error, could not insert userdata.')
What am I missing?
Thanks in advance,
NiklasUPDATE: Solution
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 25/11/2012 at 03:38, xxxxxxxx wrote:
I also noticed that UserData created with this code is not accessible from XPresso, although I have
added the following lines to the code:container.SetBool(c4d.DESC_INPORT, True) container.SetBool(c4d.DESC_OUTPORT, True)
Update: When I use the container of an existing UserData field and insert it as a new field, it works..
-Nik
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 25/11/2012 at 08:14, xxxxxxxx wrote:
Nevermind, I figured it out.
def add_shader_pressed(self, op) : name = c4d.gui.RenameDialog('Shader Field') if not name: return accept_shaders = c4d.BaseContainer() accept_shaders.SetString(c4d.Xbase, "") container = c4d.GetCustomDataTypeDefault(c4d.DTYPE_BASELISTLINK) container.SetString(c4d.DESC_NAME, name) container.SetLong(c4d.DESC_CUSTOMGUI, c4d.CUSTOMGUI_TEXBOX) op.AddUserData(container)