Advanced Scheduling: Check This Model

For the past few months I've been working on the Dutch Revit Standards. Currently the boring framework is all done (which, by the way, led to the IFC articles), so now it's time to get on with the good stuff: schedules! Oh, and some Adaptive Components, too.

Endless Capabilities

Something I haven't found in any of the templates, standards, libraries, or any other resource I've seen in the last few years is Rule-Based Model Checking. And I don't mean "why doesn't my foundation show up in a schedule?" kind of Model Checking. I mean the real deal. Does my design meet the Building Code standards for the amount of toilets? Does my bedroom have the legally required width and area? Is the egress width of this fire door big enough compared to the size of the fire compartment(s) adjacent to it? Those are all questions Revit can answer, if you know how to leverage schedules.


Okay, even with cool stuff like schedules there is some backend dullness you need to get through. Basically you need to set up some rules to which you can test the design. That's why Revit has Key Schedules.

Figure 1: Key schedule to identify the primary use of (part of) a building.

The first thing I did was analyze the Dutch building codes. It has a very simple setup for all regulations (from fire safety to the height of a stair thread).

  1. All regulations are performance based, which means there's a minimum/maximum set. This is great, because you can use those to validate your design.
  2. All regulations are differentiated to the primary use of a building (part), such as Residential, Office, Medical, and so on.
  3. Further differentiation depends on the primary use of a room: is it a bathroom, toilet, closet, or meant for people to reside in, and the amount of people a room is intended for.

So the next thing I did was set up Key Schedules defining all possible uses of a building (see Figure 1). However, this left me with a problem: you can create only one Key Schedule for a certain Category. But the Dutch Building Codes are based on TWO distinct features: the overall usage of a building and the use of a single room. A large portion of the regulation is based upon combining those two. At first I just added more Key Names such as Office Building, toilet, Office Building, hallway, Office Building, elevator shaft, and so on. Given the fact that we have 19 or so building usages, each containing 17 different room types, that soon became a giant mess. So I decided that for the DRS I was going to cut the Key Schedule in pieces.

This proved to be a little hard, since you can't do that—until I found this little trick over at AUGI.

  1. Create your basic Key Schedule and place it on a sheet.
  2. Select it, hit Ctrl+C to copy to clipboard.
  3. Close all views containing the Key Schedule.
  4. Go to another sheet and hit Ctrl+V to paste. You now have a copy of your Key Schedule which you can use to setup a new Schedule Key (see Figure 2).

Figure 2: Second Schedule Key for rooms: use of a single room.

There is a caveat, though. These are two separate Schedule Keys, with different GUIDs. So even if you name them alike, you're still going to have two Schedule Keys in your Room Properties. If you have a Schedule Key with lots and lots of Key Values assigned to it, you're just going to have to make do.

Step One: Does Your Design Match Your Program?

So for us, it's customary to start with a Design Program: what's the building for, what rooms do you need, and for how many occupants?

In the DRS this is covered by a schedule with a bunch of non-placed rooms (see Figure 3). This schedule contains parameters for the desired area of a room, the allowed deviation in percents, and the amount of people who are going to use it. When creating rooms in your model, instead of just clicking away in Plan View, look at the Options Bar, select the desired Room from the drop-down menu, and place it where it needs to be.

Figure 3: Building program schedule.

Placing these rooms fills up a second schedule (which doesn't show Not Placed Rooms by filtering for Areas > 0) that does one thing.

Check the Actual Area Against the Desired Area

This is a Yes/No Calculated Value, named CALC_meets program, with a formula that is actually quite straightforward:

and(Area < (Program Area + (Program Area * toegestane afwijking PvE)), Area > (Program Area - (Program Area * toegestane afwijking PvE)))

What this does is check whether that Actual Area is within the desired range. To add a text field telling you it’s OK or NOT OK, simply add another calculated value that says:

if(CALC_meets program, "OK", "NOT OK")

Figure 4: Checking program area against actual area.

Check the Occupancy Against the Building Code

The second schedule checks the desired occupancy (amount of people per room) against building code regulations. Figure 5 shows the regulations of a minimum amount of people per square meter of residing room space. For gathering functions, this is 0.125 person (or 8m2 per person).

To check this, we need a few things.

  1. Is the room a room meant for people to reside in? This is covered in the second Key Schedule, where yes/no parameters are added to specify the kind of room (see Figure 2).
  2. Room schedule with the following fields (except some “standard” properties such as name and number):

- IS_residing = defines which rooms are residing to base further calculations upon.

- Program_nr of people = amount of people defined in the Design Program schedule.

- BC_ppl per m2 = reads Key Schedule 1 for the amount of people per m2 based on the Building Function.

- BC_nr of people = Calculated Value that has the following formula: IF(IS_residential, roundup((Area / 1 m²) * BC_ppl per m2), 0)

This function determines whether the Building Code even applies, and if it does, which amount of people a room should be designed to handle.

- Program meets BC = Calculated value which checks whether the parameter Program_nr of people is not smaller then the parameter BC_nr of people, using the following formula: if(not(Program_nr of people < BC_nr of people), "OK", "NOT OK")

Figure 5: Checking occupancy against building code.

Step 2: Doing What Can’t Be Done

Another big deal in the Dutch Building Code is the size of certain rooms. A residential unit needs at least 18m2 of residing rooms, each being at least 1.8m wide and 5m2 in floor area. A toilet has to have a floor area of at least 0.9x1.2m, and so on.

Now I know this can be checked manually. And it can probably be checked by tapping into the API, too. But it’s not supposed to be doable in native Revit. Or is it?

Let’s just see about that…

To start with: it's good to know that there are several Revit Family Categories that are aware of the room or space in which they are placed. Air Terminals, Furniture (Systems), Specialty Equipment, and Plumbing Fixtures are some of them. Another thing to know about is a special kind of families: Adaptive Components. These families have the ability to flex upon placement in a project and can be used in several Family Categories, one of which is Furniture Systems.

Combining those two together you can create a family that can flex upon placement, adjust to changes in room sizes, AND knows which room it's placed in (and most importantly, this can be scheduled too!).

A "Simple" Family

I created a simple Adaptive Component quadrangle which can be placed as a rectangle, square, diamond-shaped form, and so on. Using a few shared reporting parameters which read the length of all sides and the length between the two parallel sides and some IF / AND functions it's possible to report the smallest width and length of this shape in a schedule using Calculated Values.

Then, you need another shared reporting parameter measuring the length of a diagonal (creating two triangles) and some basic math to calculate the area for any quadrangle shape with non-intersecting sides (which is cool since rooms usually don't have intersecting walls)—See Figure 6.

Figure 6: Finding smallest width and length and calculate area.

Now that we have the family reporting all the necessary stuff for size and area, it's time to create some rules. For this article, let's focus on one possible approach: A residential unit needs at least 18m2 of rooms for people to reside in, all being at least 1.8m wide and 5m2 in floor area.

Why Did We Want to Do This Again?

Can’t I just do this with a room schedule? Well, you can come a long way (Figure 7). However, you cannot check for room width using just a room schedule. In this particular example, this means the difference between getting a permit and just having to redo the entire layout.

Figure 7: Using a room schedule to check for building code compliance.

Checking Width

  1. Place the family in the project, in all the rooms you want to check.
  2. Create a Furniture Systems schedule with the following fields:

- Room: Name
- Room: IS_residential
- Shared Parameters A, B, C, D, E, F and G from the Furniture Systems Families (you can hide those later on)
- Calculated Values Width (Length) and Area (Area), using the formulas in Figure 6.
- Maybe add some calculated values to show whether or not this unit complies with the Building Code (see Figure 8).

Figure 8: Same check, but now compared to  using the Furniture Systems Family.


A few short examples in this article show the power of using schedules and helper families that have “special” capabilities.

If you want more examples, find the Dutch Revit Standards on the website. This resource has a lot of different model checks incorporated, is completely documented and open for anyone to download and use.

Oh, it is in Dutch, of course. I Google Translated it for this article, so you’d probably get past that, too!

Appears in these Categories