Forge Viewer で 2D 図面や 3D モデルを表示する際には、Model Derivative API を使って SVF ファイルに変換して、Base64 エンコードされた URN を Viewer コードに渡す必要があります。
Model Derivative API での SVF 変換時には、viewable と呼ばれる SVF 情報の他に、derivative と呼ばれる配信可能な派生物が存在します。
この中には、シードファイル(元のデザインファイル)に定義されていたビュー(2D と 3D)の情報が存在します。ビューは、そのビューで表示されるジオメトリのメタデータを取得するための窓口となる情報、ID が含まれます。このビュー毎の GUID は、GET :urn/metadata endpoint で取得することが出来ます。
この GET :urn/metadata endpoint を利用すると、デザインファイルから派生したビューの ID (GUID)の一覧を取得することが出来ます。次の例では、3D ビューの GUID が 85d0b3b7-9a90-2738-40f7-7823397e2777 であることがわかります。これと同じ ID は、変換時に生成されるマニフェストにも現れているはずです。
{ "data": { "type": "metadata", "metadata": [ { "name": "3D", "role": "3d", "guid": "85d0b3b7-9a90-2738-40f7-7823397e2777" }, { "name": "A101 - Lobby", "role": "2d", "guid": "d14f28b6-4ef8-770c-f6c5-8b419eeb9a0e" }, { "name": "A102 - 2th Flr. Occupancy", "role": "2d", "guid": "16ff855f-a7ab-ce77-b830-2b9979704280" }, { "name": "A103 - 3th Flr. Occupancy", "role": "2d", "guid": "91f9b12b-ef58-96b0-9b52-f7d097cad709" }, { "name": "A104 - 4th Flr. Occupancy", "role": "2d", "guid": "10b80f72-973f-16a4-2814-4dd90e33eafd" }, { "name": "A105 - 5th Flr. Occupancy", "role": "2d", "guid": "0ead8070-e539-0fb0-02e7-6f882c9df904" }, { "name": "A100 - Aerial", "role": "2d", "guid": "1d4c9e63-6336-4ff8-0b2a-28bb07e39086" }, { "name": "A106 - Perpective_King St.", "role": "2d", "guid": "9e9e2f77-54bc-b92b-92e9-bbe0ddfcd505" }, { "name": "A107 - Perspective_5th Flr", "role": "2d", "guid": "3f41d1cd-41d9-45e4-e354-9ecc0025f21c" }, { "name": "A108 - Elevation- King St.", "role": "2d", "guid": "f02362af-5835-e0ce-5411-d490d16c34a1" }, { "name": "A109 - Elevation-Frederick St.", "role": "2d", "guid": "c8a7d7e0-9ea3-fda4-d129-46038a340932" } ] } }
ビューの GUID が取得出来たら、この GUID を使ってビューに表示されるツリー構造を取得することが可能になります。
例)
{ "data": { "type": "objects", "objects": [ { "objectid": 1, "name": "Model", "objects": [ { "objectid": 2, "name": "All-Ground Level" }, { "objectid": 3, "name": "BLDG 1,2,3- LEVEL 1 FLR. FIN." }, { "objectid": 4, "name": "BLDG 1,2,3- LEVEL 2 FLR. FIN." }, { "objectid": 5, "name": "BLDG. 1,2,3- LEVEL 3 FLR. FIN." }, { "objectid": 6, "name": "BLDG. 1,2,3- LEVEL 4 FLR. FIN." }, <省略>
ここで返されるツリー構造は、Viewer 上のモデルツリーの内容と同等です。
そして、この GUID を使用して GET :urn/metadata/:guid/properties endpoint を呼び出すと、含まれるプロパティをメタデータとして得ることが出来ます。JSON 形式でビュー配下のジオメトリのプロパティを返すので、かなりのサイズになってしまいますが、Forge Viewer JavaScript ライブラリで扱うことになりオブジェクト識別子(dbid)をキーに、プロパティをパースすることも可能です。
特に、ここで返される JSON には、元のデザインファイルで定義された(不変な扱いの)オブジェクト識別子を externalId として取得することが出来るので、必要に応じて、後続の処理で活用することが出来ます。不変な扱いのオブジェクト識別子とは、AutoCAD API で扱うハンドル番号や Revit API で扱う Unique Id のような永続的な識別子を指します。
次の図は、窓のファミリ インスタンスの Unique Id が、externalId として発現している例を、Revit 上の Lookup Tool と VS Code の Autodesk Forge Tools エクステンションでそれぞれ表示した例です。dbId(objectId)は SVF 変換毎に異なる値になってしまいますが、externalId はファミリタイプの変更前後でも同じ値になっている点にご着目ください。外部データベースを併用する場合には有効です。
なお、 GET :urn/metadata/:guid/properties endpoint でのプロパティ JSON は、生成に少し時間が必要です。SVF 変換直後には、202 エラーでこの状態を返す場合があります。
By Toshiaki Isezaki
コメント