break;

case RTNONE:

case RTCAN:

return;

default:

continue;

} // switch

break;

} //for (;;)

AOK(ent->close());

AOK(ent2->close());

return;

}

Расчленение примитивов

Некоторые примитивы могут взрываемся, или анализир{*расчленен*}, в набор более простых элементов.

Определенное поведение зависит от класса. Например, поля могут взрываемся в области{*регионы*}, затем выравнивают. Ломаные линии могут взрываемся в доли строки. Mtext примитив может вз в отдельный текстовый примитив для каждой строки первоначального объекта. Mline примитив может вз в индивидуальные строки. Когда Вы взрываете блочную ссылку{*справочники*}, AutoCAD копирует все примитивы в блочной ссылке{*справочниках*} и затем разбивает их на их компоненты.

Взрывающийся () функция создает массив объектов, полученных из AcDbEntity.

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

Взрыв примитивов

Entity

By Itself

Nonuniform Scaling

(when in a block)

AcDb3dSolid

Regions, bodies

NA; can’t be exploded

AcDbBody

Regions, bodies

NA

Ac2dDbPolyline

Lines, arcs

Self/NA

Ac3dPolyline

Lines

Self

AcDbArc

Self

Ellipse

AcDbCircle

Self

Ellipse

AcDbDimension

Solids, lines, text, strings, points

NA

AcDbEllipse

Self

Self

AcDbLeader

Self

NA

AcDbLine

Self

Self

AcDbRay

Self

Self

AcDbSpline

Self

Self

AcDbXline

Self

Self

AcDbFace

Self

Self

AcDbMline

Lines

Self

AcDbMText

One text entity for each line

Self

AcDbPoint

Self

Self

AcDbPolyFaceMesh

AcDbFace

Self

AcDbPolygonMesh

Self

Self

AcDbRegion

Curves (splines, lines,

arcs, circles)

NA

AcDbShape

Self

Self

AcDbSolid

Self

Self

AcDbText

Self

Self

AcDbTrace

Self

Self

Explode() - функция только для чтения, которая не изменяет первоначальный примитив. Это возвращает набор примитивов для приложения, чтобы обработать как желательно. Одно потенциальное использование этой функции должно взорвать сложный примитив, чтобы произвести более простые примитивы и затем работать на тех примитивах. Например, если Вы осуществляли intersectForPoints () функция для ломаной линии, могло бы быть проще имеет дело с индивидуальные части ломаной линии скорее чем законченный примитив.

НЕ нашли? Не то? Что вы ищете?

Следующие инструкции истинны для команды EXPLODE (но не для функции explode ()):

§  Визуальное появление{*вид*} постоянный.

§  взрываемый примитив стерт от базы данных.

§  Одни или более новые примитивы созданы и добавлены в конец к базе данных.

Создание Образцов Примитивов AutoCAD

Этот раздел демонстрирует, как создать простые и сложные примитивы и добавлять их к базе данных. Это также иллюстрирует создание простого примитива, простого блока, блок с атрибутами, и блочной вставкой (блочная ссылка{*справочники*}).

Создание Простого Примитива

Следующий пример демонстрирует создание строки и добавления в конец этого к образцовому пространственному блочному отчету{*записи*} таблицы, как описано в главе 2, “ Учебник для начинающих Базы данных. ”

AcDbObjectId

createLine()

{

AcGePoint3d startPt(4.0, 2.0, 0.0);

AcGePoint3d endPt(10.0, 7.0, 0.0);

AcDbLine *pLine = new AcDbLine(startPt, endPt);

AcDbBlockTable *pBlockTable;

acdbHostApplicationServices()->workingDatabase()

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

AcDbBlockTableRecord *pBlockTableRecord;

pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,

AcDb::kForWrite);

pBlockTable->close();

AcDbObjectId lineId;

pBlockTableRecord->appendAcDbEntity(lineId, pLine);

pBlockTableRecord->close();

pLine->close();

return lineId;

}

Создание записи простой таблицы блока

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

void

makeABlock()

{

// Create and name a new block table record.

//

AcDbBlockTableRecord *pBlockTableRec

= new AcDbBlockTableRecord();

pBlockTableRec->setName("ASDK-NO-ATTR");

// Get the block table.

//

AcDbBlockTable *pBlockTable = NULL;

acdbHostApplicationServices()->workingDatabase()

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

// Add the new block table record to the block table.

//

AcDbObjectId blockTableRecordId;

pBlockTable->add(blockTableRecordId, pBlockTableRec);

pBlockTable->close();

// Create and add a line entity to the component’s

// block record.

//

AcDbLine *pLine = new AcDbLine();

AcDbObjectId lineId;

pLine->setStartPoint(AcGePoint3d(3, 3, 0));

pLine->setEndPoint(AcGePoint3d(6, 6, 0));

pLine->setColorIndex(3);

pBlockTableRec->appendAcDbEntity(lineId, pLine);

pLine->close();

pBlockTableRec->close();

}

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

Блок 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);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132