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

       

Вставлять блок с атрибутами в рисунок


1 Создают примитив блок-ссылки (AcDbBlockReference).

2 Называют setBlockTableRecord () функцией, чтобы определить объект ID упомянутой записи таблицы блоков. (Объект ID может также быть определен непосредственно в конструкторе блок-ссылки.)

3 Добавляют в конец блок-ссылку к записи таблицы блоков (пространство модели, пространство листа, или некоторый другой блок).

4 Используют запись таблицы блоков iterator на упомянутой записи таблицы блоков, ища определения атрибута. Для каждого найденного, создайте новый AcDbAttribute примитив, заполните это с данными определения атрибута, и затем добавьте в конец это к блок-ссылке, используя appendAttribute () функция.

Следующий пример создает блок-ссылку, заполняет атрибуты, и добавляет ссылку к базе данных. Это использует глобальные функции, чтобы получить ввод пользователя. CreateBlockWithAttributes () функция, показанная в предыдущем разделе используется, чтобы создать блок-ссылку. Этот пример использует запись таблицы блоков iterator, чтобы шагнуть через определения атрибута и создавать соответствующий атрибут для каждого определения атрибута. Атрибуты со значением установлены от первоначального определения атрибута, используя setPropertiesFrom () функция.

void

addBlockWithAttributes()

{

// Get an insertion point for the block reference,

// definition, and attribute definition.

//

AcGePoint3d basePoint;

if (acedGetPoint(NULL, "\nEnter insertion point: ",

asDblArray(basePoint)) != RTNORM)

return;

// Get the rotation angle for the attribute definition.

//

double textAngle;

if (acedGetAngle(asDblArray(basePoint),

"\nEnter rotation angle: ", &textAngle) != RTNORM)

return;

// Define the height used for the attribute definition text.

//

double textHeight;

if (acedGetDist(asDblArray(basePoint),

"\nEnter text height: ", &textHeight) != RTNORM)

return;

// Build the block definition to be inserted.

//

AcDbObjectId blockId;

defineBlockWithAttributes(blockId, basePoint,


textHeight, textAngle);

// Step 1: Allocate a block reference object.

//

AcDbBlockReference *pBlkRef = new AcDbBlockReference;

// Step 2: Set up the block reference to the newly

// created block definition.

//

pBlkRef->setBlockTableRecord(blockId);

// Give it the current UCS normal.

//

struct resbuf to, from;

from.restype = RTSHORT;

from.resval.rint = 1; // UCS

to.restype = RTSHORT;

to.resval.rint = 0; // WCS

AcGeVector3d normal(0.0, 0.0, 1.0);

acedTrans(&(normal.x), &from, &to, Adesk::kTrue,

&(normal.x));

// Set the insertion point for the block reference.

//

pBlkRef->setPosition(basePoint);

// Indicate the LCS 0.0 angle, not necessarily the UCS 0.0 angle.

//

pBlkRef->setRotation(0.0);

pBlkRef->setNormal(normal);

// Step 3: Open the current database’s model space

// block Table Record.

//

AcDbBlockTable *pBlockTable;

acdbHostApplicationServices()->workingDatabase()

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

AcDbBlockTableRecord *pBlockTableRecord;

pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,

AcDb::kForWrite);

pBlockTable->close();

// Append the block reference to the model space

// block Table Record.

//

AcDbObjectId newEntId;

pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);

pBlockTableRecord->close();

// Step 4: Open the block definition for read.

//

AcDbBlockTableRecord *pBlockDef;

acdbOpenObject(pBlockDef, blockId, AcDb::kForRead);

// Set up a block table record iterator to iterate

// over the attribute definitions.

//

AcDbBlockTableRecordIterator *pIterator;

pBlockDef->newIterator(pIterator);

AcDbEntity *pEnt;

AcDbAttributeDefinition *pAttdef;

for (pIterator->start(); !pIterator->done(); pIterator->step())

{

// Get the next entity.

//

pIterator->getEntity(pEnt, AcDb::kForRead);

// Make sure the entity is an attribute definition

// and not a constant.

//

pAttdef = AcDbAttributeDefinition::cast(pEnt);

if (pAttdef != NULL && !pAttdef->isConstant()) {



// We have a non-constant attribute definition,

// so build an attribute entity.

//

AcDbAttribute *pAtt = new AcDbAttribute();

pAtt->setPropertiesFrom(pAttdef);

pAtt->setInvisible(pAttdef->isInvisible());

// Translate the attribute by block reference.

// To be really correct, the entire block

// reference transform should be applied here.

//

basePoint = pAttdef->position();

basePoint += pBlkRef->position().asVector();

pAtt->setPosition(basePoint);

pAtt->setHeight(pAttdef->height());

pAtt->setRotation(pAttdef->rotation());

pAtt->setTag("Tag");

pAtt->setFieldLength(25);

char *pStr = pAttdef->tag();

pAtt->setTag(pStr);

free(pStr);

pAtt->setFieldLength(pAttdef->fieldLength());

// The database column value should be displayed.

// INSERT prompts for this.

//

pAtt->setTextString("Assigned Attribute Value");

AcDbObjectId attId;

pBlkRef->appendAttribute(attId, pAtt);

pAtt->close();

}

pEnt->close(); // use pEnt... pAttdef might be NULL

}

delete pIterator;

pBlockDef->close();

pBlkRef->close();

}


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