Автолисп содержит ряд функций, объединенных общей структурой getxxx, вызывающих паузу в работе программ и ожидающих ввода запрашиваемых данных. Эти функции перечислены в табл. З.
Tаблица 3. Функции запроса данных
Имя функции | Характер запрашиваемой информации |
---|---|
getint | Целое число из командной строки |
getreal | Вещественное число из командной строки |
getstring | Строковая константа из командной строки |
getpoint | Координаты точки из командной строки или прямым указанием точки на экране |
getcorner | Координаты одного из противолежащих углов окна или секущей рамки из командной строки или прямым указанием на экране |
getdist | Целое или вещественное число, определяющее необходимое расстояние, из командной строки или прямым указанием отрезка на экране |
getangle | Величина угла из командной строки или указанием трех точек на экране |
getorient | To же |
getkword | Альтернативный выбор по ключевому слову |
Функции getint, getreal и getstring требуют ввода в командную строку параметра соответствующего типа.
Функции getangle и getorient требуют ввода величины угла. Разница заключается в том, что getorient запрашивает угол, измеряемый от положительного направления оси X, getangle - от направления некоторой определенной базовой линии. При этом направление отсчета определяется значением системной переменной Автокада ANGDIR.
В примере использованы две из перечисленных функций. Первая запрашивает точку вставки блока, вторая - некоторое расстояние (в данном случае - длину резьбы на теле болта):
(setq pt1 (getpoint “\nУкажите точку вставки:_ “)),
(setq I2 (getdist “\nУкажите длину резьбы:_ “)).
К семейству getxxx относятся еще две функции: getvar и getenv, но они не являются средством общения с пользователем. Первая, уже использованная ранее, служит для извлечения из Автокада числовых, а вторая - строковых системных переменных.
Все перечисленные функции позволяют осуществить ввод данных на любом этапе работы программы, но они не могут быть использованы при выполнении команды Автокада, т.е. не могут быть включены в команду. Например, если определен некоторый набор примитивов ss, выбрана базовая точка набора pt1, а сам набор необходимо перенести в другую точку, указываемую оператором, нельзя использовать конструкцию
(command “move” ss “” pt1
(getpoint “\nPoint of displacement:_ ")
),
поскольку функция getpoint расположена внутри функции command. Автолисп ее не поймет и прекратит выполнение программы.
Для прерывания команды Автокада Автолисп использует описанный ранее внутренний идентификатор pause. Правильным для описываемой ситуации является формат:
(command “move” ss “” pt1 pause).
4.2. Условное ветвление программ
Ветвление программ по заданному условию свойственно всем языкам программирования. Например, в Фортране оператор условного перехода может выглядеть подобно следующему:
IF (условие) GO TO метка,
или в Паскале:
if условие then процедура1 else процедура2.
Аналогичные операции могут быть выполнены и в Автолиспе. Для условного ветвления программ Автолисп предлагает две функции: cond (основная) и if.
(cond (условие1 операция1 ...) ...). Функция воспринимает любое число списков как аргументы. Просматривая по очереди первые элементы списков, отыскивает первый, отличный от nil и выполняет операцию. Пример использования этой функции представлен в программе plw.lsp, описываемой несколько ниже.
(if условие операция [альтернативная операция]). Эта функция оценивает условие, и если оно не nil, выполняет операцию, в противном случае выполняет альтернативную операцию. Если альтернативная операция опущена или условие есть nil, функция возвращает nil.