Функция Утилиты Текстового поля
Функция 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);