13.

Revit API の ElementId と UniqueId の違い完全ガイド — IFC / 外部 DB 連携の正解

編集
この記事の要点
  • ElementId = プロジェクト内で一意の整数 IDElement.Id)。新規作成順に採番、削除すると欠番
  • UniqueId = プロジェクトを跨いでも一意のGUID 文字列Element.UniqueId)。ワークシェア対応
  • ファイル内で一時的に使うなら ElementId、外部 DB と紐付けするなら必ず UniqueId
  • IFC エクスポートでは UniqueId が IfcGloballyUniqueId に変換される(ただし IFC GUID 形式に再エンコード)
  • doc.GetElement(new ElementId(123456)) / doc.GetElement("abc-def-123") の使い分け

Revit の 2 種類の ID

Revit API で要素を識別する ID にはElementIdUniqueId の 2 種類があります。両者の特性を理解しないと、外部 DB との連携や IFC エクスポートで思わぬ事故が起きます。

ElementId とは

Element.Id プロパティで取得できる、整数値の ID です:

Element wall = doc.GetElement(new ElementId(425398));
ElementId id = wall.Id;
int intId = id.IntegerValue;  // 425398
Console.WriteLine(intId);

// 全要素の Id を列挙
var collector = new FilteredElementCollector(doc)
    .OfCategory(BuiltInCategory.OST_Walls)
    .WhereElementIsNotElementType();

foreach (Element e in collector)
{
    Console.WriteLine($"{e.Name}: {e.Id.IntegerValue}");
}

特性:

  • プロジェクト内で一意
  • 新規作成時に連番で採番(ただし保証はされない)
  • 要素を削除すると ID は欠番(再利用されない)
  • 別ファイルにコピーすると別の ID になる
  • パフォーマンスが良い(int 比較)

UniqueId とは

Element.UniqueId プロパティで取得できる、GUID 文字列です:

Element wall = doc.GetElement("a8c7d3f2-1b4e-4f8a-9c2d-1e3f5a7b9c0d-00067bf6");
string uid = wall.UniqueId;
Console.WriteLine(uid);
// 例: a8c7d3f2-1b4e-4f8a-9c2d-1e3f5a7b9c0d-00067bf6

// UniqueId から要素取得
Element e = doc.GetElement(uid);
if (e != null)
{
    Console.WriteLine($"Found: {e.Name}");
}

特性:

  • プロジェクトを跨いでも一意(GUID + Element ID の 8 桁ハッシュ)
  • ワークシェアリングで複数人が同時編集しても衝突しない
  • 要素を別ファイルにコピーしてもUniqueId は維持(Copy/Paste 時)
  • 形式: GUID-XXXXXXXX(45 文字)
  • 外部 DB との紐付けに最適

2 つの ID の比較表

項目ElementIdUniqueId
ElementId(int ラッパ)string(GUID 形式)
長さ整数(〜10 桁)45 文字
一意性スコーププロジェクト内グローバル
削除後の再利用なし(欠番のまま)なし
ファイル跨ぎ変わる維持
ワークシェア対応競合可能性競合なし
性能速いやや遅い(文字列比較)
用途一時的なコレクション処理外部 DB、IFC、ファイル間連携

使い分けの指針

ElementId を使う場合

// 1. トランザクション内で要素間の関係を一時保存
var wallIds = new List();
foreach (Wall w in walls) wallIds.Add(w.Id);

// 2. Selection API
uidoc.Selection.SetElementIds(wallIds);

// 3. パラメータの参照(型 ID 等)
ElementId typeId = wall.GetTypeId();
WallType wt = doc.GetElement(typeId) as WallType;

UniqueId を使う場合

// 1. 外部 DB に保存
var record = new {
    BimId = wall.UniqueId,         // ★ UniqueId を保存
    Material = wall.WallType.Name,
    Length = wall.LookupParameter("Length").AsDouble()
};
db.Walls.Insert(record);

// 2. IFC エクスポート時のマッピング
foreach (Element e in elements)
{
    map[e.UniqueId] = ConvertToIfcGuid(e.UniqueId);
}

// 3. 別ファイルとの紐付け(リンク Revit モデル)
RevitLinkInstance link = ...;
Document linkedDoc = link.GetLinkDocument();
Element linkedElement = linkedDoc.GetElement(savedUniqueId);

IFC エクスポートでの扱い

IFC では各要素に IfcGloballyUniqueId(GlobalId)が必須です。Revit は UniqueId を IFC GUID 形式(22 文字 Base64)に再エンコードします:

// Revit API で IFC GUID を取得
string ifcGuid = IfcGuid.ToIfcGuid(new Guid(wall.UniqueId.Substring(0, 36)));
Console.WriteLine(ifcGuid);
// 例: 1Yf$Hxk1bAlujM5dHFJv1c

// 逆変換
Guid revitGuid = IfcGuid.FromIfcGuid("1Yf$Hxk1bAlujM5dHFJv1c");

変換は不可逆ではないため、IFC ファイル → Revit プロジェクトのマッピングが可能です。

よくある落とし穴

  • 外部 DB に ElementId を保存してはダメ — ファイルバックアップやプロジェクト分割で別ファイルになると一致しなくなる
  • Copy/Paste で UniqueId が変わるケース — 別プロジェクトへの貼り付け時は新規 UniqueId(GUID 部分の末尾だけ変わる挙動もある)
  • ワークシェアリング環境ではローカルキャッシュの ElementId が一致しないことがある → UniqueId 必須
  • Family 内の要素もそれぞれ UniqueId を持つ(ファミリエディタで編集可)

FAQ

Q: UniqueId はいつ採番される?
A: 要素を作成した瞬間です。トランザクションコミット前でも取得可能ですが、Undo されると失われます。

Q: ElementId を文字列にして DB に保存していい?
A: 同一ファイル内の用途なら OK ですが、別ファイル / バックアップ復元時に一致しなくなるのでUniqueId が安全です。

Q: 削除した要素の ID は復活する?
A: しません。ElementId・UniqueId とも欠番のままです。誤って削除したら Undo で戻すしかありません。

Q: 別 Revit インスタンス間で要素を識別したい
A: UniqueId が唯一の確実な方法です。ファイルパス + UniqueId で完全に特定できます。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. RevitAPI.dll と RevitAPIUI.dll の参照
  2. マニフェストファイルの書き方
  3. アドインの追加/設置方法
  4. アドインの作成サンプル(外部ツール編)
  5. アドインの作成サンプル(外部アプリケーション編)
  6. 要素の取得と情報の表示
  7. 要素のカテゴリとマテリアルの取得と表示
  8. よく使うBuiltInCategoryの一覧
  9. 外部ツールでAutodesk.Revit.Documentを取得する方法
  10. エラーメッセージの設定方法
  11. 「はい」、「いいえ」、「キャンセル」ボタンの設置と処理分岐
  12. 要素(カテゴリ、ファミリ、タイプ)とは
  13. ElementIdとUniqueIdの違い
  14. 要素フィルターの使い方
  15. 要素のパラメータ一覧の取得
  16. pyRevitの導入と簡単なアプリケーションの作成
  17. Revit SDKのサンプルの場所とビルド方法
  18. FamilySymbol(タイプ)の取得とパラメータの変更
  19. 相対パスでdllにアイコン画像を埋め込む方法
  20. 「グループ」について