找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 184|回复: 1

ObjectArx 统计块

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-3-16 09:38:32 | 显示全部楼层 |阅读模式
  1. #include <dbdict.h>
  2. #include <dbblocktablerecord.h>
  3. #include <dbidmap.h>
  4. // 计算各类块数量
  5. std::map<std::string, int> CountBlockTypes(AcDbDatabase* pDb)
  6. {
  7.     std::map<std::string, int> blockCount;
  8.     blockCount["普通块"] = 0;
  9.     blockCount["动态块"] = 0;
  10.     blockCount["匿名块"] = 0;
  11.     AcDbBlockTable* pBlockTable;
  12.     if (Acad::eOk == pDb->getBlockTable(pBlockTable, AcDb::kForRead))
  13.     {
  14.         for (AcDbBlockTableIterator it(*pBlockTable); !it.done(); it.next())
  15.         {
  16.             AcDbBlockTableRecordPtr pBlockRec(it.item());
  17.             if (!pBlockRec.openStatus())
  18.                 continue;
  19.             // 判断是否为动态块
  20.             if (pBlockRec->isKindOf(AcDbDynBlockReference::desc()))
  21.             {
  22.                 blockCount["动态块"]++;
  23.             }
  24.             else if (/* 判断是否为匿名块 */)
  25.             {
  26.                 blockCount["匿名块"]++;
  27.             }
  28.             else
  29.             {
  30.                 blockCount["普通块"]++;
  31.             }
  32.             pBlockRec.close();
  33.         }
  34.         pBlockTable->close();
  35.     }
  36.     return blockCount;
  37. }
  38. // 将统计数据导出至Excel
  39. void ExportToExcel(const std::map<std::string, int>& blockCounts, const wchar采用t* excelFilePath)
  40. {
  41.     // 这里假设已有一个适配器或库可以与Excel交互
  42.     ExcelAdapter adapter;
  43.     // 打开或创建Excel文件
  44.     adapter.OpenOrCreateWorkbook(excelFilePath);
  45.     // 添加新工作表
  46.     adapter.AddWorksheet("块统计");
  47.     // 写入表头
  48.     adapter.WriteCell(1, 1, L"块类型");
  49.     adapter.WriteCell(1, 2, L"数量");
  50.     // 写入统计结果
  51.     int row = 2;
  52.     for (const auto& entry : blockCounts)
  53.     {
  54.         adapter.WriteCell(row++, 1, entry.first.c采用str());
  55.         adapter.WriteCell(row++, 2, entry.second);
  56.     }
  57.     // 保存并关闭Excel文件
  58.     adapter.SaveAndClose();
  59. }
  60. // 使用示例
  61. void MainProcess(AcDbDatabase* pDb)
  62. {
  63.     auto counts = CountBlockTypes(pDb);
  64.     std::wstring excelPath(L"统计结果.xlsx"); // 替换为实际要保存的Excel文件路径
  65.     ExportToExcel(counts, excelPath);
  66. }
复制代码

1

主题

0

回帖

35

积分

管理员

积分
35
 楼主| 发表于 2024-3-16 09:40:42 | 显示全部楼层
  1. // 示例伪代码
  2. std::map<std::wstring, int> blockTypeCounts;
  3. for (AcDbBlockTableRecordIterator iter(pBlockTable, AcDb::kForRead); !iter.done(); iter.next())
  4. {
  5.     AcDbBlockTableRecord* pBlockRec = iter.item();
  6.     if (pBlockRec->isKindOf(AcDbDynBlockReference::desc()))
  7.     {
  8.         blockTypeCounts[L"动态块"]++;
  9.     }
  10.     else if (/* 判断是否为匿名块的条件 */)
  11.     {
  12.         blockTypeCounts[L"匿名块"]++;
  13.     }
  14.     else
  15.     {
  16.         // 对于非动态且非匿名的块参照,认为是普通块
  17.         blockTypeCounts[L"普通块"]++;
  18.         
  19.         // 如果需要统计每个普通块引用的数量,还需要进一步遍历模型空间或布局空间等
  20.         AcDbDatabase* pDb = ...; // 获取当前数据库
  21.         AcDbIdMapping idMap;
  22.         pDb->getAllIds(idMap);
  23.         for (AcDbObjectId id : idMap.blockReferences())
  24.         {
  25.             AcDbBlockReference* pBlockRef;
  26.             if (id.openAcDbObject((AcDbObject*&)pBlockRef, AcDb::kForRead) == Acad::eOk && pBlockRec->name() == pBlockRef->blockName())
  27.             {
  28.                 blockTypeCounts[pBlockRec->name()]++; // 增加相应块引用的数量
  29.             }
  30.             if (pBlockRef != nullptr) pBlockRef->close();
  31.         }
  32.     }
  33.     pBlockRec->close();
  34. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 18:21 , Processed in 0.108208 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表