如何获取Viewer中复合对象(composite-object)的几何图形(Geometry)?
在Autodesk Viewer中获取复合对象的几何图形
已知场景
你已经完成了以下操作:
- 在Viewer中加载了目标模型
- 选中了dbid为
1234的复合对象(图标标识为Composite Object)
关于你当前的解法
你提到的“递增迭代后续ID直至找到下一个composite-object”的方案在多数场景下确实能生效,但这种方式依赖节点ID的连续性,一旦模型结构有调整(比如新增/删除节点)就可能失效,并非长期稳定的通用解法。
官方推荐的可靠实现方法
我们可以利用Autodesk Viewer提供的对象树API,精准定位复合对象关联的几何节点,步骤如下:
- 获取模型的对象树实例
在Viewer的交互逻辑或模型加载完成的回调中,先拿到当前模型的对象树:
const activeModel = viewer.model; const objectTree = activeModel.getObjectTree();
- 遍历复合对象的子节点筛选几何图形
使用enumNodeChildren方法遍历目标复合对象(dbid:1234)的所有子节点,通过节点属性判断是否为Geometry类型:
const compositeDbId = 1234; objectTree.enumNodeChildren(compositeDbId, (childDbId) => { objectTree.getNodeProperties(childDbId, (props) => { // 根据节点的类型或图标标识判断是否为几何节点 if (props.type === 'Geometry' || props.icon === 'Geometry') { // 成功找到目标几何节点,可进行后续操作 console.log('找到几何图形节点:', childDbId); // 示例:获取几何节点的详细属性 viewer.getProperties(childDbId, (geomProps) => { console.log('几何图形属性信息:', geomProps); }); } }); });
- 通过复合对象属性直接定位(如果有映射)
从你提到的属性JSON内容来看,部分模型的复合对象属性中会直接关联几何节点的ID,你可以先获取复合对象的属性来快速定位:
objectTree.getNodeProperties(compositeDbId, (compositeProps) => { // 检查属性中是否存在几何节点的关联字段 const geometryDbId = compositeProps.geometryId || compositeProps.children?.find(item => item.type === 'Geometry')?.dbId; if (geometryDbId) { // 直接获取几何节点的几何数据 activeModel.getGeometry(geometryDbId, (geometry) => { console.log('获取到几何数据:', geometry); }); } });
注意事项
- 不同模型的属性结构可能存在差异,你可以根据实际返回的
getNodeProperties结果,调整判断条件来适配你的模型。 - 优先使用官方API实现,能更好地兼容不同版本的Viewer和不同结构的模型。
内容的提问来源于stack exchange,提问作者Anurag Bhardwaj
相关产品推荐
相关产品推荐

