Model Derivative API – BIM 360 上の Revit モデルからメタデータを一括取得する方法とそのデータ構造

Autodesk University 2020 にて配信致しました Forge 日本語ライトニングトーク「BIM 360 プロジェクトとアカウントのディープファイル横断検索」の中で、Revit モデルのメタデータを一括取得する方法について解説致しましたが、その際、プロパティの値の形式についてご質問がございました。

そこで今回は、その回答も含めて、元のブログ記事をベースに、BIM 360 に保存されている Revit モデルからメタデータを一括取得する方法とそのデータ構造について解説致します。

Model Derivative API を通じてメタデータを取得する方法は、こちらの記事で既にご紹介しております通り、Forge Viewer を使用することなく、Revit モデルからメタデータ、つまり要素のプロパティの情報にアクセスすることができます。

ただし用途によっては、プロパティを随時検索するのではなく、予め一括でメタデータを取得したいという場合がございます。

これを実現する方法としては、3つのオプションがあります。

オプション1 : HTTP エンドポイント

まず1つ目は、SVF ファイルからプロパティの情報を JSON 文字列として一括取得する方法です。

Metadata_02

このエンドポイントに対して、HTTP リクエストを送る際、クエリパラメータに [objectid] を指定しなければ、そのモデルに保持されている全ての要素のプロパティを一括して JSON データとして取得することができます。

ただし、JSON データが 20 MB 以上になる場合は、クエリパラメータに [forceget=true] を指定する必要があります。
正常にダウンロードが完了すると、次のような形式でプロパティのデータを取得することができます。
寸法の値には、数値の文字列に加えて、単位の形式を示す文字列が含まれています。

Metadata_01

なお、BIM 360 上の Revit モデルを URN に指定する際は、Data Management API を通じて、BIM 360 上の Revit モデルの Version Id を取得しますが、これを Base64 (URL Safe) エンコードに変換する際には、注意が必要です。

例えば、次のような Version Id が取得できた場合、この文字列をそのまま Base64 (URL Safe) エンコードすると、「?」が「/」に置き換わりますが、この値でエンドポイントにリクエストしてもエラーになります。

Version Id : urn:adsk.wipprod:fs.file:vf.GT7D9cshRGS7GsP1YBQNVQ?version=2

Base64 エンコード(誤): dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkdUN0Q5Y3NoUkdTN0dzUDFZQlFOVlE/dmVyc2lvbj0y

正しい URN は、「?」で Split して、それぞれを「 _ 」で連結した結果の文字列になります。

Base64 エンコード(正): dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkdUN0Q5Y3NoUkdTN0dzUDFZQlFOVlE_dmVyc2lvbj0y

オプション2 : SQLite データベース

2つ目の方法は、SQLite データベースのファイルを取得する方法です。

Model Derivative サービスは、すべてのプロパティの情報を SQLite ファイルに保存しております。
Revit モデルのマニフェストを取得し、その結果の JSON データから mime タイプが application/autodesk-db に、role が Autodesk.CloudPlatform.PropertyDatabase に設定さ れている model.sdb ファイルがこれに該当します。

Metadata_05

例えば、オプション 1 の Revit モデルのマニフェストを取得すると、該当の URN は次のようになります。

"urn:adsk.viewing:fs.file:dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkdUN0Q5Y3NoUkdTN0dzUDFZQlFOVlE_dmVyc2lvbj0y/output/Resource/model.sdb"

この URN 文字列を下記のように URL エンコードして、リクエストするエンドポイントの[derivativeurn]に指定します。

urn%3Aadsk.viewing%3Afs.file%3AdXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkdUN0Q5Y3NoUkdTN0dzUDFZQlFOVlE_dmVyc2lvbj0y%2Foutput%2FResource%2Fmodel.sdb

model.sdb ファイルは、SQLite のデータベースブラウザなどで開いて確認することができます。
DB Browser for SQLite で開くと、4つのテーブルから構成されるデータベースになっていることがわかります。
テーブルのスキーマは次の通りです。

Metadata_03

このツールでは、開いているデータベースに対して SQL 文で検索することができます。
例えば、ある特定の要素のプロパティの情報を取得すると、次のような結果が得られます。

Metadata_04

このように、寸法のプロパティの値には、数値のみが保持されており、dataType というカラムで、単位タイプを確認できるようになっていることがわかります。

なお、dbId と externalId の違いについては、こちらのブログ記事をご参照ください。
Revit モデルでは、externalId は、Revit の要素に割り振られている UniqueId に対応しております。

オプション3 : Forge Viewer に最適化されたデータベース

3つ目の方法は、SQLite のデータベースファイルを Forge Viewer に最適化された形式で取得する方法です。

model.sdb ファイルは、ローカル環境で利用する際には便利ですが、Web アプリケーション上で利用する場合は、より容易にアクセスできる形式が必要です。

Forge Viewer では、モデルのメタデータは、パフォーマンスを維持するために、SQLite データベースのテーブル名にそれぞれ対応するよう分割された複数のファイルを使用しています。
それぞれのファイルは、JSON ファイルを圧縮した *.json.gz 形式となり、個別にダウンロードすることができます。

  • objects_ids.json.gz
    • object ID (Forge Viewer で使用される “dbId”)
    • external ID (デザインファイルの形式によって異なる要素ID、Revit の場合は “GUID”)
  • objects_attrs.json.gz
    • プロパティ名、カテゴリ、タイプ、単位など
  • objects_vals.json.gz
    • プロパティの値

例えば、下記のように output/Resource/ファイル名 を指定してダウンロードすることができます。
ファイルの使用方法は、こちらの GitHub サンプルをご参照ください。

derivatives/urn:adsk.viewing:fs.file:dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLkdUN0Q5Y3NoUkdTN0dzUDFZQlFOVlE_dmVyc2lvbj0y/output/Resource/objects_vals.json.gz

オプション 2 とオプション 3 に共通する EAV(エンティティ・アトリビュート・バリュー)の構造図は次のようになります。

Metadata_07

Revit モデルのメタデータを様々なアプリケーションでご利用いただければ幸いです。

By Ryuji Ogasawara


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading