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

         

Создание записи таблицы блоков с определениями атрибута


Блок AutoCAD - коллекция примитивов, который сохранен в записи таблицы блоков. Каждый блок имеет объект AcDbBlockBegin, сопровождаемый одним или большее количество объектов AcDbEntity, и заканчивается объектом AcDbBlockEnd (см. иллюстрацию на странице 100).

Блок может содержать определения атрибута, которые являются шаблонами для создания атрибутов. Атрибут - информационный текст, связанный с блоком. В зависимости от обеспеченной пользователем установки, атрибуты со значением могут или не может быть скопирован, когда блок вставлен в рисунок. Часто, приложение запрашивает пользователя относительно атрибута со значением во время выполнения.

Создавать запись таблицы блоков

1 Создают новую запись таблицы блоков.

2 Добавляют запись таблицы блоков на таблицу блоков.

3 Создают примитивы и добавляют их к записи таблицы блоков.

4 Создают определения атрибута, устанавливают их значения, и добавляют их к записи таблицы блоков.

Когда Вы закрываете запись таблицы блоков, блок начинает и блокирует конечные объекты,  добавлены к блоку автоматически.

Следующий пример создает новую запись таблицы блоков по имени ASDK-BLOCK-WITH-ATTR и добавляет это к таблице блоков. Затем это создает примитив круга и добавляет это к новой записи таблицы блоков. Это создает два примитива определения атрибута (второй - аналог первых) и добавляет в конец их к той же самой записи таблицы блоков.

void

defineBlockWithAttributes(

AcDbObjectId& blockId, // This is a returned value.

const AcGePoint3d& basePoint,

double textHeight,

double textAngle)

{



int retCode = 0;

AcDbBlockTable *pBlockTable = NULL;

AcDbBlockTableRecord* pBlockRecord = new AcDbBlockTableRecord;

AcDbObjectId entityId;

// Step 1: Set the block name and base point of the

// block definition.

//

pBlockRecord->setName("ASDK-BLOCK-WITH-ATTR");

pBlockRecord->setOrigin(basePoint);

// Open the block table for write.

//

acdbHostApplicationServices()->workingDatabase()

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


// Step 2: Add the block table record to block table.

//

pBlockTable->add(blockId, pBlockRecord);

// Step 3: Create a circle entity.

//

AcDbCircle *pCircle = new AcDbCircle;

pCircle->setCenter(basePoint);

pCircle->setRadius(textHeight * 4.0);

pCircle->setColorIndex(3);

// Append the circle entity to the block record.

//

pBlockRecord->appendAcDbEntity(entityId, pCircle);

pCircle->close();

// Step 4: Create an attribute definition entity.

//

AcDbAttributeDefinition *pAttdef

= new AcDbAttributeDefinition;

// Set the attribute definition values.

//

pAttdef->setPosition(basePoint);

pAttdef->setHeight(textHeight);

pAttdef->setRotation(textAngle);

pAttdef->setHorizontalMode(AcDb::kTextLeft);

pAttdef->setVerticalMode(AcDb::kTextBase);

pAttdef->setPrompt("Prompt");

pAttdef->setTextString("DEFAULT");

pAttdef->setTag("Tag");

pAttdef->setInvisible(Adesk::kFalse);

pAttdef->setVerifiable(Adesk::kFalse);

pAttdef->setPreset(Adesk::kFalse);

pAttdef->setConstant(Adesk::kFalse);

pAttdef->setFieldLength(25);

// Append the attribute definition to the block.

//

pBlockRecord->appendAcDbEntity(entityId, pAttdef);

// The second attribute definition is a little easier

// because we are cloning the first one.

//

AcDbAttributeDefinition *pAttdef2

= AcDbAttributeDefinition::cast(pAttdef->clone());

// Set the values that are specific to the

// second attribute definition.

//

AcGePoint3d tempPt(basePoint);

tempPt.y -= pAttdef2->height();

pAttdef2->setPosition(tempPt);

pAttdef2->setColorIndex(1); // Red

pAttdef2->setConstant(Adesk::kTrue);

// Append the second attribute definition to the block.

//

pBlockRecord->appendAcDbEntity(entityId, pAttdef2);

pAttdef->close();

pAttdef2->close();

pBlockRecord->close();

pBlockTable->close();

return;

}


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