This fabrication script presents a simple tool to evaluate a surface with a triangular pattern and unfold this pattern in a series of bands. These bands are tabbed an numbered for easy assembly. This script is the first and simplest step in a series of rhinoscripts which will attempt to provide rigid structural skins with a simple triangulation technique.
| platform: Rhino Script |
| function: Fabrication |
Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Design>
'Script version Monday, May 26, 2008 1:43:26 PM
Call Main()
Sub Main()
Dim surf
surf = Rhino.GetObject("select surface",8)
If isNull(surf) Then Exit Sub
Call reparameterize(surf)
Dim arrItems, arrValues, arrResults
arrItems = array("Colums","Rows","Offset","tabHeight","ripple","cutTemplate","surfaces")
arrValues= array(20,20,2,1,False,True,True)
arrResults = Rhino.PropertyListBox (arrItems, arrValues ,,"Volume Parameters")
Dim tri
Call Rhino.EnableRedraw(False)
tri = TriangulateSurface(surf,CDbl(arrResults(0)),CDbl(arrResults(1)),CDbl(arrResults(2)),array(CBool(arrResults(4))))
If CBool(arrResults(6)) = True Then
Call SurfaceMe(tri,RGB(255,0,0))
End If
If CBool(arrResults(5)) = True Then
Call UnfoldMe(tri,CDbl(arrResults(3)))
End If
Call Rhino.EnableRedraw(True)
End Sub
Function TriangulateSurface(surface,cols,rows,offset,arrBln)
TriangulateSurface = Null
Dim i,j
Dim uDom,vDom,uStep,vStep
uDom = Rhino.SurfaceDomain(surface,0)(1): uStep = uDom/cols
vDom = Rhino.SurfaceDomain(surface,1)(1): VStep = vDom/rows
ReDim uv(rows),pt(rows),uvSet(cols),ptSet(cols)
'plot point grid
For i = 0 To cols Step 1
For j = 0 To rows Step 1
uv(j) = array(i*uStep,j*vStep)
If i Mod(2) Then
If j Mod(2) Then
pt(j) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,uv(j)),Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface,uv(j))),offset))
Else
pt(j) = Rhino.EvaluateSurface(surface,uv(j))
End If
Else
If j Mod(2) Then
pt(j) = Rhino.EvaluateSurface(surface,uv(j))
Else
If arrBln(0) = True Then
pt(j) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,uv(j)),Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface,uv(j))),-offset))
Else
pt(j) = Rhino.PointAdd(Rhino.EvaluateSurface(surface,uv(j)),Rhino.VectorScale(Rhino.VectorUnitize(Rhino.SurfaceNormal(surface,uv(j))),offset))
End If
End If
End If
Next
uvSet(i) = uv
ptSet(i) = pt
Next
TriangulateSurface = ptSet
End Function
Function SurfaceMe(ptSet,objClr)
SurfaceMe = Null
If Rhino.IsLayer("surfaces") = False Then
Call Rhino.AddLayer("surfaces",RGB(0,0,255))
End If
Dim i,j
Dim cols, rows
cols = uBound(ptSet)
rows = uBound(ptSet(0))
Dim srfA(),srfB()
ReDim srfA(rows-1),srfB(rows-1)
ReDim s(cols-1)
For i = 0 To cols-1 Step 1
For j = 0 To rows-1 Step 1
If i Mod(2) Then
If j Mod(2) Then
srfA(j) = Rhino.AddSrfPt(array(ptSet(i)(j),ptSet(i)(j+1),ptSet(i+1)(j)))
srfB(j) = Rhino.AddSrfPt(array(ptSet(i+1)(j+1),ptSet(i)(j+1),ptSet(i+1)(j)))
Else
srfA(j) = Rhino.AddSrfPt(array(ptSet(i+1)(j),ptSet(i+1)(j+1),ptSet(i)(j)))
srfB(j) = Rhino.AddSrfPt(array(ptSet(i)(j+1),ptSet(i+1)(j+1),ptSet(i)(j)))
End If
Else
If j Mod(2) Then
srfA(j) = Rhino.AddSrfPt(array(ptSet(i+1)(j),ptSet(i+1)(j+1),ptSet(i)(j)))
srfB(j) = Rhino.AddSrfPt(array(ptSet(i)(j+1),ptSet(i+1)(j+1),ptSet(i)(j)))
Else
srfA(j) = Rhino.AddSrfPt(array(ptSet(i)(j),ptSet(i)(j+1),ptSet(i+1)(j)))
srfB(j) = Rhino.AddSrfPt(array(ptSet(i+1)(j+1),ptSet(i)(j+1),ptSet(i+1)(j)))
End If
End If
Call Rhino.ObjectColor(srfA(j),objClr)
Call Rhino.ObjectColor(srfB(j),objClr)
Call Rhino.ObjectLayer(srfA(j),"surfaces")
Call Rhino.ObjectLayer(srfB(j),"surfaces")
Next
s(i) = array(srfA,srfB)
Next
SurfaceMe = s
End Function
Function UnfoldMe(ptSet,tabHeight)
UnfoldMe= Null
If Rhino.IsLayer("cuts") = False Then
Call Rhino.AddLayer("cuts",RGB(255,0,0))
End If
If Rhino.IsLayer("scores") = False Then
Call Rhino.AddLayer("scores",RGB(0,0,0))
End If
Dim i,j,r
Dim cols, rows, wrldCS
cols = uBound(ptSet)
rows = uBound(ptSet(0))
wrldCS = Rhino.WorldXYPlane()
Dim oriPt(), angX(), ptA(), ptB(), ptC(),pts(),minX(),maxX(),mn(),mx()
ReDim oriPt(rows-1), angX(rows-1), ptA(rows-1), ptB(rows-1), ptC(rows-1),minX(rows-1),maxX(rows-1),mn(cols-1),mx(cols-1),pts(cols-1)
Dim angA(),angB(),angC(),disA(),disB(),disC(),s(),a(),d()
ReDim angA(rows-1),angB(rows-1),angC(rows-1),disA(rows-1),disB(rows-1),disC(rows-1)
ReDim a(cols-1), d(cols-1)
For i = 0 To cols-1 Step 1
For j = 0 To rows-1 Step 1
If i Mod(2) Then
If j Mod(2) Then
angA(j) = Rhino.angle2(array(ptSet(i)(j),ptSet(i+1)(j)),array(ptSet(i)(j),ptSet(i)(j+1)))(0)
angB(j) = Rhino.angle2(array(ptSet(i+1)(j),ptSet(i)(j)),array(ptSet(i+1)(j),ptSet(i)(j+1)))(0)
angC(j) = Rhino.angle2(array(ptSet(i+1)(j),ptSet(i)(j+1)),array(ptSet(i+1)(j),ptSet(i+1)(j+1)))(0)
disA(j) = Rhino.Distance(ptSet(i)(j),ptSet(i+1)(j))
disB(j) = Rhino.Distance(ptSet(i)(j),ptSet(i)(j+1))
disC(j) = Rhino.Distance(ptSet(i+1)(j),ptSet(i+1)(j+1))
Else
angA(j) = Rhino.angle2(array(ptSet(i+1)(j),ptSet(i)(j)),array(ptSet(i+1)(j),ptSet(i+1)(j+1)))(0)
angB(j) = Rhino.angle2(array(ptSet(i)(j),ptSet(i+1)(j)),array(ptSet(i)(j),ptSet(i+1)(j+1)))(0)
angC(j) = Rhino.angle2(array(ptSet(i)(j),ptSet(i+1)(j+1)),array(ptSet(i)(j),ptSet(i)(j+1)))(0)
disA(j) = Rhino.Distance(ptSet(i+1)(j),ptSet(i)(j))
disB(j) = Rhino.Distance(ptSet(i+1)(j),ptSet(i+1)(j+1))
disC(j) = Rhino.Distance(ptSet(i)(j),ptSet(i)(j+1))
End If
Else
If j Mod(2) Then
angA(j) = Rhino.angle2(array(ptSet(i+1)(j),ptSet(i)(j)),array(ptSet(i+1)(j),ptSet(i+1)(j+1)))(0)
angB(j) = Rhino.angle2(array(ptSet(i)(j),ptSet(i+1)(j)),array(ptSet(i)(j),ptSet(i+1)(j+1)))(0)
angC(j) = Rhino.angle2(array(ptSet(i)(j),ptSet(i+1)(j+1)),array(ptSet(i)(j),ptSet(i)(j+1)))(0)
disA(j) = Rhino.Distance(ptSet(i+1)(j),ptSet(i)(j))
disB(j) = Rhino.Distance(ptSet(i+1)(j),ptSet(i+1)(j+1))
disC(j) = Rhino.Distance(ptSet(i)(j),ptSet(i)(j+1))
Else
angA(j) = Rhino.angle2(array(ptSet(i)(j),ptSet(i+1)(j)),array(ptSet(i)(j),ptSet(i)(j+1)))(0)
angB(j) = Rhino.angle2(array(ptSet(i+1)(j),ptSet(i)(j)),array(ptSet(i+1)(j),ptSet(i)(j+1)))(0)
angC(j) = Rhino.angle2(array(ptSet(i+1)(j),ptSet(i)(j+1)),array(ptSet(i+1)(j),ptSet(i+1)(j+1)))(0)
disA(j) = Rhino.Distance(ptSet(i)(j),ptSet(i+1)(j))
disB(j) = Rhino.Distance(ptSet(i)(j),ptSet(i)(j+1))
disC(j) = Rhino.Distance(ptSet(i+1)(j),ptSet(i+1)(j+1))
End If
End If
Next
a(i) = array(angA,angB,angC)
d(i) = array(disA,disB,disC)
Next
For i = 0 To cols-1 Step 1
r=0
For j = 0 To rows-1 Step 1
If j = 0 Then
oriPt(j) = array(0,0,0)
angX(j) = 0
Else
oriPt(j) = ptB(j-1)
If ptB(j-1)(1) > ptC(j-1)(1) Then
angX(j) = -Rhino.Angle2(array(ptB(j-1),Rhino.PointAdd(ptB(j-1),wrldCS(1))),array(ptB(j-1),ptC(j-1)))(0)
Else
angX(j) = Rhino.Angle2(array(ptB(j-1),Rhino.PointAdd(ptB(j-1),wrldCS(1))),array(ptB(j-1),ptC(j-1)))(0)
End If
End If
If i Mod(2) Then
r = j+1
Else
r = j
End If
If r Mod(2) Then
ptA(j) = Rhino.PointAdd(oriPt(j),Rhino.VectorScale(Rhino.VectorRotate(wrldCS(1),angX(j),wrldCS(3)),d(i)(0)(j)))
ptB(j) = Rhino.PointAdd(oriPt(j),Rhino.VectorScale(Rhino.VectorRotate(wrldCS(1),angX(j)+a(i)(1)(j)+a(i)(2)(j),wrldCS(3)),d(i)(2)(j)))
ptC(j) = Rhino.PointAdd(ptA(j),Rhino.VectorScale(Rhino.VectorRotate(wrldCS(1),angX(j)+180-a(i)(0)(j),wrldCS(3)),d(i)(1)(j)))
Else
ptA(j) = Rhino.PointAdd(oriPt(j),Rhino.VectorScale(Rhino.VectorRotate(wrldCS(1),angX(j),wrldCS(3)),d(i)(0)(j)))
ptB(j) = Rhino.PointAdd(oriPt(j),Rhino.VectorScale(Rhino.VectorRotate(wrldCS(1),angX(j)+a(i)(0)(j),wrldCS(3)),d(i)(1)(j)))
ptC(j) = Rhino.PointAdd(ptA(j),Rhino.VectorScale(Rhino.VectorRotate(wrldCS(1),angX(j)+180-a(i)(1)(j)-a(i)(2)(j),wrldCS(3)),d(i)(2)(j)))
End If
minX(j) = Rhino.Min(array(ptA(j)(0),ptB(j)(0),ptC(j)(0)))
maxX(j) = Rhino.Max(array(ptA(j)(0),ptB(j)(0),ptC(j)(0)))
r=r+1
Next
mn(i) = Rhino.Min(minX)
If mn(i) > 0 Then
mn(i) = 0
Else
mn(i) = abs(mn(i))
End If
mx(i) = abs(Rhino.Max(maxX))
pts(i) = array(oriPt,ptA,ptB,ptC)
Next
Dim ptX, k
Dim edge(),edgeA(), edgeB(), span()
ReDim edge(cols-1),edgeA(rows-1), edgeB(rows-1), span(rows*2)
r=0
For i = 0 To cols-1 Step 1
k=0
If i > 0 Then
r = r+mx(i-1)+mn(i)+tabHeight*2
End If
For j = 0 To rows-1 Step 1
ptX = array(r,0,0)
If j Mod(2) Then
span(k) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(0)(j)),Rhino.PointAdd(ptX,pts(i)(3)(j)))
Call Rhino.ObjectLayer(span(k),"scores")
k=k+1
Else
span(k) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(1)(j)),Rhino.PointAdd(ptX,pts(i)(2)(j)))
Call Rhino.ObjectLayer(span(k),"scores")
k=k+1
End If
If j = 0 Then
span(k) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(0)(j)),Rhino.PointAdd(ptX,pts(i)(1)(j)))
Call Rhino.ObjectLayer(span(k),"cuts")
k=k+1
End If
If j = rows-1 Then
span(k) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(2)(j)),Rhino.PointAdd(ptX,pts(i)(3)(j)))
Call Rhino.ObjectLayer(span(k),"cuts")
k=k+1
Else
span(k) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(2)(j)),Rhino.PointAdd(ptX,pts(i)(3)(j)))
Call Rhino.ObjectLayer(span(k),"scores")
k=k+1
End If
edgeA(j) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(0)(j)),Rhino.PointAdd(ptX,pts(i)(2)(j)))
Call Rhino.ObjectLayer(edgeA(j),"scores")
edgeB(j) = Rhino.AddLine(Rhino.PointAdd(ptX,pts(i)(1)(j)),Rhino.PointAdd(ptX,pts(i)(3)(j)))
Call Rhino.ObjectLayer(edgeB(j),"scores")
Next
edge(i) = array(edgeA,edgeB)
Next
Dim tabA(), tabB(), lblA(), lblB()
ReDim tabA(rows-1), tabB(rows-1), lblA(rows-1), lblB(rows-1)
For i = 0 To cols-1 Step 1
For j = 0 To rows-1 Step 1
tabA(j) = tabMaker(edge(i)(0)(j),-90,tabHeight)
tabB(j) = tabMaker(edge(i)(1)(j),90,tabHeight)
Call Rhino.ObjectLayer(tabA(j),"cuts")
Call Rhino.ObjectLayer(tabB(j),"cuts")
If i = cols-1 Then
lblB(j) = labelMaker(edge(i)(1)(j),cols-1 & "." & j,tabHeight*.25,0,True)
Else
lblB(j) = labelMaker(edge(i)(1)(j),i+1 & "." & j,tabHeight*.25,0,True)
End If
lblA(j) = labelMaker(edge(i)(0)(j),i & "." & j,tabHeight*.25,180,True)
Next
Next
End Function
Function tabMaker(curve,rotVal,scale)
tabMaker = Null
Dim tabLN(1), tabPT(2),crvDom, wrldCS, i
crvDom = Rhino.CurveDomain(curve)
wrldCS = Rhino.WorldXYPlane()
tabPT(0) = Rhino.CurveStartPoint(curve)
tabPT(2) = Rhino.CurveEndPoint(curve)
tabPT(1) = Rhino.PointAdd(Rhino.EvaluateCurve(curve,crvDom(1)*.5),Rhino.VectorScale(Rhino.VectorUnitize(Rhino.VectorRotate(Rhino.VectorCreate(Rhino.EvaluateCurve(curve,crvDom(1)*.4),tabPT(2)),rotVal,wrldCS(3))),scale))
For i = 0 To 1 Step 1
tabLN(i) = Rhino.AddLine(tabPT(i),tabPT(i+1))
Next
tabMaker = tabLN
End Function
Function labelMaker(curve,title,size,angle,blnAlign)
labelMaker = Null
Dim txt, wrldCS
If Rhino.IsLayer("numbering") = False Then
Call Rhino.AddLayer("numbering",RGB(0,255,0))
End If
wrldCS = Rhino.WorldXYPlane()
txt = Rhino.AddText(title,Rhino.CurveMidPoint(curve),size)
If blnAlign = True Then
Call Rhino.TextObjectPlane(txt,array(Rhino.CurveMidPoint(curve),Rhino.VectorCreate(Rhino.CurveMidPoint(curve),Rhino.CurveEndPoint(curve)),Rhino.VectorRotate(Rhino.VectorCreate(Rhino.CurveMidPoint(curve),Rhino.CurveEndPoint(curve)),90,wrldCS(3)),wrldCS(3)))
Call Rhino.RotateObject(txt,Rhino.CurveMidPoint(curve),angle,wrldCS(3))
End If
Call Rhino.ObjectLayer(txt,"numbering")
labelMaker = txt
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



