A pool of resources
Rib Maker

  


Well, I finally made one. Ive been putting it off for a while, because so many of them already exist, but it provided the opportunity to look at information sorting in a more streamlined pattern. This Rib fabrication Rhino script allows the user to select a surface, input the row and column count, specify the rib dimensions, then sit back, have a coffee and let the computer do the work.


platform: Rhino Script
function: Fabrication

 


 

Option Explicit
'Script written by <David Mans>
'Adapted from concepts provided Andrew Payne of Lift Architects
'http://www.liftarchitects.com/
'Script adapted by <Neoarchaic Studio>
'Script version Thursday, April 02, 2009 12:47:23 AM

Call Main()
Sub Main()
	Dim surface, arrValue
	surface = Rhino.GetObject("Select Surface",8,True)
	If isNull(surface) Then Exit Sub
	Call reparameterize(surface)

	arrValue = Rhino.PropertyListBox(array("Columns","Rows","Rib Height","Rib Width","Tile Spacing","textHeight"),array(10,10,1,0.2,1,0.25))
	If isNull(arrValue) Then Exit Sub

	Call Rhino.EnableRedraw(False)
	Dim bBox: bBox = Rhino.BoundingBox(surface)
	Dim dist: dist = Rhino.Distance(bBox(0),bBox(4))

	Dim grid, ribs, draw
	grid = projectGrid(surface,CInt(arrValue(0)),CInt(arrValue(1)))
	ribs = makeRib(grid,CDbl(arrValue(2)),CDbl(arrValue(3)),dist)
	draw = makeDrawing(ribs(1),CDbl(arrValue(4)),CDbl(arrValue(5)))
	Call Rhino.DeleteObjects(grid(0))
	Call Rhino.DeleteObjects(grid(1))

	Call Rhino.EnableRedraw(True)
End Sub
Function projectGrid(surface,cols,rows)
	projectGrid = Null
	Dim i,j,k,r,s
	Dim bBox, order, edge(3)
	Dim tCrv,crv(1),pCrv(),arrCrv,dom(1), cStp(1)

	bBox = Rhino.BoundingBox(surface)
	order = array(4,5,7,6,4,7,5,6)

	r=0
	For i = 0 To 3 Step 1
		edge(i) = Rhino.AddLine(bBox(order(r)),bBox(order(r+1)))
		r = r+2
	Next
	order = array(cols,rows)
	r=0
	For i = 0 To 1 Step 1
		s=0
		dom(0) = Rhino.CurveDomain(edge(r))
		dom(1) = Rhino.CurveDomain(edge(r+1))
		cStp(0) = (dom(0)(1)-dom(0)(0))/order(i)
		cStp(1) = (dom(1)(1)-dom(1)(0))/order(i)
		For j = 0 To order(i)-1 Step 1
			tCrv = Rhino.AddLine(Rhino.EvaluateCurve(edge(r),dom(0)(0)+cStp(0)*0.5+cStp(0)*j),Rhino.EvaluateCurve(edge(r+1),dom(1)(0)+cStp(1)*0.5+cStp(1)*j))
			arrCrv = Rhino.ProjectCurveToSurface(tCrv,surface,Rhino.VectorReverse(Rhino.WorldXYPlane()(3)))
			Call Rhino.DeleteObject(tCrv)
			For k = 0 To uBound(arrCrv) Step 1
				ReDim Preserve pCrv(s)
				pCrv(s) = arrCrv(k)
				s = s+1
			Next
		Next
		crv(i) = pCrv
		r=r+2
	Next
	Call Rhino.DeleteObjects(edge)
	projectGrid = crv
End Function
Function makeRib(curves,height,width,zHeight)
	makeRib = Null
	Dim i,j,k,r
	Dim intersect, tPt
	Dim arrObject()
	Dim blnBlock, xVal, yVal, zVal, tPts(7)

	xVal = array(-width*0.5,-width*0.5,width*0.5,width*0.5)
	yVal = array(-width*0.5,width*0.5,width*0.5,-width*0.5)
	zVal = array(0,height*2+zHeight)
	r=0
	For i = 0 To 1 Step 1
		For j = 0 To 3 Step 1
			tPts(r) = array(xVal(j),yVal(j),zVal(i))
			r=r+1
		Next
	Next
	blnBlock = Rhino.AddBox(tPts)

	r=0
	For i = 0 To uBound(curves(0)) Step 1
		For j = 0 To uBound(curves(1)) Step 1
			intersect = Rhino.CurveCurveIntersection(curves(0)(i),curves(1)(j))
			If isNull(intersect) Then
			Else
				ReDim Preserve arrObject(r)
				tPt = intersect(0,1)
				arrObject(r) = Rhino.CopyObject(blnBlock,array(0,0,0),tPt)
				r=r+1
			End If
		Next
	Next

	Dim tRib, rib(), tCurve()
	Dim ribSet(1), cutRibs(1),tLine(1),ribCurve(1)

	tLine(0) = Rhino.AddLine(array(0,0,0), array(width,0,0))
	tLine(1) = Rhino.AddLine(array(0,0,0), array(0,width,0))

	For i = 0 To 1 Step 1
		ReDim rib(uBOund(curves(i)))
		For j = 0 To uBOund(curves(i)) Step 1
			Call Rhino.AddTextDot(i & "-" & j,Rhino.CurveEndPoint(curves(i)(j)))
			tRib = Rhino.ExtrudeCurveStraight(curves(i)(j),array(0,0,0),array(0,0,height))
			Call Rhino.MoveObject(tRib,Rhino.CurveEndPoint(tLine(i)),Rhino.CurveMidPoint(tLine(i)))
			rib(j) = Rhino.ExtrudeSurface(tRib,tLine(i))
			Call Rhino.DeleteObject(tRib)
		Next
		ribSet(i) = rib
	Next

	For i = 0 To 1 Step 1
		ReDim tCurve(uBound(ribSet(i)))
		If i = 0 Then
			Call Rhino.MoveObjects(arrObject,array(0,0,0),array(0,0,height*0.5))
		Else
			Call Rhino.MoveObjects(arrObject,array(0,0,0),array(0,0,-height*2-zHeight))
		End If
		cutRibs(i) = Rhino.BooleanDifference(ribSet(i),arrObject,False)
		For j = 0 To ubound(cutRibs(i)) Step 1
			tCurve(j) = Rhino.ProjectCurveToSurface(curves(i)(j),cutRibs(i)(j),Rhino.VectorReverse(Rhino.WorldXYPlane()(3)))(0)
		Next
		ribCurve(i) = tCurve
		Call Rhino.DeleteObjects(ribSet(i))
	Next

	Call Rhino.DeleteObjects(arrObject)
	Call Rhino.DeleteObjects(tLine)
	Call Rhino.DeleteObject(blnBlock)
	makeRib = array(cutRibs,ribCurve)
End Function
Function makeDrawing(arrCrvs,spacing,tHeight)
	makeDrawing = Null
	Dim i,j
	Dim cPlane, wPlane, bBox, tObject(), objects()
	ReDim objects(uBOund(arrCrvs))

	Dim pPt, tPt
	Dim xPos, yPos, tPos, ySet()

	For i = 0 To uBound(arrCrvs) Step 1
		ReDim tObject(uBound(arrCrvs(i)))
		For j = 0 To uBound(arrCrvs(i)) Step 1
			cPlane = Rhino.CurvePlane(arrCrvs(i)(j))
			wPlane = Rhino.WorldXYPlane()
			tObject(j) = Rhino.OrientObject(arrCrvs(i)(j),array(cPlane(0),Rhino.PointAdd(cPlane(0),cPlane(1)),Rhino.PointAdd(cPlane(0),cPlane(2))),array(wPlane(0),wPlane(1),wPlane(2)))
			bBox = Rhino.BoundingBox(tObject(j))
			Call Rhino.MoveObject(tObject(j),bBox(0),array(0,0,0))
		Next
		objects(i) = tObject
	Next
	yPos = 0
	For i = 0 To uBound(arrCrvs) Step 1
		tPos = 0
		xPos = 0
		ReDim ySet(uBound(arrCrvs(i)))
		For j = 0 To uBound(arrCrvs(i)) Step 1
			bBox = Rhino.BoundingBox(objects(i)(j))
			pPt = array(xPos,yPos,0)
			If j > 0 Then
				tPos = xPos
				xPos = tPos+Rhino.Distance(bBox(0),bBox(1))+spacing
			Else
				xPos = bBox(1)(0)+spacing
			End If
			Call Rhino.MoveObject(objects(i)(j),bBox(0),pPt)
			Call Rhino.AddText(i & "-" & j,Rhino.CurveStartPoint(objects(i)(j)),tHeight)
			ySet(j) = bBox(2)(1)
		Next
		yPos = Rhino.Max(ySet)+spacing
	Next
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


5 Responses Subscribe to comments


  1. rasim

    hi!
    thanks for that i was looking exactly for something like that and it is here :)
    but some how i couldnt run that :(
    is there a possibility that i need to install something?

    Jun 30, 2010 @ 10:22 am


  2. rasim

    hi again
     
    i maneged to run it by help of a friend sorry for that. what you have done is awesome. thank you
     
    but i wish this script allows us to rib polysurfaces too not only surfaces and rib it where we want
     

    Jun 30, 2010 @ 11:59 am

  3. I can't run it maby i did sth wrong help me plz i realy need this script for my prjoct:(sorry if my question is so simple but plz someone explain me how should i run this script?(sorry if my english is so bad)

    Oct 13, 2011 @ 12:14 pm


  4. Julian

    Hi there,
    Im new to rhinoscripting and i don't understand how to run this script.
    If i copy and paste it into my script editor in rhino (or monkey editor) it doesnt work properly
    what am i doing wrong?
    any help much appreciated

    Jan 19, 2012 @ 12:50 am


  5. David Mans

    You may be copying the line numbers from the left hand column as well.
    You’ll need to click the “view source” option in the upper right hand corner of the code box

    Mar 18, 2012 @ 11:14 am

Reply