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

       

Текст


Пример в этом разделе показывает использование 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;

}


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