Collections and Iterators

Collections and Iterators

In the Revit Platform API, Collections and Iterators are generic and type safe. For example, ElementSet always contains Element and can be used as follows:

Code Region 9-1: Using ElementSet

UIDocument uidoc = new UIDocument(document);  
ElementSet elems = uidoc.Selection.Elements;

string info = "Selected elements:\n";
foreach (Autodesk.Revit.DB.Element elem in elems)
{
        info += elem.Name + "\n";
}

TaskDialog.Show("Revit",info);
 
info = "Levels in document:\n";

FilteredElementCollector collector = new FilteredElementCollector(document);
ICollection<Element> collection = collector.OfClass(typeof(BoundaryConditions)).ToElements();
foreach (Element elem in collection)
{
        // you need not check null for elem
        info += elem.Name + "\n";
}

TaskDialog.Show("Revit",info);

All collections implement the IEnumerable interface and all relevant iterators implement the IEnumerator interface. As a result, all methods and properties are implemented in the Revit Platform API and can play a role in the relevant collections.

Implementing all of the collections is similar. The following example uses ElementSet and ModelCurveArray to demonstrate how to use the main collection properties:

Code Region 9-2: Using collections

UIDocument uidoc = new UIDocument(document);
SelElementSet selection = uidoc.Selection.Elements;
// Store the ModelLine references
ModelCurveArray lineArray = new ModelCurveArray();
           
// … Store operation
Autodesk.Revit.DB.ElementId id = new Autodesk.Revit.DB.ElementId(131943); //assume 131943 is a model line element id
lineArray.Append(document.GetElement(id) as ModelLine);

// use Size property of Array
TaskDialog.Show("Revit","Before Insert: " + lineArray.Size + " in lineArray.");

// use IsEmpty property of Array
if (!lineArray.IsEmpty)
{
    // use Item(int) property of Array
    ModelCurve modelCurve = lineArray.get_Item(0) as ModelCurve;

    // erase the specific element from the set of elements
    selection.Erase(modelCurve);

    // create a new model line and insert to array of model line
    SketchPlane sketchPlane = modelCurve.SketchPlane;

    XYZ startPoint = new XYZ(0, 0, 0);  // the start point of the line
    XYZ endPoint = new XYZ(10, 10, 0);  // the end point of the line
    // create geometry line
    Line geometryLine = Line.CreateBound(startPoint, endPoint);

    // create the ModelLine
    ModelLine line = 
        document.Create.NewModelCurve(geometryLine, sketchPlane) as ModelLine;

    lineArray.Insert(line, lineArray.Size - 1);
}

TaskDialog.Show("Revit","After Insert: " + lineArray.Size + " in lineArray.");

// use the Clear() method to remove all elements in lineArray
lineArray.Clear();

TaskDialog.Show("Revit","After Clear: " + lineArray.Size + " in lineArray.");