#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