Forge Viewer中InstanceTree getNodeType()返回0的含义及元素分类咨询
问题解答
getNodeType()返回0的含义
getNodeType()返回的0对应Viewer内置的NODE_TYPE_OBJECT(十六进制0x0),就是普通的几何对象节点。Revit模型导出到Viewer后,InstanceTree里几乎所有节点都会返回这个值——因为Revit的元素类别信息根本没映射到这个节点类型字段上,这个字段主要是给DWG这类格式的模型设计的,对Revit模型来说参考价值极低。
按Revit原生类别筛选的更优方案
要筛选门这类元素集合,别盯着InstanceTree了,试试这几个更精准可靠的方法:
直接用Viewer的
search()方法按类别名查询
直接搜索类别名称(比如中文"门"或英文"Doors",取决于模型使用的语言),代码示例:viewer.search('门', (matchedIds) => { // matchedIds就是所有门元素的dbId数组 viewer.isolate(matchedIds); // 可直接隔离高亮目标元素 }, (err) => { console.error('搜索出错:', err); }, ['Category']); // 指定仅搜索Category属性,提升查询效率通过PropertyDb获取元素类别属性
利用模型的属性数据库精准判断元素类别,适合单个或批量元素的校验:const propDb = viewer.model.getPropertyDb(); // 示例:查询单个dbId对应的类别 propDb.getProperties(targetDbId, (props) => { const categoryProp = props.find(p => p.displayName === 'Category'); if (categoryProp && categoryProp.displayValue === '门') { // 确认该元素属于门类别 } });提前构建类别映射表(适合频繁筛选场景)
如果需要多次按类别筛选,先遍历所有元素构建类别与dbId的映射表,后续直接查表使用即可:const categoryToIds = {}; const instanceTree = viewer.model.getInstanceTree(); const rootId = instanceTree.getRootId(); // 遍历模型所有节点 instanceTree.enumNodeChildren(rootId, (dbId) => { propDb.getProperties(dbId, (props) => { const categoryName = props.find(p => p.displayName === 'Category')?.displayValue; if (categoryName) { if (!categoryToIds[categoryName]) { categoryToIds[categoryName] = []; } categoryToIds[categoryName].push(dbId); } }); }, true); // 后续直接通过categoryToIds['门']获取所有门元素的dbId数组
这些方法都无需依赖ACC,纯靠Viewer本地API就能实现,比用InstanceTree的节点类型筛选靠谱得多。
内容的提问来源于stack exchange,提问作者duffra
相关产品推荐
相关产品推荐

