Опубликован: 21.02.2012 | Уровень: специалист | Доступ: свободно
Лекция 3:

AutoLISP в среде Visual LISP

Функции ввода данных и указания объектов

Эти функции дают возможность пользователю вводить данные в интерактивном режиме. К основным функциям ввода данных и указания объектов относятся следующие:

  • (initget [<флаг>] [<строка>]) - задание ключевых слов и ограничений ввода для функций getint, getreal, getdist, getangle, getorient, getpoint, getcorner, getkword entsel, nentsel и nentselp;
  • (getkword [запрос]) - ввод ключевого слова;
  • (getint [запрос]) - ввод целого числа в диапазоне от -32768 до +32767;
  • (getreal [запрос]) - ввод вещественного числа;
  • (getdist [<точка1>] [запрос]) - получение расстояния (как вещественного числа) с помощью ввода числа (на клавиатуре в текущей форме линейных единиц) или указания двух точек (мышью или в координатах на клавиатуре), если не задан аргумент <точка1>; если задана точка с помощью аргумента <точка1>, то расстояние можно получить с помощью ввода числа (на клавиатуре) или указания одной точки, до которой расстояние будет вычисляться от точки, заданной аргументом <точка1>;
  • (getangle [<точка1>] [запрос]) - получение угла (как вещественного числа в радианах) с помощью ввода числа (на клавиатуре в текущей форме угловых единиц) или указания двух точек (мышью или в координатах на клавиатуре), если не задан аргумент <точка1>; если задан аргумент <точка1>, то угол можно получить с помощью ввода числа (на клавиатуре в радианах) или указания одной точки, до которой расстояние будет вычисляться от точки, заданной аргументом <точка1>; при вводе угла с помощью числа он принимается с учетом значения системных переменных ANGBASE и ANGDIR; возвращаемое значение учитывает значение ANGBASE и игнорирует значение ANGDIR;
  • (getorient [<точка1>] [запрос]) - получение угла как в функции getangle, однако возвращаемое значение не учитывает значений ANGBASE и ANGDIR (т. е. как будто ANGBASE=0, ANGDIR=0);
  • (getpoint [<точка1>] [запрос]) - ввод точки с помощью клавиату-ры или мыши; если задан аргумент <точка1>, то при вводе точки с помощью мыши рисуется резиновая нить, начинающаяся в точке, заданной аргументом <точка1>;
  • (getcorner <точка1> [запрос]) - ввод точки с помощью клавиатуры или мыши; при вводе точки с помощью мыши рисуется резиновая рамка, начинающаяся в точке, заданной аргументом <точка1>;
  • (getstring [<флаг>] [<запрос>]) - ввод строки; если задан аргумент <флаг> и он отличен от nil, то в строке, вводимой пользователем, допускаются пробелы (признаком конца является <Enter>); если аргумент <флаг> отсутствует или задан равным nil, то признаком конца строки является пробел или <Enter>;
  • (getvar <имя>) - чтение текущего значения системной переменной с наименованием, заданным аргументом <имя>;
  • (getenv <имя>) - чтение текущего значения переменной окружения с наименованием, заданным аргументом <имя>;
  • (getcfg <строка>) - извлечение данных приложения из раздела AppData файла acad.cfg; строка, заданная аргументом <строка>, должна иметь вид "АррDаtа/имя_приложения/имя_раздела/ ... /имя_параметра";
  • (getcname <имя>) - получение имени команды в локализованной или английской версии AutoCAD;
  • (getfiled <заголовок> <имя> <расширение> <флаг> - вызов диалогового окна поиска файла. Аргумент <заголовок> используется как заголовок диалогового окна; аргумент <имя> - это имя искомого файла или папки, с которой предлагается начать поиск; аргумент <расширение> - расширение искомого файла (<расширение>, равное "", заменяется на "*"); аргумент <флаг> - опции функции (см. ниже).

Вызов функции initget должен предшествовать в программе обращению к функциям getint, getreal, getdist, getangle, getorient, getpoint, getcorner, getkword, entsel, nentsel и nentselp, поскольку устанавливает в этих функциях ограничения на ввод пользователем данных. В частности, initget может сохранять за пользователем возможность нажатия клавиши <Enter> вместо ввода данных (например, для выбора значения по умолчанию), а может и не сохранять. Аргумент <флаг> функции initget - это битовый флаг, который должен быть целым числом (от 0 до 255), являющимся суммой битов с соответствующими каждому из них весовыми значениями (нумеруются по степеням числа 2). Биты описываются в табл. 3.3. Если бит не установлен, то его значение в битовом флаге считается равным нулю.

Таблица 3.3. Значения битов функции initget
Бит Назначение
1 Не разрешает пустой ввод (пустой ввод- это нажатие только клавиши <Enter>)
2 Не разрешает ввод нуля
4 Не разрешает ввод отрицательных чисел
8 Разрешает указание точек за пределами лимитов, несмотря на значение системной переменной LIMCHECK
16 Данный бит не задействован
32 Заставляет AutoCAD использовать штриховую линию вместо сплошной для резиновой нити и резиновой рамки; если значение системной переменной POPUPS равно нулю, то AutoCAD игнорирует данный бит
64 Запрещает ввод третьей координаты для точки в функции getdist
128 Разрешает произвольный ввод в качестве ключевого слова; преобладает над другими битами и ключевыми словами; в частности, данный бит позволяет игнорировать значение бита 1

Примеры использования битового флага:

  • (initget 1) - не разрешен пустой ввод;
  • (initget 3) - не разрешены пустой ввод и ввод нуля (3=1+2) ;
  • (initget 7) - не разрешены пустой ввод, ввод нуля и ввод отрицательных чисел (7=1+2+4) ;
  • (initget 6) - разрешен пустой ввод, но не разрешены ввод нуля и ввод отрицательных чисел (6=2+4) .

Аргумент <строка> функции initget - это строка, ограниченная двойными кавычками с двух сторон, которая задает ключевые слова, являющиеся допустимыми вариантами ввода. В аргументе <строка> различные варианты ключевых слов разделяются одним или большим количеством пробелов, например: "А Б В Г Д". Если пользователю при выборе ключевого слова разрешаются сокращенные варианты, тогда обязательная часть ключевого слова и аргументе <строка> должна быть указана в верхнем регистре, например: "ПЕРесечение". В этом случае допустимыми вариантами ввода являются "ПЕР", "пер", "ПЕРЕ", "пере", "перес", "ПЕРЕСЕЧЕН", "ПЕРЕСЕЧЕНИЕ" (после трех обязательных букв может идти любое количество необязательных букв, вплоть до набора полного ключевого слова; при вводе букв верхний и нижний регистры равноправны); недопустимыми вариантами будут "П", "ПЕ", "п", "пе".

Возможны случаи, когда вариант сокращенного ввода начинается не с первой буквы ключевого слова, например:

(initget "выход") - здесь допустимыми вариантами ввода будут "х", "хо", "ход" или "выход", "вых", "выхо".

Если ключевое слово в аргументе <строка> указано только в верхнем или только в нижнем регистре, то рядом через запятую можно указать сокращенный вариант: "КРАСНЫЙ, КР" - равносильно записи "красный".

В локализованных версиях системы AutoCAD в аргументе <строка> могут присутствовать варианты ввода для локализованной и английской версий. Тогда в начале должны идти локализованные ключевые слова, а затем их английские аналоги с символом подчеркивания. Количество локализованных ключевых слов должно равняться количеству английских ключевых слов. Например: "прямой криволинейный _straight curved".

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

Пример 1 использования функции getint

(initget 6) (setq numb (getint "Введите номер участка (<1>): ")) 

В этом примере сначала устанавливаются ограничения на будущий ввод целого числа (не допускаются ноль и отрицательные числа). Допускается пустой ввод. Функция getint выводит на экран запрос "Введите номер участка (<1>) : ". Ее возвращаемым значением будет nil, если пользователь ответит простым нажатием клавиши <Enter>, или введенное пользователем допустимое целое число (например, 17). В случае ввода пользователем недопустимого целого числа (например, 0 или -2) функция getint выведет сообщение об ошибочном значении и будет ожидать допустимого варианта ввода.

В программе, приведенной выше, далее должна быть предусмотрена обработка пустого ввода для того, чтобы в этом случае присвоить переменной numb значение по умолчанию (1): (if (not numb) (setq numb 1))

Пример 2 использования функции getint

(initget 6 "Левый Правый Нижний Верхний") 
(setq numb (getint "Введите номер участка (<1>) или [Левый/Правый/Нижний/ Верхний]: ")) 

В этом примере устанавливаются ограничения на будущий ввод целого числа (не допускаются ноль и отрицательные числа), однако допускаются пустой ввод и ввод одного из четырех ключевых слов. Далее в программе должен идти анализ значения переменной numb на nil, на положительное целое число и на ключевые слова ("левый", "правый", "нижний", "верхний").

Пример использования функции getkword

(initget 1 "Да Нет") (setq reply (getkword "Продолжить цикл [Да/Нет]: ")) 

В этом примере переменной reply присваивается значение "да" или "нет", пустой ввод не допускается (хотя можно было бы разрешить пустой ввод и далее использовать его для выбора значения по умолчанию).

Поскольку не все биты функции initget используются со всеми функциями ввода данных, то в табл. 3.4 разбираются варианты применения (в случае возможности использования ставится плюс).

Таблица 3.4. Варианты применения битовых флагов
Функция Бит1 Бит 2 Бит 4 Бит8 Бит 32 Бит 64 Бит 128
getint + + + +
getreal + + + +
getdist + + + + + +
getangle + + + +
getorient + + + +
getpoint + + + +
getcorner + + + +
getkword + +

Функции entsel, nentsel и nentselp не используют биты функции initget и управляются только ключевыми словами.

Функция getstring не использует ни биты, ни ключевые слова функции initget.

Функции getvar и getenv позволяют прочитать значения, соответственно, системных переменных AutoCAD и переменных окружения.

Примеры:

  • (getvar "CECOLOR") - возвращает значение системной переменной "CECOLOR";
  • (getvar "PDMODE") - возвращает значение системной переменной "PDMODE";
  • (getenv "CONFIG") - возвращает значение переменной окружения "CONFIG".

Функция getfiled позволяет вызвать диалоговое окно выбора файла в удобном виде.

Пример:

(getfiled "Выберите файл данных для расчета" 
"d: \\Tests\\AuroLISP\\Fields" "rtf" l6) - вызывает окно, приведенное на рис. 3.3:
 Диалоговое окно, вызываемое функцией getfiled

Рис. 3.3. Диалоговое окно, вызываемое функцией getfiled

Второй аргумент функции getfiled, в зависимости от значения четвертого аргумента (<флаг>), может задавать либо имя файла по умолчанию, либо папку, с которой предлагается начать поиск. Битовый флаг, задаваемый аргументом <флаг> получается как сумма тех битов, нумеруемых степенями числа 2, которые будут установлены. Описание битов приведено в табл. 3.5:

Таблица 3.5. Значения битов функции getfiled
Бит Значение
1 Подсказка имени при создании нового файла (нельзя использовать для выбора существующего файла)
2 Не используется
4 Разрешает вводить имя файла с любым расширением (или без расширения)
8 Если бит 1 не установлен, то система AutoCAD выполняет поиск файла, имя которого задано в аргументе <имя> по списку путей, заданных в настройке, причем getfiled возвращает имя файла без пути; в противном случае возвращается полное имя файла (с путем)
16 Аргумент <имя> трактуется как имя папки, в которой нужно искать файл; при этом в поле Имя файла: (File name:) ничего не вписывается по умолчанию (см. рис.3.4); аналогичный эффект достигается и в том случае, если аргумент <имя> заканчивается обратной косой чертой
32 Если установлен бит 1, то не будет выводиться предупреждающее сообщение при записи поверх существующего файла
64 Не передает файл, если в качестве имени задан URL-адрес
128 Не допускается использование URL-адресов

С функциями getvar и getenv тесно связаны функции, выполняющие обратные операции:

  • (setvar <имя> <значение>) - установка значения системной переменной с наименованием, заданным аргументом <имя>;
  • (setenv <имя> <значение>) - установка значения переменной окружения с наименованием, заданным аргументом <имя>.

В обеих функциях аргументы <имя> и <значение> должны быть текстовыми строками.

Функция setcfg является обратной по отношению к функции getcfg:

(setcfg <имя> <значение>) - запись данных приложения в раздел AppData файла acad.cfg; аргумент <имя> должен иметь вид "AppData/ имя_приложения/имя_раздела/ ... /имя_параметра" (до 496 символов длиной); возвращаемое значение функции setcfg - аргумент <значение> или nil (в случае ошибки).

Алексей Тимонин
Алексей Тимонин
Что возвращает функция chr() в таком примере (chr (- 65 1))?
Алексей Потапкин
Алексей Потапкин
как передать параметры в макрос
Александр Яковлев
Александр Яковлев
Россия, г. Москва
Александр Захаров
Александр Захаров
Россия, Рязань