※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

理解する

Elementクラスのプロパティを理解する

RevitAPIを扱う際に必ず登場するのがElementクラスです。

このクラスには多くの情報が含まれており、効率的なRevitAPI開発のカギを握ります。

本記事ではElementクラスの基本から、各プロパティの活用方法までを丁寧に解説します。

RevitAPI初心者の方でも理解しやすいように、コード例も交えて説明していきます。

Elementクラスとは何か

ElementクラスはRevit内のすべての要素の基底クラスです。

壁やドア、窓などの実体もElementを継承しています。

このクラスを通じて要素の情報にアクセスできます。

以下のように要素を取得してElementとして扱います。

public Element GetElementById(Document doc, int id)
{
    ElementId elementId = new ElementId(id);
    Element element = doc.GetElement(elementId);
    return element;
}

このコードは、指定IDの要素を取得するメソッドです。

すべての要素はこのElementクラスを基にしています。

DocumentからGetElementで要素のクリック選択DocumentクラスのGetElementメソッドを使い、要素の取得方法を基礎から応用まで解説。ReferenceやPickObjectを使った操作も紹介します。...

プロパティの基本構造

Elementクラスには複数のプロパティがあります。

これらは要素の情報を取得するのに使います。

代表的なプロパティはId、Name、Category、Parametersなどです。

いずれも読み取り専用か、編集可能な場合があります。

IdとUniqueIdの違い

Idプロパティは数値型でプロジェクト内の要素を識別します。

一方、UniqueIdは文字列型でグローバルに一意なIDです。

Revitのセッションをまたいでも識別できます。

以下に両者を取得する例を示します。

public void ShowElementIds(Element element)
{
    TaskDialog.Show("ID情報",
        "Id: " + element.Id.IntegerValue +
        "\nUniqueId: " + element.UniqueId);
}

Idは変更される可能性がありますが、UniqueIdは不変です。

データ連携などではUniqueIdの使用が推奨されます。

Categoryとその役割

Categoryプロパティは要素が属するカテゴリを表します。

「壁」「ドア」「家具」などがCategoryに該当します。

以下のコードは要素のカテゴリ名を取得します。

public string GetCategoryName(Element element)
{
    Category category = element.Category;
    return category != null ? category.Name : "カテゴリなし";
}

カテゴリはフィルタリングや分類に役立ちます。

Nameプロパティの活用法

Nameプロパティは要素の名称を取得するのに使います。

ただし、すべての要素で値が入っているわけではありません。

次のコードはNameを取得するシンプルな例です。

public string GetElementName(Element element)
{
    return element.Name;
}

 

Parametersの取得方法

Parametersは要素が持つ詳細情報の集合です。

長さや高さ、材料などもParametersに含まれます。

すべてのパラメータを取得して一覧表示する例です。

public void ShowAllParameters(Element element)
{
    string result = "";
    foreach (Parameter param in element.Parameters)
    {
        result += param.Definition.Name + ": " + GetParameterValue(param) + "\n";
    }
    TaskDialog.Show("パラメータ一覧", result);
}

private string GetParameterValue(Parameter param)
{
    switch (param.StorageType)
    {
        case StorageType.Double:
            return param.AsValueString();
        case StorageType.Integer:
            return param.AsInteger().ToString();
        case StorageType.String:
            return param.AsString();
        case StorageType.ElementId:
            return param.AsElementId().IntegerValue.ToString();
        default:
            return "不明";
    }
}

このように、パラメータの取得にはStorageTypeの確認が必要です。

プロパティの編集可否

プロパティの中には書き換え可能なものもあります。

たとえば、パラメータの値は変更できます。

次の例では指定パラメータの値を設定します。

public void SetParameterValue(Element element, string paramName, string newValue)
{
    foreach (Parameter param in element.Parameters)
    {
        if (param.Definition.Name == paramName && !param.IsReadOnly)
        {
            param.Set(newValue);
            break;
        }
    }
}

読み取り専用プロパティは変更できないため注意が必要です。

プロパティの活用例

プロパティを活用することで、要素の自動チェックやレポート作成が可能です。

以下はカテゴリごとの要素名を一覧化する例です。

public void Sample()
{
    Autodesk.Revit.UI.UIDocument uidoc = this.ActiveUIDocument;
    Autodesk.Revit.DB.Document doc = uidoc.Document;

    FilteredElementCollector collector = new FilteredElementCollector(doc);
    IList<Element> elements = collector.WhereElementIsNotElementType().ToElements();

    Dictionary<string, List<string>> categoryMap = new Dictionary<string, List<string>>();

    foreach (Element element in elements)
    {
      if (element.Category != null)
      {
        string category = element.Category.Name;
        string name = element.Name;

        if (!categoryMap.ContainsKey(category))
        {
          categoryMap[category] = new List<string>();
        }
        categoryMap[category].Add(name);
      }
    }

    string result = "";
    foreach (var pair in categoryMap)
    {
      result += "[" + pair.Key + "]\n";
      foreach (string name in pair.Value)
      {
        result += " - " + name + "\n";
      }
    }

    TaskDialog.Show("カテゴリ別要素一覧", result);
}
※上記コードをThisApplication.csにコピペでそのまま使えます。

 

このようにプロパティを組み合わせることで、多様な処理が可能になります。

注意すべきプロパティ項目

一部のプロパティは、条件によって取得できないことがあります。

たとえば、nullのCategoryや空文字のNameなどです。

コード中でのnullチェックを忘れずに行いましょう。

if (element.Category != null)
{
    string categoryName = element.Category.Name;
}

また、パラメータの存在確認も重要です。

Parameter param = element.LookupParameter("高さ");
if (param != null)
{
    string height = param.AsValueString();
}

これにより、予期せぬエラーを防ぐことができます。

まとめと今後の応用

ElementクラスはRevitAPIの中心的な存在です。

基本的なプロパティの理解はAPI開発の第一歩となります。

本記事で紹介した内容を踏まえて、さらに応用的な開発に挑戦してみましょう!

RevitAPI独学用教材

最後に教材等を紹介します。

RevitAPIを理解してプログラムを作れるようになるには、C#の知識が必要です。

下記、オススメの参考書です。

プログラムが初心者にオススメのC#教材

イラストでの解説が分かりやすく、初めてのプログラミング学習にピッタリです。

プログラムの基礎知識がある人にオススメのC#教材

少し踏み込んだ内容まで学習でき、C#の知識が深まります。

美しいコードを書きたい人はこちら

個人的には、プログラマーひとり一冊は持っておくべきと思っている名作です^^
スポンサーリンク



Revitアドイン作ります

のんびり学習してる余裕などない!という方にご案内です。

ランサーズにてRevitのアドイン作成を承っております!

スキル、資格等の詳細はプロフィールをご覧ください。

ご質問などもお気軽にメッセージしていただければと思います。

詳しくは下の記事にまとめています。

【開発依頼】あなただけのRevitアドインを真心込めて作ります!RevitAPIを使ったアドイン開発を承ります。1から学習してアドイン作る余裕がない、外注でアドイン作成を依頼したい、という方はご利用をご検討いただければと思います^^...

最後まで読んでいただき、ありがとうございました^^

以上です。