Revit lets you model things that you can’t necessarily build, which shouldn’t surprise us given that “Revit was intended to allow architects and other building professionals to design and document a building” 🙂 wiki

However, in recent times Revit is getting used more and more for fabrication workflows, with core Revit features, addins, and Dynamo scripts developing to make that happen.

With that in mind, I was shared something recently and simply had to share it… check out the video below:

Basically it shows how we can quickly cut up impossibly long modelled Revit elements (like Pipes) into more ‘buildable’ fabrication lengths. Cool! The video also discusses how appropriate generic fabrication content could really begin to bridge the gaps between Revit models and actual things you can buy off the shelf.

Thanks to Nathan Moore for sharing this! And credit also to Jeremy Tammik and Pablo Derendinger.

 

I think we will inevitably see more and more automations like this that connect Revit to real fabrication and procurement workflows. Feel free to share your thoughts and ideas in the comments!

 

From the video comments:

Are you paying for a Revit M/P Fabrication add in or using ITMs to route and coordinate to LOD400? I think there is an opportunity to use native Revit to accomplish this. A properly “parameterized” fitting family combined with the correct pipe types and routing preferences would allow native Revit to produce what you need.

Dynamo Script here:

https://github.com/natethegrate1/MEPTools/blob/master/place_coupling.dyn

Credit to Jeremy Tammik and Pablo Derendinger:

https://thebuildingcoder.typepad.com/blog/2020/03/splitting-a-duct-in-more-depth.html

https://engworks.com/revit-dynamo-script-to-cut-pipes-and-ducts/

Some related thoughts and ideas from Nate here, pointing out a common problem with modelling generally (that in order to model accurately, you often have to select some kind of proprietary brand / make / model first):

I am in a situation (and I think most other companies are in similar situations) where I am not necessarily the final decision maker on the “BRAND” of pipe/fittings that we end up buying. There is a fundamental disconnect I think in the industry that fabrication software providers want to provide MANUFACTURER SPECIFIC items to help streamline the downstream purchasing/install/warehousing operations… My solution is to create a “SPEC DRIVEN” family library (similar to how duct works) so I can simply have an “ASTM SCH40 Welded” system or a similar Grooved system etc. That way the families placed will adhere to the spec and allow more flexibility downstream for the buyers/warehouse.

As per notes below, Dynamo Revit 2.3 will be deployed with this update..

Release Notes: at this link, Enhancements here, Issues Resolved here.

Download: at Revit 2020.2 Update Direct Download LinkRevit update image

Filename: Autodesk_Revit_2020_2.exe

Enhancements:

Dynamo for Revit
Integrated Dynamo Revit 2.3 to Revit 2020.2.
A new Dynamo node called ‘Selection – All Elements of Category in View’, which allows for selection of all elements of a designated category in a view, is available.
A new Dynamo node called ‘Element-Delete’, which allows for deleting elements through a Dynamo script, is available.
File Corruption
Enhanced data storage implementation to prevent missing element file corruption.
MEP Analytical Systems
Added support for specifying an absorptance value for architectural element types and passing it to the Systems Analysis feature.
MEP Electrical Panel Schedule
Improved the behavior to show circuit and panel properties directly in a panel schedule view.
Revit Cloud Models
Improved support for increased communications security protocols to better safeguard data and communications.
Revit Home
Provided a consistent visual style between Revit and Civil application home.
Provided a self-guidance message that displays when a customer opens the published version of Revit Cloud model from Desktop Connector.
Route Analysis
An enhancement to the Route Analysis Path of Travel tool allows you to add and edit waypoints on an existing Path of Travel line so that it goes through specific points along the Path from A to B.
Two new APIs, PathOfTravel.FindStartsOfLongestPathsFromRooms() and PathOfTravel.FindEndsOfShortestPaths() support streamlined route analysis workflows to find longest paths from locations in rooms to destinations (such as exit doors).
Schedules
The currently active cell and row are highlighted so that they can be easily found when working in a large schedule.
Added the ability to freeze (lock)/unfreeze the schedule title and header in place to keep them visible when scrolling through a long schedule.
Shared Coordinates
Added the ability to show the Revit internal origin from the host model and the linked models.
Removed clip function on the project base point so that it’s always moved in unclip mode.
Steel Connections for Dynamo
Updated the “Autodesk Steel Connections” documentation with the new nodes for Load Connection.
Updated the “Autodesk Steel Connections” documentation with the new nodes for analysis results.
Updated the “Autodesk Steel Connections” documentation with the modified behavior of the “Connection.ByType” Dynamo node.
Added support for envelope minimum and maximum in the load case/load combination input drop-down for the “Autodesk Steel Connections” Dynamo package.
Added Input.ResultTypes node for “Autodesk Steel Connections” Dynamo package, containing a drop-down of result types (Fx,Fy,Fz,Mx,My,Mz).
Added a drop-down Dynamo node to the Steel Connection Automation package to list the Analysis results, Load Case/Combination/Envelope, and model name for the current project and provide as input to FilterBy.AnalysisResults node.
Added the “Filter.ByVerticalPosition” node for the “Autodesk Steel Connections” package, and the “Connection.ByType” node now throws an exception when placing base plate connection types at the upper end.
Changed the names of the following Steel Connection Automation nodes : ConnectionNode.FromStructure, ConnectionNode.SubNodesOfSize and BySectionType.
Removed the Sub-connection category, which included Miter and Cope, from the Steel Connection Automation “Connection Type” drop-down. The placement of those cuts can still be automated by including them in Custom Connections.
Added a new Dynamo node, which can filter the connection nodes using the analysis results stored in Results Builder, to the Steel Connection Automation package.
Added the “existing” output to the “Connection.ByType” Dynamo node for the “Autodesk Steel Connections” package.
Fixed an issue in the Steel Connection Automation package that caused all typical scripts that can apply Base Plate connections to display an incorrect warning message on each run.
View – Other
Added a Fly mode to the Navigation bar that provides direct access and shortcuts to give the experience of “flying” through a model live to present it to clients and stakeholders.

 

Issues Resolved:

Autodesk A360 Sign In
Improved stability when launching Revit.
Dynamo for Revit
Fixed an issues where the Path of Travel nodes were not available in Dynamo for Revit.
Export DWG/DXF
Fixed an issue where exporting a sheet with multiple rotated views to DWG resulted in elements being moved away from the correct position.
Fixed an issue that resulted in incorrectly moved and rotated blocks, caused by exporting sheets that contain rotated viewports to DWG.
Fixed an issue that occurred when exporting a sheet with multiple viewports to DWG and resulted in some elements missing parts of their geometry.
Fabrication – MEP
Fixed an issue that prevented product data from being read when it was located in the common database directory.
Fixed an issue that enabled users to access costing information from the data that was cached in the model.
Fixed a stability issue that resulted in splitter warning messages displaying incorrectly when attempting to place some parts in the model.
Family
Fixed an issue in which non-existent doors were shown in schedules.
File Corruption
Improved stability when performing Sync with Central.
File Open/Save Internals
Improved stability when working offline with file-based worksharing.
Ensured that the model’s name is presented when generating warning dialogs.
Updated .ini setting for ignoring foreign file warnings to save the full file path of the suppressed file.
gbXML
Changed the tolerance value that is used to determine analytical surfaces that are passed to gbXML so that it corresponds with the value used by EnergyPlus and other simulation engines.
Graphics – Display
Fixed an issue where pan and orbit stopped working in an uncropped perspective view after an error dialog was closed.
Host Sweeps
Improved stability when editing a gutter with a potential geometry failure.
Link Topography
Improved performance when switching to the Topography tab in the Manage Links dialog when many topographies are linked.
Improved performance when placing spot annotations by picking points on the link topography.
MEP Analytical Systems
Fixed a weather service timeout issue that caused a sporadic systems analysis failure.
Added support for weekend usage schedules when running an annual simulation systems analysis.
Improved the usability of systems analysis reports by matching the zone names to the model’s analytical space names when using the ideal air system to calculate loads.
Improved performance by generating the default unconditioned zone equipment using one per analytical space.
Fixed an issue that could cause a systems analysis report to be truncated due to a size limit for Revit views by locating all systems analysis reports in a Revit subfolder.
Fixed an issue that caused instability while running a systems analysis that produces a very large report.
MEP Connectors
The ability to add pipe insulation and change parameters for piping elements can now be performed by using group edit mode.
Fixed an issue that caused instability when displaying a pipe or duct rise or drop symbol within certain views.
MEP Duct/Pipe Display
Fixed an issue that caused the wrong rise/drop symbol to display when an accessory is located in a vertical duct.
MEP Electrical Settings
Improved stability when opening and upgrading a Revit model.
MEP Graphics
Fixed an issue that caused a line to appear inside the rise symbol for single line piping when printing.
MEP Insulation lining
Fixed an issue that occurred when a model contained insulation with a specific thickness, and which caused the project to fail to upgrade.
MEP Pipe
Fixed an issue that caused a lag when selecting a pipe or duct.
Materials
Improved stability when editing custom parameters in the Material Browser.
Reinforcement – Fabrics
Corrected an issue related to the wire mesh diameter exported to IFC.
Reinforcement – Multi-Rebar Annotation
Fixed an issue that caused a multi-rebar annotation to display, even when all the rebar references where cropped out of the view.
Improved stability when adding parameters to a multi-rebar annotation tag and reloading into the project.
Fixed an issue that resulted in a multi-rebar annotation displaying information from non-rebar references if the option to group tag heads was disabled.
Reinforcement – Shape Driven Rebar
Improved stability when constraining a bar connected by couplers to another bar.
Improved stability when editing rebar constraints in a view placed on a sheet.
Revit Cloud Models
Fixed “Manage Links” dialog to show full model path names.
Stopped creating some collaboration cache files to reduce customer disk space usage.
Revit Home
Fixed an issue in which the File Menu list did not display when enabling the ‘Do not keep history of recently opened documents’ Windows setting.
Fixed the File Menu lagging issue that occurred when opening a central model from an external internet path.
Fixed truncated texts in button and description in Open Published Version dialog for some languages.
Route Analysis
Enabled access to Route Analysis settings from within any active view, not just plan views.
Fixed an issue to prevent a path of travel analysis from being placed or copied to a section or elevation view of the model.
Shared Coordinates
Fixed an issue that resulted in the highlighted point being too large when snapping to the project base point and the survey point from a linked Revit model.
Improved stability when binding a linked model where the project base point or survey point is visible in the current view.
Steel Connections for Dynamo
Fixed an issue that resulted in the Dynamo scripts creating invalid Steel Connections and not counting or deleting the connections.
Fixed an issue with one sample Dynamo script where it could place invalid Apex connections.
Fixed an issue resulting in duplicate and overlapping connections created by Steel Connections for Dynamo scripts with invalid input.
Fixed an issue that resulted in scripts designed to filter for vertical beams (columns) using the Slant Angle node incorrectly considering horizontal elements.
Fixed some of the sample scripts delivered with Steel Connection Automation packages that had overlapping nodes.
Fixed a typo in the “Apex Haunch” sample script (En-US) of the “Autodesk Steel Connections” Dynamo package.
Templates
Aligned the Project Base Point with Internal Origin in the DACH project templates.
UI Frameworks
Improved stability when opening a model.
User Interface
Fixed an issue where Revit could lock up and did not react to any commands when using a Network license.
Upgrade
Improved stability when upgrading a 2019 Revit model that contains steel elements with an invalid state.
Worksharing
Increased program stability when network is disconnected mid-session.

Changing and updating Shared Coordinates in Revit can be quite a challenge. At Virtual Built Technology we often create a Revit Control File to manage and transfer project datums, shared coordinates and other compliance items for the project team.

This video describes the techniques and challenges involved in updating and instituting shared coordinates on a Revit project. It also includes the steps involved in adopting other Revit modelling standards and requirements into your file.

Here are some of the tips included in the video:

  • how to un-share coordinates for linked models
  • how to acquire new coordinates
  • checking that coordinates are correct for linked models
  • using Transfer Project Standards – Project Info as a method of fixing coordinates
  • other model compliance steps including: updating base point settings, transferring Phase Settings, loading a Start View for the project
  • copying locator elements
  • copying scope boxes
  • using Dynamo to automatically generate the required worksets for compliance

I have developed a working BIM360 to on-premises backup mechanism. There were a few different ways to go…

 

I initially considered:

  • Hacking Windows Explorer to touch the files in the BIM 360 node and try and trigger the BIM360 Docs download and copy to local PC or network location
  • Developing a Forge app that essentially pulls the desired models out of the BIM 360 cloud to desired location?

In the end, I decided to use the Revit API (Dynamo and Python), along with VirtualBuiltApp, to essentially reverse engineer a folder structure from the local CollaborationCache folder. These ideas are hinted at here.

 

In simple terms, the BIM 360 Docs on-premises backup workflow is:

  1. Create a super federated BIM 360 model (with all other BIM 360 models linked into it)
  2. A Dynamo script reloads all links in order to cache them locally
  3. The same script interrogates, then determines the target file name and folder from VirtualBuiltApp
  4. Dynamo then copies the files into their ‘backup’ location on the local network

 

Some more detail is presented below:

 

A) Cache Cleaner CMD Script (may not really be necessary, as the ‘reload’ should overwrite superseded cache anyway):

Kill Revit if Open… be careful of below steps, particularly if Revit has crashed recently. You might need these local copies 🙂

cd "%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit 2018"
cd CollaborationCache
rmdir oldCache
mkdir oldCache
for /d %i in (*) do move "%~i" oldCache

 

B) Manual steps to setup Revit model environment to run the script:

  1. Open Revit
  2. Open Federated BIM 360 file (worksets closed)
  3. Unload all links
  4. Open all Worksets

 

C) Dynamo Script:
Run Dynamo (Python) script that reloads and unloads all links (this collects .rvt into cache). Key Python commands to use are: RevitLinkType.Load() and RevitLinkType.Unload(None).

Potential Problems:

  • Coordination Monitor alert, no longer exists
  • Instance of link needs Coordination Review
  • “Some numerical data within the imported file was out of range. This numerical data has been truncated.”
  • “Geometry in the file … has extents greater than 20 miles (33km).”

Local cached Models appear into

%LOCALAPPDATA%\Autodesk\Revit\Autodesk Revit 2018\mainCacheFolder\hostModelIdFolder\LinkedModels\*.rvt

 

D) Dynamo Script continues to:
Rename and copy to desired target location. How do we determine this?

Using proprietary VirtualBuiltApp schema:

  1. Use known directory data along with known JSON data for the BIM 360 files (harvested previously by our proprietary systems)
  2. Build list of target paths
  3. Run copy from Dynamo to copy to target network directory

Part of the script:

 

Note: you can actually browse some BIM 360 Docs data in a .sqlite3 file located in path shown below. You can use DB Browser for SQLite as a viewer.

I came across this link to a Dynamo seminar by Sol Amour delivered in Wellington about a month ago. I have had a bit of contact with Sol over the years and he is a Dynamo pro. Cool to see that Dynamo Nodes got mentioned too.

Check out the seminar here.

As you can tell by his headshot, he means business 🙂

There is some more information about the event at this link.

The official build of Dynamo 2.0 is here. There are some big changes, so here are my key takeaways:

  • File format has changed
  • Automatic backups will be saved of 1.x files after upgrade
  • Dynamo 2.0 will run side by side with a previous version
  • New direction is “desktop to web workflows” (bye XML, hello JSON)
  • Custom packages are now separated from built in nodes in the node library
  • ‘Run’ button on the python editor
  • New focus on dictionaries (bye GetItemAtIndex, hello new Dictionary nodes)

Download at this link

Read the official post at this link

The Revit API is actually something pretty special. People will go on and on about how Revit needs this feature or that feature, but the fact is that you can build almost any feature you like with the API. Recently, I have been running quite a few batch operations from the scope of a federated Revit model: so I will have one RVT file, with hundreds of Revit links, and I will process them from that main federated model.

On one recent project, we had to deliver to a Client a linked dataset, with Revit link file paths resolving correctly. As you know, people work in many different IT environments, and the pathing of Revit links may vary widely.

I set up an ‘approved’ list of Revit file paths, that looked something like this:

I knew that in Dynamo with Python I could get a lot of information about linked files using the ExternalFileReference class. What I discovered during this process is that there is a TransmissionData API class that let’s you do some pretty interesting things…

You see, I was thinking I would have to set up a batch method to open this files, change the file paths, and close them. But the TransmissionData class is basically what is implemented in eTransmit for Revit – it allows you to ‘lightly touch’ the Revit file and simply change the Revit link paths, and also set a switch saying ‘this file has been transmitted’. This puts the file in an appropriate state for re-opening in the new path environment. Pretty cool huh?

Once I figured out how to implement those TransmissionData actions in Python, I just had to build a node that, running from the federated model:

  • examines each link for the links inside of it
  • replaces erroneous paths with the correct file path
  • sets the new paths to the file

I did this in the hacky way of a “counter with List.Map” in Dynamo. In the future I’ll probably fix it up to be a ‘proper’ Python script but this works for now. In about an hour it fixed the linked file paths of 600 Revit links, all with the click of a single button 🙂

You can download the main definition here:

External References FINAL

You can get the supporting nodes from GitHub here:

https://github.com/LukeyJohnson/BakeryForDynamo/tree/master/nodes

As usual, please use with care. And it is probably worth backing up your files before running something like this.

It is kinda more Python than Dynamo but hey, you get the picture 🙂

In fact, here is the Python code:

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

from System.Collections.Generic import *

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

from System import Guid

import System

import sys
pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib'
sys.path.append(pyt_path)

import os.path

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

tempvalue = IN[0]
approvedFilenames = IN[1]
approvedFilepaths = IN[2]
targetfilepath = IN[5]

def stripquotes(string):
	string = string[1:-1]
	return string

transData = TransmissionData.ReadTransmissionData(tempvalue)
erefids = transData.GetAllExternalFileReferenceIds()
refdata = []
for x in erefids:
	refdata.append(transData.GetDesiredReferenceData(x))

currentpaths, currenterefType, currenterefPath, pstr = [], [], [], []

for e in refdata:
	currentpaths.append(ExternalFileReference.GetAbsolutePath(e))
	currenterefType.append(e.ExternalFileReferenceType)
	currenterefPath.append(e.PathType)
for s in currentpaths:
	pstr.append(ModelPathUtils.ConvertModelPathToUserVisiblePath(s))
	
filenames = []
for p in pstr:
	templist = os.path.split(p)
	filenames.append(templist[1])
	
newpath = []
indices = []
failpath = []
origcounter = 0
matchrefs = []
newpathtypes, newbools = [], []
pathtypevar = IN[3]
for f in filenames:
	tempindex = approvedFilenames.index(f) if f in approvedFilenames else -1
	indices.append(tempindex)
	if tempindex == -1:
		failpath.append(origcounter)
		pass
	else:
		newpath.append(ModelPathUtils.ConvertUserVisiblePathToModelPath(stripquotes(approvedFilepaths[tempindex])))
		matchrefs.append(erefids[origcounter])
		newpathtypes.append(pathtypevar)
		newbools.append(True)
	origcounter = origcounter + 1

currentfilepathstring=ModelPathUtils.ConvertModelPathToUserVisiblePath(targetfilepath)
elementcount = len(erefids)
hostfile = currentfilepathstring * elementcount
currentdata = []
#currentdata.append(transData)
currentdata.append(hostfile)
currentdata.append(erefids)
currentdata.append(refdata)
currentdata.append(currentpaths)
currentdata.append(currenterefType)
currentdata.append(currenterefPath)
currentdata.append(pstr)
currentdata.append(filenames)

newdata = []
newdata.append(indices)
newdata.append(newpath)
newdata.append(matchrefs)
newdata.append(newpathtypes)
newdata.append(newbools)

setlength = len(newpath)
setcounter = range(setlength)
successreport = []
setdata = IN[4]
if setdata:
	for s in setcounter:
		try:
			transData.SetDesiredReferenceData(matchrefs[s], newpath[s], newpathtypes[s], newbools[s])
			successreport.append("Success setting data")
		except:
			successreport.append("Failure setting data")
else:
	successreport.append("You need to set the switch to True")

if setdata:
	try:
		transData.IsTransmitted = True
		transData.WriteTransmissionData(targetfilepath, transData)
		successreport.append("Success WRITING data")
	except:
		successreport.append("Failure WRITING data")
		
#Assign your output to the OUT variable.
OUT = successreport, currentdata, newdata
 

If you want to read more about the API methods used:

TransmissionData

ModelPathUtils

ExternalFileReference

So, you are modelling this awesome conceptual design with Dynamo and Revit, and you realise “hey, what we need is access to the Star Wars API in here…”

Yes? Well, thanks to Jostein Berger Olsen, you can just open up your Package Manager and install SWAPI package:

swapi.png

And do stuff like this:
starwars.png

Nice work @jos_ols 🙂

Check out the original post:
Revit Dynamite and Ammo: Star Wars API and Dynamo