XRAY not working in ObjectPlugin



  • 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;}
    	}
    }
    


  • 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?



  • 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



  • 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;



  • 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.



  • 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.



  • 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



  • 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  
    

Log in to reply