Solved Retrieving Deformed Splines

Hello,

I'm trying to get access to the result of a spline that has been deformed by a Bend. I've attached a scene file with a cloner mimicking the behavior I want to achieve, but I haven't been able to do it yet.

Using GetCache().GetDeformCache() isn't returning just the four points of the circle and I'm not sure another way to get a deformed spline. This seems like it would be rather simple but I'm not sure where to proceed.

Deformed Circle.c4d

Johan

Hi Johan, thanks for reaching out us.

With regard to your request, I warmly suggest to have a look at:

A first attempt to make it work should look like this:

import c4d


def DoRecursion(op, index):
    tp = op.GetDeformCache()
    if tp is not None:
        DoRecursion(tp, index)
    else:
        tp = op.GetCache()
        if tp is not None:
            DoRecursion(tp, index)
        else:
            if not op.GetBit(c4d.BIT_CONTROLOBJECT):
                if op.IsInstanceOf(c4d.Opoint):
                    for i in index:
                        print "\t\t", op.GetAllPoints()[i]

    tp = op.GetDown()
    while tp is not None:
        DoRecursion(tp, index)
        tp = tp.GetNext()

# Main function
def main():
    # get the real spline representation
    realSpline = op.GetRealSpline()
    if realSpline is None:
        return
    
    # allocate a SplineHelp instance and init it with the real spline
    splineH = c4d.utils.SplineHelp()
    splineH.InitSplineWith(realSpline)
    
    # get the spline points and store its length
    splinePnts = realSpline.GetAllPoints()
    splinePntsCnt = len(splinePnts)
    
    # allocate a list to store the correspondance between the spline points and the one belonging to its line representation
    pntIndxInLine = []
    for i in xrange(splinePntsCnt):
        pntIndxInLine.append(splineH.GetPointIndex(i, 0)/splinePntsCnt)
    
    # recurse over the geometry to look for its cache
    DoRecursion(op, pntIndxInLine)
    
    # free the SplineHelp instance
    splineH.FreeSpline()

# Execute main()
if __name__=='__main__':
    main()

Best, Riccardo

Hi Johan, thanks for reaching out us.

With regard to your request, I warmly suggest to have a look at:

A first attempt to make it work should look like this:

import c4d


def DoRecursion(op, index):
    tp = op.GetDeformCache()
    if tp is not None:
        DoRecursion(tp, index)
    else:
        tp = op.GetCache()
        if tp is not None:
            DoRecursion(tp, index)
        else:
            if not op.GetBit(c4d.BIT_CONTROLOBJECT):
                if op.IsInstanceOf(c4d.Opoint):
                    for i in index:
                        print "\t\t", op.GetAllPoints()[i]

    tp = op.GetDown()
    while tp is not None:
        DoRecursion(tp, index)
        tp = tp.GetNext()

# Main function
def main():
    # get the real spline representation
    realSpline = op.GetRealSpline()
    if realSpline is None:
        return
    
    # allocate a SplineHelp instance and init it with the real spline
    splineH = c4d.utils.SplineHelp()
    splineH.InitSplineWith(realSpline)
    
    # get the spline points and store its length
    splinePnts = realSpline.GetAllPoints()
    splinePntsCnt = len(splinePnts)
    
    # allocate a list to store the correspondance between the spline points and the one belonging to its line representation
    pntIndxInLine = []
    for i in xrange(splinePntsCnt):
        pntIndxInLine.append(splineH.GetPointIndex(i, 0)/splinePntsCnt)
    
    # recurse over the geometry to look for its cache
    DoRecursion(op, pntIndxInLine)
    
    # free the SplineHelp instance
    splineH.FreeSpline()

# Execute main()
if __name__=='__main__':
    main()

Best, Riccardo

Thanks for the reply, it really helped me out.

John