Friday, 28 August 2015

First post

First post. So... where to start?

A bit of personal history


Ok, so I started to experiment in parametric design using Autodesk's Maya at university. Parametric design has a broad spectrum of application in architecture.
Parametric design is a process based on algorithmic thinking that enables the expression of parameters and rules that, together, define, encode and clarify the relationship between design intent and design response.
(
Thank you wikipedia!)
For me however it turned out I actually didn't want to become an architect. I didn't see myself end up a major player in architecture and I was missing the technical foundation of buildings in the architectural education itself. That's when I decided to become a structural engineer.

The applications for parametric design in structural engineering are more limited unfortunately. So for a while, parametric design was not in the picture "at the office". After a few years and a career switch I got an opportunity to get started with Bentley's GenerativeComponents, which sparked my interest in parametric design again.

Then my office made the switch from Bentley's Microstation as primary CAD system to Autodesk's Revit and I learned of Autodesk's development of DesignScript by Robert Aish.

Elliptical space frame


This is where I want to start with my first project related excercise in structural engineering related parametric design. My first test was developing a parametric model of the JinSo pavillion in Amsterdam (NL), a project I worked on for DHV at around 2008, 2009:


The structure consists of slender steel columns carrying an elliptical 3D space frame. From a structural engineer's perspective it would have been nice to be able to develop variants in column spacing and space frame dimensioning early on in the design process.

For now I'll just stick with some images of the model, to showcase the result. The line drawings can be exported from AutoCAD to the structural engineering calculation software of choice (in our office usually SCIA Engineer).



Basis pavillion setup

Variant 1
Variant 2


DesignScript code:

import("ProtoGeometry.dll");
import("Math.dll");

/*Parameters, afstanden in m*/
w_mid = 52.5;           // afstand ("diameter") over de verticale as; JinSo = 52.5
l_mid = 52.5;             // afstand ("diameter") over de horizontale as; JinSo = 77
w_truss = 2 * 1;    // breedte van de bovenzijde truss; JinSo = 2*1.675
h_truss = 3;            // hoogte van de truss; JinSo = 2
h_top = 15;         // hoogte t.o.v. Z=0 van de b.k. truss; JinSo = 11.925

divs = 28;              // veelvoud van 2 invullen; JinSo = 34
divs_cols = 4;

cs = CoordinateSystem.WCS;
cs_out = cs.Scale((l_mid + w_truss) / (w_mid + w_truss), 1, 1);

/*3D truss generation*/
pc_top = Point.ByCoordinates(0, 0, h_top);
cc_out = Circle.ByCenterPointRadius(pc_top, (w_mid + w_truss) / 2);
cc_out = cc_out.Transform(cs, cs_out);
cc_in = cc_out.Offset(-w_truss);
cc_out.Visible = false;
cc_in.Visible = false;

/*Punten op binnen- en buitenring*/
pt_in_dist = 0..cc_in.Length..#divs+1;
pt_out_dist = 0..cc_out.Length..#divs+1;
va = 0..Count(pt_in_dist)-2..1;
//Print(pt_in_dist[va]);
pt_in = Point.AtDistance(cc_in, pt_in_dist[va]);
pt_out = Point.AtDistance(cc_out, pt_out_dist[va]);

/*Staven bovenvlak*/
lt_orth = Line.ByStartPointEndPoint(pt_in, pt_out);
vb = -1..Count(pt_in_dist)-3..1;
//Print(vb);
lt_in = Line.ByStartPointEndPoint(pt_in, pt_in[vb]);
lt_out = Line.ByStartPointEndPoint(pt_out, pt_out[vb]);
lt_diag1 = Line.ByStartPointEndPoint(pt_in, pt_out[vb]);
lt_diag2 = Line.ByStartPointEndPoint(pt_in[vb], pt_out);

/*Staven onder bovenvlak*/
pc_bot = Point.ByOffset(pc_top, 0, 0, -h_truss);
cc_bot = Circle.ByCenterPointRadius(pc_bot, w_mid / 2);

cs_bot = cs.Scale((l_mid/w_mid), 1, 1);

cc_bot = cc_bot.Transform(cs, cs_bot);
cc_bot.Visible = false;

pb_dist = 0.5*cc_bot.Length/(divs+1)..cc_bot.Length+0.5*cc_bot.Length/(divs+1)..#divs+1;
pb_ = Point.AtDistance(cc_bot, pb_dist[va]);
lb_ = Line.ByStartPointEndPoint(pb_, pb_[vb]);
lt_space1 = Line.ByStartPointEndPoint(pb_[vb], pt_in);
lt_space2 = Line.ByStartPointEndPoint(pb_[vb], pt_in[vb]);
lt_space3 = Line.ByStartPointEndPoint(pb_[vb], pt_out);
lt_space4 = Line.ByStartPointEndPoint(pb_[vb], pt_out[vb]);

/*Kolommen*/
vc = 0..vb[-1]..#divs/divs_cols;
Print("vb= " + vb);
Print("vc= " + vc);
pc_b = Point.ByOffset(pb_[vc], 0, 0, - (h_top - h_truss));
lc_ = Line.ByStartPointEndPoint(pc_b, pb_[vc]);