Revit 2012 API Developer Guide PDF
Revit 2012 API Developer Guide PDF
Developers Guide
Copyright. 2011 Autodesk, Inc.
All Rights Reserved
This publication, or parts thereof, may not be reproduced in any form, by any method, for any purpose.
AUTODESK, INC., MAKES NO WARRANTY, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE REGARDING THESE MATERIALS, AND MAKES SUCH MATERIALS AVAILABLE
SOLELY ON AN "AS-IS" BASIS. IN NO EVENT SHALL AUTODESK, INC., BE LIABLE TO ANYONE FOR SPECIAL, COLLATERAL, INCIDENTAL, OR
CONSEQUENTIAL DAMAGES IN CONNECTION WITH OR ARISING OUT OF ACQUISITION OR USE OF THESE MATERIALS. THE SOLE AND EXCLUSIVE
LIABILITY TO AUTODESK, INC., REGARDLESS OF THE FORM OF ACTION, SHALL NOT EXCEED THE PURCHASE PRICE, IF ANY, OF THE MATERIALS
DESCRIBED HEREIN.
Autodesk, Inc., reserves the right to revise and improve its products as it sees fit. This publication describes the state of the product at the time of publication, and
may not reflect the product at all times in the future.
Autodesk Trademarks
The following are registered trademarks or trademarks of Autodesk, Inc., in the USA and other countries: 3DEC (design/logo), 3December, 3December.com, 3ds
Max, ActiveShapes, Actrix, ADI, Alias, Alias (swirl design/logo), AliasStudio, Alias|Wavefront (design/logo), ATC, AUGI, AutoCAD, AutoCAD Learning Assistance,
AutoCAD LT, AutoCAD Simulator, AutoCAD SQL Extension, AutoCAD SQL Interface,Autodesk, Autodesk Envision, Autodesk Insight, Autodesk Intent, Autodesk
Inventor, Autodesk Map, Autodesk MapGuide, Autodesk Streamline, AutoLISP, AutoSnap, AutoSketch, AutoTrack, Backdraft, Built with ObjectARX(logo), Burn,
Buzzsaw, CAiCE, Can You Imagine, Character Studio, Cinestream, Civil 3D, Cleaner, Cleaner Central, ClearScale, Colour Warper, Combustion, Communication
Specification, Constructware, Content Explorer, Create>what's>Next> (design/logo), Dancing Baby (image), DesignCenter, Design Doctor, Designer's Toolkit,
DesignKids, DesignProf, DesignServer, DesignStudio, Design|Studio (design/logo), Design Your World, Design Your World
(design/logo), DWF, DWG, DWG (logo), DWG TrueConvert, DWG TrueView, DXF, EditDV, Education by Design, Extending the Design Team, FBX, Filmbox,
FMDesktop, GDX Driver, Gmax, Heads-up Design, Heidi, HOOPS, HumanIK, i-drop, iMOUT, Incinerator, IntroDV, Kaydara, Kaydara (design/logo), LocationLogic,
Lustre, Maya, Mechanical Desktop, MotionBuilder, ObjectARX, ObjectDBX, Open Reality, PolarSnap, PortfolioWall, Powered with Autodesk Technology,
Productstream, ProjectPoint, Reactor, RealDWG, Real-time Roto, Render Queue, Revit, Showcase, SketchBook, StudioTools, Topobase, Toxik, Visual, Visual
Bridge, Visual Construction, Visual Drainage, Visual Hydro, Visual Landscape, Visual Roads, Visual Survey, Visual Syllabus, Visual Toolbox, Visual Tugboat,
Visual LISP, Voice Reality, Volo, and Wiretap.
The following are registered trademarks or trademarks of Autodesk Canada Co. in the USA and/or Canada and other countries: Backburner, Discreet, Fire, Flame,
Flint, Frost, Inferno, Multi-Master Editing, River, Smoke, Sparks, Stone, Wire.
Third Party Trademarks
All other brand names, product names or trademarks belong to their respective holders.
Third Party Software Program Credits
ACIS Copyright. 1989-2001 Spatial Corp. Portions Copyright. 2002 Autodesk, Inc. Copyright. 1997 Microsoft Corporation. All rights reserved. Flash 2 is a
registered trademark of Macromedia, Inc. in the United States and/or other countries. International CorrectSpell Spelling Correction System. 1995 by Lernout &
Hauspie Speech Products, N.V. All rights reserved. InstallShield 3.0. Copyright. 1997 InstallShield Software Corporation. All rights reserved. PANTONE2 Colors
displayed in the software application or in the user documentation may not match PANTONE-identified standards. Consult current PANTONE Color Publications
for accurate color. PANTONE2 and other Pantone, Inc. trademarks are the property of Pantone, Inc.. Pantone, Inc., 2002 Pantone, Inc. is the copyright owner of
color data and/or software which are licensed to Autodesk, Inc., to distribute for use only in combination with certain Autodesk software products. PANTONE Color
Data and/or Software shall not be copied onto another disk or into memory unless as part of the execution of this Autodesk software product. Portions Copyright.
1991-1996 Arthur D. Applegate. All rights reserved. Portions of this software are based on the work of the Independent JPEG Group. RAL DESIGN. RAL, Sankt
Augustin, 2002 RAL CLASSIC. RAL, Sankt Augustin, 2002 Representation of the RAL Colors is done with the approval of RAL Deutsches Institut fr
Gtesicherung und Kennzeichnung e.V. (RAL German Institute for Quality Assurance and Certification, re. Assoc.), D-53757 Sankt Augustin. Typefaces from the
Bitstream2 typeface library copyright 1992. Typefaces from Payne Loving Trust. 1996. All rights reserved. AutoCAD 2008 is produced under a license of data
derived from DIC Color Guide2 from Dainippon Ink and Chemicals, Inc. Copyright. Dainippon Ink and Chemicals, Inc. All rights reserved. DIC Color Guide
computer color simulations used in this product may not exactly match DIC Color Guide, DIC color Guide Part 2 identified solid color standards. Use current DIC
Color Guide Manuals for exact color reference. DIC and DIC Color Guide are registered trademarks of Dainippon Ink and Chemicals, Inc. Printed manual and help
produced with Idiom WorldServer.
WindowBlinds: DirectSkin OCX . Stardock AnswerWorks 4.0 .; 1997-2003 WexTech Systems, Inc. Portions of this software . Vantage-Knexys. All rights
reserved. The Director General of the Geographic Survey Institute has issued the approval for the coordinates exchange numbered TKY2JGD for Japan Geodetic
Datum 2000, also known as technical information No H1-N0.2 of the Geographic Survey Institute, to be installed and used within this software product (Approval
No.: 646 issued by GSI, April 8, 2002). Portions of this computer program are copyright . 1995-1999 LizardTech, Inc. All rights reserved. MrSID is protected by
U.S. Patent No. 5,710,835. Foreign Patents Pending. Portions of this computer program are Copyright .; 2000 Earth Resource Mapping, Inc. OSTN97 . Crown
Copyright 1997. All rights reserved. OSTN02 . Crown copyright 2002. All rights reserved. OSGM02 . Crown copyright 2002, . Ordnance Survey Ireland, 2002. FME
Objects Engine . 2005 SAFE Software. All rights reserved.
GOVERNMENT USE
Use, duplication, or disclosure by the U.S. Government is subject to restrictions as set forth in FAR 12.212 (Commercial Computer Software-Restricted Rights) and
DFAR 227.7202 (Rights in Technical Data and Computer Software), as applicable.
Table of Contents
Contents
1 Welcome to the Revit Platform API .......................................................................... 19
1.1 Introduction to the Revit Platform API ................................................................. 19
1.2 What Can You Do with the Revit Platform API? ..................................................... 19
1.3 Requirements ................................................................................................... 19
1.4 Install and Learn the Revit-Based Product ............................................................ 20
1.5 Installation ...................................................................................................... 20
1.6 Supported Programming Languages .................................................................... 20
1.7 User Manual ..................................................................................................... 21
1.7.1 Introduction to the Revit Platform API ................................................................. 21
1.7.2 Basic Topics ..................................................................................................... 21
1.7.3 Element Topics ................................................................................................. 21
1.7.4 Advanced Topics ............................................................................................... 22
1.7.5 Product Specific ................................................................................................ 22
1.7.6 Other .............................................................................................................. 22
1.8 Documentation Conventions ............................................................................... 22
1.8.1 Indexed Properties ............................................................................................ 22
1.9 Whats new in this release ................................................................................. 23
2 Getting Started ......................................................................................................... 24
2.1 Walkthroughs ................................................................................................... 24
2.2 Walkthrough: Hello World .................................................................................. 24
2.2.1 Create a New Project......................................................................................... 24
2.2.2 Add References ................................................................................................ 25
2.2.3 Add Code ......................................................................................................... 25
2.2.4 Build the Program ............................................................................................. 26
2.2.5 Create a .addin manifest file .............................................................................. 26
2.2.6 Debug the Add-in ............................................................................................. 27
2.2.7 Troubleshooting ................................................................................................ 29
2.3 Walkthrough: Add Hello World Ribbon Panel......................................................... 31
2.3.1 Create a New Project......................................................................................... 31
2.3.2 Change the Class Name ..................................................................................... 32
2.3.3 Add Code ......................................................................................................... 32
2.3.4 Build the Application ......................................................................................... 33
2.3.5 Create the .addin manifest file............................................................................ 33
2.3.6 Debugging ....................................................................................................... 34
2.4 Walkthrough: Retrieve Selected Elements ............................................................ 34
2.5 Walkthrough: Retrieve Filtered Elements ............................................................. 35
3 Add-In Integration ................................................................................................... 37
3.1 Overview ......................................................................................................... 37
3.2 External Commands .......................................................................................... 38
3.2.1 Loading and Running External Commands ........................................................... 38
3.2.2 IExternalCommand ........................................................................................... 39
3.3 External Application .......................................................................................... 43
3.3.1 IExternalApplication .......................................................................................... 43
3.4 Add-in Registration ........................................................................................... 45
3.4.1 Manifest Files ................................................................................................... 45
3.4.2 .NET Add-in Utility for manifest files .................................................................... 48
3.5 Localization ...................................................................................................... 50
3.6 Attributes ........................................................................................................ 50
3.6.1 TransactionAttribute.......................................................................................... 50
3.6.2 JournalingAttribute ........................................................................................... 51
3.7 Revit Exceptions ............................................................................................... 52
3.8 Ribbon Panels and Controls ................................................................................ 52
3.8.1 Create a New Ribbon Panel and Controls ............................................................. 52
3.8.2 Ribbon Panel .................................................................................................... 53
3.8.3 Ribbon Controls ................................................................................................ 54
3.9 Revit-style Task Dialogs .................................................................................... 61
4 Application and Document ........................................................................................ 63
4.1 Application Functions ........................................................................................ 63
4.1.1 Application ....................................................................................................... 63
4.1.2 UIApplication.................................................................................................... 64
4.2 Document Functions ......................................................................................... 65
4.2.1 Document ........................................................................................................ 65
4.2.2 UIDocument ..................................................................................................... 66
4.3 Document and File Management ......................................................................... 67
4.3.1 Document Retrieval .......................................................................................... 67
4.3.2 Document File Information ................................................................................. 67
4.3.3 Open a Document ............................................................................................. 67
4.3.4 Create a Document ........................................................................................... 67
4.3.5 Save and Close a Document ............................................................................... 68
4.3.6 Load Family ..................................................................................................... 68
4.4 Settings........................................................................................................... 68
4.5 Units ............................................................................................................... 70
5 Elements Essentials .................................................................................................. 71
5.1 Element Classification ....................................................................................... 71
5.1.1 Model Elements ................................................................................................ 71
5.1.2 View Elements .................................................................................................. 71
5.1.3 Group Elements ................................................................................................ 71
5.1.4 Annotation and Datum Elements ......................................................................... 71
5.1.5 Sketch Elements ............................................................................................... 72
5.1.6 Information Elements ........................................................................................ 72
5.2 Other Classifications.......................................................................................... 72
5.2.1 Category ......................................................................................................... 72
5.2.2 Family ............................................................................................................. 75
5.2.3 ElementType .................................................................................................... 76
5.2.4 Instance .......................................................................................................... 76
5.3 Element Retrieval ............................................................................................. 77
5.3.1 Getting an Element by ID .................................................................................. 77
5.3.2 Filtering the Elements Collection ......................................................................... 77
5.3.3 Selection ......................................................................................................... 77
5.3.4 Accessing Specific Elements from Document ........................................................ 77
5.4 General Properties ............................................................................................ 78
5.4.1 ElementId ........................................................................................................ 78
5.4.2 UniqueId ......................................................................................................... 79
5.4.3 Location .......................................................................................................... 79
5.4.4 Level ............................................................................................................... 80
5.4.5 Parameter........................................................................................................ 81
6 Filtering .................................................................................................................... 82
6.1 Create a FilteredElementCollector ....................................................................... 82
6.2 Applying Filters................................................................................................. 82
6.2.1 Quick filters ..................................................................................................... 83
6.2.2 Slow Filters ...................................................................................................... 86
6.2.3 Logical filters.................................................................................................... 88
6.3 Getting filtered elements or element ids .............................................................. 89
6.4 LINQ Queries ................................................................................................... 92
7 Selection ................................................................................................................... 94
7.1 Changing the Selection ...................................................................................... 94
7.2 User Selection .................................................................................................. 95
7.3 Filtered User Selection ....................................................................................... 96
8 Parameters ............................................................................................................... 98
8.1 Walkthrough: Get Selected Element Parameters ................................................... 98
8.2 Definition ....................................................................................................... 100
8.2.1 ParameterType ............................................................................................... 101
8.2.2 ParameterGroup ............................................................................................. 102
8.3 BuiltInParameter ............................................................................................ 102
8.4 StorageType .................................................................................................. 102
8.5 AsValueString() and SetValueString()................................................................ 104
8.6 Parameter Relationships .................................................................................. 104
8.7 Adding Parameters to Elements ........................................................................ 105
9 Collections .............................................................................................................. 106
9.1 Interface ....................................................................................................... 106
9.1.1 IEnumerable .................................................................................................. 106
9.1.2 IEnumerator .................................................................................................. 106
9.2 Collections and Iterators .................................................................................. 107
10 Editing Elements ......................................................................................... 110
10.1 Moving Elements ............................................................................................ 110
10.2 Rotating elements........................................................................................... 112
10.3 Mirror ............................................................................................................ 114
10.4 Group............................................................................................................ 115
10.5 Array ............................................................................................................ 116
10.6 Delete ........................................................................................................... 117
11 Walls, Floors, Roofs and Openings .............................................................. 120
11.1 Walls ............................................................................................................. 120
11.2 Floors and Foundations .................................................................................... 122
11.2.1 Modifying Slabs ........................................................................................ 125
11.3 Roofs ............................................................................................................ 125
11.3.1 Gutter and Fascia...................................................................................... 127
11.4 Curtains ........................................................................................................ 127
11.5 Other Elements .............................................................................................. 128
11.5.1 Stair and Ramp ........................................................................................ 128
11.5.2 Ceiling ..................................................................................................... 128
11.6 CompoundStructure ........................................................................................ 128
11.6.1 Material ................................................................................................... 128
11.7 Opening ........................................................................................................ 130
11.7.1 General Properties .................................................................................... 130
11.7.2 Create Opening ........................................................................................ 132
12 Family Instances ........................................................................................ 134
12.1 Identifying Elements ....................................................................................... 134
12.2 Family ........................................................................................................... 135
12.2.1 Loading Families ....................................................................................... 135
12.2.2 Categories ............................................................................................... 135
12.3 FamilyInstances ............................................................................................. 136
12.3.1 Location-Related Properties ........................................................................ 136
12.3.2 Host and Component ................................................................................. 138
12.3.3 Subcomponent and Supercomponent .......................................................... 139
12.3.4 Other Properties ....................................................................................... 140
12.3.5 Creating FamilyInstance Objects ................................................................. 140
12.4 Code Samples ................................................................................................ 145
12.4.1 Create Tables ........................................................................................... 146
12.4.2 Create a Beam ......................................................................................... 147
12.4.3 Create Doors ............................................................................................ 148
12.4.4 Create FamilyInstances Using Reference Directions ....................................... 149
13 Family Creation ........................................................................................... 151
13.1 Family Documents .......................................................................................... 151
13.1.1 Family ..................................................................................................... 151
13.1.2 Categories ............................................................................................... 151
13.1.3 Parameters .............................................................................................. 151
13.1.4 Creating a Family Document ...................................................................... 151
13.1.5 Nested Family Symbols.............................................................................. 152
13.2 Family Item Factory ........................................................................................ 152
13.2.1 Creating Forms ......................................................................................... 153
13.2.2 Creating Annotations ................................................................................. 155
13.3 Family Element Visibility .................................................................................. 158
13.4 Family Manager .............................................................................................. 159
13.4.1 Getting Types in a Family........................................................................... 159
13.4.2 Editing FamilyTypes .................................................................................. 160
14 Conceptual Design ...................................................................................... 162
14.1 Point and curve objects ................................................................................... 162
14.2 Forms ........................................................................................................... 165
14.2.1 Creating Forms ......................................................................................... 165
14.2.2 Form modification ..................................................................................... 169
14.3 Rationalizing a Surface .................................................................................... 171
14.3.1 Dividing a surface ..................................................................................... 171
14.3.2 Patterning a surface .................................................................................. 172
15 Datum and Information Elements ............................................................... 177
15.1 Levels ........................................................................................................... 177
15.1.1 Elevation ................................................................................................. 177
15.1.2 Creating a Level........................................................................................ 179
15.2 Grids ............................................................................................................. 179
15.2.1 Curve ...................................................................................................... 179
15.2.2 Creating a Grid ......................................................................................... 180
15.3 Phase ............................................................................................................ 181
15.4 Design Options ............................................................................................... 183
16 Annotation Elements .................................................................................. 184
16.1 Dimensions and Constraints ............................................................................. 184
16.1.1 Dimensions .............................................................................................. 185
16.1.2 Constraint Elements .................................................................................. 186
16.1.3 Spot Dimensions ....................................................................................... 188
16.1.4 Comparison .............................................................................................. 188
16.1.5 Create and Delete ..................................................................................... 189
16.2 Detail Curve ................................................................................................... 189
16.3 Tags ............................................................................................................. 190
16.4 Text .............................................................................................................. 192
16.5 Annotation Symbol ......................................................................................... 193
16.5.1 Create and Delete ..................................................................................... 193
16.5.2 Add and Remove Leader ............................................................................ 193
17 Sketching .................................................................................................... 194
17.1 The 2D Sketch Class ....................................................................................... 194
17.2 3D Sketch ...................................................................................................... 197
17.2.1 Extrusion ................................................................................................. 197
17.2.2 Revolution ............................................................................................... 198
17.2.3 Blend ...................................................................................................... 200
17.2.4 Sweep ..................................................................................................... 202
17.3 ModelCurve .................................................................................................... 204
17.3.1 Creating a ModelCurve .............................................................................. 204
17.3.2 Properties ................................................................................................ 205
18 Views .......................................................................................................... 207
18.1 Overview ....................................................................................................... 207
18.1.1 View Process ............................................................................................ 207
18.1.2 View Types .............................................................................................. 208
18.1.3 Element Visibility in a View ........................................................................ 212
18.1.4 Creating and Deleting Views ....................................................................... 213
18.2 The View3D Class ........................................................................................... 214
18.2.1 Perspective View ....................................................................................... 214
18.2.2 Orthographic View .................................................................................... 216
18.2.3 3D Views SectionBox ................................................................................. 218
18.3 ViewPlan........................................................................................................ 220
18.4 ViewDrafting .................................................................................................. 220
18.5 ViewSection ................................................................................................... 221
18.6 ViewSheet ..................................................................................................... 223
18.6.1 Printer Setup ............................................................................................ 224
19 Material ...................................................................................................... 226
19.1 General Material Information ............................................................................ 226
19.1.1 Classification ............................................................................................ 226
19.1.2 Properties ................................................................................................ 229
19.2 Material Management ...................................................................................... 232
19.2.1 Creating Materials ..................................................................................... 232
19.2.2 Deleting Materials ..................................................................................... 233
19.3 Element Material............................................................................................. 234
19.3.1 Material in a Parameter ............................................................................. 235
19.3.2 Material and Category ............................................................................... 236
19.3.3 CompoundStructureLayer Material .............................................................. 238
19.3.4 Retrieve Element Materials ......................................................................... 238
19.3.5 Walkthrough: Get Window Materials ............................................................ 240
20 Geometry .................................................................................................... 242
20.1 Example: Retrieve Geometry Data from a Wall ................................................... 242
20.1.1 Create Geometry Options ........................................................................... 242
20.1.2 Retrieve Faces and Edges .......................................................................... 242
20.2 Geometry Node Class ...................................................................................... 243
20.2.1 Geometry.Instance ................................................................................... 244
20.2.2 Geometry.Mesh ........................................................................................ 246
20.2.3 Solid ....................................................................................................... 247
20.3 Geometry Helper Class .................................................................................... 247
20.3.1 Transform ................................................................................................ 248
20.3.2 Reference ................................................................................................ 251
20.3.3 Options.................................................................................................... 251
20.3.4 BoundingBoxXYZ ...................................................................................... 253
20.3.5 BoundingBoxUV ........................................................................................ 257
20.4 Collection Classes ........................................................................................... 257
20.5 Example: Retrieve Geometry Data from a Beam ................................................. 258
21 Place and Locations .................................................................................... 260
21.1 Place ............................................................................................................. 260
21.2 City............................................................................................................... 260
21.3 ProjectLocation ............................................................................................... 260
21.4 Project Position .............................................................................................. 261
21.4.1 Creating and Deleting Project Locations ....................................................... 264
22 Storing Data in the Revit model .................................................................. 266
22.1 Shared Parameters ......................................................................................... 266
22.2 Definition File ................................................................................................. 266
22.2.1 Definition File Format ................................................................................ 266
22.3 Definition File Access ....................................................................................... 268
22.3.1 Create a Shared Parameter File .................................................................. 269
22.3.2 Access an Existing Shared Parameter File .................................................... 269
22.3.3 Change the Parameter Definition Owner Group ............................................. 270
22.4 Binding .......................................................................................................... 271
22.4.1 Type Binding ............................................................................................ 271
22.4.2 Instance Binding ....................................................................................... 273
22.5 Extensible Storage .......................................................................................... 274
22.5.1 Schemas and SchemaBuilder ...................................................................... 275
22.5.2 Fields and FieldBuilder ............................................................................... 275
22.5.3 Entities .................................................................................................... 276
23 Transactions ............................................................................................... 278
23.1 Transaction Classes ........................................................................................ 278
23.1.1 Transaction .............................................................................................. 279
23.1.2 SubTransaction ......................................................................................... 280
23.1.3 TransactionGroup ..................................................................................... 280
23.2 Transactions in Events ..................................................................................... 282
23.2.1 Modifying the document during an event ..................................................... 282
23.2.2 DocumentChanged Event ........................................................................... 282
23.3 Failure Handling Options .................................................................................. 282
23.3.1 ClearAfterRollback..................................................................................... 282
23.3.2 DelayedMiniWarnings ................................................................................ 282
23.3.3 ForcedModalHandling ................................................................................ 283
23.3.4 SetFailuresPreprocessor ............................................................................. 283
23.3.5 SetTransactionFinalizer .............................................................................. 283
23.4 Getting Element Geometry and AnalyticalModel .................................................. 283
24 Events ......................................................................................................... 285
24.1 Database Events ............................................................................................. 285
24.2 User Inteface Events ....................................................................................... 287
24.3 Registering Events .......................................................................................... 287
24.4 Canceling Events ............................................................................................ 288
25 Dynamic Model Update ............................................................................... 290
25.1 Implementing IUpdater ................................................................................... 290
25.2 The Execute method ....................................................................................... 292
25.2.1 Scope of Changes ..................................................................................... 293
25.2.2 Forbidden and Cautionary Changes ............................................................. 293
25.2.3 Managing Changes .................................................................................... 294
25.3 Registering Updaters ....................................................................................... 294
25.3.1 Triggers ................................................................................................... 294
25.3.2 Order of Execution .................................................................................... 295
25.4 Exposure to End-User ...................................................................................... 295
25.4.1 Updater not installed ................................................................................. 295
25.4.2 Updater performs invalid operation ............................................................. 296
25.4.3 Infinite loop ............................................................................................. 296
25.4.4 Two updaters attempt to edit same element ................................................. 296
25.4.5 Central document modified by updater not present locally ............................. 297
26 Failure Posting and Handling ...................................................................... 298
26.1 Posting Failures .............................................................................................. 298
26.1.1 Defining and registering a failure ................................................................ 298
26.1.2 Posting a failure ........................................................................................ 300
26.1.3 Removal of posted failures ......................................................................... 302
26.2 Handling Failures ............................................................................................ 302
26.2.1 Overview of Failure Processing ................................................................... 302
26.2.2 FailuresAccessor ....................................................................................... 303
26.2.3 IFailuresPreprocessor ................................................................................ 304
26.2.4 FailuresProcessing Event ............................................................................ 305
26.2.5 FailuresProcessor ...................................................................................... 306
27 Analysis Visualization ................................................................................. 308
27.1 Manager for analysis results ............................................................................. 308
27.2 Creating analysis results data ........................................................................... 308
27.3 Analysis Results Display .................................................................................. 309
27.4 Updating Analysis Results ................................................................................ 311
28 Revit Architecture ....................................................................................... 312
28.1 Rooms........................................................................................................... 312
28.1.1 Room, Area, and Tags ............................................................................... 312
28.1.2 Creating a room........................................................................................ 313
28.1.3 Room Boundary ........................................................................................ 314
28.1.4 Plan Topology ........................................................................................... 320
28.1.5 Room and FamilyInstance .......................................................................... 321
28.1.6 Other Room Properties .............................................................................. 323
28.2 Energy Data ................................................................................................... 325
29 Revit Structure ........................................................................................... 326
29.1 Structural Model Elements ............................................................................... 326
29.1.1 Column, Beam, and Brace .......................................................................... 326
29.1.2 AreaReinforcement and PathReinforcement .................................................. 328
29.1.3 BeamSystem ............................................................................................ 330
29.1.4 Truss ....................................................................................................... 330
29.1.5 Rebar ...................................................................................................... 332
29.1.6 BoundaryConditions .................................................................................. 334
29.1.7 Other Structural Elements .......................................................................... 335
29.2 AnalyticalModel .............................................................................................. 336
29.2.1 Analytical Location .................................................................................... 337
29.2.2 Parameter Information .............................................................................. 339
29.2.3 Manual Adjustment ................................................................................... 341
29.2.4 Analytical Offset ....................................................................................... 341
29.2.5 AnalyticalModelSupport ............................................................................. 341
29.3 Loads ............................................................................................................ 345
29.3.1 Load Settings ........................................................................................... 345
29.4 Analysis Link .................................................................................................. 346
30 Revit MEP ................................................................................................... 348
30.1 MEP Element Creation ..................................................................................... 348
30.1.1 Creating Pipes and Ducts ........................................................................... 348
30.1.2 Creating a new system .............................................................................. 351
30.2 Connectors .................................................................................................... 353
30.3 Family Creation .............................................................................................. 355
A. Glossary...................................................................................................... 357
B. FAQ ............................................................................................................. 359
C. Registering Add-Ins Using Revit.ini ............................................................ 362
30.3.1 Add-in Manager for the Revit.ini ................................................................. 365
D. Hello World for VB.NET ............................................................................... 367
E. Material Properties Internal Units .............................................................. 373
F. Concrete Section Definitions ....................................................................... 376
G. API User Interface Guidelines .................................................................... 389
Welcome to the Revit Platform API
Code Region 27-2: Setting analysis display style for view ...................................................... 310
Code Region 28-1: Creating a room .................................................................................... 313
Code Region 28-2: Creating and inserting a room into a plan circuit ....................................... 313
Code Region 28-3: Setting room bounding .......................................................................... 317
Code Region 28-4: Using a transaction to update room boundary ........................................... 319
Code Region 28-5: Getting a room from the family instance .................................................. 323
Code Region 28-6: Getting a room's dimensions .................................................................. 324
Code Region 28-7: Using the EnergyDataSettings class......................................................... 325
Code Region 29-1: Distinguishing between column, beam and brace ...................................... 326
Code Region 29-2: Using BuiltInCategory.OST_StructuralFraming .......................................... 327
Code Region 29-3: NewAreaReinforcement() ....................................................................... 328
Code Region 29-4:NewPathReinforcement() ........................................................................ 329
Code Region 29-5: Downcasting Face to PlanarFace ............................................................. 329
Code Region 29-6: Getting Normal and Origin ..................................................................... 329
Code Region 29-7: Creating a truss over two columns .......................................................... 330
Code Region 29-8: Creating rebar with a specific layout ........................................................ 332
Code Region 29-9: Getting boundary condition type and geometry ......................................... 334
Code Region 29-10: Getting a reference to analytical curve ................................................... 337
Code Region 29-11: Getting the location for a structural footing ............................................ 337
Code Region 29-12: Getting the curve for a structural column ............................................... 338
Code Region 29-13: Getting the curves for a structural wall .................................................. 339
Code Region 29-14: NewLoadCombination() ........................................................................ 346
Code Region 30-1: Creating a new Pipe .............................................................................. 348
Code Region 30-2: Changing pipe diameter ......................................................................... 349
Code Region 30-3: Adding a duct between two connectors .................................................... 349
Code Region 30-4: Creating a new mechanical system .......................................................... 352
Code Region 30-5: Determine what is attached to a connector .............................................. 353
Code Region 30-6: Adding a pipe connector ........................................................................ 355
Code Region 30-7: Revit.ini ExternalCommands Section ....................................................... 362
Code Region 3-27: Displaying Revit-style TaskDialog ............................................................ 363
Code Region 30-8: Revit.ini ExternalApplications section ....................................................... 365
Code Region 30-9: Hello World in VB.NET ........................................................................... 369
Code Region 30-10: Creating a .addin manifest file for an external command .......................... 370
Code Region 30-11: TaskDialog ......................................................................................... 371
1.3 Requirements
To go through the user manual, you need the following:
1. A working understanding of Revit Architecture 2012, Revit Structure 2012, or Revit MEP
2012.
2. Familiarity with a Common Language Specification compliant language like C# or VB.NET.
3. Microsoft Visual Studio 2010, or Microsoft Visual Studio 2010 Express Edition. Alternatively,
you can use the built-in Visual Studio Tools for Applications (VSTA) development
environment in Revit. You must install VSTA from the Revit DVD separately from the Revit
product installation. Microsoft has not yet announced when Visual Studio Tools for
Applications (VSTA) for .NET 4.0 will be available. VSTA is the technology used for Revit
macros. In the interim, run PrepareRevitForVSTA.bat before starting Revit to debug Revit
macros. This script can be found in the Revit Program folder. Because this script will disable
.NET 4.0 addins, run RestoreRevitFromVSTA.bat to restore Revit's default .NET 4.0 setting.
For more information on writing applications using VSTA, see the section "Creating Macros
with Revit VSTA" in the Revit 2012 User's Guide.
4. Microsoft .NET Framework 4.0.
5. The Revit Software Developers Kit (SDK) which you can download from the Autodesk
Developer Network (ADN) or the Revit installation CD/DVD
(<DVD_Drive>:\Utilities\Common\Software Development Kit).
1.5 Installation
The Revit Platform API is installed with Revit Architecture, Revit Structure, and Revit MEP. Any
.NET based application will reference the RevitAPI.dll and the RevitAPIUI.dll located in the Revit
Program directory. The RevitAPI.dll contains methods used to access Revits application,
documents, elements and parameters at the database level. The RevitAPIUI.dll contains the
interfaces related to manipulation and customization of the Revit user interface.
Sketching - Sketch functions include 2D and 3D sketch classes such as SketchPlane, ModelCurve,
GenericForm, and more.
Views Learn about the different ways to view models and components and how to manipulate the
view in the API.
Material - Material data is an Element that identifies the physical materials used in the project as
well as texture, color, and more.
1.7.6 Other
Glossary Definitions of terms used in this document.
Appendix Additional information such as Frequently Asked Questions, Using Visual Basic.Net for
programming, and more.
methods in C# code by pre-pending the property name with get_ or set_. For example, to use
the Document.Element(String) property overload, you use Document.get_Element(String).
2 Getting Started
The Revit Platform API is fully accessible by any language compatible with the Microsoft .NET
Framework 4.0, such as Visual C# or Visual Basic .NET (VB.NET). Both Visual C# and VB.NET are
commonly used to develop Revit Platform API applications. However, the focus of this manual is
developing applications using Visual C#.
2.1 Walkthroughs
If you are new to the Revit Platform API, the following topics are good starting points to help you
understand the product. Walkthroughs provide step-by-step instructions for common scenarios,
helping you learn about the product or a particular feature. The following walkthroughs will help
you get started using the Revit Platform API:
Walkthrough: Hello world - Illustrates how to create an add-in using the Revit Platform API.
Walkthrough: Add Hello World Ribbon Panel - Illustrates how to add a custom ribbon panel.
Walkthrough: Retrieve Selected Elements - Illustrates how to retrieve selected elements.
Walkthrough: Retrieve Filtered Elements Illustrates how to retrieve elements based on filter
criteria.
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
namespace HelloWorld
{
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
public class Class1 : IExternalCommand
{
public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit,
ref string message, ElementSet elements)
{
TaskDialog.Show("Revit", "Hello World");
return Autodesk.Revit.UI.Result.Succeeded;
}
}
}
Tip: The Visual Studio Intellisense feature can create a skeleton implementation of an interface for
you, adding stubs for all the required methods. After you add :IExternaCommand after
Class1 in the example above, you can select Implement IExternalCommand from the
Intellisense menu to get the code:
Code Region 2-2: Creating a .addin manifest file for an external command
Refer to the Add-in Integration chapter for more details using manifest files.
2.2.7 Troubleshooting
Q: My add-in application will not compile.
A: If an error appears when you compile the sample code, the problem may be with the version of
the RevitAPI used to compile the add-in. Delete the old RevitAPI reference and load a new one. For
more details, refer to Add Reference.
Q: Why is there no Add-Ins tab or why isnt my add-in application displayed under External Tools?
A: In many cases, if an add-in application fails to load, Revit will display an error dialog on startup
with information about the failure. For example, if the add-in DLL cannot be found in the location
specified in the Revit.ini file, a message similar to the following appears.
A a = new A();//line x
public IExternalCommand.Result Execute ()
{
//
}
}
Class A
{
//
}
try
{
// Do some stuff
}
return Autodesk.Revit.UI.Result.Succeeded;
}
return Result.Succeeded;
}
2.3.6 Debugging
To begin debugging, build the project, and run Revit. A new ribbon panel appears on the Add-Ins
tab named NewRibbonPanel and Hello World appears as the only button on the panel, with a large
globe image.
{
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData,
ref string message, ElementSet elements)
{
try
{
// Select some elements in Revit before invoking this command
if (0 == collection.Size)
{
// If no elements selected.
TaskDialog.Show("Revit","You haven't selected any elements.");
}
else
{
String info = "Ids of selected elements in the document are: ";
foreach (Element elem in collection)
{
info += "\n\t" + elem.Id.IntegerValue;
}
TaskDialog.Show("Revit",info);
}
}
catch (Exception e)
{
message = e.Message;
return Autodesk.Revit.UI.Result.Failed;
}
return Autodesk.Revit.UI.Result.Succeeded;
}
}
After you get the selected elements, you can get the properties or parameters for the elements.
For more information, see the Parameter chapter.
String prompt = "The ids of the doors in the current document are:";
foreach(ElementId id in doors)
{
prompt += "\n\t" + id.IntegerValue;
}
3 Add-In Integration
Developers add functionality by creating and implementing External Commands and External
Applications. Revit identifies the new commands and applications using the Revit.ini and .addin
manifest files. The Revit.ini entries that were used in Revit 2010 and earlier will continue to work
with legacy functionality in 2011, but we recommend developers transition to .addin files as .ini
support will be removed in a future release. Additionally, some new functionality, such as the use
of Updaters, will only work when using .addin manifest files.
External Commands appear under the External Tools menu-button on the Add-Ins tab.
External Applications are invoked when Revit starts up and unloaded when Revit shuts down
This chapter focuses on the following:
Learning how to add functionality using External Commands and External Applications.
How to access Revit events.
How to customize the Revit UI.
3.1 Overview
The Revit Platform API is based on Revit application functionality. The Revit Platform API is
composed of two class Libraries that only work when Revit is running.
The RevitAPI.dll contains methods used to access Revit's application, documents, elements, and
parameters at the database level.
The RevitAPIUI.dll contains all API interfaces related to manipulation and customization of the Revit
user interface, including:
IExternalCommand and External Command related interfaces
IExternalApplication and related interfaces
Selection
RibbonPanel, RibbonItem and subclasses
TaskDialogs
As the following picture shows, Revit Architecture, Revit Structure, and Revit MEP are specific to
Architecture, Structure, and MEP respectively.
To create a RevitAPI based add-in, you must provide specific entrypoint types in your add-in DLL.
These entrypoint classes implement interfaces, either IExternalCommand or IExternalApplication.
In this way, the add-in is run automatically on certain events or manually from the External Tools
menu-button.
IExternalCommand, IExternalApplication, and other available Revit events for add-in integration
are introduced in this chapter.
3.2.2 IExternalCommand
You create an external command by creating an object that implements the IExternalCommand
interface. The IExternalCommand interface has one abstract method, Execute, which is the main
method for external commands.
The Execute() method has three parameters:
commandData (ExternalCommandData)
message (String)
elements (ElementSet)
Property Description
Application (Autodesk.Revit.UI.UIApplication) Retrieves an object that represents the current
UIApplication for external command.
Data A data map that can be used to read and write data to the
(Autodesk.Revit.Collections.StringStringMap) Revit journal file.
View (Autodesk.Revit.DB.View) Retrieves an object that represents the View external
commands work on.
{
message = "Could not locate walls for analysis.";
return Autodesk.Revit.UI.Result.Failed;
}
}
Implementing the previous external command causes the following dialog box to appear:
return Result.Failed;
}
}
3.2.2.4 Return
The Return result indicates that the execution failed, succeeded, or is canceled by the user. If it
does not succeed, Revit reverses changes made by the external command.
Table 2: IExternalCommand.Result
The following example displays a greeting message and allows the user to select the return value.
Use the Execute() method as the entrance to the Revit application.
if (taskDialogResult == TaskDialogResult.Yes)
{
return Autodesk.Revit.UI.Result.Succeeded;
}
else if (taskDialogResult == TaskDialogResult.No)
{
elements = uidoc.Selection.Elements;
message = "Failed to delete selection.";
return Autodesk.Revit.UI.Result.Failed;
}
else
{
return Autodesk.Revit.UI.Result.Cancelled;
}
}
catch
{
message = "Unexpected Exception thrown.";
return Autodesk.Revit.UI.Result.Failed;
}
}
3.2.2.5 IExternalCommandAvailability
This interface allows you control over whether or not an external command button may be pressed.
The IsCommandAvailable interface method passes the application and a set of categories matching
the categories of selected items in Revit to your implementation. The typical use would be to check
the selected categories to see if they meet the criteria for your command to be run.
In this example the accessibility check allows a button to be clicked when there is no active
selection, or when at least one wall is selected:
3.3.1 IExternalApplication
To add an External Application to Revit, you create an object that implements the
IExternalApplication interface.
The IExternalApplication interface has two abstract methods, OnStartup() and OnShutdown(),
which you override in your external application. Revit calls OnStartup() when it starts, and
OnShutdown() when it closes.
This is the OnStartup() and OnShutdown() abstract definition:
The UIControlledApplication parameter provides access to certain Revit events and allows
customization of ribbon panels and controls. For example, the public event DialogBoxShowing of
UIControlledApplication can be used to capture the event of a dialog being displayed. The following
code snippet registers the handling function that is called right before a dialog is shown.
The following code sample illustrates how to use the UIControlledApplication type to register an
event handler and process the event when it occurs.
// Implement this method to unregister the subscribed events when Revit exits.
public Result OnShutdown(UIControlledApplication application)
{
// unregister events
application.DialogBoxShowing -=
new EventHandler<Autodesk.Revit.UI.Events.DialogBoxShowingEventArgs>(AppDialogShowing);
return Result.Succeeded;
}
// Show the prompt message, and allow the user to close the dialog directly.
TaskDialog taskDialog = new TaskDialog("Revit");
taskDialog.MainContent = promptInfo;
TaskDialogCommonButtons buttons = TaskDialogCommonButtons.Ok |
TaskDialogCommonButtons.Cancel;
taskDialog.CommonButtons = buttons;
TaskDialogResult result = taskDialog.Show();
if (TaskDialogResult.Cancel == result)
{
// Do not show the Revit dialog
args.OverrideResult(1);
}
else
{
// Continue to show the Revit dialog
args.OverrideResult(0);
}
}
}
<AddIn Type="Command">
<Assembly>c:\MyProgram\MyProgram.dll</Assembly>
<AddInId>76eb700a-2c85-4888-a78d-31429ecae9ed</AddInId>
<FullClassName>Revit.Samples.SampleCommand</FullClassName>
<Text>Sample command</Text>
<VendorId>ADSK</VendorId>
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
<VisibilityMode>NotVisibleInFamily</VisibilityMode>
<VisibilityMode>NotVisibleInMEP</VisibilityMode>
<AvailabilityClassName>Revit.Samples.SampleAccessibilityCheck</AvailabilityClassName>
<LongDescription>
<p>This is the long description for my command.</p>
<p>This is another descriptive paragraph, with notes about how to use the command
properly.</p>
</LongDescription>
<TooltipImage>c:\MyProgram\Autodesk.jpg</TooltipImage>
<LargeImage>c:\MyProgram\MyProgramIcon.png</LargeImage>
</AddIn>
</RevitAddIns>
ExternalApplications.
Name The name of application. Required; for ExternalApplications only.
Text The name of the button. Optional; use this tag for ExternalCommands
only. The default is "External Tool".
VendorId A string conforming to the Autodesk vendor ID standard. Required for all
ExternalCommands and ExternalApplications.
Register your vendor id string with Autodesk at
http://www.autodesk.com/symbreg.
VendorDescription Description containing vendor's legal name and/or other pertinent
information. Optional.
Description Short description of the command, will be used as the button tooltip.
Optional; use this tag for ExternalCommands only.
The default is a tooltip with just the command text.
VisibilityMode The modes in which the external command will be visible.Multiple values
may be set for this option. Optional; use this tag for ExternalCommands
only.
The default is to display the command in all modes and disciplines,
including when there is no active document. Previously written external
commands which need to run against the active document should either be
modified to ensure that the code deals with invocation of the command
when there is no active document, or apply the
NotVisibleWhenNoActiveDocument mode. See table below for more
information.
AvailabilityClassName The full name of the class in the assembly file which implemented
IExternalCommandAvailability. This class allows the command button to be
selectively grayed out depending on context. Optional; use this tag for
ExternalCommands only.
The default is a command that is available whenever it is visible.
LargeImage The icon to use for the button in the External Tools pulldown menu.
Optional; use this tag for ExternalCommands only.
The default is to show a button without an icon.
SmallImage The icon to use if the button is promoted to the Quick Access Toolbar.
Optional; use this tag for ExternalCommands only.
The default is to show a Quick Access Toolbar button without an icon,
which can be confusing to users.
LongDescription Long description of the command, will be used as part of the button
extended tooltip, shown when the mouse hovers over the command for a
longer amount of time. Optional; use this tag for ExternalCommands only.
If this property and TooltipImage are not supplied, the button will not have
an extended tooltip.
TooltipImage An image file to show as a part of the button extended tooltip, shown when
the mouse hovers over the command for a longer amount of time.
Optional; use this tag for ExternalCommands only. If this property and
TooltipImage are not supplied, the button will not have an extended tooltip.
LanguageType Localization setting for Text, Description, LargeImage, LongDescription,
and TooltipImage of external tools buttons. Revit will load the resource
values from the specified language resource dll. The value can be one of
the eleven languages supported by Revit. If no LanguageType is specified,
the language resource which the current session of Revit is using will be
automatically loaded. For more details see the section on Localization.
// this command only visible in Revit MEP, Structure, and only visible
// in Project document or when no document at all
command1.VisibilityMode = VisibilityMode.NotVisibleInArchitecture |
VisibilityMode.NotVisibleInFamily;
RevitAddInManifest revitAddInManifest =
Autodesk.RevitAddIns.AddInManifestUtility.GetRevitAddInManifest(
revitProduct1.AllUsersAddInFolder + "\\RevitAddInUtilitySample.addin");
3.5 Localization
You can let Revit localize the user-visible resources of an external command button (including Text,
large icon image, long and short descriptions and tooltip image). You will need to create a .NET
Satellite DLL which contains the strings, images, and icons for the button. Then change the values
of the tags in the .addin file to correspond to the names of resources in the Satellite dll, but
prepended with the @character. So the tag:
Becomes:
where ExtensionText is the name of the resource found in the Satellite DLL.
The Satellite DLLs are expected to be in a directory with the name of the language of the language-
culture, such as en or en-US. The directory should be located in the directory that contains the
add-in assembly. See http://msdn.microsoft.com/en-us/library/e9zazcx5.aspx to create managed
Satellite DLLs.
You can force Revit to use a particular language resource DLL, regardless of the language of the
Revit session, by specifying the language and culture explicitly with a LanguageType tag.
For example, the entry above would force Revit to always load the values from the en-US Satellite
DLL and to ignore the current Revit language and culture settings when considering the localizable
members of the external command manifest file.
Revit supports the 11 languages defined in the Autodesk.Revit.ApplicationServices.LanguageType
enumerated type: English_USA, German, Spanish, French, Italian, Dutch, Chinese_Simplified,
Chinese_Traditional, Japanese, Korean, and Russian.
3.6 Attributes
The Revit API provides several attributes for configuring ExternalCommand and ExternalApplication
behavior.
3.6.1 TransactionAttribute
The custom attribute Autodesk.Revit.Attributes.TransactionMode must be applied to your
implementation class of the IExternalCommand interface to control transaction behavior for
external command. There is no default for this option. This mode controls how the API framework
expects transactions to be used when the command is invoked. The supported values are:
TransactionMode.Automatic - Revit will create a transaction in the active document
before the external command is executed and the transaction will be committed or rolled
back after the command is completed (based upon the return value of the
ExternalCommand callback). The command cannot create and start its own Transactions,
but it can create SubTransactions. The command must report its success or failure status
with the Result return value.
TransactionMode.Manual - Revit will not create a transaction (but it will create an outer
transaction group to roll back all changes if the external command returns a failure).
Instead, you may use combinations of Transactions, SubTransactions, and
TransactionGroups as you please. You will have to follow all rules regarding use of
transactions and related classes. You will have to give your transactions names which will
then appear in the Undo menu. Revit will check that all transactions (also groups and sub-
transactions) are properly closed upon return from an external command. If not, Revit will
discard all changes made to the model.
TransactionMode.ReadOnly - No transaction (nor group) will be created, and no
transaction may be created for the lifetime of the command. The External Command may
only use methods that read from the model. Exceptions will be thrown if the command
either tries to start a transaction (or group) or attempts to write to the model.
In all three modes, the TransactionMode applies only to the active document. You may open other
documents during the course of the command, and you may have complete control over the
creation and use of Transactions, SubTransactions, and TransactionGroups on those other
documents (even in ReadOnly mode).
For example, to set an external command to use automatic transaction mode:
3.6.2 JournalingAttribute
The custom attribute Autodesk.Revit.Attributes.JournalingAttribute can optionally be applied to
your implementation class of the IExternalCommand interface to control the journaling behavior
during the external command execution. There are two options for journaling:
JournalMode.NoCommandData - Contents of the ExternalCommandData.Data map are
not written to the Revit journal. This option allows Revit API calls to write to the journal as
needed. This option allows commands which invoke the Revit UI for selection or responses
to task dialogs to replay correctly.
JournalMode.UsingCommandData - Uses the StringStringMap supplied in the
command data. This will hide all Revit journal entries between the external command
invocation and the StringStringMap entry. Commands which invoke the Revit UI for
selection or responses to task dialogs may not replay correctly. This is the default if the
JournalingAttribute is not specified.
In addition, there is a special exception type called InternalException, which represents a failure
path which was not anticipated. Exceptions of this type carry extra diagnostic information which
can be passed back to Autodesk for diagnosis.
AddRadioGroup(panel);
panel.AddSeparator();
AddPushButton(panel);
AddSplitButton(panel);
AddStackedButtons(panel);
AddSlideOut(panel);
return Result.Succeeded;
}
3.8.2.2 Tooltips
Most controls can have a tooltip set (using the ToolTip property) which is displayed when the user
moves the mouse over the control. When the user hovers the mouse over a control for an
extended period of time, an extended tooltip will be displayed using the LongDescription and the
ToolTipImage properties. If neither LongDescription nor ToolTipImage are set, the extended tooltip
is not displayed. If no ToolTip is provided, then the text of the control (RibbonItem.ItemText) is
displayed when the mouse moves over the control.
The inherited ItemText property has no effect for TextBox. The user-entered text can be obtained
from the Value property, which must be converted to a string.
See the section on stacked ribbon items for an example of adding a TextBox to a ribbon panel,
including how to register the event above.
will be placed at the top of the list. Note that when grouping items, separators should not be used
as they will be placed at the end of the group rather than in the order they are added.
Code Region 3-23: Adding a text box and combo box as stacked items
private void AddStackedButtons(RibbonPanel panel)
{
ComboBoxData cbData = new ComboBoxData("comboBox");
{
TextBox tBox = stackedItems[0] as TextBox;
if (tBox != null)
{
tBox.PromptText = "Enter a comment";
tBox.ShowImageAsButton = true;
tBox.ToolTip = "Enter some text";
// Register event handler ProcessText
tBox.EnterPressed +=
new EventHandler<Autodesk.Revit.UI.Events.TextBoxEnterPressedEventArgs>(ProcessText);
}
panel.AddSlideOut();
// Set footer text. Footer text is usually used to link to the help document.
mainDialog.FooterText =
"<a href=\"http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975 \">"
+ "Click here for the Revit API Developer Center</a>";
// If the user clicks the first command link, a simple Task Dialog
// with only a Close button shows information about the Revit installation.
if (TaskDialogResult.CommandLink1 == tResult)
{
TaskDialog dialog_CommandLink1 = new TaskDialog("Revit Build Information");
dialog_CommandLink1.MainInstruction =
"Revit Version Name is: " + app.VersionName + "\n"
+ "Revit Version Number is: " + app.VersionNumber + "\n"
+ "Revit Version Build is: " + app.VersionBuild;
dialog_CommandLink1.Show();
}
// If the user clicks the second command link, a simple Task Dialog
// created by static method shows information about the active document
else if (TaskDialogResult.CommandLink2 == tResult)
{
TaskDialog.Show("Active Document Inforamtion",
"Active document: " + activeDoc.Title + "\n"
+ "Active view name: " + activeDoc.ActiveView.Name);
}
return Autodesk.Revit.UI.Result.Succeeded;
}
}
4.1.1 Application
The class represents the Autodesk Revit Application, providing access to documents, options and
other application wide data and settings.
4.1.1.5 Events
The Application class exposes document and application events such as document open and save.
Subscribing to these events notifies the application when the events are enabled and acts
accordingly. For more details, see the Access to Revit Event section in the Add-In Integration
chapter.
4.1.1.6 Create
The Create property returns an Object Factory used to create application-wide utility and geometric
objects in the Revit Platform API. Create is used when you want to create an object in the Revit
application memory rather than your applications memory.
4.1.2 UIApplication
This class represents an active session of the Autodesk Revit user interface, providing access to UI
customization methods, events, and the active document.
4.1.2.4 Extents
The DrawingAreaExtents property returns a rectangle that represents the screen pixel coordinates
of drawing area, while the MainWindowExtents property returns the rectangle that represents the
screen pixel coordinates of the Revit main window
4.1.2.5 Events
The UIApplication class exposes UI related events such as when a dialog box is displayed.
Subscribing to these events notifies the application when the events are enabled and acts
accordingly. For more details, see the Access to Revit Event section in the Add-In Integration
chapter.
4.2.1 Document
The Document class represents an open Autodesk Revit project.
Move
Rotate
Mirror
Array.
For more details, see the Editing Element chapter.
4.2.1.8 Events
Events are raised on certain actions, such as when you save a project using Save or Save As. To
capture the events and respond in the application, you must register the event handlers. For more
details, see the Events chapter.
4.2.1.10 Others
Document also provides other functions:
ParameterBindings Property - Mapping between parameter definitions and categories. For
more details, see the Shared Parameter chapter.
ReactionsAreUpToDate Property - Reports whether the reactionary loads changed. For more
details, see the Loads section in the Revit Structure chapter.
4.2.2 UIDocument
The UIDocument class represents an Autodesk Revit project opened in the Revit user interface.
Method Event
Document OpenDocumentFile(string DocumentOpened
filename )
When you specify a string with a fully qualified file path, Revit opens the file and creates a
Document instance. Use this method to open a file on other computers by assigning the files
Universal Naming Conversion (UNC) name to this method.
The file can be a project file with the extension .rvt, a family file with the extension .rfa, or a
template file with the extension .rte. The method throws
Autodesk.Revit.Exceptions.InvalidOperationException if you try to open unsupported file types. If
the document is opened successfully, the DocumentOpened event is raised.
Method Event
Document NewProjectDocument(string templateFileName); DocumentCreated
Document NewFamilyDocument(string templateFileName); DocumentCreated
Document NewProjectTemplateDocument(string templateFilename); DocumentCreated
Each method requires a template file name as the parameter. The created document is returned
based on the template file.
Method Event
Save() DocumentSaved
SaveAs() DocumentSavedAs
Close() DocumentClosed
Method Event
SaveAndClose() DocumentSaved, DocumentClosed
SaveAs() DocumentSavedAs
4.4 Settings
The following table identifies the commands in the Revit Platform UI Manage tab, and
corresponding APIs.
Note:
Project Information - The API provides the ProjectInfo class which is retrieved using
Document.ProjectInformation to represent project information in the Revit project. The
following table identifies the corresponding APIs for the Project Information parameters.
Table 9: ProjectInformation
Use the properties exposed by ProjectInfo to retrieve and set all strings. These properties
are implemented by the corresponding built-in parameters. You can get or set the values
through built-in parameters directly. For more information about how to gain access to
these parameters through the built-in parameters, see the Parameter section in the
Elements Essentials chapter. The recommended way to get project information is to use the
ProjectInfo properties.
Fill Patterns - Retrieve all Fill Patterns in the current document using a
FilteredElementCollector filtering on class FillPatternElement. Specific FillPatterns can be
retrieved using the static methods FillPatternElement.GetFillPattern(Document, ElementId)
or FillPatternElement.GetFillPatternByName (Document, string).
Object Styles - Use Settings.Categories to retrieve all information in Category objects
except for Line Style. For more details, see the Categories section in the Elements Essentials
chapter and Material chapter.
Phases - Revit maintains the element lifetime by phases, which are distinct time periods in
the project lifecycle. All phases in a document are retrieved using the Document.Phases
property. The property returns an array containing Phase class instances. However, the
Revit API does not expose functions from the Phase class.
Options - The Options command configures project global settings. You can retrieve an
Options.Application instance using the Application.Options property. Currently, the
Options.Application class only supports access to library paths and shared parameters file.
Area and Volume Calculations The Document.Settings.VolumeCalculationSetting allows
you to enable or disable volume calculations, and to change the room boundary location.
4.5 Units
The Revit Unit System is based on seven base units for seven base quantities that are independent.
The base units are identified in the following table.
Note: Since Revit stores lengths in feet and other basic quantities in metric units, a derived unit
involving length will be a non-standard unit based on both the Imperial and the Metric
systems. For example, since a force is measured in mass-length per time squared, it is
stored in kg-ft / s2.
The Revit Platform API provides access to project units and format via the Document.ProjectUnit.
The APIs that provide access to Project units and format settings include the following:
5 Elements Essentials
An Element corresponds to a single building or drawing component, such as a door, a wall, or a
dimension. In addition, an Element can be a door type, a view, or a material definition.
5.2.1 Category
The Element.Category property represents the category or subcategory to which an Element
belongs. It is used to identify the Element type. For example, anything in the walls Category is
considered a wall. Other categories include doors and rooms.
Categories are the most general class. The Document.Settings.Categories property is a map that
contains all Category objects in the document and is subdivided into the following:
Model Categories - Model Categories include beams, columns, doors, windows, and walls.
Annotation Categories. Annotation Categories include dimensions, grids, levels, and
textnotes.
5.2.2 Family
Families are classes of Elements within a category. Families can group Elements by the following:
A common set of parameters (properties).
Identical use.
Similar graphical representation.
Most families are component Family files, meaning that you can load them into your project or
create them from Family templates. You determine the property set and the Family graphical
representation.
Another family type is the system Family. System Families are not available for loading or creating.
Revit predefines the system Family properties and graphical representation; they include walls,
dimensions, roofs, floors (or slabs), and levels.
5.2.3 ElementType
In the Revit Platform API, Symbols are usually non-visible elements used to define instances.
Symbols are called Types in the user interface.
A type can be a specific size in a family, such as a 1730 X 2032 door, or an 8x4x1/2 angle.
A type can be a style, such as default linear or default angular style for dimensions.
Symbols represent Elements that contain shared data for a set of similar elements. In some cases,
Symbols represent building components that you can get from a warehouse, such as doors or
windows, and can be placed many times in the same building. In other cases, Symbols contain host
object parameters or other elements. For example, a WallType Symbol contains the thickness,
number of layers, material for each layer, and other properties for a particular wall type.
FamilySymbol is a symbol in the API. It is also called Family Type in the Revit user interface.
FamilySymbol is a class of elements in a family with the exact same values for all properties. For
example, all 32x78 six-panel doors belong to one type, while all 24x80 six-panel doors belong to
another type. Like a Family, a FamilySymbol is also a template. The FamilySymbol object is derived
from the ElementType object and the Element object.
5.2.4 Instance
Instances are items with specific locations in the building (model instances) or on a drawing sheet
(annotation instances). Instance represents transformed identical copies of an ElementType. For
example, if a building contains 20 windows of a particular type, there is one ElementType with 20
Instances. Instances are called Components in the user interface.
Note: For FamilyInstance, the Symbol property can be used instead of the GetTypeId() method to
get the corresponding FamilySymbol. It is convenient and safe since you do not need to do a
type conversion.
5.3.3 Selection
Rather than getting a filtered collection of all of the elements in the model, you can access just the
elements that have been selected. You can get the selected objects from the current active
document using the UIDocument.Selection.Elements property. For more information on using the
active selection, see the Selection chapter.
5.4.1 ElementId
Every element in an active document has a unique identifier represented by the ElementId storage
type. ElementId objects are project wide. It is a unique number that is never changed in the
element model, which allows it to be stored externally to retrieve the element when needed.
To view an element ID in Revit, complete the following steps:
1. From the Modify tab, on the Inquiry panel, select Element ID. The Element ID drop down
menu appears.
Select IDs of Selection to get the ID number for one element.
If the ID number does not exist in the project, the element you retrieve is null.
Use ElementId to check whether two Elements in one project are equal or not. It is not
recommended to use the Object.Equal() method.
5.4.2 UniqueId
Every element has a UniqueId, represented by the String storage type. The UniqueId corresponds
to the ElementId. However, unlike ElementId, UniqueId functions like a GUID (Globally Unique
Identifier), which is unique across separate Revit projects. UniqueId can help you to track elements
when you export Revit project files to other formats.
Note: The ElementId is only unique in the current project. It is not unique across separate Revit
projects. UniqueId is always unique across separate projects.
5.4.3 Location
The location of an object is important in the building modeling process. In Revit, some objects have
a point location. For example a table has a point location. Other objects have a line location,
representing a location curve or no location at all. A wall is an element that has a line location.
The Revit Platform API provides the Location class and location functionality for most elements. For
example, it has the Move() and Rotate() methods to translate and rotate the elements. However,
the Location class has no property from which you can get information such as a coordinate. In this
situation, downcast the Location object to its subclasslike LocationPoint or LocationCurvefor
more detailed location information and control using object derivatives.
Retrieving an elements physical location in a project is useful when you get the geometry of an
object. The following rules apply when you retrieve a location:
Wall, Beam, and Brace are curve-driven using LocationCurve.
Room, RoomTag, SpotDimension, Group, FamilyInstances that are not curve-driven, and all
In-Place-FamilyInstances use LocationPoint.
In the Revit Platform API, curve-driven means that the geometry or location of an element is
determined by one or more associated curves. Almost all analytical model elements are curve-
driven linear and area loads, walls, framing elements, and so on.
Other Elements cannot retrieve a LocationCurve or LocationPoint. They return Location with no
information.
Note: There are other Elements without Location information. For example a LineLoad (with host)
or an AreaLoad (with host) have no Location.
Some FamilyInstance LocationPoints, such as all in-place-FamilyInstances and masses, are
specified to point (0, 0, 0) when they are created. The LocationPoint coordinate is changed if you
transform or move the instance.
To change a Groups LocationPoint, do one of the following:
Drag the Group origin in the Revit UI to change the LocationPoint coordinate. In this
situation, the Group LocationPoint is changed while the Groups location is not changed.
Move the Group using the ElementTransformUtils.MoveElement() method to change the
LocationPoint. This changes both the Group location and the LocationPoint.
For more information about LocationCurve and LocationPoint, see the Editing Elements chapter
Move section.
5.4.4 Level
Levels are finite horizontal planes that act as a reference for level-hosted or level-based elements,
such as roofs, floors, and ceilings. The Revit Platform API provides a Level class to represent level
lines in Revit. Get the Level object to which the element is assigned using the API if the element is
level-based.
A number of elements, such as a column, use a level as a basic reference. When you get the
column level, the level you retrieve is the Base Level.
5.4.5 Parameter
Every element has a set of parameters that users can view and edit in Revit. The parameters are
visible in the Element Properties dialog box (select any element and click the Properties button
next to the type selector). For example, the following image shows Room parameters.
6 Filtering
The Revit API provides a mechanism for filtering and iterating elements in a Revit document. This
is the best way to get a set of related elements, such as all walls or doors in the document. Filters
can also be used to find a very specific set of elements, such as all beams of a specific size.
The basic steps to get elements passing a specified filter are as follows:
1. Create a new FilteredElementCollector
2. Apply one or more filters to it
3. Get filtered elements or element ids (using one of several methods)
The following sample covers the basic steps to filtering and iterating elements in the document.
Code Region 6-1: Use element filtering to get all wall instances in document
// Find all Wall instances in the document by using category filter
ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
Once a filter is created, it needs to be applied to the FilteredElementCollector. The generic method
WherePasses() is used to apply a single ElementFilter to the FilteredElementCollector.
// Create a Outline, uses a minimum and maximum XYZ point to initialize the outline.
Outline myOutLn = new Outline(new XYZ(0, 0, 0), new XYZ(100, 100, 100));
// Find all walls which don't intersect with BoundingBox: use an inverted filter
// to match elements
// Use shortcut command OfClass() to find walls only
BoundingBoxIntersectsFilter invertFilter = new BoundingBoxIntersectsFilter(myOutLn, true);
collector = new FilteredElementCollector(document);
IList<Element> notIntersectWalls =
collector.OfClass(typeof(Wall)).WherePasses(invertFilter).ToElements();
The next example uses an exclusion filter to find all walls that are not currently selected in the
document.
Note that the ElementClassFilter will match elements whose class is an exact match to the input
class, or elements whose class is derived from the input class. The following example uses an
ElementClassFilter to get all loads in the document.
There is a small subset of Element subclasses in the API which are not supported by the element
class filter. These types exist in the API, but not in Revit's native object model, which means that
this filter doesn't support them. In order to use a class filter to find elements of these types, it is
necessary to use a higher level class and then process the results further to find elements
matching only the subtype. Note that dedicated filters exist for some of these types. The following
types are affected by this restriction:
The ElementParameterFilter is a powerful filter that can find elements based on values of
parameters they may have. It can find elements whose parameter values match a specific value or
are greater or less than some value. ElementParameterFilter can also be used to find elements
that support a specific shared parameter.
The example below uses an ElementParameterFilter to find rooms whose size is more than 100
square feet and rooms with less than 100 square feet.
The following example shows how to use the FamilyStructuralMaterialTypeFilter to find all families
whose material type is wood. It also shows how to use an inverted filter to find all families whose
material type is not wood.
// Find families are not Wood: Use inverted filter to match families
FamilyStructuralMaterialTypeFilter notWoodFilter =
new FamilyStructuralMaterialTypeFilter(StructuralMaterialType.Wood, true);
collector = new FilteredElementCollector(document);
ICollection<Element> notWoodFamilies = collector.WherePasses(notWoodFilter).ToElements();
element ids, the call to Document.Element with the ElementId will always return a valid Element
(or a null reference if the element has been deleted).
Using the ToElements() method to get the filter results as a collection of elements allows for the
use of foreach to examine each element in the set, as is shown below:
TaskDialog.Show("Revit", prompt);
In some cases, FirstElement() is not sufficient. This next example shows how to use extension
methods to get the first non-template 3D view (which is useful for input to
FindReferencesWithContextByDirection()).
Code Region 6-11: Get first passing element using extension methods
// Use filter to find a non-template 3D view
// This example does not use FirstElement() since first filterd view3D might be a template
FilteredElementCollector collector = new FilteredElementCollector(document);
// apply ElementClassFilter
collector.OfClass(typeof(View3D));
The following example demonstrates the use of the FirstElementId() method to get one passing
element (a 3d view in this case) and the use of ToElementIds() to get the filter results as a
collection of element ids (in order to delete a set of elements in this case).
document.Delete(familyInstanceIds);
}
The GetElementIterator() method is used in the following example that iterates through the filtered
elements to check the flow state of some pipes.
// Use Linq query to find family instances whose name is 60" x 30" Student
var query = from element in collector
where element.Name == "60\" x 30\" Student"
select element;
7 Selection
You can get the selected objects from the current active document using the
UIDocument.Selection.Elements property. The selected objects are in an ElementSet in Revit. From
this Element set, all selected Elements are retrieved. The Selection object can also be used to
change the current selection programmatically.
The PickPoint() method has 2 overloads with an ObjectSnapTypes parameter which is used to
specify the type of snap types used for the selection. More than one can be specified, as shown in
the next example.
TaskDialog.Show("Revit", strCoords);
}
The next example demonstrates the use of ISelectionFilter to allow only planar faces to be
selected.
For more information about retrieving Elements from selected Elements, see the Walkthrough:
Retrieve Selected Elements section in the Getting Started chapter.
8 Parameters
Revit provides a general mechanism for giving each element a set of parameters that you can edit.
In the Revit UI, parameters are visible in the Element Properties dialog box. This chapter describes
how to get and use built-in parameters using the Revit Platform API. For more information about
user-defined shared parameters, see the Shared Parameters chapter.
In the Revit Platform API, Parameters are managed in the Element class. You can access
Parameters in these ways:
By iterating through the Element.Parameters collection of all parameters for an Element (for
an example, see the sample code in Walkthrough: Get Selected Element Parameters below).
By accessing the parameter directly through the overloaded Element.Parameter property. If
the Parameter doesnt exist, the property returns null.
By accessing a parameter by name via the Element.ParametersMap collection.
You can retrieve the Parameter object from an Element if you know the name string, built-in ID,
definition, or GUID. The Parameter[String] property overload gets a parameter based on its
localized name, so your code should handle different languages if its going to look up parameters
by name and needs to run in more than one locale.
The Parameter[GUID] property overload gets a shared parameter based on its Global Unique ID
(GUID), which is assigned to the shared parameter when its created.
ElementId id = para.AsElementId();
if (id.Value >= 0)
{
defName += " : " + document.get_Element(ref id).Name;
}
else
{
defName += " : " + id.Value.ToString();
}
break;
case StorageType.Integer:
if (ParameterType.YesNo == para.Definition.ParameterType)
{
if (para.AsInteger() == 0)
{
defName += " : " + "False";
}
else
{
defName += " : " + "True";
}
}
else
{
defName += " : " + para.AsInteger().ToString();
}
break;
case StorageType.String:
defName += " : " + para.AsString();
break;
default:
defName = "Unexposed parameter.";
break;
}
return defName;
}
Note: In Revit, some parameters have values in the drop-down list in the Element Properties
dialog box. You can get the numeric values corresponding to the enumerated type for the
Parameter using the Revit Platform API, but you cannot get the string representation for the
values using the Parameter.AsValueString() method.
8.2 Definition
The Definition object describes the data type, name, and other Parameter details. There are two
kinds of definition objects derived from this object.
InternalDefinition represents all kinds of definitions existing entirely in the Revit database.
ExternalDefinition represents definitions stored on disk in a shared parameter file.
You should write the code to use the Definition base class so that the code is applicable to both
internal and external parameter Definitions. The following code sample shows how to find a specific
parameter using the definition type.
8.2.1 ParameterType
This property returns parameter data type, which affects how the parameter is displayed in the
Revit UI. The ParameterType enumeration members are:
Member Description
name
Number The parameter data should be interpreted as a real number, possibly including decimal
points.
Moment The data value will be represented as a moment.
AreaForce The data value will be represented as an area force.
LinearForce The data value will be represented as a linear force.
Force The data value will be represented as a force.
YesNo A boolean value that will be represented as Yes or No.
Material The value of this property is considered to be a material.
URL A text string that represents a web address.
Angle The parameter data represents an angle. The internal representation will be in radians. The
user visible representation will be in the units that the user has chosen.
Volume The parameter data represents a volume. The internal representation will be in decimal cubic
feet. The user visible representation will be in the units that the user has chosen.
Area The parameter data represents an area. The internal representation will be in decimal square
feet. The user visible representation will be in the units that the user has chosen.
Integer The parameter data should be interpreted as a whole number, positive or negative.
Invalid The parameter type is invalid. This value should not be used.
Length The parameter data represents a length. The internal representation will be in decimal feet.
The user visible representation will be in the units system that the user has chosen.
Text The parameter data should be interpreted as a string of text.
For more details about ParameterType.Material, see the Material chapter.
8.2.2 ParameterGroup
The Definition class ParameterGroup property returns the parameter definition group ID. The
BuiltInParameterGroup is an enumerated type listing all built-in parameter groups supported by
Revit. Parameter groups are used to sort parameters in the Element Properties dialog box.
8.3 BuiltInParameter
The Revit Platform API has a large number of built-in parameters, defined in the
Autodesk.Revit.Parameters.BuiltInParameter enumeration (see the RevitAPI Help.chm file for the
definition of this enumeration). The parameter ID is used to retrieve the specific parameter from an
element, if it exists, using the Element.Parameter property. However, not all parameters can be
retrieved using the ID. For example, family parameters are not exposed in the Revit Platform API,
therefore, you cannot get them using the built-in parameter ID.
The following code sample shows how to get the specific parameter using the BuiltInParameter Id:
return parameter;
}
Note: With the Parameter overload, you can use an Enumerated type BuiltInParameter as the
method parameter. For example, use BuiltInParameter.GENERIC_WIDTH.
If you do not know the exact BuiltInParameter ID, get the parameter by iterating the ParameterSet
collection.
Another approach for testing or identification purposes is to test each BuiltInParameter using the
get_Parameter() method. Use the Enum class to iterate as illustrated in the following code. When
you use this method, it is possible that the ParameterSet collection may not contain all parameters
returned from the get_Parameter() method, though this is infrequent.
8.4 StorageType
StorageType describes the type of parameter values stored internally.
Based on the property value, use the corresponding get and set methods to retrieve and set the
parameter data value.
The StorageType is an enumerated type that lists all internal parameter data storage types
supported by Revit:
In most cases, the ElementId value is a positive number. However, it can be a negative number.
When the ElementId value is negative, it does not represent an Element but has another meaning.
For example, the storage type parameter for a beams Vertical Projection is ElementId. When the
parameter value is Level 1 or Level 2, the ElementId value is positive and corresponds to the
ElementId of that level. However, when the parameter value is set to Auto-detect, Center of Beam
or Top of Beam, the ElementId value is negative.
return result;
}
The Set() method return value indicates that the Parameter value was changed. The Set() method
returns true if the Parameter value was changed, otherwise it returns false.
Not all Parameters are writable. An Exception is thrown if the Parameter is read-only.
// Change the Sill Height only and notice that Head Height is recalculated
sillPara.Set(sillHeight + 2.0);
double newHeadHeight = headPara.AsDouble();
MessageBox.Show("Old head height: " + origHeadHeight + "; new head height: "
+ newHeadHeight);
}
9 Collections
Most Revit Platform API properties and methods use customized collection classes defined in the
Revit Platform API when providing access to a group of related items. These collections are of one
of three basic types:
Array
Set
Map
These collection classes were written before generic type-safe .NET classes like List<T>
existed.
The IEnumerable and IEnumerator interfaces implemented in Revit collection types are defined in
the System.Collection namespace.
9.1 Interface
The following sections discuss interface-related collection types.
9.1.1 IEnumerable
The IEnumerable interface is in the System.Collections namespace. It exposes the enumerator,
which supports a simple iteration over a non-generic collection. The GetEnumerator() method gets
an enumerator that implements this interface. The returned IEnumerator object is iterated
throughout the collection. The GetEnumerator() method is used implicitly by foreach loops in C#.
9.1.2 IEnumerator
The IEnumerator interface is in the System.Collections namespace. It supports a simple iteration
over a non-generic collection. IEnumerator is the base interface for all non-generic enumerators.
The foreach statement in C# hides the enumerators complexity.
Note: Using foreach is recommended instead of directly manipulating the enumerator.
Enumerators are used to read the collection data, but they cannot be used to modify the
underlying collection.
Use IEnumerator as follows:
Initially, the enumerator is positioned in front of the first element in the collection. However,
it is a good idea to always call Reset() when you first obtain the enumerator.
The Reset() method moves the enumerator back to the original position. At this position,
calling the Current property throws an exception.
Call the MoveNext() method to advance the enumerator to the collections first element
before reading the current iterator value.
The Current property returns the same object until either the MoveNext() method or Reset()
method is called. The MoveNext() method sets the current iterator to the next element.
If MoveNext passes the end of the collection, the enumerator is positioned after the last
element in the collection and MoveNext returns false.
When the enumerator is in this position, subsequent calls to the MoveNext also return
false.
If the last call to the MoveNext returns false, calling the Current property throws an
exception.
To set the current iterator to the first element in the collection again, call the Reset()
method followed by MoveNext().
An enumerator remains valid as long as the collection remains unchanged.
If changes are made to the collection, such as adding, modifying, or deleting elements,
the enumerator is invalidated and the next call to the MoveNext() or the Reset() method
throws an InvalidOperationException.
If the collection is modified between the MoveNext and the current iterator, the Current
property returns to the specified element, even if the enumerator is already invalidated.
Note: All calls to the Reset() method must result in the same state for the enumerator. The
preferred implementation is to move the enumerator to the collection beginning, before the
first element. This invalidates the enumerator if the collection is modified after the
enumerator was created, which is consistent with the MoveNext() and the Current
properties.
TaskDialog.Show("Revit",info);
TaskDialog.Show("Revit",info);
All collections implement the IEnumerable interface and all relevant iterators implement the
IEnumerator interface. As a result, all methods and properties are implemented in the Revit
Platform API and can play a role in the relevant collections.
The following table compares the Array, Map, and Set methods and properties.
Note: The GetEnumerator() method uses the ForwardIterator() method in its core code. Using the
ForwardIterator() method to get the corresponding Iterator works the same way as using
GetEnumerator().
In the Revit Platform API, Collections have their own Iterators that implement the IEnumerator
interface. Use the GetEnumerator() method (or ForwardIterator) to get the Iterator. To implement
the IEnumerator interface, the Iterator requires the following:
MoveNext() method
Reset() method
The Current property
In general, Array, Map, and Set are not used generically. Instead, use a collection that has an
idiographic type, such as ElementSet.
Implementing all of the collections is similar. The following example uses ElementSet and
ModelCurveArray to demonstrate how to use the main collection properties:
// Store operation
//assume 131943 is a model line element id
Autodesk.Revit.DB.ElementId id = new Autodesk.Revit.DB.ElementId(131943);
lineArray.Append(document.get_Element(id) as ModelLine);
XYZ startPoint = new XYZ(0, 0, 0); // the start point of the line
XYZ endPoint = new XYZ(10, 10, 0); // the end point of the line
// create geometry line
Line geometryLine = document.Application.Create.NewLine(startPoint, endPoint, true);
10 Editing Elements
In Revit, you can move, rotate, delete, mirror, group, and array one element or a set of elements
with the Revit Platform API. Using the editing functionality in the API is similar to the commands in
the Revit UI.
Member Description
MoveElement( Document,
Move an element in the document by a specified vector.
ElementId, XYZ)
MoveElements(Document, Move several elements by a set of IDs in the document by a specified
ICollection<ElementId>, XYZ) vector.
Note: When you use the MoveElement() or MoveElements() methods, the following rules apply.
The methods cannot move a level-based element up or down from the level. When the
element is level-based, you cannot change the Z coordinate value. However, you can place
the element at any location in the same level. As well, some level based elements have an
offset instance parameter you can use to move them in the Z direction.
For example, if you create a new column at the original location (0, 0, 0) in Level1, and
then move it to the new location (10, 20, 30), the column is placed at the location (10, 20,
0) instead of (10, 20, 30), and the MoveElement() method returns success.
TaskDialog.Show("Revit",info);
}
When you move one or more elements, associated elements are moved. For example, if a
wall with windows is moved, the windows are also moved.
If you pin the element in Revit, the Element.Pinned property is true. This means that the
element cannot be moved or rotated.
Another way to move an element in Revit is to use Location and its derivative objects. In the Revit
Platform API, the Location object provides the ability to translate and rotate elements. More
location information and control is available using the Location object derivatives such as
LocationPoint or LocationCurve. If the Location element is downcast to a LocationCurve object or a
LocationPoint object, move the curve or the point to a new place directly.
When you move the element, note that the vector (10, 20, 0) is not the destination but the offset.
The following picture illustrates the wall position before and after moving.
You can also get or set a curve-based elements join properties with the LocationCurve.JoinType
property.
Use the LocationPoint Point property to set the elements physical location.
Member Description
RotateElement(Document, ElementId, Rotate an element in the document by a specified number of
Line, double) radians around a given axis.
RotateElements(Document, Rotate several elements by IDs in the project by a specified
ICollection<ElementId>, Line, double) number of radians around a given axis.
In these methods, the angle of rotation is in radians. The positive radian means rotating
counterclockwise around the specified axis, while the negative radian means clockwise, as the
following pictures illustrates.
If the element Location can be downcast to a LocationCurve or a LocationPoint, you can rotate the
curve or the point directly.
return rotated;
}
if (null != location)
{
XYZ aa = location.Point;
XYZ cc = new XYZ(aa.X, aa.Y, aa.Z + 10);
Line axis = application.Create.NewLineBound(aa, cc);
rotated = location.Rotate(axis, Math.PI / 2.0);
}
return rotated;
}
10.3 Mirror
The ElementTransformUtils class provides two static methods to mirror one or more elements in
the project.
Member Description
MirrorElement(Document, ElementId,
Mirror one element about a geometric plane.
Plane)
Member Description
MirrorElements(Document,
Mirror several elements about a geometric plane.
ICollection<ElementId>, Plane)
There are two ways to mirror one element and two ways to mirror several elements. After
performing the mirror operation, you can access the new elements from the Selection ElementSet.
The following code illustrates how to mirror a wall using a plane calculated based on a side face of
the wall.
UV bboxMin = face.GetBoundingBox().Min;
// create a plane based on this side face with an offset of 10 in the X & Y directions
Every FamilyInstance has a Mirrored property. It indicates whether a FamilyInstance (for example
a column) is mirrored.
The ElementTransformUtils class provides two additional methods that can be used to determine if
one or more elements can be mirrored: CanMirrorElement() and CanMirrorElements().
10.4 Group
The Revit Platform API uses the Creation.Document.NewGroup() method to select an element or
multiple elements or groups and then combines them. With each instance of a group that you
place, there is associatively among them. For example, you create a group with a bed, walls, and
window and then place multiple instances of the group in your project. If you modify a wall in one
group, it changes for all instances of that group. This makes modifying your building model much
easier because you can change several instances of a group in one operation.
group = document.Create.NewGroup(selection);
}
Initially, the group has a generic name, such as Group 1. It can be modified by changing the name
of the group type as follows:
There are three types of groups in Revit; Model Group, Detail Group, and Attached Detail Group. All
are created using the NewGroup() method. The created Groups type depends on the Elements
passed.
If no detail Element is passed, a Model Group is created.
If all Elements are detail elements, then a Detail Group is created.
If both types of Elements are included, a Model Group that contains an Attached Detail
Group is created and returned.
Note: When elements are grouped, they can be deleted from the project.
When a model element in a model group is deleted, it is still visible when the mouse cursor
hovers over or clicks the group, even if the application returns Succeeded to the UI. In fact,
the model element is deleted and you cannot select or access that element.
When the last member of a group instance is deleted, excluded, or removed from the
project, the model group instance is deleted.
When elements are grouped, they cannot be moved or rotated. If you perform these operations on
the grouped elements, nothing happens to the elements, though the Move() or Rotate() method
returns true.
You cannot group dimensions and tags without grouping the elements they reference. If you do,
the API call will fail.
You can group dimensions and tags that refer to model elements in a model group. The dimensions
and tags are added to an attached detail group. The attached detail group cannot be moved,
copied, rotated, arrayed, or mirrored without doing the same to the parent group.
10.5 Array
The Revit Platform API provides two classes, LinearArray and RadialArray to array one or more
elements in the project. These classes provide static methods to create a linear or radial array of
one or more selected components. Linear arrays represent an array created along a line from one
point, while radial arrays represent an array created along an arc.
As an example of using an array, you can select a door and windows located in the same wall and
then create multiple instances of the door, wall, and window configuration.
Both LinearArray and RadialArray also provide methods to array one or several elements without
being grouped and associated. Although similar to the Create() methods for arraying elements,
each resulting element is independent of the others, and can be manipulated without affecting the
other elements. See the tables below for more information on the methods available to create
linear or radial arrays.
Member Description
Member Description
Create(Document, View, ElementId, int, XYZ,
Array one element in the project by a specified number.
ArrayAnchorMember)
Create(Document, View,
ICollection<ElementId>, int, XYZ, Array a set of elements in the project by a specified number.
ArrayAnchorMember)
ArrayElementWithoutAssociation(Document,
Array one element in the project by a specified number. The
View, ElementId, int, XYZ,
resulting elements are not associated with a linear array.
ArrayAnchorMember)
ArrayElementsWithoutAssociation(Document,
Array a set of elements in the project by a specified number.
View, ICollection<ElementId>, int, XYZ,
The resulting elements are not associated with a linear array.
ArrayAnchorMember)
Member Description
Create(Document, View, ElementId, int, Array one element in the project based on an input rotation
Line, double, ArrayAnchorMember) axis.
Create(Document, View,
Array a set of elements in the project based on an input
ICollection<ElementId>, int, Line, double,
rotation axis.
ArrayAnchorMember)
ArrayElementWithoutAssociation(Document, Array one element in the project based on an input rotation
View, ElementId, int, Line, double, axis.. The resulting elements are not associated with a linear
ArrayAnchorMember) array.
ArrayElementsWithoutAssociation(Document, Array a set of elements in the project based on an input
View, ICollection<ElementId>, int, Line, rotation axis.. The resulting elements are not associated with
double, ArrayAnchorMember) a linear array.
10.6 Delete
The Revit Platform API provides Delete() methods to delete one or more elements in the project.
Member Description
Delete(Element) Delete an element from the project.
Delete(ElementId) Delete an element from the project using the element ID
Delete(ICollection<ElementId>) Delete several elements from the project by their IDs.
Delete(ElementSet) Delete several elements from the project.
You can delete the element specified using the element object or the ElementId. These methods
delete a specific element and any elements dependent on it.
if (0 == deletedIdSet.Count)
{
throw new Exception("Deleting the selected element in Revit failed.");
}
String prompt = "The selected element has been removed and ";
prompt += deletedIdSet.Count - 1;
prompt += " more dependent elements have also been removed.";
if (0 == deletedIdSet.Count)
{
throw new Exception("Deleting the selected element in Revit failed.");
}
String prompt = "The selected element has been removed and ";
prompt += deletedIdSet.Count - 1;
prompt += " more dependent elements have also been removed.";
Note: When an element is deleted, any child elements associated with that element are
also deleted, as indicated in the samples above.
The API also provides two ways to delete several elements.
if (0 == deletedIdSet.Count)
{
throw new Exception("Deleting the selected elements in Revit failed.");
}
if (0 == deletedIdSet.Count)
{
throw new Exception("Deleting the selected elements in Revit failed.");
}
Note: After you delete the elements, any references to the deleted elements become invalid and
throw an exception if they are accessed.
Some elements have special deletion methods. For example, the Materials.Remove()
method is specifically for deleting Material objects. For more information, see the Material
chapter Material Management section.
11.1 Walls
There are four kinds of Walls represented by the WallType.WallKind enumeration:
Stacked
Curtain
Basic
Unknown
The Wall and WallType class work with the Basic wall type while providing limited function to the
Stacked and Curtain walls. On occasion you need to check a Wall to determine the wall type. For
example, you cannot get sub-walls from a Stacked Wall using the API. WallKind is read only and
set by System Family.
The Wall.Flipped property and Wall.flip() method gain access to and control Wall orientation. In the
following examples, a Wall is compared before and after calling the flip() method.
The Orientation property before is (0.0, 1.0, 0.0).
The Orientation property after the flip call is (0.0, -1.0, 0.0).
The Wall Location Line (WALL_KEY_REF_PARAM) parameter is 3, which represents Finish
Face: Interior in the following table.
Taking the line as reference, the Wall is moved but the Location is not changed.
There are five override methods in the Document class to create a Wall:
Name Description
NewWall(Curve, WallType, Level, Double, Creates a new rectangular profile wall within the
Double, Boolean, Boolean) project.
NewWall(CurveArray, Boolean) Creates a non rectangular profile wall within the
project using the default wall style.
NewWall(Curve, Level, Boolean) Creates a new rectangular profile wall within the
project on the specified level using the default wall
style.
NewWall(CurveArray, WallType, Level, Creates a non rectangular profile wall within the
Boolean) project.
NewWall(CurveArray, WallType, Level, Creates a non rectangular profile wall within the
Boolean, XYZ) project with a specific normal.
The WallType Wall Function (WALL_ATTR_EXTERIOR) parameter influences the created wall
instance Room Bounding and Structural Usage parameter. The WALL_ATTR_EXTERIOR value is an
integer:
There are two override methods in the Document class to batch create multiple walls:
Name Description
NewWalls(List(Of Creates rectangular walls within the
RectangularWallCreationData)) project.
NewWalls(List(Of ProfiledWallCreationData)) Creates profile walls within the project.
11.2.1Modifying Slabs
You can modify the form of slab-based elements using the SlabShapeEditor class. This class allows
you to:
Manipulate one or more of the points or edges on a selected slab-based element
Add points on the element to change the elements geometry
Add linear edges and split the existing face of a slab into smaller sub-regions
Remove the shape modifier and reset the element geometry back to the unmodified shape.
Heres an example of reverting a selected modified floor back to its original shape:
For more detailed examples of using the SlabShapeEditor and related classes, see the
SlabShapeEditing sample application included in the Revit SDK.
11.3 Roofs
Roofs in the Revit Platform API all derive from the RoofBase object. There are two classes:
FootPrintRoof represents a roof made from a building footprint
ExtrusionRoof represents roof made from an extruded profile
Both have a RoofType property that gets or sets the type of roof. This example shows how you
can create a footprint roof based on some selected walls:
For an example of how to create an ExtrusionRoof, see the NewRoof sample application included
with the Revit API SDK.
11.4 Curtains
Curtain walls, curtain systems, and curtain roofs are host elements for CurtainGrid objects. A
curtain wall can have only one CurtainGrid, while curtain systems and curtain roofs may contain
one or more CurtainGrids. For an example of how to create a CurtainSystem, see the
CurtainSystem sample application included with the Revit SDK. For an example of creating a
curtain wall and populating it with grid lines, see the CurtainWallGrid sample application.
11.5.2Ceiling
Ceiling does not have a specific class, so you cant create it using the API. The Ceiling object is an
Element in the OST_Ceilings category.
The Ceiling element type is HostObjAttributes using the OST_Ceilings category with its
CompoundStructure available.
11.6 CompoundStructure
Some host elements, such as Walls, Floors, Ceilings, and Roofs, include parallel layers. The parallel
layers are available from the CompoundStructure class, available from the
HostObjAttributes.GetCompoundStructure() method.
Note: The following items are important when using CompoundStructure:
The total width of the element is the sum of each CompoundStructureLayers widths. You
cannot change the elements total width directly but you can change it via changing the
CompoundStructureLayer width.
You must set the CompoundStructure back to the HostObjAttributes instance (using the
HostObjAttributes.SetCompoundStructure() method) in order for any change to be stored.
Changing the CompoundStructureLayer changes every element instance in the current
document.
The CompoundStructureLayer DeckProfileId, and DeckEmbeddingType, properties only work
with Slab in Revit Structure. For more details, refer to the Revit Structure chapter.
11.6.1Material
Each CompoundStructureLayer in HostObjAttributes is typically displayed with some type of
material. If CompoundStructureLayer.MaterialId returns -1, it means the Material is Category-
related. For more details, refer to the Material chapter. Getting the CompoundStructureLayer
Material is illustrated in the following sample code:
if (WallKind.Basic == aWallType.Kind)
{
// Get CompoundStructure
CompoundStructure comStruct = aWallType.GetCompoundStructure();
Categories allCategories = document.Settings.Categories;
break;
}
if (null == layerMaterial)
{
// CompoundStructureLayer's default Material is its SubCategory
layerMaterial = wallMaterial;
}
}
TaskDialog.Show("Revit","Layer Material: " + layerMaterial);
}
}
}
11.7 Opening
In the Revit Platform API, the Opening object is derived from the Element object and contains all of
the Element object properties and methods. To retrieve all Openings in a project, use
Document.ElementIterator to find the Elements.Opening objects.
11.7.1General Properties
This section explains how to use the Opening properties.
IsRectBoundary - Identifies whether the opening has a rectangular boundary.
If true, it means the Opening has a rectangular boundary and you can get an
IList<XYZ> collection from the Opening BoundaryRect property. Otherwise, the property
returns null.
If false, you can get a CurveArray object from the BoundaryCurves property.
BoundaryCurves - If the opening boundary is not a rectangle, this property retrieves
geometry information; otherwise it returns null. The property returns a CurveArray object
containing the curves that represent the Opening object boundary.
For more details about Curve, refer to the Geometry chapter.
BoundaryRect - If the opening boundary is a rectangle, you can get the geometry
information using this property; otherwise it returns null.
The property returns an IList<XYZ> collection containing the XYZ coordinates.
The IList<XYZ> collection usually contains the rectangle boundary minimum (lower left)
and the maximum (upper right) coordinates.
Host - The host property retrieves the Opening host element. The host element is the
element cut by the Opening object.
Note: If the Opening objects category is Shaft Openings, the Opening host is null.
The following example illustrates how to retrieve the existing Opening properties.
11.7.2Create Opening
In the Revit Platform API, use the Document.NewOpening() method to create an opening in your
project. There are four method overloads you can use to create openings in different host
elements:
12 Family Instances
In this chapter, you will learn about the following:
The relationship between family and family instance
Family and family instance features
How to load or create family and family instance features.
Note that while most component elements are exposed through the API classes FamilySymbol and
FamilyInstance, some have been wrapped with specific API classes. For example,
AnnotationSymbolType wraps FamilySymbol and AnnotationSymbol wraps FamilyInstance.
12.2 Family
The Family class represents an entire Revit family. It contains the FamilySymbols used by
FamilyInstances.
12.2.1Loading Families
The Document class contains the LoadFamily() and LoadFamilySymbol() methods.
LoadFamily() loads an entire family and all of its types or symbols into the project.
LoadFamilySymbol() loads only the specified family symbol from a family file into the
project.
Note: To improve the performance of your application and reduce memory usage, if possible load
specific FamilySymbols instead of entire Family objects.
The family file path is retrieved using the Options.Application object LibraryPaths property.
The Options.Application object is retrieved using the Application object Options property.
In LoadFamilySymbol(), the input argument Name is the same string value returned by the
FamilySymbol object Name property.
For more information, refer to the Code Samples in this chapter.
12.2.2Categories
The FamilyBase.FamilyCategory property indicates the category of the Family such as Columns,
Furniture, Structural Framing, or Windows.
12.3 FamilyInstances
Examples of categories of FamilyInstance objects in Revit are Beams, Braces, Columns, Furniture,
Massing, and so on. The FamilyInstance object provides more detailed properties so that the family
instance type and appearance in the project can be changed.
12.3.1Location-Related Properties
Location-related properties show the physical and geometric characteristics of FamilyInstance
objects, such as orientation, rotation and location.
12.3.1.1 Orientation
The face orientation or hand orientation can be changed for some FamilyInstance objects. For
example, a door can face the outside or the inside of a room or wall and it can be placed with the
handle on the left side or the right side. The following table compares door, window, and desk
family instances.
If CanFlipFacing or CanFlipHand is true, you can call the flipFacing() or flipHand() methods
respectively. These methods can change the facing orientation or hand orientation respectively.
Otherwise, the methods do nothing and return False.
When changing orientation, remember that some types of windows can change both hand
orientation and facing orientation, such as a Casement 3x3 with Trim family.
There are four different facing orientation and hand orientation combinations for doors. See the
following picture for the combinations and the corresponding Boolean values are in the following
table.
In the previous door example, the Mirrored property for Door 1 and Door 2 is False, while for both
Door 3 and Door 4 it is True. This is because when you create a door in the Revit project, the
default result is either Door 1 or Door 2. To create a door like Door 3 or Door 4, you must flip the
Door 1 and Door 2 hand orientation respectively. The flip operation is like a mirror transformation,
which is why the Door 3 and Door 4 Mirrored property is True.
For more information about using the Mirror() method in Revit, refer to the Editing Elements
chapter.
12.3.1.4 Location
The Location property determines the physical location of an instance in a project. An instance can
have a point location or a line location.
The following characteristics apply to Location:
A point location is a LocationPoint class object - A footing, a door, or a table has a point
location
A line location is a LocationCurve class object - A beam has a line location.
They are both subclasses of the Location class.
For more information about Location, refer to the Editing Elements chapter.
12.3.2.1 Host
A FamilyInstance object has a Host property that returns its hosting element.
Some FamilyInstance objects do not have host elements, such as Tables and other furniture, so the
Host property returns nothing because no host elements are created. However, other objects, such
as doors and windows, must have host elements. In this case the Host property returns a wall
Element in which the window or the door is located. See the following picture.
12.3.4Other Properties
The properties in this section are specific to Revit Architecture and Revit Structure. They are
covered thoroughly in their respective chapters.
NewFamilyInstance()
Category Comments
parameters
Communication Devices
Data Devices XYZ, FamilySymbol, Element, If it is to be hosted on a wall,
StructuralType floor or ceiling
Electrical Equipment
Electrical Fixtures
If it is to be hosted on a wall,
Entourage
XYZ, FamilySymbol, XYZ, Element, floor, or ceiling, and needs to be
Fire Alarm Devices StructuralType oriented in a non-default
direction
Furniture
Furniture Systems
If it is to be hosted on a wall,
Generic Models XYZ, FamilySymbol, Element, Level,
floor or ceiling and associated to
StructuralType
Lighting Devices a reference level
Lighting Fixtures
Mass XYZ, FamilySymbol, Level, If it is to be associated to a
Mechanical Equipment StructuralType reference level
Security Devices
Site
Specialty Equipment
Sprinklers
Face, Line, FamilySymbol If it is face-based and linear
Structural Connections
Structural Foundations
Structural Stiffeners
Telephone Devices
Creates the column so that its
base lies on the reference level.
The column will extend to the
Columns XYZ, FamilySymbol, Level,
next available level in the model,
Structural Columns StructuralType
or will extend the default column
height if there are no suitable
levels above the reference level.
Doors and windows must be
XYZ, FamilySymbol, Element, hosted by a wall. Use this
StructuralType method if they can be placed
with the default orientation.
Doors
If the created instance needs to
Windows XYZ, FamilySymbol, XYZ, Element,
be oriented in a non-default
StructuralType
direction
XYZ, FamilySymbol, Element, Level, If the instance needs to be
StructuralType associated to a reference level
Creates a level based brace or
Curve, FamilySymbol, Level, beam given its curve. This is the
StructuralType recommended method to create
Beams and Braces
Structural Framing Creates instance in an arbitrary
XYZ, FamilySymbol, StructuralType
(Beams, Braces) location1
If it is hosted on an element
XYZ, FamilySymbol, Element, Level,
(floor etc.) and associated to a
StructuralType
reference level 1
XYZ, FamilySymbol, Level, If it is associated to a reference
StructuralType level 1
1
The structural instance will be of zero-length after creation. Extend it by setting its curve
(FamilyInstance.Location as LocationCurve) using LocationCurve.Curve property.
You can simplify your code and improve performance by creating more than one family instance at
a time using Document.NewFamilyInstances(). This method has a single parameter, which is a list
of FamilyInstanceCreationData objects describing the family instances to create.
if (null != familySymbol)
{
//Create 10 FamilyInstanceCreationData items for batch creation
for (int i = 1; i < 11; i++)
{
XYZ location = new XYZ(i * 10, 100, 0);
FamilyInstanceCreationData fiCreationData =
new FamilyInstanceCreationData(location, familySymbol, level,
StructuralType.Column);
if (null != fiCreationData)
{
fiCreationDatas.Add(fiCreationData);
}
}
if (fiCreationDatas.Count > 0)
{
// Create Columns
elementSet = document.Create.NewFamilyInstances(fiCreationDatas);
}
else
{
throw new Exception("Batch creation failed.");
}
}
else
{
throw new Exception("No column types found.");
}
return elementSet;
}
Instances of some family types are better created through methods other than
Autodesk.Revit.Creation.Document.NewFamilyInstance(). These are listed in the table below.
Ceiling Tags
Communication Device Tags
Curtain Panel Tags
Data Device Tags
Detail Item Tags
Door Tags
Duct Accessory Tags
Duct Fitting Tags
Duct Tags
Electrical Equipment Tags
Electrical Fixture Tags
Fire Alarm Device Tags
Reinforcement Tags
Structural Beam System
Tags
Structural Column Tags
Structural Connection Tags
Structural Foundation Tags
Structural Framing Tags
Structural Path
Reinforcement Tags
Structural Rebar Tags
Structural Stiffener Tags
Structural Truss Tags
Telephone Device Tags
Wall Tags
Window Tags
Wire Tag
Zone Tags
TagMode should be
NewTag(View, Element, TM_ADDBY_MATERIAL and there
Material Tags Boolean, TagMode, should be a material tag family
TagOrientation, XYZ) loaded, otherwise exception will be
thrown
TagMode should be
NewTag(View, Element, TM_ADDBY_MULTICATEGORY, and
Multi-Category Tags Boolean, TagMode, there should be a multi-category
TagOrientation, XYZ) tag family loaded, otherwise
exception will be thrown
NewAnnotationSymbol(XYZ,
Generic Annotations
AnnotationSymbolType, View)
The titleblock will be added to the
Title Blocks NewViewSheet(FamilySymbol)
newly created sheet.
12.4.1Create Tables
The following function demonstrates how to load a family of Tables into a Revit project and create
instances from all symbols in this family.
The LoadFamily() method returns false if the specified family was previously loaded. Therefore, in
the following case, do not load the family, Table-Dining Round w Chairs.rfa, before this function is
called. In this example, the tables are created at Level 1 by default.
// Loop through table symbols and add a new table for each
FamilySymbolSetIterator symbolItor = family.Symbols.ForwardIterator();
double x = 0.0, y = 0.0;
while (symbolItor.MoveNext())
{
FamilySymbol symbol = symbolItor.Current as FamilySymbol;
XYZ location = new XYZ(x, y, 10.0);
// Do not use the overloaded NewFamilyInstance() method that contains
// the Level argument, otherwise Revit cannot show the instances
// correctly in 3D View, for the table is not level-based component.
FamilyInstance instance = document.Create.NewFamilyInstance(location, symbol,
StructuralType.NonStructural);
x += 10.0;
}
The result of loading the Tables family and placing one instance of each FamilySymbol:
Figure 47: Load family and create tables in the Revit project
12.4.2Create a Beam
In this sample, a family symbol is loaded instead of a family, because loading a single
FamilySymbol is faster than loading a Family that contains many FamilySymbols.
}
else
{
throw new Exception("Couldn't load " + fileName);
}
12.4.3Create Doors
Create a long wall about 180 in length and select it before running this sample. The host object
must support inserting instances; otherwise the NewFamilyInstance() method will fail. If a host
element is not provided for an instance that must be created in a host, or the instance cannot be
inserted into the specified host element, the method NewFamilyInstance() does nothing.
The result of the previous code in Revit is shown in the following picture. Notice that if the specified
location is not at the specified level, the NewFamilyInstance() method uses the location elevation
instead of the level elevation.
13 Family Creation
This chapter discusses families and how to:
Create and modify Family documents
Access family types and parameters
13.1.2Categories
As noted in the previous chapter, the FamilyBase.FamilyCategory property indicates the category
of the Family such as Columns, Furniture, Structural Framing, or Windows.
The following code can be used to determine the category of the family in an open Revit Family
document.
13.1.3Parameters
Family parameters can be accessed from the OwnerFamily property of a Family Document as the
following example shows.
TaskDialog.Show("Revit",loadedFamilies);
}
}
}
13.2.1Creating Forms
The FamilyItemFactory provides the ability to create form elements in families, such as extrusions,
revolutions, sweeps, and blends. See section 17.2 for more information on these 3D sketch forms.
The following example demonstrates how to create a new Extrusion element. It creates a simple
rectangular profile and then moves the newly created Extrusion to a new location.
else
{
throw new Exception("Please open a Family document before invoking this command.");
}
return rectExtrusion;
}
The following sample shows how to create a new Sweep from a solid ovoid profile in a Family
Document.
}
else
{
throw new Exception("Please open a Family document before invoking this command.");
}
return sweep;
}
13.2.2Creating Annotations
New annotations such as Dimensions and ModelText and TextNote objects can also be created in
families, as well as curve annotation elements such as SymbolicCurve, ModelCurve, and
DetailCurve. See Chapter 16 for more information on Annotation elements.
Additionally, a new Alignment can be added, referencing a View that determines the orientation of
the alignment, and two geometry references.
The following example demonstrates how to create a new arc length Dimension.
return newArcDim;
}
Some types of dimensions can be labeled with a FamilyParameter. Dimensions that cannot be
labeled will throw an Autodesk.Revit.Exceptions.InvalidOperationException if you try to get or set
the Label property. In the following example, a new linear dimension is created between two lines
and labeled as width.
dim.Label = param;
return dim;
}
13.4.2Editing FamilyTypes
FamilyManager provides the ability to iterate through existing types in a family, and add and
modify types and their parameters.
The following example shows how to add a new type, set its parameters and then assign the new
type to a FamilyInstance. Type editing is done on the current type by using the Set() function.
The current type is available from the CurrentType property. The CurrentType property can be
used to set the current type before editing, or use the NewType() function which creates a new
type and sets it to the current type for editing.
Note that once the new type is created and modified, Document.LoadFamily() is used to load the
family back into the Revit project to make the new type available.
// look for 'b' and 'h' parameters and set them to 2 feet
FamilyParameter familyParam = familyManager.get_Parameter("b");
if (null != familyParam)
{
familyManager.Set(familyParam, 2.0);
}
familyParam = familyManager.get_Parameter("h");
if (null != familyParam)
{
familyManager.Set(familyParam, 2.0);
}
// now update the Revit project with Family which has a new type
family = familyDoc.LoadFamily(document);
// find the new type and assign it to FamilyInstance
FamilySymbolSetIterator symbolsItor = family.Symbols.ForwardIterator();
symbolsItor.Reset();
while (symbolsItor.MoveNext())
{
FamilySymbol familySymbol = symbolsItor.Current as FamilySymbol;
if (familySymbol.Name == "2X2")
{
familyInstance.Symbol = familySymbol;
break;
}
}
}
}
}
14 Conceptual Design
This chapter discusses the conceptual design functionality of the Revit API for the creation of
complex geometry in a family document. Form-making is supported by the addition of new
objects: points and spline curves that pass through these points. The resulting surfaces can be
divided, patterned, and panelized to create buildable forms with persistent parametric
relationships.
PointOnEdge poe =
document.Application.Create.NewPointOnEdge(curve.GeometryCurve.Reference, 0.5);
rp = document.FamilyCreate.NewReferencePoint(poe);
Forms can be created using model lines or reference lines. Model lines are consumed by the form
during creation and no longer exist as separate entities. Reference lines, on the other hand,
persist after the form is created and can alter the form if they are moved. Although the API does
not have a ReferenceLine class, you can change a model line to a reference line using the
ModelCurve.ChangeToReferenceLine() method.
return revolveForms;
}
14.2 Forms
14.2.1Creating Forms
Similar to family creation, the conceptual design environment provides the ability to create new
forms. The following types of forms can be created: extrusions, revolves, sweeps, swept blends,
lofts, and surface forms. Rather than using the Blend, Extrusion, Revolution, Sweep, and
SweptBlend classes used in Family creation, Mass families use the Form class for all types of forms.
An extrusion form is created from a closed curve loop that is planar. A revolve form is created
from a profile and a line in the same plane as the profile which is the axis around which the shape
is revolved to create a 3D form. A sweep form is created from a 2D profile that is swept along a
planar path. A swept blend is created from multiple profiles, each one planar, that is swept along a
single curve. A loft form is created from 2 or more profiles located on separate planes. A single
surface form is created from a profile, similarly to an extrusion, but is given no height.
The following example creates a simple extruded form. Note that since the ModelCurves used to
create the form are not converted to reference lines, they will be consumed by the resulting form.
return extrusionForm;
}
cbp = document.FamilyCreate.NewCurveByPoints(rpa);
ref_ar.Append(cbp.GeometryCurve.Reference);
ref_ar_ar.Append(ref_ar);
rpa.Clear();
ref_ar = new ReferenceArray();
cbp = document.FamilyCreate.NewCurveByPoints(rpa);
ref_ar.Append(cbp.GeometryCurve.Reference);
ref_ar_ar.Append(ref_ar);
return loftForm;
}
14.2.2Form modification
Once created, forms can be modified by changing a sub element (i.e. a face, edge, curve or vertex)
of the form, or an entire profile. The methods to modify a form include:
AddEdge
AddProfile
DeleteProfile
DeleteSubElement
MoveProfile
MoveSubElement
RotateProfile
RotateSubElement
ScaleSubElement
Additionally, you can modify a form by adding an edge or a profile, which can then be modified
using the methods listed above.
The following example moves the first profile curve of the given form by a specified offset. The
corresponding figure shows the result of applying this code to the loft form from the previous
example.
The next sample demonstrates how to move a single vertex of a given form. The corresponding
figure demonstrate the effect of this code on the previous extrusion form example
DividedSurface ds = document.FamilyCreate.NewDividedSurface(face.Reference);
// create a divided surface with fixed number of U and V grid lines
SpacingRule srU = ds.USpacingRule;
srU.SetLayoutFixedNumber(16, SpacingRuleJustification.Center, 0, 0);
14.3.2Patterning a surface
A divided surface can be patterned. Any of the built-in tile patterns can be applied to a divided
surface. A tile pattern is an ElementType that is assigned to the DividedSurface. The tile pattern is
applied to the surface according to the UV grid layout, so changing the USpacing and VSpacing
properties of the DividedSurface will affect how the patterned surface appears.
The following example demonstrates how to cover a divided surface with the OctagonRotate
pattern. The corresponding figure shows how this looks when applied to the divided surface in the
previous example. Note this example also demonstrates how to get a DividedSurface on a form.
rpAr.Clear();
rpAr.Append(rp1);
rpAr.Append(rp3);
CurveByPoints curve2 = document.FamilyCreate.NewCurveByPoints(rpAr);
PointOnEdge poeC = app.Create.NewPointOnEdge(curve2.GeometryCurve.Reference, 0.25);
ReferencePoint rpC = document.FamilyCreate.NewReferencePoint(poeC);
PointOnEdge poeD = app.Create.NewPointOnEdge(curve2.GeometryCurve.Reference, 0.75);
ReferencePoint rpD = document.FamilyCreate.NewReferencePoint(poeD);
}
else
{
throw new Exception("Please open a curtain family document before calling this
command.");
}
15.1 Levels
A level is a finite horizontal plane that acts as a reference for level-hosted elements, such as walls,
roofs, floors, and ceilings. In the Revit Platform API, the Level class is derived from the Element
class. The inherited Name property is used to retrieve the user-visible level name beside the level
bubble in the Revit UI. To retrieve all levels in a project, use the ElementIterator iterator to search
for Level objects.
15.1.1Elevation
The Level class has the following properties:
The Elevation property (LEVEL_ELEV) is used to retrieve or change the elevation above or
below ground level.
The ProjectElevation property is used to retrieve the elevation relative to the project origin
regardless of the Elevation Base parameter value.
Elevation Base is a Level type parameter.
Its BuiltInParameter is LEVEL_RELATIVE_BASE_TYPE.
Its StorageType is Integer
0 corresponds to Project and 1 corresponds to Shared.
if (null != level)
{
// keep track of number of levels
levelNumber++;
TaskDialog.Show("Revit",levelInformation.ToString());
}
15.1.2Creating a Level
Using the Level command, you can define a vertical height or story within a building and you can
create a level for each existing story or other building references. Levels must be added in a
section or elevation view. Additionally, you can create a new level using the Revit Platform API.
The following code sample illustrates how to create a new level.
return level;
}
Note: After creating a new level, Revit does not create the associated plan view for this level. If
necessary, you can create it yourself. For more information about how to create a plan view,
refer to the Views chapter.
15.2 Grids
Grids are represented by the Grid class which is derived from the Element class. It contains all grid
properties and methods. The inherited Name property is used to retrieve the content of the grid
lines bubble.
15.2.1Curve
The Grid class Curve property gets the object that represents the grid line geometry.
If the IsCurved property returns true, the Curve property will be an Arc class object.
If the IsCurved property returns false, the Curve property will be a Line class object.
For more information, refer to the Geometry chapter.
The following code is a simple example using the Grid class. The result appears in a message box
after invoking the command.
TaskDialog.Show("Revit", message);
}
15.2.2Creating a Grid
Two overloaded Document methods are available to create a new grid in the Revit Platform API.
Using the following method with different parameters, you can create a curved or straight grid:
Note: The arc or the line used to create a grid must be in a horizontal plane.
The following code sample illustrates how to create a new grid with a line or an arc.
if (null == lineGrid)
{
throw new Exception("Create a new straight grid failed.");
}
if (null == arcGrid)
{
throw new Exception("Create a new curved grid failed.");
}
Note: In Revit, the grids are named automatically in a numerical or alphabetical sequence when
they are created.
You can also create several grids at once using the Document.NewGrids() method, which takes a
CurveArray parameter.
15.3 Phase
Some architectural projects, such as renovations, proceed in phases. Phases have the following
characteristics:
Phases represent distinct time periods in a project lifecycle.
The lifetime of an element within a building is controlled by phases.
Each element has a construction phase but only the elements with a finite lifetime have a
destruction phase.
All phases in a project can be retrieved from the Document object. A Phase object contains three
pieces of useful information: Name, ID and UniqueId. The remaining properties always return null
or an empty collection.
Each new modeling component added to a project has a Phase Created and a Phase Demolished
property. The Phase Created property has the following characteristics:
It identifies the phase in which the component was added.
The default value is the same as the current view Phase value.
Change the Phase Created parameter by selecting a new value from the drop-down list.
The Phase Demolished property has the following characteristics:
It identifies in which phase the component is demolished.
The default value is none.
Demolishing a component with the demolition tool updates the property to the current
Phase value in the view where you demolished the element.
You can demolish a component by setting the Phase Demolished property to a different
value.
If you delete a phase using the Revit Platform API, all modeling components in the current
phase still exist. The Phase Created parameter value for these components is changed to
the next item in the drop-down list in the Properties dialog box.
The following code sample displays all supported phases in the current document. The phase
names are displayed in a message box.
{
prompt += "\n\t" + ii.Name;
}
}
else
{
prompt = "There are no phases in current document.";
}
// Give the user the information.
TaskDialog.Show("Revit",prompt);
}
16 Annotation Elements
This chapter introduces Revit Annotation Elements, including the following:
Dimension
DetailCurve
IndependentTag
TextNote
AnnotationSymbol
Note that:
Dimensions are view-specific elements that display sizes and distances in a project.
Detail curves are created for detailed drawings. They are visible only in the view in which
they are drawn. Often they are drawn over the model view.
Tags are an annotation used to identify elements in a drawing. Properties associated with a
tag can appear in schedules.
AnnotationSymbol has multiple leader options when loaded into a project.
For more information about Revit Element classification, refer to the Elements Essentials chapter.
if ((int)BuiltInCategory.OST_Dimensions == dimension.Category.Id.IntegerValue)
{
message += "\nDimension is a permanent dimension.";
}
else if ((int)BuiltInCategory.OST_Constraints == dimension.Category.Id.IntegerValue)
{
message += "\nDimension is a constraint element.";
}
TaskDialog.Show("Revit",message);
}
16.1.1Dimensions
There are four kinds of permanent dimensions:
Linear dimension
Radial dimension
Angular dimension
Arc length dimension
Except for radial dimension, every dimension has one dimension line. Dimension lines are available
from the Dimension.Curve property which is always unbound. In other words, the dimension line
does not have a start-point or end-point. Based on the previous picture:
A Line object is returned for a linear dimension.
An arc object is returned for a radial dimension or angular dimension.
A radial dimension returns null.
16.1.2Constraint Elements
Dimension objects with Category Constraints (BuitInCategory.OST_Constraints) represent two
kinds of dimension-related constraints:
Linear and radial dimension constraints
Equality constraints
In the following picture, two kinds of locked constraints correspond to linear and radial dimension.
In the application, they appear as padlocks with green dashed lines. (The green dashed line is
available from the Dimension.Curve property.) Both linear and radial dimension constraints return
two Reference objects from the Dimension.References property.
Note: Not all constraint elements are represented by the Dimension class but all belong to a
Constraints (OST_Constraints) category such as alignment constraint.
16.1.3Spot Dimensions
Spot coordinates and spot elevations are represented by the SpotDimension class and are
distinguished by category. Like the permanent dimension, spot dimensions are view-specific. The
type and category for each spot dimension are listed in the following table:
Type Category
Spot Coordinates OST_SpotCoordinates
Spot Elevations OST_SpotElevations
16.1.4Comparison
The following table compares different kinds of dimensions and constraints in the API:
radial
dimension
An Arc 2
angular An Arc 2
dimension OST_Constraints A Line 2
arc length
dimension
An Arc 2
A Line >=3
Dimension linear
Constraint dimension
constraint
angular
dimension
Equality Constraint
Spot
Elevations
Using the NewDimension() method input parameters, you can define the visible View, dimension
line, and References (two or more). However, there is no easy way to distinguish a linear
dimension DimensionType from other types. The overloaded NewDimension() method with the
DimensionType parameter is rarely used.
The following code illustrates how to use the NewDimension() method to duplicate a dimension.
Though only linear dimensions are created, you can delete all dimensions and constraints
represented by Dimension and SpotDimension using the Document.Delete() method.
Generally only 2D views such as level view and elevation view are acceptable, otherwise an
exception is thrown.
Except for view-related features, DetailCurve is very similar to ModelCurve. For more information
about ModelCurve properties and usage, see the ModelCurve section in the Sketching chapter.
16.3 Tags
A tag is an annotation used to identify drawing elements. The API exposes the IndependentTag and
RoomTag classes to cover most tags used in the Revit application. For more details about
RoomTag, see the Room section in the Revit Architecture chapter.
Note: The IndependentTag class represents the tag element in Revit and other specific tags such
as keynote, beam system tag, electronic circuit symbol (Revit MEP), and so on. In Revit
internal code, the specific tags have corresponding classes derived from IndependentTag. As
a result, specific features are not exposed by the API and cannot be created using the
NewTag() method. They can be distinguished by the following categories:
In this section, the main focus is on the tag type represented in the following picture.
Every category in the family library has a pre-made tag. Some tags are automatically loaded with
the default Revit application template, while others are loaded manually. The IndependentTag
objects return different categories based on the host element if it is created using the By Category
option. For example, the Wall and Floor IndependentTag are respectively OST_WallTags and
OST_FloorTags.
If the tag is created using the Multi-Category or Material style, their categories are respectively
OST_MultiCategoryTags and OST_MaterialTags.
Similar to DetailCurve, NewTag() only works in the 2D view, otherwise an exception is thrown. The
following code is an example of IndependentTag creation. Run it when the level view is the active
view.
Note: You cant change the text displayed in the IndependentTag directly. You need to change the
parameter that is used to populate tag text in the Family Type for the Element thats being tagged.
In the example below, that parameter is Type Mark, although this setting can be changed in the
Family Editor in the Revit UI.
newTag.LeaderEndCondition = LeaderEndCondition.Free;
return newTag;
}
16.4 Text
In the API, the TextNote class represents Text. Its general features are as follows:
Revit supports two kinds of Leaders: straight leaders and arc leaders. Control the TextNote leader
type using the TextNoteLeaderType enumerated type:
TNLT_ARC_R
Add a right arc leader
TNLT_ARC_L
Add a left arc leader
TNLT_STRAIGHT_R
Add a right leader.
Note: Straight leaders and arc leaders cannot be added to a Text type at the same time.
TaskDialog.Show("Revit", message);
}
17 Sketching
To create elements or edit their profiles in Revit, you must first create sketch objects. Examples of
elements that require sketches include:
Roofs
Floors
Stairs
Railings.
Sketches are also required to define other types of geometry, such as:
Extrusions
Openings
Regions
In the Revit Platform API, sketch functions are represented by 2D and 3D sketch classes such as
the following:
2D sketch:
SketchPlane
Sketch
ModelCurve
and more
3D sketch:
GenericForm
Path3D
In addition to Sketch Elements, ModelCurve is also described in this chapter. For more details
about Element Classification, see the Elements Classification section in the Elements Essentials
chapter.
SketchPlane is the basis for all 2D sketch classes such as ModelCurve and Sketch. SketchPlane is
also the basis for 2D Annotation Elements such as DetailCurve. Both ModelCurve and DetailCurve
have the SketchPlane property and need a SketchPlane in the corresponding creation method.
SketchPlane is always invisible in the Revit UI.
Every ModelCurve must lie in one SketchPlane. In other words, wherever you draw a ModelCurve
either in the UI or by using the API, a SketchPlane must exist. Therefore, at least one SketchPlane
exists in a 2D view where a ModelCurve is drawn.
The 2D view contains the CeilingPlan, FloorPlan, and Elevation ViewTypes. By default, a
SketchPlane is automatically created for all of these views. The 2D view-related SketchPlane Name
returns the view name such as Level 1 or North.
invisible, there is always a SketchPlane that corresponds to a work plane. A work plane is
used to express a SketchPlane in text and pictures.
The following information applies to SketchPlane members:
ID, UniqueId, Name, and Plane properties return a value;
Parameters property is empty
Location property returns a Location object
Other properties return null.
Plane contains the SketchPlane geometric information. SketchPlane sets up a plane coordinate
system with Plane as the following picture illustrates:
SketchPlane sketchPlane =
application.ActiveUIDocument.Document.Create.NewSketchPlane(geometryPlane);
return sketchPlane;
}
17.2 3D Sketch
3D Sketch is used to edit a family or create a 3D object. In the Revit Platform API, you can
complete the 3D Sketch using the following classes.
Extrusion
Revolution
Blend
Sweep
In other words, there are four operations through which a 2D model turns into a 3D model. For
more details about sketching in 2D, refer to the 2D Sketch section in this chapter.
17.2.1Extrusion
Revit uses extrusions to define 3D geometry for families. You create an extrusion by defining a 2D
sketch on a plane; Revit then extrudes the sketch between a start and an end point.
Query the Extrusion Form object for a generic form to use in family modeling and massing. The
Extrusion class has the following properties:
Property Description
ExtrusionStart Returns the Extrusion Start point. It is a Double type.
ExtrusionEnd Returns the Extrusion End point. It is a Double type.
Sketch Returns the Extrusion Sketch. It contains a sketch plane and some curves.
17.2.2Revolution
The Revolve command creates geometry that revolves around an axis. You can use the revolve
command to create door knobs or other knobs on furniture, a dome roof, or columns.
Query the Revolution Form object for a generic form to use in family modeling and massing. The
Revolution class has the following properties:
Property Description
Axis Returns the Axis. It is a ModelLine object.
EndAngle Returns the End Angle. It is a Double type.
Sketch Returns the Extrusion Sketch. It contains a SketchPlane and some curves.
17.2.3Blend
The Blend command blends two profiles together. For example, if you sketch a large rectangle and
a smaller rectangle on top of it, Revit Architecture blends the two shapes together.
Query the Blend Form object for a generic form to use in family modeling and massing. The Blend
class has the following properties:
Property Description
BottomSketch Returns the Bottom Sketch. It is a Sketch object.
TopSketch Returns the Top Sketch Blend. It is a Sketch object.
FirstEnd Returns the First End. It is a Double type.
SecondEnd Returns the Second End. It is a Double type.
The FirstEnd and SecondEnd property values are consistent with the same parameters in the Revit
UI. The following pictures illustrate the Blend corresponding parameters, the sketches, and the
result.
17.2.4Sweep
The Sweep command sweeps one profile along a created 2D path or selected 3D path. The path
may be an open or closed loop, but must pierce the profile plane.
Query the Sweep Form object for a generic form for use in family modeling and massing. The
Sweep class has the following properties:
Property Description
Path3d Returns the 3D Path Sketch. It is a Path3D object.
PathSketch Returns the Plan Path Sketch. It is a Sketch object.
ProfileSketch Returns the profile Sketch. It is a Sketch object.
EnableTrajSegmentation Returns the Trajectory Segmentation state. It is a Boolean.
MaxSegmentAngle Returns the Maximum Segment Angle. It is a Double type.
The Path3d property is available only when you use Pick Path to get the 3D path.
PathSketch is available whether the path is 3D or 2D.
17.3 ModelCurve
ModelCurve represents model lines in the project. It exists in 3D space and is visible in all views.
17.3.1Creating a ModelCurve
The key to creating a ModelCurve is to create the Geometry.Curve and SketchPlane where the
Curve is located. Based on the Geometry.Curve type you input, the corresponding ModelCurve
returned can be downcast to its correct type.
The following sample illustrates how to create a new model curve (ModelLine and ModelArc):
// Create a ModelLine element using the created geometry line and sketch plane
ModelLine line = document.Create.NewModelCurve(geomLine, sketch) as ModelLine;
// Create a ModelArc element using the created geometry arc and sketch plane
ModelArc arc = document.Create.NewModelCurve(geomArc, sketch) as ModelArc;
17.3.2Properties
ModelCurve has properties that help you set specific GeometryCurves. In this section, the
GeometryCurve and LineStyle properties are introduced.
17.3.2.1 GeometryCurve
The GeometryCurve property is used to get or set the model curves geometry curve. Except for
ModelHermiteSpline, you can get different Geometry.Curves from the four ModelCurves;
Line
Arc
Ellipse
Nurbspline.
The following code sample illustrates how to get a specific Curve from a ModelCurve.
if (geoCurve is Autodesk.Revit.DB.Line)
{
Line geoLine = geoCurve as Line;
}
The GeometryCurve property return value is a general Geometry.Curve object, therefore, you must
use an As operator to convert the object type.
Note: The following information applies to GeometryCurve:
In Revit you cannot create a Hermite curve but you can import it from other software such
as AutoCAD. Geometry.Curve is the only geometry class that represents the Hermite curve.
The SetPlaneAndCurve() method and the Curve and SketchPlane property setters are used
in different situations.
When the new Curve lies in the same SketchPlane, or the new SketchPlane lies on the
same planar face with the old SketchPlane, use the Curve or SketchPlane property
setters.
If new Curve does not lay in the same SketchPlane, or the new SketchPlane does not lay
on the same planar face with the old SketchPlane, you must simultaneously change the
Curve value and the SketchPlane value using SetPlaneAndCurve() to avoid internal data
inconsistency.
17.3.2.2 LineStyle
Line style does not have a specific class but is represented by the Document.Element class.
All line styles for a ModelCurve are available from the LineStyles property in the Element
Properties dialog box.
The Element object that represents line style cannot provide information for all properties.
Most properties will return null or an empty collection.
The only information returned is the following:
Id
UniqueId
Name.
Use the getLineStyle() method to retrieve the current line style or use the setLineStyle()
method to set the current line style to one returned from the LineStyles property.
18 Views
Views are images produced from a Revit model with privileged access to the data stored in the
documents. They can be graphics, such as plans, or text, such as schedules. Each project
document has one or more different views. The last focused window is the active view.
In this chapter, you learn how views are generated, the types of views supported by Revit, and the
features for each view.
18.1 Overview
This section is a high-level overview discussing the following:
How views are generated
View types
Element visibility
Creating and deleting views.
18.1.1View Process
The following figure illustrates how a view is generated.
The viewing coordinate system represents how the model is presented in the observers view. Its
origin is the viewers eye position whose coordinates in the model space are retrieved by the
View.Origin property. The X, Y, and Z axes are represented by the View.RightDirection,
View.UpDirection, and View.ViewDirection properties respectively.
View.RightDirection is towards the right side of the screen.
View.UpDirection towards the up side of the screen.
View.ViewDirection from the screen to the viewer.
The viewing coordinate system is right-handed. For more information, see the Perspective
Projection picture and the Parallel Projection picture in the View3D section in this chapter.
Some portions of a 3D model space that do not display, such as those that are behind the viewer
or too far away to display clearly, are excluded before being projected onto the projection plane.
This action requires cropping the view. The following rules apply to cropping:
Elements outside of the crop box are no longer in the view.
The View.CropBox property provides the geometry information for the box. It returns an
instance of BoundingBoxXYZ indicating a rectangular parallelepiped in the viewing
coordinate system. The coordinate system and the crop box shape are illustrated in the
View3D section.
The View.CropBoxVisible property determines whether the crop box is visible in the view.
The View.CropBoxActive property determines whether the crop box is actually being used to
crop the view.
After cropping, the model is projected onto the projection plane. The following rules apply to the
projection:
The projection contents are mapped to the screen view port for display.
During the mapping process, the projection contents are scaled so that they are shown
properly on the screen.
The View.Scale property is the ratio of the actual model size to the view size.
The view boundary on paper is the crop region, which is a projection of the crop box on the
projection plane.
The size and position of the crop region is determined by the View.OutLine property.
18.1.2View Types
A project model can have several view types. The following picture demonstrates the different
types of views in the Project browser.
The following table lists the view types and the corresponding views in the Project browser.
The following example shows how to get the class type of a view, in this case, the ActiveView of
the Document.
// Get the class type of the active view, and format the prompt string
String prompt = "Revit is currently in ";
if (view is Autodesk.Revit.DB.View3D)
{
prompt += "3D view.";
}
else if (view is Autodesk.Revit.DB.ViewSection)
{
prompt += "section view.";
}
else if (view is Autodesk.Revit.DB.ViewSheet)
{
prompt += "sheet view.";
}
else if (view is Autodesk.Revit.DB.ViewDrafting)
{
prompt += "drafting view.";
}
else
{
prompt += "normal view, the view name is " + view.Name;
}
This example shows how to use the ViewType property of a view to determine the views type.
switch (view.ViewType)
{
case ViewType.AreaPlan:
prompt += "an area view.";
break;
case ViewType.CeilingPlan:
prompt += "a reflected ceiling plan view.";
break;
case ViewType.ColumnSchedule:
invisible elements and non-graphical elements. For example, when creating a default 3D view in an
empty project, there are no elements in the view but there are many elements in the document, all
of which are invisible.
The following code sample counts the number of wall category elements in the active document
and active view. The number of elements in the active view differs from the number of elements in
the document since the document contains non-graphical wall category elements.
TaskDialog.Show("Revit", message.ToString());
}
Method Parameters
View3D NewView3D(XYZ viewDirection) viewDirection:
Vector pointing towards the viewers eye.
ViewPlan NewViewPlan( pViewName:
string pViewName, Name for the new plan view. It must be unique or a
Level pLevel, null pointer.
ViewType viewType pLevel:
) Level associated with the plan view.
viewType:
Type of plan view created. It must be Floor Plan or
Ceiling Plan (Structural Plan in Structure).
ViewSection NewViewSection( box:
BoundingBoxXYZ box View orientation and bounds. The X axis points
) towards the right of screen; Y - towards up; Z -
towards the user.
ViewSheet NewViewSheet( titleBlock:
FamilySymbol titleBlock The titleblock family symbol applied to the sheet.
)
Method Parameters
ViewDrafting NewViewDrafting(
)
If a view is created successfully, these methods return a reference to the view, otherwise it returns
null. The methods are described in the following sections.
Delete a view by using the Document.Delete method with the view ID. You can also delete
elements associated with a view. For example, deleting the level element causes Revit to delete the
corresponding plan view or deleting the camera element causes Revit to delete the corresponding
3D view.
Note: You cannot gain access to Schedule views in the Revit Platform API as there is no
NewScheduleView() method.
18.2.1Perspective View
The following picture illustrates how a perspective view is created.
The CropBox.Min and CropBox.Max points are marked in the previous picture. Note that the
CropBox.Min point in a perspective view is generated by projecting the crop box front clip
plane onto the back clip plane.
Crop box coordinates are based on the viewing coordinate system. Use Transform.OfPoint() to
transform CropBox.Min and CropBox.Max to the world coordinate system. For more detail about
Transform, refer to the Geometry.Transform section in the Geometry chapter.
The project plane plus the front and back clip plane are all plumb to the view direction. The line
between CropBox.Max and CropBox.Min is parallel to the view direction. With these factors, the
crop box geometry can be calculated.
18.2.2Orthographic View
Autodesk.Revit.Creation.Document provides the NewView3D method to create an orthographic 3D
view.
The model is projected onto a view plane and then scaled onto the screen. The View.Scale property
represents the ratio of actual model size to the view size. The related expressions are as follows:
View.CropBox.Max.X(Y) / View.OutLine.Max.X(Y)
== View.CropBox.Min.X(Y) / View.OutLine.Min.X(Y)
== View.Scale
{
// Get Section Box parameter
if (p.Definition.Name.Equals("Section Box"))
{
// Show Section Box
p.Set(1);
// Hide Section Box
// p.Set(0);
break;
}
}
}
Note: If you set view.SectionBox to null, it has the same effect as hiding the section box using the
Section Box parameter. The current section box is stored by view and is restored when you
show the section box using the SectionBox parameter.
18.3 ViewPlan
Plan views are level-based. There are two types of plan views, floor plan view and ceiling plan
view.
Generally the floor plan view is the default view opened in a new project.
Most projects include at least one floor plan view and one ceiling plan view.
Plan views are usually created after adding new levels to the project.
Adding new levels using the API does not add plan views automatically.
Autodesk.Revit.Creation.Document provides a NewViewPlan() method to create a plan view.
The viewType parameter must be FloorPlan or CeilingPlan. The level parameter represents a level
element in the project to which the plan view is associated.
The following code creates a floor plan and a ceiling plan based on a certain level.
18.4 ViewDrafting
The drafting view is not associated with the model. It allows the user to create detail drawings that
are not included in the model.
In the drafting view, the user can create details in different view scales (coarse, fine, or
medium).
You can use 2D detailing tools, including:
18.5 ViewSection
Section views cut through the model to expose the interior structure. The
Auotdesk.Revit.Creation.NewViewSection() method creates the section view.
The box parameter is the section view crop box. It provides the orientation and bounds which are
required for the section view. Usually, another views crop box is used as the parameter. You can
also build a custom BoundingBoxXYZ instance to represent the orientation and bounds.
18.6 ViewSheet
A sheet contains views and a title block. When creating a sheet view with the
Autodesk.Revit.Creation.NewViewSheet() method, a title block family symbol is a required
parameter for the method. The Autodesk.Revit.Document TitleBlocks property contains all title
blocks in the document. Choose one title block to create the sheet.
The newly created sheet has no views. The ViewSheet.AddView() method is used to add views.
The Geometry.UV location parameter identifies where the added views are located. It points
to the added views center coordinate (measured in inches).
The coordinates, [0, 0], are relative to the sheets lower left corner.
Each sheet has a unique sheet number in the complete drawing set. The number is displayed
before the sheet name in the Project Browser. It is convenient to use the sheet number in a view
title to cross-reference the sheets in your drawing set. You can retrieve or modify the number
using the SheetNumber property. The number must be unique; otherwise an exception is thrown
when you set the number to a duplicate value.
The following example illustrates how to create and print a sheet view. Begin by finding an
available title block in the document and use it to create the sheet view. Next, add the document
active view. The active view is placed in the center of the sheet. Finally, print the sheet by calling
the View.Print() method.
FamilySymbol fs = null;
foreach (FamilySymbol f in fsSet)
{
if (null != f)
{
fs = f;
break;
}
}
viewSheet.AddView(view3D, location);
if (result == TaskDialogResult.Yes)
{
viewSheet.Print();
}
}
}
Note: You cannot add a sheet view to another sheet and you cannot add a view to more than one
sheet; otherwise an argument exception occurs.
18.6.1Printer Setup
You may want to change the settings of the printer before printing a sheet. The API exposes the
settings for the printer with the PrintManager class, and related Autodesk.Revit.DB classes:
Class Functionality
Autodesk.Revit.DB.PrintManager Represents the Print information in Print Dialog
(File->Print) within the Revit UI.
Autodesk.Revit.DB.PrintParameters An object that contains settings used for printing
the document.
Autodesk.Revit.DB.PrintSetup Represents the Print Setup (File->Print Setup...)
within the Revit UI.
Autodesk.Revit.DB.PaperSize An object that represents a Paper Size of Print
Setup within the Autodesk Revit project.
Autodesk.Revit.DB.PaperSizeSet A set that can contain any number of paper size
objects.
Autodesk.Revit.DB.PaperSource An object that represents a Paper Source of
Print Setup within the Autodesk Revit project.
Autodesk.Revit.DB.PaperSourceSet A set that can contain any number of paper
source objects.
Autodesk.Revit.DB.ViewSheetSetting Represents the View/Sheet Set (File->Print)
within the Revit UI.
Autodesk.Revit.DB.PrintSetting Represents the Print Setup (File->Print Setup...)
within the Revit UI.
For an example of code that uses these objects, see the ViewPrinter sample application that is
included with the Revit Platform SDK.
Material
19 Material
In the Revit Platform API, material data is stored and managed as an Element. The Material
element includes Elements.Material and its subclasses:
MaterialGeneric
MaterialConcrete
MaterialWood
MaterialSteel
MaterialOther.
Material features are represented by properties, such as FillPattern, Color, Render and so on.
In this chapter, you learn how to access material elements and how to manage the Material objects
in the document. The section, Walkthrough: Get Window Materials, provides a walkthrough
showing how to get a window material.
19.1.1Classification
All Elements.Material objects are available in the Settings class Materials property. For more
details, refer to the Management in Document section in this chapter. Material objects are also
available in Document, Category, Element, Face, and so on, and are discussed in the pertinent
sections in this chapter. Wherever you get a material object, it is represented as the
Elements.Material class requiring you to downcast the object to its derived type.
There are two ways to downcast the Elements.Material object to its derived type. Use Runtime
Type Information (RTTI) or BuiltInParameter.
{
// use MaterialConcrete object
}
break;
case 2: // Steel
MaterialSteel matSteel = material as MaterialSteel;
if (null != matSteel)
{
// use MaterialSteel object
}
break;
case 3: // Generic
MaterialGeneric matGeneric = material as MaterialGeneric;
if (null != matGeneric)
{
// use MaterialGeneric object
}
break;
case 4: // Wood
MaterialWood matWood = material as MaterialWood;
if (null != matWood)
{
// use MaterialWood object
}
break;
}
}
There is no way to change the basic Material type. For example, you cannot change a MaterialSteel
object to a MaterialWood object.
Note: The API does not provide access to the values of Concrete Type for Concrete material.
19.1.2Properties
The material object properties identify a specific type of material including color, fill pattern, and
more.
Parameter parameter =
materialSteel.get_Parameter(BuiltInParameter.PHY_MATERIAL_PARAM_YOUNG_MOD1);
double dYOUNG_MODX = parameter.AsDouble();
string strYOUNG_MOD = parameter.AsValueString();
string message = "Young's Modulus X from parameter: " + dYOUNG_MODX;
TaskDialog.Show("Revit", message);
}
Note: To run the sample code, make sure the material name exists in your document. All material
names for the current document are located under the Manage tab (Project Settings panel >
Materials).
19.2.1Creating Materials
There are two ways to create a new Elements.Material object in the API.
Duplicate an existing Material
Add a new Material with a specific type.
When using the Duplicate() method, the returned Material object has the same type as the original
and it is added to the Materials collection automatically.
{
bool duplicated = false;
//try to duplicate a new instance of Material class using duplicate method
//make sure the name of new material is unique in MaterailSet
string newName = "new" + material.Name;
Material myMaterial = material.Duplicate(newName);
if (null == myMaterial)
{
TaskDialog.Show("Revit", "Failed to duplicate a material!");
}
else
{
duplicated = true;
}
return duplicated;
}
Use the Materials class to add a new Material directly. No matter how it is applied, it is necessary to
specify a unique name. The unique name is the Elements.Material object key.
if (document.Settings.Materials.Contains(newName) == true)
{
TaskDialog.Show("Revit", "Concrete material added successfully!");
}
return myConcrete;
}
19.2.2Deleting Materials
There are two ways to delete a material.
Materials.Remove()
Document.Delete()
The Materials.Remove() method is specific to the Elements.Material class.
if (null == myOther)
{
return false;
}
if (document.Settings.Materials.Contains(oldName) == false)
{
TaskDialog.Show("Revit", "Material (myOtherMaterial) removed successfully!");
}
return true;
}
Document.Delete() is a more generic method. See the Editing Elements chapter for details.
Note: Though you can delete material using Document.Delete(), the Materials collection is not
updated immediately after it is called. As a result, it is easy to cause Material management
inconsistencies in your Add-in application. The best approach is to only use
Materials.Remove().
If the components material returns null, get the material from the corresponding
Element.Category sub Category.
19.3.1Material in a Parameter
If the Element object has a Parameter where ParameterType is ParameterType.Material, you can
get the element material from the Parameter. For example, a structural column FamilySymbol (a
FamilyInstance whose Category is BuiltInCategory.OST_StructuralColumns) has the Column
Material parameter. Get the Material using the ElementId. The following code example illustrates
how to get the structural column Material that has one component.
break;
}
}
}
}
Note: If the material property is set to By Category in the UI, the ElementId for the material is -1
and cannot be used to retrieve the Material object as shown in the sample code. Try
retrieving the Material from Category as described in the next section.
Some material properties contained in other compound parameters are not accessible from the
API. As an example, in the following figure, for System Family: Railing, the Rail Structure
parameters StorageType is StorageType.None. As a result, you cannot get material information in
this situation.
19.3.3CompoundStructureLayer Material
You can get the CompoundStructureLayer object from HostObjAttributes. For more details, refer to
the Walls, Floors, Roofs and Openings chapter.
if (null == frameInteriorMaterial)
frameInteriorMaterial = category.Material;
if (null == sashMaterial)
sashMaterial = category.Material;
// Show the result because the category may have a null Material,
// the Material objects need to be checked.
string materialsInfo = "Frame Exterior Material: " + (null != frameExteriorMaterial ?
frameExteriorMaterial.Name : "null") + "\n";
materialsInfo += "Frame Interior Material: " + (null != frameInteriorMaterial ?
frameInteriorMaterial.Name : "null") + "\n";
materialsInfo += "Sash: " + (null != sashMaterial ? sashMaterial.Name : "null") + "\n";
TaskDialog.Show("Revit",materialsInfo);
}
20 Geometry
The Geometry namespace contains graphic-related types used to describe the graphical
representation in the API. The API provides three classes used to describe and store the geometry
information data according to their base classes:
Geometry Node class Includes classes derived from the GeometryObject class.
Geometry Helper class Includes classes derived from the APIObject class and value types
Collection class Includes classes derived from the IEnumerable or IEnumerator interface.
In this chapter, you learn how to use various graphic-related types, how to retrieve geometry data
from an element, how to transform an element, and more.
// Either the DetailLevel or the View can be set, but not both
//geomOption.View = commandData.Application.ActiveUIDocument.Document.ActiveView;
Note: For more information, refer to the Geometry.Options section in this chapter.
1. Retrieve a Geometry.Element instance using the Wall class Geometry property. This
instance contains all geometry objects in the Object property, such as a solid, a line, and so
on.
2. Iterate the Object property to get a geometry solid instance containing all geometry faces
and edges in the Faces and Edges properties.
3. Iterate the Faces property to get all geometry faces.
4. Iterate the Edges property to get all geometry edges.
The sample code follows:
20.2.1Geometry.Instance
The Instance class represents an instance of another element (symbol), specially positioned by this
element. It is used to store geometry information for the symbol. The Instance class can pack any
geometry information data, including another instance, making it a good way to build a geometry
tree using the instance in a complicated geometry representation.
The Instance class stores geometry data in the SymbolGeometry property using a local coordinate
system. It also provides a Transform instance to convert the local coordinate system to a world
coordinate space. To get the same geometry data as the Revit application from the Instance class,
use the transform property to convert each geometry object retrieved from the SymbolGeometry
property.
Generally, three geometry objects can be retrieved from an instance. They are:
Curve Curve or its derived class.
Solid Contains faces and edges.
Instance Another instance which forms this instance.
Users need to transform the retrieved geometry objects using the Transform property. For more
details, refer to the Geometry.Transform section in this chapter.
Two samples are presented to explain the main usage.
20.2.1.1 Sample 1
Get curves from an instance, and perform the coordinate transformation.
20.2.1.2 Sample 2
Get the solid information from an instance, and perform the coordinate transformation.
}
foreach (Edge edge in solid.Edges)
{
foreach (XYZ ii in edge.Tessellate())
{
XYZ point = ii;
XYZ transformedPoint = instTransform.OfPoint(point);
}
}
}
}
}
}
Note: You find similar situations when you get geometry information for doors, windows, and other
elements. For more details about the retrieved geometry, refer to Example: Retrieving
Geometry Data from a Beam in this chapter.
20.2.2Geometry.Mesh
Geometry mesh is a triangular mesh used to describe the shape of a 3D face. The face object can
be a curved surface which can be described by its endpoints just like a polygon. As a result, the
mesh object provides a way to split the face into many small triangles where the endpoints locate
the split face.
The following code sample illustrates how to get the geometry of a mass. The mass geometry faces
are described by the mesh.
The following pictures illustrate how a mass looks in the Revit application (left picture) and the
same mass drawn with the API (right picture).
20.2.3Solid
The Solid class defines a 3D solid from which users can get faces and edges. The Solid class defines
a geometry solid, such as a cube or a cylinder. You can get the following using the solids
properties:
Faces
Edges
Surface area
Volume
Note: Sometimes the API can have unused solids containing zero edges and faces. Check the
Edges and Faces properties before completing further work.
20.3.1Transform
Transforms are limited to 3x4 transformations (Matrix) in the Revit application, transforming an
objects place in the model space relative to the rest of the model space and other objects. The
transforms are built from the position and orientation in the model space. Three direction Vectors
(BasisX, BasisY and BasisZ properties) and Origin point provide all of the transform information.
The matrix formed by the four values is as follows:
The Transform OfPoint method implements the previous function. The following code is a sample of
the same transformation process.
//transform basis of the old coordinate system in the new coordinate // system
XYZ b0 = transform.get_Basis(0);
XYZ b1 = transform.get_Basis(1);
XYZ b2 = transform.get_Basis(2);
XYZ origin = transform.Origin;
The Geometry.Transform class properties and methods are identified in the following sections.
20.3.1.1 Identity
Transform the Identity.
20.3.1.2 Reflection
Reflect a specified plane.
return mirTrans;
}
20.3.1.3 Rotation
Rotate by a specified angle around a specified axis and point.
20.3.1.4 Translation
Translate by a specified vector. Given a vector XYZ data, a transformation is created as follow:
20.3.1.5 Determinant
Transformation determinant.
20.3.1.6 HasReflection
This is a Boolean value that indicates whether the transformation produces a reflection.
20.3.1.7 Scale
A value that represents the transformation scale.
20.3.1.8 Inverse
An inverse transformation. Transformation matrix A is invertible if a transformation matrix B exists
such that A*B = B*A = I (identity).
20.3.1.9 IsIdentity
Boolean value that indicates whether this transformation is an identity.
20.3.1.10 IsTranslation
Boolean value that indicates whether this transformation is a translation.
Geometry.Transform provides methods to perform basal matrix operations.
20.3.1.11 Multiply
Multiplies a transformation by a specified transformation and returns the result.
Operator* - Multiplies two specified transforms.
20.3.1.12 ScaleBasis
Scales the basis vectors and returns the result.
20.3.1.13 ScaleBasisAndOrigin
Scales the basis vectors and the transformation origin returns the result.
20.3.1.14 OfPoint
Applies the transformation to the point. The Origin property is used.
20.3.1.15 OfVector
Applies the transform to the vector. The Origin property is not used.
20.3.1.16 AlmostEqual
Compares two transformations. AlmostEqual is consistent with the computation mechanism and
accuracy in the Revit core code. Additionally, Equal and the == operator are not implemented in
the Transform class.
The API provides several shortcuts to complete geometry transformation. The Transformed
property in several geometry classes is used to do the work, as shown in the following table.
20.3.2Reference
The Reference class does not contain properties or methods. However, it is very useful in element
creation.
Dimension creation requires references.
The reference identifies a path within a geometric representation tree in a flexible manner.
The tree is used to view specific geometric representation creation.
The API exposes four types of references based on different Pick pointer types. They are retrieved
from the API in different ways:
1. For Point Curve.EndPointReference property
2. For Curve (Line, Arc, and etc.) - Curve.Reference property
3. For Face Face.Reference property
4. For Cut Edge Edge.Reference property
Different reference types cannot be used arbitrarily. For example:
The NewLineBoundaryConditions() method requires a reference for Line
The NewAreaBoundaryConditions() method requires a reference for Face
The NewPointBoundaryConditions() method requires a reference for Point.
20.3.3Options
Geometry is typically extracted from the indexed property Element.Geometry. This property
accepts an options class which you must supply. The options class customizes the type of output
you receive based on its properties:
ComputeReferences Indicates whether to compute the geometry reference when
retrieving geometry information. The default value is false, so if this property is not set to
true, the reference will not be accessible.
IncludeNonVisibleObjects Indicates to also return geometry objects which are not visible
in a default view.
View - Gets geometry information from a specific view. Note that if a view is assigned, the
detail level for this view will be used in place of DetailLevel.
DetailLevel Indicates the preferred detail level. The default is Medium.
20.3.3.1 ComputeReferences
If you set this property to false, the API does not compute a geometry reference. All Reference
properties retrieved from the geometry tree return nothing. For more details about references,
refer to the Reference section.
20.3.3.2 IncludeNonVisibleObjects
Most of the non-visible geometry is construction and conditional geometry that the user sees when
editing the element (i.e., the center plane of a window family instance). The default for this
property is false. However, some of this conditionally visible geometry represents real-world
objects, such as insulation surrounding ducts in Revit MEP, and it should be extracted.
20.3.3.3 View
If users set the View property to a different view, the retrieved geometry information can be
different. Review the following examples for more information:
1. In Revit, draw a stair in 3D view then select the Crop Region, Crop Region Visible, and
Section Box properties in the 3D view. In the Crop Region, modify the section box in the 3D
view to display a portion of the stair. If you get the geometry information for the stair using
the API and set the 3D view as the Options.View property, only a part of the stair geometry
can be retrieved. The following pictures show the stair in the Revit application (left) and one
drawn with the API (right).
20.3.3.4 DetailLevel
The API defines three enumerations in Geometry.Options.DetailLevels. The three enumerations
correspond to the three Detail Levels in the Revit application, shown as follows.
20.3.4BoundingBoxXYZ
BoundingBoxXYZ defines a 3D rectangular box that is required to be parallel to any coordinate axis.
Similar to the Instance class, the BoundingBoxXYZ stores data in the local coordinate space. It has
a Transform property that transforms the data from the box local coordinate space to the model
space. In other words, to get the box boundary in the model space (the same one in Revit),
transform each data member using the Transform property. The following sections illustrate how to
use BoundingBoxXYZ.
This property indicates whether the views crop box face can
be used to clip the elements view.
If BoundingBoxXYZ is retrieved from the View3D.SectionBox
property, the return value depends on whether the Section
Box property is selected in the 3D view Properties dialog
box. If so, all Enabled properties return true.
If BoundingBoxXYZ is retrieved from the
Element.BoundingBox property, all the Enabled properties
are true.
20.3.5BoundingBoxUV
BoundingBoxUV is a value class that defines a 2D rectangle parallel to the coordinate axes. It
supports the Min and Max data members. Together they define the BoundingBoxUVs boundary.
BoundingBoxUV is retrieved from the View.Outline property which is the boundary view in the
paper space view.
continue;
}
Autodesk.Revit.DB.Solid solid = geomObj as Autodesk.Revit.DB.Solid;
if (null != solid)
{
solids.Append(solid);
continue;
}
//If this GeometryObject is Instance, call AddCurvesAndSolids
Autodesk.Revit.DB.GeometryInstance geomInst =
geomObj as Autodesk.Revit.DB.GeometryInstance;
if (null != geomInst)
{
Autodesk.Revit.DB.GeometryElement transformedGeomElem
= geomInst.GetInstanceGeometry(geomInst.Transform);
AddCurvesAndSolids(transformedGeomElem, ref curves, ref solids);
}
}
}
Note: For more information about how to retrieve the Geometry.Options type object, refer to the
Geometry.Options section in this chapter.
21.1 Place
In the Revit Platform API, the SiteLocation class contains place information including Latitude,
Longitude, and Time Zone. This information identifies where the project is located in the world.
21.2 City
City is an object that contains geographical location information for a known city in the world. It
contains longitude, latitude, and time zone information. The city list is retrieved by the Cities
property in the Application object. New cities cannot be added to the existing list in Revit. The city
where the current project is located is not exposed by the Revit Platform API.
21.3 ProjectLocation
A project only has one site which is the absolute location on the earth. However, it can have
different locations relative to the projects around it. Depending on the coordinates and origins in
use, there can be many ProjectLocation objects in one project.
By default each Revit project contains at least one named location, Internal. It is the active project
location. You can retrieve it using the Document.ActiveProjectLocation property. All existing
ProjectLocation objects are retrieved using the Document.ProjectLocations property.
Note: There is only one active project location at a time. To see the result after changing the
ProjectLocation geographical offset and rotation, change the Orientation property from
Project North to True North in the plan view Properties dialog box.
Figure 127: Set orientation value in plan view Properties dialog box
Figure 128: Project is rotated 30 degrees from Project North to True North
The following code sample illustrates how to delete an existing project location from the current
project.
if (1 == locations.Size)
{
return;
}
The GROUP block contains group entries that associate every parameter definition with a
group. The following fields appear in the GROUP block:
ID - Uniquely identifies the group and associates the parameter definition with a group.
Code Region 22-4: Getting the definition file from an external parameter file
private DefinitionFile SetAndOpenExternalSharedParamFile(
Autodesk.Revit.ApplicationServices.Application application, string sharedParameterFile)
{
// set the path of shared parameter file to current Revit
application.Options.SharedParametersFilename = sharedParameterFile;
// open the file
return application.OpenSharedParameterFile();
}
Note: Consider the following points when you set the shared parameter path:
During each installation, Revit cannot detect whether the shared parameter file was set in
other versions. You must bind the shared parameter file for the new Revit installation again.
If Options.SharedParametersFilename is set to a wrong path, an exception is thrown only
when OpenSharedParameterFile is called.
Revit can work with multiple shared parameter files. Even though only one parameter file is
used when loading a parameter, the current file can be changed freely.
TaskDialog.Show("Revit", strBuilder.ToString());
22.4 Binding
In the add-in code, complete the following steps to bind a specific parameter:
1. Use an InstanceBinding or a TypeBinding object to create a new Binding object that includes
the categories to which the parameter is bound.
2. Add the binding and definition to the document using the Document.ParameterBindings
object.
The following list provides more information about the classes and methods in the previous
diagram.
Autodesk.Revit.Parameters.BindingMap Class - The BindingMap object is retrieved from the
Document.ParameterBindings property.
Parameter binding connects a parameter definition to elements within one or more
categories.
The map is used to interrogate existing bindings as well as generate new parameter
bindings using the Insert method.
Parameters.BindingMap.Insert (Definition, Binding) Method - The binding object type
dictates whether the parameter is bound to all instances or just types.
A parameter definition cannot be bound to both instances and types.
If the parameter binding exists, the method returns false.
22.4.1Type Binding
The Autodesk.Revit.Parameters.TypeBinding objects are used to bind a property to a Revit type,
such as a wall type. It differs from Instance bindings in that the property is shared by all instances
identified in type binding. Changing the parameter for one type affects all instances of the same
type.
Code Region 22-7: Adding type parameter definitions using a shared parameter file
public bool SetNewParameterToTypeWall(UIApplication app, DefinitionFile myDefinitionFile)
{
// Create a new group in the shared parameters file
DefinitionGroups myGroups = myDefinitionFile.Groups;
DefinitionGroup myGroup = myGroups.Create("MyParameters");
22.4.2Instance Binding
The Autodesk.Revit.Parameters.InstanceBinding object indicates binding between a parameter
definition and a parameter in certain category instances. The following diagram illustrates Instance
Binding in the Walls category.
Once bound, the parameter appears in all property dialog boxes for the instance. Changing the
parameter in any one instance does not change the value in any other instance.
3. Definitions are bound to each wall instance parameter in the current document based on the
wall category.
Code Region 22-8: Adding instance parameter definitions using a shared parameter file
public bool SetNewParameterToInsanceWall(UIApplication app, DefinitionFile myDefinitionFile)
{
// create a new group in the shared parameters file
DefinitionGroups myGroups = myDefinitionFile.Groups;
DefinitionGroup myGroup = myGroups.Create("MyParameters1");
22.5.3Entities
After all fields have been defined for the schema, SchemaBuilder.Finish() will return the finished
Schema. A new Entity can be created using that schema. For each Field in the Schema, the value
can be stored using Entity.Set(), which takes a Field and a value (whose type is dependent on the
field type). Once all applicable fields have been set for the entity, it can be assigned to an element
using the Element.SetEntity() method.
To retrieve the data later, call Element.GetEntity() passing in the corresponding Schema. If no
entity based on that schema was saved with the Element, an invalid Entity will be returned. To
check that a valid Entity was returned, call the Entity.IsValid() method. Field values from the
entity can be obtained using the Entity.Get() method.
The following is an example of all these steps put together.
23 Transactions
Transactions are context-like objects that encapsulate any changes to a Revit model. Any change
to a document can only be made while there is an active transaction open for that document.
Attempting to change the document outside of a transaction will throw an exception. Changes do
not become a part of the model until the active transaction is committed. Consequently, all
changes made in a transaction can be rolled back either explicitly or implicitly (by the destructor).
Only one transaction per document can be open at any given time. A transaction may consist of
one or more operations.
There are three main classes in the Revit API related to transactions:
Transaction
SubTransaction
TransactionGroup
This chapter will discuss each of these classes in more depth. Only the Transaction class is
required to make changes to a document. The other classes can be used to better organize
changes. Keep in mind that the TransactionMode attribute applied to the IExternalCommand
definition will affect how Revit expects transactions to be handled when the command is invoked.
Review the TransactionAttribute section for more information.
Method Description
Start Will start the context
Commit Ends the context and commits all changes to the document
Rollback Ends the context and discards all changes to the document
GetStatus Returns the current status of the transaction object
Status Description
Uninitialized The initial value after object is instantiated; the context has not started yet
Started Transaction object has successfully started (Start was called)
RolledBack Transaction object was successfully rolled back (Rollback was called)
Committed Transaction object was successfully committed (Commit was called)
Pending Transaction object was attempted to be either submitted or rolled back, but
due to failures that process could not be finished yet and is waiting for the end-
users response (in a modeless dialog). Once the failure processing is finished,
the status will be automatically updated (to either Committed or RolledBack
status).
23.1.1Transaction
A transaction is a context required in order to make any changes to a Revit model. Only one
transaction can be open at a time; nesting is not allowed. Each transaction must have a name,
which will be listed on the Undo menu in Revit once a transaction is successfully committed.
// non-transient elements,so they are grouped into transaction as atomic user actions
Transaction transaction = new Transaction(document);
if (transaction.Start("Create new curves") == TransactionStatus.Started)
{
// Create a sketch plane in current document
SketchPlane sketch = document.Create.NewSketchPlane(geomPlane);
// Create a ModelLine element using the created geometry line and sketch plane
ModelLine line1 = document.Create.NewModelCurve(geomLine1, sketch) as ModelLine;
ModelLine line2 = document.Create.NewModelCurve(geomLine2, sketch) as ModelLine;
ModelLine line3 = document.Create.NewModelCurve(geomLine3, sketch) as ModelLine;
if (TaskDialogResult.Ok == result)
{
transaction.Commit();
}
else
{
transaction.RollBack();
}
}
23.1.2 SubTransaction
A SubTransaction can be used to enclose a set of model-modifying operations. Sub-transactions
are optional. They are not required in order to modify the model. They are a convenience tool to
allow logical splitting of larger tasks into smaller ones. Sub-transactions can only be created within
an already opened transaction and must be closed (either committed or rolled back) before the
transaction is closed (committed or rolled back). Unlike transactions, sub-transaction may be
nested, but any nested sub-transaction must be closed before the enclosing sub-transaction is
closed. Sub-transactions do not have a name, for they do not appear on the Undo menu in Revit.
23.1.3 TransactionGroup
TransactionGroup allows grouping together several independent transactions, which gives the
owner of a group an opportunity to address many transactions at once. When a transaction group
is to be closed, it can be rolled back, which means that all previously committed transactions
belonging to the group will be rolled back. If not rolled back, a group can be either committed or
assimilated. In the former case, all committed transactions (within the group) will be left as they
were. In the later case, transactions within the group will be merged together into one single
transaction that will bear the group's name.
A transaction group can only be started when there is no transaction open yet, and must be closed
only after all enclosed transactions are closed (rolled back or committed). Transaction groups can
be nested, but any nested group must be closed before the enclosing group is closed. Transaction
groups are optional. They are not required in order to make modifications to a model.
The following example shows the use of a TransactionGroup to combine two separate Transactions
using the Assimilate() method. The following code will result in a single Undo item added to the
Undo menu with the name Group Change.
document.Create.NewLevel(25.0);
levelTransaction.Commit();
}
}
catch
{
// if either internal transaction fails, rollback group, too
levelTransaction.RollBack();
bAssimilate = false;
}
Line gridLine =
document.Application.Create.NewLine(Point1, Point2, true);
document.Create.NewGrid(gridLine);
gridTransaction.Commit();
}
}
catch
{
// if either internal transaction fails, rollback group, too
gridTransaction.RollBack();
bAssimilate = false;
}
}
return status;
Please be aware that modifying the active document is not permitted during some events (e.g. the
DocumentClosing event). If an event handler attempts to make modifications during such an
event, an exception will be thrown. The event documentation indicates whether or not the event is
read-only.
23.2.2DocumentChanged Event
The DocumentChanged event is raised after every transaction gets committed, undone, or redone.
This is a read-only event, designed to allow you to keep external data in synch with the state of the
Revit database. To update the Revit database in response to changes in elements, use the
Dynamic Model Update framework.
23.3.1 ClearAfterRollback
This option controls whether all warnings should be cleared after a transaction is rolled back. The
default value is False.
23.3.2DelayedMiniWarnings
This options controls whether mini-warnings, if any, are displayed at the end of the transaction
currently being ended, or if they should be postponed until the end of next transaction. This is
typically used within a chain of transactions when it is not desirable to show intermediate warnings
at the end of each step, but rather to wait until the completion of the entire chain.
Warnings may be delayed for more than one transaction. The first transaction that does not have
this option set to True will display all of its own warnings, if any, as well as all warnings that might
have accumulated from previous transactions. The default value is False.
Note that this option is ignored in modal mode (see ForcedModalHandling below).
23.3.3ForcedModalHandling
This options controls whether eventual failures will be handled modally or modelessly. The default
is True. Be aware that if the modeless failure handling is set, processing the transaction may be
done asynchronously, which means that upon returning from the Commit or RollBack calls, the
transaction will not be finished yet (the status will be 'Pending').
23.3.4SetFailuresPreprocessor
This interface, if provided, is invoked when there are failures found at the end of a transaction.
The preprocessor may examine current failures and even try to resolve them. See the chapter on
Failure Posting and Handling for more information.
23.3.5SetTransactionFinalizer
A finalizer is an interface, which, if provided, can be used to perform a custom action at the end of
a transaction. Note that it is not invoked when the Commit() or RollBack() methods are called, but
only after the process of committing or rolling back is completed. Transaction finalizers must
implement the ITransactionFinalizer interface, which requires two functions to be defined:
OnCommitted called at the end of committing a transaction
OnRolledBack called at the end of rolling back a transaction
Note that since the finalizer is called after the transaction has finished, the document is not
modifiable from the finalizer unless a new transaction is started.
Autodesk.Revit.DB.Line geomLine =
uiApplication.Application.Create.NewLineBound(start, end);
if (wallTransaction.Start() == TransactionStatus.Started)
{
// Create a wall using the location line
Wall wall = document.Create.NewWall(geomLine, level, true);
if (wallTransaction.Commit() == TransactionStatus.Committed)
{
Autodesk.Revit.DB.Options options =
uiApplication.Application.Create.NewGeometryOptions();
Autodesk.Revit.DB.GeometryElement geoelem = wall.get_Geometry(options);
AnalyticalModel analyticalmodel = wall.GetAnalyticalModel();
}
}
}
24 Events
Events are notifications that are triggered on specific actions in the Revit user interface or API
workflows. By subscribing to events, an add-in application can be notified when an action is about
to happen or has just happened and take some action related to that event. Some events come in
pairs around actions, one occurring before the action takes place (pre event) and the other
happening after the action takes place (post event). Events that do not occur in these pre/post
pairs are called single events.
Revit provides access to events at both the Application level (such as ApplicationClosing or
DocumentOpened) and the Document level (such as DocumentClosing and DocumentPrinting). The
same application level events available from the Application class are also available from the
ControlledApplication class, which represents the Revit application with no access to documents. It
is ControlledApplication that is available to add-ins from the OnStartup() and OnShutdown()
methods. In terms of subscribing and unsubscribing to events, these classes are interchangeable;
subscribing to an event from the ControlledApplication class is the same as subscribing from the
Application class.
Events can also be categorized as database (DB) events or user interface (UI) events. DB events
are available from the Application and Document classes, while UI events are available from the
UIApplication class. (Currently all UI events are at the application level only).
Some events are considered read-only, which means that during their execution the model may
not be modified. The fact that an event is read-only is documented in the API help file. It is
important to know that even during regular events (i.e. not read-only events), the model may be in
a state in which it cannot be modified. The programmer should check the properties
Document.IsModifiable and Document.IsReadOnly to determine whether the model may be
modified.
return Autodesk.Revit.UI.Result.Failed;
}
return Autodesk.Revit.UI.Result.Succeeded;
}
Note that although most event arguments have the Cancel and Cancellable properties, the
DocumentChanged and FailuresProcessing events have corresponding Cancel() and IsCancellable()
methods.
// constructor takes the AddInId for the add-in associated with this updater
public WallUpdater(AddInId id)
{
m_appId = id;
m_updaterId = new UpdaterId(m_appId, new Guid("FBFBF6B2-4C06-42d4-97C1-
D1B4EB593EFF"));
}
if (m_wallType != null)
{
// Change the wall to the cached wall type.
foreach (ElementId addedElemId in data.GetAddedElementIds())
{
Wall wall = doc.get_Element(addedElemId) as Wall;
if (wall != null)
{
wall.WallType = m_wallType;
}
}
}
}
25.2.1Scope of Changes
The Execute() method has an UpdaterData parameter that provides all necessary data needed to
perform the update, including the document and information about the changes that triggered the
update. Three basic methods (GetAddedElementIds(),GetDeletedElementIds(), and
GetModifiedElementIds()) identify the elements that triggered the update. The Updater can also
check specifically if a particular change triggered the update by using the IsChangeTriggered()
method.
25.2.3Managing Changes
Updaters need to be able to handle complex issues that may arise from their use, possibly
reconciling subsequent changes to an element. Elements modified by an updater may change by
the time the updater is next invoked, and those changes may impact information modified by the
updater. For example, the element may be explicitly edited by the user, or implicitly edited due to
propagated changes triggered by a regeneration.
It is also possible that the same element may be modified by another updater, possibly even within
the same transaction. Although explicit changes of exactly the same data is tracked and
prohibited, indirect or propagated changes are still possible. Perhaps the most complex case is
that an element could be changed by the user and/or the same updater in different versions of the
file. After the user reloads the latest or saves to central, the modified target element will be
brought from the other file and the updater will need to reconcile changes.
It is also important to realize that when a document synchs with the central file, the ElementId of
elements may be affected. If new elements have been added to two versions of the same file and
the same ElementId is used in both places, this will be reconciled when the files are synched to the
central database. For this reason, when using updaters to cross-reference one element in another
element, they should use Element.UniqueId which is guaranteed to be unique.
Another issue to consider is if an updater attaches some data (i.e. as a parameter) to an element,
it not only must be sure to maintain that information in the element to which it was added, but also
to reconcile data in cases when that element is duplicated via copy/paste or group propagation. For
example, if an updater adds a parameter "Total weight of rebar" to a rebar host, that parameter
and its value will be copied to the duplicated rebar host even though the rebar itself may be not
copied with the host. In this case the updater needs to ensure the parameter value is reset in the
newly copied rebar host.
25.3.1Triggers
In addition to calling the UpdaterRegistry.RegisterUpdater() method, Updaters should add one or
more update triggers via the AddTrigger() methods. These triggers indicate to the UpdaterRegistry
what events should trigger the Updaters Execute() method to run. They can be set application-
wide, or can apply to changes made in a specific document. Update triggers are specified by
pairing a change scope and a change type.
The change scope is one of two things:
An explicit list of element Ids in a document - only changes happening to those elements
will trigger the Updater
An implicit list of elements communicated via an ElementFilter - every changed element will
be run against the filter, and if any pass, the Updater is triggered
There are several options available for change type. ChangeTypes are obtained from static
methods on the Element class.
Element addition - via Element.GetChangeTypeElementAddition()
Element deletion - via Element.GetChangeTypeElementDeletion()
25.3.2Order of Execution
The primary way that Revit sorts multiple Updaters to execute in the correct order is by looking at
the ChangePriority returned by a given Updater. An Updater reporting a priority for a more
fundamental set of elements (e.g. GridsLevelsReferencePlanes) will execute prior to Updaters
reporting a priority for elements driven by these fundamental elements (e.g. Annotations).
Reporting a proper change priority for the elements which your Updater modifies benefits users of
your application: Revit is less likely to have to execute the Updater a second time due to changes
made by another Updater.
For Updaters which report the same change priority, execution is ordered based on a sorting of
UpdaterId. The method UpdaterRegistry.SetExecutionOrder() allows you set the execution order
between any two registered Updaters (even updaters registered by other API add-ins) so long as
your code knows the ids of the two Updaters.
25.4.3Infinite loop
In the event that an updater falls into an infinite loop, Revit will notify the user and disable the
updater for the duration of the Revit session.
way that conflicts with a change made by another updater, the updater is canceled, an error
message is displayed and the user is given the option to disable the updater.
FailureDefinitionId failId =
new FailureDefinitionId(new Guid("691E5825-93DC-4f5c-9290-8072A4B631BC"));
26.1.1.1 FailureDefinitionId
A unique FailureDefinitionId must be used as a key to register the FailureDefinition. Each unique
FailureDefinitionId should be created using a GUID generation tool. Later, the FailureDefinitionId
can be used to look up a FailureDefinition in FailureDefinitionRegistry, and to create and post
FailureMessages.
26.1.1.2 Severity
When registering a new failure, a severity is specified, along with the FailureDefinitionId and a text
description of the failure that can be displayed to the user. The severity determines what actions
are allowed in a document and whether the transaction can be committed at all. The severity
options are:
Warning - Failure that can be ignored by end-user. Failures of this severity do not prevent
transactions from being committed. This severity should be used when Revit needs to
communicate a problem to the user, but the problem does not prevent the user from
continuing to work on the document
Error - Failure that cannot be ignored. If FailureMeassage of this severity is posted, the
current transaction cannot be committed unless the failure is resolved via an appropriate
FailureResolution. This severity should be used when work on the document cannot be
continued unless the problem is resolved. If the failure has no predefined resolutions
available or these resolutions fail to resolve the problem, the transaction must be aborted in
order to continue working with the document. It is strongly encouraged to have at least one
resolution in each failure of this severity.
DocumentCorruption - Failure that forces the Transaction to be rolled back as soon as
possible due to known corruption to a document. When failure of this severity is posted,
reading of information from a document is not allowed. The current transaction must be
rolled back first in order to work with the document. This severity is used only if there is
known data corruption in the document. This type of failure should generally be avoided
unless there is no way to prevent corruption or to recover from it locally.
A fourth severity, None, cannot be specified when defining a new FailureDefinition.
26.1.2Posting a failure
The Document.PostFailure() method is used to notify the document of a problem. Failures will be
validated and possibly resolved at the end of the transaction. Warnings posted via this method will
not be stored in the document after they are resolved. Failure posting is used to address a state of
the document which may change before the end of the transaction or when it makes sense to defer
resolution until the end of the transaction. Not all failures encountered by an external command
should post a failure. If the failure is unrelated to the document, a task dialog should be used. For
example, if the Revit UI is in an invalid state to perform the external command.
To post a failure, create a new FailureMessage using the FailureDefinitionId from when the custom
failure was defined, or use a BuiltInFailure provided by the Revit API. Set any additional
information in the FailureMessage object, such as failing elements, and then call
Document.PostFailure() passing in the new FailureMessage. Note that the document must be
modifiable in order to post a failure.
A unique FailureMessageKey returned by PostFailure() can be stored for the lifetime of transaction
and used to remove a failure message if it is no longer relevant. If the same FailureMessage is
posted two or more times, the same FailureMessageKey is returned. If a posted failure has a
severity of DocumentCorruption, an invalid FailureMessageKey is returned. This is because a
DocumentCorruption failure cannot be unposted.
The following example shows an IUpdate class (referenced in the Defining and registering a
failure code region above) that posts a new failure based on information received in the Execute()
method.
// constructor takes the AddInId for the add-in associated with this updater
public WallWarnUpdater(AddInId id)
{
m_appId = id;
m_updaterId = new UpdaterId(m_appId,
new Guid("69797663-7BCB-44f9-B756-E4189FE0DED8"));
}
{
FailureMessage failMessage = new FailureMessage(FailureId);
failMessage.SetFailingElement(id);
doc.PostFailure(failMessage);
}
else if (p.AsDouble() > 100)
{
FailureMessage failMessage = new FailureMessage(WarnId);
failMessage.SetFailingElement(id);
doc.PostFailure(failMessage);
}
}
}
}
26.2.2FailuresAccessor
A FailuresAccessor object is passed to each of failure processing steps as an argument and is the
only available interface to fetch information about failures in a document. While reading from a
document during failure processing is allowed, the only way to modify a document during failure
resolution is via methods provided by this class. After returning from failure processing, the
instance of the class is deactivated and cannot be used any longer.
26.2.3IFailuresPreprocessor
The IFailuresPreprocessor interface can be used to provide custom failure handling for a specific
transaction only. IFailuresPreprocessor is an interface that may be used to perform a
preprocessing step to either filter out anticipated transaction failures or to post new failures.
Failures can be filtered out by:
silently removing warnings that are known to be posted for the transaction and are deemed
as irrelevant for the user in the context of a particular transaction
silently resolving certain failures that are known to be posted for the transaction and that
should always be resolved in a context of a given transaction
silently aborting the transaction in cases where imperfect transactions should not be
committed or aborting the transaction is preferable over user interaction for a given
workflow.
The IFailuresPreprocessor interface gets control first during the failure resolution process. It is
nearly equivalent to checking and resolving failures before finishing a transaction, except that
IFailuresPreprocessor gets control at the right time, after all failures guaranteed to be posted
and/or after all irrelevant ones are deleted.
There may be only one IFailuresPreprocessor per transaction and there is no default failure
preprocessor. If one is not attached to the transaction (via the failure handling options), this first
step of failure resolution is simply omitted.
return Autodesk.Revit.UI.Result.Succeeded;
}
}
return FailureProcessingResult.Continue;
}
}
26.2.4FailuresProcessing Event
The FailuresProcessing event is most suitable for applications that want to provide custom failure
handling without a user interface, either for the entire session or for many unrelated transactions.
Some use cases for handling failures via this event are:
automatic removal of certain warnings and/or automatic resolving of certain errors based on
office standards (or other criteria)
custom logging of failures
The FailuresProcessing event is raised after IFailuresPreprocessor (if any) has finished. It can have
any number of handlers, and all of them will be invoked. Since event handlers have no way to
return a value, the SetProcessingResult() on the event argument should be used to communicate
status. Only Continue, ProceedWithRollback or ProceedWithCommit can be set.
The following example shows an event handler for the FailuresProcessing event.
if (failID == BuiltInFailures.RoomFailures.RoomNotEnclosed)
{
fa.DeleteWarning(failure);
}
}
}
26.2.5FailuresProcessor
The IFailuresProcessor interface gets control last, after the FailuresProcessing event is processed.
There is only one active IFailuresProcessor in a Revit session. To register a failures processor,
derive a class from IFailuresProcessor and register it using the
Application.RegisterFailuresProcessor() method. If there is previously registered failures processor,
it is discarded. If a Revit add-in opts to register a failures processor for Revit that processor will
become the default error handler for all Revit errors for the session and the standard Revit error
dialog will not appear. If no failures processors are set, there is a default one in the Revit UI that
invokes all regular Revit error dialogs. FailuresProcessor should only be overridden to replace the
existing Revit failure UI with a custom failure resolution handler, which can be interactive or have
no user interface.
If the RegisterFailuresProcessor() method is passed NULL, any transaction that has any failures is
silently aborted (unless failures are resolved by first two steps of failures processing).
The IFailuresProcessor.ProcessFailures() method is allowed to return WaitForUserInput, which
leaves the transaction pending. It is expected that in this case, FailuresProcessor leaves some UI
on the screen that will eventually commit or rollback a pending transaction - otherwise the pending
state will last indefinitely, essentially freezing the document.
The following example of implementing the IFailuresProcessor checks for a failure, deletes the
failing elements and sets an appropriate message for the user.
return FailureProcessingResult.Continue;
}
}
}
27 Analysis Visualization
The Revit API provides a mechanism for external analysis applications to easily display the results
of their computation in the Revit model. The SpatialFieldManager class is the main class for
communicating analysis results back to Revit. It is used to create, delete, and modify the
"containers" in which the analysis results are stored. The AnalysisDisplayStyle class can then be
used to control the appearance of the results. Creation and modification of AnalysisDisplayStyle
from a plug-in is optional; end users can have the same control over the presentation of the
analysis results with the Revit UI.
The data model supported by Revit API requires that analysis results are specified at a certain set
of points, and that at each point one or more distinct numbers (measurements) are computed.
The number of measurements must be the same at all model points. The results data is transient;
it is stored only in the model until the document is closed. If the model is saved, closed, and
reopened the analysis results will not be present.
28 Revit Architecture
This chapter covers API functionality that is specific to Revit Architecture, namely:
Functionality related to rooms (Element.Room, RoomTag, etc.)
Limited energy analysis functions
28.1 Rooms
The following sections cover information about the room class, its parameters, and how to use the
room class in the API.
Note: Room.Name is the combination of the room name and room number. Use the ROOM_NAME
BuiltInParameter to get the room name. In the following picture, the Room.Name returns
Master Bedroom 2.
28.1.2Creating a room
The following code illustrates the simplest way to create a room at a certain point in a specific
level:
return room;
}
Rooms can be created in a room schedule then inserted into a plan circuit.
The Document.NewRoom(Phase) method is used to create a new room, not associated with
any specific location, and insert it into an existing schedule. Make sure the room schedule
exists or create a room schedule in the specified phase before you make the call.
The Document.NewRoom(Room room, PlanCircuit circuit) method is used to create a room
from a room in a schedule and a PlanCircuit.
The input room must exist only in the room schedule, meaning that it does not display in
any plan view.
After invoking the method, a model room with the same name and number is created in
the view where the PlanCircuit is located.
For more details about PlanCircuit, see the Plan Topology section in this chapter.
The following code illustrates the entire process:
Code Region 28-2: Creating and inserting a room into a plan circuit
Room InsertNewRoomInPlanCircuit(Autodesk.Revit.DB.Document document, Level level, Phase
newConstructionPhase)
{
// create room using Phase
Room newScheduleRoom = document.Create.NewRoom(newConstructionPhase);
// Get a PlanCircuit
return newRoom2;
}
You can also create rooms in certain levels in batches. The Document.NewRooms() method can
create rooms for every enclosed region in a given level, to a given phase, or based on a list of
RoomCreationData objects.
Once a room has been created and added to a location, it can be removed from the location (but
still remains in available in the project) by using the Room.Unplace() method. It can then be
placed in a new location.
28.1.3Room Boundary
Rooms have boundaries that create an enclosed region where the room is located.
Columns
Roofs
The Room.BoundaryArray segment array size depends on the enclosed region topology. Each
BoundarySegmentArray makes a circuit or a continuous line in which one segment joins the next.
The following pictures provide several examples. In the following pictures, all walls are Room-
Bounding and the model lines category is OST_AreaSeparationLines. If an element is not Room-
Bounding, it is excluded from the elements to make the boundary.
Room Room.Boundary.Size
Room 1 1
Room 2
Room 3
Room 4 2
Room 5 3
Room 6
Note: Walls joined by model lines are considered continuous line segments. Single model lines are
ignored.
28.1.3.2 BoundarySegment
The segments that make the region are represented by the BoundarySegment class; its Element
property returns the corresponding element with the following conditions:
For a ModelCurve element, the category must be BuiltInCategory.OST_AreaSeparationLines
meaning that it represents a Room Separator.
For other elements such as wall, column, and roof, if the element is a room boundary, the
Room Bounding parameter (BuiltInParameter.WALL_ATTR_ROOM_BOUNDING) must be true
as in the following picture.
Notice how the roof forms the BoundarySegment for a room in the following pictures. The first
picture shows Level 3 in the elevation view. The room is created in the Level 3 floor view. The
latter two pictures show the boundary of the room and the house in 3D view.
//Prepare a line
XYZ startPos = new XYZ(-10, 0, 0);
XYZ endPos = new XYZ(10, 0, 0);
Line line = application.Application.Create.NewLine(startPos, endPos, true);
//Create a new wall and enclose the creating into a single transaction
Transaction transaction = new Transaction(document, "Create Wall");
if (transaction.Start() == TransactionStatus.Started)
{
Wall wall = document.Create.NewWall(line, level, false);
transaction.Commit();
TaskDialog.Show("Revit", message);
transaction.Commit();
}
}
28.1.4Plan Topology
The level plan that rooms lie in have a topology made by elements such as walls and room
separators. The PlanTopology and PlanCircuit classes are used to present the level topology.
Get the PlanTopology object from the Document object using the Level. In each plan view,
there is one PlanTopology corresponding to every phase.
The same condition applies to BoundarySegment, except room separators and Elements
whose Room Bounding parameter is true can be a side (boundary) in the PlanCircuit.
All family instances have the Room property, which is the room where an instance is located in the
last project phase. Windows and doors face into a room. Change the room by flipping the door or
window facing, or by calling FamilyInstance.FlipFromToRoom(). For other kinds of instances, such
as beams and columns, the Room is the room that has the same boundary as the instance.
The following code illustrates how to get the Room from the family instance. It is necessary to
check if the result is null or not.
ClosedShell
This example displays the dimension information for a selected room. Note that the volume
calculations setting must be enabled, or the room volume is returned as 0.
The ClosedShell property for a Room (or Space) is the geometry formed by the boundaries of the
open space of the room (walls, floors, ceilings, roofs, and boundary lines). This property is useful if
you need to check for intersection with other physical element in the model with the room, for
example, to see if part or all of the element is located in the room. For an example, see the
RoofsRooms sample application, included with the Revit SDK, where ClosedShell is used to check
whether a room is vertically unbounded.
In addition, you can get or set the base offset and limit offset for rooms with these properties:
BaseOffset
LimitOffset
You can get or set the level that defines the upper limit of the room with the UpperLimit property.
if (null != energyData)
{
string message = "energyData : ";
message += "\nBuildingType : " + energyData.BuildingType;
TaskDialog.Show("Revit", message);
}
}
29 Revit Structure
Certain API features that only exist in Revit Structure products are discussed in the following
sections:
Structural Model Elements - Discusses specific Elements and their properties that only exist
in the Revit Structure product.
AnalyticalModel - Discusses analytical model-related classes such as AnalyticalModel,
RigidLink, and AnalyticalModelSupport.
Loads - Discusses Load Settings and three kinds of Loads.
Your Analysis Link - Provides suggestions for API users who want to link the Revit Structure
product to certain Structural Analysis applications.
This chapter contains some advanced topics. If you are not familiar with the Revit Platform API,
read the basic chapters first, such as Getting Started, Elements Essentials, Parameter, and so on.
TaskDialog.Show("Revit", message);
}
You can filter out FamilySymbol objects corresponding to structural columns, beams, and braces in
using categories. The category for Structural beams and braces is
BuiltInCategory.OST_StructuralFraming.
TaskDialog.Show("Revit",message);
}
You can get and set beam setback properties with the FamilyInstance.ExtensionUtility property. If
this property returns null, the beam setback cant be modified.
Filter out the right face based on normal and origin. For example:
For a general vertical Wall, the face is located using the following factors:
The face is vertical; (normal.Z == 0.0)
Parallel face directions are opposite:
(normal1.X = - normal2.X; normal1.Y = - normal2.Y)
Normal must be parallel to the location line.
For a general Floor without slope, the factors are:
The face is horizontal; (normal.X == 0.0 && normal.Y ==0.0)
Judge the top and bottom face; (distinguish 2 faces by normal.Z)
For more details about retrieving an Elements Geometry, refer to the Geometry chapter.
29.1.3BeamSystem
BeamSystem provides you with full access and edit ability. You can get and set all of its properties,
such as BeamSystemType, BeamType, Direction, and Level. BeamSystem.Direction is not limited to
one line of edges. It can be set to any XYZ coordinate on the same plane with the BeamSystem.
Note: You cannot change the StructuralBeam AnalyticalModel after the Elevation property is
changed in the UI or by the API. In the following picture the analytical model lines stay in
the original location after BeamSystem Elevation is changed to 10 feet.
29.1.4Truss
The Truss class represents all types of trusses in Revit. The TrussType property indicates the type
of truss.
//new base Line - use line that spans two selected columns
AnalyticalModel frame1 = column1.GetAnalyticalModel() as AnalyticalModel;
XYZ centerPoint1 = (frame1.GetCurve() as Line).get_EndPoint(0);
try
{
baseLine = document.Application.Create.NewLineBound(startPoint, endPoint);
}
catch (System.ArgumentException)
{
throw new Exception("Selected columns are too close to create truss.");
}
// use the active view for where the truss's tag will be placed; View used in
// NewTruss should be plan or elevation view parallel to the truss's base line
Autodesk.Revit.DB.View view = document.ActiveView;
if (null != trussType)
{
return truss;
}
29.1.5Rebar
The Rebar class represents rebar used to reinforce suitable elements, such as concrete beams,
columns, slabs or foundations.
You can create rebar objects using one of two Document.Create.NewRebar() method overloads.
Name Description
public Rebar NewRebar( Creates a new instance of a Rebar element within
RebarStyle style,
the project.
RebarBarType rebarType,
RebarHookType startHook,
RebarHookType endHook,
Element host,
XYZ norm,
CurveArray curves,
int startHookOrient,
int endHookOrient,
bool useExistingShapeIfPossible,
bool createNewShape
);
public Rebar NewRebar( Creates a new Rebar, as an instance of a
RebarShape rebarShape, RebarShape. The instance will have the default
RebarBarType rebarType,
Element host, shape parameters from the RebarShape, and its
XYZ origin, location is based on the bounding box of the
XYZ xVec, shape in the shape definition. Hooks are removed
XYZ yVec from the shape before computing its bounding
); box. If appropriate hooks can be found in the
document, they will be assigned arbitrarily.
The first version creates rebar from an array of curves describing the rebar, while the second
creates a Rebar object based on a RebarShape and position.
When using the first NewRebar() method overload, the parameters RebarBarType and
RebarHookType are available in the RebarBarTypes and RebarHookTypes property. The
RebarBarTypes property and RebarHookTypes property are Document properties.
The following code illustrates how to create Rebar with a specific layout.
{
// Define the rebar geometry information - Line rebar
LocationPoint location = column.Location as LocationPoint;
XYZ origin = location.Point;
XYZ normal = new XYZ(1, 0, 0);
XYZ rebarLineEnd = new XYZ(origin.X, origin.Y, origin.Z + 9);
Line rebarLine = document.Application.Create.NewLineBound(origin, rebarLineEnd);
Rebar rebar =
document.Create.NewRebar(Autodesk.Revit.DB.Structure.RebarStyle.Standard,
barType, hookType, hookType, column, origin, curves,
RebarHookOrientation.Right, RebarHookOrientation.Left,
true, true);
if (null != rebar)
{
// set specific layout for new rebar
Parameter paramLayout = rebar.get_Parameter(BuiltInParameter.REBAR_ELEM_LAYOUT_RULE);
paramLayout.Set(1); // 1 = Fixed Number
Parameter parNum = rebar.get_Parameter(BuiltInParameter.REBAR_ELEM_QUANTITY_OF_BARS);
parNum.Set(10);
rebar.ArrayLength = 1.5;
}
return rebar;
}
Note: For more examples of creating rebar elements, see the Reinforcement and NewRebar
sample applications included with the Revit SDK.
The following table lists the integer value for the Parameter REBAR_ELEM_LAYOUT_RULE:
Value 0 1 2 3 4
Description None Fixed Number Maximum Number with Minimum Clear
Spacing Spacing Spacing
29.1.6BoundaryConditions
There are three types of BoundaryConditions:
Point
Curve
Area
The type and pertinent geometry information is retrieved using the following code:
Parameter param =
boundaryConditions.get_Parameter(BuiltInParameter.BOUNDARY_CONDITIONS_TYPE);
switch (param.AsInteger())
{
case 0:
XYZ point = boundaryConditions.Point;
message += "\nThis BoundaryConditions is a Point Boundary Conditions.";
message += "\nLocation point: (" + point.X + ", "
+ point.Y + ", " + point.Z + ")";
break;
case 1:
message += "\nThis BoundaryConditions is a Line Boundary Conditions.";
Curve curve = boundaryConditions.get_Curve(0);
// Get curve start point
message += "\nLocation Line: start point: (" + curve.get_EndPoint(0).X + ", "
+ curve.get_EndPoint(0).Y + ", " + curve.get_EndPoint(0).Z + ")";
// Get curve end point
message += "; end point:(" + curve.get_EndPoint(1).X + ", "
+ curve.get_EndPoint(1).Y + ", " + curve.get_EndPoint(1).Z + ")";
break;
case 2:
message += "\nThis BoundaryConditions is an Area Boundary Conditions.";
for (int i = 0; i < boundaryConditions.NumCurves; i++)
{
Autodesk.Revit.DB.Curve areaCurve = boundaryConditions.get_Curve(i);
// Get curve start point
message += "\nCurve start point:(" + areaCurve.get_EndPoint(0).X + ", "
+ areaCurve.get_EndPoint(0).Y + ", " + areaCurve.get_EndPoint(0).Z + ")";
TaskDialog.Show("Revit", message);
}
29.1.7.1 Slab
Both Slab (Structural Floor) and Slab Foundation are represented by the Floor class and are
distinguished by the IsFoundationSlab property.
The Slab Span Directions are represented by the IndependentTag class in the API and are available
as follows:
29.2 AnalyticalModel
In Revit Structure, an analytical model is the engineering description of a structural physical model.
The following structural elements have structural member analytical models:
Structural Columns
Structural Framing elements (such as beams and braces)
Structural Floors
Structural Footings
Structural Walls
An Elements AnalyticalModel can be obtained using the GetAnalyticalModel() method. Note that
the AnalyticalModel for a newly created structural element is not available until a Regeneration
occurs. Depending on the elements family, the AnalyticalModel may not exist. If the
AnalyticalModel value does not apply to an elements family, the GetAnalyticalModel() method
returns null. Check the value before using this class. AnalyticalModel is made up of the following
information:
Location of the Element with respect to analysis
Parameter Information, including projection, hard points, approximation, and rigid links
Support Information
Adjustment Information, both Manual and Automatic
Analytical Offset
29.2.1Analytical Location
Depending on the type of element that corresponds to the AnalyticalModel, the location of the
element with respect to analysis can be obtained by one of three methods: GetPoint(), GetCurve()
or GetCurves().
Note that the curves retrieved from these methods do not have their Reference properties set.
Therefore, they cannot be used for properties such as Curve.EndPointReference. Instead, you can
obtain References to the curves and their end points through construction of an
AnalyticalModelSelector object containing the necessary information, as the following example
demonstrates.
return true;
}
29.2.1.1 GetPoint()
If the AnalyticalModel can be expressed by a single point (i.e. Structural Footing), this method will
return that point. Otherwise, it will throw an Autodesk.Revit.Exceptions.InapplicableDataException.
The IsSinglePoint() method can be used to determine if the AnalyticalModel can be expressed by a
single point.
The following example demonstrates how to get the analytical location for a structural footing.
29.2.1.2 GetCurve()
If the AnalyticalModel can be expressed by a single curve (i.e. Structural Column or Structural
Framing), this method will return that Curve. Otherwise, it will throw an
Autodesk.Revit.Exceptions.InapplicableDataException. The IsSingleCurve() method can be used to
determine if the AnalyticalModel can be expressed by a single curve.
29.2.1.3 GetCurves()
This method is required to get the Curves of an AnalyticalModel defined by more than one curve
(i.e. Structural Wall), but can be used in all cases. If the AnalyticalModel can be expressed by a
single curve, this method will return a List containing only one Curve. If the AnalyticalModel can be
expressed by a single point, this method will return a Curve of almost 0 length containing the
point. This method takes an AnalyticalCurveType enum as a parameter. The possible values are:
RawCurves - Base Analytical Model curves generated
ActiveCurves - Curves displayed on screen (not including Rigid Links)
ApproximatedCurves - Curves approximated using linear segments
The following values related to Rigid Links are also available. See the Rigid Links section later in
this chapter for more information.
RigidLinkHead - Rigid Link at end 0 (head) of the Beam
RigidLinkTail - Rigid Link at end 1 (tail) of the Beam
AllRigidLinks - All Rigid Link curves. Rigid Link at end 0 (head) will be in the first entry.
Rigid Link at end 1 (tail) will be in the last entry.
The following example demonstrates the use of AnalyticalModel for structural walls.
29.2.2Parameter Information
AnalyticalModel provides access to Parameter information such as rigid links, projection, and
approximation.
29.2.2.3 Approximation
When an AnalyticalModel is defined by a curve rather than a straight line (i.e. for a curved beam),
an approximation (comprised of straight lines) may be preferable. AnalyticalModel has several
methods related to curve approximation. If CanApproximate() returns true, use the Approximate()
method to switch between non-approximated (curved) Analytical Models and approximated (made
up of lines only) Analytical Models. After switching to approximated, use GetCurves() to get the
lines of the approximated curve.
The approximation will be based on the approximation deviation value
(GetApproximationDeviation()) and the Use Hard-points parameter (UsesHardPoints()). These
values have corresponding Set methods as well. The approximation deviation limits the distance
between the smooth curve and a line segment generated by an approximation. Hard-points are
the locations on the curved beam where other structural elements are touching. When you set this
parameter to true, it forces the segmented analytical model to have nodal points at the ends of the
members attached to the curved beam
29.2.2.4 AnalyzeAs
The Analyze As parameter can be retrieved and set via the AnalyticalModel. This parameter
indicates to analysis programs how an element should be analyzed, or whether the element is
NotForAnalysis. Since the AnalyzeAs enum used by GetAnalyzeAs() and SetAnalyzeAs() contains
enum values used for different types of elements, not all values are applicable for all analytical
models. Use the IsAnalyzeAsValid() method to determine if a particular value is applicable for the
analytical model.
29.2.3Manual Adjustment
The geometry of the structural member analytical model may also be adjusted in relation to those
elements to which it joins (assuming the SupportsManualAdjustment() method returns true). Use
the AnalyticalModel.ManuallyAdjust() method to adjust the analytical model in relation to another
element. AnalyticalModel also provides methods to determine if the analytical model has been
manually adjusted and to reset it back to its original location, relative to its corresponding physical
model. Additionally, the GetManualAdjustmentMatchedElements() method retrieves a collection of
element Ids against which the Analytical Model has been adjusted.
29.2.4Analytical Offset
Another way to adjust an analytical model is to use an offset. Setting the analytical offset is
different than manually adjusting the analytical model. The analytical offset is a basic offset
applied to the entire analytical model and is independent of any other elements. AnalyticalModel
has methods to get and set the analytical offset as well as to determine if the analytical offset can
be changed (CanSetAnalyticalOffset()).
29.2.5AnalyticalModelSupport
AnalyticalModel provides the method IsElementFullySupported() to determine if the analytical
model is fully supported. For additional information about what is supporting the analytical model,
the GetAnalyticalModelSupports() method retrieves a collection of AnalyticalModelSupport objects
that provide information on how the element is supported by other structural elements, including
the priority of each support (if multiple elements provide support) and the point, curve or face that
provides the support. The following examples illustrate how to use the AnalyticalModelSupport
objects in different conditions.
29.3 Loads
The following sections identify load settings and discuss load limitation guidelines.
29.3.1Load Settings
All functionality on the Setting dialog box Load Cases and Load Combinations tabs can be accessed
by the API.
The following properties are available from the corresponding LoadCase BuiltInParameter:
Property BuiltInParameter
Case Number LOAD_CASE _NUMBER
Nature LOAD_CASE_NATURE
Category LOAD_CASE_CATEGORY
Because they are all Element subclasses, they can be deleted using Document.Delete().
For the NewLoadCombination() method, the factor size must be equal to or greater than the sum
size of cases and combinations. For example,
If cases.Size is M, combinations.Size is N,
Factors.Size should not be less than M+N. The first M factors map to M cases in order, and
the last N factors map to N combinations.
Check that LoadCombination does not include itself.
There is no Duplicate() method in the LoadCase and LoadNature classes. To implement this
functionality, you must first create a new LoadCase (or LoadNature) object using the
NewLoadCase() (or NewLoadNature()) method, and then copy the corresponding properties and
parameters from an existing LoadCase (or LoadNature).
Location Read-only;
Parameter:
Analyze as Editable;
AnalyticalModel:
Profile Read-only;
RigidLink Read-only;
Material:
30 Revit MEP
The Revit MEP portion of the Revit API provides read and write access to HVAC and Piping data in a Revit model
including:
return pipe;
}
After creating a pipe, you might want to change the diameter. The Diameter property of Pipe is
read-only. To change the diameter, get the RBS_PIPE_DIAMETER_PARAM built-in parameter.
MessageBox.Show(message, "Revit");
}
Another common way to create a new duct or pipe is between two existing connectors, as the
following example demonstrates. In this example, it is assumed that 2 elements with connectors
have been selected in Revit MEP, one being a piece of mechanical equipment and the other a duct
fitting with a connector that lines up with the SupplyAir connector on the equipment.
{
csi = fi.MEPModel.ConnectorManager.Connectors.ForwardIterator();
while (csi.MoveNext())
{
Connector conn = csi.Current as Connector;
if (conn.Direction == FlowDirectionType.Out &&
conn.DuctSystemType == DuctSystemType.SupplyAir)
{
connector1 = conn;
break;
}
}
}
}
}
// next find the second selected item to connect to
foreach(Element e in selection)
{
if (e is FamilyInstance)
{
FamilyInstance fi = e as FamilyInstance;
Family family = fi.Symbol.Family;
if (family.FamilyCategory.Name != "Mechanical Equipment")
{
csi = fi.MEPModel.ConnectorManager.Connectors.ForwardIterator();
while (csi.MoveNext())
{
if (null == connector2)
{
Connector conn = csi.Current as Connector;
// make sure to choose the connector in line with the first connector
if (Math.Abs(conn.Origin.Y - connector1.Origin.Y) < 0.001)
{
connector2 = conn;
break;
}
}
}
}
}
}
Duct duct = null;
if (null != connector1 && null != connector2)
{
// find a duct type
FilteredElementCollector collector =
new FilteredElementCollector(uiDocument.Document);
collector.OfClass(typeof(DuctType));
// Use Linq query to make sure it is one of the rectangular duct types
var query = from element in collector
where element.Name.Contains("Mitered Elbows") == true
select element;
// use extension methods to get first duct type
DuctType ductType = collector.Cast<DuctType>().First<DuctType>();
if (null != ductType)
{
duct = uiDocument.Document.Create.NewDuct(connector1, connector2, ductType);
}
}
return duct;
}
Below is the result of running this code after selecting a VAV Unit Parallel Fan Powered and a
rectangular elbow duct fitting.
In the following sample, a new SupplyAir duct system is created from a selected piece of
mechanical equipment (such as a fan) and all selected Air Terminals.
30.2 Connectors
As shown in the previous section, new pipes and ducts can be created between two connectors.
Connectors are associated with a domain ducts, piping or electrical which is obtained from the
Domain property of a Connector. Connectors are present on mechanical equipment as well as on
ducts and pipes.
To traverse a system, you can examine connectors on the base equipment of the system and
determine what is attached to the connector by checking the IsConnected property and then the
AllRefs property. When looking for a physical connection, it is important to check the
ConnectionType of the connector. There are both physical and logical connectors in Revit, but only
the physical connectors are visible in the application. The following imagine shows the two types of
physical connectors end connections and curve connectors.
if (connector.IsConnected == true)
{
ConnectorSet connectorSet = connector.AllRefs;
ConnectorSetIterator csi = connectorSet.ForwardIterator();
while (csi.MoveNext())
{
Connector connected = csi.Current as Connector;
if (null != connected)
{
// look for physical connections
if (connected.ConnectorType == ConnectorType.EndConn ||
connected.ConnectorType == ConnectorType.CurveConn ||
connected.ConnectorType == ConnectorType.PhysicalConn)
{
message += "\nConnector is connected to: " + connected.Owner.Name;
message += "\nConnection type is: " + connected.ConnectorType;
}
}
}
}
else
{
message += "\nConnector is not connected to anything.";
}
MessageBox.Show(message, "Revit");
}
}
The following dialog box is the result of running this code example on the connector from a piece of
mechanical equipment.
The following code demonstrates how to add two pipe connectors to faces on an extrusion and set
some properties on them.
if (planarFaces.Count > 1)
{
// Create the Supply Hydronic pipe connector
PipeConnector connSupply =
uiDocument.Document.FamilyCreate.NewPipeConnector(planarFaces[0].Reference,
PipeSystemType.SupplyHydronic);
param = connSupply.get_Parameter(BuiltInParameter.RBS_PIPE_FLOW_DIRECTION_PARAM);
param.Set(2);
param = connReturn.get_Parameter(BuiltInParameter.CONNECTOR_RADIUS);
param.Set(0.5); // 6" radius
param = connReturn.get_Parameter(BuiltInParameter.RBS_PIPE_FLOW_DIRECTION_PARAM);
param.Set(1);
}
}
The following illustrates the result of running this example using in a new family document created
using a Mechanical Equipment template and passing in an extrusion 2x2x1. Note that the
connectors are placed at the centroid of the planar faces.
A. Glossary
Array
Arrays hold a series of data elements, usually of the same size and data type. Individual elements
are accessed by their position in the array. The position is provided by an index, which is also
called a subscript. The index usually uses a consecutive range of integers, but the index can have
any ordinal set of values.
BIM
Building Information Modeling is the creation and use of coordinated, internally consistent,
computable information about a building project in design and construction. In a BIM application
the graphics are derived from the information and are not the original information itself like in
general CAD applications.
Class
In object-oriented programming (OOP), classes are used to group related Properties (variables)
and Methods (functions) together. A typical class describes how those methods operate upon and
manipulate the properties. Classes can be standalone or inherited from other classes. In the latter,
a class from which others are derived is usually referred to as a Base Class.
Events
Events are messages or functions that are called when an event occurs within an application. For
example when a model is saved or opened.
Iterator
An iterator is an object that allows a programmer to traverse through all elements in a collection
(an array, a set, etc.), regardless of its specific implementation.
Method
A method is a function or procedure that belongs to a class and operates or accesses the class data
members. In procedural programming, this is called a function.
Namespace
A namespace is an organizational unit used to group similar and/or functionally related classes
together.
Overloading
Method overloading is when different methods (functions) of the same name are invoked with
different types and/or numbers of parameters passed.
Properties
Properties are data members of a class accessible to the class user. In procedural programming
this is called a variable. Some properties are read only (support Get() method) and some are
modifiable (support Set() method).
Revit Families
A Family is a collection of objects called types. A family groups elements with a common set of
parameters, identical use, and similar graphical representation. Different types in a family can have
different values of some or all parameters, but the set of parameters - their names and their
meaning - are the same.
Revit Parameters
There are a number of Revit parameter types.
Shared Parameters can be thought of as user-defined variables.
System Parameters are variables that are hard-coded in Revit.
Family parameters are variables that are defined when a family is created or modified.
Revit Types
A Type is a member of a Family. Each Type has specific parameters that are constant for all
instances of the Type that exist in your model; these are called Type Properties. Types have other
parameters called Instance parameters, which can vary in your model.
Sets
A set is a collection (container) of values without a particular order and no repeated values. It
corresponds with the mathematical concept of set except for the restriction that it has to be finite.
Element ID
Each element has a corresponding ID. It is identified by an integer value. It provides a way of
uniquely identifying an Element within an Autodesk Revit project. It is only unique for one project,
but not unique across separate Autodesk Revit projects.
Element UID
Each element has a corresponding UID. It is a string identifier that is universally unique. That
means it is unique across separate Autodesk Revit projects.
B. FAQ
General Questions
Q: How do I reference an element in Revit?
A: Each element has an ID. The ID that is unique in the model is used to make sure that you are
referring to the same element across multiple sessions of Revit.
Q: Do I need to distribute the shared parameters file with the model so other programs can use the
shared parameters?
A: No. The shared parameters file is only used to load shared parameters. After they are loaded
the file is no longer needed for that model.
Q: Are shared parameter values copied when the corresponding element is copied?
A: Yes. If you have a shared parameter that holds the unique ID for an element in your database,
append the Revit element Unique ID or add another shared parameter with the Revit element
unique ID. Do this so that you can check it and make sure you are working with the original
element ID and not a copy.
Q: Are element Unique IDs (UID) universally unique and can they ever change?
A: The element UIDs are universally unique, but element IDs are only unique within a model. For
example, if you copy a wall from one Revit project to another one, the UID of the wall is certain to
change to maintain universal uniqueness, but the ID of the wall may not change.
Q: Revit takes a long time to update when my application sends data back to the model. What do I
need to do to speed it up?
A: You can try using the SuspendUpdating command. See the FrameBuilder example in the SDK.
Q: What do I do if I want to add shared parameters to elements that do not have the ability to
have shared parameters bound to them? For example, Grids or Materials.
A: If an element type does not have the ability to add shared parameters, you need to add a
project parameter. This does make it a bit more complicated when it is time to access the shared
parameter associated with the element because it does not show up as part of the elements
parameter list. By using tricks like making the project shared parameter a string and including the
element ID in the shared parameter you can associate the data with an element by first parsing the
string.
STDMETHOD(GetLocation)(LPWSTR pszPathBuffer,
DWORD cchMax,
DWORD *pdwPriority,
const SIZE *prgSize,
DWORD dwRecClrDepth,
DWORD *pdwFlags);
STDMETHOD(Extract)(HBITMAP*);
Q: I am rotating the beam orientation so they are rotated in the weak direction. For example, the I
of a W14X30 is rotated to look like an H by a 90 degree rotation. How is that rotation angle
accessed in the API?
Because the location is a LocationCurve not a LocationPoint I do not have access to the Rotation
value so what is it I need to check? I have a FamilyInstance element to check so what do I do with
it?
A: Take a look at the RotateFramingObject example in the SDK. It has examples of how to get and
change the beam braces and columns rotation angle.
Q: When exporting a model containing groups to an external program, the user receives the
following error at the end of the export:
"Changes to group "Group 1" are allowed only in group edit mode. Use the Edit Group command to
make the change to all instances of the group. You may use the "Ungroup" option to proceed with
this change by ungrouping the changed group instances."
A: Currently the API does not permit changes to group members. You can programmatically
ungroup, make the change, regroup and then swap the other instances of the old group to the new
group to get the same effect.
[ExternalCommands]
In the Revit.ini [ExternalCommands] section, you can specify external tools that are loaded on
start-up. There can only be one [ExternalCommands] in the revit.ini file.
Example:
menu item.
[ExternalApplications]
In the Revit.ini, you list external applications in the [ExternalApplications] section.
You can load and run external applications using the Add-in Manager utility provided with the Revit
Platfor SDK instead of manually editing the Revit.ini file.
// Set footer text. Footer text is usually used to link to the help document.
mainDialog.FooterText =
"<a href=\"http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975 \">"
+ "Click here for the Revit API Developer Center</a>";
// If the user clicks the first command link, a simple Task Dialog
// with only a Close button shows information about the Revit installation.
if (TaskDialogResult.CommandLink1 == tResult)
{
TaskDialog dialog_CommandLink1 = new TaskDialog("Revit Build Information");
dialog_CommandLink1.MainInstruction =
"Revit Version Name is: " + app.VersionName + "\n"
+ "Revit Version Number is: " + app.VersionNumber + "\n"
+ "Revit Version Build is: " + app.VersionBuild;
dialog_CommandLink1.Show();
}
// If the user clicks the second command link, a simple Task Dialog
// created by static method shows information about the active document
else if (TaskDialogResult.CommandLink2 == tResult)
{
TaskDialog.Show("Active Document Inforamtion",
"Active document: " + activeDoc.Title + "\n"
+ "Active view name: " + activeDoc.ActiveView.Name);
}
return Autodesk.Revit.UI.Result.Succeeded;
}
}
2. From the context menu, select Properties to open the Properties dialog box.
3. In the Properties dialog box, click the References tab. A list of references and namespaces
appears.
4. Click the Add button to open the Add Reference dialog box.
5. In the Add Reference dialog box, click the Browse tab. Locate the folder where Revit is
installed and click the RevitAPI.dll. For example the installed folder location might be
C:\Program Files\Autodesk\Revit Architecture 2012\Program\RevitAPI.dll.
6. Click OK to add the reference and close the dialog box.
7. Repeat steps above to add a reference to RevitAPIUI.dll, which is in the same folder as Revit
API.dll.
Add Code
When writing the code in VB.NET, you must pay attention to key letter capitalization.
Imports Autodesk.Revit.UI
Imports Autodesk.Revit.DB
<Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)>
_
Public Class Class1
Implements IExternalCommand
Public Function Execute(ByVal revit As ExternalCommandData, ByRef message As String, _
ByVal elements As ElementSet) As Autodesk.Revit.UI.Result _
Implements IExternalCommand.Execute
Return Autodesk.Revit.UI.Result.Succeeded
End Function
End Class
Code Region 30-10: Creating a .addin manifest file for an external command
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Command">
<Assembly>D:\Sample\HelloWorld\bin\Debug\HelloWorld.dll</Assembly>
<AddInId>239BD853-36E4-461f-9171-C5ACEDA4E721</AddInId>
<FullClassName>Class1</FullClassName>
<Text>HelloWorld</Text>
<VendorId>ADSK</VendorId>
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
</AddIn>
</RevitAddIns>
Refer to the Add-in Integration chapter for more details using manifest files.
4. In the Debug window Start Action section, click Start external program and browse to the
Revit.exe file. By default, the file is located at the following path, C:\Program
Files\Autodesk\Revit Structure 2012\Program\Revit.exe.
Concrete
Behavior Behavior bool Isotropic, Orthotropic Currently exposed for Generic Only
Wood
Young Modulus PoissonModulus double UT_Stress
Poisson ratio ShearModulus double UT_Number
Shear modulus ShearModulus double UT_Stress
Thermal Expansion coefficient ThermalExpansionCoefficient double UT_TemperalExp
Precast-Rectangular Beam
Precast-Single Tee
Precast-Inverted Tee
Precast-Double Tee
Consistency
It is important for applications based on the API to provide a user experience that is consistent with
Revit. This will allow the users of your application to leverage knowledge they developed while
learning Revit. Consistency can be obtained by re-using certain dialog types, instead of creating or
re-creating dialogs. See the dialog types section for examples of dialogs you can leverage when
creating your application.
Good Layout
A well-balanced layout of information can be achieved by following Gestalt Principles:
PROXIMITY: items placed close together are perceived as being closely associated
SIMILARITY: items that share similar appearance are perceived as being closely associated
CONTINUITY: humans tend to prefer simple, unbroken contours over more complex, yet similarly plausible
forms
Good Defaults
When a user needs to edit data or change a setting, the lack of any or obvious default can lead to
errors and force users to re-edit and re-enter information. Remember to:
Set the control value with a reasonable default value for the current context by consulting usage data or using
the previously entered values by the user. The appropriate default may be blank.
Where appropriate, remember the last used setting of the user instead of always presenting the same system
default
A common example is pre-setting certain settings or options which would be the most often
selected.
Progressive Disclosure
As an application's complexity increases, it becomes harder for the user to find what they need. To
accommodate the complexity of a user interface, it is common to separate the data or options into
groupings. The concept of Progressive Disclosure shows the needed information as necessary.
Progressive Disclosure may be user-initiated, system initiated, or a hybrid of the two.
CHARACTERS PERCENTAGE
1-5 characters 100%
6-10 characters 40%
11-100 characters 30%
100 characters or 20%
greater
Make the invisible control frame around text controls, frames etc. as large as possible to allow for longer
translated text. These frames should be at least 30% larger than the English text.
Refer to the USER INTERFACE TEXT GUIDELINES FOR MICROSOFT WINDOWS USER EXPERIENCE GUIDELINES for
additional information regarding localizing text.
Dialog Guidelines
Introduction
A dialog is a separate controllable area of the application that contains information and/or controls
for editing information. Dialogs are the primary vehicle for obtaining input from and presenting
information to the user. Use the following guidelines when deciding which dialog to use.
Dialog Type Definition Use When
Modal Halts the rest of the Task(s) in the dialog are
application and waits for infrequent
user input It is acceptable to halt the
system while the user enters
data
Behavior Rules
A dialog can either be user initiated (prompted by clicking a control) or system initiated (a warning triggered
by a system event)
The initial dialog location typically should be centered on the screen, but this rule may vary based on variation
or on a particular context of use, but should have an immediate focus
Dialogs should be resizable when the content is dynamic, please see DYNAMIC LAYOUT section for more on this
topic
Dialog Controls
Control Use When Example
CHECK The choice being made (and it's
BOX opposite) can be clearly expressed to
the user with a single label The opposite of enable is disable
default selection
Also, use this instead of radio
buttons when there are more than
four choices or if real estate is
limited
COMBO Similar to a drop-down list box, but
BOX allows the user to enter information
not pre-populated in the drop-down
Basic Elements
Every dialog contains the following elements:
Element Requirements Illustration
Title bar Title bars text describes the contents
1 of the window.
Help A button in the title bar next to the
2 button close button.
Help button is optional - use only
when a relevant section is available in
the documentation
Note that many legacy dialogs in
Revit still have the Help button
located in the bottom right of the
dialog
OK
Cancel
Yes
No
Retry
Close
Layout Flow
When viewing a dialog within a user interface, the user has multiple tasks to accomplish. How the
information is designed and laid out must support the user in accomplishing their task(s). Keeping
this in mind, it is important to remember users:
Scan (not read) an interface and then stop when they get to what they were looking for and ignore anything
beyond it
Focus on items that are different
Not scroll unless they need to
Lay out the window in such a way that suggests and prompts a "path" with a beginning, middle,
and end. This path should be designed to be easily scanned. The information and controls in the
"middle" of the path must be designed to be well balanced and clearly delineate the relationship
between controls. Of course, not all users follow a strictly linear path when completing a task. The
path is intended for a typical task flow.
Variation A: Top-Down
Variation B: Left-Right
1 2
1 2 3
In this example (Revit Filters), the three primary tasks are grouped into columns, delineated by the
group boxes: Filters, Categories and Filter Rules. Each of these columns contains a top-down flow
that involves selecting from a collection of items or modifying a control.
Spacing and Margins
The following table, taken from the LAYOUT SECTION OF THE MICROSOFT WINDOWS USER EXPERIENCE GUIDELINES
lists the recommended spacing between common UI elements (for 9 pt. Segoe UI at 96 dpi). For a
definition of the difference between dialog units (DLU) and relative pixels, see the LAYOUT METRICS
section from the Microsoft guidelines.
TIP: Visual Studio makes it easy to follow these guidelines using a combination of Margin
and Padding properties and the Snap lines feature. For more information, see
WALKTHROUGH: LAYING OUT WINDOWS FORMS CONTROLS WITH PADDING, MARGINS, AND THE AUTO
SIZE PROPERTY.
Between horizontally or 4 7
vertically arranged buttons
Grouping
Group boxes are the most common solution used to explicitly group related controls together in a
dialog and give them a common grouping.
The (Materials) single group box title is redundant with the dialog title and can be removed.
Figure 202 Group box with no label and group box with one control and Group box with
title that is redundant with dialog title
Avoid nesting two of more group boxes within one another and placing Commit buttons inside a
group box.
Horizontal Separator
An alternative to the traditional group box is a horizontal separator. Use this only when the groups
are stacked vertically in a single column.
changes such as localizing to other languages, changing the font size of content, and for allowing
user to manually expand the window to see more information.
To create a dynamic layout:
Treat the content of the window as dynamic and expand to fill the shape of its container unless constrained.
Add a resizing grip to the bottom right corner of the dialog.
The dialog should not be resizable to a size smaller than the default size.
The user defined size should be remembered within and between application sessions.
Elements in the dialog should maintain alignment during resizing based on the quadrant they are described in
the following table:
Figure 204 - Four square grid applied to Revit View Templates dialog to demonstrate
how it should be resized
In this example, the list box is located in all four quadrants. So, it is anchored to the top-left and
expands to the right and to the bottom.
Implementation Notes
Here are the some steps to consider when implementing a dynamic layout:
Break the design on sections based on the structure of the content and flow you would like to achieve when
container's size changes.
Define the minimum, maximum and other size constrains for the various sections and control used. This is usually
driven by the purpose of the data type we are presenting, images, supplemental information and controls.
Consider alignment, that is, how the content will flow when re-sized.
Consider which items should be static and which dynamic and how they are expandable which should usually be
for left-to-right languages, and dialogs should flow to the right and bottom, being anchored and aligned to the top
and left.
For guidelines on how different controls should handle resizing, see the table below:
Control Content Re-sizable Moveable
Button Static No Yes
Link Static No Yes
Radio Button Static No Yes
Spin Control Static No Yes, based on the element to which it is
attached
Slider Static X Direction Yes
Scroll Bar Static X Direction Yes
Tab Dynamic X and Y Yes, but not smaller then the biggest control
Direction contained
Progressive Dynamic X and Y Yes, but not smaller then the biggest control
Disclosure Direction contained
Check Box Static No Yes
Drop-Down List Dynamic X Direction Yes but not smaller then the biggest text
contained.
Combo Box Dynamic X and Y Yes, but not smaller then the biggest text
Direction contained
List View Dynamic X and Y Yes, but not smaller then the biggest text
Direction contained
Text Box Dynamic X and Y if Yes
multi-line
Date Time Box Dynamic X Direction Yes, but not smaller then the biggest text
contained
Tree View Dynamic X and Y Yes, but not smaller then the biggest text
Direction contained
Canvas Dynamic X and Y Yes
Direction
Group Box Dynamic X and Y Yes, but not smaller then the biggest control
Direction contained
Progress Bar Static X Yes
Status Bar Dynamic X Yes
Table or data grid Dynamic X and Y Yes, table columns should grow proportionally
in the X direction
TIP: For more detail on using a FlowLayoutPanel to build a resizable dialog, see:
Walkthrough: Arranging Controls on Windows Forms Using a FlowLayoutPanel
Dialog Types
There are a handful of dialog types that persist throughout the Revit products. Utilizing these
standard types helps to drive consistency and leverage users existing learning and knowledge
patterns.
Title bar
Option
controls
Commit buttons
Property Editor
Use when an item's properties need to be modified by the user. To create a property editor,
provide a TABLE VIEW that presents a name/property pair. The property field can be modified by a
Text Box, Check Box, Command Button, Drop-Down List, or even a slider.
1 F ilte r F ilt e r
G ro P
upro1p e rty V a lu e G ro u p in g 2
P ro p 0
P ro p 1 V a lu e
C o n tro ls 3
P ro p 2
P ro p 3 10
G ro u p 2
G ro u p 2
P ro p 4 B u tto n ...
OK Cancel A p p ly C o m m it 4
Content Editor
If multiple action controls interoperate with the same content control (such as a list box), vertically
stack them to the right of and top-aligned with the content control, or horizontally place them left-
aligned under the content control. This layout decision is at the developers discretion.
Figure 207 Action controls to the right of content and action controls below content
Collection Viewer
In applications such as Revit, the user must view and manage collections of items to complete their
tasks. The Collection View provides the user a variety of ways of viewing the items (browsing,
searching and filtering) in the collection. Provide a way for a user to easily browse through a
collection of items for the purpose of selecting an item to view or edit (see COLLECTION EDITOR).
Optionally provide the ability to search and/or filter the collection.
4 3
5 View the The collection itself can be viewed in the following ways: List View, Yes
collection Table View, Tree View, or as a Tree Table
6 Show More This button hides/shows the additional data associated with the No
currently selected item. See
Show More Button
List View
When the user needs to view and browse and optionally select, sort, group, filter, or search a flat
collection of items. If the list is hierarchical, use TREE VIEW or TREE TABLE and if the data is grouped
into two or more columns, use TABLE VIEW instead.
Figure 209 - List View, showing different ways of presenting the data
There are four basic variations of this pattern that includes the following:
Drop down list
Use a drop down list box when you only need to present a flat list of names, only a single selection
is required and space is limited. The MICROSOFT USER EXPERIENCE GUIDELINES should be followed when
using a drop-down list.
Figure 211 The font selector in Microsoft Office 2007 is an example of a combo box
List box
Use when you only need to present a - list of names, it benefits the user to see all items and when
there is sufficient room on the UI to display list box. Use also if selecting more than one option is
required. The MICROSOFT USER EXPERIENCE GUIDELINES should be followed when using a list box.
List View
Use when the data includes the option of list, details and/or graphical thumbnail previews, such as
a Windows Open Dialog.
Table View
Users often need to view the contents of a collection so that they can easily comprehend and
compare the attributes of many items at once. To accommodate this, present the user with a table
that is formatted in such a way that is conducive to scanning.
Examples
Good Example - The following is an example of a well-formatted table.
Note the header cells are differentiated from the data cells and the alignment differs to makes it
easier to scan the data.
NOTE: People can easily forget that they are looking at percentages so the redundancy is
important here, especially for tables with many values
Column Sorter
Use a column sorter when users are viewing a collection (such as a large table), possibly spanning
multiple pages, that they must scan for interesting values.
There are several meaningful possibilities for sorting the table and users may be more effective if
they can dynamically change the column that is used for sorting the values on.
Allow users to sort a collection of items by clicking on a column header
As users click on the column label, the table is sorted by that column
Another click reverses the order, which should be visualized using an up or down-wards
pointing arrow
Make sure it is visible which columns can be clicked on and which one is active now
Tree View
Often a user may need to understand complex relationships within a hierarchy of items and this
can often best displayed within a tree view. The user may also need to select one or more of the
items. If the collection is a flat list, use the LIST VIEW and if the data is grouped into two or more
columns, use Table VIEW or TREE TABLE instead.
A tree UI follows the principle of user initiated PROGRESSIVE DISCLOSURE. Using a tree allows complex
hierarchical data to be presented in a simple, yet progressively complex manner. If the data
becomes too broad or deep, a search box should be considered.
Figure 218 - The Revit Project Browser is a good example of a tree view
Tree Table
As with a Tree View, the user may need to view and browse a hierarchically organized collection of
items with the intent of selecting one or more of the items. However, the user also needs to see
more properties of the item than just the name. To accommodate this, present the user with a tree
embedded within a table. Each row presents additional attributes of the item. Expanding a node
exposes another row.
Figure 219 - The Revit Visibility/Graphics dialog is a good example of a Tree Table
Collection Search / Filter
When the user is viewing a collection with many items, they may need to filter the number of
items. To accomplish this, provide a way for the user choose between either a system-provided list
of filter criteria and/or user-creatable criteria. Selecting the criteria automatically filters the
collection. The two most common ways are demonstrated in the Revit Materials dialog.
A search box allows the list to be filtered based on a keyword
A drop-down allows the list to be filtered based on a set of defined criteria
Collection Editor
In addition to viewing a collection of items, a user will also typically want to edit the collection. This
can be accomplished by associating a toolbar for editing, creating, duplicating, renaming, and
deleting items.
The Edit Bar
The buttons should be ordered left to right in the following order and with the following as tooltip
labels: Edit, New, Duplicate, Delete, Rename. If a feature does not utilize one or more buttons, the
rest move to the left.
To ensure that the primary UI element is placed first in the layout path, the following rules should
be followed when placing the manage controls:
Navigating list is primary task: place at the bottom-left of the list control
Managing list is primary task: place at top left of list control
When the main collection being managed is represented as a combo box: place to the right
of the combo box
Add/Remove
A slight variation on the Edit Bar is the use of Add and Remove buttons, denoted by plus and minus
icons, as shown below. Add and Remove is used when data is being added to an existing item in
the model.
The following is a good example of a Collection Editor dialog that uses both forms of the Edit Bar.
The Add (+) and Remove (-) buttons are used to add values to an already existing demand factor
type.
List Builder
Use when there is a number of items that the user has to add/remove from one list to another.
This is typically used when there is a list (located on the right) that needs to have items added to it
from an existing list (located on the left.) Provide a List Box View of the two lists with button
controls between, one for adding and the other for removing items.
Depending on the feature, the List Builder can act in one of two ways:
Item can only be added once items from List A can only be added to List B once. In this case, the Add button should
be disabled when a previously added item is selected in List A.
Item can be added multiple times. In this case, the Add button is not disabled, and the user can add an item from
List A to List B multiple times (the amount determined by the feature.) See Edit Label example below.
If the user needs to arbitrarily move an item up or down in a collection, provide up/down buttons
next to the list.
Task Dialog
Task dialogs are a type of modal dialog. They have a common set of controls that are arranged in a
standard order to assure consistent look and feel.
A task dialog is used when the system needs to:
provide users with information
ask users a question
or allow users to select options to perform a command or task
The image below shows a mockup of a task dialog with all possible controls enabled. Most of the
controls shown are optional and one would never create a task dialog that had everything on. The
mockup below simple illustrates all the parts of a task dialog that could be utilized in one image.
Note that this particular task dialog would never happen in a real implementation. Only a small
subset would ever be used at one time. Task dialogs cannot display other controls such as, text
inputs, list boxes, combo boxes, check boxes, etc. They also only accommodate single step, single
action operations; meaning a user may make a single choice and complete the task dialog
operation. As a result any dialog that requires such additional controls or multiple steps operations
(as with a wizard) are not task dialog candidates. They would need to be implemented as custom
dialogs using .NET controls to have a similar look & feel to Task Dialogs.
The sections to follow explain when, where and how each task dialog component should be used to
be consistent with others in Autodesk products.
Include a copyright symbol after any third party application called out in a task dialog.
Title (required)
All task dialogs require a title. Titles of task dialogs should be descriptive and as unique as
possible. Task dialog titles should take the format of the following:
<featureName> - <shortTitle>
Where <featureName> is the module from which the task dialog was triggered
And <shortTitle> is the action that resulted in the task dialog being shown
Examples:
o Reference Edit Version Conflict
o Layer Delete
o BOM Edit Formula
Where possible, use verbs on the second <shortTitle> part of the title such as Create, Delete,
Rename, Select, etc.
In cases where there is no obviously applicable feature name (or several) applying a short title
alone is sufficient.
A task dialog title should never be the product name, such as AutoCAD Architecture.
Figure 225 - A very simple task dialog with only main instructions for text
Figure 226 - A task dialog that uses both main instructions and main content
Figure 227 - The Show Details button displays additional Main Content text
For Autodesk products the warning icon (exclamation point in a yellow triangle) should
only be used in situations where a possible action will be destructive in some way and
likely cause loss of data or significant loss of time in rework.
A few examples include:
Overwriting a file
Saving to an older or different format where data may be lost
Permanently deleting data
Breaking associations between files through moving or renaming
This is only a partial list. With the exception of such situations usage of a main image should be
avoided. See Figure 229 for an example of a Task Dialog with a warning icon.
Do not is not contracted to Dont and there is no punctuation at the end of the line.
For the single action the working should be Always <action> for example
If the action is Save current drawing the checkbox label would read Always save current drawing
If the action is Convert objects to linework the checkbox label would read Always convert objects to linework
Figure 228 - Example of a task dialog using the DNSMA checkbox as an "Always..."
checkbox for one choice
Where multiple are choices possible:
The generic wording Always perform my current choice should be used
Command links should be used to show the available choices. If buttons are used and a Cancel button is included it
looks as though cancel is an option that could always be performed in future
Figure 230 - Task Dialog with command links and a command button
The OK button should only be used in situations where a task dialog poses a question that
can be answered by OK.
The Cancel button should only be used when a task can truly be canceled, meaning the
action that triggered the task dialog will be aborted and no change will be committed. It can
be used in combination with other commit buttons or command links.
The Yes & No button(s) should always be used in combination, and the text in the main
instructions and / or main content should end in a yes / no question.
The Retry button must appear with at least a Cancel button as an alternate option, so a user
can choose not to retry.
The Close button is used on any purely informational task dialog; i.e. where the user has no
action to choose, but can just read the text and close the dialog.
Previously the OK button was often used on such dialogs. It should not be used in task
dialogs for this purpose.
The following are some examples of how commit buttons should be used:
See Figure 227 for an example of a Cancel button with command links
See Figure 225 for an example of a purely informative task dialog with a close button
See Figure 228 for an example of a task dialog with OK and Cancel buttons
Navigation
Tabs
Use when there are loosely related, yet distinct "chunks" of information need to exist within the
same UI, but there is not enough room to display it all in a clear manner.
Separate the UI into distinct modal zones, each one represented by a "tab" with a descriptive label.
The entire dialog should be treated as a single window with a single set of Commit buttons.
Variations
Variation A: Horizontal Tabs
Avoid more than one row of horizontal tabs. If a second row is needed, consider a vertical tab.
Keyboard Accessibility
Tab Order
Pressing the tab key cycles the focus between each editable control in the dialog. The general rule
is left-to-right, top-to-bottom.
1. The default tab stop is at the control at the topmost, leftmost position in the dialog
2. Move right until there are no more controls in the current row
3. Move to the next row and start from the left-most control, moving right
4. Repeat step 2 until there are no more rows. Always end with the OK/Cancel/Apply row
Right and left arrow, down and up arrows, Tab and Shift-tab all have the same behavior,
respectively. Except for when the focus is on the following:
o List control or combo box: The right/left, down/up arrows move the cursor down/up
the list, respectively
o Grid control: The right/left move the cursor right/left across columns, And down/up
arrows move cursor down/up the list, respectively
o Slider: The right/left, down/up arrows move the slider right/left, respectively
o Spinner: The right/left, down/up arrows move the spinner down/up, respectively
Treat each Group conceptually as a nested dialog, following the above rules within each
Group FIRST and moving from the top-left Group, moving to the right until no more groups
are encountered and then moving to the next row of Groups.
TIP: Visual Studio can assist with the creation and editing of tab order by toggling the Tab
Order visual helper (accessed from the View > Tab Order menu.)
Access Keys
Each editable control on a dialog should get a unique access key letter (which is represented
by an underlined letter in the control's label)
The user presses Alt key plus the assigned key and that control is activated as if it was
clicked
The default button does not require an access key since Enter is mapped to it
The Cancel or Close button also does not need access key since Esc is mapped to it. See
COMMITTING CHANGES for more detail
Dialog Launcher: A button with ellipses () that launches a separate dialog. This is typically used
to provide a separate UI for editing a selected item.
Figure 233 Dialog launcher button, as implemented in the Revit View Filters dialog
Committing Changes
Modal dialogs are used to make changes to data within the project file. Use when there is an editor
a series of edits have been queued up in a modal dialog or form and need to be committed at once.
If the dialog is purely informational in nature, use a TASK DIALOG, which has its own committing rules.
Each modal dialog or web-form must have a set of commit buttons for committing the changes
and/or canceling the task and/or closing the dialog.
Sizing
Figure 234 - Commit Button sizes (taken from Microsoft Windows User Experience
Guidelines)
Layout
A summary of commit button styles for different window types
Pattern Commit Button style
Modal Dialog OK/Cancel or [Action]/Cancel
Modeless dialog Close button on dialog box and title bar
Progress Use Cancel if returns the environment to its previous state (leaving no side
Indicator effect); otherwise, use Stop
Button Type
1 Default (OK and other Action) buttons
2 Cancel or Close Button
3 Apply Button
4 Dialog buttons (optional)
Position the Default, Cancel, and Apply button(s) in this order and right aligned. The Dialog
button(s) (if present) are aligned to the left, but to the right of the help button (if present).
Make the button with less destructive result to be the Default button
Enter key is the keyboard access point for the Default button
OK button
OK buttons can be used when saving a setting or series of settings. OK button rules:
OK button should be used when it is the ONLY action (besides cancel) that can be
committed from the dialog. Do not mix OK with other action buttons
In modal dialogs, clicking OK means apply the values, perform the task, and close the
window
Do not use OK buttons to respond to questions
Label OK buttons correctly. The OK button should be labeled OK, not Ok or Okay
Do not use OK buttons in modeless dialog boxes. Use a action button or Close button
Action buttons
Action buttons have descriptive verbs that will be defined by the designer. Action button rules:
Action buttons can be used to describe more clearly the action that will be taken when
clicked
One action button must be set as the default. This should be the action most closely
mapped to the primary task of the dialog
There can be one or more action buttons, but do not mix OK button with action buttons
Use Cancel or Close button for negative commit buttons instead of specific responses to the
main instruction
Otherwise, if user wants to cancel, the negative commit would require more thinking than
needed for this particular small task
Cancel button
Cancel button should only be used when a task will be aborted and no change will be
committed
Clicking the Cancel button means abandon all changes, cancel the task, close the window,
and return the environment to its previous state and leaving no side effect
For nested choice dialog boxes, clicking the Cancel button in the owner choice dialog
typically means any changes made by owned choice dialogs are also abandoned.
Don't use Cancel button in modeless dialog boxes. Use Close button instead
Close Button
Use Close button for modeless dialog boxes, as well as modal dialogs that cannot be
canceled
Clicking Close button means close the dialog box window, leaving any existing side effects
In modal or modeless dialogs, clicking Apply means apply the values, perform the task, and
do not close the window
In modeless dialog use Apply button only on those tasks that require significant or unknown
upfront time to be performed, otherwise data change should be applied immediately
The Apply button is disabled when no changes have been made. It becomes enabled when
changes have been made
Clicking cancel will NOT undo any changes that have been already committed with the Apply
button
Interacting with a child dialog (such as a confirmation) should not cause the Apply function
to become enabled
Clicking the Apply button after committing a child dialog (such as a confirmation message)
will apply all the changes made previous to the action triggering the confirmation
Implementation Notes
Keyboard Access - each commit button should have a keyboard access key mapped to it.
The default button should be mapped to Enter
The close button (whether it is Cancel or Close) should be mapped to Esc
If Apply exists, and is NOT the default button, it should be mapped to Alt-A
Ribbon Guidelines
The following are aspects of the ribbon UI that can be modified by individual API developers. These
guidelines must be followed to make your applications user interface (UI) compliant with standards
used by Autodesk.
Panel Layout
The following guidelines define the proper way to lay out a panel on the Add-ins tab. The following
panel under General Layout provides an example to follow.
General layout
Figure 236 - Room & Area panel in the 2011 Revit products
A panel SHOULD have a large button as the left-most control. This button SHOULD be the most
commonly accessed command in the application. The left-most button icon will represent the entire
panel when it collapses (see PANEL RESIZING AND COLLAPSING below.) This button MAY be the only
button in the group, or this button MAY be followed by a large button and/or a small button stack.
Panels SHOULD NOT exceed three columns. If more controls are necessary, use a drop-down
button.
Panels SHOULD only contain controls for launching commands and controlling the application.
Controls for managing settings or launching help and about this application should be located in a
SLIDE-OUT PANEL.
The About button/link should be located within the main user interface and not on a ribbon panel.
Note: Panel resizing and collapsing is handled automatically by the ribbon component.
Ribbon Controls
Ribbon button
A Ribbon button is the most basic and most frequently-used control. Pressing a button invokes a
command.
Ribbon buttons can be one of the three sizes:
Large: MUST have a text label
Medium: MAY have a text label
Small: MAY have a text label
Radio Buttons
A radio button group represents a set of controls that are mutually exclusive; only one can be
chosen at a time. These groups can be stacked horizontally (as seen in the justification buttons in
the example below.)
Drop-down button
The top label SHOULD sufficiently describe the contents of the drop-down list.
Every item in the list SHOULD contain a large icon.
A horizontal separator can be optionally added between controls. This should be used if the
items are logically grouped under one button, but are separated into distinct groups.
Split Button
A split button is a drop-down button with a default command that can be accessed by pressing the
left side of the button. The right side of the button, separated by a small vertical separator, opens
a drop-down list. The default command SHOULD be duplicated with the top command in the list.
A split buttons default command can be synchronized. That is, the default command changes
depending on the last used command in the drop-down list.
Slide-out Panel
Vertical separator
A vertical separator MAY be added between a control or sets of controls to create distinct groupings
of commands within a panel. A panel SHOULD have no more than two separators.
Icons
For proper icon design, see the icon design guidelines.
Text Usage
Button Labels
These guidelines are for English language only.
MUST not have any punctuation (except hyphen, ampersand or forward slash)
MUST be no longer than three words
MUST be no longer than 36 characters
MUST be Title Case; e.g. Show Mass
The ampersand & MUST be used instead of and. A space should appear before and after the ampersand
The forward slash / MUST be used instead of or. No spaces should appear before and after the slash
Only large buttons MAY have two line labels but MUST NOT have more than two lines. Labels for all other
controls MUST fit on a single line
Button labels MUST NOT contain ellipses ()
Every word MUST be in capital case except articles ("a," "an," and "the"), coordinating conjunctions (for
example, "and," "or," "but," "so," "yet," with, and "nor"), and prepositions with fewer than four letters (like
"in"). The first and last words are always capitalized
Panel Labels
These guidelines are English-only. All rules from the Command Labels section apply to Panel Labels
in addition to the following:
The name of the panel SHOULD be specific. Vague, non-descriptive and unspecific terms used to describe
panel content will reduce the labels usefulness
Applications MUST NOT use panel names that use the abbreviations misc. or etc
Panel labels SHOULD NOT include the term add-ins since it is redundant with the tab label
Panel labels MAY include the name of the third party product or provider
Tooltips
The following are guidelines for writing tooltip text. Write concisely. There is limited space to work
with.
Localization Considerations
Make every word count. This is particularly important for localizing tooltip text to other languages
Do not use gerunds (verb forms used as nouns) because they can be confused with participles (verb forms used as
adjectives). In the example, Drawing controls, drawing could be used as a verb or a noun. A better example is
Controls for drawing
Do not include lengthy step-by-step procedures in tooltips. These belong in Help
Use terminology consistently
Make sure that your use of conjunctions does not introduce ambiguities in relationships. For example, instead of
saying replace and tighten the hinges, it would be better to split the conjunction up into two simple (and
redundant) sentences Replace the hinges. Then tighten the hinges
Be careful with helping verbs. Examples of helping verbs include shall, may, would have, should have, might
have, and can. For example, can and may could be translated as capability and possibility respectively
Watch for invisible plurals such as object and attribute settings. Does this mean the settings for one object and
one attribute or the settings for many objects and many attributes?
Be cautious about words that can be either nouns or verbs. Use articles or rewrite phrases like Model Display
where model can be a noun or a verb in our software. Another example is empty file. It can mean to empty a
file or a file with no content
Be careful using metaphors. Metaphors can be subtle and are often discussed in the context of icons that are not
culturally appropriate or understood across cultures. Text metaphors (such as places the computer in a
hibernating state) can also be an issue. Instead, you might say places the computer in a low-power state
Writing/Wording Considerations
Use simple sentences. The Verb-Object-Adverb format is recommended
Use strong and specific verbs that describe a specific action (such as tile) rather than weak verbs (such as use
to)
Write in the active voice (for example, Moves objects between model space and paper space)
Use the descriptive style instead of the imperative style (Opens an existing drawing file vs. Open an existing
drawing file)
Make the tooltip description easily recognizable by using the third person singular (for example Specifies the
current color instead of Specify the current color)
Dont use slang, jargon, or hard to understand acronyms
Formatting Considerations
Use only one space between sentences.
Avoid repetitive text. The content in the tooltip should be unique and add value.
Focus on the quality and understandability of the tooltip. Is the description clear? Is it helpful?
Unless its a system variable or command, do not use bold. Although bold is supported in Asian languages, it is
strongly recommended to avoid using bold and italics, because of readability and stylistic issues.
Avoid abbreviations. For example, the word Number has many common abbreviations: No., Nbr, Num, Numb. It
is best to spell out terms.
Good Example:
An example of a more useful descriptive sentence might be Adds a file such as a .bmp or .jpg.
This provides more detailed information and gives the user more insight into the feature.
Poor Example:
In this example, the tooltip content repeats the tooltip title verbatim and does not add value to the
tooltip. Additionally, if the translator cannot identify whether this string is a name/title or a
descriptive sentence, it will be difficult for them to decide on the translation style.
As with other guideline issues, follow MICROSOFT GUIDELINES FOR TITLE AND SENTENCE CASE (listed
below):
Title Case
Capitalize all nouns, verbs (including is and other forms of to be), adverbs (including than and when), adjectives
(including this and that), and pronouns (including its)
Capitalize the first and last words, regardless of their parts of speech (for example, The Text to Look For)
Capitalize prepositions that are part of a verb phrase (for example, Backing Up Your Disk)
Do not capitalize articles (a, an, the), unless the article is the first word in the title
Do not capitalize coordinate conjunctions (and, but, for, nor, or), unless the conjunction is the first word in the title
Do not capitalize prepositions of four or fewer letters, unless the preposition is the first word in the title
Do not capitalize to in an infinitive phrase (for example, How to Format Your Hard Disk), unless the phrase is the
first word in the title
Capitalize the second word in compound words if it is a noun or proper adjective, an "e-word," or the words have
equal weight (for example, E-Commerce, Cross-Reference, Pre-Microsoft Software, Read/Write Access, Run-Time).
Do not capitalize the second word if it is another part of speech, such as a preposition or other minor word (for
example, Add-in, How-to, Take-off)
Capitalize user interface and application programming interface terms that you would not ordinarily capitalize,
unless they are case-sensitive (for example, The fdisk command)
Follow the traditional capitalization of keywords and other special terms in programming languages (for example,
The printf function, Using the EVEN and ALIGN Directives)
Capitalize only the first word of each column heading
Sentence Case
Always capitalize the first word of a new sentence
Do not capitalize the word following a colon unless the word is a proper noun, or the text following the colon is a
complete sentence
Do not capitalize the word following an em-dash unless it is a proper noun, even if the text following the dash is a
complete sentence
Always capitalize the first word of a new sentence following any end punctuation. Rewrite sentences that start
with a case-sensitive lowercase word
Common Definitions
Ribbon
The horizontally-tabbed user interface across the top of (the application frame in) Revit 2010 and
later.
Ribbon Tab
The ribbon is separated into tabs. The Add-Ins ribbon tab, which only appears when at least one
add-in is installed, is available for third party developers to add a panel.
Ribbon Panel
A ribbon tab is separated into horizontal groupings of commands. An Add-In panel represents the
commands available for a third party developers application. The Add-In panel is equivalent to the
toolbar in Revit 2009.
Ribbon Button
The button is the mechanism for launching a command. They can either be large, medium or small
(Both large and small buttons can either be a simple push button or a drop-down button.
Menu button
The default first panel on the Add-Ins tab is the External Tools panel that contains one button titled
External Tools. The External Tools menu-button is equivalent to the Tools > External Tools menu
in Revit 2009. Any External Command registered in Revit.ini under [ExternalCommands] will
appear in this menu button.
Drop-down button
A drop-down button expands to show two or more commands in a drop-down menu. Each sub-
command can have its own large icon.
Vertical Separator
A vertical separator is a thin vertical line that can be added between controls on a panel.
Tooltip
A tooltip is a small panel that appears when the user hovers the mouse pointer over a ribbon
button. Tooltips provide a brief explanation of the commands expected behavior.
Terminology Definitions
Several words are used to signify the requirements of the standards. These words are capitalized.
This section defines how these special words should be interpreted. The interpretation has been
copied from INTERNET ENGINEERING TASK FORCE RFC 2119.
WORD DEFINITION
MUST This word or the term SHALL, mean that the item is an absolute
requirement
MUST NOT This phrase, or the phrase SHALL NOT, means that the item is an
absolute prohibition
SHOULD This word, or the adjective RECOMMENDED, mean that there may
exist valid reasons in particular circumstances to ignore the item, but
the full implications must be understood and carefully weighed before
choosing a different course
SHOULD NOT This phrase, or the phrase NOT RECOMMENDED, mean that there
may exist valid reasons in particular circumstances when the particular
behavior is acceptable or even useful, but the full implications should
be understood and the case carefully weighed before implementing
any behavior described with this label
MAY This word, or the adjective OPTIONAL, means that the item is truly
optional. One product team may choose to include the item because a
particular type of user requires it or because the product team feels
that it enhances the product while another product team may omit the
same item