1 FORUM for ADVANCED REVIT TRAINING in SINGAPOREModelling the Helix Bridge Using Dynamo By: REINIER TINAPAY February 2, 2016
2 Obligatory photo to drive home the point that I mean businessAbout the Speaker An obligatory slide to convince you that I know what I’m doing. Reinier Tinapay is a Filipino Architectural Designer who has been working in Singapore since Born in 1983 in the City of Davao, he finished his studies in Bachelor of Science in Architecture at Ateneo de Davao University in 2005 with Honors (Cum Laude). He has a specialist Diploma for Building Information Modelling from BCA Academy (Merit Awardee). He is currently employed at Archurban Architects Planners. Obligatory photo to drive home the point that I mean business
3 My Dynamo experience Real deal this time.I am beginner with dynamo. I just started tinkering with it a year ago. I started this modelling study with much enthusiasm, sustained it with an abundance of curiosity and finished it with great relief. With neither training nor knowledge on using Dynamo, I leapt right in armed with hours-upon-hours of reading and video materials contributed mainly by the scholastic generosity of people from world-wide-web.
4 Why Dynamo??? Ask how many people are dynamo users? How many are revit user?
5 Because the first step to learning is giving it a try!…
6 Substantial Amount of Tutorials
7 The gods among us.
8 The gods among us.
9 An obligatory encouragement before we begin our wonderful journey.
10 THE STUDY
11 I decided to use Singapore’s iconic Helix bridge as my platform for learning. I downloaded and studied plans, elevations and illustrations available online to get a better understanding on how the bridge was designed. The steps below does not aim to be a tutorial, but rather a means document my endeavors. There are far better methods and shorter ways out there that I for one am eager to learn. Just as well, this study does not attempt to copy every detail of the bridge, but only aim to model the general features of the bridge using the basic code blocks that I’ve learned in the process.
12 THE LOGIC
13 The Logic 4 5 3 6 Proposed Parameters in modelling the HelixThis helix will have 7 nodes Nodes 0 and 2 will be the reference for the smaller helix inscribed within the bigger helix Those 2 nodes will also be our reference for the platform and the supporting leg 2 1
14 The Logic Proposed Logic in modelling the HelixCreate 3 points that define the main Spine Run a curve across all 3 points. This will be the Main Spine Divide the spine into a number of planes Inscribe Circles inside each plane Create a series of points along each of the circles Shift each circle by 1 node more than the previous ring to create a rotational movement Run Curves along each corresponding point on each circle Rotate by 2 nodes Rotate by 3 nodes Rotate by 1 node Rotate by 4 nodes Rotate by 0 nodes
15 Overview of the steps Create the parameters that control the main spine Generate the big helix Trim the start and end of the helix so that it always ends and begins at node 0. Using the concept for the Big helix, create the small helix Use nodes 0 and 2 to generate platform and support joints Create Details
16 MAKING THE MAIN SPINE
17 3 – This Combines the lists of points into 1 string 4 3 2 1 – Code Block defines the values that we will be using for the XYZ point coordinates 2 – This is the code block you use to create points on the workspace. It needs values x,y and z values input to generate. Otherwise, it will assume all values are zero. 3 – This Combines the lists of points into 1 string 4 – This generates a curve across all the points in the string
18 MAKING THE BIG HELIX
19 numeric values that are equally spaced between 0 to 1. 6 5 5 – this is code block is a parameter. This states that I want to create a list of 30 numeric values that are equally spaced between 0 to 1. 6 – This code block generates planes along the curve using the parameter we set
20 8 7 7 – this code block specifies a numeric value. In this case, the size of the circle. 8 – This code block generates circles on each of the planes we’ve created. Each circle is nested at the center of each plane. The radius is set by the code block we linked to it.
21 numbers that equally spaced between 0 to 1. 10 lacing 9 9 – This code block is another parameter. We are stating that we’d like a list of 7 numbers that equally spaced between 0 to 1. 10 – This code block is intended to generate 7 points along each curve. But it needs the correct lacing to do so. Using Shortest lacing gives you the result shown.
22 are created along each of the circles. Correct lacing 11 – Changing the Lacing to Cross Product generates the desired result. 7 nodes are created along each of the circles. *This emphasizes the importance of understanding the importance of Lacing.
23 reference for the other items. Use List Get.itemsAtIndex 11 12 11 – At this point, we want to select curves 0 and 2 as we will be using this as reference for the other items. Use List Get.itemsAtIndex 12 – Generate a curve to see the reference curves
24 To Maintain a parametric approach, we will now make a few code blocks that will determine the numeric values of certain parameters. All our code blocks will now be referring to these blocks so that whenever we want to change these values, it will be automatically propagated to the rest of the chain.
25 Recap of the Logic Proposed Logic in modelling the HelixCreate 3 points that define the main Spine Run a curve across all 3 points. This will be the Main Spine Divide the spine into a number of planes Inscribe Circles inside each plane Create a series of points along each of the circles Shift each circle by 1 node more than the previous ring to create a rotational movement Rotate by 2 nodes Rotate by 3 nodes Rotate by 1 node Rotate by 4 nodes Rotate by 0 nodes
26 USING SHIFT INDEX
27 Step 13: Shift Index SPAGHETTI STEP!!!
28 Step 13: Shift Index The first part of the process is to create a dynamic list that is composed of a repetition of whole numbers from zero shift to last shift value which is nodes-1. Example: for a helix whose number of nodes is 7 (where: nodes-1=6) our basic list will be as follows : 0,1,2,3,4,5,6 4 5 3 6 2 1
29 Flattened Repeated List. But still more than 30???Step 13: Shift Index Flattened Repeated List. But still more than 30??? Rounded UP Multiplier “RAW” Multiplier The second part is to make sure this list will always be as long as the number of rings. To do that, we need to repeat the basic list by the number of times necessary.
30 Exactly 30 items in the list Flatten from earlier slideShift Index Exactly 30 items in the list Number of Rings Flatten from earlier slide From the Previous slide, we are given a list of 35 items after flatten. To make sure that we are only getting a list as long as the number of rings (30) we will use the code block ,List.TakeItems.
31 Step 13: Shift Index The operator to use if you want to apply an effect to a sublist Apply shift index to sublist The latest set of points we did in step 12 From the Previous slide, we are given a list of 35 items after flatten. To make sure that we are only getting a list as long as the number of rings (30) we will use the code block ,List.TakeItems.
32 The List.Map dilema Step 13: Shift IndexNo Lacing!!!....it always works in cross process mode…as a result, every sublist it makes generates a deeper,longer list that you need to sort out yourself….
33 The List.Map dilema Step 13: Shift Index …To all 30 of theseIt applies all 30 of these… To create a list of 30 main items, each with 30 items in its sublist
34 Step 13: Shift Index Since every sublist was 30 items long, take every 31st item to make sure you are sampling a shifted value from every list Flatten the list by 1 My temporary solution is to use List.TakeEveryNthItem. To make sure I sampled from every list, I took every 31st item since the previous sublist was 30 items long. I also set the offset to rings+2 (or 32) to make sure the pick begins on the 2nd sublist. [Caveat : there are probably more eloquent ways out there.]
35 Eloquent or not, we now have a fully parametric helixEloquent or not, we now have a fully parametric helix whose length, heights (of the 3 main points), nodes, rings, and radius can be changed instantly by changing values of the parameters.
36 Eloquent or not, we now have a fully parametric helix
37 Eloquent or not, we now have a fully parametric helix
38 TRIMMING THE HELIX
39 Logic for trimming the start4 5 3 6 2 1
40 Logic for trimming the start10 9 8 7 the 0-curve 6 5 4 3 2 1 1 2 3 4 5 6
41 Use codeblock List.Drop ItemsTrimming the start of the Helix Use list.Map to make sure that the List.Drop Items is applied only to the sublist. Use codeblock List.Drop Items Create a list of the series of values that you want to drop from the sublist
42 Fine and dandy…. until you realize ListFine and dandy….until you realize List.Map only works in cross product therefore creating yet another long list and sublists.
43 Trimming the start of the HelixTo overcome this, we repeat the same process we did after we used List.Map in our Shift.index process Flatten once to make that long list and sublist into a simpler but even longer main list Use this to draw curves across the points List.Map Doesn’t wanna let me use other Lacing modes Since every sublist from the List.Map was 7 items long, take every 8th item to make sure you are sampling a shifted value from every list. Offset sample to begin on the 9th.
44 Trimming the start of the HelixThe process gives you a trimmed Helix whose strands always begin at the 0-curve the 0-curve Front of bridge
45 Trimming the start of the HelixSo how do you make sure the strands end at the 0-curve too? the 0-curve Front of bridge
46 (No. of Nodes) x (No. of loops) + (1extra node)Logic for trimming the end 2 1 3 +1 4 the 0-curve 6 5 (No. of Nodes) x (No. of loops) + (1extra node) Just add 1 more No of nodes = 7 Total number of nodes in the curve divided by the number of nodes in a loop rounded down
47 Trimming the end of the Helix5 1 4 2 3 This is a code block that will count the number of items in the list (in this case it will count the number of nodes in the curve) This list.map will apply the Count to the sublist (as the number of nodes are sublists) This determines that number of loops that can fit in the curve. May give decimal values This rounds down the figure for the number of loop. Makes the loop a whole number Determines the ideal number of nodes in the curve to make sure it ends at the 0-curve
48 Trimming the end of the Helix2 1 3 Using the list of ideal curve lengths from the previous step, we will now use List.TakeItems to take the ideal length. Use List.Map to tell dynamo to apply the List.TakeItems to the sublist Because List.Map refuses to cooperate, we will again have to do the following steps to shorten the List.Map effects.
49 Result of the Trimmed HelixThe whole process gives us a trimmed helix that can dynamically changed when parameters are changed
50 Result of the Trimmed HelixThe whole process gives us a trimmed helix that can dynamically changed when parameters are changed
51 MAKE THE SMALLER HELIX
52 Making the smaller helixUsing the same process for the creation of the Big Helix, the small helix is a reverse version. To do a reverse means that the shift index must be done in a reverse order. Where our previous helix shifted at intervals of 0,1,2,3,4,5,6 ….This smaller helix will shift at 0,-1,-2,-3,-4,-5,-6
53 Making the smaller helixIn modelling the smaller helix, always remember that its shape must be derived from the main spine and that is should be circumscribed within the Big Helix Generate 7 points on the oval using point.parameter. These 7 points will be the nodes for the smaller helix The same way we did for Big Helix, we must always use curves 0 and 2 as one of the curves in the smaller helix 1 2 3 4 5 6 1 2 3 4 5 6
54 CREATING THE NECESSARY DETAILS
55 Creating the Necessary Details
56 Creating the Necessary DetailsThe Platform is generated by linking curve 0 to curve 2 using PolySurface.ByLoft The support is created translating curve 1 slightly lower than its original location (curve 1a) and then linking curve 0 and curve 2 to it The foot is generated by translating curve 1 again but this time all the way to the floor (z=0). This new curve is now curve 1b. Curve 1a and curve 1b are then used to create the support 2 1 1a 1b
57 MAKE SOLID SWEEPS
58 Make solid sweeps to all the components to complete the model
59 THANK YOU.