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
    • Recent
    • Tags
    • Users
    • Login

    XRAY not working in ObjectPlugin

    Scheduled Pinned Locked Moved PYTHON Development
    8 Posts 0 Posters 536 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 11/09/2013 at 11:08, xxxxxxxx wrote:

      I'm trying to set the XRay parameter of a sphere created with an ObjectPlugin.
      However, it is not working in R13, R14 or R15?
      Note: Changing the radius in working.

      Here is the code:

      import c4d, os, sys
      from c4d import bitmaps, documents, gui, modules,  plugins, utils
        
      PXRAY = 1027
      PPREVIEWSIZE = 1028
        
      class C4DEnvironment(plugins.ObjectData) :
        
          def Init(self, op) :
              op[PXRAY] = False
              op[PPREVIEWSIZE] = 150
              return True
              
          def GetVirtualObjects(self, node, hierarchyhelp) :
          
              doc = documents.GetActiveDocument()
             
              c4dnull = c4d.BaseObject(c4d.Onull)
              c4dnull[c4d.ID_BASELIST_NAME] = "C4Dome"
        
              preview = c4d.BaseObject(c4d.Osphere)
              preview.InsertUnder(c4dnull)
        
              preview[c4d.ID_BASEOBJECT_XRAY] = node[PXRAY]   
              preview[c4d.PRIM_SPHERE_RAD] = node[PPREVIEWSIZE]
        
              return c4dnull
                  
      if __name__ == "__main__":
        
          pluginstr = "XRAY TEST"
        
          path, file = os.path.split(__file__)
          bmp = bitmaps.BaseBitmap()
          bmp.InitWith(os.path.join(path, "res", "lonlatsweep.tif"))
        
                                      
          okyn = plugins.RegisterObjectPlugin(id          = 102972625, 
                                       str         = pluginstr,
                                       g           = C4DEnvironment,
                                       description = "c4de",               #link naar res directory, etc.
                                       icon        = bmp,
                                       info        = c4d.OBJECT_GENERATOR)
        
          if (okyn) : 
              print pluginstr + " initialized."
          else: print "Error initializing " + pluginstr
      

      And here the res file:

      CONTAINER c4de
      {
      	NAME c4de;
          INCLUDE Obase;
          
      	GROUP SETTINGS
      	{
              BOOL PXRAY {}
              REAL PPREVIEWSIZE { MIN 0; MAX 1000; STEP 1;}
      	}
      }
      
      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 12/09/2013 at 00:14, xxxxxxxx wrote:

        Some further testing showed that it is working in a TagPlugin.
        Could it be that it is not working in a ObjectPlugin due to the fact that the sphere I want to xray is a virtual object?

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

          On 12/09/2013 at 04:29, xxxxxxxx wrote:

          Hi Pim,

          Yes I think the problem is that the object is a virtual object, I remember
          having a similar problem a very while ago. I'll do some research about it.

          Best,
          Niklas

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

            On 12/09/2013 at 06:01, xxxxxxxx wrote:

            the node (the gelistnode representing your plugin) has to be flagged ID_BASEOBJECT_XRAY 
            to be drawn in the XRAY pass or the ID_BASEOBJECT_XRAY of your cached children won't have
            any effect. Your code should work when you do add

            > node[c4d.ID_BASEOBJECT_XRAY] = node[c4d.PXRAY]

            to your GVO method.

            edit : FYI, you might have to add c4d.OBJECT_POLYGONOBJECT as a plugin flag to your
            plugin registration to get the xray thing to show up in your description and therefore get
            whole thing to work. If you want to hide it then again you have to do that in your plugins
            description.

            INCLUDE Obase;
                HIDE ID_BASEOBJECT_XRAY;

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

              On 12/09/2013 at 07:21, xxxxxxxx wrote:

              Hi littledevil,

              Sorry, I do not fully understand following lines
              "FYI, you might have to add c4d.OBJECT_POLYGONOBJECT as a plugin flag to your
              plugin registration to get the xray thing to show up in your description and therefore get
              whole thing to work. If you want to hide it then again you have to do that in your plugins
              description."

              I now have this code:

              node[c4d.ID_BASEOBJECT_XRAY] = node[PXRAY]        
                      preview[c4d.ID_BASEOBJECT_XRAY] = node[PXRAY]

              However, the whole GVO object is now XRAY, not just the preview object.

              I also included HIDE ID_BASEOBJECT_XRAY;
              INCLUDE Obase; was already there.

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

                On 12/09/2013 at 08:03, xxxxxxxx wrote:

                What I meant with the quoted part is that without OBJECT_POLYGONOBJECT the xray checkbox
                in Obase is hidden by c4d by default ( if I do remember correctly ), so I thought the xray pass
                might also be skipped ( which does not seem to be the case from what you have described
                in your latest posting ).

                About the current problem - I do not think there is a way around. I have written recently a little 
                object plugin replacing null objects. Long story short - I thought I could use the display color to
                return splines with various colors to draw some stuff into the viewport and have not to care so 
                much about caching and speed. It turned out I could not (at least I did not find a way), as all GVO 
                children always do inherit the display color of the hosting node in the object manager. I did end 
                up drawing everything myself in Draw(). I think the same goes for the XRAY option, all children 
                will inherit the nodes settings and their own settings will be overwritten.

                And then again, I do not know 100% for sure.

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

                  On 12/09/2013 at 08:26, xxxxxxxx wrote:

                  Originally posted by xxxxxxxx

                  Could it be that it is not working in a ObjectPlugin due to the fact that the sphere I want to xray is a virtual object?

                  Try it like this:

                  import c4d, sys, os  
                  from c4d import plugins, utils, bitmaps, gui,documents  
                    
                  PLUGIN_ID = 10000008        #be sure to get a unique plugin id from c4dcafe.com  
                    
                  class MyObject(plugins.ObjectData) :  
                    
                    def __init__(self) :  
                        self.SetOptimizeCache(False)  
                        self.myMaterial = c4d.BaseMaterial(c4d.Mmaterial)   #A class member reference to a new material  
                          
                          
                    def Init(self, op) :      
                        op.SetName("My Object")                      #op is the generator object  
                          
                        self.InitAttr(op, float, [c4d.P1])           #Init the values you defined in your res file  
                        self.InitAttr(op, float, [c4d.P2])           #Init the values you defined in your res file  
                          
                        return True  
                          
                          
                    def Build(self,op) :  
                        doc = documents.GetActiveDocument()      
                          
                        obj = c4d.BaseObject(c4d.Ocube)  
                          
                        doc.InsertMaterial(self.myMaterial)           #Insert the new material into the Material Manager  
                    
                        ttag = c4d.TextureTag()                       #Create a new texture tag  
                        ttag.SetMaterial(self.myMaterial)             #Set the referenced material        
                        obj.InsertTag(ttag)                           #Add the texture tag to the object in the OM  
                          
                        return obj.GetClone()          
                      
                    def GetVirtualObjects(self, op, hierarchyhelp) :  
                      
                        p1 = op[c4d.P1]                              #Get the value in this gizmo  
                        print p1  
                          
                        p2 = op[c4d.P2]                                 #Get the value in this gizmo      
                        if p2 == 1: op[c4d.ID_BASEOBJECT_XRAY]=True  
                        else: op[c4d.ID_BASEOBJECT_XRAY]=False          
                    
                        ret = self.Build(op)                         #Assign a variable to the custom build function so we can use it later   
                        ret.InsertUnder(op)                          #Insert the result from it into the OM as child of the generator object  
                          
                        return ret                                   #The object was built in the custom "Build" function...So that's what we return with the generator  
                    
                          
                  if __name__ == "__main__":  
                    dir, file = os.path.split(__file__)  
                    icon = bitmaps.BaseBitmap()  
                    icon.InitWith(os.path.join(dir, "res", "icon.png"))  
                    plugins.RegisterObjectPlugin(id=PLUGIN_ID, str="MyObject",  
                                                g=MyObject,  
                                                description="MyObject", icon=icon,  
                                                info=c4d.OBJECT_GENERATOR)
                  

                  .h file

                    
                  #ifndef _MyObject_H_  
                  #define _MyObject_H_  
                    
                  enum  
                  {  
                    P1 = 1000,      
                    P2 = 1001,  
                  };  
                    
                  #endif
                  

                  .res file

                  CONTAINER MyObject  
                  {  
                    NAME MyObject;  
                    INCLUDE Obase;  
                    
                    GROUP ID_OBJECTPROPERTIES  
                    {  
                        GROUP  
                        {                          
                          REAL P1 { UNIT METER; MIN 0.0; }  
                          BOOL P2 {  }  
                        }  
                    }  
                      
                  }
                  

                  The .str file

                  STRINGTABLE MyObject  
                  {   
                    MyObject        "My Object";  
                    
                    P1                 "Value";      
                    P2               "x-ray";  
                    
                  }
                  

                  -ScottA

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

                    On 12/09/2013 at 11:36, xxxxxxxx wrote:

                    Thanks Scott,

                    I tried your code, but it XRAYS all virtual objects. and not the want I want.
                    E.g. I simplified the code to generate a cube with a sphere as a child.
                    Then I tried to xray just the sphere and that is not working.
                    XRAY op is xray-ing everything
                    XRAY just the sphere is not working.

                        def GetVirtualObjects(self, op, hierarchyhelp) :
                           
                            cube = c4d.BaseObject(c4d.Ocube)
                            sphere = c4d.BaseObject(c4d.Osphere)
                            sphere.InsertUnder(cube)
                            sphere[c4d.PRIM_SPHERE_RAD] = 150
                            
                            p2 = op[c4d.P2]                                 #Get the value in this gizmo    
                            if p2 == 1: sphere[c4d.ID_BASEOBJECT_XRAY]=True
                            else: sphere[c4d.ID_BASEOBJECT_XRAY]=False   
                            
                            return cube  
                    
                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post