Over the last 3 months I’ve been busy working hard on coordinating the BIM for an existing infrastructure study of a hospital. The site consists of everything from heritage listed sandstone buildings constructed in the 1800s where for obvious reasons there are no existing drawings to a building that’s currently in the final stages of construction and has been fully designed and coordinated in BIM. The infrastructure study involved locating assets and services that interconnected between buildings within relatively accurate space within the BIM at LOD 200 as per the BIMForum guidelines.
When it came to the BIM, we decided to work with one building per MEP model which meant we had 28 MEP building models, 28 architecture building models that were created using a series of stacked DWG files and 4 site models. The obvious problem with so many models was going to be the consistency of the data and how we would go about verifying that data. Ensuring that we had all 60 models with the same information consistent information was a mountainous task that would have taken an exorbitant amount of hours to complete if manually reviewed, even if utilising BIMLink.
Enter stage left: Dynamo.
We used Dynamo far more extensively on this project than any that I have worked on before. Normally I’d work with little snippets to process small amounts of data and automate minor repetitive tasks, but this project was a real BIM project; there were no traditional drawing deliverable which actually seemed to genuinely baffle newcomers to the project. The deliverable was the federated model and more importantly the information contained within all the individually modeled elements. A few hours on one of my Sundays and I ended up with what you see below
That structured mess was able to verify photo file names and associated photo URLs, it verified asset codes were correct and if they weren’t, it generated new asset codes in the required format, it also checked and corrected all the information required to generate those new asset codes and finally probably the simplest part of it all, it filled the project information parameters for us. It was run on all MEP models, with another run on all the architecture models that we created.
Although we were able to automate a lot of really mundane processes, they were for the most part fairly project specific so even though the Dynamo script itself was invaluable to the project, other than the experience provided it doesn’t hold that much value for future projects. There was however one custom node that I put together for the population of Project Information parameters that will probably get used again and again on projects in the future.
Each input of the node is filled with a string for each individual parameter. In the project, the building name/number parameter relied on the levels within the model being named correctly for which there was another portion of the script that checked that the naming conventions for levels were followed.
The processing of the data itself is performed by Python code inside the custom node, after which the output showed the data that has been filled. You can either pick the custom node up from the MisterMEP Dynamo package or if you want to recreate this yourself the Python code is below
import clr clr.AddReference("RevitServices") import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument projinfo = doc.ProjectInformation #The inputs to this node will be stored as a list in the IN variables. OrgName = IN OrgDesc = IN BuildNumber = IN ProjAuthor = IN ProjDate = IN ProjStat = IN ProjClient = IN ProjAddress = IN ProjName = IN ProjNumber = IN TransactionManager.Instance.EnsureInTransaction(doc) projinfo.OrganizationName = OrgName projinfo.OrganizationDescription = OrgDesc projinfo.BuildingName = BuildNumber projinfo.Author = ProjAuthor projinfo.IssueDate = ProjDate projinfo.Status = ProjStat projinfo.ClientName = ProjClient projinfo.Address = ProjAddress projinfo.Name = ProjName projinfo.Number = ProjNumber TransactionManager.Instance.TransactionTaskDone() elementlist = list() elementlist.append("DONE!") elementlist.append(projinfo.OrganizationName) elementlist.append(projinfo.OrganizationDescription) elementlist.append(projinfo.BuildingName) try: elementlist.append(projinfo.Author) except: elementlist.append(list()) elementlist.append(projinfo.IssueDate) elementlist.append(projinfo.Status) elementlist.append(projinfo.ClientName) elementlist.append(projinfo.Address) elementlist.append(projinfo.Name) elementlist.append(projinfo.Number) OUT = elementlist #OUT = "done"