APS Viewer:以前の内容が表示されてしまう

3Dモデルの都市景観、二つの高層ビルと周辺の建物が描かれている。

過去に開催した Autodesk University や Workshop 等で Viewer とブラウザ キャッシュについて触れていますが、ブログ記事としてご案内したことがなかったようです。今回は、改めて Viewer に起こりがちなブラウザ キャッシュにまつわる問題と回避策をご紹介したいと思います。

まず、APS Viewer に 2D 図面/シートや 3D モデルのコンテンツを表示する処理を振り返って見ましょう。

デザイン ファイルの内容を APS Viewer に表示するには、通常、シード(種)ファイルとも呼ばれるデザイン ファイルを OSS Bucket にアップロード後、Model Derivative API の POST job エンドポイントで SVF/SVF2 に変換、Bucket+ファイル名を Base64 エンコードした URN を識別子(Document Id)として Viewer の load メソッドに渡します。

デザインファイルをSVF/SVF2ファイルに変換するプロセスを示すフロー図。シードファイルからデータ管理APIを介してViewerに配信する工程が描かれている。

この際、表示されたコンテンツが期待した内容にならないケースが存在します。


問題

毎回、アップロード、変換するのが異なる Bucket 名やファイル名である場合、特に表示上の問題は発生しないはずです。

Viewer 処理の手順で問題になるのは、同じ名前の Bucket に、内容を更新したデザイン ファイルを同じ名前でアップロード、再変換、表示した場合です。この場合、デザイン ファイル内のコンテンツを更新しているにもかかわらず、Viewer に以前の状態のコンテンツが表示されてしまう問題が潜在します。

上部に3Dモデル(円筒)を表示した画面と初回変換の成功[OK]を示すラベル。下部に異なる3Dモデル(立方体)を表示した画面と再変換の失敗[NG]を示すラベル。

考察

このような際、考えられるのは次の点になります。

  1. POST job エンドポイントを呼び出して SVF/SVF2 変換する場合、以前の変換時に生成されたマニフェストが残っていると再変換がおこなわれません。その結果、サーバー側で SVF/SVF2 自体が更新されない結果になります。
  2. クライアント側で以前のコンテンツがブラウザにャッシュされているため、前回のキャッシュ内容が表示される結果になります。
  3. SVF2 の場合、ローカル環境での検証時にサーバー キャッシュが更新の邪魔をする場合があります。

対策

  1. 上記「考察 1.」 の対策として、確実な再変換を実行するには2通りの方法があります。
    1つめは POST job エンドポイントの呼び出し前に、DELETE {urn}/manifest エンドポイントで以前の変換時に生成されたマニフェストを削除する方法です。マニフェストが存在するか否かは、GET {urn}/manifest エンドポイントでチェックすることが出来ます。
    2つめはリクエスト時に  x-ads-force ヘッダーパラメータを true に設定して、POST job エンドポイントを呼び出す方法です。このパラメータで、マニフェストの有無にかかわらず、強制的に変換を実行させることが出来ます。
  2. 「考察 2.」の対策として、変換処理前にブラウザ キャッシュをクリアしておく方法です。お使いの Web ブラウザによってキャッシュのクリアの手順/ UI が異なるので、個々の方法には触れませんが、多くに場合、1. の対策に加えて、この対策を実行することで期待したコンテンツを Viewer 表示させることが出来るはずです。
左側に表示された3Dモデルと、右側にその結果としての変換されたモデルの画像。左はViewerに読み込まれた'Drawing.dwg'ファイルで、右は変換処理後の様子を示している。
スライドに表示された変換済ファイルの再変換に関するガイドライン。内容には、毎回の変換が行われない理由と、再変換を期待する場合の対策が示されている。

ただ、開発時のデバッグ作業なら許容できても、当然ながら、実際の運用で毎回ブラウザ キャッシュを削除するのは受け入れられないのも事実です。

このような場合、クライアント実装で URN を使って表示コンテンツをフェッチする際、If-Modified-Since リクエストヘッダーに過去の日時を指定することで、常に新しいコンテンツをロード・表示する方法があります。

具体的なクライアント実装は次のようなものになります。

...
var options = {
env: 'AutodeskProduction2',
api: 'streamingV2',
getAccessToken: getCredentials
};
Autodesk.Viewing.Initializer(options, function () {
_viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('viewer3d'));
var startedCode = _viewer.start();
if (startedCode > 0) {
console.error('Failed to create a Viewer: WebGL not supported.');
return;
}
Autodesk.Viewing.endpoint.HTTP_REQUEST_HEADERS['If-Modified-Since'] = 'Sat, 29 Oct 1994 19:43:31 GMT';
// Load viewable
var documentId = 'urn:' + urn;
Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
});
...

この方法では、実際にキャッシュをクリアするのではなく、更新されたコンテンツをサーバーから強制的に再読み込みさせる効果を得ることが出来ます。よりスマートで実用的な方法と言えます。

  1. 「考察 3.」の対策として、デバッグ実行でテストをしている場合には、サーバー(デバッグ実行)の再起動が必要です。

同じデザイン ファイル名に由来する URN を頻繁に更新・表示する必要のある(Design Automation API と併用するような)コンフィギュレーターでは有効な対策です。

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

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

Continue reading