I previously posted about how to quickly repath links based on some control mechanisms. Enter BIM 360, and the wild world of Revit cloud worksharing… I expect that it will be commonplace now for existing projects and datasets to move across to BIM360 ‘mid project’. But that creates some interesting problems, like creating folders, dealing with the initiation process, and replacing local Revit Links with their cloud versions.

This post is focused on that process of changing all of the Revit link paths to link to the BIM 360 models. Unfortunately, the previous method I used (TransmissionData, like eTransmit) is not available for cloud hosted models. So how do we automate this process?

We went about it this way:

  1. Initiate all Revit models on the BIM 360 Document Management cloud (manually, for now)
  2. Create one federated model on the BIM 360 cloud that links in all the other cloud hosted Revit models. You might do this one manually, using Reload From in the Manage Links dialog box.
  3. Once you have that one ‘super host model’, use a batch process to harvest all of the cloud model data
  4. Using the harvested data, create a script that implements a Reload From method to batch reload local models from their cloud counterpart

On the journey to solving step 3, I experimented with a few different methods. I discovered that you need to use the ExternalResource class to get information about BIM 360 cloud models (not ExternalReference).

I also realised that I had to deal with Reference Information, which appears to be a .NET dictionary per link that stores some funky Forge IDs and so on. But I want to store all this data in our VirtualBuiltApp BIM Management system, so I had to serialise the Reference Information to a string that could be stored in a database VARCHAR field (or push to Excel if you are still doing things the old way). Dimitar Venkov gave me a few tips about using JSON with IronPython in Dynamo (thanks mate!), so after that all the harvesting pieces were in place!

Here is some of the harvesting and JSON code. Notice that I played around with using a container class to pass data between Dynamo nodes. In the end, JSON string was the answer:

 data = []
for u in unwraps:
    data.append(u.GetExternalResourceReference(linkresource))

class dummy(object):
    def ToString(self):
        return 'container'
container = dummy()

sdicts = []

for y in data:
    dictinfo = ExternalResourceReference.GetReferenceInformation(y)
    container.dictinfo = dictinfo
    infos.append(container)
    shortnames.append(ExternalResourceReference.GetResourceShortDisplayName(y))
    versionstatus.append(ExternalResourceReference.GetResourceVersionStatus(y))
    insessionpaths.append(y.InSessionPath)
    serverids.append(y.ServerId)
    versions.append(y.Version)
    sdicts.append(json.dumps(dict(dictinfo)))

The next step was to create the ‘batch reload from’ tool. Now that we had the necessary data, we just had to use it to grab the matching cloud path information (from our database) and apply it to each Revit link.

I created a node that essentially built a new reference path from the JSON and other data that we had harvested. Here is some of that code:

 des = []
for x in referencesInfo:
    des.append(json.loads((x)))
newdicts = []
for y in des:
    newdicts.append(Dictionary[str, str](y))

serverGuids = []
for g in serverIdsIn:
    tempguid = Guid(g)
    serverGuids.append(tempguid)

newrefs = []
for z in range(len(referencesInfo)):
    serverIdIn = serverGuids[z]
    referenceInfo = newdicts[z]
    versionInfo = versionsInfo[z]
    sessionPathIn = sessionsPathIn[z]
    tempRef = ExternalResourceReference(serverIdIn, referenceInfo, versionInfo, sessionPathIn)
    newrefs.append(tempRef)

OUT = newrefs

The final step was to get a RevitLinkType and a matching ReferenceInformation and apply them to each other. I stored the data in our cloud based BIM Management Application, VirtualBuiltApp. Then I could easily just pull the data into Dynamo with a suitable database connector, and match up the RevitLinkType in the current file with its associated cloud identity. For that genuine 90s feel, you could use Excel to store the data as it is just a JSON string and some other strings:

Here is the key bit of code that actually changes the link path (without all of my other error checking bits and pieces):

     try:
        newCloudPath = newCloudPaths[l]
        reloaded = fileToChange.LoadFrom(newCloudPath, defaultconfig)
        successlist.append(reloaded.LoadResult)
        TransactionManager.Instance.ForceCloseTransaction()
    except:
        successlist.append("Failure, not top level link or workset closed")

To actually implement the script and get productive, I opened 4 instances of Revit, and then used this process in each instance:

  1. Open the Revit file from BIM 360, with Specify… all worksets closed
  2. Unload all links
  3. Open all worksets
  4. Run the Reloader Script
  5. Confirm link status in Manage Links
  6. Optional: Add ‘bim 360 links loaded’ text to Start View (just for tracking purposes)
  7. Optional: Add comment to VirtualBuiltApp (optional, for tracking purposes)
  8. Close and Sync

In this way I can have 4 or more sessions operating concurrently, fixing all the link paths automatically, and I just need to gently monitor the process.

One nice thing is that I set the script up to immediately Unload a link after it had obtained and applied the new Path information. This means that the Revit instance does not get bogged down with many gigs of link data in memory, and in fact this is way faster than trying to use Manage Links for a similar process.

Ideally I would like to fully automate this, to the point where it opens each file, runs the script, and syncs. Unfortunately, time didn’t allow me to get all the code together for that (for now).

Finally, because we are using our custom built schema and validation tools, we can easily create visuals like this:

Modified versions of the Dynamo graphs can be found on the Bakery Github here:

dyn folder

Revizto continues to improve its very powerful web Dashboard features. The web Dashboard gives a live view of issues for your team, and can be completely customised to give the most focused overview of your current project Status.

To create a web Dashboard and Group by Tag, just follow these easy steps:

      1. Open https://ws.revizto.com and access the Project you want to work on
      2. Click on Dashboard
      3. Click “Add New Dashboard”
      4. In the Dashboard view, click “Add New Chart”
      5. Customise the chart to include only certain tags, and enable the Grouping by Tags function. Below is an example:

In the above example, you can see how I included only the high level tags that are used (on this project) to keep track of the construction zone of specific issues. Then, the Grouping function slices those issues and gives us quick insight into the Zones requiring immediate action by the project management team.

I’m sure you can see how easy it is to setup powerful and focused dashboards to successfully manage your BIM and Construction team with these new web features in Revizto.

Here are the other currently supported Grouping categories in Revizto:

To be able to use the new BIM360 Design or BIM 360 Document Management in Revit you need to be able to see ‘Document Management’ after clicking the BIM 360 link in the Revit Open Dialog box:

  1. Revit 2018.3 (or newer) is required and a direct download link can be found here.
  2. Download and install Desktop Connector for Windows.
  3. Download and install the Desktop Connector for BIM 360 plugin.
  4. Restart your machine if not prompted to do so.

I have added these steps to my public OneNote notebook on using BIM 36o with Revit:

Installation  (Web view)

 

Check out this page from Autodesk Knowledge base. Notice how it describes three different ways of linking for BIM 360 Design projects that involve Revit worksharing:

  • Method 1 – Controlled Sharing – ‘Consume’ Published Models from Packages
  • Method 2 – Controlled Sharing – Link from the Shared Folder
  • Method 3 – Live Linking

Each method requires fundamentally different sharing standards, and varying degrees of prior BIM 360 permissions and team setup.

Notice that Method 1 includes the concept of ‘packages’. The overall intention here is to try to emulate some existing workflows. While BIM files continuously change during project development, in traditional workflows a ‘team’ only interacts with a snapshot of the available BIM data from other teams (a package).

At this point, it is key to keep in mind that these different methods exist, and if you are a BIM Manager on a BIM 360 Design with Revit project, you will need to discuss and agree on the linking Method for managing the Revit data throughout the BIM creation phase of the project.

 

Interesting to see that many BIM360 services are offline right now (approx 10am Australian time, 1 June 2018):

You can always check Autodesk online service health at this link:

Autodesk Health Dashboard

 

It is something to think about as we move forward with reliance on cloud services – how important is 100% uptime with collaboration cloud products in the BIM world? Is 100% uptime even possible with current technology services, and the stacks (like Autodesk cloud) that rely on other stacks (like AWS cloud)?

When using MySQL with Power BI Desktop, you may come across this error:

Value 'preferred' is not of the correct type

 

It seems that this is caused by an incompatibility between Power BI Desktop and a later MySQL Connector Net version. First, check your version:

If you are running the MySQL Connector Net 8.0.11, you may experience the error described above. To resolve the issue, install the older version:

  1. Close Power BI Desktop
  2. Uninstall MySQL Connector Net 8.0.11
  3. Install MySQL Connector Net 6.10.7 (from here)
  4. Open Power BI Desktop
  5. The error “Value ‘preferred’ is not of the correct type” should be resolved, and you can use MySQL with Power BI again

At Virtual Built, we typically create a federated Revit model for every project we work on. This allows us to run a host of automated processes on the links, right from the federated file.

Recently we received a dataset for a high rise building. The Architect had used 5 typical linked ‘module’ files, copied throughout a master file.

Initially, I used a Dynamo script to collect all the link instances into a saved selection set. I could then copy / paste aligned the link instances into our federated Revit model:

Link Instances to Selection Set

 

The Problem

This works fine, but in this models there were also nested consultant links inside the Architectural linked modules. So we have:

Architectural container file -> Architectural module files -> Consultant nested links

 

We want:

Federated Central file -> Everything else (no nested links)

 

Next challenge: how can we quickly promote those nested links into our federated model? Well, we currently have the module files populated, so how can we leverage those positions to promote the nested links?

 

Promoting Nested Links

It is a bit hacky, but here is how I went about it. For each module file:

  1. Create an empty proxy file (New Revit project, no template)
  2. Open the Module file and resolve all link paths (so they are loaded)
  3. Set links to Attachment
  4. Copy / paste the link Instances from the module file (Level 0 or Base Level) into the empty file (Level 1, default level). You can use Dynamo graph above.
  5. Save the new proxy file as ‘ModuleContainer’ or similar. We know have a file that only has link instances in it.
  6. Open a detached copy of the Federated Central file (you can save as temporary copy if you like)
  7. Manage Links
    • Select the current Module file,
    • Reload From,
    • replace with the ModuleContainer you created. Once you have done all the modules, you are ready for binding as described below.

After populating the detached Federated Central file, we just need to Bind and then Copy / Paste the free instances:

  1. After load, Bind the ModuleContainer files to the detached Federated Central model
    1. To do this, right-click on the file in Revit Links in Project Browser

    2. Select All Instances – In Entire Project
    3. In the Ribbon, click Bind Link
    4. Untick Attached Details, Levels, Grids
    5. Click Remove Link when prompted
    6. Your nested links are now promoted!
  2. Optional: Ungroup all of those bound free instances (select all from Project Browser, Ungroup in Ribbon)
  3. Open the real Federated Central file
  4. Copy / paste the populated free instances from the detached Federated Model to the real Federated Model. Use the Dynamo script to collect them.
    Tip: Paste into a closed workset for better performance.
  5. Close the detached one, and sync the real one

The only thing we technically ‘broke’ or lost in this process is the module link->nested link relationship. So if someone decides to move one of the nested links in the module link, obviously that won’t replicate into the Federated Central file.

Hope this helps some of you out there building or dealing with large federated models.

 

I’m looking into ways to batch initialize Revit models onto the new BIM 360 Docs (Document Management) platform. It is a work in progress at the moment – in Revit 2018, I think that there is limited ability to use newer API features for creating a Cloud ModelPath for batch processing. But more on that later…

For now, I wanted to replicate a folder structure from a local network onto the BIM 360 Docs platform. To do this, you just need the Desktop Connector + Preview installed, and then you copy and paste the data.

Here are the steps:

  1. Clear Pending Actions on Desktop Connector for BIM 360 (recommended, use with care)
  2. Work Offline (recommended). Folders will appear blue in Windows Explorer.

  3. Set the folder path in the and create a CMD script using code below. It populates each subdirectory with a text file indicating the contents of the directory.
    @echo off
    chcp 65001 >nul
    for /r "C:\Your\Folder\Path\Here" %%d in (.) do dir /a:-d "%%~fd" > "%%~dpnd\DirectoryFilePlaceholder.txt"
  4. Run the script on your target directory (the local directory that you want to mirror into BIM 360 Document Management platform)
  5. Run a FreeFileSync task with filters to include only the ‘DirectoryFilePlaceholder.txt‘ as a mechanism of building the file structure. This task copies those txt documents to the BIM 360 using the local Desktop Connector path, as shown here:
  6. Then, disable ‘Work Offline’, so the sync to cloud should begin.
  7. Wait for ‘Processing’ to complete

To force the sync you may have to toggle the ‘Offline’ status in the tray.

You can review sync state with the ‘Pending Actions’ link from the system tray:

After the file structure is copied and synced, you will be able to see it in BIM360 Docs.

You can then proceed with adding Permissions or uploading other files.

New versions of Firefox removed some support for extensions that allowed multiple tab rows. Here is how you can enable it:

  1. Type about:support in url field of firefox, hit enter.
  2. On the ‘Profile Folder’ setting (about 8th from the top) click the ‘Open Folder’ button.
  3. Create a ‘chrome’ subfolder, if you don’t already have one.
  4. Inside that folder create a file called ‘userChrome.css’ (right click > new > text document – make sure to name the file userChrome.css and not userChrome.css.txt or something)
  5. Open the file for editing and paste the contents of this file;
    https://gist.githubusercontent.com/forexhill/b0446cc31e5001c9e87754df83f0f1ca/raw/f4f1a807d43434a1f10908364dec56ecdf08422c/gistfile1.txt 411
    Into it.
  6. Restart FF and you should have multi row tabs

This comes from user fh1 at this link