コレクションとイテレタ

コレクションとイテレタ

Revit プラットフォーム API では、コレクションとイテレタは汎用性がありタイプセーフです。たとえば、ElementSet は常に要素を含み、次のように使用できます。

コード領域 9-1: 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);

すべてのコレクションが IEnumerable インタフェースを実装し、関連するすべてのイテレタが IEnumerator インタフェースを実装します。結果として、すべてのメソッドとプロパティが Revit プラットフォーム API に実装され、関連するコレクションで役割を果たします。

すべてのコレクションの実装は同様の方法で行われます。次の例では ElementSet と ModelCurveArray を使用して、メイン コレクション プロパティの使用方法を説明します。

コード領域 9-2: コレクションを使用

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.");