找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 187|回复: 0

Arx遍历块内实体

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-28 08:53:26 | 显示全部楼层 |阅读模式
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错误。
  1. void readBlockEntities(const AcDbObjectId& blkid)
  2. {
  3.     AcDbBlockTableRecordIterator *iter;
  4.     AcDbBlockReference *pBlkRef;
  5.     AcDbBlockTableRecord *pRecord;
  6.     Acad::ErrorStatus es = acdbOpenObject(pBlkRef, blkid, AcDb::kForRead);
  7.     if (es != Acad::eOk)
  8.         return;
  9.     AcDbObjectId blockTableRecordId = pBlkRef->blockTableRecord();
  10.     pBlkRef->close();
  11.     es = acdbOpenObject(pRecord, blockTableRecordId, AcDb::kForWrite);
  12.     if (es != Acad::eOk || pRecord == NULL)
  13.         return;
  14.     pRecord->newIterator(iter);
  15.     for (iter->start(); !iter->done(); iter->step())
  16.     {
  17.         AcDbObjectId id;
  18.         es = iter->getEntityId(id);
  19.         if (es != Acad::eOk || !id.isValid())
  20.             continue;
  21.         // TODO 处理实体
  22.     }
  23.     // 释放迭代器对象,关闭快表记录
  24.     delete iter;
  25.     pRecord->close();
  26. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:34 , Processed in 0.130835 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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