Re Orient Curves

This Rhino Script takes allows the user to select a series of curves and a curve to reference them against. From this relationship, the user can select a new curve that will deform the series of curves relative to the difference between the two reference curves.

Rhino Script

Option Explicit 
'Script written by <David Mans> 
'Script copyrighted by <Neoarchaic Studio> 
'Script version Sunday, May 10, 2009 11:12:11 PM 
Call Main() 
Sub Main() 
    Dim strCurve: strCurve = Rhino.GetObject("Select Origin Rail", 4, True) 
    If isNull(strCurve) Then Exit Sub
    Call Rhino.LockObject(strCurve) 
    Dim arrCurves: arrCurves = Rhino.GetObjects("Select Relative Curves", 4, False) 
    If isNull(arrCurves) Then Exit Sub
    Call Rhino.LockObjects(arrCurves) 
    Dim strRail: strRail = Rhino.GetObject("Select Target Rail", 4, False) 
    If isNull(strRail) Then Exit Sub
    Dim dblSamples: dblSamples = Rhino.GetInteger("Samples", 30, 3) 
    If isNull(dblSamples) Then Exit Sub
    Call Rhino.UnlockObject(strCurve) 
    Call Rhino.UnlockObjects(arrCurves) 
    Call Rhino.EnableRedraw(False) 
    Call orientCurves(strCurve, strRail, arrCurves, dblSamples) 
    Call Rhino.EnableRedraw(True) 
End Sub
 
Function orientCurves(strCurve, strRail, arrCurves, dblSamples) 
    orientCurves = Null 
    Dim i, j, k 
    Dim arrPoint 
    Dim cDom(2), dblParam(2), plan(1) 
    Dim arrCtrlPt(), arrOutput() 
    ReDim arrCtrlPt(dblSamples), arrOutput(uBound(arrCurves)) 
    cDom(0) = Rhino.CurveDomain(strCurve) 
    cDom(2) = Rhino.CurveDomain(strRail) 
    For i = 0 To uBound(arrCurves) Step 1 
        cDom(1) = Rhino.CurveDomain(arrCurves(i)) 
        For j = 0 To dblSamples Step 1 
            For k = 0 To 2 Step 1 
                dblParam(k) = cDom(k)(0) + (cDom(k)(1) - cDom(k)(0)) / dblSamples 
            Next
            arrPoint = Rhino.EvaluateCurve(arrCurves(i), dblParam(1) * j) 
            plan(0) = Rhino.CurvePerpFrame(strCurve, dblParam(0) * j) 
            plan(1) = Rhino.CurvePerpFrame(strRail, dblParam(2) * j) 
            arrCtrlPt(j) = orientPoint(arrPoint, plan(0), plan(1)) 
            Next arrOutput(i) = Rhino.AddInterpCurve(arrCtrlPt, 3) 
    Next
    orientCurves = arrOutput
End Function
Function orientPoint(arrPoint, arrOriginPlane, arrTargetPlane)
    orientPoint = Null 
    Dim arrOutput, tempPt, arrPoints(3) 
    arrPoints(0) = Rhino.PointAdd(arrOriginPlane(0), arrOriginPlane(1)) 
    arrPoints(1) = Rhino.PointAdd(arrOriginPlane(0), arrOriginPlane(2)) 
    arrPoints(2) = Rhino.PointAdd(arrTargetPlane(0), arrTargetPlane(1)) 
    arrPoints(3) = Rhino.PointAdd(arrTargetPlane(0), arrTargetPlane(2)) 
    tempPt = Rhino.AddPoint(arrPoint)
    Call Rhino.OrientObject(tempPt, array(arrOriginPlane(0), arrPoints(0), arrPoints(1)), array(arrTargetPlane(0), arrPoints(2), arrPoints(3))) 
    arrOutput = Rhino.PointCoordinates(tempPt) 
    Call Rhino.DeleteObject(tempPt) 
    orientPoint = arrOutput 
End Function