ObjectARX, AutoCAD. Среда программирования библиотеки C++

Выполнение итераций через Запись таблицы блоков


Следующий пример демонстрирует, как выполнить итерации через элементы в записи таблицы блоков и распечатывать элементы.

PrintAll () функция открывает таблицу блоков для чтения, и затем это открывает имя блока, снабженное пользователем. Новый iterator шагает через записи таблицы блоков. Если запись содержит примитив, iterator печатает сообщение относительно примитива.

void

printAll()

{

int rc;

char blkName[50];

rc = acedGetString(Adesk::kTrue,

"Enter Block Name <CR for current space>: ",

blkName);

if (rc != RTNORM)

return;

if (blkName[0] == ’\0’) {



if (acdbHostApplicationServices()->workingDatabase()

->tilemode() == Adesk::kFalse) {

struct resbuf rb;

acedGetVar("cvport", &rb);

if (rb.resval.rint == 1) {

strcpy(blkName, ACDB_PAPER_SPACE);

} else {

strcpy(blkName, ACDB_MODEL_SPACE);

}

} else {

strcpy(blkName, ACDB_MODEL_SPACE);

}

}

AcDbBlockTable *pBlockTable;

acdbHostApplicationServices()->workingDatabase()

->getSymbolTable(pBlockTable, AcDb::kForRead);

AcDbBlockTableRecord *pBlockTableRecord;

pBlockTable->getAt(blkName, pBlockTableRecord,

AcDb::kForRead);

pBlockTable->close();

AcDbBlockTableRecordIterator *pBlockIterator;

pBlockTableRecord->newIterator(pBlockIterator);

for (; !pBlockIterator->done(); pBlockIterator->step())

{

AcDbEntity *pEntity;

pBlockIterator->getEntity(pEntity, AcDb::kForRead);

AcDbHandle objHandle;

pEntity->getAcDbHandle(objHandle);

char handleStr[20];

objHandle.getIntoAsciiBuffer(handleStr);

const char *pCname = pEntity->isA()->name();

acutPrintf("Object Id %lx, handle %s, class %s.\n",

pEntity->objectId(), handleStr, pCname);

pEntity->close();

}

delete pBlockIterator;

pBlockTableRecord->close();

acutPrintf("\n");

}



Содержание раздела