pNewPline->close();

}

Выполнение итераций через Вершину в Ломаной линии

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

// Принимает объект ID AcDb2dPolyline, открывает это, и получает вершину iterator.

// Это тогда выполняет итерации через вершину, распечатывая местоположение вершины.

void

iterate(AcDbObjectId plineId)

{

AcDb2dPolyline *pPline;

acdbOpenObject(pPline, plineId, AcDb::kForRead);

AcDbObjectIterator *pVertIter= pPline->vertexIterator();

pPline->close(); // Finished with the pline header.

AcDb2dVertex *pVertex;

AcGePoint3d location;

AcDbObjectId vertexObjId;

for (int vertexNumber = 0; !pVertIter->done();

vertexNumber++, pVertIter->step())

{

vertexObjId = pVertIter->objectId();

acdbOpenObject(pVertex, vertexObjId,

AcDb::kForRead);

location = pVertex->position();

pVertex->close();

acutPrintf("\nVertex #%d’s location is"

" : %0.3f, %0.3f, %0.3f", vertexNumber,

location[X], location[Y], location[Z]);

}

delete pVertIter;

}

Доступ к Системе координат

Функции Примитива восстанавливают{*отыскивают*} и устанавливают значение координат, используя значения Мировой системы координат. Единственное исключение к этому правилу - AcDb2dPolylineVertex класс, описанный позже в этом разделе, который использует Систему координат Примитива (ECS) значения. Например, если Вы вызываете getCenter () функция на круге, AutoCAD возвращает X, Y центр круга в мировых координатах.

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

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

Если Вы определяете ваш собственный примитив, может быть полезно сохранить его геометрические конструкции (точки, углы, и векторы) в терминах его собственной относительной системы координат. Например, дуги устанавливают систему координат, в которой Z ось является перпендикулярной на план дуги. Средняя точка дуги возвращена в мировых координатах, но начало и конечные углы может только интерпретироваться относительно его ECS. В таких случаях, осуществьте getEcs () функция, чтобы возвратить матрицу, которая используется, чтобы преобразовать примитив от его Системы Координаты Примитива до Мировой системы координат. Если примитив не определен в терминах его собственной Системы координат Примитива, то getEcs () функция возвращает единичную матрицу. (Другими словами, любое время getEcs примитива () функция возвращает единичную матрицу, Вы можете предполагать, что примитив определен в терминах мировых координат.)

В AutoCAD, плоские примитивы имеют ECS; трехмерные примитивы делают нет. Примитивы AutoCAD, которые могут возвращать матрицу нетождеств для их getEcs () функция:

§  Измерения

§  Текст

§  Круги

§  Дуги

§  2-ые ломаные линии

§  Блочные вставки

§  Точки

§  Следы

§  Solids

§  Формы

§  определения Атрибута

§  Атрибуты

AcDb2dPolylineVertex

AcDb2dPolyline имеет как повышение и ряд X, Y точки класса AcDb2dPolylineVertex. Позиция () и setPosition () функции AcDb2dPolylineVertex определяет трехмерные местоположения в ECS. Координата Z прошла в к setPosition () функция сохранена в примитиве и возвращена позицией () функция, но иначе игнорируется. Это не затрагивает повышение ломаной линии.

AcDb2dPolyline класс обеспечивает vertexPosition () функцией, которая возвращается, значение Мировой системы координат для вершины прошло в. Единственный способ изменять{*заменять*} повышение ломаной линии использует AcDb2dPolyline:: setElevation () функция.

Функции Кривой

Абстрактный класс AcDbCurve обеспечивает множество функций для действия на кривых, включая функции для проектирования, распространения{*продления*}, и кривых смещения, также как набора функций для запроса параметров кривой. Кривые могут быть определены или в пространстве{*пробеле*} параметра или в Декартовом координатном пространстве. Трехмерная кривая - функция одного параметра (f (t)), в то время как трехмерная поверхность - функция двух параметров (f (u, v)). Конверсионные функции позволяют Вам конвертировать{*преобразовывать*} данные от его представления параметра до точек в Декартовой системе координат.

Сплайны, например, являются лучшими представленными в пространстве{*пробеле*} параметра. Чтобы разбивать сплайн на три равных части, Вы сначала находите параметры, которые соответствуют точкам сплайна и затем работают на сплайне в пространстве{*пробеле*} параметра.

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

Вы можете проектировать кривую на план в данном направлении, как показано в следующем примере.

// Accepts an ellipse object ID, opens the ellipse, and uses

// its getOrthoProjectedCurve member function to create a

// new ellipse that is the result of a projection onto the

// plane with normal <1,1,1>. The resulting ellipse is

// added to the model space block Table Record.

//

void

projectEllipse(AcDbObjectId ellipseId)

{

AcDbEllipse *pEllipse;

acdbOpenObject(pEllipse, ellipseId, AcDb::kForRead);

// Now project the ellipse onto a plane with a

// normal of <1, 1, 1>.

//

AcDbEllipse *pProjectedCurve;

pEllipse->getOrthoProjectedCurve(AcGePlane(

AcGePoint3d::kOrigin, AcGeVector3d(1, 1, 1)),

(AcDbCurve*&)pProjectedCurve);

pEllipse->close();

AcDbObjectId newCurveId;

addToModelSpace(newCurveId, pProjectedCurve);

}

// Accepts an ellipse object ID, opens the ellipse, and uses

// its getOffsetCurves() member function to create a new

// ellipse that is offset 0.5 drawing units from the

// original ellipse.

//

void

offsetEllipse(AcDbObjectId ellipseId)

{

AcDbEllipse *pEllipse;

acdbOpenObject(pEllipse, ellipseId, AcDb::kForRead);

// Now generate an ellipse offset by 0.5 drawing units.

//

AcDbVoidPtrArray curves;

pEllipse->getOffsetCurves(0.5, curves);

pEllipse->close();

AcDbObjectId newCurveId;

addToModelSpace(newCurveId, (AcDbEntity*)curves[0]);

}

Соединение Гиперсвязей с примитивами

ObjectARX позволяет Вам связывать гиперсвязи с примитивами, используя классы AcDbHyperlink, AcDbHyperlinkCollection, и AcDbEntityHyperlinkPE. Гиперсвязь может быть URL или адрес не-сети типа местного файла. Вы можете прикреплять, рассматривать, редактировать, и перечислять гиперсвязи в пределах вашего приложения.

Краткий обзор классов гиперсвязи следует, но для законченной информации относительно классов и их методов, см. ObjectARX Ссылку.

AcDbHyperlink Класс

Объект AcDbHyperlink содержит имя гиперсвязи (например, http://www. ), подместоположение в пределах той связи{*ссылки*}, описание гиперсвязи или дружественное имя (“ Нажимает в этом месте для Autodesk ”), и строки дисплея для гиперсвязи. Для AutoCAD, подместоположение - названное представление{*вид*}, в то время как в приложении электронной таблицы, например, подместоположение могло бы быть ячейка или группа ячеек. Строка дисплея - обычно тот же самый как описание гиперсвязи.

Если описание нулевое{*пустое*}, имя гиперсвязи и подместоположение используется вместо этого, в “ имя - подместоположение ” формат.

Гиперсвязи могут также иметь уровни вложенности. Уровень вложенности только представляет интерес когда имеющий дело с коллекциями гиперсвязи, связанными с примитивом в пределах блока, или с коллекциями, связанными с примитивом ВСТАВКИ.

AcDbHyperlinkCollection Класс

Этот класс - коллекция объектов AcDbHyperlink, и имеет разнообразие методов для добавления и удаления тех объектов. AcDbHyperlinkCollection удаляет его содержание, когда они удалены, и когда объект самой коллекции удален. Гиперсвязи в коллекции пронумерованы от нуля.

AcDbEntityHyperlinkPE Класс

Методы AcDbEntityHyperlinkPE класса позволяют Вам устанавливать, получать, и считать гиперсвязи, связанные с примитивом.

Пример Гиперсвязи

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

void AddHyperlink()

{

ads_name en;

ads_point pt;

AcDbEntity * pEnt;

AcDbObjectId pEntId;

// Prompt user to select entity.

acedEntSel("\nSelect an Entity: ", en, pt);

// Get Object id.

acdbGetObjectId(pEntId, en);

// Open object for write.

acdbOpenObject(pEnt, pEntId, AcDb::kForWrite);

// The hyperlink collection object is created inside

// of getHyperlinkCollection

// below. It is our responsibility to delete it.

AcDbHyperlinkCollection * pcHCL = NULL;

// Get the hyperlink collection associated with the entity.

ACRX_X_CALL(pEnt, AcDbEntityHyperlinkPE)->

getHyperlinkCollection(pEnt, pcHCL, false, true);

// If a hyperlink exists already, say so.

if (pcHCL->count() != 0)

{

AcDbHyperlink * pcHO;

acutPrintf("\nThe following hyperlink info already exists

on this entity:");

// Iterate through collection and print existing hyperlinks.

int i = 0;

for (i = 0; i < pcHCL->count(); i++)

{

// Get point to current hyperlink object.

pcHO = pcHCL->item(i);

acutPrintf("\nHyperlink name: %s", pcHO->name());

acutPrintf("\nHyperlink location: %s",

pcHO->subLocation());

acutPrintf("\nHyperlink description: %s",

pcHO->description());

}

acutPrintf("\n** All will be replaced.**");

// Remove existing hyperlinks from collection.

// RemoveAt will delete objects too.

for (i = pcHCL->count() - 1; i >= 0; i--)

{

pcHCL->removeAt(i);

}

}

// Get new hyperlinks for this entity.

for (;;)

{

acutPrintf("\nEnter null name, location, and description to

terminate input requests.");

// Prompt user for name and description.

char sName[100], sLocation[100], sDescription[100];

if (acedGetString(TRUE, "\nEnter hyperlink name: ", sName) != RTNORM)

acutPrintf("Invalid input\n");

if (acedGetString(TRUE, "\nEnter hyperlink location: ", sLocation) != RTNORM)

Из за большого объема этот материал размещен на нескольких страницах:
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