In this lab, we shall change the tiling pattern on the divided surface created using
Lab 7-2
using the built-in enumeration available with the API.
The output should be similar to the
image included below.
Similar to the previous lab, we shall create a new filter ? a type filter, to extract all the elements
from the Revit model which are of Form type.
This can be done using the Filter.NewTypeFilter
.
# region Lab7_3_ChangeTilePattern /// <summary> /// Change the tiling pattern of the divided surface using the built-in TilePattern enumeration. /// </summary> public class Lab7_3_ChangeTilePattern : IExternalCommand { public IExternalCommand.Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { Application app = commandData.Application; Document doc = app.ActiveDocument; try { // find forms in the model by filter: Filter filterForm = app.Create.Filter.NewTypeFilter(typeof(Form)); List<Autodesk.Revit.Element> forms = new List<Autodesk.Revit.Element>(); doc.get_Elements(filterForm, forms); foreach (Form form in forms) { . . . } } catch { return IExternalCommand.Result.Failed; } return IExternalCommand.Result.Succeeded; } } #endregion
#Region "Lab7_3_ChangeTilePattern" Public Class Lab7_3_ChangeTilePattern Implements IExternalCommand Public Function Execute( _ ByVal commandData As ExternalCommandData, _ ByRef message As String, _ ByVal elements As ElementSet) _ As IExternalCommand.Result _ Implements IExternalCommand.Execute Dim app As Application = commandData.Application Dim doc As Document = app.ActiveDocument Try ' find forms in the model by filter: Dim filterForm As Filter = app.Create.Filter.NewTypeFilter(GetType(Form)) Dim forms As New List(Of Autodesk.Revit.Element)() Dim iForms As Integer = doc.Elements(filterForm, forms) For Each form As Form In forms . . . Next Catch Return IExternalCommand.Result.Failed End Try Return IExternalCommand.Result.Succeeded End Function End Class #End Region
Now with each form, we shall get access to the DividedSurfaceData
using
the form.GetDividedSurfaceData
method. This divided surface data contains a
list of references which can be extracted using the GetReferencesWithDividedSurfaces()
method on the divided surface data. Using the built-in enumeration of tile patterns
stored in document.Settings
, we shall use the ObjectType
property on the divided
surface element to set it to one of the tile patterns available in the built-in
enumeration. Say, we set the third pattern in the enumeration to the divided surface
element.
// Get access to the divided surface data from the form DividedSurfaceData dsData = form.GetDividedSurfaceData(); if (null != dsData) { // get the references associated with the divided surfaces foreach (Reference reference in dsData.GetReferencesWithDividedSurfaces()) { DividedSurface divSurface = dsData.GetDividedSurfaceForReference(reference); int count = 0; TilePatterns tilepatterns = doc.Settings.TilePatterns; foreach (TilePatternsBuiltIn TilePatternEnum in Enum.GetValues(typeof(TilePatternsBuiltIn))) { if (count.Equals(3)) { divSurface.ObjectType = tilepatterns.GetTilePattern(TilePatternEnum); break; } count = count + 1; } } }
' Get access to the divided surface data from the form Dim dsData As DividedSurfaceData = form.GetDividedSurfaceData() If dsData IsNot Nothing Then ' get the references associated with the divided surfaces For Each reference As Reference In dsData.GetReferencesWithDividedSurfaces() Dim divSurface As DividedSurface = dsData.GetDividedSurfaceForReference(reference) Dim count As Integer = 0 Dim tilepatterns As TilePatterns = doc.Settings.TilePatterns For Each TilePatternEnum As TilePatternsBuiltIn In [Enum].GetValues(GetType(TilePatternsBuiltIn)) If count.Equals(3) Then divSurface.ObjectType = tilepatterns.GetTilePattern(TilePatternEnum) Exit For End If count = count + 1 Next Next End If
Compile the code, update Revit.ini and test the command. Examine the outcome.
next previous home copyright © 2007-2009 jeremy tammik, autodesk inc. all rights reserved.