Revit/Dynamo – crate location points ordered in columns and rows for list elements

Long I was gone but now I’m back and in GRIMSHAW. Youhoo! ūüôā

Partly for the office but mainly after hours I created this simple Dynamo script to orginise elements into columns and rows. Original task was to place views on sheets. Sometime there was one view other time 3 or 5. We wanted to make them not overlap. Although, they would need to be manually corrected later.

Presented her solution is doing just a part of this task. It creates points arranged in maximum number of columns and as many rows as there are objects for each similar string inputs on a list.

(In our office exercise this list contained ordered sheet numbers for corresponding list but with views. A node to “place views on sheets” takes a view, a point with coordinates and is placing it on a provided sheet. List of views, points and sheets must be the same length.)

This Dynamo script is creating this list of points. You have an option to specify the insertion/start point coordinates, max number of columns and a distance between columns and rows. But see it by yourself.

If I orginise points by z coordinate the output looks like this:

Levels would represent sheets or could be Revit Levels used to order other objects.

Python code looks like this:

startX = IN[0]
startY = IN[1] 

offsetX = IN[2]
offsetY = IN[3]

no_of_col = IN[4]

list = IN[5]

pointsX = []
pointsY = []

compare = ""
col_no = 1
row_no = 1

for l in list:
	if compare == l:
		if col_no <= no_of_col:
			pointsX.append(startX + offsetX*(col_no-1))
			pointsY.append(startY - offsetY*(row_no-1))
			compare = l
			col_no +=1
			col_no =2
			row_no +=1
			pointsY.append(startY - offsetY*(row_no-1))
			compare = l
		col_no =2
		row_no =1
		compare = l

OUT = pointsX, pointsY

You can download the Dynamo file from here.

Revit – Door threshold behavior

I would like to present in the below images a weird door threshold behavior in Revit.

I discovered it when I was trying to annotate a level of the door threshold in structural wall.

What I discovered is that door threshold is not visible by default at the level where doors are placed or below it and only when doors are raised by more than 0.159 mm it appears in plan.

Please notice the Sill Height set to 0.159mm. From 0. 160mm sill becomes visible.

In the image below I could only place an elevation mark because of the floor.

In project on which I was working I end up moving all doors up by 0.16mm to be able to place elevation mark on the thresholds.

I believe it would be better to make a parameter which would switch door threshold visibility instead of implementing this weird behavior.

Revit – Setting Parameters Values in Macro Programming (with VB.Net)

Back in the old days, it was easy to set any parameter value in macro. This was the code I was using in Revit 2014:


element.parameter("Any Parameter Name").set("value")

This was working for Build-in Parameters, Sheared Parameters and Project Parameters. When I migrated some macros to Revit 2017 this formula wasn’t working any more. After some search I found a solution. Unfortunately for every parameter type it’s different.

Build-in Parameters:

Build-in Parameters can be set by referencing to parameter Definition name.

in VB.Net


in Python for Windows Comments parameter:


Parameter Definition Name one can find using Revit Lookup or in API help.

Example in VB.Net from my amended macro for sheet parameters: Drawn By, Checked By and Sheet Issue Date:


Shared Parameters:

Shared Parameters can be set by referencing their GUID number.

in VB.Net:

element.parameter(New Guid("guid-wierd-number").[set]("value")

in Python in Dynamo it DOESN’T WORK:

from System import Guid

NewGuid = Guid("7839a188-7b93-457a-9c33-0a4940183f18")

Guid Number for Shared Parameters can be found in Shared Parameter file i.e

Code example in VB.Net from my amended macro:

 m_vs.parameter(New Guid("3c5aa4ef-99ff-4a51-abfe-7f7129b9fed4")).[Set](curSheet.documentType)

Project Parameters:

Project Parameters can be set by referencing¬†in the formula parameter’s Definition by itself.

in VB.Net:

 Dim ParameterList As IList(Of Parameter)
 Parameterlist = element.GetParameters("Parameter Name")
 Dim Parameter As Parameter
 Parameter = ParameterList(0)

in Python in Dynamo it DOESN’T WORK:

ParameterList = element.GetParameters("Parameter Name")
Parameter = ParameterList[0]

Is unsubscriptable  with get_Parameter or expects BuiltInParamter.

Any one knows how to make it work in Python in Dynamo?


Revit – VB.Net Macro to make Print (Sheet) Sets from Sheet’s parameter.

Back in 2015 when I started learning¬† programing macros in SharpDevelop in Revit to change¬† different parameter’s value like Sheet names, Room numbers or custom Parameters, I decided to find a time saving solution to something more serious.

In our office there was a need to create about 35 Sheet Sets for printing purposes from few hundreds of drawings in our project. Sheets created in our project were divided to series.¬† Because we wanted to have more descriptive information in project browser then just a simple Sheet number we added a custom Project Parameter to Sheets called “Drawing Sheet Series”. (i.e. Sheets begging with number 20 had this parameter set to “(20) General Arrangment”)

This way all the sheets in our project were divided.

As a beginner to start with this task I needed some help. I didn’t know how to alter Revit print settings. It wasn’t easy to understand Revit API help file but I found a useful macro at Boos Your BIM web page (link is hear) which is creating a Sheet Set from Sheets containing in their number specific letters.¬† In my case I needed to do it for all Sheets therefor changes were required. Additionally because it was written in C# and I was more fluent in VB.Net I decided to translate it.

Below you can find a final macro prepared for Revit 2015:

Continue reading Revit – VB.Net Macro to make Print (Sheet) Sets from Sheet’s parameter.

Revit – Installing Revit Lookup 2016

I encountered some problems while trying to compile Revit¬†Lookup 2016 ¬†using the procedure described on the page¬†for Revit 2014. It didn’t work. SharpDevelop couldn’t build solution.

This was the output information:Error Output SharpDevelop at start


Instead of reading it I tried to download the compiled version 2016 from the Internet. ¬†Kindly Troy Gates¬† shares it on his blog – Revit Coaster. But it didn’t work either. I received this error.Error Revit Lookup 2016

(here is also a compiled Revit Lookup 2015 at Revit Coaster)

Then I tried again to compile it using SharopDevelop but his time I had read the Output window which was showing what is wrong. Error Output SharpDevelop

The problem of course was with the path so I tried to locate this path. I found it under Properties by clicking at Revit Lookup in Project Panel.Error SharpDevelop 1

It can also be accessed through the top menu Project > Project Options..

The wrong path was under Compiling tab in Output Path here:Error SharpDevelop 2

I changed it to the existing folder in …bin\Debug\ and all went fine.

SharpDevelope nicely compiled the project and put two files RevitLookup.addin and RevitLookup.dll automatically in: C:\Users\UserName\AppData\Roaming\Autodesk\Revit\Addins\2016

Revit started with Revit lookup 2016 already installed.

The complete procedure to Install Revit Lookup 2016 looks like this:

  1. Download the latest Revit Lookup 2016 from
  2. Open SharpDevelop. It should be installed automatically with revit 2016. You can find the SharpDevelop.exe file in here: C:\Program Files\Autodesk\Revit 2016\SDA\bin
  3. Drag and drop RevitLookup.csproj to the Projects Panel.
  4. Remove existing References from Projects Panel to RevitAPI and RevitAPIUI.Error SharpDevelop 3
  5. Add references to the RevitAPI.dll and RevitAPIUI.dll that can be found in the main Revit folder at: C:\Program Files\Autodesk\Revit 2016
    Right click on References:02Go to .NET Assembly Browser and click on the Browse… button.03Go to the C:\Program Files\Autodesk\Revit 2016 location and add the RevitAPI.dll and RevitAPIUI.dll file.
  6. Amend the Output Path in menu Project >Project Options.. > Compiling to any existing folderif you have an error like me.
  7. Hit  Build Solutions button and watch for errors. If it says that it was Build Successfully then you are good to go.The RevitLookup.addin and RevitLookup.dll will be saved in: C:\Users\Name\AppData\Roaming\Autodesk\Revit\Addins\2016
    If you get bunch of warnings with it, its OK as long as its compiled successfully. I didn’t have any.
    If you want to use ProgramData instead, copy RevitLookup.addin and RevitLookup.dll to:
    C:\ProgramData\Autodesk\Revit\Addins\2016 and remove them from:
  8. Open Revit and check if Lookup 2016 is in the  Add-Ins tab.

I hope I helped.

AutoCAD – Filter current drawing layers

The origin of this tip is in the list of layers which includes all of the Xref layers (from externally referenced files) as you can see below:

Filter layers 1

My problem occurred when trying to find a specific layer amongst all of the Xref layers and other layers in my current drawing. I dont need to see all of the Xref layers because i do not usually amend them.

The expandable list of layers shows the same layers as a Layer Manager. I create a filter in the Layer Manager in order to hide them and make the list clearer to browse.

By default there is no filter that shows only the layers from the current drawing (I think there should be) but there is a way to create it.

This is what you need to type in the field Name in Filter definition to filter only current drawing layers:


I called this filter of course Current Drawing Layers.

Filter layers 3

To find out how to filter a layer list using different symbols please check this link:
 Filter and Sort the List of Layers

My advice is to create this filter and other useful filters already in your template file.

Image below shows my filters:Filter layers 2

Advance Painter plugin – 3DS Max

Advanced Painter is a free alternative to other commercial plugins like Forest Pack or MultiScatter for scattering objects on surfaces. It doesn’t have so many options to scatter objects, but similar to¬†MutiScatter it allow to drop objects on surface of other objects. This action resemble¬†painting.


To install the plugin start Max, then go to MaxScript>Run Script … and choose the extracted file advpainter_1.6.0.mzp. A dialog box will inform you that installation is successful.
You may need to be logged as an administrator of your computer.
(I’ve also “Run as administrator” 3DS Max )

You can also¬†create¬†Advanced Painter shortcut icon to your toolbar (main menu bar, or quadmenu). The video below can help you to install Advanced Painter and help familiarise with its futures. (The way of installing it using¬†drag and drop technique¬†didn’t work for me)

New version for download is possible here: AdvPainter v1.6.0(x32/x64)
You can also try to install this version: advpainter_1.6.0_max2013.mzp  for 3DS Max 2013 up [only]. It works fine with my 3DS Max 2014.

You can also learn how to use this plugin from tutorials e.g.
at CGWORKSHOP or here.

Advanced Painter Icons Рhere you can download icons I have quickly created for this plugin. You can check here how to install them.

CHSPACE – change object space command – AutoCAD

After years of using AutoCAD  one can still discover something new and useful in this program. This happens to me every now and then.

CHSPACE command allows on a layout to transfer selected objects between model space and paper space and vice versa. It is in AutoCAD since version 2007.

Here’s a simple step-by step guide how to use this command:

  1. From Paper Space, select the objects that you want to move through a viewport.
  2. Type the CHSPACE command, or select it from the Modify menu.CHSPACE TRANSFER OBJECTS
  3. Next, the command needs to know which viewport you want to ‚Äúpush‚ÄĚ the¬† objects through. This will determine how the objects are scaled and their final positions in Model Space. Bear in mind that if there is only one viewport in the active Paper¬†Space layout, this will be a automatically selected, and this step will be skipped.

Here is an example when this was useful for me to move dimensions and annotations from Model Space do Paper Space. The scale of the objects was automatically adjusted to the Paper Space. CHSPACE Models Space

This is the view in the Model Space.

CHSPACE Paper Space

This is the view in the Paper Space. I have moved the dimension and the leader annotation to position them outside the viewports. Additionally I have override the dimension text to represent the real Model Space dimension.

This command could be a real tie saver. I’m sure you will find you own ways how to use this command. You can find some more examples e.g.¬†here or here. Good luck.



CAD Software Tips & Tricks