Vote for AU 2017 Class Proposals – Vote Now!

Looking for ways to automate your installations and customization within Revit or AutoCAD products? Wish you could control the project launch process?  Need to maintain Revit project versions without accidental upgrades?  Want to customize Revit deployments by studio, delivery group, or Office?  Wish you could ensure that all project team members were on the same build and or service pack?  Perhaps you just need to master Revit Roofs and would like to explore more than 35 different roof types and how to create them in Revit? I’ve submitted a few classes that will interest you. Vote Now, then attend in November!

  • AutoCAD Architecture Automation Anywhere!
  • Automating and Customizing Revit Deployments for the DIY Enthusiast
  • Revit Project Launch Scripting to Standardize All Studios
  • Conquer Revit Roofs Like a Ninja



I’m bringing some more standards tools to you today. A quick copy and adjust of the original text tools graph resulted in three tools for dimension styles. The first allows the user to select a dimension type and then selects all elements in the current project that use that style. The elements are selected in Revit, so the user can use the type selector to change the type.

3 tools image
3 tools in One Graph

The second tool reports all dimension types and writes them to the chosen excel file in a worksheet named dimensions after the category chosen.

Dimension report image
Reporting Dims to Excel

The third tool allows the user to choose a dimension type and change the elements selected by the “type” filter and change their family type to the desired type within Dynamo.

Here is a the complete screen capture of the 3 tool graph.

3 tools image 2
3 Dimension Tools for Dynamo

and a download BTC_DIM_STYLE_FIX



I received a request to assist an architect in fixing their model yesterday.  They were attempting to adjust a level elevation, but found other objects were also moving.  The request went something like this:

Level locked to alternate floors needs to be moved but others move with but are called out as different levels and are correct.

Based on the description above, I suspected there were multiple competing layers at the same elevation and objects were hosted on the wrong or undesired level. A quick check on a column confirmed my suspicions. As shown in the image below, there are multiple levels with similar names like “03 Level” and “Level 03”, “02 Level – 1004’” and “Level 02”.

Column Base Constraint
Too many levels with similar names

I reviewed the existing elevation and section views and couldn’t find the offending levels, so I created a quick new section to help solve that issue.

Section in Plan
Add a section and expand the visibility

Once the new section was created and activated, I uncropped the view and zoomed extents to find the missing elevation elements.

Levels discovered

The original problem statement indicated that elements were moving unexpectedly, so I flexed the Level Datums to get a visual indicator of the objects that might be bound together.

Level constraints
Elements move with Level

Since I can’t simply delete the levels I think I don’t need, for fear of losing elements hosted to the level, I must find a way to select or determine what elements belong to a level I might wish to delete.

Revit Elements Notification
Revit provides no warnings when a level is deleted

 Note: If you were unaware, Revit does not notify you when it deletes elements hosted to a level.


Let’s launch Dynamo and see if it can assist us.   For this functionality, I can create a quick dynamo graph and use it to identify whether a level has any host elements on it.

Dynamo (V 1.2.0) Recipe:

  • Nodes: Levels, All Elements at Level, SelectInRevit, Watch

Connect them up as follows:

Levels, to All Elements at Level, to SelectInRevit, to Watch.

Simple Graph
Simple Graph

If you need to move elements to a different level, switch back to the Revit drawing window after running the graph and use the following key sequence to reselect the items selected by the dynamo graph.

Macro Keys
Shortcut Keys

Then you can change their constraints and parameters to move them off the level.  When you run a graph and it comes up with no elements on the level, it is an easy task to delete the level.

If you feel ambitious, you can format the graph to be shared, so others can read and utilize the graph more easily.

Dynamo Graphic Standard

The graph above is the recipe with the same nodes, but the graph is formatted using the Dynamo Graphic Standard created by Vladimir Ondejcik of White Arkitekter AB

Final Graph
Final Modified Graph

The final graph with empty level deletion. Select Elements by Level_DynamoV1.2.dyn

You’ll need to install the Archi-lab_Grimshaw package.

Walk and Fly are available only in perspective views.

Walk and Fly are available only in perspective views.

All of a sudden, this dialog box started popping up again while performing a 3DOrbit inside AutoCAD Architecture.


After checking this thread for a solution and finding none, I offered the following:

Add the following to your section in your

 <HideableDialog id=”VMToolsUI.WalkFlyToPerspectiveView” title=”Walk and Fly – Change to Perspective View” category=”Navigation” application=”” result=”1001″><Preview><TaskDialog Source=”/AcTaskDialogs;component/TaskDialogs.xaml” Id=”VMToolsUI.WalkFlyToPerspectiveView” xmlns=”clr-namespace:Autodesk.Windows;assembly=AdWindows”></TaskDialog></Preview></HideableDialog>

Make sure you do this while AutoCAD is not running, or the file will get overwritten when you do close AutoCAD.

So Proud of my Son

So Proud of my Son

Thought I’d share with you a little success my son has had with TSA at his highschool.  Earlier this school year, he entered the Architectural Design competition at the TSA technology day at the state fair in Georgia.   The challenge was to design a garage with workshop.  He put together a design plan for a wood working shop inside an enlarged 3 car garage. Here was the design challenge copied from the flyer:

Design Challenge Background:

DIY (Do-it-yourself) is coming back into style. Many home owners are adding separate multi-use buildings to park vehicles and have a workshop as well.

The challenge is to design one of these garage/workshops for a client. Your job is to act as an architect and prepare a pro-posed design for a client who wants to park two cars and have a workshop in the same building, separate from the main house. You do not have to include a main house. The entry needs to be only the garage/workshop. Consideration needs to be made for getting materials into and large projects out of the workshop. Research what machines would be included in the workshop and where they may be placed inside for safe use. Also include some space for storage.

Here is what he submitted:

This design was started as a 2D sketch in Sketchup3D, recreated in Revit 2015, then exported to Lumion3D for rendering and presentation.  Here is a photo of his presentation board.

Submittal Board
Submittal Board

The following images are the rendered images used in his presentation as exported from Lumion.  Note, Lumion3D saves in bmp format.  These images were converted for presentation on the web.

Floor Plan
Floor Plan

Tsa Woodwork – Sheet – A101 – Workshop Floor Plan


Rendering Birdseye View
Rendering Birdseye View


Rendering Perspective
Rendering Perspective


Rendering Interior
Rendering Interior

When he presented his design and was interviewed he ended up winning the blue ribbon – First Place for his efforts. A good effort for a 10th grader with no formal training or any classes in Architectural Design.

The blue ribbon!
The blue ribbon!

View his Lumion3D rendering and panorama model for the TSA Technology Day Architectural Design Competition.

Revit: Rendering Tips and Tricks

Revit: Rendering Tips and Tricks

Revit’s rendering engine generates photo-realistic images from the building information model. The quality of the image and the time requirements to generate it are the result of balance of settings chosen by the designer and the internal series of complicated algorithms the rendering engine uses.  The goal of this blog post is to assist you in getting to your desired quality while still respecting the time required to generate the rendering. With that goal in mind, there are some things you can do to speed up the process, for instance:

  1. Maximize your Resources – When preparing to render in Revit, exit out of other applications, services, and processes that might compete for resources with Revit’s built in rendering engine: fbooprender.exe
    1. Turn off screen savers, web pages, other applications, and services that have launched by default like iTunes, adobe flash player update service, and other “helper” services that launch at system startup but only bleed off resources that could be utilized.
  2. Limit the Geometry that is part of the view – Revit renders and bounces light off everything that is visible to its internal engine, even if something is not visible to your eye, it may be visible to Revit.
    1. Change detail level to course or medium
    2. Turn off unnecessary categories using visual graphics
    3. Unload linked models that won’t impact the rendering.
    4. Hide worksets that don’t contribute to the rendering
    5. Physically limit geometry through the use of section boxes and/or camera clipping planes – remember each view in Revit has its own section box.  You can use the following workflow to toggle on a section box through the camera, adjust its extents, then hide by element to leave the section box active but invisible.
Limit Geometry
Hint: Watch your geometry in the Render viewport to ensure that geometry isn’t cut off in the process of adjusting the section box.
  1. If rendering artificial lights, use light groups to manage them

Note: that lights that are not within the view can still have a significant impact on the quality of the rendered image. Section boxes exclude lights that are clipped. When planned carefully and with forethought, the combined use of section boxes and light groups can greatly reduce the amount of time required to render an image

  1. Choose wisely – The selection of materials, colors, light source shapes and other settings can greatly increase the time required to render images of similar quality.
    1. Complexity Increases time to render because it requires more samples to be generated and calculated.  Simplify your materials, geometry, and patterns to reduce render time.
    2. Quantity affects time to render.  Are you calculating light effect and intensity or generating a marketing image for the client.  Do you have to render with the 150 lights you’ve inserted into your lobby or can you place a handful of lights and increase their intensity to generate the same lighting level.  Less lights = faster render.
    3. Quality and Complexity of appearances affect render times. – Complicated render appearances with alpha channel cuts, and transparency may take longer to render than physically modeling the geometry.  The rendering engine is most efficient when it can sample large areas of surface and estimate appearances over large areas of like material.
      In general:
      i.      Smooth monochrome is faster than smooth patterned surface
      ii.      Simple surfaces are faster than detailed perforated surfaces
      iii.      Matte reflections are faster than blurred reflections
  1. Be judicious in choosing image size and resolution. – Are you rendering for a slide show or an E1 sized presentation board?
    1. Choose an image size that is reasonable and appropriate for the desired use
    2. Choose the image resolution wisely – Render time is multiplied when moving upwards from 75dpi by a factor of 2.7 times each increase. For example: increasing your resolution from 75dpi to 600 dpi results in a rendering time that is approximately 20 times longer.

Sample Rendering:

An optimized rendering
An optimized rendering

[Cross-posted from WBA blog]

Dynamo Barrel Vault Brace 04

Today, we’ll make one more adaptive component family.  We’ll do this one by opening the central model and isolating the Barrel Vault Trusses…actually, we’ll isolate two of them since they are identical throughout the length of the space and our aim is to use dynamo to generate the braces used to stiffen the roof truss system.

If you are just joining this series, take a moment to view the previous 3 posts:

If you didn’t do the homework from the last session, you can download the family created here:

4 Point AC Brace

Create the AC Family for Brace Placement:

  • Open the Central model and activate a 3D isometric view
  • Use the temporary isolate to isolate two  of the barrell vault trusses adjacent to each other


  • Export the geometry to DWG format


  • Keep the temporary mode active during the export


The above steps are useful to reuse Revit geometry from a project context when you intend to model a component in the family editor.  I’ve done the export for you, you’ll find the 3D cad file at this link.

3D CAD Truss

  • New Family – Generic Model Adaptive


  • Click the insert ribbon and choose import cad formats dwg and locate the halltec_main_truss drawing that you just downloaded.


  • Bring it in using Origin to Origin
  • Toggle off the “Do Not Select Pinned Objects” control


  • Select the Cad import and move it to the origin of the family.
  • Choose the snap point as the inside face of the truss and align with the Center Front/Back reference plane in your family.


  • Pin the dwg file
  • Click the Center Front/Back reference plane, hold the CTRL key down while you drag a copy to align with the other inside face of the adjacent truss in a top down or plan view.


  • Reselect the Center Front/Back Ref Plane to activate it as a work plane

Activate WorkPlane

  • Switch to the front elevation view
  • Add Reference planes as snap intersections for the splines you will draw


  • Click the Spline through points tool and draw a 3 pt spline using the intersection and midpoint snaps along the top chord of the truss while the Center Front/Back reference plane is the active workplane


  • Repeat the sketch process for the bottom chord while the Center Front/Back reference plane is the active work plane.


  • Switch to the 3D view and window select the two splines and associated points.
  • Use the filter tool to eliminate any other elements you might select using the window method.


  • Once the splines and points are selected, copy them using the end points of the ref planes in a top down 3D view.
  • Your family should look similar to the image below.

chords complete

  • Open your 4 Point AC Brace family and load it into this placement family.
  • Save your family as Adaptive Component Placement.rfa


We’re finally ready for Dynamo. That’s all for this post. See you next time as we begin to create the Dynamo graph.

Dynamo Barrel Vault Brace 03

Dynamo Barrel Vault Brace 03

Welcome back, today’s post will complete the Barrel Vault Brace family.  If you’re just finding this post today, look at the previous posts to start at the beginning. If you’ve been following along and doing your homework, you should be ready to begin. The best way to learn is to do the work yourself, but if you ran into problems or just haven’t had the time, you can download the catchup file here.

Now that we’ve created the top and bottom chords, its time to add the diagonal bracing members. You did flex the family right? It’s important at each step, to be sure the pipe radius behaves and moves with the adaptive points. If you haven’t flexed it, please do. Did your pipes remain consistent from end to end? If you got a bulge anywhere in the pipe, you must not have constrained the profile shape to the ends. If your family is good, then its time to work on the diagonal bracing. Let’s make it easy on ourselves, select the two diagonal reference lines and isolate them temporarily.

IsolateLet’s get started!

  • Click the component tool and use the type selector to set the family and type to Circle_Profile_AC:BraceRadius
  • Hover over the adaptive point at the bottom left of the brace, tab until the end point option is selected and the working plane is perpendicular to diagonal reference line.


  • Place the BraceRadius and while still selected, Add a family type parameter labeled BraceRadius and associate it to the BraceRadius radius parameter.


Repeat this process at the other end of the diagonal reference line.

  • Change the value of the BraceRadius parameter in each type and flex it. Do the profile family circles get larger? Good.

endptandorientation FlexDiag

  • Create the form element by selecting the reference line and the two profile family insertions. Click Create form.
  • Now flex the resulting geometry. Does the brace form element behave? Good, add the remaining diagonal elements by repeating steps 3 ,4, & 5. Flex the family. Do both diagonal elements flex properly?
  • Click your temporary visibility tool (sunglasses) and Reset temporary hide/isolate visibility. Select each of your adaptive points and move them using the ucs gizmo. Do the form elements follow and flex properly?


  • Add a material property and assign it to diagonal brace form element.
  • Repeat this process for the other diagonal vector.
  • Flex your family again and ensure it behaves. Did you add different materials to your test types?


Does your family look like the above image?  We’re almost ready for Dynamo.  See you next post, when we’ll create our insertion adaptive family and begin working in Dynamo.

Dynamo Barrel Vault Brace 02

Dynamo Barrel Vault Brace 02

In the previous post, we created our flexible AC profile family.  Today we will begin creating the brace family.  We will use the previous family in our work today, so if you didn’t create the family yet, go ahead and do it or just download mine.  Ready now? Let’s go.

Second Family: a GMA Bracing family with a nested GMA family containing a constrained adaptive point, a model line circle, and two types and an instance based radius parameter. Today we’ll create the constraints, subcategories, materials, and top and bottom chord. Don’t forget to save your family.

  • New Family – Generic Model Adaptive
  • Click Manage – > Object Styles and add two subcategories Generic Model in the family as shown below:
    • Horizontal Chord
    • Diagonal Brace


  • Click OK to close the Object Styles Dialog box
  • In the drawing window, Select the Center (Front/Back) plane to activate the work plane
  • Click the reference point tool
  • Place 4 reference points on working plane two at ref level and two above ref level as shown in the image below


  • Window select all four points and make them adaptive placement points as shown below


  • Move them off the reference plane to get Revit to automatically connect to the AC point when drawing ref lines in the next step
  • Draw 4 reference lines two horizontally with end points on each adaptive point and two diagonally connecting each adaptive point. The shape should resemble an x with a top and bottom horizontal member but no vertical members. If you have issues getting the node to highlight, use the tab key and watch your status bar and the tool tip to make sure you are pre-selecting the correct element.


  • Flex the adaptive points to make sure the reference lines remain connected as shown in the image below. They should with no problems, it’s why I chose reference lines.

Flexing Points

  • Load the Circle_Profile_AC.rfa family into the bracing family.
  • Click the Component tool and hover over the lower left adaptive point and watch the circle orient itself to the ref level, click tab until the vertical plane of the adaptive point highlights and the circle orients to vertical with the circle oriented to become a loft or extrusion along the length of the bottom horizontal model line.


  • While the family is selected, use the type selector to ensure its type name is set to PipeRadius
  • Repeat this process at the opposite end of the same line and at both ends of the upper ref line as shown in the image below.

Horizontal Profiles Added

  • Add a Length parameter and label it PipeRadius, set its value to 4′-3”. Select the Circle_Profile_AC:PipeRadius type or filter and select your inserted profile shapes as shown in the image below


  • Associate the radius parameter to your new PipeRadius parameter.


  • Note: if you don’t see the Radius Dimension in the properties palette when the family is selected, its because the parameter in that nested family is a type. Open and change it to an instance based parameter. Hint: select the dimension and toggle instance on the options bar as shown in the image below.

instance property

  • Now reload into your brace family and choose the bottom option to update the parameters. Select the profile families as before and look at the properties palette. Can you associate now?
  • Flex your PipeRadius parameter – do the circles adjust accordingly? Good, well done.


  • Tab select the reference line connecting the two profile circles at the bottom. Tab again if all the ref lines highlight until just the bottom horizontal line is selected, hold the control key down and tab select the Circle_Profile_AC families at each end of the reference line.


  • With all three objects selected, choose “Create Form” from the ribbon to generate the pipe shape along the bottom of the bracing family.


  • Select the form as shown above and set the subcategory to “Horizontal Chord” in the properties palette.


  • While you have the form selected, why not associate a material parameter to the material property for the form element you just created?
  • Create two temporary types in your bracing family with different values for PipeRadius. Set each active to flex your new form element, does the form element flex properly? Does the pipe flex consistently along the length of the form? If you got a bulge in your form, then you probably didn’t get the profile associated with the plane of the adaptive point correctly. Fix it and flex again. Also select your adaptive points at each corner and move them using the UCS gizmo. Does your new form element adjust with them? If not, go back through the above steps until your family is behaving.
  • Repeat steps 9-21 to create the top pipe for the bracing family and flex it. This assumes that the bottom and top chords of the brace will have the same radius. If not, you can duplicate the Circle_Profile_AC type to size the bottom and top chords differently. You’ll need to add an additional set parameter node to the dynamo graph if you choose to do this.

I think that is enough for this post.  Save your family and come back next time to complete the diagonal bracing forms and get started with Dynamo.

ACA: Automating workstation counts per squarefoot

ACA: Automating workstation counts per squarefoot

We have been successfully using ACA rooms to meet program needs for one of our primary clients. Their requirements are based on a specific square footage formula for determining how many workstations should exist within certain room types.  Recently they added additional room types beyond “Office” that also require workstation counts.  In addition to the increase in room types, they also increased the workstation counts per square foot.  On top of the those requirements, there is always a need in this business to override an automated value based on room geometry or other constraints, so the automation had to be flexible.  The current workflow for overriding the count involved deleting the default room tag and replacing it with an alternate tag containing an attribute. Because I had to revisit the formulas, I took an opportunity to streamline the workflow while adjusting the formulas.  I reduced the workflow for overrides from 12 clicks to 5 and eliminated the alternate room tag in the process.The original room tag had values being constructed via a formula, in a custom property set definition (psd) field called WS_Count.  It was set up to always display the rooms square foot value by reading the gross area field from the RoomObjects psd.  A relatively simple formula was used to check the space name and when “office” was in the name, the WS_Count value was concatenated to include a workstation count.  The tag looks like this in operation:

As you can see from the image above using the same tag for both spaces results in a workstation count being displayed in office types and just the square footage for other type of rooms.  This is accomplished with some simple statements inside the object based psd.  Note the Space name is standardized and controlled by pulling from a list and is style based.  To create something similar, you could introduce the following function in a psd field.

The logic within the above sequence first checks to see if the list based style name contains the word “office” if it does not, it will skip all the down to the Else statement and simply return a string containing the “GrossArea” automatic property of the room object which is concatenated with a space and the letters “SF”.  If the space type contains the word “office”, then the value of the “GrossArea” automatic property is checked from smallest to largest using a “less than” comparison.
This tag was working well for this clients projects, but based on the previous mentioned changes, I introduced two new fields into the psd (WS_Override & WS_Detect) to eliminate the non coordinated overrides and to reduce the multi-view block count by 1. Because I wanted the value of the workstation count to always get calculated, I added a simple “less-than” function to calculate the count in the new property field titled: WS_Detect as shown below.

This function checks the string value from the property WS_Count to see if “WS” is found, meaning that the room type required a workstation count, and checks the new property WS_Override to see if its value is defaulted to 0 representing no override.  If both prove true, then the square footage is calculated based on the square footage program requirements set by the client using a similar “less-than” approach.  If either value is false then the manual integer based property value of WS_Override is used.

With the two new properties in place, anytime an override is needed because of space geometry, pilasters, or other obstructions that might require a deviation from the program, the designer simply places a positive value in the WS_Override property of the space. With the calculated value being tracked in a separate property, the original WS_Count property formula was modified as follows:

The original space type check was modified using the boolean “Or” to check for “Office” as well as the new space types that also get workstation counts.  If no workstation count is required, then the formula skips to the Else statement and simply presents the Square footage value as before.  If a workstation count is required, then the logic begins to check for a positive value in the WS_Override property.  When a positive value is found, the formula concatenates the square foot value with the workstation count from the WS_Override property.  If no override is in place, the original program based workstation count is used by concatenating the square foot value with the WS_Detect property.

The room tag multiview block was created using the following psd properties within an attributed block as shown below.  This block is used as a display block within the multi view block.


Note: in the above attributed block definition the middle line contains a simple text object with the letter “x” to allow the length and width size to be displayed.  I set the Length as right justified and the width to be left justified.  The first and third lines are middle center justified.

To give visual feedback to the designer as they are placing the spaces, I added a display theme to color the spaces based on workstation count.  I also added a room based schedule to display the workstation counts and provide a running total.  This schedule is set to automatically add new spaces and to search within blocks so that it is always up to date.  This setup is estimated to save approximately 10 – 15 minutes per project every time the plan is created or changed.  This is projected to save the company more than 80 man hours per year. It also eliminates counting errors and inaccuracies which may be introduced through human error.  The image below shows the original space layout on the left with the new display theme based layout and legend displayed on the right.

An image of the schedule that maintains tracking of Workstation Count is shown below.

The image below shows the settings used for the display theme.

Finally, the formula used in the Workstation Count Schedule is provided for reference.

The above formula checks the psd property WS_Count for the string “WS” indicating a workstation count is being calculated based on the space type.  If the formula doesn’t find the string then the workstation count is set to a value of zero. If it finds the string “WS”, then the value of the property WS_Override is checked. If it is greater than zero, its value is used directly, if not, then the value of WS_Count property is parsed using the split function.  The split is based on a space value and the third element of the resulting array is returned, which is the workstation count.

Let me know if this helps in your work. Here is a tip, you can cut and paste formulas like these shown in this blog post into the editor in ACA, but you’ll need to highlight any values found within square brackets and double click to replace the property set data using the interface. I frequently do this when working with a long formula.  I’ll copy it out of a working example into notepad, add the necessary logic, and then paste back into the formula editor. When you paste it back in, look for any bracketed properties that do not display the dark background.  You’ll need to replace those by highlighting them and then double clicking on the property from the object list below the code area. Use the sample results area as a check.

When the sample results area displays a proper sample value you are ready to use it.  Below you’ll see an example of the property formula editor in both working and non-working order.  Remember if you see the formula in the sample results area, you still have some replacements to make.