Autodesk Forge如何从名称获取dbid

时间:2017-08-03 11:08:01

标签: javascript autodesk-forge

我有一个扩展程序,可以加载带有文本字段和按钮的停靠面板。此按钮的功能是显示文本字段中给出的项目名称的DB-ID。

像: 橡胶= 2130

其中Rubber是输入,2130(db-id)将是输出

我怎样才能做到这一点?

提前致谢。

3 个答案:

答案 0 :(得分:1)

目前没有此类API可用,但在这种情况下可以使用解决方法。它显示如下:

//-- For the element type or element category like "Floor [" or "Floor"

var it = viewer.model.getData().instanceTree;
var strIdx = it.nodeAccess.strings.indexOf( "Floor [" );
// var strIdx = it.nodeAccess.strings.indexOf( "Floor" );
var nameIdx = it.nodeAccess.names.indexOf( strIdx );
for( var key in it.nodeAccess.dbIdToIndex ) {
  if( it.nodeAccess.dbIdToIndex[key] === nameIdx ) console.log( key )
}


//-- For element name like "Floor[766598]":
var it = viewer.model.getData().instanceTree;
var eidIndex = it.nodeAccess.nameSuffixes.indexOf( 766598 );
for( let key in it.nodeAccess.dbIdToIndex ) { 
  if( it.nodeAccess.dbIdToIndex[key] === eidIndex ) console.log( key ) 
}

<强> P.S。因为这只是一种解决方法,而不是正式的解决方案。您必须自担风险使用它。

答案 1 :(得分:1)

建议使用.search()方法,这是一种受支持的方式:

viewer.search('Rubber', function(dbIds){
  // here the dbIds is a list of dbIds, you can handle it
  callback(dbIds); // handle the results async
}, function(error){
  // handle errors here...
}, ['name'] /* this array indicates the filter: search only on 'Name'*/)

点击how to improve performance搜索。

答案 2 :(得分:0)

如果您想避免使用search()方法,则还可以创建自己的Object来将名称映射到ID。在Autodesk实现自己的方法之前,这是一个临时解决方法。

var instanceTree = viewer.model.getData().instanceTree; // Get model tree
var allDbIds = Object.keys(instanceTree.nodeAccess.names); //get array of all ID's
var forgeNameMap = {} //Empty array for mapping names
allDbIds.map(function(id) { 
    forgeNameMap[instanceTree.getNodeName(id)] = id
})

let rubberID = forgeNameMap["Rubber"]