Measuring ceiling heights

I recently have to measure the actual headroom of every room in an architectural model, and copy this value in a room parameter.

Instead of checking manually every room, I create a small Dynamo definition, based on the most underrated node in Dynamo, Raybounce.

The Raybounce.ByOriginDirection is basically a laser rangefinder for Dynamo. It works with an origin point and a direction, and give in return the first intersecting element, along with the point of intersection. It is pretty powerful, and its uses range from basic measurements to advanced Line Of Sight Analysis.


Using DynamoMEP, I retrieve every room in the model, and create a grid of points in each of them. These points are arbitrary spaced 50 cm apart, and serve as origin points for my Raybounce node.


Furthermore, in order to avoid that my laser beams hit the floor, I move my origin points 1 cm above the floor level.


The Raybounce.ByOriginDirection use these points, a Z vector as a direction and a 3D view. Since only elements visible in this view will be detected, I hide doors and stairs to remove interferences with these elements.


Along with the intersection point, the Raybounce.ByOriginDirection return the origin point that I filter out with a boolean mask.



I also make use of the List.Map node to perform any kind of operation (Flatten, Sort …) on the sublist containing the points while keeping them grouped by lists corresponding to the original rooms.


I finally calculate the headroom height, and retrieve the shortest one for each room. I pass this value to the Limit Offset parameter of the corresponding room.


Initially, every room’s Limit Offset is 2m.


After running the Dynamo script, every Limit Offset is updated to reflect the actual minimum headroom in each room. Since we have a sloped roof, the minimum headroom is not necessarily the ceiling, but can be the lower part of the roof.


Using the Raybounce node can be quite challenging, especially when it comes to sorting the resulting points, but it is totally worth the effort. You will find here the Dynamo definition, feel free to use it for your own project.

This was also the occasion for me to update DynamoMEP for Dynamo 1.0, and add a Grid function to create a nice array of point in a Room or a Space. As usual, you will find these updates in the Dynamo Package Manager.

Linked MEP systems

I am currently working on a large building complex, where multiple buildings share the same plumbing and HVAC systems. Every building is linked to a common mechanical room, pipes and ducts run between them.


To address some performance issue, I needed to split this complex into multiple Revit files, one per building, consequently dividing the systems into as many pieces.

But to perform flow and loss calculations, these systems need to be in the same file. More ever, MEP connectors from the linked project are not available in the host project.

However, there is a workaround to be able to display accurate results for calculations that require the entire system to work.

The picture below shows a simple hot tap water supply system, spanning across two files. The water heater is in the host file, and the four lavatories are modeled in a linked project. In this configuration, the system is split in two, and the flow is not properly set up between both files.


To be able to display the correct flow values on both sides of the system, I create a plumbing fixture placeholder to simulate the rest of the system that isn’t in the file. Autodesk already provides as a part of the standard Revit families four connectors for this kind of emergency. These families are face based, so I create my own, based on the original ones.

This placeholder is a simple plumbing fixture family, with a cylinder shape and a single connector. This connector is set up to be able to define manually every flow and loss values going through the connection.

Pipe Connector - Domestic Hot Water

This plumbing fixture family is placed at the end of the system, on the water heater side. It acts as if the rest of the system, here the four lavatories, were in the host model.

By typing in flow and static pressure values directly in the plumbing fixture placeholder, we end up with the correct values in the host model.


This little workaround allows us to keep accurate system calculation, even with systems split between files.

Use Navisworks Batch Utility to convert Revit files

A few days ago, I had to convert a large set of Revit files to NWC in order to create a general Navisworks File Set.

I used the Navisworks Batch Utility, accessible through the Navisworks main menu :


Batch Utility

You first have to select files to be included in your Navisworks File Set.

To quickly retrieve the list of Revit files to be converted, I’m using the Windows Command Prompt. I was quite afraid of this tool not so long ago, but it is actually pretty simple.

Windows Command Prompt

First, go to the root folder of your project:

cd C:\Projects\myRevitProject

and type :

dir /s /b *.rvt >ListRevitFiles.txt

This line requires a bit of an explanation:

  • dir : command for searching and displaying file in the current directory
  • /s : search in the current directory and all its subdirectories
  • /b (or bare) : remove for each file its metadata to display only the file path
  • *.rvt : search specifically for Revit files
  • >ListRevitFiles.txt : the ‘>’ character allows us to output the result of our research to a text file (here ListRevitFiles.txt) instead of displaying it.

We get the results of our research as text file listing paths to every Revit model contained in our project folder:


Back on the Navisworks Batch Utility, we open this text file to import file paths: File -> Open -> Select ListRevitFiles.txt

File List

As we want to create a single Navisworks File Set (.nwf), we select the “As Single File” Tab, and set the path to our future Navisworks File.

As Single File

I also select “View file on output” to automatically start Navisworks when conversions are done.

We add a path to a log file in order to know what may happen, and hit “Run Command”.

Here, I was confused by the fact that nothing seems to happen, but after checking my computer processes, I was able to see that the Navisworks Scene Convert Server was up and running.

Windows Processes

After a while, Navisworks starts automatically and appends every previously created .nwc file to a new Navisworks File Set.


I am also using this feature to create a NWD file for a set of Revit file.

To do so, you just have to select the “Multiple file” tab and define a target folder for the export.

As Multiple Files

The Navisworks Batch Utility will convert every Revit file to a NWC cache file, and made it a NWD on the run.


Beam Annotations

An article from Line Shape Space drive me to the Beam Annotation tools, and the various possibilities to automatically tag a set of beams.
The first idea when having to annotate a set of element is the Tag All function, quite efficient, but limited only to a tag by category. Furthermore, this function does not have the possibilities to add different tags on the same object.


To annotate efficiently a large set of beams, a specific tool exist, Beams Annotations. It functions pretty much like the Tag All command, but with more options.


You start by selecting the set of beams you want to annotate (All beam or only selected one), and if you want to include linked models elements.
Things become quite interesting with the other part of the windows, which display a schematic beam with six slots:


This second part allow us to describe where we want to place Structural Framing tags or Spot Elevation on our beam.

Here the possibilities are quite extensive. On every six position of each beam (start, middle, and end, on each side), you can select different options to place a Structural Framing Tag or an Spot Elevation to display top and/or bottom elevation for the beam:


To showcase this feature, I create a set of beam, distributed on the same plane:


In just a few click, I place a tag for every beam along with a nice Spot Elevation displaying the bottom elevation of the beam.


This tool become extremely powerful when dealing with slopped beams. To showcase this feature, I create a set of beams aligned along a complex surface. To create quickly this kind of beam system, I use Grasshopper with the Hummingbird plug-in. I describe the complete procedure in one of my older post.


These beams are displayed as a grid in a plan view:


I select the Beam Annotation tool, and add a Spot Elevation at the stating and the ending point of sloped beams, along with a Structural Framing Tag on the middle.


After running the command, Revit add a Structural Framing Tag and two Spot Elevation on every beams in my view:


These annotations place themselves nicely along the beam, and a few adjustments with the setting adjust them perfectly on the view:


The great mystery behind shared coordinates

To make thinks clear for myself and for some of my colleagues, I play with some models in order to understand how Revit coordinates works. Here is the result of my work.

Every Revit model contains two systems of coordinates, represented by two points:
– A Project Base Point (the circle): This is the real center of the current model.
Drawing something too far from this origin will display the following message:


– A Survey Point (the triangle): This is the position of our project in the real world (yes, you know, the one outside Revit …).
The angle between these two systems of coordinate is called “Angle to True North”.

There is three possibilities for automatically positioning a Revit linked model into another:

PositionningThe Center to Center option inserts the “center” of our linked model on the “center” of the host model. The center is not very well defined, and correspond more or less to the general geometric center of the elements drawn in the model. For example (the linked model is in blue):

CenterToCenterThe Origin to Origin option inserts the linked model with its Project Base point aligned with the one of the host model.

Origin to OriginAnd finally, the By Shared Coordinates inserts the linked model with the Survey Points overlapping.

BySharedCoordinatesThis particular insertion method is especially useful when dealing with multiple buildings on a site.
As an example, on this Site model, I have two implantations for two buildings (in magenta). My Survey Point is located on the origin point of the whole site.

SiteModelI create my first building, with the Project Base Point and the Survey Point basically at the center of the model.

Building1I insert roughly this building in my site model, and manually place it on its final location:

InsertBuilding1I can know share the coordinates of my site model to my first building.
This will change the position of the Survey Point in my Builnding1 model:

SurveyPointBuilding1If I repeat the whole process with my second building, the three models will share the same system of coordinates through their Survey Point. By selecting Auto – By Shared Coordinate on insertion, every model will be placed correctly regarding the others.

It is also possible to manually move the Project Origin Point or the Survey Point. In this case, the small clip button will determine which point is moving regarding the other:
In this case, the selected point will be moving:

PointMovingIf so, the rest of the model will be moving around the selected point:

RestMovingThe difference can be subtle, don’t hesitate to play with it in order to understand how it works.

Modelling skirting boards

One of my current project at work is to develop an application for the creation of a set of detailed drawings for each room of a building.

This set includes a plan view, a ceiling plan, an elevation view per wall and a schedule of furniture. These drawings must include all finishes details, like skirting boards, floor coverings, electrical equipment and so on.

So I came up with this idea for modeling details quickly and created a small application for drawing skirting boards in Revit.

My application uses a user-created wall type on a specific height to model a skirting board all around a previously selected room.


The development of this application was pretty straightforward, except when it came to placing correctly the skirting board baseline against the finish face of the main wall. Indeed, Revit API does not allow to set up a wall baseline before creating it. And changing it after the creating doesn’t move the wall, only the baseline.


My workaround was to create a larger wall, change its baseline, then change its wall type to the skirting board type, and finally, change back the wall baseline.


This method allows me to place the skirting board baseline along the finish face of the wall.

I also used this example to publish my first application on Autodesk Exchange App.
Following the guidelines for publishing allowed me to create a well packaged application, bundled with help file and installer. It is also the opportunity to distribute the application to a larger audience.

The whole publishing process is quite smooth, and the Audesk guys are very helpful.

The app is now available here for free, and I plan to publish the code on GitHub as well soon.

Justification planes for beam families

I am still baffled in front of some functionality in Revit families.

One of these is the possibility to create our own justification axis for positioning a beam.

As an example, I design a specific beam, using the “Metric Structural Framing – Beams and Braces” family template.

I draw a little extrusion, and constrain its length. I want have my beam centered on the red dot, so I set the central plane as Reference: Center (Elevation)

Then I load it into my project and I try different values for the z-direction justification:

As you can see, my beam isn’t centered on the plane set as Reference: Center (Elevation), but keep only its geometrical Top, Center and Bottom as references.

As a workaround, I found out that References Planes can overwrite these geometrical References, but only if they are place outside the geometry. So, I draw two reference planes, I set their References respectively as Top and Bottom, and I place then evenly around the Center Axis of my beam.

Then, I load it back in project, and test again the z-direction justification of my beam:

OK, it works!

I have also made a lot of trials and mistakes with the different possibilities of these Reference Planes, but I’m still unable to understand some of tricky parts of these functionalities.

And, just in case, if you have any clue where I can find some documentation, please let me know.