💻 Rhino 5
🔼 Rhino Script
🛠️ Visual Basic
This Rhino Script allows the user to create an oscillating lattice of curves. The user is asked to select a curve to act as a rail. The user can then select the number of strands that will oscillate around the rail, the number of points of contact, and an overall torsion if desired. In addition, the user can select a minimum and maximum radius of oscillation as well as the number of times it will move between these two radii.
Option Explicit
'Script written by <David Mans>
'Script copyrighted by <NeoArchaic Studio>
'Script version Sunday, August 30, 2009 1:22:47 AM
Call Main()
Sub Main()
Dim strCurve
strCurve = Rhino.GetObject("Select Curve", 4, True)
If isNull(strCurve) Then Exit Sub
Call reparameterize(strCurve)
Dim i, j, temp, strLayer
Call Rhino.EnableRedraw(False)
For i = 2 To 10 Step 1
temp = curveLattice(strCurve, 8, 6, 1 / i, array(1, 2), 4, 18)
strLayer = CStr("test_05_" & i)
Call Rhino.AddLayer(strLayer,, False)
For j = 0 To uBound(temp) - 1 Step 1
Call Rhino.ObjectLayer(temp(j), strLayer)
Next
Next
Call Rhino.EnableRedraw(True)
End Sub
Function curveLattice(strCurve, intStrands, intOscillations, dblRotation, arrRadius, intRadius, intSamples)
curveLattice = Null
intOscillations = intOscillations * 2
Dim i,j, count, tDom, tStep, rStep, dblSc
Dim tFrame, rFrame
Dim arrOutput(),arrPt()
count = intSamples * intOscillations
ReDim arrPt(count), arrOutput(intStrands)
tDom = Rhino.CurveDomain(strCurve)
tStep = (tDom(1) - tDom(0)) / count
rStep = 360 / intStrands
dblSc = arrRadius(1) - arrRadius(0)
For i = 0 To intStrands - 1 Step 1
For j = 0 To count Step 1
tFrame = Rhino.CurvePerpFrame(strCurve, tDom(0) + tStep * j)
If i Mod (2) Then
rFrame = Rhino.RotatePlane(tFrame, rStep * i + (rStep * 0.5) * sin(intOscillations * PI * (j / count)) + (360 * dblRotation) * j / count, tFrame(3))
Else
rFrame = Rhino.RotatePlane(tFrame, rStep * i + (rStep * 0.5) * sin(PI + intOscillations * PI * (j / count)) + (360 * dblRotation) * j / count, tFrame(3))
End If
arrPt(j) = Rhino.PointAdd(tFrame(0), Rhino.VectorScale(Rhino.VectorUnitize(rFrame(1)), arrRadius(0) + dblSc + dblSc * cos(intRadius * PI * (j / count))))
Next
arrOutput(i) = Rhino.AddInterpCurve(arrPt)
Next
curveLattice = arrOutput
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
Komentáře