2017-10-12 14 views
0

から翻訳されたSVFファイルがあり、正常にはViewerにロードされました。[Autodesk Forgeビューア]指定された画層のオブジェクトのdbIdを取得する方法

これでレイヤー内の一部のオブジェクトの属性/プロパティを照会したいと思います。

let layer = viewer.model.getLayersRoot().children.find(x=> x.name==='Marker');//find the layer named by 'Marker'----{name: "Marker", index: 72, id: 71, isLayer: true} 
let objectTree = viewer.model.getData().instanceTree;//get the Object Tree and its One-dimensional array of dbIdList 
// stuck here 
// looking for some method like objectTree.getIdListInLayer(layerId) 

を任意の提案が高く評価されています。ここでは

は、私がこれまで行ってきたものです。

答えて

0

残念ながら、現時点ではこれを行うことができない場合があります。この記事を参照してください:

How to get a list of dbids contained in a layer?

+0

これは本当に悪いニュースです。私の現在の回避策は、すべてのdbIdsを通過し、一致する1つを選択することです。上記の私の答えを見てください。 –

0

イーソン・カンの回答によると、これを達成するための公式なアプローチはありません。そのため、dbIdListを反復するしかありません。コードは次のとおりです。

function query(dbId, model, layerName) { 
    if (!dbId) return Promise.resolve(null); 
    return new Promise(resolve => { 
     model.getProperties(dbId, x => { 
      let layerProp = x.properties.find(x => x.displayName === 'Layer' && x.displayValue === layerName); 
      resolve(!!layerProp ? x : null); 
     }); 
    }); 
} 

Promise.all(Object.keys(objectTree.nodeAccess.dbIdToIndex).map(dbId => query(dbId = dbId - 0, viewer.model, layerName = 'Marker'))) 
    .then(function(resultList) { 
     resultList = resultList.filter(x => !!x); 
     console.table(resultList); //this is all the objects in the Marker layer 
    }); 
+0

素晴らしいですが、代わりに 'viewer.search'または' viewer.getBulkProperties'を使用することをお勧めします。この場合、パフォーマンスが向上する可能性があります。このブログを参照してください:https://forge.autodesk.com/blog/getbulkproperties-method –

+0

私はこの回避策がすべての2Dモデルで機能しないことがわかりました。 'InstanceTree'を持たないものの中には、' model.getProperties'で壊れるものがあります。 –

関連する問題