3.3 Начало

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

АвтоЛИСП, как и многие другие языки программирования, определяет углы в радианах. Радианы измеряют углы от 0 до 2'PL. Так как большинство измеряет углы в градусах, мы определим функцию, которая преобразовывает градусы в радианы. Используя ваш редактор текста, создайте файл GP.LSP. Введите следующую программу:

: Convert angle in degree to radians

(defun dtr (a)

(*pi (/a 180.0))

)

Давайте рассмотрим, что это даст. Мы определили функцию, применив в АвтоЛИСПе функцию DEFUN. Функция называется DТR (сокращение от "degrees to radians" ("градусы в радианы")).

Она содержит один параметр "а" - угол в градусах. В результате - выражение:

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.


Информация о работе «АвтоЛИСП - реализация языка программирования»
Раздел: Информатика, программирование
Количество знаков с пробелами: 92410
Количество таблиц: 6
Количество изображений: 0

Похожие работы

Скачать
138339
34
32

... для загрузки конвейера (зав. № 1) крупнокусковой (более 450…550 мм) железной рудой с высоты 4,5 м. 11-12 ноября 1998 г. вопросы организации в г.Брянске серийного производства конвейеров с подвесной лентой конструкции ИПЦ «КОНВЕЙЕР» были рассмотрены и одобрены на проведенном в г. Губкин Белгородской обл. Международном семинаре-совещании специалистов предприятий, занимающихся производством ...

0 комментариев


Наверх