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