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

求助:如何通过Autodesk Platform Services提取DWG文件表格数据?

提取DWG文件中的表格数据(基于Autodesk Platform Services Viewer)

Viewer中可见的DWG表格本质是图形化的几何元素组合(文本+线条),而非原生结构化表格数据,可通过Viewer API识别并提取相关内容,以下是具体实现方案:

核心思路

  1. 遍历模型所有可见元素,筛选出表格区域内的文本和线条元素
  2. 基于元素的坐标位置对文本进行分组(匹配表格的行与列)
  3. 整理分组后的文本,生成结构化表格数据

代码示例

1. 获取模型中的文本与线条元素

async function getTableRelatedElements(viewer) {
  const instanceTree = viewer.model.getInstanceTree();
  const fragList = viewer.model.getFragmentList();
  const textElements = [];
  const lineElements = [];

  // 遍历所有节点
  instanceTree.enumNodeChildren(instanceTree.getRootId(), async (dbId) => {
    const nodeName = instanceTree.getNodeName(dbId);
    // 筛选文本类元素(可根据DWG实际命名规则调整)
    if (nodeName.includes('TEXT') || nodeName.includes('MTEXT')) {
      const fragIds = [];
      instanceTree.enumFragments(dbId, (fragId) => fragIds.push(fragId));
      for (const fragId of fragIds) {
        const textGeom = await fragList.getDbGeometry(fragId);
        if (textGeom?.data) {
          textElements.push({
            dbId,
            content: textGeom.data,
            position: textGeom.position // 文本中心点坐标
          });
        }
      }
    } else if (nodeName.includes('LINE')) {
      // 收集线条用于辅助确定表格边界(可选)
      const fragIds = [];
      instanceTree.enumFragments(dbId, (fragId) => fragIds.push(fragId));
      for (const fragId of fragIds) {
        const lineGeom = await fragList.getDbGeometry(fragId);
        lineElements.push(lineGeom);
      }
    }
  }, true);

  return { textElements, lineElements };
}

2. 按行列分组文本元素

function groupTextToTable(textElements) {
  // 按Y坐标分组(Y值相近的文本归为同一行)
  const rowGroups = {};
  const yTolerance = 5; // 容差值需根据DWG缩放比例调整
  textElements.forEach(elem => {
    const roundedY = Math.round(elem.position.y / yTolerance) * yTolerance;
    if (!rowGroups[roundedY]) {
      rowGroups[roundedY] = [];
    }
    rowGroups[roundedY].push(elem);
  });

  // 每行内按X坐标排序(X值从小到大对应从左到右的列)
  const tableRows = Object.values(rowGroups).map(row => {
    return row.sort((a, b) => a.position.x - b.position.x).map(elem => elem.content);
  });

  return tableRows;
}

3. 完整调用流程

async function extractTableData(viewer) {
  const { textElements } = await getTableRelatedElements(viewer);
  const structuredTable = groupTextToTable(textElements);
  console.log('提取的表格数据:', structuredTable);
  // 可进一步导出为CSV/JSON格式
}

// 在Viewer几何加载完成后触发提取
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => {
  extractTableData(viewer);
});

技术建议

  • 调整容差值:yTolerance需根据DWG的实际缩放比例微调,避免行分组错误
  • 过滤无关文本:可通过元素的dbId、命名规则或位置范围,排除表格外的冗余文本
  • 处理复杂表格:若存在合并单元格,需额外分析线条的连接关系来识别合并区域
  • 精准替代方案:如果需要更高精度的结构化数据,建议直接使用Autodesk Design Automation API处理DWG文件,而非通过Viewer提取

内容的提问来源于stack exchange,提问作者Mark Morton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:17:20