CAD ソフトウエアでは、アドイン(プラグイン)アプリケーションの開発用に API を用意しています。そして、API で特定の図形(ジオメトリ)などを識別する目的で識別子を使用するのが一般的です。例えば、AutoCAD のエンティティ名や Revit の Element Id などです。
一方、Forge Viewer 上ではオブジェクトを識別するために dbid と呼ぶ識別子を利用することになります。例えば、表示されているオブジェクトを選択した場合など、そのオブジェクトの dbid が返されるので、関連付けられたプロパティデータベースからメタデータを取得することが出来るようになります。
この dbid は、Model Derivative API を使った変換処理毎に変更される可能性があるため、同じシード ファイル(デザイン ファイル)の同じオブジェクトでも常に一定になるわけではありません。別の言い方をするなら、変更のない同じシード ファイルを変換した場合でも、同じジオメトリに異なる dbid が割り当てられる可能性があります。逆に、Model Derivative API での変換を繰り返さなければ、Forge Viewer で表示する際の dbid は、同じジオメトリに対して同じになります。
ただ、オブジェクトと関連情報を外部データベースに保持するようなケースでは、dbid をキーにする方法は推奨されません。Forge には永続的に使用する目的に、Model Derivative API 変換に左右されない識別子も存在します。それが externalId と呼ばれる識別子です。
externalId は、シード ファイルに永続的な識別子があれば、それをそのまま利用です。先の例に当てはめるなら、AutoCAD のハンドル番号、Revit の Unique Id です。また、シード ファイルが COM ベースの API を持ち、明示的な識別子を設定していない場合でも、Model Derivative API 変換時に externalId が付与されることになります。
Model Derivative API:メタデータの活用 でご紹介したとおり、dbid と externalId は GET :urn/metadata/:guid/properties endpoint が返す JSON から得ることが出来ますが、外部データベース連携等で Forge Viewer 上で externalId から dbid を得たい場合もあるはずです。
そのような場合、getProperties メソッドで dbid から externalId を得ることが可能です。また、getExternalIdMapping メソッドで externalId から dbid を、それぞれ得ることが可能です。
次のコードは、Forge Viewer 上でオブジェクトを選択して dbid から externalId を得た後に、さらに externalId から dbid を抽出してデバッグ コンソールに表示するものです。
_viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, onSelected);
:
:
function onSelected(event) {
var dbIdArray = event.dbIdArray;
console.log("dbId = " + dbIdArray[0]);
var id;
_viewer.getProperties(dbIdArray[0], function (data) {
id = data.externalId;
console.log(">> externalId = " + id);
});
_viewer.model.getExternalIdMapping(data => console.log(">> dbId = " + data[id]));
}
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。