Parametric Concentric Circle Statement Curtain Wall With Revit Dynamo

by lil0 in Workshop > 3D Design

56 Views, 0 Favorites, 0 Comments

Parametric Concentric Circle Statement Curtain Wall With Revit Dynamo

Wall.png

As part of my entry in the Make it Temporary Architecture Student Contest, a multi-use modular park shelter called Shelter 7, I designed a statement wall featuring wooden concentric circles using Revit and Dynamo. Dynamo is a visual programming interface within Revit that can be used on all sorts of workflows. Below I will go into how I created the curtain panel family I used in the wall, as well as how I set up each section of my Dynamo Program.

For more information on Dynamo I highly recomend checking out the free and very comprehensive Dynamo Primer:

Dynamo Primer

I took a lot of inspiration from Dev Creates’ tutorial “Dynamo For Beginners! Randomize Curtain Wall Panels - Ep 02”. Dev’s tutorials on Dynamo are straightforward and easy for beginners or experienced coders & CADers to understand. This video sets up a great jumping off point for a variety of curtain panel based projects!

Dynamo For Beginners! Randomize Curtain Wall Panels - Ep 02

Supplies

  1. Autodesk Revit
  2. Autodesk Dynamo

To learn how to get free access to Autodesk products for students and educators check out the Autodesk website here: https://www.autodesk.com/education/home#students

  1. Computer
  2. Mouse

Creating Custom Curtain Wall Panels

Ext 1.png

To create the concentric circle curtain wall panels:

Create a new curtain wall panel family by selecting

File → New → Family → Curtain Wall Panel

Then open the Exterior Elevation of the new curtain wall panel family.

Make sure to save the new family.


I modeled the curtain wall panels in 3 parts: The back of the panel, the front of the panel, and the inset circle. The back of the panel and front of the panel are one material, which I identify with the parameter "PanelMat". The smaller inset circle is made of a seperate material I identify as "InnerCircleMat".

Modeling the Back of the Panel

Ext 2.png
Ext 3.png
Ext 4.png
Ext 5.png
Ext 6.png
Ext 7.png
Ext 8.png

To model the back of the panel:

On the Exterior Elevation begin by creating a new reference plane between the existing top and bottom horizontal reference planes.

Create → Datum → Reference Plane

Add a dimension between the existing bottom horizontal reference plane and the newly drawn refernce plane and between the newly drawn reference plane and the existing top horizontal refernce plane.

Annotate → Dimension → Aligned

Select EQ to ensure the distances are equivalent. The distances on the dimensions should now be replaced with EQ.

Create a new extrusion.

Create → Forms → Extrusion

On the properties panel of the new extrusion set the extrusion end to your desired thickness for the back of the panel. I set mine to 1/4".

Properties → Constraints → Extrusion End

Next create an instance parameter for the panel material. This will allow the panel material to be changed in the final wall design. On the properties panel the material should be assigned as "By Category". Click on the small white rectangle to the right of "By Category". This should open the Associate Family Parameter pop-up.

Properties → Materials and Finishes → Material

On the Associate Family Parameter pop-up select the icon of a piece of a paper with a star on it in the bottom left corner of the window. This will create a new parameter.

On the Parameter Properties window set the Parameter Type to Family Parameter. Under Parameter Data select Instance. Instance parameters can be set to differnt values for individual instances of a family type. Using instance parameters will allow the material of each panel to be changed in the curtain wall. Name the parameter. I named my parameter "PanelMat". Select Okay.

Now use the draw tool within Modify|Create Extrusion to trace the rectangle formed by the intersections of the reference planes. Lock the lines of the rectangle to the refernce planes.

Select the green checkmark to extrude the extrusion.

Modeling the Front of the Panel

Ext 9.png
Ext 10.png
Ext 11.png
Ext 12.png
Ext 13.png
Ext 14.png
Ext 15.png
Ext 16.png
Ext 17.png
Ext 18.png

Use reference lines to draw a circle in the center of the curtain panel.

Create → Datum → Reference Line

Add a dimension across the diameter of the circle.

Annotate → Dimension → Diameter

Select the dimension. Create a new parameter.

Modify | Dimension → Label Dimension → Add Parameter Button (Small Rectangular Icon w/ Yellow Star)

Create an instance parameter for the inner diameter of the inset circle.

Use reference lines to draw a second larger circle also centered at the center of the curtain panel. Dimension it and create an instance parameter for the outer diameter of the inset circle.

Create a new extrusion.

Create → Forms → Extrusion

On the properties panel of the new extrusion set the extrusion end to your desired thickness for the back of the panel. I set mine to 3/4".

Properties → Constraints → Extrusion End

Set a work plane for the new extrusion on the face of the base panel extrusion.

Modify | Create Extrusion → Work Plane → Set

Use the Modify | Create Extrusion drawing tools to trace the outside edges of the panel and both circles. Lock the dimensions to their reference lines.

Set the material of this extrusion as the panel material parameter.

Select the green checkmark to extrude the extrusion.

Modeling the Inset Circle

Ext 19.png
Ext 20.png
Ext 21.png
Ext 22.png

Create a new extrusion for the inset circle. Make sure the work plane for the extrusion is on the face of the base panel extrusion. Use the Modify | Create Extrusion drawing tools to trace both circles, making sure to lock the circles to their reference lines. On the properties panel of the new extrusion set the extrusion end to your desired thickness for the back of the panel. I set mine to 1/4".

Next create a new instance parameter for the inset panel material.

Properties → Materials and Finishes → Material

On the Associate Family Parameter pop-up select the icon of a piece of a paper with a star on it in the bottom left corner of the window. This will create a new parameter.

On the Parameter Properties window set the Parameter Type to Family Parameter. Under Parameter Data select Instance. Name the parameter. I named my parameter "InnerCircleMat". Select Okay.

Select the green checkmark to extrude the extrusion.

Now, you can optionally assign material to the curtain panel material parameters by opening the Family Types window.

Modify → Parameters → Icon of a square outline with a blue square in the bottom right corner

Now the material values can be changed from <By Category> to specific materials.

Create a Curtain Wall & Import Panels

Revit  (6).png
Revit  (7).png
Revit  (8).png

Now that the curtain wall family has been saved, it can be added to a curtain wall in Revit.

Draw a curtain wall of your desired length and height. I drew a curved curtain wall for fun.

Select the curtain wall. On the properties panel select Edit Type. Duplicate the curtain wall type and name the new curtain wall type. Select okay.

Properties → Edit Type → Type → Duplicate

Set the vertical and horizontal layout and spacing of the curtain wall to your desired size. I created 2’ x 2’ curtain panels. Keep in mind that as the number of panels in a wall increases, the harder it will be for Revit and Dynamo to process the information in the revit file. If you are designing a wall with hundreds or thousands of small curtain panels, make sure you frequently save your work, and consider testing your design on a smaller prototype wall first.

Type Parameters → Vertical Grid → Layout

Type Parameters → Horizontal Grid → Layout

Now, change the curtain panel value to your concentric circle curtain wall family.

Type Parameters → Construction → Curtain Panel

Select Okay or Apply and the curtain wall should populate with curtain panels.

If the curtain wall is covered in a mess of giant circles, or the material of the curtain wall has changed but there are no visible circular cutouts in it, double check the inner and outer circle diameter parameters are set to values at a reasonable size for the size of panels being used. For example for a 2’ x 2’ panel arrangement try setting the outer diameter to 1’ and the inner diameter to 0.5’.

Create a New Dynamo Project

Open Dynamo from the Revit Manage tab.

Manage → Visual Programming → Dynamo

Create a new workspace by selecting the new button.

On the bottom left corner of the screen set runs to Manual.

Connecting the Curtain Wall to Dynamo

Dyn Import.png
curtain wall import 2.png

Use the search bar or dropdowns to add new nodes to the workspace.

Connect a Select Model Element node to a CurtainPanel.ByElement node.

Select Model Element selects an element from a Revit model.

CurtainPanel.ByElement generates a list of all of the individual panels in the selected curtain wall.

To select a curtain wall click on Select on the Select Model Element node then click on a curtain wall within your Revit model. Click run to run the program.

After running the program if you hover over the 3 dots in the corner of each node, information about the curtain wall should appear.

Outer Circle Diameter Randomization

Revit  (9).png
Dyn Outer.png

To randomize the outside diameter of the inset circles:

Please refer to the reference photo above for more information.

Connect a Code Block to a List Create node. List as many outside diameter values (in decimal feet) as you want in the code block, each on a separate line and followed by a semicolon. Connect these values to the List Create node to create a list. Use the small + and - signs at the top of the List Create node to expand and contract the list length.

Now create 2 List.Count nodes. These nodes will output the number of items in a list. To determine the number of outer diameter values connect the outer diameter List Create node to one of the List Count nodes.

Connect the CurtainPanel.ByElement node to the other List Count node to count the number of curtain panels in the wall. Use a / (division operator) node to divide the number of panels (x) by the number of diameters (y) by connecting the panel number List Count node to x on the / node and the diameter number List Count node to y on the / node.

Create a List.Cycle node. Connect the outer circle diameter List Create node output to list on the List.Cycle node. Connect the / (division operator) node output to amount on the List.Cycle node. List.Cycle will output a new list of diameters that contains the same number of list items in it as there are curtain panels by repeating the list made by the List Create node until the correct number is reached.

To randomize the list that List.Cycle output connect it to list on a List.Shuffle node. Create an Integer Slider to connect to seed on the List.Shuffle node. This Integer Slider will function as a seed for List.Shuffle enabling us to create pseudo random but reproducible diameter sizes.

To output this pseudo random arrangement back into the Revit model we can use Element.SetParameterByName. Connect the CurtainPanel.ByElement node to the element input on Element.SetParameterByName. Create a Code Block. On the Code Block type the name of the parameter outer diameter is assigned to on your model in quotation marks followed by a semicolon, I used the parameter “OuterD”. Connect the parameter name Code Block to parameterName on the Element.SetParameterByName node. Connect the list generated by List.Shuffle to value on Element.SetParameterByName.

When the program is run the outer diameter of the circles should now be varied randomly between the diameter sizes listed. This program randomly arranges equivalent numbers of listed diameter size.

Inner Circle Diameter Randomization

Revit  (10).png
Dyn Inner.png

The inner circle diameter size is dependent on the outer circle diameter size, to ensure that the inner circle is smaller than the outer circle. Their code is very similar, and some components of it can be copied over from the outer diameter code.

Please refer to the reference photo for more guidance.

Connect a Code Block to a List Create node. The values listed in this list will represent the difference between the outer diameter and the inner diameter. For example if the outer diameter is 1’ and the value from this list is 0.25’ the resulting inner diameter would be 0.75’. List as many values (in decimal feet) as you want in the code block, each on a separate line and followed by a semicolon. Connect these values to the List Create node to create a list. Use the small + and - signs at the top of the List Create node to expand and contract the list length.

Same as in the last step, create 2 List.Count nodes. These nodes will output the number of items in a list. Connect the inner diameter List Create node to one of the List Count nodes and the CurtainPanel.ByElement node to the other. Use a / (division operator) node to divide the number of panels (x) by the number of diameters (y) by connecting the panel number List Count node to x on the / node and the diameter number List Count node to y on the / node.

Create a List.Cycle node. Connect the inner circle diameter List Create node output to list on the List.Cycle node. Connect the / (division operator) node output to amount on the List.Cycle node.

Create an Integer Slider to connect to seed on the List.Shuffle node. Connect the output of the inner diameter List.Shuffle node to y on a - (subtraction operator) node. Connect the output of the outer diameter List.Shuffle node to x on the - node. This will create a list of inner diameters that are both pseudo random independently of the outer diameter size, and guaranteed to be smaller than the outer diameter.

To output the inner diameters to Revit connect the CurtainPanel.ByElement node to the element input on Element.SetParameterByName. Create a Code Block. On the Code Block type the name of the parameter inner diameter is assigned to on your model in quotation marks followed by a semicolon, I used the parameter “InnerD”. Connect the parameter name Code Block to parameterName on the Element.SetParameterByName node. Connect the list output from the subtraction - node to value on Element.SetParameterByName.

When the program is run the inner and outer diameters should now be randomized.

Panel Material Randomization

Revit  (11).png
Dyn Mat.png

Randomising material is similar to randomizing dimensions. Instead of connecting the Code Block directly to the List Create node, Material.ByName nodes must be added between them.

Like in the other steps create 2 List.Count nodes to connect to the CurtainPanel.ByElement and List Create nodes. Use a / (division operator) node to divide the number of panels (x) by the number of materials (y).

Connect the material List Create node output to list on a List.Cycle node. Connect the / (division operator) node output to amount on the List.Cycle node.

To randomize the list that List.Cycle output connect it to list on a List.Shuffle node and create an Integer Slider to connect to seed on the List.Shuffle node.

Connect the CurtainPanel.ByElement node to the element input on Element.SetParameterByName. Create a Code Block. On the Code Block type the name of your model’s material parameter in quotation marks followed by a semicolon, I used the parameter “PanelMat”. Connect the parameter name Code Block to parameterName on the Element.SetParameterByName node. Connect the list generated by List.Shuffle to value on Element.SetParameterByName.

When the program is run the panel’s material should now be varied randomly between the given material types.

Circle Cutout Material Randomization

Revit  (12).png
Dyn Cutout.png

To randomize the material of the inset circles I used the list of materials from the previous step and the seed from the previous step plus 1, as I wanted the inset circles to be made of the same 4 materials as the base panels, and I did not care how they were specifically randomized aside from having some variation between them and the main panels. Using this method some of the inset circle panels will be made of the same material as the base panel they are on, but I found that fit the design intent I was going for.

Connect the material List.Cycle node from the last step to a new List.Shuffle node.

Connect the Integer Slider from the last step to an addition operator + node. Type 1; in a new Code Block and connect it to the other input of the addition operator + node. Using the sum of 1 and the seed from the main panel material randomization as the seed to randomize the inset circle material guarantees that the inset circle material will be randomized differently.

Connect the output of the addition operator + node to seed on the List.Shuffle node.

Connect the list generated by List.Shuffle to value on Element.SetParameterByName.

Connect the CurtainPanel.ByElement node to the element input on Element.SetParameterByName.

Create a Code Block. On the Code Block type the name of your model’s inset circle material parameter in quotation marks followed by a semicolon, I used the parameter “InnerCircleMat”. Connect the parameter name Code Block to parameterName on the Element.SetParameterByName node.

When the program is run the inset circle’s material should now be varied randomly between the given material types.


Final Code

DynamoParkPanels_2ConcCircles_2025-05-25_11-26-14.png

Above is an image of all of the Dynamo code showing how each section fits together.

Customization

blue watercolor rendering.png
Water Color Rendering Wood .png
Water Color Rendering.png

By using a separate seed number to randomize the outer circle diameter, inner circle diameter, and material each of these aspects can be changed separately by adjusting their respective integer slider. Additionally the number of outer diameter, inner diameter, and material options can be changed by adding or removing values from the respective list create lists. The code can also be easily adapted to use separate random number seeds and/or separate materials for the circle cutout material and the base material. I hope this Instructable has been a helpful starting point if you are trying to design a similar curtain wall! Thanks for reading, and good luck in your future CAD endeavors!