A common task that we are often asked to undertake is scheduling apartments for residential projects. In my opinion, the generally accepted method for modelling residential buildings is to use groups for each apartment layout.
Model group workflow
Model groups, which contain only the internal partitions, are placed into the main model, which includes all the party walls and structure. Depending on your preference, rooms can either be placed within the model group or outside of the model group. Since it is not necessary to schedule every single room within the apartment, the internal partition walls can be set to ‘non-room bounding’, and a single room is placed within the apartment.
The problem
The problem, therefore, arises in that there is no association between the model group and the room. Ideally, we want to keep these two in sync. For example, if I name the model group ‘1B-6.0’, I want the room’s occupancy parameter to update.
This dilemma is discussed in David Light’s post ‘Scheduling Apartments‘. Since Revit is unable to schedule groups, David proposes a solution whereby a hidden element within the group is tagged and scheduled. But the limitation with this method is that it is unable to extract the area of the room. To do this, we need to use a room schedule. To manually sync the room parameters to the apartment group parameters is a massively time-consuming process. However, luckily we can automate the process with Dynamo.
Dynamo automation
The ‘Room.RenameByModelGroup‘ node, which is part of the Parametric Monkey Dynamo package, solves this problem. To use this node, first ensure that all rooms have the correct volume by adjusting the limit offsets. If a room overlaps into another above, the script will be unable to determine which room the model group belongs to. The ‘Room.AdjustUpperLimit‘ node can help to adjust the room heights if required.
The node then extracts all model groups and filters them by ‘String.StartsWith’. So for example, if you enter “1B” it will return model groups called, “1B’, “1B-1.0”, “1B XYZ”, etc. The script then collects all rooms and the insertion points of the model groups to determine which model group resides in which room. The room’s ‘Name’ parameter is updated as per the node input. And the room’s ‘Occupancy’ parameter is updated as per the model group’s name.

If the insertion point of the model group is outside of the room, the node will not rename any elements, and a warning will appear. You can use the ‘problematicElements’ output to find the offending model groups so that their insertion point can be updated. Once this is done, rerun the script and all model groups will be updated.
4 Comments
Jan Usinger
I noticed that you are listing the balcony area as part of your room tag.
Is there a way for Dynamo to carry over this information or did you do this manually?
paulwintour
Hi Jan
Yes this was automated. There is a few ways you can do this. My preference is to renumber the balconies first so that they match the apartment (but have a ‘B” suffix). Then you can just collect all the rooms with Dynamo and pair them up. Get the balconies’ area and write to a shared parameter in the apartment room. You’ll need to create a new room tag obviously which reads the shared parameter. Note that this is not a live link but you’ll need to re-run it each time the design changes.
The other way you can do it, is to collect all the doors which go from the apartment to the balcony. Depending on how you’ve modelled the doors – doors, embedded curtain walls, etc – will affect the script slightly. But essentially, if the ‘to’ and ‘from’ parameters have been enabled in the families, you can work out the apartment/balcony pair. Take a look at the renumbering doors tutorial for some ideas.
Jan Usinger
Thank you very much for your reply, Paul.
I am a Dynamo newbie and I have been trying to implement the first option you have mentioned. However, I am not able to pair the two rooms (Apartment + Balcony) together to write the balcony Area into the APT.
Could you please post a dny file or even a tutorial on you blog how to achieve this?
Thank you very much.
Your second option seems even more powerful, if the doors could be used to rename the balconies (APT room name + “-B”) prior to pushing the balcony areas into the APT rooms.
paulwintour
Hi Jan
Many of the scripts I’ve developed I’ve published for free. However, for commercial reasons, I’m not able to do this for all of them. You may wish to consider our Dynamo Package Development service. It is designed for this very reason – to help companies setup a library of tools to be deployed across the office.
https://parametricmonkey.com/tools/dynamo-package-development/
Here is an image showing the script in action. In this scenario the external walls have been modelled using curtain walls. Because these don’t have ‘to’ and ‘from’ rooms like door elements, I’ve had to match up rooms geometrically.
https://www.dropbox.com/s/0j7e6iz744odywh/RenumberBalconies.JPG?dl=0
Let me know if you would like to discuss it further.