A colleague of mine in the structural team approached me with a problem he’s been having in Revit and explained his workflow. Currently the analytical nodes found in elements such as beams, braces and columns produce little data and information readily available for scheduling or extraction from Revit. This means that information is usually taken from other software packages, and then has to be manually entered into Revit for drawings and tagging. It was at this point I thought this process could be improved through the power of Dynamo.

So I decided to test the theory out on a sample project…

1

Within this project there are over 5000 structural framing members so this will provide a good test run. The first step is to create the parameters in the Revit project that you will need for the analytical nodes. The only schedulable parameters available for analytical nodes are Connection Status, Node Number, Comments and Count. The value in the parameter Node Number defaults to 0 for all nodes, so a manual process would need to take place to renumber and assign values to each node. Why do this as a manual process when the information is already within Revit, just buried amongst the API? We can use this parameter going forward, but we need to create parameters called X Position, Y Position, and Z Position. These are Number fields for the type of parameter.

2

Moving into Dynamo we can select all the analytical nodes in the project using the select category node. When we use this tool however it selects the hub and reference point of each analytical node separately. We can simply filter the outcome to list only the reference points as required. This can be done in many different ways, but I chose to extract points using the List.GetItemAtIndex with a simple number range fed in.

 

3

4

 

From each reference point we can then extract the information hidden with Revit. We first extract the information relating to the X, Y and Z position of each point along with the Revit Element ID. We then use the Element.SetParameterByName node referencing the project parameters we created earlier on and plug the values in accordingly.

5

6

 

Once we have this information readily available within Revit schedules we now need to create a link between these and the actual structural framing members. Firstly let’s create another couple of parameters for the structural framing families. We need Start Node Number and End Node Number as Integer parameters.

7

 

If we select all structural framing members in dynamo in a similar method to before we can then extract the location curve for these elements. Once we have the curve as an element within Dynamo we can query its start and end point. Then using a Lunchbox node (found on the Package Manager)  we can convert these points to strings.

8

9

 

If we take the Curve.StartPoints in this first instance, we just need to repeat the next few steps for the Curve.EndPoints at the end. We need to use these string values and compare them to the original reference points of the analytical nodes. To do this we also need to convert the reference points to strings in the same manner. Now we have two lists of strings to find the corresponding analytical node for each member family. As we want to compare each of the member strings to every instance of the analytical node strings we need to run the compare through the function of List.Map to produce an output of true and false statements with nested lists. This means it creates a nested list for each of the member strings, where it compares the value to every instance of the analytical node strings, returning a value of true or false dependant on whether they match. As a result in every nested list there is the same number of indexes as there is in the analytical nodes string entry. All of these values should return false except for one which will be the same.

10

 

Within our list we want to extract the index where the value has returned true for each nested list. To do this we use the List.Map node again but run it through the List.FilterByBooleanMask node. With the help of the map node, the count node gets the total length of each sub list. That number is reduced by one (because lists in Dynamo start from 0), and then fed into a number sequence to match the number indices. As we have already defined a conditional statement, we can reuse that conditional statement to filter only the list indices that match the predetermined condition. As a result this gives us the index of each nested list which returns true.

 

11

 

Once we have this list we can flatten completely as we now no longer need nested lists. If we use these values as the index to look up in the original list of analytical nodes we can extract the corresponding element ID. This ID becomes the value input for the Start Node Parameter in our structural framing families. If we repeat these last few steps for the Curve.EndPoint and End Node Number parameter we have a completed script.

 

12

 

14 

This methodology can be applied in many different ways I’m sure but this proved a very successful way of utilising data embedded within Revit and making it available for scheduling. The same principles could be used to insert information from other software packages in relation to forces and loads and applying this to either the analytical nodes or the framing members. In another example within our office we have used the defined curve in the framing members within dynamo to extract information about its radius in the case where it is created using an arc or to rationalise splines. Finally a special mention to Dimitar Venkov for his contribution to this workflow.

Mark Thorley is Assistant BIM Manager at AECOM Sports London. Coming from an architectural background he has extensive knowledge of Revit and BIM and has been implementing Dynamo within the office for over a year now. AECOM Sports are always trying to push the boundaries of parametric modelling and integrating Dynamo within the workflow is creating a smoother BIM process.

@MarkThorley1

https://www.linkedin.com/pub/mark-thorley/49/921/55a