Python Generator - Spline Outline



  • On 07/09/2014 at 17:10, xxxxxxxx wrote:

    Hi guys,

    I'm new to Python Generators and need some help please.

    I am using this code snippet (from this forum) to dynamically create a spline Outline of the supplied child object...

    from c4d import utils as u
     
    def main() :
        nada = c4d.BaseObject(c4d.Ospline)
        
        outline = op[c4d.ID_USERDATA,1] # Userdata "meter" 
        obj     = op.GetDown()
      
        if not obj: return nada
        source = obj.GetClone()
      
        if source.CheckType(c4d.Ospline) is False: #Parametric object
            pobj   = u.SendModelingCommand(
                command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,
                list    = [source],    
                mode    = c4d.MODELINGCOMMANDMODE_ALL, 
                doc     = obj.GetMain())
            source = pobj[0]
      
        bc = c4d.BaseContainer()
        bc.SetData(c4d.MDATA_SPLINE_OUTLINE, outline)
        offspline = u.SendModelingCommand(
            c4d.MCOMMAND_SPLINE_CREATEOUTLINE,
            [source],
            c4d.MODELINGCOMMANDMODE_ALL,
            bc)
      
        return source.GetClone()
    

    This all works great.

    I am wanting to make a very slight modification, so that I can opt to ONLY keep the newly created offset segment and remove the original spline from the generator output. The Python SDK suggests there is already this functionality, just like it exists with the the destructive version of this modelling tool.

    ie. MCOMMAND_SPLINE_CREATEOUTLINE by adding True flag to MDATA_SPLINE_OUTLINESEPARATE.

    However I am not sure how to implement this properly, and i suspect because it creates a new separate object beneath the generator op, i don't know how to return it properly. I've tried some silly things and nothing really works.

    Help a noob?

    Thanks guys.

    Parallel thread at CGSociety here...



  • On 16/09/2014 at 14:46, xxxxxxxx wrote:

    Hi,

    as your source object is not a part of the generator output ,but the basic requirement for the generator itself.
    I only see this workaround to get close to what you may need.
    Build a separate object and replace it every time, like:

      
    import c4d  
    from c4d import utils as u  
       
    def main() :  
      
      if op.GetDown()==None:return  
        
      outline = op[c4d.ID_USERDATA,1] # Userdata "meter"   
      
      obj     = op.GetDown()  
      
      source = obj.GetClone()  
      
      if source.CheckType(c4d.Ospline) is False: #Parametric object  
          pobj   = u.SendModelingCommand(  
              command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,  
              list    = [source],      
              mode    = c4d.MODELINGCOMMANDMODE_ALL,   
              doc     = obj.GetMain())  
          source = pobj[0]  
      
      bc = c4d.BaseContainer()  
      bc.SetData(c4d.MDATA_SPLINE_OUTLINE, outline)  
      bc.SetData(c4d.MDATA_SPLINE_OUTLINESEPARATE, True)  
      
      offspline = u.SendModelingCommand(  
          command    = c4d.MCOMMAND_SPLINE_CREATEOUTLINE,  
          list       = [source],  
          mode       = c4d.MODELINGCOMMANDMODE_ALL,   
          bc         = bc,  
          doc        = obj.GetMain())  
      
      #instead of let the generator creating an object directly  
      #do this set and replace code  
      offspline[0].SetName("Offset")  
      #insert a new offset spline under the source object  
      if obj.GetDown()==None:  
          doc.InsertObject(offspline[0],obj)  
      #if there is already a offsetspline replace it with the new settings  
      else:  
          spline=obj.GetDown()  
          spline.Remove()  
          doc.InsertObject(offspline[0],obj)  
      
      return   
    

    hope that helps
    martin


Log in to reply