Arx遍历块内实体

1、关键类和接口

1.1、AcDbBlockTableRecordIterator

该迭代器由函数AcDbBlockTableRecord::newIterator()返回。它用于迭代AcDbBlockTableRecord。使用之后要释放(delete)返回的对象。

void start( bool atBeginning = true, bool skipDeleted = true);

此函数用于将迭代器的位置初始化为块的开头或结尾。如果atBeginning为true, 则迭代器位于表的开头; 否则, 它位于表的末尾。如果skipDeleted为true, 则迭代器位于第一个或最后一个非删除实体; 否则, 它位于第一个或最后一个实体, 无论其被删除或未删除状态。  

bool done() const;

如果迭代器已经定位在块的任一端之外, 则此函数返回true ; 否则, 它返回false。 

void step( bool forward = true, bool skipDeleted = true);

此函数将迭代器移动到块中的下一个(或上一个)实体。如果forward为true, 则迭代器逐步向块的末尾移动; 否则, 它会走向块的开头。如果skipDeleted为true, 则将跳过已擦除的块; 否则, 任何已擦除的块都将包含在扫描中。 

Acad::ErrorStatus getEntityId( AcDbObjectId& entityId) const;

该函数返回AcDbObjectId在该迭代器被定位在该实体的ENTITYID。 

1.2、AcDbBlockReference

该AcDbBlockReference类表示在AutoCAD的INSERT实体。块引用用于放置, 调整和显示它引用的AcDbBlockTableRecord中的实体集合的实例。此外, 块引用可以是AcDbAttribute实体的所有者(其列表由AcDbSequenceEnd实体自动终止)。 

从AcDbEntity继承的AcDbBlockReference集函数忽略doSubents参数, 因为这些子实体是真正特殊文本实体的属性, 需要具有各自的属性(与折线顶点不同, 它们只是数据点)。 

AcDbObjectId blockTableRecord() const;

此函数返回块引用引用的AcDbBlockTableRecord的对象ID 。 

引用的块表记录包含块引用将显示的实体。 

块表记录对象ID用于获取与块引用的AutoLISP和ADSRX实体信息列表中的组代码-2一起使用的实体名称。

1.3、AcDbBlockTableRecord

AcDbBlockTableRecord类的对象用作图形文件数据库中实体的容器。AcDbBlocktableRecord对象(通常称为BTR)由数据库的AcDbBlockTable对象拥有。BTR又拥有它们包含的实体对象。 

每个数据库中始终存在两个特殊的BTR。它们是* MODEL_SPACE和* PAPER_SPACE。它们是数据库的模型和纸空间。AutoCAD中在模型空间中创建的任何实体都由* MODEL_SPACE BTR拥有和包含。在Paper Space中创建的实体进入* PAPER_SPACE BTR。 

除了* MODEL_SPACE和* PAPER_SPACE之外的BTR在以前版本的AutoCAD中已知为块定义, 并且由AcDbBlockReferences(通常称为插入)引用。BTR包含一组实体, 可以通过多个插入引用以节省图形中的空间, 节省绘图创建时间, 并保证所有插入显示相同(可能除了颜色和线型)。

2、代码实例

打开块时要先以块参照AcDbBlockReference对象打开,然后用AcDbBlockReference::blockTableRecord()获取块表记录blockTableRecordId,用这个blockTableRecordId打开才是块表记录,直接用块blkid打开块,将返回eNullObjectId错误。

void readBlockEntities(const AcDbObjectId& blkid)
{
    AcDbBlockTableRecordIterator *iter;
    AcDbBlockReference *pBlkRef;
    AcDbBlockTableRecord *pRecord;
    Acad::ErrorStatus es = acdbOpenObject(pBlkRef, blkid, AcDb::kForRead);
    if (es != Acad::eOk)
        return;
    AcDbObjectId blockTableRecordId = pBlkRef->blockTableRecord();
    pBlkRef->close();
    es = acdbOpenObject(pRecord, blockTableRecordId, AcDb::kForWrite);
    if (es != Acad::eOk || pRecord == NULL)
        return;
    pRecord->newIterator(iter);
    for (iter->start(); !iter->done(); iter->step())
    {
        AcDbObjectId id;
        es = iter->getEntityId(id);
        if (es != Acad::eOk || !id.isValid())
            continue;
        // TODO 处理实体
    }
    // 释放迭代器对象,关闭快表记录
    delete iter;
    pRecord->close();
}


————————————————
版权声明:本文为CSDN博主「qq_28742901」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28742901/article/details/122229669

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值