//

if (area. x > 0.0) {

// Print out the number of pixels along the

// Y-axis of the unit square used in

// getNumPixelsInUnitSquare.

//

AcGeVector3d norm(0.0, 0.0, 1.0);

AcGeVector3d dir(1.0, 0.0, 0.0);

char buf[100];

sprintf(buf, "%7.3lf", area. y);

pV->geometry().text(center, norm, dir, 1.0, 1.0, 0.0, buf);

// Draw a circle that depends on how big the circle

// is in the viewport. This requires

// figuring out the fewest number of segments needed

// by a polyline so that it doesn’t look segmented.

//

// The worldDraw() and viewportDraw() of

// an entity in a viewport are only called during a

// regen and not necessarily during a ZOOM or PAN.

// The reason is that a regen produces something

// akin to a very high resolution image internally,

// which AutoCAD can zoom in or pan around. That is,

// until you get too close to this image or any of

// its edges, at which point a regen is internally

// invoked for that viewport and a new internal

// image is created (ready to be mildly zoomed and

// panned).

//

double radius = 0.5;

double half_pixel_hgt = 2.0 / area. x; // In WCS

int num_segs = 8;

double angle = two_pi / num_segs;

if (half_pixel_hgt > radius / 2) {

// The circle is approximately the same or less

// than the size of a pixel. So, generate a very

// small octagon.

//

num_segs = 8;

} else {

// Given a circle centered at the origin of a

// given radius in the XY-plane, and given a

// vertical line that intersects the X-axis at

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

// ’radius - half a pixel’, what is the angle

// from the X-axis of a line segment from the

// origin to the point where the vertical line

// and the circle intersect? Two pi divided by

// this angle gives you a minimum number of

// segments needed by a polyline to look like

// a circle and not be able to differentiate

// the individual segments because the visual

// differences are less than the size of a

// pixel. (This is not the only way to figure

// this out but it’s sufficient.)

//

angle = acos((radius - 1.0 / (area. x / 2.0)) / radius);

double d_num_segs = two_pi / angle;

// Limit the number of segments from 8 to

// 128 and use whole numbers for

// this count.

//

if (d_num_segs < 8.0) {

num_segs = 8;

} else if (d_num_segs > 128.0) {

num_segs = 128;

} else {

num_segs = (int)d_num_segs;

}

}

// Calculate the vertices of the polyline from the

// start, around the circle, and back to the start

// to close the polyline.

//

angle = 0.0;

double angle_inc = two_pi / (double)num_segs;

AcGePoint3d* verts = new AcGePoint3d[num_segs + 1];

for (int i = 0; i <= num_segs; i++, angle += angle_inc)

{

verts[i].x = center. x + radius * cos(angle);

verts[i].y = center. y + radius * sin(angle);

verts[i].z = center. z;

}

pV->geometry().polyline(num_segs + 1, verts);

delete [] verts;

}

}

Использование Границ Обрезки в AcGi

ObjectARX позволяет Вам определять границу отсечения для геометрии, содержащейся в пределах таблиц перекрестных ссылок и блоков. Часть границы обрезки AcGi API позволяет составные объекты (блоки и объекты, которые ведут себя подобно блокам) чтобы выразить эти границы обрезки AcGi выполнению.

В течение worldDraw () или viewportDraw () любой drawable может определить многоугольную границу обрезки, чтобы отсечь ее графику. Следующие разделы описывают, как использовать эту особенность API.

Подготовка

Границы Обрезки закрыты, не-самопересекающиеся, вогнутые 2-ые многоугольники.

Необязательная передняя сторона и назад Z отсекающие значения может быть назначена. Граница обрезки выражена в произвольной системе координат относительно отсекаемых объектов.

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

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

Пример отсечения границ

В следующем примере, граница обрезки помещена на стек границы обрезки прежде, чем что - нибудь рисует и вытолкнуто от снова, как только рисунок в этот объект полон:

Adesk::Boolean

MyObject::worldDraw(AcGiWorldDraw* pDraw)

{

AcGiWorldGeometry * pGeom = &pDraw->geometry();

pGeom->pushModelTransform(myTransform());

AcGiClipBoundary cb;

cb. m_bDrawBoundary= true;

cb. m_vNormal = AcGeVector3d::kZAxis;

cb. m_ptPoint = AcGePoint3d::kOrigin;

// Two points treated as a rectangle, three creates a triangle

cb. m_aptPoints. append(AcGePoint2d(0,0));

cb. m_aptPoints. append(AcGePoint2d(5,5));

// We are clipping in our own space

cb. m_xToClipSpace. setToIdentity();

cb. m_xInverseBlockRefXForm = myTransform().inverse();

// No Z clipping

cb. m_bClippingBack = cb. m_bClippingFront = false;

cb. m_dFrontClipZ = cb. m_dBackClipZ = 0.;

Adesk::Boolean bPopClipBoundary = pGeom->pushClipBoundary(&cb);

// Draw something

pGeom->circle(...);

pGeom->popModelTransform();

if(bPopClipBoundary){ pGeom->popClipBoundary(); }

return true; // world-only

}

Так как это отсечение - комплексная операция, некоторые AcGi выполнение не могли бы поддерживать это полностью. В этом случае, AcGi выполнение может возвращать ложь от pushClipBoundary (), и Вы не должны вызвать popClipBoundary ().

Глава 27. Использование Библиотеки Геометрии

Эта глава обсуждает основные использования AcGe библиотеки, которая обеспечивает множество классов для представления 2-ой и трехмерной геометрии. Эта библиотека предназначена для использования любым приложением Autodesk и часто используется AcDb и AcGi библиотеками в ObjectARX.

§  Краткий обзор AcGe Библиотеки

§  Использование Основных Типов Геометрии

§  Использование Линии и Классов Плана

§  Параметрическая Геометрия

§  Специальные Классы Оценки

§  Постоянные AcGe примитивы

Краткий обзор AcGe Библиотеки

AcGe библиотека включает широкий набор классов для представления обычно используемая геометрия, типа точек, линий, кривых, и поверхностей. Это обеспечивает общее представление для геометрии, которая может использоваться любым приложением Autodesk. Библиотека вполне математическая; хотя его классы не имеют дело непосредственно с базой данных или с графикой, многие из его классов используются AcDb и AcGi библиотеками.

Иерархия классов для AcGe библиотеки показывается следующим образом:

AcGe библиотека обеспечивает, и простые и комплексные классы геометрии. Простые линейные классы алгебры включают точку, вектор, матрицу, 2-ые и трехмерные линейные классы примитива, и плоские классы примитива. Комплексные классы включают классы кривой, типа сплайнового примитива, и поверхностных классов, типа поверхностей НЕОДНОРОДНОГО РАЦИОНАЛЬНОГО В-СПЛАЙНА.

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

Библиотека включает множество основных типов, типа AcGePoint3d, AcGeVector3d, и AcGeMatrix3d, которые имеют общественные компоненты данных для быстрого и эффективного доступа. Эти простые классы обычно используются другими библиотеками также как классами AcGe, полученными из AcGeEntity2d и AcGeEntity3d.

Контроль соответствия типов Во время выполнения предусмотрен все классы, полученные из AcGeEntity2d и AcGeEntity3d. Каждый класс обеспечивает type() функцией, которая возвращает класс объекта и isKindOf () функция, которая возвращается, имеет ли объект специфический класс (или класс, полученный из того класса).

Два примитива рассматриваются равными, если они имеют тот же самый тип и представляют то же самое точечное множество. Кривые и поверхности рассматриваются равными только, если их параметризация - тот же самый.

Глобальные данные и функции

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

Глобальные идентификаторы и файлы заголовка

Файл Заголовка

Глобальные Определенные Функции

gepnt2d. h

AcGePoint2d::kOrigin

gemat2d. h

AcGeMatrix2d::kIdentity

gevec2d. h

AcGeVector2d::kIdentity

AcGeVector2d::kXAxis

AcGeVector2d::kYAxis

geline2d. h

AcGeLine2d::kXAxis

AcGeLine2d::kYAxis

gepnt3d. h

AcGePoint3d::kOrigin

gemat3d. h

AcGeMatrix3d::kIdentity

gevec3d. h

AcGeVector3d::kIdentity

AcGeVector3d::kXAxis

AcGeVector3d::kYAxis

AcGeVector3d::kZAxis

geline3d. h

AcGeLine3d::kXAxis

AcGeLine3d::kYAxis

AcGeLine3d::kZAxis

geplane. h

AcGePlane::kXYPlane

AcGePlane::kYZPlane

AcGePlane::kXZPlane

gegbl. h

AcGeContext::gOrthoVector()

AcGeContext:: gOrthoVector - указатель на функцию что, учитывая вектор, вычисляет произвольный вектор, который является перпендикулярным к этому. Вы можете заменять вашу собственную функцию на данную функцию.

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