ReOrient 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 which 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 
			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) 
	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