Create Divided Surface
next previous home

In this lab, we shall create a divided surface on top of the form we created in the lab 7-1 as shown in the image below -

Divided Surface

For this lab, we shall use the Category filter to extract all the mass elements which belong to category OST_MassSurface.

  # region Lab7_2_CreateDividedSurface
  /// <summary>
  /// Create a divided surface using reference of a face of the form.
  /// </summary>
  public class Lab7_2_CreateDividedSurface : 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.NewCategoryFilter(BuiltInCategory.OST_MassSurface);
        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_2_CreateDividedSurface"
    Public Class Lab7_2_CreateDividedSurface
        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.NewCategoryFilter(BuiltInCategory.OST_MassSurface)
                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

With each of the forms in the model, we shall get access to the geometry element of each form which is a collection of Geometry Objects stored in an array GeometryObjectArray. With each of the geometry object, working with only the ones that are solids, we shall work with each face on the solid and create a divided surface on the face(s) using the NewDividedSurface method on the FamilyItemFactory instance.

  // Now, lets create the Divided surface on the loft form
  Autodesk.Revit.Creation.FamilyItemFactory fac = doc.FamilyCreate;
  Options options = app.Create.NewGeometryOptions();
  options.ComputeReferences = true;
  options.View = doc.ActiveView;
  Autodesk.Revit.Geometry.Element element = form.get_Geometry(options);

  GeometryObjectArray geoObjectArray = element.Objects;
  //enum the geometry element
  for (int j = 0; j < geoObjectArray.Size; j++)
  {
    GeometryObject geoObject = geoObjectArray.get_Item(j);
    Solid solid = geoObject as Solid;
    foreach (Face face in solid.Faces)
    {
      if (face.Reference != null)
      {
        if (null != face)
        {
          DividedSurface divSurface = fac.NewDividedSurface(face.Reference);
        }
      }
    }
  }
    ' Now, lets create the Divided surface on the loft form
    Dim fac As Autodesk.Revit.Creation.FamilyItemFactory = doc.FamilyCreate
    Dim options As Autodesk.Revit.Geometry.Options = app.Create.NewGeometryOptions()
    options.ComputeReferences = True
    options.View = doc.ActiveView
    Dim element As Autodesk.Revit.Geometry.Element = form.Geometry(options)

    Dim geoObjectArray As GeometryObjectArray = element.Objects
    'enum the geometry element
    For j As Integer = 0 To geoObjectArray.Size - 1
        Dim geoObject As GeometryObject = geoObjectArray.Item(j)
        Dim solid As Solid = TryCast(geoObject, Solid)
        For Each face As Autodesk.Revit.Geometry.Face In solid.Faces
            If face.Reference IsNot Nothing Then
                If face IsNot Nothing Then
                    Dim divSurface As DividedSurface = fac.NewDividedSurface(face.Reference)
                End If
            End If
         Next
    Next

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.