APS Viewer v7.89 で指定した空間(領域)、あるいは、メタデータ(プロパティ)条件に基づいて選択的にモデルをロード・表示する「選択ロード」の機能が追加されています。指定する条件は Viewer でモデル表示時に使用することになるため、loadDocomentNode メソッド、または、loadModel メソッド呼び出し時に、オプションとして フィルタ(filter)を JSON 形式で指定することになります。
空間フィルタ(spatial_query)
指定した空間(領域)のモデルのみをロード、表示します。空間は、以前ご紹介したことがある Forge Viewer:レベル別の表示 の Viewer3D.setCutPlanes メソッドとは異なり、three.js の THREE.Vector4 ではなく、軸平行境界ボックス(AABB:Axis-Aligned Bounding Box)のかたちで指定します。
_viewer.loadDocumentNode(viewerDocument, viewables[0], {filter: {spatial_query: {'$encloses': [{ 'aabox': [-130, -105, 0, 130, 105, 20] }]}}}).then(i => {// something});
メタデータ フィルタ(property_query)
メタデータ・フィルタは、Model Properties クエリ言語に利用して指定します。プロパティには、それぞれ対応するハッシュを用いる必要があるので、まず、フィルタで指定するプロパティのハッシュを取得する必要があります。
ハッシュの取得には、モデルを Viewer に開いた状態で、デベロッパー ツールのコンソールから getPropertyHashes メソッドを呼び出してハッシュテーブルを得ることで確認することが出来ます。この際、表示中の Viewer インスタンスアクセスには、コンソールの利用と Viewer インスタンスへのアクセス でご案内した NOP_VIEWER を利用することが可能です。
例えば、「文字」カテゴリの「仕様 名称」プロパティをフィルタで使用する場合には、次のように指定します。
props = await NOP_VIEWER.model.getPropertyHashes();
props.find(record => record[1] === '仕様 名称' && record[2] === '文字');
もし、コンソール上で次のようなエラーが表示されるようなら、Viewer カンバスを定義する HTML の CDN 参照の URL から「.min」を削除して、ページを再ロード後に再度試してみてください。
<link type="text/css" rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css">
<script type="text/javascript" src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.min.js"></script>
上記モデルの場合、「Text」カテゴリの「仕様 名称」プロパティのハッシュが 'p6e5e93bd' になっていることがわかります。このハッシュを用いたメタデータ フィルタで、「仕様 名称」プロパティの値が「ELV」の要素をフィルタすると、エレベータ扉のみがロード、表示されます。
_viewer.loadDocumentNode(viewerDocument, viewables[0], {filter: {property_query: [{'$like': ['s.props.p6e5e93bd', "'ELV'"]}]}}).then(i => {// something});
メタデータ フィルタは、配列になっているので、複数のフィルタを指定することも出来るようになっています。「仕様 名称」プロパティの値に「壁」の文字が含まれるフィルタ(%壁%)を追加で指定すると、次のような結果を得ることが出来ます。
空間フィルタとメタデータ フィルタを組み合わせることも出来ます。
_viewer.loadDocumentNode(viewerDocument, viewables[0], {filter: {property_query: [{'$like': ['s.props.p6e5e93bd', "'%壁%'"]},{'$like': ['s.props.p6e5e93bd', "'ELV'"]}],spatial_query: {'$encloses': [{ 'aabox': [-130, -105, 0, 130, 105, 20] }]}}}).then(i => {// something});
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。