RevitのUniqueIdとElement Id
突然ですが、Autodesk Revitの話です。最近はRevitAPIの勉強をしています。
BIMの標準フォーマットであるIFCを扱う際によく話題になるのがGUIDです。構成要素を表す一意なIDなのですが、これとBIMツール(Revit)との関係性はどういったものだろうと調べてみたら、結構システマティックに変換されていました。ソースは以下です。
UniqueId, DWF and IFC GUID
UniqueIDを調べる
RevitLookUpといういけてるアドインを使って、Revitで要素をのぞいてみましょう。何らかの要素を選択して、アドインのリボンタブに現れたRevit Lookupを選択し、「Snoop Current Selection」のコマンドを選択すると以下のように要素の詳細を除くことができます。
Fieldに現れたIdがElement Idで、下のほうにはUniqueIdが見えます。Element Idはプロジェクトごとに作られる要素番号で、プロジェクトごとに重複がある可能性がありますが、UniqueIdは一意です。文字数が8-4-4-4-12-8となっており、最後の8文字がポイントです。上記のUniqueIdに対応するIFCのGUIDは「0bTZmmVZ5EkPWSD665dQH1」です。さて、どのようになっているのでしょうか。ちなみにDWGにもGUIDがありますが、これとIFCのGUIDは等価です。IFCは文字数制約のために、DWGのGUID(128 bit)をエンコードしているようです。
変換ルール
UniqueIdとGUIDの変換には4つのルールが用いられているようです。
- ElementがIFCのインポート後にエクスポートされた場合、元々IFC Entityに含まれていたGUIDを保持する。非常にまれなケース。
- ElementとIFC Entityの間に1対1の対応がある場合は、UniqueIdから抽出したEpisodeIdから(中間的な)GUIDを生成し、Element IdとXORすることでGUIDを作成する。
- IfcBuildingやIfcProjectなど、Revitに対応する要素がない特殊なIFC Entity、およびウィンドウやドアのインスタンスなど、要素が重複している場合は、プロジェクトのDetach GUIDを使用してGUIDを生成し、ElementIDとの排他的論理和をとることで生成する。
- 上記以外のIFC Entityについては、その場でGUIDを作成する。
分かるようなわからないような感じですね。幸運なことに、サイトにはCで書いた変換コードと、それをdllにして利用法を示したC#のVisual Studioのソリューションが置かれていました。しかしながら、記事が2009年のものなのでいかんせん古いです。Visual Studio 2017(.NET Framework 4.8)で動くように修正しておきました。Test2の中のコードを実行すると以下のような出力が得られます。わざわざコードは載せませんが、IfcGuid.dll
由来のgetString64FromGuid
などの関数を定義して、それを呼んでいるだけです。
最初の図で見せたUniqueId「25763c30-7e31-4eb9-981c-34618599c650-00046211」を変換してみましたが、想定通りGUID「0bTZmmVZ5EkPWSD665dQH1」が得られました。この辺のロジックは10年近く変わってないようですね。
変換したソリューションは以下に公開しています。
Revit_UniqueId_Converter