Revit – Black holes on Level Four, the Vortex of Doom, Thinking like Revit, and Best Practices.

Revit – Black holes on Level Four, the Vortex of Doom, Thinking like Revit, and Best Practices.

A designer asked for help this week with a project where they were having difficulty creating shafts on certain levels. On some levels there was no issue, on other levels she was unable to create a shaft to save her life.  This was her question:

“Good morning! One of my revit models is giving me trouble when creating a shaft. When I choose to create a new shaft it immediately gives me an error that the top of the opening is lower than the bottom of the opening. It does not allow me to adjust the heights, and I am unable to place a new shaft. I’ve audited but cannot figure this one out…”

When I jumped into their model, activated one of the problem levels and launched the shaft tool, I was greeted with this dialog box just as she described it:

Invalid shaft settings
Invalid shaft settings

Clicking Delete Element(s) gave me another cryptic message about not being able to delete the element I am unable to create in the first place.

Can't delete currently active element while in sketch mode
Can’t delete currently active element while in sketch mode

Of course hitting the Cancel button will allow me to exit the sketch mode based shaft command, leaving me right where I started with no shaft!…. It seems my designer has spawned a black hole and now I’ve been swept into the vortex with her! So I try again and this time pay attention to the property palette.

Its a black hole or an inside out shaft...
Its a black hole or an inside out shaft…

Notice the level based constraints on the shaft and the resulting Unconnected Height. Seeing this, I switch to another level and try creating a shaft and viola no error message, I seem to be able to create the shaft with no problem. So it appears the black hole only exists on the fourth floor.

Remove the top constraint association - first!
Remove the top constraint association – first!

So I cancel the command and see if I can create a shaft on the offending level four again…much to my chagrin, I still cannot create it, but at least I’m not past the event horizon so I cancel the command again. My next thought is it is a problem with an existing shaft and prepare to find the offending shafts and remove them. But wait, before I go down that rabbit hole, let me think about how Revit works! I know that Revit is always trying to help me by remembering the values I previously used for different commands… so maybe all I have to do is successfully create a shaft that is not tied to an upper constraint.  As shown in the image above, with a floor to floor height of 20′-6″ (intermediate level not shown), a base offset of 15′-0″ the result is a shaft of 5′-6″, which is valid.  Then it occurs to me, perhaps I shouldn’t have canceled out of the command after all! Since canceling didn’t store the value in the properties palette, I go ahead and try creating a shaft again on the level without the black hole, this time setting the upper constraint to “Unconnected” and clicking the green check mark to successfully complete the process.

Click to finish the sketch and create the shaft
Click to finish the sketch and create the shaft

Completing the process results in new shaft tool defaults, so when I launch the tool on another level, the properties of the shaft tool will default with the base constraint of that current level, but no upper constraint. My theory is that the tool will not error out.

Unconnect the top constraint
Unconnect the top constraint

I try on another level and have success. I try on the offending level and have success.


Ding ding ding, winner winner, chicken dinner!

Once I’ve created a shaft I am able to then create a new one on any level I wish. So next time you’re faced with this vortex of doom, just find a level that works, or create a new level and create a shaft with no top constraint. Then you can delete it and resume creating shafts on levels you want to create them on.

The invalid default settings have been replaced.
The invalid default settings have been replaced.

P.S. I am sure that this problem originated as a result of nesting shafts within Model groups and copying them from level to level with “Upper Constraint” properties tied to levels.

Revit: Best Practice – Shaft Openings

So the best practices for today are:

  1. NEVER create elements with Upper constraints set to a level and then group and nest them and copy to other levels.
  2. ALWAYS remove the “Upper Constraint” for elements within Groups and set the upper constraint to “Unconnected” with an explicit height.
  3. Better yet, don’t include level constrained elements inside groups!
Use Dynamo to Place 3d_RoomTag Families Inside Rooms (a CASE 3d_Room_Tag replacement tool)

Use Dynamo to Place 3d_RoomTag Families Inside Rooms (a CASE 3d_Room_Tag replacement tool)

On a recent project I needed to place a family in the center of each room in the project.  With hundreds of rooms in the project, I did not look forward to placing all of them individually.  I knew that Case had a 3D Room Tag tool that would place a generic model 3D Room tag family in the center of each room and populate the room number and name parameters.  Fortunately I had previously downloaded and registered this fabulous set of tools.  But if you didn’t or want to have a custom tool that you can further extend and customize, then you’ve came to the right place.  Because although the free tool is very handy, it is no longer available for new installs and I would much rather have a multi-purpose tool that can be customized and modified for different conditions and needs. For instance, what if I needed to place a different family or locate the family away from the center of the room, or at the centroid of the room?  Case is now part of WeWork, the registration system is no longer available and unless you already had the app, you were out of luck…until today!

Dynamo 3dRoomTagTool
Get a dynamo enabled 3D Room Tag Tool replacement here.

This article demonstrates a Dynamo graph that will replicate  the functionality of the Case 3D Room Tag tool.  To get started, make sure you’ve installed the latest build of Dynamo ( as of this article.  Also launch the package manager and grab a copy of the Grimshaw, LunchBox, Clockwork, and my latest BesideTheCursor packages.  If you don’t have the 3D room tag family, I’m posting it here.

Node Recipe:

1 – Levels

1 – Boolean

1 – Get Rooms By Level

1 – Number

6 – String

1 – Level.Plane

2 – Element.GetParameterValueByName

1 – Geometry.BoundingBox

1 – BoundingBox.ToCuboid

1 – Solid.Centroid

2 – BoundingBox.PerimeterCurvesOnPlane

1 – BesideTheCursor ReplaceEmptyStringValuesInList

1 – Curve.EndPoint

1 – Polygon.ByPoints

1 – Polygon.Center

1 – FamilyInstance.ByPoint

1 – FamilyTypes

3 – Element.SetParameterByName

Using the recipe above and the image below, you can recreate the graph to generate your own tool.  Continue reading below to rebuild it from scratch in a step by step manner.

Building the Dynamo Graph from scratch:

Dynamo Graph Replacement for Case 3d Room Tag Tool
Finished Graph

Let’s start at the beginning and the end as we usually do when we work in Dynamo.  First insert our starting node, the Revit Selection Action – Levels so we can choose a level.


Next we’ll insert our end node, and because we want to place our family at the center point of the room, we’ll look in the Revit Family Instance Create group and choose FamilyInstance.ByPoint.  Place both nodes, as shown below, in the graph editor and separate them so we have room to start adding the internal nodes.


Looking at the input and output ports on our nodes, we are going to need a node to provide a familySymbol (aka Family Type), and a point (3d).  We are also going to feed our levels into a node to return the rooms collection. Let’s start there, click in the search tool and type in room, when the search tool loads the selections, select “Get Rooms by Level from the Grimshaw package under Selection – Actions.


Go ahead and connect the Levels output to the Level input on the Get Rooms by Level node.  See the “Exclude Unplaced?” input?  We’ll need a True/False Boolean value to satisfy that input.  You can find one under the Core Input Actions, insert it and connect up the ports.  We can’t place a family in an unplaced room, so set the Boolean to True and connect it to the Exclude Unplaced input port.  Since we have two new outputs, we can see that we have the list of Room objects and above it a list of Room names.  This node will make our job easier as we won’t have to get the name parameter from the room object, just the number.  We’ll do the rest of the parameter value extractions and assignments later in this tutorial.

Our next step is to do something with the room objects collection.  Since rooms occupy volume, they must have properties that allow us to query the size, shape, perimeter, area, and other properties of the space.  If we abstract our thought process a little, we might be able to recreate the shape of the room and then find the center of that area.  Let’s start by grabbing the geometry of the room object.  Type “” into the library search tool and place the geometry.boundingbox node into your graph and connect the geometry input port to the room(s) output port as shown below.  If you run the graph at this time, you’ll see that dynamo will identify the bounding box vertex points for each and every room you have placed on the selected level. Make sure that you select the desired level from the levels node first.

Revit Dynamo Rooms Bounding Box

Now that we have bounding box objects in our graph, make them visible by creating some geometry with them.  Type BoundingBox into the search tool and look at the create options we have available. The ToCuboid node will allow us to see the bounding box within the Dynamo graph without actually placing geometry in  our Revit project. Click Run again to see the result in the graph editor.  Hold the escape button down while you roll your mouse wheel out to see all the room cuboids created.

Proto Geometry for Rooms in Dynamo for Revit

Notice the list of Cuboids.  Each cuboid has properties of length, width, and height. Since these cuboids are considered solid geometry by Dynamo, I can pass them into a centroid node to out put the centroid as a point.  This will give me the exact center of the object both horizontally and vertically.  Connect the solid input port on the “Solid.Centroid” node to the cuboid output port on the boundingbox.tocuboid node and run it to see the list of points generated. If we used these points to place our 3DRoomTag, we would soon see that the tag is placed in the exact calculated center of the room.  This may or may not be desireable.  To see the points in the Dynamo Editor, hold your “Esc” key down and left mouse click one of the cuboids.  With the cuboids selected, right click your mouse and choose “Hide geometry preview” to turn off the cubes, revealing the points generated as shown below.

Hiding and displaying geometry in Dynamo Graph Window

To redisplay the cuboids, right click again and choose “Show all geometry preview” from the context menu displayed.  In my example and to place the 3D room tag in a similar manner to the CASE tool, I must place the family at the center of the room floor, so we will need to generate a plane that we can find the center of each room on.  Click on the Library search tool and enter BoundingBox and find PerimeterCurvesOnPlane from the Clockwork geometry boundingbox query group and connect the boundingbox output port to the “Bounding Box(es)” input port. Notice that we now need a “Plane(s)” input list.  Knowing that we can get a plane from a level and we have already identified the level, let’s drop a Revit-Elements-Level-Query Level.Plane node and connect the relevant ports as shown below.

Revit Dynamo Curves generated from Bounding Box

With the perimeter curves established, we can use the search function to see what “center” options we have nodes for.  Notice that under geometry, we have a Center action for polygons under geometry.  Unfortunately, we can’t create a polygon directly from the curves, but we can create it from the endpoints of the curves.  Insert the following nodes (Curve.Endpoint, Polygon.Frompoints, and Polygon.Center) and connect the relevant ports and then run the graph again.

Generating Polygon Shapes from Bounding Box and getting center point using Dynamo for Revit

Now that we have the correct center point, we are finally ready to connect this to our FamilyInstance.ByPoint node.  The only thing left to do is to grab the Family Type (aka symbol) from the node library and preselect our family to be inserted.  Look for the Family Types node and connect it up and run the graph again. Then switch to Revit to see the results.


We’re almost done, but unfortunately our family is inserted without any room name or number information.  Let’s add some get-parameter and set-parameter nodes and connect them to complete this project.

image020 image022

Since we already have a collection of Room Names from our Get Rooms by Level node, next we need to collect the room numbers.  I’ll show you how to do that and then we’ll can add an additional collector to get the department info we need for the 3D room tag.   To get parameters from a collection of objects, we need to know the parameter name.  To do this we’ll add an Element.GetParameterValueByName node and a string node to the graph.  Enter “String” without quotes in the search box, hit enter, add the node and then type in “Element.GetP” and hit enter and add this node as well.  Connect them as shown in the image below and then we’ll start adding the Set Element Parameter nodes.

Get Parameter Value by Name in Revit Dynamo


image026 image022

Once you add these two nodes into your graph, select them both and copy/paste them into the graph so we have two sets.  Enter 3dRmName into one of the string nodes and 3dRmNumber into the other.  Connect the string nodes to the “parametername” input port.  Connect the room names collection from the GetRoomByLevel node to the “Element.SetParameterByName” node value port.  Make sure that it is the one that uses the “3dRmName” string.  Add the room(s) numbers collection from the “GetParameterValueByName” node output port to the other “Element.SetParameterByName” node value port. Connect each element port to the “FamilyInstance” output port on the FamilyInstance.ByPoint node.  Run the graph. If all the connections match correctly, you should see the values now populated into the 3DRoomTag family insertions.

Complete Dynamo Graph for Case 3d Room Tag Replacement


You now have 3D room tags placed in each room. But with the knowledge you acquired, you can also place other families and populate data in an automated way for future needs. Take a look at the custom  node graph for the method used to populate and replace the previously filled department names, determining first whether the department was previously populated.  Some parameter assignments will throw errors if you try to pass in nothing.  I used a check length of string method to validate the data and substitute a replacement value based on the string length.  You can get that custom node from the BesideTheCursor package.  If you already have the 3DRoomCube family from case, this graph will be able to use it and populate it.

Revit: Rendering Tips and Tricks

Revit: Rendering Tips and Tricks

Revit’s rendering engine generates photo-realistic images from the building information model. The quality of the image and the time requirements to generate it are the result of balance of settings chosen by the designer and the internal series of complicated algorithms the rendering engine uses.  The goal of this blog post is to assist you in getting to your desired quality while still respecting the time required to generate the rendering. With that goal in mind, there are some things you can do to speed up the process, for instance:

  1. Maximize your Resources – When preparing to render in Revit, exit out of other applications, services, and processes that might compete for resources with Revit’s built in rendering engine: fbooprender.exe
    1. Turn off screen savers, web pages, other applications, and services that have launched by default like iTunes, adobe flash player update service, and other “helper” services that launch at system startup but only bleed off resources that could be utilized.
  2. Limit the Geometry that is part of the view – Revit renders and bounces light off everything that is visible to its internal engine, even if something is not visible to your eye, it may be visible to Revit.
    1. Change detail level to course or medium
    2. Turn off unnecessary categories using visual graphics
    3. Unload linked models that won’t impact the rendering.
    4. Hide worksets that don’t contribute to the rendering
    5. Physically limit geometry through the use of section boxes and/or camera clipping planes – remember each view in Revit has its own section box.  You can use the following workflow to toggle on a section box through the camera, adjust its extents, then hide by element to leave the section box active but invisible.
Limit Geometry
Hint: Watch your geometry in the Render viewport to ensure that geometry isn’t cut off in the process of adjusting the section box.
  1. If rendering artificial lights, use light groups to manage them

Note: that lights that are not within the view can still have a significant impact on the quality of the rendered image. Section boxes exclude lights that are clipped. When planned carefully and with forethought, the combined use of section boxes and light groups can greatly reduce the amount of time required to render an image

  1. Choose wisely – The selection of materials, colors, light source shapes and other settings can greatly increase the time required to render images of similar quality.
    1. Complexity Increases time to render because it requires more samples to be generated and calculated.  Simplify your materials, geometry, and patterns to reduce render time.
    2. Quantity affects time to render.  Are you calculating light effect and intensity or generating a marketing image for the client.  Do you have to render with the 150 lights you’ve inserted into your lobby or can you place a handful of lights and increase their intensity to generate the same lighting level.  Less lights = faster render.
    3. Quality and Complexity of appearances affect render times. – Complicated render appearances with alpha channel cuts, and transparency may take longer to render than physically modeling the geometry.  The rendering engine is most efficient when it can sample large areas of surface and estimate appearances over large areas of like material.
      In general:
      i.      Smooth monochrome is faster than smooth patterned surface
      ii.      Simple surfaces are faster than detailed perforated surfaces
      iii.      Matte reflections are faster than blurred reflections
  1. Be judicious in choosing image size and resolution. – Are you rendering for a slide show or an E1 sized presentation board?
    1. Choose an image size that is reasonable and appropriate for the desired use
    2. Choose the image resolution wisely – Render time is multiplied when moving upwards from 75dpi by a factor of 2.7 times each increase. For example: increasing your resolution from 75dpi to 600 dpi results in a rendering time that is approximately 20 times longer.

Sample Rendering:

An optimized rendering
An optimized rendering

[Cross-posted from WBA blog]

Dynamo Barrel Vault Brace 07

Dynamo Barrel Vault Brace 07

We are going to finish up this topic with this post on setting parameters.  If you are just arriving at this blog for the first time, I’ve been doing a series of posts on Autodesk Dynamo.  You can catchup by clicking the links below, when you’re caught up we’ll proceed.

Let’s get started adding nodes to our graph that will allow us to control our instance based parameters for size. Ready? Open the Adaptive Component Placement.rfa family we created in post 4 of this series.

Now click the “Addins” ribbon tab and open the Dynamo editor.

Within the Dynamo editor, open your copy of the graph we’ve been working on or download the copy I put in post 6 of this series. A good place to start is with upgrading the packages that are in use. A little time has passed since I created this graph and I ran into crashing when I first opened it in V0.8.0.950. Click on the Packages menu item in dynamo and choose search for packages. Click on the latest versions of ArchiLab, Clockwork, and Lunchbox. If dynamo wants to uninstall them, its ok. Once you’ve updated or installed these packages, drag your integer slider and click “Run” and make sure Dynamo is reconnected to the geometry in our family. If you see a warning about multiple instances in the same place, just select all your brace instances and delete them and let Dynamo place them again. Is the graph working again?

Good,the first thing we need to do is find a node that will allow us to set parameters. Click on the search tool and begin by typing in the following as shown in the image below: Element.Set

Set Parameters Node

Click SetParameterBy Name and let’s investigate the node before we begin wiring it up. As I mentioned earlier, it is helpful to work from both ends back toward the middle, so since we want to set parameters for our family insertions, we will be creating a new end point node to do it.

Drag your Element.SetParameterByName node to the far right of the graph and hover over its titlebar. Notice the tool tip properties that appear above the titlebar. This is dynamo’s help providing you a brief look at the node, its purpose, and what the inputs and outputs are.

Set Parameter By Name

If that isn’t enough to get you started with a particular node, then right-click your mouse while you are hovering over the title bar and click the “help” menu item. This will display a dialog box containing more info about the node as shown in the image below.

Right Click on Title to access help

As you can see in the help, we need the “family instance” as an element input, we will need to wire up the parameter name as a string and a value as a variant (text or number). Close the help box and click on the element input in our new node and wire it up to the “AdaptiveComponent” output from our graph’s “AdaptiveComponent.ByPoints” node.

Return to the search tool and type in string and hit the enter key and drag your new string node over to the left of the Element.SetParameterByName node. It is always nice to use a purpose made tool for the job, so lets clear our search tool by clicking the x on the far right side of the search input box, and navigate down to Core, Units, Actions and choose the Number from Feet and Inches node as shown in the image below.

units Imperial
Number from Feet and Inches

Drag it over and align it just below the string node. In the string node, enter “PipeRadius” and connect its output port to the “ParameterName” input port. Enter 0’ 2 ½” in the new number node and connect its output to the Value input on our Element.SetParameterByName node as shown in the image below and click Run:

Set parameter by Name
Set Radius

Did the PipeRadius Update? Can’t tell? Try changing the value to a larger number like 8”. Run it again. Are you setting parameters in your family? If it is not working, double check that you set your 4Point_Brace_AC parameters as instance and you assigned them to the same name parameter in your AdaptiveComponentPlacement family.

pipe radius in action
Changing parameter values is easy with Dynamo

I’ll let you duplicate the nodes we just added and create the version for the BraceRadius. Did you know that you can select all three new nodes and copy them to the clipboard? Use a window selection to cross them and use CTRL+C to copy to the clipboard. Now paste them to your graph using CTRL+V and move them just below the above nodes. They are already connected, how cool is that? Change the new string value to “BraceRadius” and test it. Is your family adjusting?

Set parameter
The proof is in the pudding when the radius changes.

Now you know how to set parameters by name using dynamo.  See you next time.

Dynamo Barrel Vault Brace 06

Dynamo Barrel Vault Brace 06

We should be ready to start adding nodes and making connections now.  If you are just arriving at this blog for the first time, I’ve been doing a series of posts on Autodesk Dynamo.  You can catchup by clicking the links below, when you’re caught up we’ll proceed.

Open the Adaptive Component Placement.rfa family

Launch Dynamo and click New to create a new dynamo graph or workspace.

When you’re working in Dynamo, its helpful to work backwards from what you want to build to what you need to drive it.  In this case, we want to place adaptive components along a series of points running along the top and bottom of our trusses.  So right off the bat, I know that I’ll need some node to place the adaptive component by points, and a way to select the curves containing the points.

Alright with those two elements in mind we’ll take advantage of the search tool.  If you remember from previous posts, the search tool is at the top of the library list along the left side of the dynamo main window.  Move your mouse there and begin typing “adaptive..”  Did you notice that the list was immediately filtered to only show you nodes that contained the word adaptive?  See if you can find the AdaptiveComponents.ByPoints node.



Good, you found it, so let’s click it to have one added to our graph

It probably came in a little big, so click anywhere in the graph window and roll your mouse wheel to zoom out drag the node off to the left side of your graph window.  It usually places these new nodes at the center of the graph.  Remember this when your graph gets really complex.  This node will represent the “end condition” of our project.  As this node receives points from our graph, it will place the brace family aligning each ac point in the family with a point located on one of our curves. Notice the inputs (along the left of the node) and outputs (located along the right side), we have an input connector for points, an input connector for a familysymbol (think family type) and an output value of “AdaptiveComponent”.


Still working backward, let’s return to the search bar and enter “family types”.  Find the “Family Types” node under Revit -> Selection -> and click it to add one to the graph.  Did you notice that the library is not only filtering the options based on your search input, but is also providing a list of the “Top Results”.  Those guys at the factory sure make things easy for us don’t they!

With the family types node in our graph, let’s create a pipeline for our data from one node to the other. We do this by clicking first on output connector or port of the Family Types node and then click on the “familysymbol” input connector or port of the AdaptiveComponent.ByPoints node.  As seen in the graphic, the “data pipeline” is represented by a dashed line when the connection is incomplete and by a solid line when the connection has been made at both ends.  From now on, I’ll just say to connect “this port” to “that port” and you’ll know what I mean!


Did you know? – You can make disconnections too, by simply clicking again on port and then simply clicking on empty space.  We’ll connect and reconnect frequently as we work in dynamo.

Click on the display toggle (hollow or filled square at the lower right corner of the AdaptiveComponent.ByPoints node.  Notice that it displays “null”.  This is because we haven’t run our graph yet.  This will soon change, we’ll revisit this when we have made some other connections.


So, as I mentioned earlier, we frequently work backwards in Dynamo from the result to our initial step as we layout out the logic for our dynamo graph.  Looking at the AdaptiveComponent.ByPoints node, we see that there is another connection to be made.  The points port indicates that it wants to receive a list of points.   While we could just create a list of points, it would be better if we could pull the points from our truss chords.  We’ve already drawn the curve lines to represent the chords by tracing our dwg import, so let’s jump to the other end of the task and add some dynamo selection nodes to pick the curves we’ve already drawn.

Click the search tool and begin typing “Select” without the quotation marks.



Find the tool Select Model elements and click on it in the library list area. This will add it to our workspace.  Notice that it has a yellowish background and the result indicator displays “Nothing selected.”  Don’t be alarmed, we’ll select something soon, and Dynamo will remember the selection for us by displaying the Element ID in text.  Yes, it is the same element id as Revit.

Since we will have four connection points per brace and because we are bracing between the top and bottom chords of two adjacent trusses, it goes without saying that we will need four “Select Model Element” nodes. You can click the library 3 more times or select the inserted node and copy to the clipboard and then paste 3 times.  Your choice, but sometimes it is faster to copy paste when your deep in a graph and don’t want to keep using the “search” area.


Your workspace or graph should look something like the image above at this point.  Since we’ve been at this for a while, it is probably a good time to save our work.  Click the save icon on the Quikc Access Options bar and save your graph as “Dynamo_Barrel_Vault_Truss_AC_Placement.dyn” or whatever name you choose.

Note: It is always best to be descriptive when you are sharing with others or picking items from a list, which happens frequently in Revit.

Let’s Run our project and begin selecting our model splines.  Configure your screen so you can see both the dynamo editor and the Revit environment and while you’re at it, let’s select that dwg import and temporarily hide it in Revit to make our model element selection easier.


If your screen looks similar to the image above, click the the “Run” button and starting with the top “Select Model Element” node perform the following actions:

Click Select (inside the node)

Move your mouse into the Revit drawing window and select the bottom chord spline of the Left Truss .

Notice that the element id of the spline curve is indicated in the node display.

Working your way from bottom to top and left to right, make your selections of all the splines, one spline per select model element node.  Click Run, you should see the approximate curves displayed in the Dynamo Geometry window.  You can zoom to fit to see the results if you are zoomed in too far. Click the Geom toggle in the lower right corner of the graph window, then right click your mouse and choose rotate.  With your left mouse button depressed, move your mouse until you have a similar view of the dynamo geometry.  Hit CTRL + G to exit the geometry mode.


The select model Element nodes will pass the spline object as a curve to the next node we add.  Rather than collecting and passing each selection as a single element, lets build a list of the selections and pass the list.  We can do this by choosing the List.Create node from our library. You can find this node by searching or by clicking directly to it under “Core” -> “List” -> “Create” or by typing in the search box “core.” Then looking for create.  Did you know the dot operator worked in Dynamo to identify particular nodes within packages?  Now you do.

When the list.create node is displayed it has an index0 input and a list output port.  Click the plus sign (+) three more times to create an index port for each of your splines and connect them up.  It’s worth noting that arrays or list items in Dynamo always start with 0.  So the index item number will always be one less than the total number of items.

list of curves

Click Run to see the resulting list of curves get built using the display toggle.  Note that it indicates null before the Run button is clicked and a list of curve by points after Run is completed.

list of curves apres run

It is our goal to divide the curves into a series of points to feed into our AdaptiveComponent placement node, so we need to do some division.  Return to our friend the search box and type in divide.  Find the DividedPath.ByCurveAndDivisions and add it to the graph.  While we are there, lets add a query to identify the points created by the division.


Also pick Points under Query and then we’ll connect the graph so it looks like the image below. We’re almost done. Aren’t you excited?  Before you click run to see the results, lets add a node to allow us to enter the number of divisions.  We could do this with a number input node, but then we’d have to manually type in the value everytime we wanted to change it.  Much easier to type “slider” in the search box and add the “Integer Slider” node to our graph.  Connect it up to the divisions input port and set the value to a number between the min and max of the integer slider range.  (Click the circle icon to display the Min and Max value input fields.).

Okay, hit Run now and look at the results.


Notice the points displayed along our graph geometry and the resulting lists in the display toggle of the DividedPath.Points node we added earlier..

Okay, so far so good, we’ve got the curves and we’re splitting them into equal divisions generating points along the way…now we need to marry up each lines index item with the rest of the curves.  In other words, the first points on each curve should be grouped together in an organized fashion.  We can do this with a transpose node.  It will take the output from a row and swap it with a column.  So rather than four lists of x number of points, now we’ll have x number of lists, each containing four points.  This is just what we need to place our bracing family.

Use search to locate the List.Transpose node and add it to the graph.  Connect the output of the DividedPath.Points node to the input “lists” port of the List.Transpose node and click run.  Compare the lists generated.


Now we are ready to connect our resulting points list, transposed from the original curve list, into our adaptive point placement.  Click on the Transpose.List output port and click on the points input port of the AdaptiveComponent.ByPoints node.


If you toggled on the “Run Automatically, you should have the results by now.  Do they look like this image?


Congratulations!  You are now a “Visual Programmer”!  Return here for the next post as we connect our material and radius size parameters to our brace family and control them with Dynamo too!

Grab a copy of the graph here


Dynamo Barrel Vault Brace 05

Dynamo Barrel Vault Brace 05

We’ve built all the necessary components, an adaptive component profile family, an adaptive component brace family with four adaptive placement points, and an adaptive family containing the profile curves that run along the inside edges of the barrel vault trusses that hold up the roof of our project file. It’s time to begin building the Dynamo graph that will give us a flexible solution to place the brace along the curves.

I hope you’ve been following along and creating your families along the way. If not, then take some time to work through the previous posts linked below:

  1. Dynamo Barrel Vault Brace 01
  2. Dynamo Barrel Vault Brace 02
  3. Dynamo Barrel Vault Brace 03
  4. Dynamo Barrel Vault Brace 04

The placement family we built in the last post is available directly at the link below:

Adaptive Component Placement

By the way, this solution was built in Revit 2015 using Dynamo 07.5. You can use one of the newer daily builds if you want, but the screen captures will look slightly different. Before we launch dynamo let’s load the parts we need:

  • open the adaptive component placement family and click the insert Ribbon tab.
  • Click the load family tool and load the 4 point AC Brace family created in post 3 and 4 of this series.

Load Family

With that prep work done, we are ready for spaghetti…sorry couldn’t resist.  Let’s get started with Dynamo.  Let’s launch Dynamo. You’ll find the Dynamo launcher on the Addins tab.


Before we connect our first nodes let’s get familiar with the Dynamo interface. First up is the welcome or startup screen


You can use the File menu area at the top or the Files area on the welcome screen labeled in blue above. Directly below the I/O area is the recent files area, which presents a quick way to click back into your latest graph. When you’re ready to learn more, you can visit the source links to view example files by either clicking the link directly or clicking the “Show Samples in Folder” link to browse using windows file manager. The learning continues in the area highlighted in purple where you can find links to the discussion area, tutorials, video tutorials, and more samples. Lastly, the Code area has links to the source code for Dynamo itself, as well as a link to submit bugs.

  • Click New

When the Dynamo editor is displayed look around the interface as we learn how it works.


Across the top of the editor screen, you’ll find the menu bar. In the menu bar as in most applications, you’ll find following menu items: File, Edit, View, Packages, Settings, Help.

  • File Menu – This pulldown contains the standard input and output tools like New, Open, Save and Saveas. There is also an option to import a Library, Export your workspace as an image, Export dynamo geometry as an STL file, a recent files list, and an option to exit the program.


  • Edit Menu – , an edit pull down containing the expected undo, redo, and copy/paste tools, You can create notes to accompany your graph nodes, an option to bundle up a selection of nodes into a custom Node, Select all, delete, Align Selection to organize your nodes horizontally and vertically, and an automatic option to cleanup the node layout (might result in criss crossed lines)


  • View Menu – this area contains navigation tools for zooming, panning, options to change the node connector types and visibility, as well as visibility options for Revit geometry and dynamo geometry toggles.


  • Packages Menu – this pulldown allows you to search for packages others users have uploaded, manage the packages and versions you’ve downloaded, and publish your own creations in the form of nodes, packages, and workspaces.


  • The Settings Menu – contains feedback settings for the Dynamo team to assist them in improving this great tool, precision settings for length, area, volume, and numeric input and display as well as Rendering precision. Click the about option under help to see the type of data and identification that is sent back to the Dynamo team.


  • The Help Menu – This contains links to the wiki, project website, the source folder for the examples, the start page, bug reporting, and links that open the learning samples directly


  • Directly below the menu bar is a Quick Access Options Area containing new, open, save, undo, and redo options on the left and an update notification cloud and snapshot tool on the right. Notice the green cloud indicating an available update to Dynamo is now available, you can click the cloud to install the update.


  • Along the left side of the screen below the menu bar and Quick Access Options area is a search tool and the list of node categories or packages that are installed.


  • At the bottom left of the Dynamo window, you’ll find the application Run options, allowing you to Run Dynamo automatically as connections and nodes are added if you choose. A manual Run option is available as well.


  • At the bottom right of the graph window, you’ll find toggles to switch between adjusting the display of the nodes and/or 3D geometry inside Dynamo. You can also use CTRL+G to switch back and forth


  • In the upper right corner of the Dynamo graph window are a few final tools. The triple row icon below the camera icon, allows you to switch between the graphs currently open in the editor. Directly below that are three zoom controls: zoom centered (fit to screen), zoom in, zoom out. The zoom centered option will perform a zoom extents if no nodes are selected, if a node is pre-selected, that node will be centered and a slight zoom will be performed. Below the zoom tools is the pan tool.


  • The final menu/interface element is the right click menu which changes based on your context and if an object is selected. When no nodes are selected, the right click menu offers options to Align nodes, create new nodes, toggle the geometry/node visibility, pan and fit to screen.


  • When a system or built in node is selected the right click options include Delete, preview, preview upstream, show labels (never seen this enabled), rename node, and a help function that will display the node type, description, category, inputs and outputs available for that node.


  • When a custom node is selected an additional group of right click options are displayed allowing you enter the custom node, change the node properties, or publish the custom node. If you continue right clicking on the nested nodes, you can get to the Python script editor where the real power is!


That’s it for this post, in the next installment, we’ll create our script and run it through its paces.

Dynamo Barrel Vault Brace 04

Today, we’ll make one more adaptive component family.  We’ll do this one by opening the central model and isolating the Barrel Vault Trusses…actually, we’ll isolate two of them since they are identical throughout the length of the space and our aim is to use dynamo to generate the braces used to stiffen the roof truss system.

If you are just joining this series, take a moment to view the previous 3 posts:

If you didn’t do the homework from the last session, you can download the family created here:

4 Point AC Brace

Create the AC Family for Brace Placement:

  • Open the Central model and activate a 3D isometric view
  • Use the temporary isolate to isolate two  of the barrell vault trusses adjacent to each other


  • Export the geometry to DWG format


  • Keep the temporary mode active during the export


The above steps are useful to reuse Revit geometry from a project context when you intend to model a component in the family editor.  I’ve done the export for you, you’ll find the 3D cad file at this link.

3D CAD Truss

  • New Family – Generic Model Adaptive


  • Click the insert ribbon and choose import cad formats dwg and locate the halltec_main_truss drawing that you just downloaded.


  • Bring it in using Origin to Origin
  • Toggle off the “Do Not Select Pinned Objects” control


  • Select the Cad import and move it to the origin of the family.
  • Choose the snap point as the inside face of the truss and align with the Center Front/Back reference plane in your family.


  • Pin the dwg file
  • Click the Center Front/Back reference plane, hold the CTRL key down while you drag a copy to align with the other inside face of the adjacent truss in a top down or plan view.


  • Reselect the Center Front/Back Ref Plane to activate it as a work plane

Activate WorkPlane

  • Switch to the front elevation view
  • Add Reference planes as snap intersections for the splines you will draw


  • Click the Spline through points tool and draw a 3 pt spline using the intersection and midpoint snaps along the top chord of the truss while the Center Front/Back reference plane is the active workplane


  • Repeat the sketch process for the bottom chord while the Center Front/Back reference plane is the active work plane.


  • Switch to the 3D view and window select the two splines and associated points.
  • Use the filter tool to eliminate any other elements you might select using the window method.


  • Once the splines and points are selected, copy them using the end points of the ref planes in a top down 3D view.
  • Your family should look similar to the image below.

chords complete

  • Open your 4 Point AC Brace family and load it into this placement family.
  • Save your family as Adaptive Component Placement.rfa


We’re finally ready for Dynamo. That’s all for this post. See you next time as we begin to create the Dynamo graph.

Dynamo Barrel Vault Brace 03

Dynamo Barrel Vault Brace 03

Welcome back, today’s post will complete the Barrel Vault Brace family.  If you’re just finding this post today, look at the previous posts to start at the beginning. If you’ve been following along and doing your homework, you should be ready to begin. The best way to learn is to do the work yourself, but if you ran into problems or just haven’t had the time, you can download the catchup file here.

Now that we’ve created the top and bottom chords, its time to add the diagonal bracing members. You did flex the family right? It’s important at each step, to be sure the pipe radius behaves and moves with the adaptive points. If you haven’t flexed it, please do. Did your pipes remain consistent from end to end? If you got a bulge anywhere in the pipe, you must not have constrained the profile shape to the ends. If your family is good, then its time to work on the diagonal bracing. Let’s make it easy on ourselves, select the two diagonal reference lines and isolate them temporarily.

IsolateLet’s get started!

  • Click the component tool and use the type selector to set the family and type to Circle_Profile_AC:BraceRadius
  • Hover over the adaptive point at the bottom left of the brace, tab until the end point option is selected and the working plane is perpendicular to diagonal reference line.


  • Place the BraceRadius and while still selected, Add a family type parameter labeled BraceRadius and associate it to the BraceRadius radius parameter.


Repeat this process at the other end of the diagonal reference line.

  • Change the value of the BraceRadius parameter in each type and flex it. Do the profile family circles get larger? Good.

endptandorientation FlexDiag

  • Create the form element by selecting the reference line and the two profile family insertions. Click Create form.
  • Now flex the resulting geometry. Does the brace form element behave? Good, add the remaining diagonal elements by repeating steps 3 ,4, & 5. Flex the family. Do both diagonal elements flex properly?
  • Click your temporary visibility tool (sunglasses) and Reset temporary hide/isolate visibility. Select each of your adaptive points and move them using the ucs gizmo. Do the form elements follow and flex properly?


  • Add a material property and assign it to diagonal brace form element.
  • Repeat this process for the other diagonal vector.
  • Flex your family again and ensure it behaves. Did you add different materials to your test types?


Does your family look like the above image?  We’re almost ready for Dynamo.  See you next post, when we’ll create our insertion adaptive family and begin working in Dynamo.

Dynamo Barrel Vault Brace 02

Dynamo Barrel Vault Brace 02

In the previous post, we created our flexible AC profile family.  Today we will begin creating the brace family.  We will use the previous family in our work today, so if you didn’t create the family yet, go ahead and do it or just download mine.  Ready now? Let’s go.

Second Family: a GMA Bracing family with a nested GMA family containing a constrained adaptive point, a model line circle, and two types and an instance based radius parameter. Today we’ll create the constraints, subcategories, materials, and top and bottom chord. Don’t forget to save your family.

  • New Family – Generic Model Adaptive
  • Click Manage – > Object Styles and add two subcategories Generic Model in the family as shown below:
    • Horizontal Chord
    • Diagonal Brace


  • Click OK to close the Object Styles Dialog box
  • In the drawing window, Select the Center (Front/Back) plane to activate the work plane
  • Click the reference point tool
  • Place 4 reference points on working plane two at ref level and two above ref level as shown in the image below


  • Window select all four points and make them adaptive placement points as shown below


  • Move them off the reference plane to get Revit to automatically connect to the AC point when drawing ref lines in the next step
  • Draw 4 reference lines two horizontally with end points on each adaptive point and two diagonally connecting each adaptive point. The shape should resemble an x with a top and bottom horizontal member but no vertical members. If you have issues getting the node to highlight, use the tab key and watch your status bar and the tool tip to make sure you are pre-selecting the correct element.


  • Flex the adaptive points to make sure the reference lines remain connected as shown in the image below. They should with no problems, it’s why I chose reference lines.

Flexing Points

  • Load the Circle_Profile_AC.rfa family into the bracing family.
  • Click the Component tool and hover over the lower left adaptive point and watch the circle orient itself to the ref level, click tab until the vertical plane of the adaptive point highlights and the circle orients to vertical with the circle oriented to become a loft or extrusion along the length of the bottom horizontal model line.


  • While the family is selected, use the type selector to ensure its type name is set to PipeRadius
  • Repeat this process at the opposite end of the same line and at both ends of the upper ref line as shown in the image below.

Horizontal Profiles Added

  • Add a Length parameter and label it PipeRadius, set its value to 4′-3”. Select the Circle_Profile_AC:PipeRadius type or filter and select your inserted profile shapes as shown in the image below


  • Associate the radius parameter to your new PipeRadius parameter.


  • Note: if you don’t see the Radius Dimension in the properties palette when the family is selected, its because the parameter in that nested family is a type. Open and change it to an instance based parameter. Hint: select the dimension and toggle instance on the options bar as shown in the image below.

instance property

  • Now reload into your brace family and choose the bottom option to update the parameters. Select the profile families as before and look at the properties palette. Can you associate now?
  • Flex your PipeRadius parameter – do the circles adjust accordingly? Good, well done.


  • Tab select the reference line connecting the two profile circles at the bottom. Tab again if all the ref lines highlight until just the bottom horizontal line is selected, hold the control key down and tab select the Circle_Profile_AC families at each end of the reference line.


  • With all three objects selected, choose “Create Form” from the ribbon to generate the pipe shape along the bottom of the bracing family.


  • Select the form as shown above and set the subcategory to “Horizontal Chord” in the properties palette.


  • While you have the form selected, why not associate a material parameter to the material property for the form element you just created?
  • Create two temporary types in your bracing family with different values for PipeRadius. Set each active to flex your new form element, does the form element flex properly? Does the pipe flex consistently along the length of the form? If you got a bulge in your form, then you probably didn’t get the profile associated with the plane of the adaptive point correctly. Fix it and flex again. Also select your adaptive points at each corner and move them using the UCS gizmo. Does your new form element adjust with them? If not, go back through the above steps until your family is behaving.
  • Repeat steps 9-21 to create the top pipe for the bracing family and flex it. This assumes that the bottom and top chords of the brace will have the same radius. If not, you can duplicate the Circle_Profile_AC type to size the bottom and top chords differently. You’ll need to add an additional set parameter node to the dynamo graph if you choose to do this.

I think that is enough for this post.  Save your family and come back next time to complete the diagonal bracing forms and get started with Dynamo.

Dynamo Barrel Vault Brace 01

Over the next few posts, I’ll build some families, a dynamo graph and use it to dynamically adjust the number of braces as well as the radius of each member type used in the example image shown below.  The original problem was presented as a request for a bracing family that could be rotated in 3D space.  I saw this as an opportunity to dive once again in to Dynamo.  In the image below, you see the finished brace family as inserted by dynamo.

AC Brace Dynamo

In order to complete this example, we will need a few generic model adaptive families (3) and a dynamo graph.  Todays post will focus on creating the first family that we will use to control the radius of the form elements within the brace family.

First Family: a GMA family with a hosted constrained adaptive point, a model line circle, and two types and a parameter

We will create a circle profile that will allow us to set a continuous length radius for our bracing tubes.

  • Create a New Family – Use this template: Generic Model Adaptive
  • Add a reference point


  • Click to activate the Ref Level work plane
  • Add a model line using the circle draw option
  • Click on the circle and convert the radius dimension to a parameter labeled “Radius”


  • Add two types with different radius values
    • PipeRadius
    • BraceRadius
  • Save the family as Circle_Profile_AC.rfa

Next time, we’ll use this profile family to set the shape and size for our brace members.