A playground for University of Bologna Students and a 6-days seminar about digital tools.

Digital generative tools are a very important part of architectural education. Andrew Kudless during his conference at SimAE was telling about chinese traditional woodcraftsmen: they spend their first two years of apprentice in making their own tools. Today, we have a large pool of digital ready made tools, built to respond to more or less specific problems or tasks, while keeping a level of flexibility and personalization. The majority of these tools have hidden capabilities, which can only be accessed bypassing the conventional interface and getting close to the machine logic of programming or building parametric components which generate shapes. Thus, seriality, differentiation, complexity can be implemented in architectural projects through code, in order to exploit the power of algorithmic based complex systems which are the basis of biological systems.

But, before going through such complexity, we must start with simple tasks and simple rules. Before playing seriously we need practice. This is the playground where a bunch of students will start to practice, a pool where they will share their results and questions. Maybe the stuff here that will be posted will seem obvious or naive to the navigated code-monkey, but, as I mentioned before, we all start from the basics and this is intended as a place to start. However, any comment and contribution is appreciated.

Playground is open, let's play! _ Alessio


This is a very simple script that creates 3 different elix entwining. The diameters depend on the curve's curvature, directly or not.
Users can define the number of levels.



Option Explicit
'Script written by
'Script copyrighted by
'Script version sabato 7 febbraio 2009 18.00.30

Call Main()

Sub Main()
Dim intNPts: intNPts= Rhino.GetInteger("how many points?", 15, 10, 20)
Dim i, arrPts, arrPtC, strCurve
ReDim arrPts(intNPts-1)
ReDim arrPtC (intNPts-1)
For i=0 To (intNPts-8)
arrPtC(i) = array(10*cos(i),10*sin(i),40*sqr(i))
arrPts(i)= Rhino.addpoint(arrPtC(i))
For i= intNPts-8 To (intNPts-1)
arrPtC(i) = array(10*cos(i)/((i+1)/5),10*sin(i)/((i+1)/5),40*sqr(i))
arrPts(i)= Rhino.addpoint(arrPtC(i))
strCurve = Rhino.AddInterpCurve (arrPtC)

Dim arrDom: arrDom = Rhino.CurveDomain(strCurve)
Dim dblparam, arrCrvData, dblStep, arrPlane, arrCircle, j
Dim dblRadius
ReDim arrCirc(intNpts)
dblStep = (arrDom(1)-arrDom(0))/intNPts
For j=0 To intNPts
dblParam = arrDom(0) + j*dblStep
arrCrvData = Rhino.CurveCurvature (strCurve, dblParam)

arrPlane = Rhino.CurvePerpFrame(strCurve, dblParam)
If Not isNull (arrCrvData) Then 
dblRadius= arrCrvData(3)/10
dblRadius = 0.1
End If

arrCirc(j) = Rhino.AddCircle(arrPlane, dblRadius)
'strCurveCrv = Rhino.AddInterpCurve(arrCirc)
Call Rhino.AddLoftSrf(arrCirc)
Dim arrPts1, arrPtC1, strCurve1, n
ReDim arrPts1(intNPts-1)
ReDim arrPtC1 (intNPts-1)
For n=0 To (intNPts-1)
arrPtC1(n) = array(15*-cos(n)/(n+1),15*-sin(n)/(n+1),11*(n))
arrPts1(n)= Rhino.addpoint(arrPtC1(n))
strCurve1 = Rhino.AddInterpCurve (arrPtC1)

Dim arrDom1: arrDom1 = Rhino.CurveDomain(strCurve1)
Dim dblparam1, arrCrvData1, dblStep1, arrPlane1, arrCircle1, m
Dim dblRadius1
ReDim arrCirc1(intNpts)
dblStep1 = (arrDom1(1)-arrDom1(0))/intNPts
For m=0 To intNPts
dblParam1 = arrDom1(0) + m*dblStep1
arrCrvData1 = Rhino.CurveCurvature (strCurve1, dblParam1)
arrPlane1 = Rhino.CurvePerpFrame(strCurve1, dblParam1)
If Not isNull (arrCrvData1) Then 
dblRadius1= 175/arrCrvData1(3)
dblRadius1 = 50
End If
arrCirc1(m) = Rhino.AddCircle(arrPlane1, dblRadius1)
'strCurveCrv = Rhino.AddInterpCurve(arrCirc)
Call Rhino.AddLoftSrf(arrCirc1)
Dim p, arrPts2, arrPtC2, strCurve2
ReDim arrPts2(intNPts-1)
ReDim arrPtC2 (intNPts-1)
For p=0 To (intNPts-8)
arrPtC2(p) = array(10*-cos(p),10*-sin(p),40*sqr(p))
arrPts2(p)= Rhino.addpoint(arrPtC(p))
For p= intNPts-8 To (intNPts-1)
arrPtC2(p) = array(10*-cos(p)/((p+1)/5),10*-sin(p)/((p+1)/5),40*sqr(p))
arrPts2(p)= Rhino.addpoint(arrPtC(p))
strCurve2 = Rhino.AddInterpCurve (arrPtC2)
Dim arrDom2: arrDom2 = Rhino.CurveDomain(strCurve2)
Dim dblparam2, arrCrvData2, dblStep2, arrPlane2, arrCircle2, q
Dim dblRadius2
ReDim arrCirc2(intNpts)
dblStep2 = (arrDom2(1)-arrDom2(0))/intNPts
For q=0 To intNPts
dblParam2 = arrDom2(0) + q*dblStep2
arrCrvData2 = Rhino.CurveCurvature (strCurve2, dblParam2)
arrPlane2 = Rhino.CurvePerpFrame(strCurve2, dblParam2)
If Not isNull (arrCrvData2) Then 
dblRadius2= arrCrvData2(3)/10
dblRadius2 = 0.1
End If
arrCirc2(q) = Rhino.AddCircle(arrPlane2, dblRadius2)
'strCurveCrv = Rhino.AddInterpCurve(arrCirc)
Call Rhino.AddLoftSrf(arrCirc2)
Call Rhino.EnableRedraw(True)

End Sub

1 comment:

  1. Hi Sim_C,

    interesting exploration. However, pitifully the script does not accept more than 20 levels (you might easily correct this feature) and doesn't let the user choose a custom development curve (which would be a very nice feature), try to work on that.

    Also remember to put a LOT of comments in the script describing what you are doing, how and (eventually) why.