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