š» Rhino 5
š¼ Rhino Script
š ļø Visual Basic
Ā
The Multi-Sweep script allows for the selection of multiple rails and a profile from which the profileās relative planar orientation is determined and automatically aligned perpendicular to each rail. The interface and options for this version are very basic and later versions will become much more robust. This version of the sweep tool allows for multiple selections of rails and multiple selections of profiles. Initial rotation of profiles will loop until the desired rotation angle is specified.
Ā
Option Explicit
'Script written by <David Mans>
'Script copyrighted by <NeoArchaic Design>
'Script version Thursday, March 13, 2008 4:36:59 PM
Call Main()
Sub Main()
Dim rails,profile,i
rails = Rhino.GetObjects("Select Rail Curves", 4)
If isNull(rails) Then Exit Sub
profile = Rhino.GetObjects("Select Profile Curves in Order of Placement", 4)
If isNull(profile) Then Exit Sub
Call Rhino.EnableRedraw(False)
For i = 0 To uBound(rails) Step 1
Call reparameterize(rails(i))
Next
Call Rhino.EnableRedraw(True)
Call curveSweepMultiProf(rails, profile)
End Sub
Function curveSweepMultiProf(rail, profile)
curveSweepMultiProf = Null
Dim i,j,k,angle,pCount,Count
Count = uBound(rail)
pCount = uBound(profile)
'profile variables
Dim bBox(), oriPts(), dist(2), edgeLine(1), originPts(2),originPln, midline
ReDim bBox(pCount), oriPts(pCount)
'create an origin plane for the profile
Call Rhino.EnableRedraw(False)
For j = 0 To pCount Step 1
bBox(j) = Rhino.BoundingBox(profile(j))
dist(0) = Rhino.Distance(bBox(j)(0), bBox(j)(2))
dist(1) = Rhino.Distance(bBox(j)(0), bBox(j)(5))
dist(2) = Rhino.Distance(bBox(j)(0), bBox(j)(7))
If dist(0) > dist(1) And dist(0) > dist(2) Then
k = array(0, 1, 2)
ElseIf dist(1) > dist(0) And dist(1) > dist(2) Then
k = array(0, 1, 5)
ElseIf dist(2) > dist(1) And dist(2) > dist(0) Then
k = array(0, 3, 7)
End If
edgeLine(0) = Rhino.AddLine(bBox(j)(k(0)), bBox(j)(k(1)))
edgeLine(1) = Rhino.AddLine(bBox(j)(k(1)), bBox(j)(k(2)))
midline = Rhino.AddLine(bBox(j)(k(0)), bBox(j)(k(2)))
originPts(2) = Rhino.CurveMidPoint(midline)
originPts(0) = Rhino.CurveMidPoint(edgeLine(0))
originPts(1) = Rhino.CurveMidPoint(edgeLine(1))
originPln = Rhino.PlaneFromPoints(originPts(2), originPts(0), originPts(1))
Call Rhino.DeleteObjects(edgeLine)
Call Rhino.DeleteObject(midline)
oriPts(j) = originPts
Next
'create alignment planes on the curve
'rail variables
Dim crvDom,crvStep, crvPlane(),crvProf(),crvPt(2)
ReDim crvPlane(Pcount),crvPlaneSet(count),crvProfSet(count),crvProf(Pcount)
For i = 0 To count Step 1
crvDom = Rhino.CurveDomain(rail(i))
If Pcount = 0 Then
crvStep = 0
Else
crvStep = crvDom(1) / Pcount
End If
For j = 0 To Pcount Step 1
crvPlane(j) = Rhino.CurvePerpFrame(rail(i), j * crvStep)
crvPt(0) = crvPlane(j)(0)
crvPt(1) = Rhino.pointadd(crvPlane(j)(0), crvPlane(j)(1))
crvPt(2) = Rhino.pointadd(crvPlane(j)(0), crvPlane(j)(2))
crvProf(j) = Rhino.OrientObject(profile(j), array(oriPts(j)(2), oriPts(j)(1), oriPts(j)(0)), array(crvPt(0), crvPt(1), crvPt(2)), 1)
Next
crvPlaneSet(i) = crvPlane
crvProfSet(i) = crvProf
Next
'allow for rotation correction
Call Rhino.EnableRedraw(True)
angle = 90
Do Until angle = 0
angle = Rhino.GetReal("Object Rotation", 0, 0, 360)
If isNull(angle) Then Exit Do
Call Rhino.EnableRedraw(False)
For i = 0 To count Step 1
For j = 0 To Pcount Step 1
Call Rhino.RotateObject(crvProfSet(i)(j), crvPlaneSet(i)(j)(0), angle, crvPlaneSet(i)(j)(3))
Next
Next
Call Rhino.EnableRedraw(True)
Loop
Call Rhino.EnableRedraw(False)
'sweep variables
Dim swProfSet(),strProfSet
ReDim swProfSet(Pcount)
'call out sweep command
For i = 0 To count Step 1
For j = 0 To Pcount Step 1
swProfSet(j) = ("_SelID " & crvProfSet(i)(j) & " ")
Next
strProfSet = Join(swProfSet)
'swPprofSet
Call Rhino.Command("-_Sweep1 " & "_SelID " & rail(i) & " " & strProfSet & " _Enter _Enter _Simplify=None Enter", False)
Next
Call Rhino.EnableRedraw(True)
curveSweepMultiProf = array()
End Function
Function reparameterize(strObjectID)
If Rhino.IsCurve(strObjectID) = True Then
Call rhino.SelectObject(strObjectID)
Call rhino.Command("reparameterize 0 1", False)
Call rhino.UnselectAllObjects()
End If
If Rhino.IsSurface(strObjectID) = True Then
Call rhino.SelectObject(strObjectID)
Call rhino.Command("reparameterize 0 1 0 1", false)
Call rhino.UnselectAllObjects()
End If
End Function
Ā