Random header image at NeoArchaic Design

Triangulate Tile

March 6th, 2010  |  Published in Fabrication Scripts, Posts, Resources


This simple triangulation fabrication script evaluates a surface and creates a tiled set of triangulated pieces with incrementally numbered tabs. To assemble, simply combine tabs with matching numbers… and your done.


platform: Rhino Script
function: Fabrication

 

Option Explicit
'Script written by <David Mans>
'Script copyrighted by <Neoarchaic Studio>
'Script version Saturday, March 07, 2009 6:11:13 PM

Call Main()
Sub Main()
	Dim surface, arrValue
	Dim cols, rows, dept, spac
	surface = Rhino.GetObject("Select Surface",8,True)
	If isnull(surface) Then Exit Sub

	arrValue = Rhino.PropertyListBox(array("Columns","Rows","TabHeight","Spacing"),array(10,10,2,2),"Surface Parameters","Input Parameters")
	If isNull(arrValue) Then Exit Sub

	cols = CDbl(arrValue(0))
	rows = CDbl(arrValue(1))
	dept = CDbl(arrValue(2))
	spac = CDbl(arrValue(3))

	Call reparameterize(surface)
	Call Rhino.EnableRedraw(False)

	Dim triangles, cuts, tile, tabs,tri
	triangles = triangulate(surface,cols,rows)
	cuts = reOrient(triangles)
	tile = tileObjects(cuts, spac+dept)
	tri = drawTriangle(triangles)

	Dim i,j,k,r,s,t
	For i = 0 To ubound(triangles) Step 1
		r = 0
		s = 0
		For j = 0 To ubound(triangles(i)) Step 1
			If j Mod(2) Then
				s = s+1
				t = i+1
			Else
				r = r+1
				t = i
			End If
			tabs = tabmaker(tile(i)(j)(0),dept,CStr(i & "." & "0." & r))
			Call labelEdge(tri(i)(j)(0),CStr(i & "." & "0." & r))

			tabs = tabmaker(tile(i)(j)(1),dept,CStr(i & "." & "1." &  s))
			Call labelEdge(tri(i)(j)(1),CStr(i & "." & "1." &  s))

			tabs = tabmaker(tile(i)(j)(2),dept,CStr("2." & i & "." & r))
			Call labelEdge(tri(i)(j)(2),CStr("2." & t & "." & r))
			Call Rhino.AddSrfPt(triangles(i)(j))
		Next
	Next
	Call Rhino.EnableRedraw(True)

End Sub
Function drawTriangle(arrPoints)
	drawTriangle = Null
	Dim i,j,k
	Dim curve(), arrOutput(),crv(2)
	ReDim curve(ubound(arrPoints(0))), arrOutput(ubound(arrPoints))
	For i = 0 To ubound(arrPoints) Step 1
		For j = 0 To ubound(arrPoints(i)) Step 1
			For k = 0 To 2 Step 1
				crv(k) = Rhino.AddLine(arrPoints(i)(j)(k),arrPoints(i)(j)(k+1))
			Next
			curve(j) = crv
		Next
		arrOutput(i) = curve
	Next

	drawTriangle = arrOutput
End Function
Function reOrient(arrPoints)
	reOrient = Null
	Dim i,j,k
	Dim cPlane, wplane
	Dim curve(), arrOutput(),crv(2)
	ReDim curve(ubound(arrPoints(0))), arrOutput(ubound(arrPoints))
	For i = 0 To ubound(arrPoints) Step 1
		For j = 0 To ubound(arrPoints(i)) Step 1
			For k = 0 To 2 Step 1
				crv(k) = Rhino.AddLine(arrPoints(i)(j)(k),arrPoints(i)(j)(k+1))
				Call Rhino.ObjectColor(crv(k),RGB(255,0,0))
				Call Rhino.OrientObject(crv(k),array(arrPoints(i)(j)(0),arrPoints(i)(j)(1),arrPoints(i)(j)(2)),array(array(0,0,0),array(1,0,0),array(0,1,0)))
			Next
			curve(j) = crv
		Next
		arrOutput(i) = curve
	Next

	reOrient = arrOutput
End Function
Function tabMaker(curve,depth,text)
	tabMaker = Null
	Dim arrOutput, pt(3), txt
	pt(0) = Rhino.CurveMidPoint(curve)
	pt(1) = Rhino.CurveStartPoint(curve)
	pt(2) = Rhino.CurveEndPoint(curve)
	pt(3) = Rhino.PointAdd(pt(0),Rhino.VectorRotate(Rhino.VectorScale(Rhino.VectorUnitize(Rhino.VectorCreate(pt(1),pt(2))),depth),90,Rhino.WorldXYPlane()(3)))
	arrOutput = Rhino.AddPolyline(array(pt(1),pt(3),pt(2)))
	txt = Rhino.AddText(text,pt(0),depth*0.3)
	Call Rhino.ObjectColor(txt,RGB(0,255,0))
	Call Rhino.OrientObject(txt,array(pt(0),array(pt(0)(0)+1,pt(0)(1),pt(0)(2)),array(pt(0)(0),pt(0)(1)+1,pt(0)(2))),array(pt(0),pt(1),pt(3)))
	tabMaker = arrOutput
End Function
Function labelEdge(curve,text)
	labelEdge = Null
	Dim arrOutput, pt
	pt = Rhino.CurveMidPoint(curve)
	arrOutput = Rhino.AddTextDot(text,pt)
	labelEdge = arrOutput
End Function
Function tileObjects(arrObjects, spacing)
	tileObjects = Null
	Dim arrOutput(), arrVal()
	ReDim arrOutput(ubound(arrObjects)), arrVal(ubound(arrObjects(0)))
	Dim i,j,r,s
	Dim bBox, xDis(), yDis(), maxVal
	ReDim xDis(ubound(arrObjects(0))),yDis(ubound(arrObjects(0)))
	r = 0
	For i = 0 To uBound(arrObjects) Step 1
		r = r+maxVal+spacing
		s = 0
		For j = 0 To uBound(arrObjects(i)) Step 1
			bBox = Rhino.BoundingBox(arrObjects(i)(j))
			xDis(j) = Rhino.Distance(bBox(0),bBox(1))
			yDis(j) = Rhino.Distance(bBox(0),bBox(3))
			If j > 0 Then
				s = s+yDis(j-1)+spacing
			End If
			arrVal(j) = Rhino.MoveObjects(arrObjects(i)(j),array(0,0,0),array(r,s,0))
		Next
		maxVal = Rhino.Max(xDis)
		arrOutput(i) = arrVal
	Next

	tileObjects = arrOutput
End Function
Function triangulate(surface,cols,rows)
	triangulate = Null
	Dim arrOutput(), arrVal(), tVal(3), iStep, jStep
	ReDim arrOutput(rows-1), arrVal(cols*2-1)
	Dim i,j,r

	iStep = Rhino.SurfaceDomain(surface,0)(1)/rows
	jStep = Rhino.SurfaceDomain(surface,1)(1)/cols

	For i = 0 To rows-1 Step 1
		r=0
		For j = 0 To cols-1 Step 1
			tval(0) = Rhino.EvaluateSurface(surface,array(iStep*i,jStep*(j+1)))
			tval(1) = Rhino.EvaluateSurface(surface,array(iStep*(i+1),jStep*j))
			tval(2) = Rhino.EvaluateSurface(surface,array(iStep*i,jStep*j))
			tval(3) = tval(0)

			arrVal(r) = tval

			tval(0) = Rhino.EvaluateSurface(surface,array(iStep*(i+1),jStep*j))
			tval(1) = Rhino.EvaluateSurface(surface,array(iStep*i,jStep*(j+1)))
			tval(2) = Rhino.EvaluateSurface(surface,array(iStep*(i+1),jStep*(j+1)))
			tval(3) = tval(0)
			arrVal(r+1) = tval

			r=r+2
		Next
		arrOutput(i) = arrVal
	Next

	triangulate = arrOutput
End Function
Function reparameterize(strCurveID)
	If Rhino.IsCurve(strCurveID) = True Then
		Call rhino.SelectObject(strCurveID)
		Call rhino.Command("reparameterize 0 1")
		Call rhino.UnselectAllObjects()
	End If
	If Rhino.IsSurface(strCurveID) = True Then
		Call rhino.SelectObject(strCurveID)
		Call rhino.Command("reparameterize 0 1 0 1")
		Call rhino.UnselectAllObjects()
	End If
End Function

Leave a Response


NeoArchaic Design

principle: David Mans
e: david@neoarchaic.net

Prototypes

Associates


NeoArchaic Network

NeoArchaic Gallery

untitled untitled untitled Akron Art Museum DC Metro Gifu Convention Center_03 Brooklyn Bridge Tokyo International Forum_05 Serene Street untitled Yokohama Ferry Terminal_08 untitled
View more photos >

Wordpress Code Snippet by Allan Collins