Sunday, 24 September 2017

Weird Railing Stuff - part 7 - Support Spacing

It amazes me that very few Reviteers make use of the 'Railing Support' capability that we have had in the software for over 5 years now.  In fact, a very large percentage of users don't even know they exist
Here are some possible reasons why that is the case:
  • If you upgrade a project with the old style railings in it, they are not converted to the new style railings, so you cannot use railing supports in them.  To achieve this, you have to copy a new railing type into your project, then swap the old family type to a new one to get access to the support functionality.
  • The metric project templates provided by Autodesk do not include any railings that use handrail supports (this includes the Australian and UK templates);  they do have some support families - but if you don't know how to use them, you'll never figure it out by playing around with the railing samples.
  • The sample files that you can download from the Autodesk Knowledge website include only the old method of using balusters to look like handrail supports - and that is the imperial unit sample file, which you would expect to be the most likely one to be updated when the software was changed (The metric version would have no chance, even if you could find it on the Autodesk labyrinth-site).  I wonder if anyone at Autodesk knows what QA means?  'Quality Assurance' is the correct answer, not 'Quick As (get this out the door)'.
  • The settings for adding supports are buried deep as type properties of a nested family.  The chances of finding this are slim - although that has improved recently with the ability to get to a handrail family properties directly from the railing type properties dialog box with one mouse click.
  • The methodology for setting up handrail supports is mind-bogglingly complicated and counter-intuitive - and it is all type-based properties hidden inside handrail families nested into the railing family.
  • Even when you have set up the supports in a handrail family, you have to remember to choose left or right (for the handrail) in the railing family, otherwise nothing shows up.

Handrail Support Spacing

Once you have figured out how to set up Handrail Supports in a railing,you will obviously want to control the spacing - first the initial spacing, and then changing the spacing.  There are at least two weird things you need to know about this - the first is how illogical and inconsistent the spacing properties are.  The second weird thing relates to moving the supports - to be dealt with later:

Spacing Properties

Do you think it is weird that baluster spacing and handrail/top rail extension length properties are measured in plan distance regardless of the slope of the railings, while support spacing is measured along the actual length of the handrail whether it is horizontal, sloping, vertical or going round a twirly flourish at the end?  Whichever one is correct, it is weirdly inconsistent.

How would you measure the support distances on this handrail?
In the Handrail type properties, you have the typical Revit options (plus a special one):
  • None
  • Fixed Distance
  • Align With Posts
  • Fixed Number
  • Maximum Spacing
  • Minimum Spacing
Unfortunately these are not consistent with each other, and none of them will give you the outcome that you desire (unless by a fluke the spacing just happens to work for your stair):

1.  'Fixed Number' does not put supports at the ends of the railing;  the spacing varies depending on the overall railing length, and the number that you put in - NB. the number is a type property of the handrail, which means that you most likely need a unique handrail type and a unique railing type for every single instance of the railing.
It seems that the supports always use centre justification for this - it is greyed out and you can't change it;  also, the greyed out value for spacing is just a remembered value from the previous settings, and is misleading here.  Revit does not report back to you what the actual support spacing is on each handrail instance.

If you have a free end handrail, you would typically want a support close to the end (but not exactly at the end).  You don't get a support anywhere near the end, unless you put in a ridiculous number of supports, like 50 in this example.
Fixed number does not put supports at the ends
If you have an extension to wall or floor, then this option makes sense, however, the spacing includes the length of the extension, measured along the handrail, including vertical length for a floor extension.  The example below, with a wall extension is the one and only situation where Revit gets the support locations close to what you might need, albeit that you need a separate type for each different number of supports.

2.  'Fixed Distance' only puts a support at the start or end of the handrail if the justification is set to Beginning or End;  the distance at the other end is pot-luck depending on the overall handrail length.  If the justification is 'Center', then the distance from the start and end again depends totally on the overall length of the handrail - so it is luck of the draw, but it will be the same at each end.
The calculated distance includes extensions.

 3.  'Maximum Spacing' always puts a support exactly at the start and end of the handrail; justification is not an option here - it is greyed out (and set to center).  Just imagine sending this drawing to a builder or fabricator - you'd be laughed off the site.

Revit does not take into account whether an extension with a wall or floor fixing is chosen - it still puts a support in place at the very end, just where it is fixed to the wall/floor.

4.  'Minimum Spacing' behaves just like the Maximum Spacing settings, although the actual spacing will be different.

5.  'Align with Posts' is an interesting option - I don't get why you would use it, unless your posts are non-supporting in themselves.  If you do use it, you have no option for supports between the posts, so what good is that?  I would have thought the option should be 'Align with Posts & Maximum Spacing Between' and suchlike.  Or 'Maximum Spacing Except at Posts' etc.

With all of these options, you have the opportunity to unpin a support and move or delete it; but you cannot add additional supports.  However, once you have done this, it takes just one innocent (or stupid) click on the 'Reset Railings' button to lose all that hard-won support over-ride spacing.

The Solution

What we really need to solve some of these issues is to have consistency in how the spacing is applied (at ends); and the ability to set start and end indent properties for handrail support spacing.  These would operate rather like the equivalent properties on a 'Divided Path', although I guess they'd need to be type properties to be consistent with all the other handrail properties (Oh, how I wish most of those were instance properties in the actual railing)

If you think this is a good idea, please go to the official Revit Ideas website and vote up my idea on this.

Wednesday, 20 September 2017

Revit's Most Hidden Commands (part 5) - Selection Locks

The title of this post is somewhat ironic - because the command in question is right there on screen, all the time in Revit.  However, it is remarkable how many Revit users never see it and don't know what it does.

I'm talking about the Selection Locks at the bottom right of the screen, in particular the one called "Drag Elements on Selection". 

It used to be called 'Press + Drag'.  I didn't like it then, and I don't like it now.

In the words of Captain BIMCad, it is the "Little Button of Evil".  I am glad that someone else considers this little icon to be the bane of Revit Users lives.

It is astonishing how many Revit users do not have this set correctly - unfortunately the default out of the box Revit setting is wrong.    Just Plain Wrong!   Downright Evil!

The correct setting is for the little evil icon to have a red cross on it so that users cannot select and move an element with one mouse movement - something that is all too easy when trying to make a multiple selection by dragging the mouse.  When  "Drag Elements on Selection" is disabled, the user would have to select an element, let go of the mouse button then click and move again - that is a more definite action that is unlikely to be done by mistake.

To solve this once and for all, you need to have a BIM manager that sets this properly in your Revit.ini file, and an IT team who understand how to roll out Revit.ini files to all users (that is a challenge in itself).  The fall back position is to manually check (and change) the setting on every computer in your office, for every user profile, including whenever a new person joins the company.

The other selection locks are extremely useful, but cause endless confusion because most users just don't see what is right in front of them.  The same settings are also available from a drop-down menu below the selection icon at the far left of the ribbon.

It is really important that everyone makes the best use of these, so that you can avoid accidentally selecting things like underlays, linked files and pinned elements.  Obviously you just disengage the locks when you do need to select any of those elements.  and remember to re-engage the locks afterwards.  But never, ever disengage the 'Drag Elements on Selection' lock - it should always have a red cross on the evil icon, and not be ticked/checked in the drop-down menu list.

Wednesday, 23 August 2017

Scheduling Global Parameters in Revit

Revit is all about data and displaying or extracting that data.  So, you'd think that when a new Revit feature  is added, like Global Parameters, you should be able to schedule them?
Wrong!  You cannot directly schedule or tag Global Parameters in Revit.

However, I have devised a workaround (NB. this won't work on Revit 2016 R2):

Example 1 - Reporting Dimensions

In this example there are several sloping ceilings.  Each ceiling has a built-in property 'Height Offset From Level', which represents the height of the base of the ceiling slope.  This can easily be scheduled.  It is not so easy to schedule the height of the top of the ceiling slope - unless you use global parameters:

Step 1 - Reporting Dimensions

  • In a section view, add a dimension from the level to the top end of the sloping ceiling
  • Associate this to a global parameter
  • Make it a reporting parameter

  • Repeat this step for each sloping ceiling

Step 2 - Project Parameters

  •  Create a new instance project parameter called 'Ceiling Top Height'
    • Make it a length type
    • Apply it to the ceiling category
    • Give it a meaningful tooltip
  •  Each ceiling will now have that property, albeit blank


Step 3 - Associating Global parameters

The Project parameter properties of individual ceiling elements then need to be associated to the relevant global parameters (reporting dimensions):


  • This obviously means that one global parameter is required for each ceiling, which could become tedious for many elements - but this a workaround, after all.

Step 4 - Create the Schedule

A schedule can be created to display this information:
  • A ceiling schedule could be created, showing the built-in height parameters and the project parameter with associated global parameter

Example 2 - Area Calculations and WC Numbers

Step 1 - Global Parameters

Create your global parameters, with formulas as required.  In this example, global parameters are being used to calculate the number of toilets required for a community hall, where the statutory regulations require a certain number depending on the floor area of the hall:

  • There are two reporting parameter dimensions for room width and length.  
  • These are used to calculate a room area - this is an extra step to be taken because even though Revit gives us room areas automatically, we are not able to associate areas as reporting parameters, so we can't use the system Area property (except as a check on the calculation)
  • There is a user defined "Area per WC" - which is set as 1 WC required per every 30 square metres of the hall area.  This value can be changed later.
  • To establish the number of required WCs, a simple calculation is done:
    Hall Area / Area per WC
    This is an integer parameter so it always gives a whole number;  however, you could make the formula a bit more complicated so it always rounds up to the next integer
  • There is another check formula that sets the minimum number of WCs to be 2 - this is partly because arrays will only accept 2 as a minimum.  There is an 'array workaround' if the minimum really needs to be 1, but that is not shown here.

Step 2 - Project Parameters

The trick for being able to schedule and tag global parameters is again to use an intermediary - namely Project Parameters:
  • As many project parameters are created as you need for scheduling/tagging global parameters
  • They are defined for the categories to be scheduled - in this example it will be for both rooms and generic categories
  • 'Area Calculated' is added to the room category so that it can be scheduled and tagged
  • It must be a shared parameter for tagging;  if you want to apply it to just one category and only schedule (not tag), you might get away with it not being shared;  for multiple category schedules it needs to be a shared parameter.

  •  'WC Numbers' is an integer parameter added to both the room and generic categories - for rooms it is just for schedules/tags;  for generic categories it is being used to drive the model - number of WCs in the array

Step 3 - Associating Global parameters

The Project parameter properties of individual elements then need to be associated to the relevant global parameters:
  • The room element for the hall has its 'Area Calculated' property associated to the 'AreaCalc' global parameter
  • Its 'WC Numbers' property is associated to the 'WCNumCalc' global parameter

  • The WC cubicle component has a family property for the 'Number of WC Cubicles', which is used to control the number in the array.  This is associated to the 'WCNumCalc' global parameter - so that when the hall area changes, the global parameters recalculate the number of WCs and push that change into the cubicle array component..
  • NB. It is not possible to associate a global parameter directly to an array number in the project environment, so the array has to be built into the family - another workaround.

Step 4 - Create the Schedule

Schedules can be created in a number of ways to display this information:
  • A room schedule could be created, which shows the contents of the room

  • A better way to achieve this is to create a multi-category schedule that includes one element in the required room (Hall) and also the WC cubicles in the other rooms
  • Room properties can then be added for each element - in particular the project parameters for the hall room
  • The one element in the room 'Hall' needs to be listed in order to display the associated global parameter values of the room (Calculated Area & Required WC numbers), even if we don't want to schedule that element itself. This is because a Revit multi-category schedule cannot contain rooms as one of the categories - only the room properties of other category elements.
  • In this example, the schedule needs to be filtered to restrict it to just show generic category elements (WCs) plus the category of the element in the hall (a door in this case, but it could be anything); and then further filtered to get only the relevant ones listing

  • The fields from Rooms and Count, can be renamed to indicate required and supplied WC numbers


These are only two specific examples of how global parameter data can be scheduled and displayed.  Of course it is unlikely to suit your exact requirements but it should demonstrate the principles to be applied to different situations.

Monday, 19 June 2017

Global Parameter Enhancements in Revit 2018

I recently did a presentation on ‘Global Parameters’ at BILT ANZ 2017 in Adelaide.  I listed the two updates in Revit 2018 related to Global Parameters – one a bug fix, and the other being support for radius and diameter dimensions.  At the time I suggested that this was not a particularly interesting enhancement, and that I could not think of any particular uses for it.  However, in discussions with Frank Crisp of KTA (in Sydney), he came up with a brilliant idea for how to take advantage of this feature – so I have tested the idea and made a working example as follows.

Curved Curtain Walls

Everyone knows that Revit cannot do curved curtain walls – or at least the walls can be curved but the panels are flat, so that you get segmented curtain walls. 

In some situations this can be appropriate, but if you have enough budget for this, it may be desirable for the panels to curve too.  Some years back I created a curved curtain panel family but it was very clunky to use, and you had to manually match the radii of the wall and the panels.  Frank and I have now worked out a method to use global parameters to keep the radii in sync so that you don’t need to change the panel radius if the wall radius changes.  I have also improved my curtain panel family to make it much simpler to set up and to modify, as well as putting in some check formulas.

The Panel Family

My original curved curtain panel family had a series of reference line arcs in plan, running between the sides of the panel – one each for centreline, front and back of glass (and for any transoms).  These were used to define the outlines of vertical extrusions.  This was quite fiddly to set up and I have since learnt that it is much better to use sweeps for defining such geometry – this means that it is only necessary to draw one curved reference line to be used for the sweep path in plan.  All the sketch (or profile) geometry is drawn at the midpoint of the arc in a left or right view.  This means that an additional reference plane needs to be placed in plan at the furthest offset from the baseline or chord of the arc – this is used to host the profile sketches and it moves relative to the chord baseline depending on the radius of the arc and the length of the chord.
A formula is required to calculate this offset from the chord baseline – this dimension for the height of an arc above the chord is called a ‘Sagitta’.  Using Pythagoras’ Theorem it can be easily calculated from the chord length and the arc radius.  The radius is defined as the hypotenuse of the triangle (long side) while half the chord length forms one of the short sides (B).  The other short side (A) is calculated:
A = Square root of (C squared – B squared)
In Revit this formula is written as
A = SQRT(C ^ 2 – B ^ 2) 

The arc height (Sagitta) is simply the Radius (C) minus the short triangle side (A), so the overall formula is:
Sagitta = C - SQRT(C ^ 2 – B ^ 2)
B = Chord / 2
C = Radius

A few check formulas need to be put in as Revit does not like to calculate square roots of minus numbers, nor to have the radius equal or less than half the chord length.
The Radius parameter can be changed to ‘Radius desired’, which is the input value;  A new parameter ‘Radius actual’ checks the input value for anything less than or equal to half the chord length:
Radius actual = If(Radius desired > Chord/2, make it the Radius desired value, otherwise make it
the value ‘Chord/2 +1mm’).

In the Project

This curtain panel family can be loaded into a project and used in a curved curtain wall.  Initially the radius of the panels have to be manually set to match the radius of the wall.

If the wall radius is changed, the panel radii will be wrong

A curved wall does not automatically have a system property for Radius, so you need to add a dimension.

This dimension can then be associated to a global parameter but it must be a ‘reporting‘ parameter, so that all it is doing is getting the radius information from the wall element and pushing it back into the parameter for use elsewhere.

The curved curtain panel family can then have its radius matched to the curtain wall.  The ‘Radius desired’ property of each panel needs to be associated to the reporting parameter Radius of the wall.   

Alternatively, you can create a new global parameter that will represent the curtain wall radius if you need any calculations based on the reporting parameter.

Type vs instance

Depending on how you want to use the panels, the ‘Radius desired’ property could be either instance or type.  If you want to define the curved curtain panel as the default panel for this particular curtain wall type, then it must also be a type property.
If the curved curtain panel family Radius property is a type property, then you would need a panel type for each particular curtain wall otherwise it may break.  As a type property you only need to set it once regardless of how many panels you have in the curtain wall.

If the curved curtain panel family Radius property is an instance property, then you only need one panel type.  However, you need to associate the radius to the global parameter for each panel, which means extra work whenever the number of panels changes.

Warning: if you delete a radius dimension with an associated global parameter, it does not ask you if you want to remove the constraint.  This means you could end up with hidden constraints.