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