Hello @HerrMay,
Funny enough DrawPoints seems to internally use the "same points" to draw, one gets to see when one edits the points of a polygon object. π In S26 the points are round (thats probably why I was thinking of circles) while in R20 they are squares. No question here, just an observation.
As you can see, in the script I retrieve the cache of the object we are going to draw.
# Get the cache of the object representing the plugin in the object manager, i.e., more or
# less what we returned in GetContour, Cinema 4D has however exhausted the cache for us, and
# the cache is not a SplineObject but a LineObject (i.e, the cache of a SplineObject).
cache: c4d.LineObject = op.GetDeformCache() or op.GetCache()
if not isinstance(cache, c4d.LineObject):
return c4d.DRAWRESULT_O
This not only enables us to deal with splines affected by a deformer correctly, but also and more importantly with spline generators as for example the Circle spline generator.
Such generators do not have any control points one could retrieve, their cache will always contain LineObject instances and not SplineObject instances (when they have been implemented correctly). This is also what I was referring to in my comment, because OffsetYSpline returns a SplineObject as its cache in GetContour, but Cinema 4D will 'exhaust' that cache for us by returning the cache of the cache, the LineObject.
A LineObject represents a SplineObject over its current interpolation settings.
What is actually weird though is that the color gradient you used here to color the points doesn't work in R20. The points are simply drawn black there. Possibly a Python 2/3 issue caused by integer/float division differences? π€·
Yes, this is Python 3 code. In Python 2 integers divide by default as integers. Simply wrap one of the numbers into a float, e.g., f: float = float(i)/float(count).
Allow one follow up question. How can I draw only the control points of the spline? In your example you use a circle primitive which has - when made editable - exactly four points making up the shape via tangents. Where as the drawn points using the intermediate points of the circle as well.
You can use BaseObject.GetRealSpline to get the underlying editable spline object for a spline. So, when you would replace the section quoted above with this:
cache: c4d.SplineObject = op.GetRealSpline()
if not isinstance(cache, c4d.SplineObject):
return c4d.DRAWRESULT_OK
You would now draw the control points of the SplineObject representing the spline generator rather than the vertices of its underlying LineObject. The problem in this case is that the plugin you have chosen is calling 'Current State to Object' (CSTO) on the input object which it is cloning and returning offset-ed (see line 130 in your code listing). CSTO is of course just replacing an object with its cache state. So, when you put a circle spline below the offset spline, it will still be drawn as in the LineObject cache version because the cache and the BaseObject.GetRealSpline representation are in this case identical.
Cheers,
Ferdinand