Complex Bamboo Space Frame Structures

Forty of the 2nd year students of the University School of Architecture and Planning (USAP) who were a part of the architectural design studio exercise with Abhishek Bij, Malini Kochupillai, Kanishka Prasad and me, completed the full-scale structures for their college festival. A big thank you to everyone who was a part of this!

You can read a detailed description of the project in this previous post.

This slideshow requires JavaScript.

Ghosla Roof Update: Paper Accepted to CAADRIA, 2013

A paper outlining the theoretical and technical ideas behind the “Ghosla (nest) Roof” titled “Digitally Designed Architectural Form Built Using Craft-Based Fabrication: Weaving a Complex Surface as a Bamboo Reticulated Shell” has been accepted to the CAADRIA, 2013 conference of the The Association for Computer-Aided Architectural Design Research in Asia, to be held at the National University of Singapore’s Department of Architecture from May 15th to 18th this year. The theme of the conference this year is “Open Systems” which suits the collaborative nature of the Nest Roof project where digital design methodologies are combined with craft-based construction and non-industrial materials.

On site, the bamboo work has been completed, giving final form to the shell. Here are some pictures from the site –

This slideshow requires JavaScript.

Talk Given at the Annual Convention of the National Association of Students of Architecture

I gave a talk and conducted a workshop at Footprints, the annual convention of the National Association of Students of Architecture (NASA), held at the Gateway College of Architecture & Design from January 25th to 28th.

Here is a slide show and transcript of my talk –

This slideshow requires JavaScript.

Alternative Computation

Today I’m going to talk about the use of computation in architecture. A lot has been said about computation and its role in architecture since the early 1980s. Today, virtually any architectural practice uses computers in some form or the other. But it is not just architecture. Today, virtually any profession uses a computer in some form or the other.

So what is it that computation offers?

I am sure that all of you have wished that there was an “UNDO” command that you could use when you have made a mistake while building a model for your design studio. But of course, there is no “UNDO” command outside the computer. Have you ever wondered why?

In order to understand why this is so, I am going to have to briefly switch from architecture to thermodynamics. I am sure that all of you are familiar with the Second Law of Thermodynamics from your physics class in school. One version of this law states that “The disorder in a closed system will always increase.”

What this means is that you are not going to see spilt milk spontaneously gather back into a glass. You cannot “UNDO” the spilling of milk. And some people argue that the Second Law is what defines the direction in which time flows.

But how is it that a computer allows us to “UNDO” things? How is a plant able to grow with soil, water and sunlight? How does a machine make something as complex as a computer in the first place? These are all examples of more order being made from less order.

Well, there is a very convenient loophole to the Second Law. If you add energy to a system then you can increase order. The addition of energy from outside means that the system is no longer closed, but then no system is ever completely closed anyway.

The addition of energy therefore frees us from the second law. Plugging a Xerox machine into a socket allows it to make copies. Light falling on a leaf enables a plant to grow through photosynthesis and ultimately reproduce. Powering up a computer lets it “UNDO.”

So the way a system uses energy determines its relationship to disorder. On this basis, one can think of four different “Realms” or “Paradigms” – the mineral realm, where disorder always increases; the biological realm where order is propagated; the mechanical realm where disorder is controlled and order is created; and the digital realm where there is no disorder.

So what does the digital realm, with no disorder, offer the architecture?

It offers a clean slate as the starting screen of any CAD software will show you. It offers a void with no disorder where you are free to design without any encumbrances. You are free to do what you want.

While a blank sheet of paper is a two dimensional “void,” the computer offers a three dimensional blank slate. In addition to this, the computer offers the ability to process large amounts of information quickly.

If we think of “complexity” as the amount of information required to describe an object or phenomenon, then we can say that the information processing power of a computer allows architects to deal with complexity.

A project done by the studio that made use of what the digital realm offers is the Gateway to the JSPL power plant in Chhattisgarh, built in 2006. The form of this gateway creates a dialogue between local tribal geometries and industrial technology. The design development was undertaken through physical and 3D digital modelling with the geometric information of the digital model being used to create CNC pre-fabricated components that were assembled on site.

There was therefore a seamless flow of information from the digital model to the fabrication of the components by computer controlled machines which used data directly from the model. This allowed for very high precision and the coming together of the pre-fabricated parts smoothly on site in spite of the complexity of the form.

But if we re-visit the construction process of the gateway, we see that the digital realm, from which the design and the computer controlled fabrication comes, must eventually interact with the mineral, biological and mechanical realms. You see this in the critical step of fixing the structure to the footing in the ground. Had there been any mistake in the foundations, and had it not matched the digitally fabricated structure, there would have been no “UNDO.”

Another factor not immediately apparent is the amount of energy needed to manufacture the steel needed for the digital fabrication process. This energy is needed to create a material which is completely homogenous and uniform. The energy is needed to fuel machines which remove the disorder present in the mineral realm.

The removal of disorder from materials is needed when designing in the digital realm because design in the digital realm always begins with a perfectly ordered blank slate. And as long as one stays in the digital realm, there is no way of interacting with the disorder of other realms. While the digital design process can generate complexity, it cannot deal with disorder.

This is not a new thing in architecture. Historically, what has differentiated the architect from the master builder has been that the architect works on paper, in a space free of disorder. But the power of digital technologies available to architects today highlights the issue like never before.

The most obvious way to overcome this is to NOT start the design process in the digital realm – which is what I did in this small experiment with bamboo. Instead of starting with a blank slate, I started by scanning a piece of bamboo on a simple flatbed scanner, thereby digitizing disorder.

I used the scans of two pieces of bamboo to create digital models of them. Because I did not start with a blank slate but instead started by digitizing the disorder of the irregularly shaped bamboo, the computer had no problem in dealing with the complexity of its shape.

I then designed a joint between the two pieces where the angle is exactly 60 degrees. This joint was cut in the bamboo using a computer controlled router and the two pieces of bamboo were then tied with rope by hand. The computer was therefore able to negotiate the complexity of disorder and impose the order of a 60 degree joint on the bamboo.

But humans are much better at dealing with disorder. So can computers and humans collaborate with each other to build complex designs while negotiating disorder?

The first attempt at answering this question was the Parametric Pavilion project. For this project a parametric model was made to create a family of bamboo pavilions that can be built cheaply and quickly for a variety of functions. The parametric model can be manipulated to generate new forms based on programmatic requirements and site conditions. The parametric model outputs dimensioned drawings for construction on site where craftsmen negotiate the disorder inherent in bamboo with the computer generated dimensions.

The hyperbolic paraboloid shape of the pavilion as well as the gateway is part of a larger group of shapes known as ruled surfaces – surfaces that can be made from straight lines.

This geometry is such that the structure can be built using only length dimensions and there is no need to measure angles, curvatures, areas, etc. Linear measurements are the easiest to measure, requiring only a measuring tape to be placed against a piece of bamboo and lengths marked. The use of linear measurements minimizes the chances of errors and also makes the work of the craftsmen on site easier.

But can this technique of linear measurements be extended to more complex geometry?

If you take a flexible member and reduce the distance between its end points then it will curve. If you have a network of such members intersecting each other, then you can obtain virtually any surface you like. And this is nothing but weaving.

The Nest Roof is an on-going project where we are using weaving to construct a complex computer generated surface from bamboo through linear measurements alone.

The shape of the roof was the result of an algorithmic form-finding process resulting in a funicular shell structure. The shape of this shell was dictated by the plan form of the building.

It was decided to weave this shape out of bamboo as a reticulated shell structure. A reticulated shell is a doubly curved structure made from intersecting members of a flexible material. The flexibility of bamboo increases as it becomes thinner, but as it becomes thinner it also becomes weaker. The less a bamboo member has to curve, the thicker and stronger it can be. So an algorithm was created to find paths of minimal curvature along the shell surface along which to weave the bamboo.

The use of this algorithm allowed us to have 4” dia half-round bamboo members arranged in 6 layers to achieve a beam-depth of 2’.

In order to construct this, drawings were made where the lengths of bamboo between each intersection were given for each step of the weaving sequence. Since these lengths were more than the linear distance between the end points of each member, the desired curvature was achieved.

The craftsmen of site could therefore build this structurally optimized reticulated shell structure using only linear measurements. The craftsmen themselves could then focus on negotiating the disorder inherent in the bamboo such as joining two pieces of bamboo to create a continuous structural member, and place spacers of different sizes to absorb variations in the size of bamboo.

So, in this project the computer deals with the ordered aspect of design while human craftsmen deal with disorder, and, as architects we found an efficient way to transfer information from the computer to the craftsmen through linear measurements and weaving.

Welcome to the Craft Machine

Some months ago I found an article about an exhibition titled The Machine organized by the Design Hub Limburg that includes a fascinating tool for designers. This tool is the result of a project called  Computer Augmented Craft, which, the head of the project, Christian Feiberg, says, “is an attempt to utilise advanced technologies without sacrificing the unique qualities of craftsmanship.” The tool combines a set of sensors with Arduino and an interface created in Processing to enable a designer to have a real-time digital model of an artefact that they are physically producing. The software interface also provides “suggestions” at each step of construction to enable the designer to conform to an initial set of parameters or choose not to do so. The following video shows the system in use –

Reading about this tool and the exhibition reminded me of a student project I had done in the Command & Control design studio with Simon KimSkylar Tibbits and Juhong Park in 2009 at MIT. My project in this studio (focusing on using scripting as a design tool) included a script that created mass-customised joints for a post-earthquake shelter constructed as an irregular space frame out of found rubble. In this project the script did not dictate the form of the structure but only created fabrication data for a mass-customised joint component after the human builder had decided what member to use (from the post-earthquake rubble at hand) and where in the structure to place it. The script overcame the unpredictability of the materials at hand by taking inputs (on the length of a found member that the builder wanted to attach at a particular location) incrementally. The resulting digital model grew in tandem with the physical model allowing the builder to take independent design decisions while the script recorded the builder’s design moves and output fabrication data for the joint components needed at each step. If the builder got stuck and was unable to triangulate the space frame at any point then the script would suggest a method to triangulate.

My poster from the Command & Control studio in 2009. The green members in the main figure denote “found” members while the red members denote those added by the script to triangulate the space frame.

Re-visiting this old student project in the light of the “The Machine” exhibition resulted in a project for the Patterns and Performance 2nd year, B.Arch design studio I am teaching with Abhishek Bij at the University School of Architecture and Planning (USAP). For this exercise we collaborated with the studio taught by Malini Kochupillai and Kanishk Prasad to design a learning space for a group of 20 students. I wrote a new version of the script I had coded for my Command & Control project for use by the students. The new script did not focus on the joints and instead was designed for the specific design problem given to the students for this exercise – the design of a learning space housing 15 to 20 people using a space frame structure constructed from available members of irregular lengths. The students were given tutorials on space frames and introduced to the script written for them. They were introduced to different forms of education and their spatial implications – both interior and exterior.

After this, the students began their designs in groups of four, constructing 1:10 or 1:20 scale physical models of their structures and simultaneously using the script to “grow” a 3D computer model. This studio exercise exposed the students to the advantages and disadvantages of physical versus digital design processes, issues of error and tolerance in design and construction, the importance of improvisation and contingency and its incorporation into the design process.

2012-11-26 12.10.07
The physical and digital models growing side-by-side in the studio.

While my initial script written for the Command & Control studio focused on creating digitally fabricated joints, the script written for the USAP students included a panelization tool. This tool allowed the students to choose where to place panels on the space frame and have the script add these panels to the 3D model and also provide fabrication data for the panels so that they could be printed as a 2D triangle, cut and be added to the physical model.

The next step in the design studio will be to use what one has learnt constructing models and build a full-scale bamboo space frame as a learning space on the college campus. Observing the students work on the models I have updated the script for the full-scale structure. The updated script calculates the centre of gravity of the structure at each iteration of the design and construction process and gives a warning if the structure is likely to topple over without support. The reason for the addition of this feature in the script is that while it is easy to support a table-top model by hand if it is toppling over, this is not a trivial task during full-scale construction. This feature will allow the script to inform the steps in the physical construction process, while design decisions in response to space and material are taken in the physical world and fed into the script. Such a design process will aid in bringing the digital and physical worlds closer together to create a digitally augmented, craft-based, design process.

The latest version of the script written for the studio is given below (please note that there are still some bugs in calculating the centre of gravity) –

Option Explicit
‘Script written by <Ayodh Kamath>
‘Script version 18 November 2012 12:02:10

Call Main()
Sub Main()

Dim strStart, arrExist
Dim arrDots, arrLines, strExit
Dim i

Call Rhino.AddLayer(“uncut_members”, RGB(0,255,0))
Call Rhino.CurrentLayer(“uncut_members”)


strStart = Rhino.GetString(“Start from scratch [S], use existing geometry[G], triangulate with a single member [T], panelize [P], or exit[X]?”,,Array(“S”,”G”,”T”,”P”,”X”))

arrExist = Rhino.AllObjects()

If strStart = “S” Then

If IsArray(arrExist) Then

Call Rhino.DeleteObjects(arrExist)

End If

arrDots = Triangle(arrLines)
Call Rhino.UnselectAllObjects
arrDots = Tetrahedron(arrDots, arrLines)
Call Rhino.UnselectAllObjects

ElseIf strStart = “G” Then

Call Rhino.ZoomExtents(,True)
arrDots = Rhino.GetObjects(“Please drag a selection box around the existing text dot points and ‘Click+Cntrl’ to de-select any unwanted geometry.”,8192)
arrLines = Rhino.GetObjects(“Please drag a selection box around the existing lines and ‘Click+Cntrl’ to de-select any unwanted geometry.”,4)
arrDots = Sort(arrDots)

strExit = “A”


arrDots = Tetrahedron(arrDots, arrLines)
Call Rhino.UnselectAllObjects
strExit = Rhino.GetString(“Make another tetrahedron [A], or exit [X]?”,”A”, Array(“A”,”X”))

Loop While strExit <> “X”

ElseIf strStart = “T” Then

Call Triangulate(arrLines,arrDots)

ElseIf strStart = “P” Then

Call Panelize()

End If

Loop While strStart <> “X”

End Sub

Function Triangle(ByRef arrLines)

Dim dblLt1, dblLt2, dblLt3
Dim strLn0, strLn1, strLn2
Dim strDotP0, strDotP1, strDotP2a, strDotP2b, strDotP2
Dim strTempCirc1, strTempCirc2
Dim arrInt, arrIntPt0, arrIntPt1, strPt0, strPt1, strPt2
Dim strChoice, blnLoop

blnLoop = 0

Do While blnLoop = 0

dblLt1 = Rhino.GetReal(“Enter first lenght:”)

strLn0 = Rhino.AddLine(Array(0,0,0), Array(dblLt1,0,0))
strDotP0 = Rhino.AddTextDot(“P0”,Array(0,0,0))
strDotP1 = Rhino.AddTextDot(“P1”,Rhino.CurveEndPoint(strLn0))
Call Rhino.ZoomExtents(,True)

dblLt2 = Rhino.GetReal(“Enter second lenght:”)

strTempCirc1 = Rhino.AddCircle(Rhino.WorldXYPlane(),dblLt2)
strTempCirc1 = Rhino.MoveObject(strTempCirc1,Array(0,0,0),Array(dblLt1,0,0))

dblLt3 = Rhino.GetReal(“Enter third lenght:”)

strTempCirc2 = Rhino.AddCircle(Rhino.WorldXYPlane(),dblLt3)

arrInt = Rhino.CurveCurveIntersection(strTempCirc1,strTempCirc2)
Call Rhino.DeleteObject(strTempCirc1)
Call Rhino.DeleteObject(strTempCirc2)

If IsArray(arrInt) Then

arrIntPt0 = arrInt(0,1)
arrIntPt1 = arrInt(1,1)

strDotP2a = Rhino.AddTextDot(“P2a”,arrIntPt0)
strDotP2b = Rhino.AddTextDot(“P2b”,arrIntPt1)

Call Rhino.ZoomExtents(,True)
strChoice = Rhino.GetString(“Point P2a[A] or point P2b[B]?”,”A”, Array(“A”,”B”))

If strChoice = “A” Then

Call Rhino.DeleteObject(strDotP2b)
Call Rhino.DeleteObject(strDotP2a)
strDotP2 = Rhino.AddTextDot(“P2”,arrIntPt0)
strLn1 = Rhino.AddLine(Rhino.CurveEndPoint(strLn0),arrIntPt0)
strLn2 = Rhino.AddLine(arrIntPt0,Rhino.CurveStartPoint(strLn0))

ElseIf strChoice = “B” Then

Call Rhino.DeleteObject(strDotP2a)
Call Rhino.DeleteObject(strDotP2b)
strDotP2 = Rhino.AddTextDot(“P2”,arrIntPt1)
strLn1 = Rhino.AddLine(Rhino.CurveEndPoint(strLn0),arrIntPt1)
strLn2 = Rhino.AddLine(arrIntPt1,Rhino.CurveStartPoint(strLn0))

End If

Triangle = Array(strDotP0,strDotP1,strDotP2)
ReDim arrLines(2)
arrLines(0) = strLn0
arrLines(1) = strLn1
arrLines(2) = strLn2
blnLoop = 1


Call Rhino.DeleteObject(strLn0)
Call Rhino.DeleteObject(strDotP0)
Call Rhino.DeleteObject(strDotP1)
Call Rhino.MessageBox(“The member lengths can not be triangulated. Please try a different set of members.”)

End If


End Function

Function Sort(arrTxtDot)

Dim strMin, blnSwap
Dim i, j, k


blnSwap = False
For i = 1 To UBound(arrTxtDot)

If Rhino.TextDotText(arrTxtDot(i-1)) > Rhino.TextDotText(arrTxtDot(i)) Then

strMin = arrTxtDot(i)
arrTxtDot(i) = arrTxtDot(i-1)
arrTxtDot(i-1) = strMin
blnSwap = True

End If


Loop While blnSwap = True

Sort = arrTxtDot

End Function

Function Tetrahedron(arrTxtDots, ByRef arrLines)

ReDim arrInPts(2)
ReDim arrTempDots(2)
ReDim arrInLts(2)
ReDim arrTempSphs(2)
Dim arrIntSrf, strJoinCrv, arrIntCrvSrf
ReDim arrIntDots(1)
Dim strChoice, arrIntPt
Dim i, j
Dim blnLoop
Dim intPtNum
Dim intCGChoice
ReDim arrTempLines(2)
Dim intLineCount
Dim blnGoal, arrGoalPt

blnLoop = 0

Do While blnLoop = 0

blnGoal = Rhino.GetString(“Select a goal point?”,,Array(“Y”,”N”))

If blnGoal = “Y” Then

arrGoalPt = Rhino.GetPoint(“Select goal point”)
Call GoalPoint(arrTxtDots,arrGoalPt)

End If

For i = 0 To 2

arrInPts(i) = Rhino.GetPoint(“Select point #”&CStr(i+1))
Call Rhino.UnselectAllObjects
arrTempDots(i) = Rhino.AddTextDot(CStr(i+1),arrInPts(i))
Call Rhino.SelectObject(arrTempDots(i))

arrInLts(i) = Rhino.GetReal(“Enter member length at this node:”)
arrTempSphs(i) = Rhino.AddSphere(arrInPts(i),arrInLts(i))
Call Rhino.ZoomExtents(,True)

If i = 1 Then

arrIntSrf = Rhino.SurfaceSurfaceIntersection(arrTempSphs(0),arrTempSphs(1),,True)

If IsArray(arrIntSrf) Then

If UBound(arrIntSrf,1)>0 Then

strJoinCrv = JoinCurve(arrIntSrf)


strJoinCrv = arrIntSrf(0,1)

End If


Call Rhino.DeleteObject(arrTempDots(0))
Call Rhino.DeleteObject(arrTempDots(1))
Call Rhino.DeleteObject(arrTempSphs(0))
Call Rhino.DeleteObject(arrTempSphs(1))
blnLoop = 0
Call Rhino.MessageBox(“The member lengths can not be triangulated. Please try a different set of members.”)
Exit For

End If

ElseIf i = 2 Then

arrIntCrvSrf = Rhino.CurveSurfaceIntersection(strJoinCrv,arrTempSphs(2))

If IsArray(arrIntCrvSrf) Then

blnLoop = 1
arrIntDots(0) = Rhino.AddTextDot(“IntA”,arrIntCrvSrf(0,1))
arrIntDots(1) = Rhino.AddTextDot(“IntB”,arrIntCrvSrf(1,1))
Call Rhino.SelectObjects(arrIntDots)

strChoice = Rhino.GetString(“Point IntA[A] or point IntB[B]?”,”A”, Array(“A”,”B”))

If strChoice = “A” Then

arrIntPt = arrIntCrvSrf(0,1)

ElseIf strChoice = “B” Then

arrIntPt = arrIntCrvSrf(1,1)

End If


Call Rhino.DeleteObjects(arrTempDots)
Call Rhino.DeleteObjects(arrTempSphs)
Call Rhino.DeleteObject(strJoinCrv)
blnLoop = 0
Call Rhino.MessageBox(“The member lengths can not be triangulated. Please try a different set of members.”)
Exit For

End If

End If



Call Rhino.DeleteObjects(arrIntDots)
Call Rhino.DeleteObjects(arrTempSphs)
Call Rhino.DeleteObjects(arrTempDots)
Call Rhino.DeleteObject(strJoinCrv)

For i = 0 To 2

arrTempLines(i) = Rhino.AddLine(arrInPts(i),arrIntPt)


intLineCount = UBound(arrLines)
ReDim Preserve arrLines(intLineCount+3)
arrLines(intLineCount+1) = arrTempLines(0)
arrLines(intLineCount+2) = arrTempLines(1)
arrLines(intLineCount+3) = arrTempLines(2)

intPtNum = UBound(arrTxtDots)
ReDim Preserve arrTxtDots(intPtNum+1)
arrTxtDots(intPtNum+1) = Rhino.AddTextDot(“P”&CStr(intPtNum+1),arrIntPt)

intCGChoice = CG(arrTxtDots,arrLines)

If intCGChoice = 7 Then

Call Rhino.DeleteObjects(arrTempLines)
Call Rhino.DeleteObject(arrTxtDots(intPtNum+1))
ReDim Preserve arrTxtDots(intPtNum)
ReDim Preserve arrLines(intLineCount)

End If

Tetrahedron = arrTxtDots

End Function

Function JoinCurve(arrCrvs)
‘takes the two dimensional array resulting from a SurfaceSurfaceIntersection command and returns the string identifier of the joined intersection segments

Dim intSegments, arrJoin
Dim i

intSegments = UBound(arrCrvs,1)

ReDim arrJoinCrvs(intSegments)

For i = 0 To intSegments

arrJoinCrvs(i) = arrCrvs(i,1)


arrJoin = Rhino.JoinCurves(arrJoinCrvs, True)
JoinCurve = arrJoin(0)

End Function

Function Triangulate(ByRef arrLines, arrTxtDots)

Dim arrInPt1, arrInPt2, strTempDot1, strTempDot2, strTempLine
Dim intMsg, intLineCount, intCGChoice

arrInPt1 = Rhino.GetPoint(“Select first point”)
strTempDot1 = Rhino.AddTextDot(“1”,arrInPt1)
Call Rhino.SelectObject(strTempDot1)

arrInPt2 = Rhino.GetPoint(“Select second point”)
strTempDot2 = Rhino.AddTextDot(“2”,arrInPt2)
Call Rhino.SelectObject(strTempDot2)

intMsg = Rhino.MessageBox(“The member length required between these points is “&CStr(Rhino.Distance(arrInPt1,arrInPt2)),4)

If intMsg = 6 Then

Call Rhino.AddLayer(“cut_members”, RGB(255,0,0))
Call Rhino.CurrentLayer(“cut_members”)
intLineCount = UBound(arrLines)
ReDim Preserve arrLines(intLineCount+1)
arrLines(intLineCount+1) = Rhino.AddLine(arrInPt1,arrInPt2)
Call Rhino.CurrentLayer(“uncut_members”)

End If

intCGChoice = CG(arrTxtDots,arrLines)

If intCGChoice = 7 Then

Call Rhino.DeleteObject(arrLines(intLineCount+1))
ReDim Preserve arrLines(intLineCount)

End If

Call Rhino.DeleteObject(strTempDot1)
Call Rhino.DeleteObject(strTempDot2)

End Function

Function Panelize

Dim strStart
Dim strDot1, strDot2, strDot3
ReDim arrPts(2)
Dim strSrf
ReDim arrEdges(2)
ReDim arrDgs(2)
Dim arrTempDiv
ReDim strDots(2)
Dim intMsg, arrFlat, arrFlatOrPt, arrBox

strDot1 = Rhino.GetObject(“Select first point”,8192)
Call Rhino.SelectObject(strDot1)

strDot2 = Rhino.GetObject(“Select second point”,8192)
Call Rhino.SelectObject(strDot2)

strDot3 = Rhino.GetObject(“Select third point”,8192)
Call Rhino.SelectObject(strDot3)

arrPts(0) = Rhino.TextDotPoint(strDot1)
arrPts(1) = Rhino.TextDotPoint(strDot2)
arrPts(2) = Rhino.TextDotPoint(strDot3)

strSrf = Rhino.AddSrfPt(arrPts)

arrEdges(0) = Rhino.AddLine(arrPts(0),arrPts(1))
arrEdges(1) = Rhino.AddLine(arrPts(1),arrPts(2))
arrEdges(2) = Rhino.AddLine(arrPts(2),arrPts(0))

arrDgs(0) = Rhino.AddLine(arrPts(0),Rhino.CurveMidPoint(arrEdges(1)))
arrDgs(1) = Rhino.AddLine(arrPts(1),Rhino.CurveMidPoint(arrEdges(2)))
arrDgs(2) = Rhino.AddLine(arrPts(2),Rhino.CurveMidPoint(arrEdges(0)))

arrTempDiv = Rhino.DivideCurve(arrDgs(0),4)
strDots(0) = Rhino.CopyObject(strDot1,arrPts(0),arrTempDiv(1))

arrTempDiv = Rhino.DivideCurve(arrDgs(1),4)
strDots(1) = Rhino.CopyObject(strDot2,arrPts(1),arrTempDiv(1))

arrTempDiv = Rhino.DivideCurve(arrDgs(2),4)
strDots(2) = Rhino.CopyObject(strDot3,arrPts(02),arrTempDiv(1))

Call Rhino.DeleteObjects(arrEdges)
Call Rhino.DeleteObjects(arrDgs)
Call Rhino.UnselectAllObjects()

intMsg = Rhino.MessageBox(“Flatten this panel?”,4)

If intMsg = 7 Then

Call Rhino.DeleteObject(strSrf)
Call Rhino.DeleteObjects(strDots)

ElseIf intMsg = 6 Then

If Not IsArray(arrFlatOrPt) Then

arrFlatOrPt = Rhino.GetPoint(“Select origin point for unroll”)

End If

arrFlat = RhinoUnrollSurface(strSrf,strDots,False,False)
arrFlat = Rhino.MoveObjects(arrFlat,Array(0,0,0),arrFlatOrPt)
arrBox = Rhino.BoundingBox(arrFlat)
arrFlatOrPt = arrBox(1)
Call Rhino.DeleteObjects(strDots)

End If

End Function

Function RhinoUnrollSurface(strSurface, arrCurves, blnExplode, blnLabels)

‘ Default return value
RhinoUnrollSurface = Null

‘ For speed, turn of screen redrawing
Call Rhino.EnableRedraw(False)

‘ Save any selected objects
Dim arrSaved : arrSaved = Rhino.SelectedObjects

‘ Unselect all objects

‘ Select the surface to unroll
Rhino.SelectObject strSurface

‘ Format curve string
Dim i : i = 0
Dim strCurves : strCurves = ” _Enter”
If IsArray(arrCurves) Then
strCurves = “”
For i = 0 To UBound(arrCurves)
strCurves = strCurves & ” _SelId ” & arrCurves(i)
strCurves = strCurves & ” _Enter”
End If

‘ Format explode string
Dim strExplode : strExplode = ” _Explode=_Yes”
If (blnExplode = False) Then strExplode = ” _Explode=_No”

‘ Format labels string
Dim strLabels : strLabels = ” _Labels=_No”
If (blnLabels = True) Then strLabels = ” _Labels=_Yes”

‘ Script the command
Dim strCommand : strCommand = “_-UnrollSrf” & strExplode & strLabels & strCurves
Call Rhino.Command(strCommand, 0)

‘ Return the results
RhinoUnrollSurface = Rhino.LastCreatedObjects

‘ Unselect all objects

‘ If any objects were selected before calling
‘ this function, re-select them
If IsArray(arrSaved) Then Rhino.SelectObjects(arrSaved)

‘ Don’t forget to turn redrawing back on
Call Rhino.EnableRedraw(True)

End Function

Function CG(arrDots, ByRef arrLines)

ReDim arrDotPts(UBound(arrDots))
Dim dblSumLength, arrMidPt
Dim dblX, dblY, dblZ, dblLength
Dim i
ReDim arrMemCGPt(2)
ReDim arrJtCGPt(2)
ReDim arrCGPt(2)
Dim strTempCGPt, strTempCGLine, intCount
intCount = 0
ReDim arrBasePts(intCount)
Dim arrSortBasePts, strBaseCrv, intInside, arrCGBasePt
Dim intChoice

Dim dblMemDens, dblJtWt
dblMemDens = 1 ‘average bamboo density assumed to be 1kg/running meter = 1g/running mm
dblJtWt = 2000 ‘average weight per joint assumed to be 2kg = 2000g

For i = 0 To UBound(arrLines)

dblSumLength = dblSumLength+Rhino.CurveLength(arrLines(i))


For i = 0 To UBound(arrLines)

arrMidPt = Rhino.CurveMidPoint(arrLines(i))
dblLength = Rhino.CurveLength(arrLines(i))
dblX = dblX+((arrMidPt(0))*(Rhino.CurveLength(arrLines(i))))
dblY = dblY+((arrMidPt(1))*(Rhino.CurveLength(arrLines(i))))
dblZ = dblZ+((arrMidPt(2))*(Rhino.CurveLength(arrLines(i))))


arrMemCGPt(0) = dblX/dblSumLength
arrMemCGPt(1) = dblY/dblSumLength
arrMemCGPt(2) = dblZ/dblSumLength

dblX = 0
dblY = 0
dblZ = 0

For i = 0 To UBound(arrDots)

arrDotPts(i) = Rhino.TextDotPoint(arrDots(i))

dblX = dblX+arrDotPts(i)(0)
dblY = dblY+arrDotPts(i)(1)
dblZ = dblZ+arrDotPts(i)(2)


arrJtCGPt(0) = dblX/i
arrJtCGPt(1) = dblY/i
arrJtCGPt(2) = dblZ/i

arrCGPt(0) = ((dblMemDens*dblSumLength*arrMemCGPt(0))+(dblJtWt*i*arrJtCGPt(0)))/((dblMemDens*dblSumLength)+(dblJtWt*i))
arrCGPt(1) = ((dblMemDens*dblSumLength*arrMemCGPt(1))+(dblJtWt*i*arrJtCGPt(1)))/((dblMemDens*dblSumLength)+(dblJtWt*i))
arrCGPt(2) = ((dblMemDens*dblSumLength*arrMemCGPt(2))+(dblJtWt*i*arrJtCGPt(2)))/((dblMemDens*dblSumLength)+(dblJtWt*i))

strTempCGPt = Rhino.AddPoint(arrCGPt)
strBaseCrv = Base(arrDotPts)

arrCGBasePt = arrCGPt
arrCGBasePt(2) = 0
strTempCGLine = Rhino.AddLine(arrCGPt,arrCGBasePt)
intInside = Rhino.PointInPlanarClosedCurve(arrCGBasePt,strBaseCrv)

Call Rhino.DeleteObject(strBaseCrv)

If intInside <> 1 Then

intChoice = Rhino.MessageBox(“The addition of this point will cause the structure to topple. Carry on anyway?”,4)


intChoice = Rhino.MessageBox(“The addition of this point will not cause the structure to topple”)

End If

Call Rhino.DeleteObject(strTempCGPt)
Call Rhino.DeleteObject(strTempCGLine)
CG = intChoice

End Function

Function Base(arrAllPts)

Dim intPolyCount, intPtCount, intInOut
Dim i, j
Dim arrTempPoly, strTempPoly
Dim dblDist, dblMinDist, intMinPt, bolMin
Dim dblParam, arrClsPt
Dim arrTempPts
Dim arrJoin
intPtCount = 0
intPolyCount = 2
bolMin = 0
ReDim arrPts(intPtCount)
ReDim arrBasePts(intPolyCount)
ReDim arrBaseLns(intPolyCount)

For i = 0 To UBound(arrAllPts)

If arrAllPts(i)(2) = 0 Then

arrPts(intPtCount) = arrAllPts(i)
intPtCount = intPtCount+1
ReDim Preserve arrPts(intPtCount)

End If


intPtCount = intPtCount-1
ReDim Preserve arrPts(intPtCount)

arrBasePts(0) = arrPts(0)
arrBasePts(1) = arrPts(1)
arrBasePts(2) = arrPts(2)

arrBaseLns(0) = Rhino.AddLine(arrBasePts(0),arrBasePts(1))
arrBaseLns(1) = Rhino.AddLine(arrBasePts(1),arrBasePts(2))
arrBaseLns(2) = Rhino.AddLine(arrBasePts(2),arrBasePts(0))

For i = 3 To intPtCount

arrTempPoly = Rhino.JoinCurves(arrBaseLns)
strTempPoly = arrTempPoly(0)

intInOut = Rhino.PointInPlanarClosedCurve(arrPts(i),strTempPoly)

Call Rhino.DeleteObject(strTempPoly)

If intInOut = 0 Then

For j = 0 To intPolyCount

dblDist = Rhino.Distance(arrBasePts(j),arrPts(i))

If j = 0 Then

dblMinDist = dblDist
intMinPt = j
bolMin = 0


If dblDist < dblMinDist Then

dblMinDist = dblDist
intMinPt = j
bolMin = 0

End If

End If


For j = 0 To intPolyCount

dblParam = Rhino.CurveClosestPoint(arrBaseLns(j),arrPts(i))
arrClsPt = Rhino.EvaluateCurve(arrBaseLns(j),dblParam)
dblDist = Rhino.Distance(arrClsPt,arrPts(i))

If dblDist < dblMinDist Then

dblMinDist = dblDist
intMinPt = j
bolMin = 1

End If


If bolMin = 0 Then

arrBasePts(intMinPt) = arrPts(i)

Call Rhino.DeleteObjects(arrBaseLns)

For j = 0 To intPolyCount-1

arrBaseLns(j) = Rhino.AddLine(arrBasePts(j),arrBasePts(j+1))


arrBaseLns(intPolyCount) = Rhino.AddLine(arrBasePts(intPolyCount),arrBasePts(0))

ElseIf bolMin = 1 Then

arrTempPts = arrBasePts
intPolyCount = intPolyCount+1
ReDim Preserve arrBasePts(intPolyCount)

arrBasePts(intMinPt+1) = arrPts(i)

For j = intMinPt+2 To intPolyCount

arrBasePts(j) = arrTempPts(j-1)


Call Rhino.DeleteObjects(arrBaseLns)
ReDim Preserve arrBaseLns(intPolyCount)

For j = 0 To intPolyCount-1

arrBaseLns(j) = Rhino.AddLine(arrBasePts(j),arrBasePts(j+1))


arrBaseLns(intPolyCount) = Rhino.AddLine(arrBasePts(intPolyCount),arrBasePts(0))

End If

End If


arrJoin = Rhino.JoinCurves(arrBaseLns,True)
Base = arrJoin(0)

End Function

Function GoalPoint(arrTextDots,arrGoalPt)

Dim strMin, blnSwap
Dim i, j, k

ReDim arrDist(UBound(arrTextDots))


blnSwap = False
For i = 1 To UBound(arrTextDots)

If Rhino.Distance(Rhino.TextDotPoint(arrTextDots(i-1)),arrGoalPt) > Rhino.Distance(Rhino.TextDotPoint(arrTextDots(i)),arrGoalPt) Then

strMin = arrTextDots(i)
arrTextDots(i) = arrTextDots(i-1)
arrTextDots(i-1) = strMin
blnSwap = True

End If


Loop While blnSwap = True

Call Rhino.SelectObject(arrTextDots(0))
Call Rhino.MessageBox(“The closest node to the goal point has been selected”)

End Function

Weaving and Linear Measurement in Digitally Guided Construction

Measuring the length of a straight line in the physical world is to test the geometric congruency of two one-dimensional objects – an object of standardized length against an object of unknown length. All one-dimensional objects share the property of similarity and can therefore be “placed against each other” as physical objects (strictly speaking there are no “real” one-dimensional objects but this statement will still apply to the one-dimensional edges of higher-dimensional objects). To make two one-dimensional objects congruent requires breaking/cutting the longer of the two at a single point or stretching the shorter of the two along a single direction.

While all this may seem painfully obvious, the uniqueness of the situation is highlighted when you think about how hard it is to make two non-similar objects of higher dimensions congruent or similar. For example, here is a device for replicating three-dimensional sculptures with the ability to change the size of the reproduction. (For more information about this device you can read this article). Now compare this device to using a ruler and pair of scissors to make two pieces of string the same length.


George Stiny shows how a boundary function is able to map algebras of different dimensions to each other (Shape: Talking About Seeing and Doing, p. 98).  In terms of construction, a boundary function can provide ‘templates’ or ‘jigs’ or ‘frameworks’ or ‘guides’ (depending on your method of construction) for objects of a higher dimension using objects of lower dimensions. To cite an example of a project I was personally involved in, the form-work of the Santa Monica Cradle project is an example of two-dimensional plywood ribs being used as a framework for creating a complex, curved, three-dimensional surface from strips of flexible ‘luaun’ ply. In fact, most approaches to constructing an architectural surface involves some kind of underlying linear framework.

The skinning of the plywood framework with strips of flexible luaun.
A Surface
A Divided Surface
The Boundaries Of The Divisions Form A Framework

If a complex three-dimensional shape can be built using a ‘framework’ of linear shapes, then it can be constructed through simple measurements of length. The most basic way to go from a one-dimensional boundary to a two-dimensional shape through linear measurement alone is through triangles. This method has been used since the time of ancient Egypt where it was used to measure the (two-dimensional) area of land holdings using (one-dimensional) rope as a measuring device.

The ‘Suspension’ series of installations by Ball-Nogues Studio (some of which I was fortunate to be a part of) consist of a series of threads cut to specific lengths, coloured at specific intervals and hung from specific points to form a series of catenaries. When seen together, the strings form complex, multi-coloured, three-dimensional “clouds” suspended in mid air.

“Suspensions: Feathered Edge by Ball-Nogues Studio”. MoCA PDC, Los Angeles, 2007.

A sturdier and more ancient way of combining linear elements into objects of higher dimensions is weaving. The weaving of cloth goes from one-dimensional thread to a two-dimensional cloth, and the weaving of baskets goes from one-dimension strips (of cane, bamboo, rattan or other materials) to a three-dimensional surface. Kenneth Snelson shows how a tensegrity structure can be thought of as a three-dimensional polyhedron woven out of linear elements.

A surface woven from digitally derived linear fabrication data.
The first bamboo Parametric Pavilion. Kamath Design Studio, New Delhi, 2010.

The process of weaving is therefore an ideal candidate for a manual construction process involving only linear measurement that can be used to construct a digitally designed, complex curved surface. I had woven a quick model based on this premise some months ago using linear fabrication data obtained by running this script on a test surface. After the successful construction of the first bamboo Parametric Pavilion I am now attempting the design and construction of a more complex woven bamboo roof structure for a 150 square meter guest house building. This project will be a test case for implementing the idea of using digitally derived linear construction data for the manual weaving of a complex curved surface.

Guest Lecture at SID, CEPT University, Ahmedabad

Below is the slide show from the guest lecture I gave at the School of Interior Design (SID) at CEPT University in Ahmedabad on the 19th of October. This lecture was given to students of the Masters in Interior Architecture and Design and the faculty of SID focusing on Craft and Technology.

This slideshow requires JavaScript.

Digital Design and (Manual) Fabrication

In most academic and scholarly settings the phrase ‘Digital Design and Fabrication’ is used almost like a single word. In fact I was associated with the Digital Design and Fabrication Group at MIT’s Department of Architecture for a large part of my SMArchS programme. However, I wonder if Digital Design must go together with Digital Fabrication, and what happens if they do not? Are we, as designers living in an age where we have access to both digital and non-digital methods of design and fabrication, missing out on opportunities by bundling Digital Design with Digital Fabrication? A vast majority of building construction in both industrialised and non-industrialised contexts still primarily uses manual, non-digital methods of construction. Does this mean that methods of  ‘Digital Design’ can not be used in such contexts? (Digital Design being “a self contained way of designing exclusively within a computational environment” (Sass, Lawrence, and Oxman, Rivka. (2006). Materializing design: theimplications of rapid prototyping in digital design. Design Studies, 27, (3), p. 333)).

A 'Contractor' with a CAD Drawing at a Site Using Manual Construction Techniques (
The Ideal Digital Design and Fabrication Work Flow (

The main argument against being able to use Digital Design without Digital Fabrication is that the formal complexity of the resulting designs is impossible to achieve without the accuracy and versatility of Digital Fabrication technology. Once adopted, Digital Design and Fabrication also offers many conveniences such as the seamless transition from CAD model to fabrication data for CNC machines and the ability to make use of rapid prototyping in the design process. (Sass, Lawrence, and Oxman, Rivka. (2006). Materializing design: the implications of rapid prototyping in digital design. Design Studies, 27, (3), 325-55.) Digital Fabrication also offers advantages such as very high levels of accuracy in building components that increase pre-fabrication and reduce on-site assembly (Kieran, Stephen, and Timberlake, James. (2004). Refabricating architecture: how manufacturing methodologies are poised to transform building construction. New York: McGraw Hill.)

The use of digital fabrication using data from a CAD model means that under ideal conditions designers and fabricators do not have to deal with measurements and calculations while building. Since parts are CNC manufactured, they are highly accurate and their dimensions do not need to be verified before assembly – until and unless there is a mistake and something doesn’t fit. In a manual construction, however, measurement is an integral part of construction. The data from the design is read off dimensioned drawings and used by a construction worker to build a part of the building. The actual dimensions and orientation of the part then need to be checked against those in the drawing. This process of the construction worker having to follow dimensions given in a drawing issued by the designer has its origin in the Renaissance in the West.

Prior to that (and outside the West) the boundary between the designer and the maker was not as well defined and exact dimensions for a building were not completely specified prior to construction. Instead, construction would proceed by a process of Cutting and Fitting whereby a part would first be made and its dimensions would be measured subsequently in order to determine the dimensions of new parts that were dependent on the dimensions of the original part. (McGee, David. (1999). From Craftsmanship to draftsmanship: naval architecture and the three traditions of early modern design. Technology and Culture, Vol. 40, No. 2 (Apr., 1999), pp. 209-236).

Given the extremes of Digital Fabrication and Cutting and Fitting, and all methods of manufacture in between, can we devise efficient means of executing Digital Designs without the use of Digital Fabrication?

TableCloth: Complexity From Layers of Simplicity

The TableCloth installation by Ball-Nogues Studio at the Schoenberg Hall courtyard in the UCLA Music Department is a functional installation. It is part art, part architecture, part structure and part furniture. The complexity of this project emerges from the layering of design decisions taken in response to the different functions that the installation fulfils. The installation is meant to enhance the usefulness of the courtyard to the members of the Music Department. It was commissioned as a temporary installation on the UCLA campus for only a part of the year.

Starting with the courtyard as a space a simple ‘drape-like’ surface hanging from one of the walls was proposed. This drape would embellish the building in the same way that a table cloth embellishes a table and marks is as a place for congregation. This drape surface was designed taking into account the circulation around the courtyard ‘relaxed’ by structural analysis so as to ensure that it draped the building smoothly.

The Relaxed Drape Surface in the Courtyard

A strategy was then devised to subdivide this drape surface into tectonic components that were differentiated based on their position on the surface.

The first step of the subdivision process was to populate the surface with points. The points were to act as seeds for the tectonic components. The density of the points was related to the varying curvature of the surface – the greater the curvature the greater the point density. This would enable the components (to be made of flat materials) to efficiently negotiate the curvature of the drape.  This was achieved using a script similar to one posted on this blog earlier.

Points Placed on the Surface Based on Surface Curvature

The points thus placed were used as the input for a Delaunay triangulation mesh which divided the curved drape surface into planar triangles which determine the orientation and periphery of each planar tectonic component. The density distribution of the points determined the density of the Delaunay mesh. A script for Delaunay triangulation was previously posted on this blog.

Delaunay Triangulation Using Surface Points

The temporary nature of the installation was in conflict with the durability and permanence of the materials and resources that would be required of an outdoor installation of the size of the drape surface. It was thus decided to give the individual tectonic components a functional life beyond that of the installation. The design of the components therefore became an exercise in cross-manufacturing where the same physical artefact performed the dual functions of a tectonic component when part of the installation, and a table/stool when independent. The triangular geometry of the Delaunay mesh dictated a three legged object but the function of a table/stool required minimizing sharp corners. Therefore  a Grasshopper definition was used to create irregular ‘ovals’ within each triangle of the Delaunay mesh which were to become the seats of the stools/tables making up the TableCloth.

Irregular 'Ovals' Created From the Delaunay Triangles

The edges of this field of tables/stools were modulated to allow it to act as an amphitheatre with audience seating, a performance area and a visual/acoustic backdrop. Further interstitial components and detailing were added based on structural and constructional considerations to create a structurally, visually and functionally complex installation.

The Complex Installation Incorporating Layers of Simple Design Decisions