АвтоЛИСП - реализация языка программированияРефераты >> Программирование и компьютеры >> АвтоЛИСП - реализация языка программирования
Она содержит один параметр "а" - угол в градусах. В результате - выражение:
PI * (a / 180.0)
которое в примечаниях ЛИСПа расшифровывается как: "произведение от PI, умноженное на коэффициент А, разделенное на 180 градусов". PI предопределяется ЛИСПом как 3.1459 .; строчка, начинающаяся с двоеточия,- комментарий - АвтоЛИСП игнорирует текст, расположенный после двоеточия.
Сохраните файл на диске, затем перейдите на новый чертеж (имя не имеет значения, т.к. мы не будем сохранять чертеж).
Когда появится подсказка АвтоКАДа "Command:", загрузите функцию, введя:
Command: (load "gp")
АвтоЛИСП загрузит вашу функцию, отражая ее имя в "DТR". Далее в этом руководстве, когда мы говорим : "Введите АвтоКАД и загрузите программу", будет подразумеваться проделанная только что последовательность.
Сейчас мы проверим функцию, выполняя различные действия. Из определения радианы, 0 градусов должно соответствовать нулевой радиане; введите в АвтоКАД строчку:
Command: (dtr 0)
Печатая строку, начинающуюся с левой круглой скобки, вы заставляете АвтоКАД переводить эту строку в АвтоЛИСП для вычисления. В этом случае мы высчитываем функцию DIR, только что определенную нами, передавая ей параметр - ноль. После высчитывания функции, АвтоКАД выдаст результат; так наш ввод выдаст следующий ответ:
0.000000
Теперь давайте попробуем 180 градусов. Если вы введете
Command: (dtr 180)
вы получите ответ:
3.141593
Это показывает, что 180 градусов равно PI радианам. Если вы исследуете функцию, вы убедитесь, что это именно так.
Для выхода из АвтоКАДа введите:
Command: QUIT
и на подсказку
Really want to discard all changes to drawing? Y
(Действительно хотите не учитывать все изменения в чертеже? Д)
ответьте
0
в основном меню для возврата к DOS подсказке. Далее в руководстве под "Выйти из АвтоКАДа" будет подразумеваться эта процедура.
3.4 Ввод
Наша команда garden path (садовая дорожка) запросит у пользователя следующую информацию: где рисовать дорожку, какой ширины ее делать, размер конкретных плит и как близко друг к другу их размещать. Мы определим функцию, которая будет спрашивать пользователя по всем этим пунктам, а затем просчитает цифры, которые мы проставим в конце команды.
Используя редактор текста, добавьте следующие строчки в GP.LSP (мы будем применять вертикальную черту для выделения добавляемых строчек).
: Convert angle in degrees to radians
(defun dtr (a)
('pi (/ a 180.0))
)
| :Acquire information for garden path
| (defun gpuser ()
| (setq sp (getpoint "\nStart point of path:"))
| (setq ep (getpoint "\nEnd point of path:"))
| (setq hwidth (getdist "\nHalf width of path:"sp))
| (setq trad (getdist "\nRadius of tiles:"sp))
| (setq pangle (angle sp ep ))
| (setq plength (distance sp ep ))
| (setq width (' 2 hwidth))
| (setq angp90 (+pangle (dtr 90))) : Path angle +90 deg
| (setq angm90 (-pangle (dtr 90))) : Path angle -90 deg
Необязательно смещать выражения, содержащие ваши функции. Фактически вы можете ввести всю программу в одну строку. Однако, смещение и прерывание строчки служит созданию более понятной и четкой для чтения структуры программы. Также, расположение начальных и конечных круглых скобок основных выражений на одной оси, способствует уверенности, что ваши скобки верно сбалансированы.
Итак, мы определили функцию GPUSER. Она не принимает параметров, а спрашивает пользователя по всем пунктам. Функция SETQ приводит переменную АвтоЛИСПа к определенному значению. Первая SETQ приводит переменную SP (начальная точка ) к результату функции GETPOINT. Пользователь задает точки для функции GETPOINT. Для получения точки будет применяться строка, определяющая подсказку АвтоКАДа. "\n" заставляет подсказку появиться на новой линии. Мы применяем функцию GETPOINT для получения значения середины ширины дорожки, радиуса плиты и расстояния между плитами. Второй параметр функции GETPOINT , SP, определяет "базовую точку" расстояния. Расстояние можно создать, определив в АвтоКАДе точку, соответствующую начальной точке дорожки, и присоединив к ней линию резиновой нити.
После ввода высчитываются наиболее часто применяемые переменные. PANGLE обозначает угол от начальной до конечной точки дорожки. Функция ANGLE вводит этот угол по заданным двум точкам. PLENGTH вводит длину дорожки. Функция DISTANCE рассчитывает расстояние, заданное двумя точками. Задав половину ширины дорожки, мы рассчитываем общую ширину, умножив на два заданную величину. И, наконец, мы рассчитываем и сохраняем угол дорожки плюс-минус 90 градусов в переменных ANGP90 и ANGM90 соответственно (т.к. углы в АвтоЛИСПе рассчитываются в радианах, мы перед этими рассчетами применили функцию DTR для перевода градусов в радианы).
Сохраните эту откорректированную программу на диске, запустите АвтоКАД и загрузите программу. Сейчас мы проверим функцию ввода, чтобы убедиться, что она работает правильно.
Приведите в действие функцию, напечатав:
Command: (gpuser)
Ответьте на подсказки следующим образом:
Начальная точка дорожки: 2,2
Конечная точка дорожки: 9,8
Половина ширины дорожки: 2
Радиус плиты: .2
Расстояние между плитами: .1
GPUSER использует ваши ответы для подсчета необходимых ему дополнительных переменных и на экране появится результат последних подсчетов (в данном случае - 0,826169, значение ANGM90 в радианах). Вы можете разгрузить все переменные, установленные функцией GPUSER путем подстановки восклицательного знака (!) перед их именами. Это заставит АвтоКАД вычислить переменные и выдать результат на экран. Если вы введете следующие команды, вы получите следующие результаты:
Command: !sp
(2.000000 2.000000)
Command: !ep
(9.000000 8.000000)
Command: !hwidth
2.000000
Command: !width
4.000000
Command: !trad
0.200000
Command: !tspac
0.100000
Command: !pangle
0.708626
Command: !plength
9.219544
Command: !angp90
2.279423
Command: !angm90
-0.862169
Обратите внимание, что PANGLE, ANGP90 и ANGM90 представлены в радианах. После проверки этих значений, выйдите из АвтоКАДа и вернитесь в свой текстовый редактор в GP.LSP.
3.5 Добавление команд в АвтоКАД
Наконец, мы готовы объединить все составные части в команду АвтоКАДа. Если мы определим функцию с именем C:XXX на языке АвтоЛИСП, вводя ХХХ (предполагая,что ХХХ не является командой АвтоКАДа) мы активизируем функцию. Для завершенности ввода в работу нашей команды PATH, мы определяем функцию C:PATH, что дает возможность нам впоследствии после загрузки GP.LSP напечатать только PATH и наша команда garden path будет вычисляться.
Используйте ваш текстовый редактор для добавления указанной строчки в GP.LSP, затем запустите АвтоКАД и загрузите программу.
С добавлением функции C:PATH, мы добавили команду PATH в АвтоКАД. Вы можете проверить команду, осуществив следующий ввод: