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. Если бит не установлен, то его значение в битовом флаге считается равным нулю.
Бит | Назначение |
---|---|
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 разбираются варианты применения (в случае возможности использования ставится плюс).
Функция | Бит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, в зависимости от значения четвертого аргумента (<флаг>), может задавать либо имя файла по умолчанию, либо папку, с которой предлагается начать поиск. Битовый флаг, задаваемый аргументом <флаг> получается как сумма тех битов, нумеруемых степенями числа 2, которые будут установлены. Описание битов приведено в табл. 3.5:
Бит | Значение |
---|---|
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 (в случае ошибки).