Do you follow Eric Ligmans Blog? He’s giving away more than a million eBooks. Get yours today!
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
Did you see the green cloud in Dynamo today? There’s a new release available.
Visit this page for the full report.
From the readme file:
– Geometry Working Range, a solution that adjusts numerical precision to accommodate these large numbers.
– Isolate Selected Geometry
– A direct link to the Dynamo Dictionary is added at the bottom of help menu popup window for each node. Definitions are currently available for the out-of-the-box core Dynamo nodes, and we are actively working on Revit nodes.
– Multi-output port re-connect feature using Shift+Left-Click
– Highlight geometry from selection in preview bubbles and watch nodes.
– DateTime.Format: (shout out to Radu Gidei!)
– Translate (CAD import) functionality now supports 3DM (Rhino) and SAT file formats, in addition to DWG and DXF. (Additionally, import of FBX, OBJ, STL, and SKP formats are supported, but there is currently limited downstream capabilities with these meshes.)
Dynamo for Revit:
– Revit allows for duplicate parameter names in a file, and Dynamo is now able to consistently pick between Named or Built-In parameters.
– Preview Bubbles enabled for Revit Selection nodes
– New Revit nodes: a number of Creation methods for System Families, added access to Global Parameters, and exposed file auditing tools with the Performance Advisor.
– Fixed line break issue in for group titles, increased group titles font size
– Convert between units now gives correct Hectares for Area conversion
– Fixed File Paths with spaces sometimes converting paths to escaped URI path
– Fixes to Arc.ByCenterPointRadiusAngle, Arc.StartAngle, and Arc.EndAngle
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.
The second tool reports all dimension types and writes them to the chosen excel file in a worksheet named dimensions after the category chosen.
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.
and a download BTC_DIM_STYLE_FIX
As I was updating existing templates and building some new ones, I wanted a better way to determine what fonts/text styles are in use and where they are being used.
Exploring some existing dynamo graphs and custom nodes, I put the following graph together.
This graph searches the current project, builds a list of graphic views (plan, section, elevation, drafting, legend, and callout) and then builds a list of elements in those views.
The data is then output to an excel file for review. Here is what the output looks like. As you can see, the graph outputs the textnote style and the viewname the text element was found in.
For those of you who want to do it yourself and understand how I reached the working version of the graph, follow along as I describe how I created the graph.
First Step – Insert the White_Dynamo_Graphic_Standard node, edit the custom node and copy all the precreated groups, pasting them into your new home workspace. I edited the file notes contained inside this standard and saved it so I have a ready to use set of groups whenever I need them.
Since we are trying to determine where standard elements are being used in projects and templates, and I know I want to be able to reuse the data in excel, lets get started with the beginning and end in mind. Type excel into the search tool in the Dynamo graph editor and add the Excel.WriteToFile node. This node presents a number of connectors helping us to quickly add the necessary inputs by search.
Add a File Path node, a Categories node, and a Boolean node as we will be able to quickly connect these up as we begin to think through the logic of what the rest of the graph will require. I prefer the the file path node to a string based input, because I can select an excel file by browsing to it. The categories node allows us to select the category to be reviewed (Text Notes). I will add a “String from Object” node and connect it to the Categories node, so I pass in the sheet name directly from my chosen category. The boolean node lets us control whether the data is refreshed and whether the excel file is overwritten. I know that I want to start filling the excel file from column A and Row 1, so I’ll add a code block by double clicking in the editor and preparing to pass out a value of zero. I will connect up the nodes like this:
As you can see in the image above, I have already provided 5 out of the six input nodes required by the Excel.WriteToFile node. So now we tackle the data input. Since I want to figure out where all my text note styles are being used, so I can standardize the text note styles, I’ll next add the Document.Views node from the clockworks package to generate a list of all views contained in the current project. Click on your Excel.WriteToFile node, right click your mouse and freeze this node til we have the data input prepared. Click run to see the output from the Document.Views node.
I added and connected the Lunchbox node: Remove Null Values to the output of the Document.Views node, because I saw some null output after running it the first time. Looking at the list of views provided, I realized that there were many views that would not be of use to me in this process, so I searched for a node that could give me a way to filter out these nodes. Having found no such node, I decided to modify the View.IsTemplateView node from Clockwork for my use. The easiest way, I’ve found is to simply add this node to your graph, then select it and right click choosing to “Edit custom node”. Once the node is open in the editor, copy all the internal nodes to the clipboard and then close the View.IsTemplateView node. Remove it from your graph and click “File” new custom node. When the editor opens, paste the contents of the clipboard to your new custom node. It should look like the following image:
I named my custom node: View.IsGraphicView and added it to the BesideTheCursor Package, I’ll publish it later tonight or tomorrow. In the mean time, you can do what I did and modify the python script as shown in the image below. I added some exclusions of view types to exclude. This results in a view filter that effectively rips out the views that wouldn’t contain graphics.
I modified the original python code very slightly, see the difference view image below:
I used a boolean if else line to accomplish what i needed as seen in the images above. A quick run of the partially completed graphs shows that I am now effectively identifying the views that I do not wish to process. I can use the true false output from my new custom node with the List.FilterByBoolMask to filter out the view types I no longer want to include. I connect my node to the bool input and connect the cleaned output to the list input on the List.FilterByBoolMask node.
I am now ready to pass my list of included views into the Springs.ElementsFromViews node, to begin building the list of elements found in every view. A quick run at this time reveals many thousands of elements. Don’t get worried by the spinning blue wheel. It will run to completion rather quickly.
Now its time to filter for the type of element I’m looking for. We can add a code block and type in the TypeName description for TextNotes. You can see what is required from the Object.Type node. We connect this into the String.Contains node to search our large element list and build a boolean list of true and false. Connect these up to a List.FilterByBoolMask and then flatten the output will complete our data filtering down to just TextNotes as shown below.
Lets add some more nodes. Add Element.OwnerView, Element.Name (Universal), TextNote.Typename and we’ll connect them up and build a new list using List.Create with two input connectors as shown below:
Lets run this graph and take a look at the output from our list to this point. As can be seen in the image below, we are getting two sublists; the first contains the viewnames and the second list contains the textnote typenames. Having worked with the Excel.WriteToFile node in the past, I know from experience that the data input node prefers lists that contain rows and columnar data. Lets add the List.Transpose node to convert our list to this format and connect it into the Excel.WriteToFile data input connector. Now its time to run the graph, so unfreeze the final node and get ready to review your list of textnotes used by view. You can grab a copy of the graph here:, but its always best to build it yourself to gain a better understanding of how Dynamo works.
During the process of writing this blog post, I realized that the path I took was longer than necessary and can actually be accomplished without the custom node created, but what fun would that be? Check back later for an update and a simpler graph to complete the same workflow.
New exporters released to enable a live sync between your Revit model and the lumion project in real time! Now you can see the changes in Lumion as you modify Revit. In addition, the exporter and LiveSync now automatically export and map the following: Ceramic, Concrete, Generic, Glazing, Masonry, Metal, Metallic Paint, Mirror, Plastic, Solid Glass, Stone, Wall Paint, Water, and Wood material types. Also, glass is now automatically converted. That will be a huge timesaver!
Find out all about the new exporters and LiveSync functionality here.
Download the exporters here.
Tutorials and FAQ are found here.
You simply must upgrade to this version. I’m downloading now!
Finally got around to adding the code to modify a great routine published by Harry Mattison back in 2015. I’ve been using the routine to generate the isolated 3D views, but from the first time I ran it, I wanted a way to do workset isolation rather than element level temporary isolation. Using the Harry’s original code, I added a dictionary and the SetWorksetVisibility code segments. The code published below will set the workset visiblity for the view in addition to the element.
My modified code shown below (Application Macro):
public void CreateIsolatedWorksetView()
Document doc = this.ActiveUIDocument.Document;
int max = 100;
// get the 3d view type which is needed when creating 3d views
ViewFamilyType vft = new FilteredElementCollector(doc)
.FirstOrDefault(q => q.ViewFamily == ViewFamily.ThreeDimensional);
using (Transaction t = new Transaction(doc, “workset view isolation”))
// create a dictionary to hold the worksetid and workset name
Dictionary<string, Autodesk.Revit.DB.WorksetId> dict =
new Dictionary<string, Autodesk.Revit.DB.WorksetId>();
// loop through all worksets (but only User worksets)
foreach (Workset wset in new FilteredWorksetCollector(doc).WherePasses(new WorksetKindFilter(WorksetKind.UserWorkset)))
foreach (Workset wset in new FilteredWorksetCollector(doc).WherePasses(new WorksetKindFilter(WorksetKind.UserWorkset)))
// create a 3d view
View3D view = View3D.CreateIsometric(doc, vft.Id);
// set the name of the view to match the name of the workset
view.Name = “WORKSET – ” + wset.Name;
// isolate elements in the view, using a filter to find elements only in this workset
view.IsolateElementsTemporary(new FilteredElementCollector(doc).WherePasses(new ElementWorksetFilter(wset.Id)).Select(q => q.Id).ToList());
for (int i = 0; i < max; i++)
foreach (var pair in dict)
// verify not current workset
if (pair.Key != wset.Name)
I was asked this question recently:
I noticed the “cumulative area” when attempting to add up SF numbers from multiple polygons. Please see the two images below. Why can I select 4/5 polygons and have it add them in the cumulative area space (Shown in Image 1) but when I select the 5th area the cumulative area disappears (Shown in Image 2)? Do you know why this occurs?
I suspected that there was a boundary issue, that prevented the hatch from calculating the area. This can occur when a polyline boundary overlaps itself before its closed. Since a hatch can generate a new boundary, I felt that was the easiest way to resolve the problem. Here is my response:
The problem exists with the last hatch area. If you select it by itself, it displays no Area. I suspect that the boundary is probably overlapping itself. It’s not related to the number of hatches chosen, it’s actually that hatch by itself. To fix it, I did this:
1.) Unfreeze the layer containing the hatch, and make it current.
2.) Isolate that layer so only the hatch objects are visible. You can use layiso to isolate the layer containing the hatch.
3.) Now that the hatch is visible and isolated, select the problem hatch, right click and choose generate boundary.
4.) Once the new boundary is created, you can delete the original hatch.
5.) Use boundary hatch to place a new hatch into the generated boundary, to match existing hatches already created, you can use match properties.
Viola problem solved.
Working on some tools to assist the design teams in managing parking spaces. The attached graph contains two tools. The first tool renumbers parking spaces based on a model based spline drawn through the spaces. Refer to the image below for more info.
The instructions to renumber the parking spaces are shown in the blue area in the image and listed below this paragraph. Use the control toggle boolean node to run one graph at a time by setting its value to true and the other node to false.
To renumber existing parking tags based on spline
1.) Draw a model line using the spline tool. If your sketch contains multiple sharp curves, you may need to increase the “Integer Slider” amount to ensure the routine gets all the parking stalls. 400 is a good starting number.
2.) Start in lowest number parking spot, continue spline through parking spots in order ending the spline in the spot you wish to have the highest number.
3.) Use Select Spline (Model line) “Change” button to select the model spline in your project.
4.) Enter desired starting number for in Starting number node.
5.) Enter desired increment amount
Click Run when Ready
The second tool addresses parking spaces on ramps. It requires a custom parameter named SCHEDULE LEVEL. Use the second tool to write data to the parameter. You can use this to filter your parking schedule.
The instructions to update the parameter are shown in the blue area in the image below and are listed below this paragraph.
To Assign Schedule Level
To differentiate between level based parking and ramp associated parking, perform the following steps:
1.) Click Select model elements and window the parking elements that are to be associated with the ramp.
2.) Click True to run this operation or False to run a different operation.
The image below shows the entire graph.
You can download the graph here: Parking-Renumber_BTC