Forge Viewer の新バージョン 2.15 がリリースされました。そこで、今回はバージョン 2.15 の改良点や新機能をご紹介していきたいと思います。
なお、Forge Viewer の VR サポートについて ブログ記事の最後でもご案内したとおり、Viewer バージョンを指定をせずに使用した場合は、Forge Viewer を利用しているオートデスク製品にあわせて、無条件に バージョン 2.10 が適用されてしまいます。このため、バージョン 2.15 を利用するには、明示的に Forge Viewer のバージョン指定 をおこなう必要がありますのでご注意ください。
Extension ロード方法の変更
ご存じのとおり、Forge Viewer には Extension と呼ばれる拡張モジュールを JavaScript ファイル単位で作成して必要に応じて Viewer にロードさせることで、Viewer 自身の機能を拡張していくメカニズムが提供されています。ちょうと、AutoCAD や Revit などのデスクトップ製品いうアドインの開発と利用と似ています。Extension は 3rd party が作成/利用するだけでなく、Forge Viewer で利用可能な Extension のブログ記事でご案内したとおり、オートデスク自身も利用しています。
今回のバージョンでは、表示中の Forge Viewer に Extension をロードする方法が大きく変更されています。 バージョン 2.14 まで、オートデスクが提供するすべての Extension は viewer3D.min.js にバンドルして提供してきましたが、バージョン 2.15 から Extension のコードを viewer3D.min.js から分離する処理を開始します。分離対象となる最初の Extension は InViewerSearch.min.js です。今後、他の標準 Extension も分離していくことを予定しています。
コードの変更 [2.14 バージョンとは互換性なし]
viewer.loadExtension() 関数を利用して Extension をロードしている場合、この関数は、従来のブール値ではなく、非同期処理でのロードを実現させる目的で Promise を返すようになります。このため、以前使用していたコードとの互換性がありません。
バージョン 2.14 以前
var result = viewer.loadExtension('Autodesk.InViewerSearch');
if (result === true) {
var extension = viewer.getExtension('Autodesk.InViewerSearch');
console.log('Extension がロードされました: ' + extension.id);
}
バージョン 2.15 以降
var promise = viewer.loadExtension('Autodesk.InViewerSearch'); // サーバーから非同期でロード
promise.then(function(extension){
console.log('Extension がロードされました: ' + extension.id);
});
なお、viewer.getExtension() と viewer.unloadExtension() 関数に変更はありません。また、
メモリ管理のオプションの追加
エンドユーザが直面する問題の 1 つに、メモリ不足で 3D モデルを表示できないという問題があります。これは、使用中の Web ブラウザが、すべての 3D モデルを表示するのに十分なメモリを確保出来ない、というのが主な理由です。そのような場面では、結果として、ブラウザ自身がクラッシュしてしまいます。
バージョン 2.15 では、3D デザイン ファイルをロードする際に Viewer コードが割り当てることのできるメモリ量を指示するメカニズムが導入されています。この機能は既定では無効化されている点に注意してください。
機能を有効化する方法は次のとおりです。:
使用方法
var config3d = {
memory: {
limit: 400// メガバイト
}
};
var viewer = new Autodesk.Viewing.Viewer3D(container, config3d);
viewer.loadModel( modelUrl );
デザイン毎に機能を有効化する方法として、ブラウザの URL に viewermemory=<value> の引数を追加する方法もあります。
例 - https://mywebsite.com/viewer/document-id-here?viewermemory=400
この URL パラメータでの指定は、コードによって記述されたメモリ制限をオーバーライドする点に注意してください。
この機能が動作しているかチェックするには、Viewer インスタンスで利用可能な次の関数を利用してみてください。:
var memInfo = viewer.getMemoryInfo();
console.log(memInfo.limit); // == 400 MB
console.log(memInfo.effectiveLimit); // >= 400 MB
console.log(memInfo.loaded); // <= 400 MB
機能が無効な場合には、これらの関数は null を返します。
建築モデル用の既定照明
Viewer にプリセットされた環境光に「野原(Field)」が新設されて、BIM モデルをロードした際の既定となるように設定されています。なお、ここでいう BIM モデルとは、Revit の RVT ファイル、Navisworks の NWD ファイルと NWC ファイルを意味します。
また、「パフォーマンスと外観」設定には「エッジを表示」が新設され、こちらも既定でオンの状態になります。上記、バージョン 2.15 の表示イメージでも「エッジを表示」が有効な状態になっています。
ViewingApplication の強化
Viewer 表示の際の利用が推奨されているユーティリティ クラスである ViewingApplication では、Model Derivative API でデザイン ファイルを変換した際に生成されるマニフェスト ファイルから Viewer を初期化出来るようになっています。
この更新には、下記の機能も含まれています。
1. 追加された関数: setDocument()
Forge Viewer を利用する場合、以前は URN 文字列で ViewingApplication を初期化する必要がありました。下記は、Step-by-Step Tutorials の Basic Application からの引用です。
バージョン 2.14 以前
// Autodesk.Viewing.Initializer() 成功後
var documentId = 'urn:<YOUR_URN_ID>';
viewerApp = new Autodesk.Viewing.ViewingApplication('MyViewerDiv');
viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Private.GuiViewer3D);
viewerApp.loadDocument(documentId, onDocumentLoadSuccess, onDocumentLoadFailure); // このメソッドはオートデスク サーバーを非同期に呼び出す
// 非同期コールバック
function onDocumentLoadSuccess(doc) {
var viewables = viewerApp.bubble.search({'type':'geometry'});
viewerApp.selectItem(viewables[0].data, onItemLoadSuccess, onItemLoadFail);
}
この方法の欠点は、アプリケーション独自の処理のためにすでにマニフェスト取得処理をしている場合でも、開発者にサーバーからのマニフェスト取得を強制する点です。
バージョン 2.15 では、新しい関数 ViewingApplication: setDocument() を追加して、標準的な JavaScript のオブジェクト パラメータを受け入れるものです。使用方法は次のとおりです。:
バージョン 2.15 以降
// https://developer.api.autodesk.com/modelderivative/v2/designdata/:urn/manifest
// から JSON を取得して、オブジェクトとして保存します
var manifestObject = {...};
// Autodesk.Viewing.Initializer() 成功後
viewerApp = new Autodesk.Viewing.ViewingApplication('MyViewerDiv');
viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Private.GuiViewer3D);
viewerApp.setDocument(manifestObject); // 非同期ではない!
var viewables = viewerApp.bubble.search({'type':'geometry'});
viewerApp.selectItem(viewables[0].data, onItemLoadSuccess, onItemLoadFail);
2.関数の強化: selectItem()
BubbleNode オブジェクトのサポートを追加しています。
バージョン 2.14 以前
// 前述の例で使用
var viewables = viewerApp.bubble.search({'type':'geometry'});
viewerApp.selectItem(viewables[0].data, onItemLoadSuccess, onItemLoadFail);
バージョン 2.15 以前
var viewables = viewerApp.bubble.search({'type':'geometry'});
viewerApp.selectItem(viewables[0], onItemLoadSuccess, onItemLoadFail);
3. 追加された関数: getNamedViews()
名前で識別可能な 3D viewable からすべてのカメラ ビューを取得するヘルパー メソッドです。
使用方法
var namedViews = viewerApp.getNamedViews(viewables[0]);
alert('Selecting named view: ' + namedViews[0].data.name);
viewerApp.selectItem(namedViews[0], onItemLoadSuccess);
マニフェストに格納される名前の付いたビューHere's how named views show up in the manifest:
エッジの表示
新設された「エッジを表示」を有効にする新しい関数が追加されています。:
// 「エッジを表示」をオンに設定
viewer.setDisplayEdges(true);
コメント