Surface Wave

Surface wave is a very simple rhinoscript tool which uses a curve to create a sine wave based surface. Developed as a means to expedite surface experimentation, its function as a tool is very limited, but its results as an origin are quite useful.

Rhino Script

Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Sunday, May 25, 2008 11:21:36 PM
Private aA,aB,aC,aD,aE,aF
Call Main()
Sub Main()
	Dim curves
	curves = Rhino.GetObjects("Select Curve", 4)
	If isNull(curves) Then Exit Sub
	
	If IsEmpty(aF) Then	
		aF = 2
	End If
	If IsEmpty(aA) Then	
		aA = 20 
	End If
	If IsEmpty(aB) Then	
		aB = 2 
	End If
	If IsEmpty(aC) Then	
		aC = 3
	End If
	If IsEmpty(aD) Then	
		aD = 90
	End If
	If IsEmpty(aE) Then	
		aE = 90
	End If
	
	Dim b, arrItems, arrValues
	arrItems = array("waves", "steps", "baseLength", "increaseLength", "baseRotation", "increaseRotation")
	arrValues = array(aF, aA, aB, aC, aD, aE)
	b = Rhino.PropertyListBox(arrItems, arrValues,, "Volume Parameters")
	
	aA = CDbl(b(1)): aB = CDbl(b(2)): aC = CDbl(b(3)): aD = CDbl(b(4)): aE = CDbl(b(5)): aF = CStr(b(0))
	Call Rhino.EnableRedraw(False)
	Dim i
	For i = 0 To ubound(curves) Step 1
		Call reparameterize(curves(i))
		Call quickStems(curves(i), aA - 1, aB, aC, aD, aE * .5, aF)
	Next
	Call Rhino.EnableRedraw(True)
	
End Sub
Function quickStems(curve, steps, bLen, length, bRot, rotation, waves)
	quickStems = Null
	Dim i
	Dim crvDom, ori, pln, plnR, len, rot, vect, wav
	Dim finCrv
	ReDim crv(steps),pt(steps)
	crvDom = Rhino.CurveDomain(curve)
	wav = 1 / waves
	For i = 0 To steps Step 1
		len = length - length * Cos(i / (steps * wav) * pi)
		rot = rotation - rotation * Cos(i / (steps * wav) * pi)
		ori = Rhino.EvaluateCurve(curve, crvDom(1) / steps * i)
		pln = Rhino.CurvePerpFrame(curve, crvDom(1) / steps * i)
		
		plnR = Rhino.RotatePlane(pln, rot - brot, pln(3))
		vect = Rhino.PointAdd(ori, Rhino.VectorScale(Rhino.VectorUnitize(plnR(2)), bLen + len))
		
		pt(i) = vect
	Next
	finCrv = Rhino.AddInterpCurve(pt)
	Call Rhino.AddLoftSrf(array(finCrv, curve))
End Function
Function reparameterize(strObjectID)
	If Rhino.IsCurve(strObjectID) = True Then
		Call rhino.SelectObject(strObjectID)
		Call rhino.Command("reparameterize 0 1")
		Call rhino.UnselectAllObjects()
	End If
	If Rhino.IsSurface(strObjectID) = True Then
		Call rhino.SelectObject(strObjectID)
		Call rhino.Command("reparameterize 0 1 0 1")
		Call rhino.UnselectAllObjects()
	End If		
End Function