ОБРАТИТЕ ВНИМАНИЕ В отличие от acedOsnap (), функции в этой группе просто вычисляют точку, линию, или угловые значения, и фактически не сделают запрос текущего рисунка.
Следующий типовой кодовый фрагмент показывает некоторый простой, вызывает к геометрическим сервисным функциям.
ads_point pt1, pt2;
ads_point base, endpt;
ads_real rads, length;
.
. // Инициализирует pt1 и pt2.
.
// Возвратить угол в КООРДИНАТНОМ плане текущих ВЕРХНИХ РЕГИСТРОВ, в радианах.
rads = acutAngle (pt1, pt2);
// Расстояние Возвращения в трехмерном пространстве{*пробеле*}.
length = acutDistance (pt1, pt2);
base [X] = 1.0; base [Y] = 7.0; base [Z] = 0.0;
acutPolar (base, rads, length, endpt);
Запрос к acutPolar () устанавливает endpt в точку, которая является тем же самым расстоянием от (1,7), поскольку pt1 - от pt2, и это - под тем же самым углом от X оси как угол между pt1 и pt2.
Функция Утилиты Текстового поля
Функция 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);
Получение ввода пользователя
Несколько глобальных функций позволяют ObjectARX-приложению запросить данные в интерактивном режиме от пользователя AutoCAD.
Функции ввода пользователя
Ввод пользователя или acedGetxxx () функции делают паузу для пользователя, чтобы ввести данные обозначенного типа, и возвращать значение в параметре результата. Приложение может определить необязательную подсказку, чтобы отобразить перед функциональными паузами.
ОБРАТИТЕ ВНИМАНИЕ, что функции Several имеют подобные названия, но - не часть группы вводов пользователя: acedGetFunCode (), acedGetArgs (), acedGetVar (), и acedGetInput ().
Следующие функции ведут себя подобно функциям ввода пользователя: acedEntSel (), acedNEntSelP (), acedNEntSel (), и acedDragGen (). Следующая таблица кратко описывает функции ввода пользователя.
Имя функции | Описание |
AcedGetInt | Получает целочисленное значение |
AcedGetReal | Получает реальное значение |
AcedGetDist | Получает расстояние |
AcedGetAngle | Получает угол (к 0 градусам как определено ANGBASE переменной) |
AcedGetOrient | Получает угол (к 0 градусам вправо) |
AcedGetPoint | Получает точку |
AcedGetCorner | Получает угол прямоугольника |
AcedGetKword | Получает ключевое слово (см. описание ключевых слов позже в этой секции) |
AcedGetString | Получает строку |
С некоторыми функциями ввода пользователя типа acedGetString (), пользователь вводит значение в линию подсказки AutoCAD. С другими типа acedGetDist (), пользователь или вводит ответ на подсказке, выравнивают, или определяет значение, выбирая точки на графическом экране.
Если экран используется, чтобы определить значение, AutoCAD отображает линии с резиновой полосой, которые являются подчиненными к прикладному контролю{*управлению*}. Предшествующий запрос к acedInitGet () может заставлять AutoCAD высвечивать линию резиновый полоса (или поле).
AcedGetKword () функция отыскивает ключевое слово. Ключевые слова - также строковые значения, но они не содержат никакое незаполненное пространство, могут быть сокращены, и должны быть основаны перед acedGetKword () запрос запросом к acedInitGet (). Все функции ввода пользователя (кроме acedGetString ()) могут принимать значения ключевого слова в дополнение к значениям, которые они обычно возвращают, если acedInitGet () был вызван{*назван*}, чтобы основать ключевые слова. Функции Ввода пользователя, которые принимают ключевые слова, могут также принимать произвольный текст (без пространств{*пробелов*}).
ПРИМЕЧАНИЕ Вы может также использовать acedInitGet () чтобы позволить acedEntSel (), acedNEntSelP (), и acedNEntSel () принять ввод ключевого слова. AcedDragGen () функция также признает ключевые слова.
Пользователь AutoCAD не может ответить на функцию ввода пользователя, вводя выражение AutoLISP.
Функции ввода пользователя воспользуются преимуществом возможности с обнаружением ошибок AutoCAD. Тривиальные ошибки (типа ввода только единственный{*отдельный*} номер в ответ на acedGetPoint ()) пойман в соответствии с AutoCAD и не возвращен функцией ввода пользователя. Приложение должно только проверить условия{*состояния*}, показанные в следующей таблице.
Возвращаемые значения для функций ввода пользователя
Код | Описание |
RTNORM | Пользователь ввел имеющее силу значение |
RTERROR | Функциональный запрос потерпел неудачу |
RTCAN | Пользователь ввел ESC |
RTNONE | Пользователь ввел только ВВОД |
RTREJ | AutoCAD отклонил запрос как инвалид |
RTKWORD | Пользователь ввел ключевое слово или произвольный текст |
RTCAN случай позволяет пользователю отменить запрос приложения, нажимая ESC. Это помогает приложению соответствовать стилю встроенного AutoCAD, командует, которые всегда позволяют отмену пользователя. Возвращаемые значения RTNONE и RTKWORD управляются функцией acedInitGet (): возвращения функции ввода пользователя RTNONE или RTKWORD только, если эти значения явно позволились предшествующим acedInitGet () запрос.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


