edgeData. setColors(pEdgeColorArray);

// Apply visibility to edges and make the common edge

// between two faces have silhouette visibility during

// the HIDE command with AutoCAD variable DISPSILH = 1.

//

Adesk::UInt8 *pEdgeVisArray

= new Adesk::UInt8[numEdges];

edgeData. setVisibility(pEdgeVisArray);

pEdgeVisArray[0] = kAcGiVisible;

pEdgeVisArray[1] = kAcGiVisible;

pEdgeVisArray[2] = kAcGiSilhouette;

pEdgeVisArray[3] = kAcGiSilhouette;

pEdgeVisArray[4] = kAcGiVisible;

pEdgeVisArray[5] = kAcGiVisible;

// Apply colors to faces.

//

AcGiFaceData faceData;

int numFaces = 2;

short *pFaceColorArray = new short[numFaces];

pFaceColorArray[0] = kBlue;

pFaceColorArray[1] = kRed;

faceData. setColors(pFaceColorArray);

pW->geometry().shell(numVerts, pVerts, faceListSize,

pFaceList, &edgeData, &faceData);

delete [] pVerts;

delete [] pFaceList;

delete [] pEdgeColorArray;

delete [] pFaceColorArray;

return Adesk::kTrue;

}

Объект AcGiVertexData содержит единственный флажок, который определяет, как вершина в оболочке упорядочивается. Этот флажок установлен и делается запрос со следующими функциями:

virtual void

AcGiVertexData::setOrientationFlag(AcGiOrientationType oflag);

virtual AcGiOrientationType

AcGiVertexData::orientationFlag() const;

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

§  kAcGiClockwise

§  kAcGiCounterClockwise

§  kAcGiNoOrientation

Ориентация вершины в списке лица оболочки указывает видимую сторону лица. Например, если вершина определена как, по часовой стрелке и вершина для данного лица перечислена в по часовой стрелке порядке, то то лицо видимо. В этом случае, лица с вершиной в против часовой стрелки порядке невидимы.

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

Дуга

CircularArc () функция имеет две формы:

virtual Adesk::Boolean

AcGiWorldGeometry::circularArc(

const AcGePoint3d& center,

const double radius,

const AcGeVector3d& normal,

const AcGeVector3d& startVector,

const double sweepAngle,

const AcGiArcType arcType = kAcGiArcSimple) const = 0;

virtual Adesk::Boolean

AcGiWorldGeometry::circularArc(

const AcGePoint3d& start,

const AcGePoint3d& point,

const AcGePoint3d& end,

const AcGiArcType arcType = kAcGiArcSimple) const = 0;

Переменная типа дуги, AcGiArcType, может иметь одно из следующих значений:

§  kAcGiArcSimple Дуга непосредственно, которая - не fillable

§  kAcGiArcSector Область, ограниченная дугой и ее центром искривления

§  kAcGiArcChord Область, ограниченная дугой и ее конечными точками

Полилиния

Pline () функция позволяет заказному примитиву рисовать графические примитивы, использующие AcDbPolyline как шаблон:

virtual Adesk::Boolean pline(

const AcDbPolyline& lwBuf,

Adesk::UInt32 fromIndex = 0,

Adesk::UInt32 numSegs = 0) const;

AcDbPolylines мультисегментированы и поддерживают прямо и изогнутые доли с или без ширины. Использование pline () обеспечивает способность генерировать смежные прямые и изогнутые доли с шириной. Ни один из других AcGi примитивных функций не поддерживает ширину, так без того, чтобы использовать pline () было бы необходимо генерировать много параллельных дуги и доли линии, чтобы моделировать заполненную дугу или долю линии с шириной. Это - неэффективный, и надлежащий дисплей, зависим от вида (усиление).

Текст

Пример в этом разделе показывает использование AcGiTextStyle класса. Это рисует прямоугольник вокруг части текста AcGi, который может ориентироваться и расположен где-нибудь в пространстве.

Нормаль и векторы направления текста должны быть перпендикулярны к друг другу. Если вы неуверены из направлений, полагаете, что направление будет по X оси и нормали по Z оси в правосторонней координатной системе.

Вычислите Y ось от них. Тогда векторное произведение Y оси к Z оси даст Вам интерпретацию нормального плана направления. Убедитесь, что направление не выровнено с нормалью, или Вы не будете иметь направления относительно нормали.

AcGiTextStyle:: loadStyleRec () функция загружает шрифт, если это уже не загружено. (Функция This не загружает ACAD СТИЛЬ.) Его возвращаемые значения следующие:

0x10 Другой файл (не FONTALT) открытый на месте имени файла BigFont

0x08 Другой файл (не FONTALT) открытый на месте имени файла

0x04 имя файла BigFont не сумел быть загруженным

0x02 Имя файла не сумел быть загруженным

0x01 Файлы открылся как запрашивается

Текст может масштабироваться способом путей. Используйте AcGiTextStyle:: setTextSize () чтобы масштабировать ширину и высоту текста в то же самое время. Используйте setXScale () чтобы масштабировать ширину текста. Используйте setTrackingPercent () чтобы определить, как символы специфического шрифта помещены рядом с друг другом. Если Вы определяете значение 1.0, интервал не изменяется; если Вы определяете меньше чем 1.0, символы сожмут вместе; и если это - больше чем 1.0, символы, будут дальше обособленно. Этот пример устанавливает трэкинг процент к значению.80.

AcGiTextStyle::extents () функция возвращает размер мировой координаты поля ограничения текста. Если penups параметр - kTrue, то любые нерисовавшие перьевые шаги, сделанные, в то время как пользователь рисовал текст, будут включены в поле ограничения. Необработанная опция сообщает вычислению игнорировать обработку управляющего кода (так, чтобы “%%%” не интерпретировался бы как единственный знак процента, но как три знака процента).

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

Adesk::Boolean

AsdkTextStyleSamp::worldDraw(AcGiWorldDraw* pW)

{

AcGePoint3d pos(4.0, 4.0, 0.0);

AcGeVector3d norm(0.0, 0.0, 1.0);

AcGeVector3d dir(-1.0, -0.2, 0.0);

char *pStr = "This is a percent, ’%%%’.";

int len = strlen(pStr);

AcGiTextStyle style;

AcGeVector3d vec = norm;

vec = vec. crossProduct(dir);

dir = vec. crossProduct(norm);

style. setFileName("txt. shx");

style. setBigFontFileName("");

int status;

if (!((status = style. loadStyleRec()) & 1))

pStr = "Font not found.";

pW->geometry().text(pos, norm, dir, pStr, len,

Adesk::kFalse, style);

pos. y += 2.0;

style. setTrackingPercent(80.0);

style. setObliquingAngle(10.0);

AcGePoint2d ext = style. extents(pStr, Adesk::kFalse,

strlen(pStr), Adesk::kFalse);

pW->geometry().text(pos, norm, dir, pStr, len,

Adesk::kFalse, style);

// Draw a rectangle around the last text drawn.

// First, create a polyline the size of the

// bounding box. Then, transform it to the

// correct orientation, and then to the location of the

// text.

// Compute the matrix that orients the box.

//

AcGeMatrix3d textMat;

norm. normalize();

dir. normalize();

AcGeVector3d yAxis = norm;

yAxis = yAxis. crossProduct(dir);

yAxis. normalize();

textMat. setCoordSystem(AcGePoint3d(0.0, 0.0, 0.0), dir, yAxis, norm);

// Create the bounding box and enlarge it a little.

//

double offset = ext. y / 2.0;

AcGePoint3d verts[5];

verts[0] = verts[4] = AcGePoint3d(-offset, - offset, 0.0);

verts[1] = AcGePoint3d(ext. x + offset, - offset, 0.0);

verts[2] = AcGePoint3d(ext. x + offset, ext. y + offset, 0.0);

verts[3] = AcGePoint3d(-offset, ext. y + offset, 0.0);

// Orient and then translate each point in the

// bounding box.

//

for (int i = 0; i < 5; i++) {

verts[i].transformBy(textMat);

verts[i].x += pos. x;

verts[i].y += pos. y;

verts[i].z += pos. z;

}

pW->geometry().polyline(5, verts);

return Adesk::kTrue;

}

Соединение AcDbTextStyleTableRecord с AcGiTextStyle

Имеются несколько глобальных сервисных функций, доступные, чтобы копировать текстовые данные стиля от AcDbTextStyleTableRecord до AcGiTextStyle, и наоборот.

Следующие функции используют объект ID AcDbTextStyleTableRecord и ссылки к AcGiTextStyle, чтобы идентифицировать эти два вовлеченные объекта:

Acad::ErrorStatus

fromAcDbTextStyle(

AcGiTextStyle& textStyle,

const AcDbObjectId& AcDbStyleId);

Acad::ErrorStatus

toAcDbTextStyle(

const AcDbObjectId AcDbStyleId,

AcGiTextStyle& textStyle);

Следующие функции используют имена AcDbTextStyleTableRecord и AcGiTextStyle:

Acad::ErrorStatus

fromAcDbTextStyle(

AcGiTextStyle& textStyle,

const char* AcDbStyleName);

Acad::ErrorStatus

toAcDbTextStyle(

AcGiTextStyle& textStyle);

Acad::ErrorStatus

toAcDbTextStyle(

AcGiTextStyle& textStyle,

const char* AcDbStyleName);

При копировании данных к или от AcDbTextStyleTableRecord, который был определен по имени, имя объекта AcGiTextStyle установлено, чтобы соответствовать имени AcDbTextStyleTableRecord. Если никакая запись не найдена при копировании к AcDbTextStyleTableRecord, указанному по имени, то каждый создан.

При копировании от AcGiTextStyle до AcDbTextStyleTableRecord и имени AcGiTextStyle используется как имя AcDbTextStyleTableRecord, если AcGiTextStyle не имеет имени, уникальное имя сгенерировано и используется как имя для объектов AcGiTextStyle и AcDbTextStyleTableRecord.

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

Acad::ErrorStatus

toAcDbTextStyle(

AcGiTextStyle& textStyle,

AcDbObjectId& AcDbStyleId);

Acad::ErrorStatus

toAcDbTextStyle(

AcGiTextStyle& textStyle,

const char* AcDbStyleName,

AcDbObjectId& AcDbStyleId);

Использование Drawables в Вашем Объекте

В дополнение к предопределенным примитивам, Вы можете усиливать абстрактные объекты в вашем worldDraw () и viewportDraw () выполнение. Любой объект, который поддерживает AcGiDrawable протокол, может использоваться как под-объект. С тех пор AcDbObject происходит от AcGiDrawable, любой объект базы данных может использоваться таким образом, если это имеет смысл.

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