On 04/01/2017 at 13:37, xxxxxxxx wrote:

Hello there,

I have two questions concerning the script below:

import c4d, os  
from c4d import plugins, bitmaps  
PLUGIN_ID = 1938333  
def CreateUDGroup(obj, name, parentGroup=None, columns=None, titlebar=1, shortname=None) :  
def CreateUDText(obj, name, parentGroup=None, CustomGUI=None, val=None, shortname=None) :  
class Text(plugins.ObjectData) :      
  def GetVirtualObjects(self, op, hierarchyhelp) :  
      **UD = op.GetUserDataContainer()  
      if UD == [] :**  
          TexelGroup = CreateUDGroup(op,"Text",c4d.DescID(0))  
          text = CreateUDText(op,"Text", TexelGroup, c4d.CUSTOMGUI_STRINGMULTI, "Text")  
if __name__ == "__main__":  
  dir, file = os.path.split(__file__)  
  help = ""  
  icon = bitmaps.BaseBitmap()  
  icon.InitWith(os.path.join(dir, "res", "Text.tif"))  
  plugins.RegisterObjectPlugin(id=PLUGIN_ID, str="Text",  
                              description="TGP", icon=icon,  

Frst question : when the object "Text" is generated the default opened menu is "Basic", How I can set the menu "Text" to default. (See screenshot below)

Second question: I have added the condition   below  to prevent the adding user data every time when I select my object in object manager.

UD = op.GetUserDataContainer()  
if UD == [] :

Is there other way to do that?


On 04/01/2017 at 15:34, xxxxxxxx wrote:

For your second question GetUserDataContainer() Always return a list. So your syntax is equivalent to

if isinstance(UD, list) :

So for your need just make

if not len(UD) :
#doing if not is like if len(UD) == 0 but quicker to write

About the first one it must be possible but not sure wait for another people :)

On 04/01/2017 at 16:07, xxxxxxxx wrote:

Thanks Bro! :thumbsup:

On 05/01/2017 at 07:04, xxxxxxxx wrote:


Adding user data to an Object in ObjectData.GetVirtualObjects() isn't a common worklow.
Why not use normal parameters defined in resource instead?

On 05/01/2017 at 10:13, xxxxxxxx wrote:

Originally posted by xxxxxxxx


Adding user data to an Object in ObjectData.GetVirtualObjects() isn't a common worklow.
Why not use normal parameters defined in resource instead?

I don't know how I can do that.
Have you any idea concerning the first question?

On 05/01/2017 at 12:23, xxxxxxxx wrote:

There is an SDK plugin example called Py_RoundedTube that uses resources for the plugin's attributes that you can look at for references.

As for User Data. The c4d.DESC_DEFAULT id can be used to set the active tab.
Here's a short example of that in a script:

#This is how to change the UserData tab to a different name  
#The TAB will be the topmost group. So any gizmos will need to reference it using: GetUserDataContainer()[0][0]  
import c4d  
def main() :  
  obj = doc.GetActiveObject()  
  if not obj: return False  
  #The topmost group will be the AM TAB itself  
  Groupbc = c4d.GetCustomDatatypeDefault(c4d.DTYPE_GROUP)  
  Groupbc[c4d.DESC_PARENTGROUP] = c4d.DescID(0)  #<---Points to the tab's ID  
  Groupbc[c4d.DESC_NAME] = "My Group"            #<---The text displayed in the TAB instead of UserData  
  Groupbc[c4d.DESC_TITLEBAR] = True  
  Groupbc[c4d.DESC_DEFAULT] = True    #Makes this new AM tab selected  
  #Puts a Real type UD entry into this group  
  Grp_Item = c4d.GetCustomDatatypeDefault(c4d.DTYPE_REAL)  
  Grp_Item[c4d.DESC_NAME] = "My Real"  
  Grp_Item[c4d.DESC_PARENTGROUP] = obj.GetUserDataContainer()[0][0]  
  obj[obj.AddUserData(Grp_Item)] = 55.6      
if __name__=='__main__':  


On 15/03/2017 at 21:02, xxxxxxxx wrote:


Is the first question solved?


On 16/03/2017 at 03:56, xxxxxxxx wrote:

Originally posted by xxxxxxxx

Is the first question solved?

The first question was:

Originally posted by xxxxxxxx

when the object "Text" is generated the default opened menu is "Basic", How I can set the menu "Text" to default.

It doesn't make sense and also there's no way to change the "Basic" tab page title.
This tab is handled by Cinema in the base list resource and this is the standard title.

On 16/03/2017 at 08:20, xxxxxxxx wrote:


In the past,I also think that there is no way to change. but  recently, I saw a lot of .res files,I changed my view. In fact,it can change through .res file,as long as we add an "DEFAULT 1;" to the  group,like this:

CONTAINER Oeselectionmap  
  NAME    Oeselectionmap;  
  INCLUDE Obase;  
       DEFAULT 1;  
          MIN 0.0;  
          MAX 100.0;  
          MINSLIDER 0.0;  
          MAXSLIDER 100.0;  
          UNIT      PERCENT;  

Best wishes!

On 17/03/2017 at 08:10, xxxxxxxx wrote:

Sorry, I misunderstood the initial question.
It was about changing the active tab page to a user data group, which was created in an object plugin's GetVirtualObjects().
But it's not recommended to add user data to an object plugin in its GetVirtualObjects(). Also it does not make sense to change the GUI from such function.

As you found, this can be done with the DEFAULT flag in a description resource.
Also, if not in a node plugin, c4d.gui.ActiveObjectManager_SetObject() can be used to set the active object/material/tag etc. in the Attribute Manager and its selected page.