Autodesk Forge 如何从名称中获取 dbid
Autodesk Forge How to get dbid from name
我有一个扩展程序,它加载一个带有文本字段和按钮的停靠面板。此按钮的功能是显示文本字段中给定项目名称的 DB-ID。
类似于:
橡胶 = 2130
其中 Rubber 是输入,2130(db-id) 将是输出
我怎样才能做到这一点?
提前致谢。
目前没有这样的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。由于这只是一种解决方法,而不是正式的解决方案。您必须自行承担使用它的风险。
建议使用 .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 搜索中查看此处。
如果您想避免使用 search()
方法,您还可以创建自己的将名称映射到 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"]
我有一个扩展程序,它加载一个带有文本字段和按钮的停靠面板。此按钮的功能是显示文本字段中给定项目名称的 DB-ID。
类似于: 橡胶 = 2130
其中 Rubber 是输入,2130(db-id) 将是输出
我怎样才能做到这一点?
提前致谢。
目前没有这样的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。由于这只是一种解决方法,而不是正式的解决方案。您必须自行承担使用它的风险。
建议使用 .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 搜索中查看此处。
如果您想避免使用 search()
方法,您还可以创建自己的将名称映射到 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"]