Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    OBJECT GENERATOR and User Data

    Scheduled Pinned Locked Moved PYTHON Development
    10 Posts 0 Posters 787 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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",  
                                    g=Text,  
                                    description="TGP", icon=icon,  
                                    info=c4d.OBJECT_GENERATOR)
      

      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?

      Thanks.

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        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 🙂

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

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

          Thanks Bro! 👍

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

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

            Hi,

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

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

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

              Originally posted by xxxxxxxx

              Hi,

              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?
              Thanks.

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                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  
                  obj.AddUserData(Groupbc)  
                  
                  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      
                  
                  c4d.EventAdd()  
                  
                if __name__=='__main__':  
                  main()
                

                -ScottA

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

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

                  Hi,

                  Is the first question solved?

                  Ching

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    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.

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

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

                      Hi,Yannick.

                      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;  
                        
                        GROUP        SELECTION_EFFECTOR_GROUPEFFECTOR  
                        {  
                             DEFAULT 1;  
                        
                            REAL    SELECTION_EFFECTOR_STRENGTH  
                            {  
                                MIN 0.0;  
                                MAX 100.0;  
                                MINSLIDER 0.0;  
                                MAXSLIDER 100.0;  
                                UNIT      PERCENT;  
                                CUSTOMGUI REALSLIDER;  
                            }  
                      

                      Best wishes!
                      Ching

                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

                        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.

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post