#define EOS'\0 ’ // Строковый символ завершения
Символ ПАУЗЫ, строка, которая содержит единственную наклонную черту влево, определен для acedCommand () и acedCmd () функции, следующим образом:
#define PAUSE "\\" // Пауза в списке параметров команды
ОБРАТИТЕ ВНИМАНИЕ, что ObjectARX библиотека не определяет значения, ХОРОШИЕ и ПЛОХИЕ, которые появляются как возвращаемые значения в выборках кода повсюду этого руководства (особенно по ошибке - обрабатывающий код). Вы можете определять их, если Вы хотите, или заменяете соглашение, которое Вы предпочитаете.
Буфера pезультатов и Коды Типа
Буфер результатов общего назначения (resbuf) структура обрабатывает все типы данных AutoCAD. Коды Типа определены, чтобы определить типы данных в буфере результатов.
Списки буфера результата
Буфера Результатов могут быть объединены в списках связей, описан позже подробно, и поэтому подходящие для обработки объектов, чей длины могут измениться и объекты, которые могут содержать смесь типов данных. Много функций ObjectARX возвращают или ввод или отдельные буфера результатов (типа acedSetVar()) или списков буфера результата (типа acdbEntGet() и acdbTblSearch()).
Struct resbuf
Следующая структура буфера результата, resbuf, определена в конъюнкции с объединением, ads_u_val, который размещает различный AutoCAD и ObjectARX типы данных, следующим образом:
union ads_u_val {
ads_real rreal;
ads_real rpoint[3];
short rint; // Must be declared short, not int.
char *rstring;
long rlname[2];
long rlong;
struct ads_binary rbinary;
};
struct resbuf {
struct resbuf *rbnext; // Linked list pointer
short restype;
union ads_u_val resval;
};
ОБРАТИТЕ ВНИМАНИЕ, что поле long integer - resval. rlong - подобно двоичному полю данных resval. rbinary; оба держат расширенные данные примитива.
Следующий рисунок показывает схематическую форму списка буфера результата:

Коды Типа Результата, определенные ObjectARX
Restype поле буфера результатов - короткий целочисленный код, который указывает, которые напечатают ценный, сохранен в resval поле буфера. Поскольку результаты прошли к и от функций ObjectARX, ObjectARX определяет коды типа результата, перечисленные в следующей таблице:
Коды типа Результата
Код | Описание |
RTNONE | Никакое значение результата |
RTREAL | Реальное значение (с плавающей точкой) |
RTPOINT | 2-ая точка (X и Y; Z == 0.0) |
RTSHORT | Короткое (16-разрядное) целое число |
RTANG | Угол |
RTSTR | Строка |
RTENAME | Имя Примитива |
RTPICKS | Имя набора Выбора |
RTORINT | Ориентация |
RT3DPOINT | Трехмерная точка (X, Y, и Z) |
RTLONG | Долго (32-разрядное) целое число |
RTVOID | Пустой (blanc) символ |
RTLB | Список начинается (для вложенного списка) |
RTLE | Список конец (для вложенного списка) |
RTDOTE | Точка (для точечной пары) |
RTT | AutoLISP t (истина) |
RTNIL | Ноль AutoLISP |
RTDXF0 | Группа закодирует нуль для списков DXF (используемый только с acutBuildList ()) |
DXF Коды Группы
Много функций ObjectARX возвращают коды типа, определенные в предшествующей таблице. Однако, в результатах от функций, которые обрабатывают, примитивы, restype поле содержат коды группы DXF, которые описаны в Руководстве Настройки AutoCAD. Например, в списке примитива, restype поле 10 указывает точку, в то время как restype 41 указывает реальное значение.
Рисунки AutoCAD состоят из структурных контейнеров для объектов базы данных, имеющих следующие компоненты:
§ уникальная метка, которая всегда позволяется и это сохраняется продолжении жизни рисунка
§ необязательный список xdata
§ необязательный набор постоянных реакторов
§ необязательный указатель монопольного использования на словарь расширения, который имеет другие объекты базы данных, помещенные в это приложением
Объекты Базы данных - объекты без уровня, linetype, цвета, или любых других геометрических или графических свойств, и примитивы получены из объектов и имеют геометрические и графические свойства.
Поскольку коды DXF - всегда меньше чем 2,000, и коды типа результата всегда большие, приложение может легко определять, когда список буфера результата содержит значения результата (как возвращено acedGetArgs (), например) или содержит данные определения примитива (как возвращено acdbEntGet () и другими функциями примитива).
Следующий рисунок показывает формат буфера результата круга, отысканного acdbEntGet ():

Следующий типовой кодовый фрагмент показывает функцию, dxftype (), который пропускают код группы DXF и связанный примитив, и возвращает соответствующий код типа. Код типа указывает то, что тип данных может представлять данные: RTREAL указывает, с двойной точностью с плавающей точкой значение, RT3DPOINT указывает ads_point, и так далее. Вид примитива (например, нормальный примитив типа круга, блочного определения, или входа таблицы типа области просмотра) обозначен определениями типов, которые сопровождают эту функцию:
#define ET_NORM 1 // Normal entity
#define ET_TBL 2 // Table
#define ET_VPORT 3 // Table numbers
#define ET_LTYPE 4
#define ET_LAYER 5
#define ET_STYLE 6
#define ET_VIEW 7
#define ET_UCS 8
#define ET_BLOCK 9
// Get basic C-language type from AutoCAD DXF group code (RTREAL,
// RTANG are doubles, RTPOINT double[2], RT3DPOINT double[3],
// RTENAME long[2]). The etype argument is one of the ET_
// definitions.
//
// Returns RTNONE if grpcode isn’t one of the known group codes.
// Also, sets "inxdata" argument to TRUE if DXF group is in XDATA.
short dxftype(short grpcode, short etype, int *inxdata)
{
short rbtype = RTNONE;
*inxdata = FALSE;
if (grpcode >= 1000) { // Extended data (XDATA) groups
*inxdata = TRUE;
if (grpcode == 1071)
rbtype = RTLONG; // Special XDATA case
else
grpcode %= 1000; // All other XDATA groups match.
} // regular DXF code ranges
if (grpcode <= 49) {
if (grpcode >= 20) // 20 to 49
rbtype = RTREAL;
else if (grpcode >= 10) { // 10 to 19
if (etype == ET_VIEW) // Special table cases
rbtype = RTPOINT;
else if (etype == ET_VPORT && grpcode <= 15)
rbtype = RTPOINT;
else // Normal point
rbtype = RT3DPOINT; // 10: start point, 11: endpoint
}
else if (grpcode >= 0) // 0 to 9
rbtype = RTSTR; // Group 1004 in XDATA is binary
else if (grpcode >= -2)
// -1 = start of normal entity -2 = sequence end, etc.
rbtype = RTENAME;
else if (grpcode == -3)
rbtype = RTSHORT; // Extended data (XDATA) sentinel
}
else {
if (grpcode <= 59) // 50 to 59
rbtype = RTANG; // double
else if (grpcode <= 79) // 60 to 79
rbtype = RTSHORT;
else if (grpcode < 210)
;
else if (grpcode <= 239) // 210 to 239
rbtype = RT3DPOINT;
else if (grpcode == 999) // Comment
rbtype = RTSTR;
}
return rbtype;
}
Приложение получает список буфера результата (вызвал rb), представляя вход в таблице идентификаторов области просмотра, и следующая инструкция C вызывает dxftype ():
Ctype = dxftype (rb - > restype, ET_VPORT, &inxdata);
Предположим, что rb - >restype равняется 10. Тогда dxftype() возвращает RTPOINT, указывая, что примитив является двумерной точкой, чьи координаты (типа ads_real) находятся в rb->resval. rpoint [X] и rb->resval. rpoint [Y].
ObjectARX функциональные коды типа результата
Следующие коды типа результата - коды состояния, возвращенные большинством ObjectARX глобальные функции, чтобы указать успех, отказ{*неудачу*}, или специальные условия (типа отмены пользователя):
Коды результата Библиотечной функции
Код | Описание |
RTNORM | Пользователь ввел имеющее силу значение |
RTERROR | Функциональный запрос потерпел неудачу |
RTCAN | Пользователь ввел ESC |
RTREJ | AutoCAD отклонил запрос как недействительный |
RTFAIL | Связь AutoLISP потерпела неудачу |
RTKWORD | Пользователь ввел клавиатуру или произвольный текст |
Значения этих кодов, полученных в итоге в таблице, следующие:
RTNORM | Библиотечная функция преуспела. |
RTERROR | Библиотечная функция не преуспевала; это столкнулось с восстанавливаемой ошибкой. |
Условие RTERROR исключительно из следующих специальных случаев:
RTCAN | Пользователь AutoCAD ввел ESC, чтобы отменить запрос. Этот код возвращен вводом пользователя (acedGetxxx) функции и следующими функциями: acedCommand, acedCmd, acedEntSel, acedNEntSelP, acedNEntSel, и acedSSGet. |
RTREJ | AutoCAD отклонил операцию как недействительный. Запрос операции может быть неправильно сформирован, типа недействительного acdbEntMod () запрос, или это просто не может иметь силу для текущего рисунка. |
RTFAIL | Связь с AutoLISP потерпела неудачу. Это - фатальная ошибка, которая вероятно означает, что AutoLISP больше не выполняется правильно. Если это обнаруживает эту ошибку, приложение должно выйти. (Не все приложения проверяют этот код, потому что условия, которые могут вести к этому, вероятно, приведут к зависанию AutoCAD, так или иначе.) |
RTKWORD | Пользователь AutoCAD ввел ключевое слово или произвольный ввод вместо другого значения (типа точки). Ввод пользователя acedGetxxx () функции, также как acedEntSel, AcedEntSelP, acedNEntSel, и acedDragGen, возвращают этот код результата. |
ОБРАТИТЕ ВНИМАНИЕ Не, все ObjectARX глобальные функции возвращают эти коды состояния; некоторые возвращаемые значения непосредственно. Также, ввод пользователя (acedGetxxx, acedEntSel, acedEntSelP, acedNEntSel, и acedDragGen) функции могут возвращать код типа результата RTNONE, и acedDragGen () указывает произвольный ввод, возвращая RTSTR вместо RTKWORD.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


