Delete short segments



  • On 06/01/2018 at 18:59, xxxxxxxx wrote:

    Hello Plugincafe! :)

    With this python generator, I want to remove short segments of a spline.
    In line 17 I'm exploding spline into segments and in line 30 I'm trying to delete short segments but seems like I'm doing something wrong.

        minLength = op[c4d.ID_USERDATA,1] #User defined Minimum lenght  
        for i in xrange(pcount) :  
            pointA = spline.GetPoint(spline.GetPointCount()-i-1)  
            pointB = spline.GetPoint(spline.GetPointCount()-i-2)  
            direction = (pointB - pointA)  
            distance = direction.GetLength()  
            if distance == 0:  
                continue  
            elif distance < minLength:  
                sel.Select(spline.GetPointCount()-i-1)  
                sel.Select(spline.GetPointCount()-i-2)  
                res = utils.SendModelingCommand(command = c4d.MCOMMAND_DELETE,list=[spline],mode=c4d.MODELINGCOMMANDMODE_POINTSELECTION,doc=doc)      
                sel.DeselectAll()
    


  • On 07/01/2018 at 05:44, xxxxxxxx wrote:

    I found a solution... this is a bit brute force way, but at least it works...

    import c4d
    #Welcome to the world of Python
      
      
    def main() :
        child = op.GetDown()
        if not child: return
        clone = child.GetClone()
        child.Touch()
      
        PolyFX = c4d.BaseObject(1019222)
        PolyFX[c4d.MGPOLYFX_MODE] = 1
        PolyFX[c4d.ID_MG_TRANSFORM_SCALE] = c4d.Vector(0.99)
        PolyFX.InsertUnder(clone)
      
        res = c4d.utils.SendModelingCommand(command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,
                                            list = [clone],
                                            mode = c4d.MODELINGCOMMANDMODE_ALL,
                                            doc = op.GetDocument(),
                                            )
        if res[0] is not None: poly = res[0]
        else:     return None
      
        sel = poly.GetPointS()
        pcount = poly.GetPointCount()
        sel.SelectAll(pcount-1)
        
        res = c4d.utils.SendModelingCommand(command = c4d.MCOMMAND_EXPLODESEGMENTS,
                                            list = [poly],
                                            mode = c4d.MODELINGCOMMANDMODE_POINTSELECTION,
                                            doc = op.GetDocument()
                                            )
      
      
        length = c4d.utils.SplineLengthData()
        for i in poly.GetChildren() :
            length.Init(i)
            dist = length.GetLength()
            if dist < op[c4d.ID_USERDATA,1]:
                i.Remove()
                length.Free()
      
        return poly
      
    
    


  • On 07/01/2018 at 06:33, xxxxxxxx wrote:

    Worth mentioning that this technique is a bit slow...



  • On 07/01/2018 at 09:26, xxxxxxxx wrote:

    I figured it out...

      
        doc = op.GetDocument()
        sel = spline.GetPointS()
        minLength = op[c4d.ID_USERDATA,1] #User defined Minimum lenght
        n = 0
        for i in xrange(spline.GetPointCount()-1) :
            pointA = spline.GetPoint(n)
            n+=1
            pointB = spline.GetPoint(n)
            direction = (pointB - pointA)
            distance = direction.GetLength()
            if distance == 0:
                n+=1
            elif distance < minLength:
                sel.Select(n)
                res = utils.SendModelingCommand(command = c4d.MCOMMAND_DISCONNECT,list=[spline],mode=c4d.MODELINGCOMMANDMODE_POINTSELECTION,doc=doc)
                res = utils.SendModelingCommand(command = c4d.MCOMMAND_DELETE,list=[spline],mode=c4d.MODELINGCOMMANDMODE_POINTSELECTION,doc=doc) 
                n+=1   
                sel.DeselectAll()
    


  • On 08/01/2018 at 02:08, xxxxxxxx wrote:

    Hi Merk, although it seems out you've already find your own way, I wonder looking at your second post, if an ObjectData Python plugin would fit better with the intent of the code since I see you handling object's child as much as normally happens with an ObjectData. Is my guess wrong?

    Best, Riccardo



  • On 08/01/2018 at 02:54, xxxxxxxx wrote:

    In object generator plugins, I'm using GetAndCheckHierarchyClone.
    In the second example, python generator is used...


Log in to reply