[Autodesk Forge viewer]如何获取指定图层中对象的dbIds

问题描述:

我有一个SVF文件,从2d DWG翻译过来并成功加载到Viewer中。[Autodesk Forge viewer]如何获取指定图层中对象的dbIds

现在我想查询图层中某些对象的属性/属性。

以下是我迄今所做的:

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) 

任何建议表示赞赏。

不幸的是,目前可能无法做到这一点。请参考这个帖子:

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

+0

这真是个坏消息。我目前的解决方法是通过所有dbIds并选择匹配的一个。参见上面的答案。 –

据陈奕迅康的回答,没有达到这个没有正式的办法。所以剩下的唯一方法就是迭代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'中被破坏。 –