Before I go on I just want to give a shout out to Mostafa El Ayoubi and his fantastic Dynamo Package ‘Data-Shapes’. We will come back to this a little later on.
A client of ours recently wanted the ability to schedule all the Spot Coordinates in Revit for purposes of setting out. As it stands in Revit there is no way to schedule Dimensions, and Spot Coordinates fall into this category. However, we can use a mixture of both Dynamo and Revit family creation in order to facilitate this requirement.
If we create a new Generic Annotation family and make it look graphically the same as a Spot Coordinate, we are able to schedule any parameters assigned to these families. The graphics of this family can be easily changed to suit company standards.
I created four text parameters that will later be populated from Dynamo once the family is placed in the project. The yes/no parameters are assigned to the visibility of the label allowing different variations on what is visible. These have been assigned to three types in the family:
• XY – XY – Only shows the X and Y coordinate
• XY – Ref – Shows the X and Y coordinate with the unique reference number
• XY – Grid Ref – Shows the X and Y Coordinate, along with the unique reference number and the closest grid intersection reference
Once this family is loaded into the host project, go to Annotate > Symbol > Symbol and place the family in the current view as required. This symbol can be placed in any plan view and the Dynamo script can populate all the symbol labels at once.
Without dissecting the Dynamo script too much, it runs a filter over generic annotations to select this particular family type by its name. It then retrieves the family location based on the Revit origin point as default. I added a translation vector between this point and both the base point and survey point should they differ to move the points accordingly. The script then populates both the X and Y parameter with this information. There is a rounding method embedded which is defined in the inputs of the scrip specifying the number of decimal places.
The reference parameter is simply populated by querying the placed spot coordinate annotations and either writing the Revit ID or Unique GUID back to the parameter.
The final and slightly lengthier part of the script finds which grid intersection point is closest to the location of the generic annotation and populates the grid reference parameter. This method concatenates the results should the spot coordinates sit equidistant away from two or more grid intersections. The script allows for horizontal, vertical, diagonal and radial gridlines by using a cross-lacing and sorting methodology to find intersections removing any duplicates. These intersection points are paired with the names of the gridlines to allow for a text value to be wrote back to the generic annotations.
If you wish to explore the Dynamo definition in more detail, please feel free to open the original script.
All in all the script is not majorly complex but still requires a number of custom packages to be installed:
Clockwork for Dynamo 1.x – v. 1.0.2
Data-Shapes – v. 2017.3.2
Zebra – v. 2016.7.2
I have utilised the Data-Shapes package to allow for the UI input of different options. Mostafa has done a fantastic job creating a pop-up dialogue box in Python that allows you to group together inputs required to run a script. When you couple this package with the Dynamo Player, you get a lot of flexibility in the scripts you can run. Upon running this script through Dynamo Player you are presented with several drop down options that can change the information you write to the generic annotations.
Once this definition is run and the generic annotations are populated with data, you can run a schedule internally by going to View > Create > Schedules > Note Block. If you have more than one symbol loaded into the project just select the correct family when prompted.
Below shows a short video of the workflow in action. Please feel free to download and use this tool and please pass any comments on to us at firstname.lastname@example.org