admin 发表于 2024-5-26 11:00:43

使用ObjectARX来判断并获取不同类型的块的相关信息

#include <aced.h>
#include <adslib.h>
#include <dbmain.h>
#include <dbblocktablerecord.h>
#include <dbblockref.h>
#include <dbdynamicblockreffdata.h>

void processEntity(AcDbEntity* entity)
{
    if (AcDbBlockReference* pBlockRef = AcDbBlockReference::cast(entity))
    {
      AcDbObjectId blockId = pBlockRef->blockTableRecord();
      AcDbBlockTableRecord* pBlockRecord = nullptr;
      if (acdbOpenObject(pBlockRecord, blockId, AcDb::kForRead) == Acad::eOk)
      {
            // 普通块或动态块
            if (!pBlockRecord->isAnonymousBlock())
            {
                if (pBlockRecord->hasAttributes())
                {
                  // 属性块
                  // 注意:此处简化处理,实际上需要遍历属性并获取每个属性的值
                  acutPrintf("\n属性块 - 块名: %s", pBlockRecord->getName());
                  // 获取属性值的逻辑需要进一步实现,通常涉及遍历AcDbAttributeDefinition和AcDbAttributeReference
                }
                else if (AcDbDynamicBlockReferenceData* pDynBlockData = pBlockRef->dynamicBlockData())
                {
                  // 动态块
                  acutPrintf("\n动态块 - 块名: %s", pBlockRecord->getName());
                  // 获取动态块参数值的逻辑需要进一步实现,使用pDynBlockData
                }
                else
                {
                  // 普通块
                  acutPrintf("\n普通块 - 块名: %s", pBlockRecord->getName());
                }
            }
            else
            {
                // 匿名块
                acutPrintf("\n匿名块 - 名称值: %s", pBlockRecord->getName());
            }
            pBlockRecord->close();
      }
    }
}

void iterateAndProcessBlocks()
{
    AcDbDatabase* pCurDb = acdbHostApplicationServices()->workingDatabase();
    AcDbBlockTable* pBlockTable = pCurDb->getBlockTable();
    if (pBlockTable != nullptr)
    {
      AcDbBlockTableIterator* pBlkTblIter;
      if (pBlockTable->newIterator(pBlkTblIter, AcDb::kForRead) == Acad::eOk)
      {
            for (; !pBlkTblIter->done(); pBlkTblIter->step())
            {
                AcDbObjectId blkId = pBlkTblIter->objectId();
                AcDbBlockTableRecord* pRec;
                if (acdbOpenObject(pRec, blkId, AcDb::kForRead) == Acad::eOk)
                {
                  if (!pRec->isAnonymousBlock())
                  {
                        // 这里我们只关心块的引用,跳过块定义的处理
                  }
                  else
                  {
                        // 对于匿名块,直接处理块表记录
                        processEntity(pRec);
                  }
                  pRec->close();
                }
            }
            pBlkTblIter->close();
      }
    }
}

// 主函数或命令函数调用iterateAndProcessBlocks()开始处理
页: [1]
查看完整版本: 使用ObjectARX来判断并获取不同类型的块的相关信息