(edited by Manuel : I splited this thread from this one)
@m_magalhaes said in Post Deformer Spline:
I am not the one who asked the original question, but your find of the
SplineToLineIndex() method in
SplineHelp is a good one!
I must have look at
SplineHelp's API over a dozen times and never noticed it was there. I thought one would have to traverse all of the
LineObject's points and correlate them with points on its parent
SplineObject based on position, in order to come up with the mapping from
SplineObject point index to
LineObject point index. So, this feature of
SplineHelp is really valuable, since it offers this very mapping as part of the core Python API.
I guess this also implies that there is always a 1:1 correspondence between a point of a SplineObject (which represents one or more B-Splines via formulas) and a point of its underlying LineObject which represents a bunch of line segments connected together. I wasn't sure if this was always guaranteed to be the case.
Now, for a somewhat related question to what has already been discussed, while we are on the topic of
SplineHelp, is there some top secret way to do the opposite of what the
GetPointIndex() method of
SplineHelp does, that is to get the offset (i.e., 0<=offset<=1.0) along a spline's
LineObject that a particular LineObject` point idx is located at? This would also be really helpful.
Let's look at an example:
Say you create a Rectangle parametric spline object that has a width and a height of 100 cm, so basically a square. We'll set the Intermediate Points setting to None, so that the spline object and its line object have identical point counts (i.e., four, for the four points that make up the corners of the square). Now, let's say you perform a Make Editable operation to convert the (parametric) Rectangle into an editable closed spline object, consisting of one segment with four points. If you go into the Structure Manager, you can see that the points are indexed 0-3 (since, there are four of them) and you see their coordinates, as well.
These points are located, with regard to offset, at 0%, 25%, 50%, and 75% of the length of the spline (or offsets of 0.000, 0.250, 0.500, and 0.750), respectively, since our original parametric spline shape was a square. Since this is a closed spline,
GetPointIndex() will return the (sentinel or logical) idx of 4 (i.e., the count of the number of points in that segment of the
LineObject) if asked for the nearest point to 100% of the length of the spline.
Now, given for example the point at Index #1, so the second point of the spline's LineObject, which is obviously 25% of the distance along the spline as previously mentioned, what method could you use on the
SplineObject, it's underlying
LineObject, or 'SplineHelp' to get a 0.25 offset value from that LineObject point index of 1.
GetPointIndex() member function of
SplineHelp takes a (Spline space) offset value and a segment idx, and returns the closest
LineObject point, by index, to that spline space offset value.
As described in the above example, how do you go in the opposite direction, from a
LineObject point, by index, to an offset value along the
LineObject in spline space?