如何在不使用Viewer的情况下高效获取APS中的叶子节点dbid?
不使用Viewer获取指定dbid下所有叶子节点的最优方法
核心思路
直接调用Forge Model Derivative API的元数据接口,递归遍历目标节点的子树结构,筛选出无后续子节点的叶子节点。这种方式无需依赖Viewer,纯API调用即可实现,效率取决于元数据获取速度和遍历逻辑的优化。
具体步骤
步骤1:定位目标节点的GUID
调用GET /modelderivative/v2/designdata/:urn/metadata接口获取模型根元数据,从中递归查找你传入的目标dbid对应的节点GUID(若已知GUID可跳过此步)。步骤2:获取目标节点的完整子树
调用GET /modelderivative/v2/designdata/:urn/metadata/:guid接口,传入目标节点GUID,获取该节点包含所有子节点信息的完整树结构。步骤3:递归筛选叶子节点
遍历子树结构,按以下标准判断叶子节点:- 节点
hasChildren属性为false - 或节点
children数组为空 - 部分模型需结合
type字段(如叶子节点type为Geometry)
收集所有符合条件的节点dbid作为返回结果。
- 节点
代码示例(JavaScript)
async function getAllLeafDbids(urn, targetDbid, accessToken) { // 1. 从根元数据中查找目标dbid对应的GUID const metaRes = await fetch(`https://developer.api.autodesk.com/modelderivative/v2/designdata/${urn}/metadata`, { headers: { 'Authorization': `Bearer ${accessToken}` } }); const metaData = await metaRes.json(); function findGuidByDbid(node, targetDbid) { if (node.objectid === targetDbid) return node.guid; if (node.children) { for (const child of node.children) { const guid = findGuidByDbid(child, targetDbid); if (guid) return guid; } } return null; } const targetGuid = findGuidByDbid(metaData.data.metadata[0], targetDbid); if (!targetGuid) return []; // 2. 获取目标节点的子树结构 const treeRes = await fetch(`https://developer.api.autodesk.com/modelderivative/v2/designdata/${urn}/metadata/${targetGuid}`, { headers: { 'Authorization': `Bearer ${accessToken}` } }); const treeData = await treeRes.json(); // 3. 递归遍历筛选叶子节点dbid const leafDbids = []; function traverseTree(node) { if (!node.hasChildren || (node.children && node.children.length === 0)) { leafDbids.push(node.objectid); return; } if (node.children) { node.children.forEach(child => traverseTree(child)); } } traverseTree(treeData.data); return leafDbids; }
优化建议
- 一次性获取完整元数据:若模型体积不大,可在metadata接口后追加
?forceget=true直接获取根节点完整元数据,减少API调用次数。 - 缓存元数据:重复查询时将元数据缓存到本地或数据库,避免重复请求。
- 批量处理(大模型场景):超大规模模型可拆分子节点并行遍历,但需注意API调用频率限制。
内容的提问来源于stack exchange,提问作者TD123123123
相关产品推荐
相关产品推荐

