Ripple Objects about Curve

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 Design> 
'Script version Sunday, October 09, 2008 11:21:36 PM 
Call Main()
Sub Main() 
	Call arrayRotateAboutCurve() 
End Sub 
Function arrayRotateAboutCurve() 
	arrayRotateAboutCurve = Null 
	Dim i,j, objects,angle, originPln, steps, scale, curve, pt(2), dom, crvFrame, rotFrame, rotWav, disWav 
	objects = Rhino.GetObjects("Select Objects") 
	If isNull(objects) Then Exit Function 
	pt(0) = Rhino.GetPoint("Select Origin Point") 
	If isNull(pt(0)) Then Exit Function 
	pt(2) = Rhino.GetPoint("Select Point for X Axis")
	If isNull(pt(2)) Then Exit Function 
	pt(1) = Rhino.GetPoint("Select Point for Y Axis")
	If isNull(pt(1)) Then Exit Function 
	originPln = Rhino.PlaneFitFromPoints(pt) 
	curve = Rhino.GetObject("Select Curve", 4) 
	If isNull(curve) Then Exit Function 
	Dim arrItems, arrValues, arrResults 
	arrItems = array("Steps", "End Rotation", "Rotational Waves", "End Scale", "Scalar Waves") 
	arrValues = array(10, 90, 1, 0.25, 1) 
	arrResults = Rhino.PropertyListBox(arrItems, arrValues,, "Spiral Settings") 
	steps = CDbl(arrResults(0)) 
	angle = CDbl(arrResults(1)) 
	rotWav = 1 / (CDbl(arrResults(2)) * 2) 
	disWav = 1 / (CDbl(arrResults(4)) * 2) 
	If CDbl(arrResults(3)) > 1 Then 
		scale = CDbl(arrResults(3)) - 1 
	Else 
		scale = 1 - CDbl(arrResults(3))
	End If
	Call Rhino.EnableRedraw(False)
	Call rhino.SelectObject(curve) 
	Call rhino.Command("reparameterize 0 1")
	Call rhino.UnselectAllObjects()
	dom = Rhino.CurveDomain(curve)(1) 
	Dim tmpObj, tmpPnt, dblScale 
	For i = 0 To steps Step 1 
		crvFrame = Rhino.CurvePerpFrame(curve, (dom / steps) * i) 
		rotFrame = Rhino.RotatePlane(crvFrame, angle * Cos(i / (steps * rotWav) * pi), crvFrame(3)) 
		For j = 0 To uBound(objects) Step 1 
			If CDbl(arrResults(3)) < 1 Then
				dblScale = 1 - (scale - scale * Cos(i / (steps * disWav) * pi)) * 0.5
			ElseIf 
				CDbl(arrResults(3)) > 1 Then 
				dblScale = 1 + (scale - scale * Cos(i / (steps * disWav) * pi)) * 0.5 
			Else dblScale = 1 
			End If
			tmpObj = Rhino.OrientObject(objects(j), pt, array(rotFrame(0), Rhino.PointAdd(rotFrame(0), rotFrame(1)), Rhino.PointAdd(rotFrame(0), rotFrame(3))), 1) 
			Call Rhino.ScaleObject(tmpObj, rotFrame(0), array(dblScale, dblScale, dblScale)) 
		Next 
	Next 
	Call Rhino.EnableRedraw(True) 
End Function