Create and Bind Shared Parameters to "Project Information"
next previous home

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.