Add three name string variables to LabConstants class for later use, including one group name and two shared Parameter names
// Lab 4_4
public const string sParamGroupName = "Per-doc Params";
public const string sParamNameVisible = "Visible per-doc Integer";
public const string sParamNameInvisible = "Invisible per-doc Integer";
' Lab 4_4
Public Const sParamGroupName As String = "Per-doc Params"
Public Const sParamNameVisible As String = "Visible per-doc Integer"
Public Const sParamNameInvisible As String = "Invisible per-doc Integer"
First create a shared parameter group and two definitions of type Integer. All you need are three existing utilities from LabUtils:
#region Lab4_4_1_CreatePerDocParameters
/// <summary>
/// Command to add and bind a visible and an invisible per-doc parameter.
/// </summary>
public class Lab4_4_1_PerDocParams : IExternalCommand
{
public IExternalCommand.Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements )
{
Application app = commandData.Application;
// Get the current Shared Params Definition File
DefinitionFile sharedParamsFile = LabUtils.GetSharedParamsFile( app );
if( null == sharedParamsFile )
{
LabUtils.ErrorMsg( "Error getting the shared params file." );
return IExternalCommand.Result.Failed;
}
// Get or Create the Shared Params Group
DefinitionGroup sharedParamsGroup = LabUtils.GetOrCreateSharedParamsGroup(
sharedParamsFile, LabConstants.sParamGroupName );
if( null == sharedParamsGroup )
{
LabUtils.ErrorMsg( "Error getting the shared params group." );
return IExternalCommand.Result.Failed;
}
//To do: Create the visible and invisible parameter definition
//To do: Bind the parameter defition to element
//to do: set value to per doc shared parameters
return IExternalCommand.Result.Succeeded;
}
}
#endregion // Lab4_4_1_CreatePerDocParameters
#Region "Lab4_4_1_CreatePerDocParameters"
''' <summary>
''' Command to add and bind a visible and an invisible per-doc parameter.
''' </summary>
''' <remarks></remarks>
Public Class Lab4_4_1_PerDocParams
Implements IExternalCommand
Public Function Execute( _
ByVal commandData As ExternalCommandData, _
ByRef message As String, _
ByVal elements As ElementSet) _
As IExternalCommand.Result Implements IExternalCommand.Execute
Implements Autodesk.Revit.IExternalCommand.Execute
Dim app As Revit.Application = commandData.Application
Dim doc As Revit.Document = app.ActiveDocument
' Get or create relevant shared params stuff:
Dim sharedParamsFile As DefinitionFile = LabUtils.GetSharedParamsFile(app)
If (sharedParamsFile Is Nothing) Then
MsgBox("Error in getting the Shared Params File?")
Return IExternalCommand.Result.Failed
End If
Dim sharedParamsGroup As Parameters.DefinitionGroup
sharedParamsGroup = LabUtils.GetOrCreateSharedParamsGroup( _
sharedParamsFile, LabConstants.sParamGroupName)
If (sharedParamsGroup Is Nothing) Then
MsgBox("Error in getting the Shared Params Group?")
Return IExternalCommand.Result.Failed
End If
'To do: Create the visible and invisible parameter definition
'To do: Bind the parameter defition to element
'To do: set value to per doc shared parameters
Return IExternalCommand.Result.Succeeded
End Function
End Class
#End Region
When calling the last method, make one parameter visible and the other invisible.
// Visible param
Definition docParamDefVisible = LabUtils.GetOrCreateSharedParamsDefinition(
sharedParamsGroup, ParameterType.Integer, LabConstants.sParamNameVisible, true );
if( null == docParamDefVisible )
{
LabUtils.ErrorMsg( "Error creating visible per-doc parameter." );
return IExternalCommand.Result.Failed;
}
// INVisible param
Definition docParamDefInvisible = LabUtils.GetOrCreateSharedParamsDefinition(
sharedParamsGroup, ParameterType.Integer, LabConstants.sParamNameInvisible, false );
if( null == docParamDefInvisible )
{
LabUtils.ErrorMsg( "Error creating invisible per-doc parameter." );
return IExternalCommand.Result.Failed;
}
' Visible param
Dim docParamDefVisible As Parameters.Definition = LabUtils.GetOrCreateSharedParamsDefinition( _
sharedParamsGroup, ParameterType.Integer, LabConstants.sParamNameVisible, True)
If (docParamDefVisible Is Nothing) Then
MsgBox("Error in creating visible per-doc parameter?")
Return IExternalCommand.Result.Failed
End If
'INVisible param
Dim docParamDefInvisible As Parameters.Definition = LabUtils.GetOrCreateSharedParamsDefinition( _
sharedParamsGroup, ParameterType.Integer, LabConstants.sParamNameInvisible, False)
If (docParamDefInvisible Is Nothing) Then
MsgBox("Error in creating invisible per-doc parameter?")
Return IExternalCommand.Result.Failed
End If
Bind these new parameters to the 'Project Information' category
BuiltInCategory.OST_ProjectInformation in the current model
(cf. similar code in Lab 4.3.1).
// Bind the Param
try
{
Document doc = app.ActiveDocument;
CategorySet catSet = app.Create.NewCategorySet();
catSet.Insert( doc.Settings.Categories.get_Item( BuiltInCategory.OST_ProjectInformation ) );
Binding binding = app.Create.NewInstanceBinding( catSet );
doc.ParameterBindings.Insert( docParamDefVisible, binding );
doc.ParameterBindings.Insert( docParamDefInvisible, binding );
}
catch( System.Exception e )
{
LabUtils.ErrorMsg( "Error binding shared parameter: " + e.Message );
return IExternalCommand.Result.Failed;
}
' Bind the params
Try
Dim catSet As CategorySet = app.Create.NewCategorySet()
catSet.Insert(app.ActiveDocument.Settings.Categories.Item( _
BuiltInCategory.OST_ProjectInformation))
Dim binding As Parameters.Binding = app.Create.NewInstanceBinding(catSet)
app.ActiveDocument.ParameterBindings.Insert(docParamDefVisible, binding)
app.ActiveDocument.ParameterBindings.Insert(docParamDefInvisible, binding)
Catch e As Exception
MsgBox("Error in binding shared parameter: " & e.Message)
Return IExternalCommand.Result.Failed
End Try
Create a re-usable utility in LabUtils which will return the singleton element instance of 'Project Information' category.
/// <summary>
/// Return the one and only project information element using Revit 2009 filtering
/// by searching for the "Project Information" category. Only one such element exists.
/// </summary>
public static Element GetProjectInfoElem( Application app )
{
Dim filterCategory As Filter = app.Create.Filter.NewCategoryFilter( _
BuiltInCategory.OST_ProjectInformation)
ElementIterator i = app.ActiveDocument.get_Elements( filterCategory );
i.MoveNext();
Element e = i.Current as Element;
Debug.Assert( null != e, "expected valid project information element" );
Debug.Assert( !i.MoveNext(), "expected one single element to be returned" );
return e;
}
''' <summary>
''' Return the one and only project information element using Revit 2009 filtering
''' by searching for the "Project Information" category. Only one such element exists.
''' </summary>
Public Shared Function GetProjectInfoElem( _
ByVal doc As Revit.Document, _
ByRef app As Revit.Application) As Revit.Element
Dim filterCategory As Filter = app.Create.Filter.NewCategoryFilter( _
BuiltInCategory.OST_ProjectInformation)
Dim elements As New List(Of Element)
'it should return only one element in the collection.
Dim nRetVal As Integer
nRetVal = doc.Elements(filterCategory, elements)
' Loop all elements
Dim elem As Revit.Element
For Each elem In elements
' Return the first match (it's a singleton!)
If (Not (elem Is Nothing)) Then
Return elem
End If
Next
Return Nothing
End Function
Use the above utility to retrieve the 'ProjectInfo' element, and set the value for the new shared parameter value.
// Set the initial values
// Get the singleton Project Info Element
Element projInfoElem = LabUtils.GetProjectInfoElem( app );
if( null == projInfoElem )
{
LabUtils.ErrorMsg( "No project info elem found. Aborting command..." );
return IExternalCommand.Result.Failed;
}
// For simplicity, access params by name rather than by GUID:
projInfoElem.get_Parameter( LabConstants.sParamNameVisible ).Set( 55 );
projInfoElem.get_Parameter( LabConstants.sParamNameInvisible ).Set( 0 );
' Set the initial values
'-----------------------
' Get the singleton Project Info Element
Dim projInfoElem As Revit.Element = LabUtils.GetProjectInfoElem(doc, app)
If projInfoElem Is Nothing Then
MsgBox("NO project Info Elem found !? Aborting command...")
Return IExternalCommand.Result.Failed
End If
' For simplicity, access params by name rather than by GUID:
projInfoElem.Parameter(LabConstants.sParamNameVisible).Set(55)
projInfoElem.Parameter(LabConstants.sParamNameInvisible).Set(0)
next
previous
home
copyright © 2007-2009 jeremy tammik, autodesk inc. all rights reserved.