You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:13:19