int test()

{

int i;

while (!acedUsrBrk()) {

acedGetInt("\nInput integer:", &i); // WRONG

.

.

.

}

}

Слегка изменяемый кодовый фрагмент, который следует правильно за метками ввод ESC без того, чтобы вызвать acedUsrBrk ().

int test()

{

int i;

for (;;) {

if (acedGetInt("\nInput integer:", &i) != RTNORM)

break;

...

}

}

Следующая выборка изменяет{*заменяет*} условие цикла. Это строительство также работает правильно.

int test()

{

int i;

while (acedGetInt("\nInput integer:", &i) == RTNORM) {

...

}

}

Имеющее силу место, чтобы использовать acedUsrBrk () находится в длинной операции. Например, код, который шагает через каждый примитив в базу данных рисунка, может быть потребление времени и должен вызвать acedUsrBrk ().

Возвращение Значений к Функциям AutoLISP

ObjectARX обеспечивает набор функций, который позволяет возвращать значения в AutoLISP. Эти функции возвращения значения не имеют никаких копий AutoLISP. Следующая таблица суммирует эти функции.

Имя функции

Результат

AcedRetInt

Целочисленное значение

AcedRetReal

Реальное значение

AcedRetPoint

Трехмерная точка

AcedRetStr

Строка

AcedRetVal

Значение пропускало “generically” в буфере результатов

AcedRetName

Примитив (RTENAME) или выбор устанавливает имя (RTPICKS) (см. главу 3 для подробной информации относительно наборов выбора и примитивов)

AcedRetT

AutoLISP оценивает t (истину)

AcedRetNil

AutoLISP оценивает ноль

AcedRetVoid

Пустое значение: AutoCAD не отображает результат

AcedRetList

Список буферов результатов, возвращенных AutoLISP

Следующий пример показывает схему вызванной функции, когда приложение получает запрос kInvkSubrMsg. Это возвращает реальное значение AutoLISP.

НЕ нашли? Не то? Что вы ищете?

Int dofun ()

{

Ads_real x

// Проверить{*отметить*} параметры, и ввести условия здесь.

// Вычислить значение x.

AcedRetReal (x);

return GOOD;

}

ОБРАТИТЕ ВНИМАНИЕ, что внешняя функция может делать больше чем один запрос к функциям возвращения значения по единственному запросу kInvkSubrMsg, но функция AutoLISP возвращает только значение последней вызванной функцией.

Преобразования

Функции, описанные в этой секции - утилиты для преобразования типов данных и модулей.

Строковые Преобразования

Функции acdbRToS () и acdbAngToS () преобразовывают значения, используемые в AutoCAD к строковым значениям, которые могут использоваться в выводе или как текстовые данные. AcdbRToS () функция преобразовывает реальное значение, и acdbAngToS () преобразовывает угол. Формат строки результата управляется значением переменных системы AutoCAD: модули и точность определены LUNITS и LUPREC для реальных (линейных) значений и AUNITS и AUPREC для угловых значений. Для и функционирует, DIMZIN dimensioning переменное средство управления, как продвижение и конечные нули написаны к строке результата. Дополнительные функции acdbDisToF () и acdbAngToF () преобразовывают строки назад в реальные значения (расстояния) или углы. Если пропускается строка, сгенерированная acdbRToS () или acdbAngToS (), acdbDisToF () и acdbAngToF () (соответственно), как гарантируют, возвратят имеющее силу значение.

Например, следующие показы фрагмента вызывают к acdbRToS () (. Проверка Ошибки не показывается, но должна быть включена в приложения.)

Ads_real x = 17.5;

char fmtval [12];

// Точность - 3-ий параметр: 4 места в первом

// Вызвать, 2 места в другие.

AcdbRToS (x, 1, 4, fmtval); // Режим 1 = научный

AcutPrintf (" Значение, отформатированное как %s\n ", fmtval);

AcdbRToS (x, 2, 2, fmtval); // Режим 2 = десятичное число

AcutPrintf (" Значение, отформатированное как %s\n ", fmtval);

AcdbRToS (x, 3, 2, fmtval); // Режим 3 = разработка

AcutPrintf (" Значение, отформатированное как %s\n ", fmtval);

AcdbRToS (x, 4, 2, fmtval); // Режим 4 = архитектурный

AcutPrintf (" Значение, отформатированное как %s\n ", fmtval);

AcdbRToS (x, 5, 2, fmtval); // Режим 5 = дробный

AcutPrintf (" Значение, отформатированное как %s\n ", fmtval);

Они вызывают (принятие, что DIMZIN переменная равняется 0) отображают следующий

Значения на экране текста AutoCAD.

Значение, отформатированное как 1.7500E+01

Значение, отформатированное как 17.50

Значение, отформатированное как 1‘ -5.50 І

Значение, отформатированное как 1’ -5 1/2 І

Значение, отформатированное как 17 1/2

Когда UNITMODE переменная системы установлена в 1, который определяет, что модули отображены как введено, строка, возвращенная acdbRToS () отличается для разработки (режим равняется 3), архитектурный (режим равняется 4), и дробный (режим равняется 5) модулям. Например, первые две линии предшествующего типового вывода были бы, тот же самый, но последние строки будет появляться следующим образом:

Значение, отформатированное как 1 ‘ 5.50 І

Значение, отформатированное как 1 ‘ 5-1/2 І

Значение, отформатированное как 17-1/2

AcdbDisToF () функциональные дополнения acdbRToS (), так следующее вызывают, которые используют строки, сгенерированные в предыдущих примерах, весь результат набора к тому же самому значению, 17.5. (Снова, примеры не показывают проверку ошибок.)

acdbDisToF("1.7500E+01", 1, &result); // 1 = scientific

acdbDisToF("17.50", 2, &result); // 2 = decimal

// Note the backslashes. Needed for inches.

acdbDisToF("1’-5.50\"", 3, &result); // 3 = engineering

acdbDisToF("1’-5 1/2\"", 4, &result); // 4 = architectural

acdbDisToF("17 1/2", 5, &result); // 5 = fractional

Следующие показы фрагмента вызывают к acdbAngToS () которые являются подобными предыдущему acdbRToS () примеры.

ads_real ang = 3.14159;

char fmtval[12];

// Precision is the 3rd argument: 0 places in the first

// call, 4 places in the next 3, 2 in the last.

acdbAngToS(ang, 0, 0, fmtval); // Mode 0 = degrees

acutPrintf("Angle formatted as %s\n", fmtval);

acdbAngToS(ang, 1, 4, fmtval); // Mode 1 = deg/min/sec

acutPrintf("Angle formatted as %s\n", fmtval);

acdbAngToS(ang, 2, 4, fmtval); // Mode 2 = grads

acutPrintf("Angle formatted as %s\n", fmtval);

acdbAngToS(ang, 3, 4, fmtval); // Mode 3 = radians

acutPrintf("Angle formatted as %s\n", fmtval);

acdbAngToS(ang, 4, 2, fmtval); // Mode 4 = surveyor’s

acutPrintf("Angle formatted as %s\n", fmtval);

Они вызывают (все еще принятие что DIMZIN равняется 0) отображают следующие значения на экране текста AutoCAD.

Angle formatted as 180

Angle formatted as 180d0¢0²

Angle formatted as 200.0000g

Angle formatted as 3.1416r

Angle formatted as W

ОБРАТИТЕ ВНИМАНИЕ, что UNITMODE переменная системы также воздействует на строки, возвращенные acdbAngToS () когда это возвращает строку в модулях инспектора (режим равняется 4). Если UNITMODE равняется 0, возвращенная строка может включать пробелы (например, “ N 45d E ”); если UNITMODE равняется 1, строка не содержит никакие пробелы (например, “N45dE”).

AcdbAngToF() функциональные дополнения acdbAngToS (), так следующее вызывает весь набор параметр результата к тому же самому значению, 3.14159. (Это округлено до 3.1416 в примере, который использует радианы.)

AcdbAngToF ("180", 0, *result); // 0 = градусы

AcdbAngToF ("180d0" 0 \ "", 1, *result); // 1 = deg/min/sec

AcdbAngToF ("200.0000g", 2, *result); // 2 = grads

AcdbAngToF ("3.1416r", 3, *result); // 3 = радианы

AcdbAngToF ("W", 4, *result); // 4 = инспектор

ОБРАТИТЕ ВНИМАНИЕ, когда Вы имеете строку, которая определяет угол в градусах{*степенях*}, минутах, и секундах, Вы должны использовать наклонную черту влево (\), чтобы выйти из символа секунд (І) так, чтобы, казалось, не было конца строки. Второй из предшествующего acdbAngToF () примеры демонстрируют это.

Реальные преобразования

Файл acad. unt определяет разнообразие преобразований между реальными модулями типа миль / километров, Фаренгейта / Цельсия, и так далее. Функция acutCvUnit () берет значение, выраженное в одной системе модулей и возвращает эквивалентное значение в другой системе. Две системы модулей определены строками, которые должны соответствовать одному из определений acad. unt.

Если модули текущего рисунка технические или архитектурные (футы и дюймы), следующий фрагмент преобразовывает указанное пользователем расстояние в метры.

ads_real eng_len, metric_len;

char *prmpt = "Select a distance: ";

if (acedGetDist(NULL, prmpt, &eng_len) != RTNORM)

return BAD;

acutCvUnit(eng_len, "inches", "meters", &metric_len);

AcutCvUnit () функция не будет преобразовывать несовместимые модули, типа дюймов в годы.

Обработка Символьного типа

ObjectARX обеспечивает пакет обрабатывающих символа функций, как показано в таблице, которая следует. Преимущество этого пакета по пакету стандартной библиотеки для C, ctype. h, состоит в том, что эти функции являются независимыми от любого определенного набора символов и не связаны к ASCII. Они настроены к потоку конфигурация языка AutoCAD. В других отношениях, они ведут себя подобно их стандартным копиям C.

Функции Символьного типа

Имя функции

Цель

AcutIsAlpha

Проверяет, что символ алфавитный

AcutIsUpper

Проверяет, что символ верхнего регистра

AcutIsLower

Проверяет, что символ - нижний регистр

AcutIsDigit

Проверяет, что символ - цифра

AcutIsXDigit

Проверяет, что символ - шестнадцатеричная цифра

AcutIsSpace

Проверяет, что символ - символ незаполненного пространства

AcutIsPunct

Проверяет, что символ - символ пунктуации

AcutIsAlNum

Проверяет, что символ алфавитно-цифровой

AcutIsPrint

Проверяет, что символ печатаем

AcutIsGraph

Проверяет, что символ графический

AcutIsCntrl

Проверяет, что символ - управляющий символ

AcutToUpper

Преобразовывает символ к верхнему регистру

AcutToLower

Преобразовывает символ к нижнему регистру

Следующий кодовый фрагмент берет символ (значение в этом примере произвольно) и преобразовывает это к верхнему регистру. AcutToUpper () функция не имеет никакого эффекта, если символ - уже верхний регистр.

Из за большого объема этот материал размещен на нескольких страницах:
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