dynamicsoar's log

主に研究関係のメモ

Rhinoceros with python script: CurveThroughPoints (rs.AddInterpCurve) after sorting the points

Background

I have a few points with witch I want to make a CurveThroughPoints. This is not a problem when doing it manually but when I tried that with python script using rs.AddInterpCurve, it generated strange looping curve. It's quite obvious the order of the points *1 is used for drawing the curve, instead of using the distance to the next point which is likely to be used in the CurveThroughPoints. Therefore, to my understanding, I have to sort the points by myself. So I did that.

Code

Assuming you have a layer "pts_test1" containing the points, and an empty layer "crv_test1" where your resultant curve will be placed.

def make_curve_through_points(layer_name_pts, layer_name_crv, deg, ktstyle):
    ## Obtain the GID of the points
    rs.CurrentLayer(layer_name_crv)
    id_points = rs.ObjectsByLayer(layer_name_pts, True)

    ## Obtain 3D coordinates of each point
    points_3d = []
    for i in range(0, len(id_points)):
        points_3d.append( rs.PointCoordinates(id_points[i]) )

    ## Sort the points
    points_sorted = rs.SortPointList(points_3d)

    ## Generate the curves
    rs.AddInterpCurve(points_sorted, degree=deg, knotstyle=ktstyle, start_tangent=None, end_tangent=None)


## Sample usage
layer_name_pts = "pts_test1"
layer_name_crv = "crv_test1"
deg = 3
ktstyle = 1
make_curve_through_points(layer_name_pts, layer_name_crv, deg, ktstyle)

Instead of using SortPointList, directly specifying the direction with SortPoints might be necessary depending on the situation.

References

*1:Perhaps the order of generations of the points, which is held internally and cannot be seen...