Diary of a Wimpy BIM Manager: Tales of Iffat Mai

Diary of a Wimpy BIM Manager: Tales of
In-House Revit® API Development for Architects
Iffat Mai
Practice Application Development Manager
Perkins+Will
Thanks to:
Poll
1. Discipline




Architect
Engineer
Programmer
Other
2. Revit



Very experienced
Quite experienced
Not experienced
3. Revit



Experience
API Skill
Very experienced
Quite experienced
Not experienced
Overview






Introduction
Overview of Revit API
Tool Development Process
Demo of sample tools
Walk through some codes
Resources
Objective

Share in-house Revit API tool development process

Do it in-house or out-source the development work

Inspire BIM Manager to take on the Revit API challenge
Background




Architectural Degree from MIT
Worked with MIT media lab (have some programming skills)
Twenty plus years of experience of working in the Architectural
field in NYC.
Started as an Arris user (Unix)
 AutoCAD user (DOS, Windows)
 CAD Manager
 IT Manager
 Digital Design Manager
 BIM Manager
 Research Manager/Application Developer
Perkins + Will and Autodesk Revit

Began implementation in 2004

Revit Architecture is our Core BIM Application

Team of 24+ Design Applications Professionals supporting Projects

850+ Staff trained in-house

Over 180 projects are completed or underway

Committed to Use BIM Methods for 100% of our Projects
Kempinski Hotel + Residences
Revit Experience

Familiar with Autodesk® Revit® Architecture

Have an architectural design background

Trained and supported architectural teams to use Autodesk®
Revit® Architecture

Began developing with API in 2007

I’m an Autodesk® Revit® BIM Manager who learned API
programming
Why Customize Revit?




Automate repetitive work
Processing large quantity of data
Facilitate import & export
Synchronize data
What is Revit API?

API = Application Programming Interface
AutoCAD API vs. Revit API
AutoCAD API





Scripts
Lisp
ObjectARX
ActiveX
AutoCAD.Net
Revit API


.Net
VSTA
Revit API History
Revit 5
No API
Revit 6
No API
Revit 7
No API
Revit 8
First Public API for Building and Structure
Revit 9
More Element Creation Added
Revit Architecture 2008
Revit API SDK released
Revit Architecture 2009
VSTA Released. API for MEP added
Autodesk Revit Architecture 2010
Developer’s Guide released
Autodesk Revit Architecture 2011
RevitAPI.dll and RevitAPIUI.dll split
Revit API Namespace Changes
Revit 2011 divides the API three primary namespaces:
 Autodesk.Revit.ApplicationServices


Autodesk.Revit.DB


Classes accessing application settings and options
Classes accessing file data
Autodesk.Revit.UI

Classes accessing or customizing the user interface
Revit API Namespaces
Revit API Platform
Application
Services
Database
User Interface
(Revit.DB)
(Revit.UI)
Structure
Architecture
MEP
(Revit.DB.Structure)
(Revit.DB.Architecture)
(Revit.DB.Mechanical)
(Revit.DB.Electrical )
(Revit.DB.Plumbing)
(Revit.ApplicationServices)
.Net vs. VSTA
DECAF
.Net


Editor: Microsoft Visual Studio
Program language





VSTA



VB.net
C#
Create external tools/App
Exist outside of Revit
Use across many Revit
Projects
Editor: Built-in inside Revit
Program language




VB.net
C#
Create Macro
Exist inside of Revit
Use only in the Projects it was
created or loaded in
Microsoft Visual Studio


.Net Framework 3.5
Editor(IDE)  Microsoft Visual Studio
(http://www.microsoft.com/express/Downloads)
Parlez Vous C Sharp?

Language Options:








C#
VB.net
C++
Most sample codes in SDK are written in C#
VB.net is much more readable
VB.net is not case sensitive.
VB.net - Intellisense can automatically corrects Keywords and
variable names
Use web translator to convert C# to VB
(http://www.developerfusion.com/tools/convert/csharp-to-vb/)


Both compiles and runs at the same speed
You can reference .dll written in other language.
VB.NET vs. C#
VB.NET
Imports System
Namespace Hello
Class HelloWorld
Overloads Shared Sub Main(ByVal args() As String)
Dim name As String = "VB.NET"
'See if an argument was passed from the command line
If args.Length = 1 Then name = args(0)
Console.WriteLine("Hello, " & name & "!")
End Sub
End Class
End Namespace
C#
using System;
namespace Hello {
public class HelloWorld {
public static void Main(string[] args) {
string name = "C#";
// See if an argument was passed from the command line
if (args.Length == 1)
name = args[0];
Console.WriteLine("Hello, " + name + "!");
}
}
}
(Source: http://www.harding.edu/fmccown/vbnet_csharp_comparison.html)
Autodesk Revit SDK



SDK = Software Development ToolKit
Install from Autodesk Revit Installation disk
Download from Autodesk Developer Center



http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975
.NET code samples and documentation
Useful tools
Autodesk Revit SDK




Add-In Manager
RevitLookup
RevitAPI.chm
Revit 2011 Developer Guide.pdf
Training

DevTV: Introduction to Revit 2011 Programming - Part 1 - New!


http://download.autodesk.com/media/adn/DevTV_Revit_API_2011_English_Part1/Revit_2011_DevTV_EN.html
DevTV: Introduction to Revit 2011 Programming – Part 2 - New!

http://download.autodesk.com/media/adn/DevTv_Revit_NET_English-Part2/Revit%20DevTV%20%20part%202.html
.NET
Microsoft Visual Studio
VB.Net
Revit API SDK
Tool Development Process
Documentation
Coding
Tool
Proposal
Feasibility
Study
Training
Debugging
Maintenance
Specification
Testing
Deployment
Tool Proposal





Welcome ideas from all users
Showcase your tools to encourage more ideas.
End user – task specific tools
Design Application Manager – common issue tools
Technical Directors

Quality control
 Standard enforcement
 Process enhancement
Feasibility Study
Can you do it with Revit API?
How long will it take to do it?
What is my ROI?
Can you do it using Revit API?







Can the steps be done manually via the User Interface?
Use Revit LookUp tool to trace the object
Check with RevitAPI.CHM reference to see what properties and
methods are available
Review the Revit API Developer’s Guide.
Look at the SDK sample folder for similar application
Search Revit API blogs and Forum on the internet
Verify with ADN support that it can be done
How long will it take to develop?

How familiar are you with Revit API?
How good are you with .Net programming
Is the logic and task very straight forward?
Is there an existing sample application that you can modify?
Make your best estimate

Then multiply by 3x




What is my ROI?

How often will they use the tool on this project?

One time only
 Only during one phase
 Used through out the entire project

Can this tool be used on other projects?

Not at all
 If parameter and variable are customizable
 Yes, all the time!
Specification





Clearly define input and output requirement
Describe in details all the functions the
application will have.
Work out the logics of how the tool will flow
Sketch out flow chart for visual overview
Cartoon sets of the input and output forms
and reports
Coding, Debugging & Testing








Use Revit API template to start
Use SDK sample application as a base
Set Microsoft Visual Studio Debug property to start Revit
Add option to automatically load test file
Use small test file for initial testing
Use copies of actual project files for later testing
Solicit project team members to test the application
Implement feedback to improve design and performance
Documentation, Training & Maintenance





Add comments inside the codes for documentation
Create user guide documentation
Add Help button that will take the user directly to the
documentation
Provide video snippet for self-guided training
Maintenance for version upgrade is required for every new
Revit API release.
Deployment






Consolidate all tools into one folder
Create a Ribbon ExternalApplication that
contains all the tools as buttons.
Copy the DLL folder to the local machines
Maintain subfolder for version control
Copy .addin manifest file to designated
Revit addins folder
Keep icon files in a separate folder
ExternalApplication Ribbon




Create Ribbon file to combine all commands
Design Ribbon icons
Read Autodesk Icon Guidelines.pdf
Check out Ribbon sample file in the SDK
SDK Samples Category












Basics
Geometry
Parameters
Elements
Families
Materials
Annotation
Views
Rooms/Spaces
Data Exchange
MEP
Structure
Tools Demo

Data Manipulation Tools

Batch Tools

Design Tools

Utility Tools
Data Manipulation Tools



Export Drawing List to Excel
Import updates from Excel
Add new sheets from Excel
Design Tool


SDK – Sample>Massing
MeasurePanelArea
Measure Panel Area (Update)
protected IList<Element> GetPanels()
{
FilteredElementCollector collector
= new FilteredElementCollector( m_uiDoc.Document);
BuiltInCategory bic = BuiltInCategory.OST_CurtainWallPanels;
collector.OfClass( typeof( FamilyInstance ) ).OfCategory( bic);
IList<Element> panels = collector.ToElements();
return panels;
}
Source: http://thebuildingcoder.typepad.com/blog/installation/
Batch Tools

Door Renumber
 Renumber door number to match
room number
Utility Tool – Find Dwg
Find Dwg

Problem:

Dwg can be linked and imported
 Often Dwg files can’t be found after it is inserted
 I want to be able to find it and delete it if I want to.

Solution:

Filter elements till I find DWG
 Present them in a list
 Give user the option to View
and Delete
Revit LookUp Tool

RvtMgdDbg  Revit Lookup
Anatomy of Find Dwg Tool
Command
IExternalCommand
CommandData
CommandData
Filter
DwgList (Form)
Dwg
Obj
Array
Anatomy of Find Dwg Tool



Command.vb
DwgList.vb (Form)
DwgObj.vb
Reference Revit Assemblies

Revit required assemblies:



C:\Program Files\Autodesk\Revit Architecture 2011\Program\RevitAPI.dll
C:\Program Files\Autodesk\Revit Architecture 2011\Program\RevitAPIUI.dll
Set property of the dll to:

Copy Local = False
 Specific Version = True
Command.vb
Imports Autodesk.Revit
Imports
Imports Autodesk.Revit.UI
Imports System.Windows.Forms
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)> _
Attributes
<Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Automatic)> _
<Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)> _
Public Class Command
Implements IExternalCommand
Command Class Begin
Private m_revit As Autodesk.Revit.UI.UIApplication
Public Function Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
ByRef message As String, _
ByVal elements As Autodesk.Revit.DB.ElementSet) _
As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalCommand.Execute
m_revit = commandData.Application
Dim displayForm As New DwgList(commandData)
Implements
IExternalCommand
Function Execute
Using (displayForm)
If displayForm.ShowDialog() <> DialogResult.OK Then
Return Autodesk.Revit.UI.Result.Cancelled
End If
calls
DwgListForm
End Using
displayForm.Dispose()
Return Autodesk.Revit.UI.Result.Succeeded
End Function
Sub Finalize
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
End Class
Command Class End
IExternalCommand
Implements IExternalCommand
Private m_revit As Autodesk.Revit.UI.UIApplication
Public Function Execute(ByVal commandData As Autodesk.Revit.UI.ExternalCommandData, _
ByRef message As String, _
ByVal elements As Autodesk.Revit.DB.ElementSet) _
As Autodesk.Revit.UI.Result Implements
Autodesk.Revit.UI.IExternalCommand.Execute
m_revit = commandData.Application
Dim displayForm As New DwgList(commandData)
Using (displayForm)
If displayForm.ShowDialog() <> DialogResult.OK Then
Return Autodesk.Revit.UI.Result.Cancelled
End If
End Using
displayForm.Dispose()
Return Autodesk.Revit.UI.Result.Succeeded
End Function
Anatomy of Dwg Obj Tool
Name
ElementID
Dwg
Obj
Type
ViewType
BaseLevel
DwgList Class
Public Class DwgList
'a reference to the external command data.
Private m_commandData As ExternalCommandData
''' <summary>
''' Constructor
''' </summary>
''' <param name="commandData">the external command data</param>
Public Sub New(ByVal commandData As ExternalCommandData)
MyBase.New()
InitializeComponent()
m_commandData = commandData
Initialize()
End Sub
Filter
Dim ImportInstanceFilter As New
ElementClassFilter(GetType(DB.ImportInstance))
iter = New FilteredElementCollector(doc)_
.WherePasses(ImportInstanceFilter)_
.GetElementIterator()
Looping (Do While…Loop)
'Move to the first instance symbol
iter.Reset()
'Create a array of DwgObjList
Do While iter.MoveNext
If (Not (iter.Current) Is Nothing) Then
sym = iter.Current
sym_name = sym.Parameter(ImpSymName).AsString
ins_id = sym.Id
ins_size = sym.Parameters.Size
parByName = iter.Current.Parameter(csParamToFind)
Is2D = iter.Current.Parameter(csParam2D)
Linked = sym.IsLinked
LinkedType = "N.A."
viewname = "N.A."
baselevel = "N.A."
Creating DwgObj Array
DwgObjList.Add(New DwgObj(sym_name, ins_id,
LinkedType, viewname, baselevel))
Name
ElementID
Dwg
Obj
Type
ViewType
BaseLevel
Tool Deployment

Compile .dll
Create .addin manifest files
Pushout the dll and .addin files to local machines

Or

Use Add in Manager to load the external tool manually


Register .addin Manifest file
<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Command">
<Text>$projectname$</Text>
<Description>Some description for $projectname$</Description>
<Assembly>$destinationdirectory$\$safeprojectname$.dll</Assembly>
<FullClassName>$safeprojectname$.Commands</FullClassName>
<ClientId>$guid1$</ClientId>
</AddIn>
</RevitAddIns>
GUID

GUID = Globally Unique Identifier
http://www.guidgenerator.com/online-guid-generator.aspx
Addin File





Revit requires the add-in to be registered BEFORE it starts
Open the FindDwg.addin file
Edit the <Assembly> to reflect the actual location of .dll
Copy the .dll to one of the following locations:
- For the current Windows User only


- For all users


%ALLUSERSPROFILE%\Autodesk\REVIT\Addins\2011
For Windows XP –


%APPDATA%\Autodesk\REVIT\Addins\2011
C:\Documents and Settings\All Users\ApplicationData\Autodesk\Revit\Addins\2011\
For Vista/Windows 7 –

C:\ProgramData\Autodesk\Revit\Addins\2011\
How to run the Tool?


Go to Addin Tab > External Commands dropdown,
select “FindDwg”
Or

Create a custom Application with a Ribbon button for the
command
Blogs





Bolt Out Of The Red – Guy Robinson http://redbolts.com/blog/
Revit Programming – Ed Pitt - http://revitprogrammer.blogspot.com/
The Building Coder – Jeremy Tammik http://thebuildingcoder.typepad.com/blog/
CAD Application Development – Matt Mason http://cadappdev.blogspot.com/
Rod Howarth – Rod Howarth http://roddotnet.blogspot.com/
Revit Resource Guide
Revit Resource Guide – by Rod Howarth
(http://blog.rodhowarth.com/2010/03/revit-api-resource-guidefree-download.html)

Summary




Knowing Revit API gives you an edge over your competition
Learning Revit API has become a lot easier than ever before
To do or not to do (in-house vs. out-sourcing) ?
Give yourself an early Holiday present – Learn Revit API!
Please Complete the Survey!
Q&A
Email:
Iffat.mai@perkinswill.com
Autodesk [and other] are registered trademarks or trademarks of Autodesk, Inc., and/or its subsidiaries and/or affiliates in the USA and/or other countries. All other brand names, product names, or trademarks belong to
their respective holders. Autodesk reserves the right to alter product and services offerings, and specifications and pricing at any time without notice, and is not responsible for typographical or graphical errors that may
appear in this document. © 2010 Autodesk, Inc. All rights reserved.