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

         

Функция Утилиты Текстового поля


Функция acedTextBox () находит диагональные координаты поля, которое включает текстовый примитив. Функция берет параметр, ent, который должен определить текстовое определение или строковую группу в форме списка буфера результата. AcedTextBox() функция устанавливает ее p1 параметр в минимальные КООРДИНАТНЫЕ координаты поля и ее p2 параметра к максимальным КООРДИНАТНЫМ координатам.

Если текст горизонтален и не вращается, p1 (угол левой нижней части) и p2 (верхний правый угол) описывают поле ограничения текста. Координаты выражены в Системе координат Примитива (ECS) ent с началом координат (0,0) в левой оконечной точке опорной линии. (Начало координат - не угол левой нижней части, если текст содержит символы с подстрочными элементами, типа g и p.) Для примера, следующий рисунок показывает результатам применения acedTextBox () к текстовому примитиву с высотой 1.0. Рисунок также показывает опорной линии и началу координат текста.

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

Обратите внимание, что с вертикальными текстовыми стилями, точки все еще возвращаются в слева направо, заказ{*по приказу;порядок*} " основание к вершине ", так что первый список точки содержит отрицательные смещения от текстового начала координат.

AcedTextBox () функция может также измерять строки в attdef и attrib примитивах. Для attdef, acedTextBox () измеряет строку отметки (группа 2); для attrib примитива, это измеряет текущее значение (группа 1).

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

ОБРАТИТЕ ВНИМАНИЕ На выборку tbox () функциональные работы правильно только, если Вы - в настоящее время в Мировой системе координат (WCS). Если Вы - не, код должен преобразовать точки ECS, восстановленные{*отысканные*} из примитива в координаты UCS, используемые acedCommand (). См. “ Преобразования Системы координат ” на странице 271.


int tbox()

{

ads_name tname;

struct resbuf *textent, *tent;

ads_point origin, lowleft, upright, p1, p2, p3, p4;

ads_real rotatn;





char rotatstr[15];

if (acedEntSel("\nSelect text: ", tname, p1) != RTNORM) {

acdbFail("No Text entity selected\n");

return BAD;

}

textent = acdbEntGet(tname);

if (textent == NULL) {

acdbFail("Couldn’t retrieve Text entity\n");

return BAD;

}

tent = entitem(textent, 10);

origin[X] = tent->resval.rpoint[X]; //ECS coordinates

origin[Y] = tent->resval.rpoint[Y];

tent = entitem(textent, 50);

rotatn = tent->resval.rreal;

// acdbAngToS() converts from radians to degrees.

if (acdbAngToS(rotatn, 0, 8, rotatstr) != RTNORM) {

acdbFail("Couldn’t retrieve or convert angle\n");

acutRelRb(textent);

return BAD;

}

if (acedTextBox(textent, lowleft, upright) != RTNORM) {

acdbFail("Couldn’t retrieve text box

coordinates\n");

acutRelRb(textent);

return BAD;

}

acutRelRb(textent);

// If not currently in the WCS, at this point add

// acedTrans() calls to convert the coordinates

// retrieved from acedTextBox().

p1[X] = origin[X] + lowleft[X]; // UCS coordinates

p1[Y] = origin[Y] + lowleft[Y];

p2[X] = origin[X] + upright[X];

p2[Y] = origin[Y] + lowleft[Y];

p3[X] = origin[X] + upright[X];

p3[Y] = origin[Y] + upright[Y];

p4[X] = origin[X] + lowleft[X];

p4[Y] = origin[Y] + upright[Y];

if (acedCommand(RTSTR, "pline", RTPOINT, p1,

RTPOINT, p2, RTPOINT, p3,RTPOINT, p4, RTSTR, "c",

0) != RTNORM) {

acdbFail("Problem creating polyline\n");

return BAD;

}

if (acedCommand(RTSTR, "rotate", RTSTR, "L", RTSTR, "",

RTPOINT, origin, RTSTR, rotatstr, 0) != RTNORM) {

acdbFail("Problem rotating polyline\n");

return BAD;

}

return GOOD;

}

Предшествующий пример использует команду ROTATE AutoCAD, чтобы вызвать вращение. Более прямой способ делать это состоит в том, чтобы включить вращение в вычисление точек поля, следующим образом:

ads_real srot, crot;

tent = entitem(textent, 50);

rotatn = tent->resval.rreal;

srot = sin(rotatn);

crot = cos(rotatn);

.

.

.

p1[X] = origin[X] + (lowleft[X]*crot - lowleft[Y]*srot);

p1[Y] = origin[Y] + (lowleft[X]*srot + lowleft[Y]*crot);

p2[X] = origin[X] + (upright[X]*crot - lowleft[Y]*srot);

p2[Y] = origin[Y] + (upright[X]*srot + lowleft[Y]*crot);

p3[X] = origin[X] + (upright[X]*crot - upright[Y]*srot);

p3[Y] = origin[Y] + (upright[X]*srot + upright[Y]*crot);

p4[X] = origin[X] + (lowleft[X]*crot - upright[Y]*srot);

p4[Y] = origin[Y] + (lowleft[X]*srot + upright[Y]*crot);


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