Aligning seams of closed curves?

Hi,

I’m currently looking for a pythonic way to adjust/align the seams of a collection of closed curves?
Is there a quick way to achieve this?

Thanks.

You mean something like this?

import rhinoscriptsyntax as rs
curves = rs.GetObjects("Select closed curves to align seams of", rs.filter.curve)
guide = rs.GetPointOnCurve(curves[0], "Select optional guide point on first curve")
iterative = rs.GetBoolean("Iterative?", ("Iterative", "Flase", "True"), True)
if(guide == None):
    guide = rs.CurveStartPoint(curves[0])
for curve in curves:
    t = rs.CurveClosestPoint(curve, guide)
    rs.CurveSeam(curve, t)
    if(iterative[0]):
        guide = rs.EvaluateCurve(curve, t)

P1r4t3b0y.py (501 Bytes)

3 Likes

Thanks for your reply, @Mahdiyar.

Your code inspired me to come up this function:

import Rhino.Geometry as rg

def align_polylines(polylines, guide_idx=None):
    """Aligns closed polylines so that their start/end vertices fall inline.
        If the optional guide index is not defined, the polylines align to 
        the start/end vertex of the first polyline. 
    
    Args:
      polylines: A list of closed polylines.
      guide_idx: An optional guide index for the polylines to align to.
    
    Returns:
      The list of aligned polylines on success, or None."""
    if any([True for p in polylines if not p.IsClosed]):
        return
    
    if guide_idx == None or guide_idx < 0:
        guide_idx = 0
    elif guide_idx > len(polylines[0]):
        guide_idx = 0
    
    aligned_polylines = [polylines[guide_idx]]
    for i in range(1, len(polylines)):
        # Get the guide vertex of the previous polyline
        guide_vtx = polylines[i-1][guide_idx]
        # Get the closest index of a vertex of the current polyline
        closest_idx = polylines[i].ClosestIndex(guide_vtx) # -1 on error
        if closest_idx < 0:
            return
        # Get a list of indices of the current polyline
        indices = range(len(polylines[i])-1)
        # Restructure the polyline indices to align them
        align_indices = indices[closest_idx:] + indices[:closest_idx]
        align_vertices = [polylines[i][j] for j in align_indices]
        align_vertices.append(align_vertices[0])
        aligned_polylines.append(rg.Polyline(align_vertices))
        # Update the guide index
        guide_idx = closest_idx
    return aligned_polylines

One thing to consider (atleast it used to be an issue in r5 when doing this in gh and rhinocommon) when you change the curve seam with Rhinocommon the curves domain gets screwed up (try evaluating the adjusted curve after without reparametrizing). The fix was to first get the curves original domain, then do the seam change, then set the adjusted curves domain back to the original domain.

I’m not sure if this happens also in rhinoscript.

2 Likes