This post will touch on how to solve a common problem where designers want to see how a room looks in full 3D while in the programming (Room and Area Programming) stages to help figure out the relationships from one room to others. This is difficult to do with traditional rooms that Revit creates, mainly because they aren't real physical objects (and you cannot see the damn things in 3D).
Here is what my test model looks like with five simple rooms placed in. One surrounded entirely by room separation lines, one with curved walls, and some others for verification and proof that the tool will actually work in most conditions.
Create a new .NET 3.5 class project in Visual Studio 2010. You'll need to build in the Command class on your own this time... Add a form object and name it Form_Main. Add the following referenced to your project and import their name spaces as shown below:
Imports System Imports System.Collections.Generic Imports System.Diagnostics Imports Autodesk.Revit.DB Imports Autodesk.Revit.UI Imports Autodesk.Revit.ApplicationServices Imports Autodesk.Revit.Creation
Add two buttons to your form named "ButtonGenerateMasses" and "ButtonCancel"... their suggested placements are shown here:
Now we need to focus on what all variables we need to expose to our form class and how they will be used. Add the following private variables to this form class just beneath the class declaration:
Private m_CmdData As ExternalCommandData Private m_Doc As Autodesk.Revit.DB.Document Private m_FamDoc As Autodesk.Revit.DB.Document Private m_App As Autodesk.Revit.ApplicationServices.Application Private m_SECategory As Category Private m_AppCreate As Autodesk.Revit.Creation.Application
As you can see in the listing above, our variable requirements are actually quite simple. We're mainly concerned with document and application objects that are required to generate families in Revit.
The next item we'll code in is the base class constructor. Now keep in mind that one argument is required to generate an instance of this class, IExternalCommand. This argument is the same as the one required in the IExternalCommand's Execute function. The Constructor is shown here:
''' <summary> ''' General Class Constructor ''' </summary> ''' <param name="settings"></param> ''' <remarks></remarks> Public Sub New(ByVal settings As ExternalCommandData) ' Always call this when using a constructor for a form object InitializeComponent() ' Settings reference to UI and DB objects m_CmdData = settings ' Application and Document References m_App = m_CmdData.Application.Application m_Doc = m_CmdData.Application.ActiveUIDocument.Document ' Mass Category m_SECategory = m_Doc.Settings.Categories.Item(BuiltInCategory.OST_SpecialityEquipment) ' App creator m_AppCreate = m_App.Create ' Set the form title Me.Text = "Rooms to Masses""" End Sub
Now that we have all of the main framework ready to go, we can dig down into how the families are built using data from the room elements in the model. Create a new subroutine named GenerateMasses. This subroutine is where all the magic happens.
''' <summary> ''' Generate 3D Specialty Equipment Extrusions for Rooms ''' Specialty Equipment is Scheduleable ''' </summary> ''' <remarks></remarks> Private Sub GenerateMasses() End Sub
Before we get back into filling in the functionality in this subroutine, let's get the button assignments in our form out of the way. Double click each of the buttons in the form designer to autogenerate their click event functions and add the following very simple code to these functions:
''' <summary> ''' Close the App ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub ButtonCancel_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ButtonCancel.Click Me.Close() End Sub ''' <summary> ''' Launch GenerateMasses ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub ButtonGenerateMasses_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles ButtonGenerateMasses.Click GenerateMasses() End Sub
Now let's focus the rest of this post on what's missing!.... haha I know, you'll have to wait until tomorrow to see the ending. So stay tuned and come back tomorrow for the meat of this idea finalized into true usable code! Tomorrow's post will be on the completion of the GenerateMasses subroutine.