admin 发表于 2024-3-16 09:38:32

ObjectArx 统计块

#include <dbdict.h>
#include <dbblocktablerecord.h>
#include <dbidmap.h>

// 计算各类块数量
std::map<std::string, int> CountBlockTypes(AcDbDatabase* pDb)
{
    std::map<std::string, int> blockCount;
    blockCount["普通块"] = 0;
    blockCount["动态块"] = 0;
    blockCount["匿名块"] = 0;

    AcDbBlockTable* pBlockTable;
    if (Acad::eOk == pDb->getBlockTable(pBlockTable, AcDb::kForRead))
    {
      for (AcDbBlockTableIterator it(*pBlockTable); !it.done(); it.next())
      {
            AcDbBlockTableRecordPtr pBlockRec(it.item());
            if (!pBlockRec.openStatus())
                continue;

            // 判断是否为动态块
            if (pBlockRec->isKindOf(AcDbDynBlockReference::desc()))
            {
                blockCount["动态块"]++;
            }
            else if (/* 判断是否为匿名块 */)
            {
                blockCount["匿名块"]++;
            }
            else
            {
                blockCount["普通块"]++;
            }

            pBlockRec.close();
      }
      pBlockTable->close();
    }

    return blockCount;
}

// 将统计数据导出至Excel
void ExportToExcel(const std::map<std::string, int>& blockCounts, const wchar采用t* excelFilePath)
{
    // 这里假设已有一个适配器或库可以与Excel交互
    ExcelAdapter adapter;

    // 打开或创建Excel文件
    adapter.OpenOrCreateWorkbook(excelFilePath);

    // 添加新工作表
    adapter.AddWorksheet("块统计");

    // 写入表头
    adapter.WriteCell(1, 1, L"块类型");
    adapter.WriteCell(1, 2, L"数量");

    // 写入统计结果
    int row = 2;
    for (const auto& entry : blockCounts)
    {
      adapter.WriteCell(row++, 1, entry.first.c采用str());
      adapter.WriteCell(row++, 2, entry.second);
    }

    // 保存并关闭Excel文件
    adapter.SaveAndClose();
}

// 使用示例
void MainProcess(AcDbDatabase* pDb)
{
    auto counts = CountBlockTypes(pDb);
    std::wstring excelPath(L"统计结果.xlsx"); // 替换为实际要保存的Excel文件路径
    ExportToExcel(counts, excelPath);
}

admin 发表于 2024-3-16 09:40:42

// 示例伪代码
std::map<std::wstring, int> blockTypeCounts;

for (AcDbBlockTableRecordIterator iter(pBlockTable, AcDb::kForRead); !iter.done(); iter.next())
{
    AcDbBlockTableRecord* pBlockRec = iter.item();

    if (pBlockRec->isKindOf(AcDbDynBlockReference::desc()))
    {
      blockTypeCounts++;
    }
    else if (/* 判断是否为匿名块的条件 */)
    {
      blockTypeCounts++;
    }
    else
    {
      // 对于非动态且非匿名的块参照,认为是普通块
      blockTypeCounts++;
      
      // 如果需要统计每个普通块引用的数量,还需要进一步遍历模型空间或布局空间等
      AcDbDatabase* pDb = ...; // 获取当前数据库
      AcDbIdMapping idMap;
      pDb->getAllIds(idMap);
      for (AcDbObjectId id : idMap.blockReferences())
      {
            AcDbBlockReference* pBlockRef;
            if (id.openAcDbObject((AcDbObject*&)pBlockRef, AcDb::kForRead) == Acad::eOk && pBlockRec->name() == pBlockRef->blockName())
            {
                blockTypeCounts++; // 增加相应块引用的数量
            }
            if (pBlockRef != nullptr) pBlockRef->close();
      }
    }

    pBlockRec->close();
}
页: [1]
查看完整版本: ObjectArx 统计块