
dc3de61ec7cbb98882fac4958be3f309.ppt
- Количество слайдов: 22
Системы Автоматизированного Проекти. Рования Тема № 3 Auto. Lisp - продолжение
Auto. Lisp Ввод данных осуществляется семейством GET-функций : Наиме Аргум Описание нован енты ие GETI Текст Ввод целого NT подска числа зки GETR Текст Ввод EAL подска вещественного зки числа GETS Флаг Ввод текста. TRIN пробел Если флаг G а (T пробела=T, в или тексте могут NIL) быть пробелы, Текст иначе (по подска умолчанию)
Auto. Lisp Все GET-функции возвращают введенное с клавиатуры значение или NIL, если имел место пустой ввод (сразу нажата клавиша Enter или пробел). Для сохранения этого значения его следует записать в переменную, например: ( SETQ ( GETINT "n. Введите X: " ) ) ( SETQ m ( GETSTRING T "n. Введите фамилию и имя: " ) ) Ввод данных всегда чреват возникновением ошибок. Как известно, в большинстве случаев на подсказку "Введите целое число от 1 до 3" пользователь пишет "Вася" и злорадно ожидает реакции компьютера. Для автоматического исключения наиболее очевидных ошибочных ситуаций предназначена функция INITGET: ( INITGET сумма_кодов ) действие которой распространяется только на одну следующую за ней GET-функцию.
Auto. Lisp Возможны следующие значения кодов: Код Значение 1 Запретить пустой ввод 2 Запретить ввод нуля 4 Запретить ввод отрицательных чисел Пусть с клавиатуры требуется ввести номер позиции детали в спецификации и записать его в переменную p. Очевидно, что номер позиции - целое положительное число. Делается это так: ( INITGET 7 ) ( SETQ p ( GETINT "n. Введите номер позиции детали: " ) )
Auto. Lisp Пример: Написать интерактивную программу вычисления площади треугольника. ( DEFUN C: trisque ( / a b c p s ) ( TEXTSCR ) ( INITGET 7 ) ( SETQ a ( GETREAL "n. Длина стороны A: " ) ) ( INITGET 7 ) ( SETQ b ( GETREAL "n. Длина стороны B: " ) ) ( INITGET 7 ) ( SETQ c ( GETREAL "n. Длина стороны C: " ) ) ( SETQ p ( / ( + a b c ) 2 ) ) ( PROMPT "n. Площадь треугольника равна " ) ( PRIN 1 ( SQRT ( * p ( - p a ) ( - p b ) ( - p c ) ) ( PRIN 1 ) )
Auto. Lisp Использование команд Автокада Мы знаем, как средствами Автолиспа выводить данные на текстовый экран и вводить информацию с клавиатуры. Однако главный экран Автокада - графический, на котором происходят создание и модификация чертежа. Главная цель применения языка Автолисп - именно работа с графическим экраном, что позволяет автоматизировать построение изображений. Но для этого нужно узнать, каким образом Автолисп связан с командами Автокада. Обычно пользователи Автокада, даже достаточно опытные, умеют работать только с использованием верхнего (падающего) или бокового (экранного) меню. Предложение нарисовать чертеж на компьютере без мыши поставит их в тупик. Между тем первые версии Автокада появились еще в эпоху машин типа IBM PC и IBM PC/XT, когда никаких мышей и в помине не было. Как же работать с Автокадом с клавиатуры?
Auto. Lisp Автокад имеет встроенный набор команд, которые вводятся с клавиатуры в ответ на приглашение "Команда: " и в большинстве запрашивают определенные параметры. Последовательность ввода этих параметров определяется форматом команды. Набор команд в пределах одной версии Автокада постоянен и одинаков, а меню можно создавать самому, поэтому в разных организациях меню обычно сильно отличаются. В качестве примера рассмотрим формат команды "ПЛИНИЯ" как наиболее широко используемой в построениях на графическом экране: Вводим с клавиатуры – Команда: ПЛИНИЯ Комментарий - Имя команды. С этого начинается выполнение любой команды Автокада. Вводим с клавиатуры – От точки: Комментарий - Координаты точки в виде:
Auto. Lisp 1. x, y например, 100, 250 - абсолютные координаты точки; 2. @dx, dy например, @-10, 45 - приращения по осям координат от текущей точки; 3. @r: Комментарий - Здесь вводится или следующая точка, или ключевое слово - одно из слов в приводимом списке, разделенных символом "/". Можно вводить не слово целиком, а только ту его часть, которая набрана заглавными буквами. Вводим с клавиатуры – Команда: Комментарий – Для явного завершение команды ее необходимо прервать нажатием клавиш Ctrl+C
Auto. Lisp Итак, в Автокаде возможен ввод следующих типов параметров команд с клавиатуры: § Текстовые строки (например, название команды или имя файла); § Координаты точек; § Выбор объекта; § Численные значения (например, номер цвета); § Ключевые слова; § Прерывание выполнения команды. Большинство команд Автокада могут быть выполнены из программы на Автолиспе при помощи функции COMMAND: ( COMMAND t 1 t 2. . tn ) где t 1 - имя вызываемой команды; t 2. . . tn - параметры вызываемой команды.
Auto. Lisp Чтобы не пытаться создавать принципиально невозможные программы, сразу следует отметить: § Из программы на Автолиспе нельзя вызвать следующие команды: ДТЕКСТ, ЭСКИЗ, ПЕЧАТАЙ, ЧЕРТИ, ПАКЕТ, а также команды, определенные пользователем при помощи (DEFUN C: ). § Особенно печально то, что невозможно автоматизировать вывод чертежа на бумагу (команды ПЕЧАТАЙ и ЧЕРТИ), что делает любые системы автоматизации конструкторского труда, написанные на Автолиспе, несколько неполноценными. Есть два особых вида выражений, которые могут быть аргументами функции COMMAND: § PAUSE позволяет пользователю ввести соответствующий параметр вручную; § "" (две кавычки) или отсутствие параметров вообще [ ( COMMAND ) ] равносильно прерыванию команды.
Auto. Lisp Пример: нарисуем из программы на Автолиспе квадрат с левым нижним углом в точке (10, 10) и стороной 10 мм Если бы мы пользовались только клавиатурой, то диалог выглядел бы следующим образом: Команда: ПЛИНИЯ От точки: 10, 10 Текущая ширина линии равна 0. 00 ДУга/Замкни/Полуширина/ДЛина/ОТМени/Ширина/<Конеч ная точка сегмента>: @10, 0 ДУга/Замкни/Полуширина/ДЛина/ОТМени/Ширина/<Конеч ная точка сегмента>: @0, 10 ДУга/Замкни/Полуширина/ДЛина/ОТМени/Ширина/<Конеч ная точка сегмента>: @-10, 0 ДУга/Замкни/Полуширина/ДЛина/ОТМени/Ширина/<Конеч ная точка сегмента>: Замкни
Auto. Lisp На Автолиспе это будет выглядеть так: ( COMMAND "ПЛИНИЯ" "10, 10" "@10, 0" "@0, 10" "@-10, 0" "ЗАМКНИ" ) Все константы, являющиеся параметрами функции COMMAND, задаются как текстовые строки, даже если они являются числами или координатами точек. Однако главное свойство функции COMMAND - возможность подстановки в качестве параметров результатов выполнения программ. Любой параметр функции COMMAND можно заменить на имя переменной или выражение Автолиспа. Данный параметр примет значение, равное значению переменной или результату вычисления выражения.
Auto. Lisp Ограничение: внутри функции COMMAND нельзя вызывать функции ввода данных (GETREAL, GETSTRING и т. д. ) Как получить средствами Автолиспа текстовую строку, в общем, понятно. Однако возникает естественный вопрос: как представить координату точки? Координаты точек являются списками из двух или трех вещественных чисел - координат по осям X, Y и Z соответственно. Таким образом, точка с координатами 10, 10 может быть задана как текстовой строкой "10, 10", так и списком: ( LIST 10 10 ). Второй способ позволяет использовать переменные и выражения Автолиспа для указания координат. Например. если координата Х точки записана в переменной А, а координата Y равна , то следует записать: ( LIST A ( / ( * ( + A 20 ) ( + a 20 ) ) 4 ) )
Auto. Lisp В принципе имеющихся в Автолиспе математических функций достаточно, чтобы выполнять геометрические построения. Однако для удобства язык имеет ряд специальных встроенных функций для вычисления координат точек. Основная геометрическая функция - POLAR: ( POLAR a angle dist ) где a - список из двух элементов (координаты точки); angle - угол в радианах; dist - расстояние в текущих единицах измерения. POLAR возвращает в виде списка координаты точки, отстоящей от точки a на расстояние dist под углом angle
Auto. Lisp Единицы измерения, как и многие другие параметры, определяются значениями системных переменных Автокада. Системная переменная - ячейка памяти, содержащая определенное значение и имеющая неизменное имя. Значения системных переменных задают различные режимы работы команд Автокада. Не путайте переменные Автолиспа и системные переменные Автокада - это абсолютно разные вещи! К системным переменным нельзя обращаться напрямую, как к обычным переменным Автолиспа. Для доступа к системным переменным в Автолиспе имеются две функции: ( GETVAR "имя" ) ( SETVAR "имя" значение )
Auto. Lisp Функция GETVAR возвращает значение системной переменной с именем "имя", заданным как текстовая строка. Например, системная переменная "LASTPOINT" содержит координаты текущей точки. Для их использования в программе следует использовать функцию GETVAR в виде: ( GETVAR "LASTPOINT" ) Если в ходе отрисовки полилинии следующую точку удобнее рассчитать от предыдущей при помощи функции POLAR, необязательно записывать все промежуточные точки в переменные. Можно использовать функцию GETVAR, например: ( COMMAND "ПЛИНИЯ" ( LIST ( + A 10 ) ( - B 20 ) ) ( POLAR ( GETVAR "LASTPOINT" ) 0 40 ) "" )
Auto. Lisp В приведенном примере координаты начальной точки рассчитываются. Чтобы не записывать эту точку в отдельную переменную (вопрос нехватки памяти в Автолиспе 10 стоит очень остро), следующая точка, координаты которой рассчитывается при помощи функции POLAR, использует в качестве опорной координаты текущей (т. е. начальной) точки, всегда записываемые в виде списка в системную переменную "LASTPOINT". Функция SETVAR меняет значение соответствующей системной переменной. Осторожно! Хорошенько подумайте, прежде чем менять значение системной переменной. Эти значения записываются в файл чертежа; Часть системных переменных (например, переменная, содержащая номер версии Автокада) доступна только для чтения и их значения нельзя изменить.
Auto. Lisp При геометрических расчетах используются также следующие функции: ( INTERS т1 т2 т3 т4 признак ) возвращает точку пересечения двух отрезков, проходящих через точки т1 и т2 и т3 и т4 соответственно. Признак показывает, следует ли находить точку пересечения бесконечных прямых проходящих через точки т1 и т2 и т3 и т4 (если признак=NIL) или же только отрезков (если признак¹ NIL). Если точка пересечения отсутствует, функция возвращает NIL. Функция ( ANGLE т1 т2 ) возвращает угол в радианах между положительным направлением оси Х и прямой, проходящей через точки т1 и т2. Функция ( DISTANCE т1 т2 ) возвращает расстояние от точки т1 до точки т2 в текущих единицах измерения расстояний.
Auto. Lisp Работа со списками. Автолиспа – ветвление. Управляющие конструкции Поскольку список - главное действующее лицо языка Лисп, следует тщательно рассмотреть набор функций по работе с ними. До некоторой степени список аналогичен массиву в языках типа Паскаля. Там доступ к конкретному элементу списка решается просто - указывается его номер: a[5]. В Лиспе все несколько сложнее. Функция ( CAR l ) возвращает первый элемент списка l. Например, ( CAR ( LIST 10 20 ) ) вернет 10. Если список l является описанием координат точки, то ( CAR l ) возвращает координату X.
Auto. Lisp Название функции идет от первой, 1958 года, реализации языка Лисп на древнем компьютере, в работе которого немаловажную роль играл адресный регистр памяти (Contents 0 f Address Register), сокращенно CAR. Дж. Маккарти назвал в честь этого регистра одну из функций языка Лисп. Функция ( CDR l ) возвращает все элементы списка l, кроме первого. Иначе говоря, у списка отрывается "голова", а возвращается остающийся "хвост", причем даже если этот "хвост" длиной в один атом, он все равно будет списком: ( CDR ( LIST 10 20 ) ) возвращает ( 20 ) Названа функция также в честь одного из регистров древнего компьютера - Contents of Decrement Register. Функция CDR не годится для получения координаты Y точки - она возвращает список, а координата, конечно же, должна быть выражена атомом - вещественным числом.
Auto. Lisp По-хорошему надо из списка, возвращаемого функцией CDR, выделить первый элемент, написав ( SETQ p ( LIST 10 20 ) ) ; координаты точки p ( SETQ y ( CAR ( CDR p ) ) ) Но такая запись выглядит весьма громоздко. Поэтому в Лиспе предусмотрена возможность использования вложенных функций CAR и CDR, которые будут называться соответственно CADR, CDAR, CAAR, CDDR и так далее (до четырех уровней вложенности). При этом (CADR l) эквивалента ( CAR ( CDR l ) ). Последний элемент списка как атом возвращает функция ( LAST l ). В принципе ее можно использовать для получения координаты Y, но где гарантия, что в один прекрасный день пользователь не включит режим использования трехмерных точек? Тогда LAST станет возвращать уже координату Z и ваша программа тут же потеряет работоспособность.
Auto. Lisp И, наконец, самая общая функция выделения элементов из списка: ( NTH n l ), которая возвращает n-й элемент списка l. Название функции происходит от английского окончания порядковых числительных -th. Нумерация элементов списка в функции NTH начинается с нуля! Хуже того, в Лиспе нет единообразия в этом вопросе: часть функций все же уверена, что нумерация начинается с единицы. Такая путаница - один из наиболее крупных "проколов" Лиспа.