<Назад

Далее

5. РАЗРАБОТКА ПРОГРАММ НА ЯЗЫКЕ АВТОЛИСП 


План.

  1. Использование программ на языке Автолисп в среде Автокада
  2. Программирование типовых графических объектов…………….
  3. Программа построения квадрата с окружностью………
  4. Программа построения семейства треугольников……
  5. Программа построения чертежа типовой детали “Втулка”
  6. Программа построения чертежа типовой детали "Прокладка"
  7. Oтладка программ Автолиспа……………………………………………..

5.1. Использование программ Автолиспа в среде Автокада

В зависимости от способа разработки программы и имени основной (последней) функции программа может быть по-разному использована в среде Автокада.

Непосредственный ввод программы с клавиатуры . В ответ на приглашение COMMAND: можно последовательно набирать тексты функций программы на клавиатуре. Изображение будет строиться постепенно, как при работе в диалоговом режиме с редактором ACAD. Значение, возвращаемое каждой функцией, будет выдаваться на экран в нижнюю строку.

Очевидно, что такой способ неудобен, так как при каждом повторном выполнении программу нужно вновь полностью набирать. Этот способ рекомендуется при отладке отдельных функций до их вставки в программу.

Использование программ, содержащих функции пользователя . Программа, набранная на клавиатуре в сеансе работы в графическом редакторе Автокада, может быть использована повторно, если она оформлена как функция пользователя или содержит несколько таких функций (см. п. 3.3.20). Повторный вызов такой программы реализуется как вызов описанной функции в любой момент до завершения текущего сеанса работы. Вызов функции выполняется в соответствии с синтаксисом Автокада, например, (TAN (/ PI 4)) или (TAN 5.2), где (/ PI 4), 5.2 – значения аргументов функции TAN (см. программу п. 3.3.20).

Использование программ, записанных в виде файла . Программу можно создать в виде текстового файла с помощью любого редактора текстов. Текстовый файл программы записывается на диск в соответствующий каталог с присвоением имени и расширения lsp. В среду Автокада программа загружается с помощью функции Автолиспа LOAD (см. п. 3.2.5).

После загрузки программы в ответ на подсказку графического редактора COMMAND: можно вызвать любую функцию, определенную в программе с помощью DEFUN, заключив ее имя в круглые скобки. Если вызываемая функция имеет аргументы, то они указываются после имени.

Оформление Лисп-программы в виде команды Автокада . В этом случае программа оформляется так, чтобы в среде Автокада, ее можно было бы вызвать по имени, как любую команду Автокада (т.е. без круглых скобок). Для этого имя последней (головной) функции, которая описана через DEFUN, должно начинаться с символов "С:". Командами Автокада можно оформить только функции, не имеющие аргументов.

Например:

(DEFUN C:SQC()

; Начало головной функции без аргументов

(INDAT)

; Функция ввода исходных данных

(PARAM)

; Функция расчета параметров

(DRQ)

; Функция построения изображения

)

; Конец головной функции

Подфункции INDAT, PARAM, DRQ необходимо описать до их вызова в головной (последней) функции C:SQC.

Таким образом, структуру Лисп-программы можно представить следующим образом:

(DEFUN FUNC1(PARAM… / VAR…)

; Первая функция пользователя

(<функция Автокада>….(<выражение>… )

; Тело 1-й функции

)

; Конец 1-й функции

…………

; Промежуточные функции

(DEFUN FUNCn(PARAM… / VAR…)

; N-ая функция пользователя

(<функция Автокада>….(<выражение>… )

; Тело n-й функции

)

; Конец n-й функции

(DEFUN C:LASTFUNC()

; Начало головной функции

[(<функция Автокада>….(<выражение>…

)]

; Встроенные функции

(FUNC1)

; Вызов 1-й функции

…………

;

[(<функция Автокада>….(<выражение>…

)]

; Встроенные функции.

(FUNCn)

; Вызов n-ой функции

)

; Конец головной функции

5.2. Программирование типовых графических объектов

5.2.1. Программа построения квадрата с окружностью

Назначение программы. Построение семейства квадратов с описанной или вписанной окружностью, расположенных в выбранном месте чертежного пространства и под разными углами по отношению к базовой координатной оси.

Исходные данные: координаты базовой точки привязки к началу осей координат (P0); размер стороны квадрата (A); угол наклона относительно базовой оси (ANG) и признак типа окружности (TC).

Приведенная ниже программа написана с учетом рекомендаций по составлению алгоритмов программ. Программа содержит функции ввода параметрических данных, расчета характерных точек, необходимых для построения изображения, функцию построения изображения, и головную функцию, оформленную как команду Автокада.

; Программа 1. Построение квадрата с окружностью

; Функция ввода исходных данных

(DEFUN INDAT()

(SETQ P0 (GETPOINT “\n Введите координаты точки привязки P0 >: ”)

A (GETDIST P0 “\n Введите размер стороны квадрата A>: ”)

ANG (GETREAL “\n Введите угол поворота в градусах ANG >: “)

ANR ( / (* ANG PI) 180)

TC (GETSTRING “\n Окружность вписана <Y/y> : “)

TCC (ASCII TC)

) ; Конец функции SETQ

); Конец функции INDAT

; Функция определения координат характерных точек изображения

(DEFUN PARAM()

(SETQ PI2 (/ PI 2)

P1 (POLAR P0 (+ PI2 ANR) A)

P2 (POLAR P1 (+ 0 ANR) A)

P3 (POLAR P0 (+ 0 ANR) A)

PC (INTERS P0 P2 P1 P3)

) ; Конец функции SETQ.

) ; Конец функции PARAM.

; Функция изображения квадрата с окружностью.

(DEFUN DRQ()

(COMMAND “PLINE” P0 “w” “0.5” “” P1 P2 P3 “c”)

(SETQ CI (OR (= TCC 0) (= TCC 121)(= TCC 89)))

(IF CI

(COMMAND “CIRCLE” PC (/ A 2))

(COMMAND “CIRCLE” “2P” P0 P2))

) ; Конец функции DRQ

; Головная функция

(DEFUN C:SQC()

(INDAT) ; Вызов функции ввода данных

(PARAM) ; Вызов функции расчета координат

(DRQ) ; Вызов функции графического построения

) ; Конец функции головной функции C:SQC.

На рис.12 приведены результаты запуска программы C:SQC с различными исходными данными.

а) б) в)

Рис. 12. Фигуры, построенные программой C:SQC с углом поворота (градусы): ноль (а); 45 (б); минус 30 (в)

5.2.2. Программа построения семейства треугольников

Назначение программы. Построение сложного изображения, состоящего из семейства правильных треугольников, каждый из которых повернут на угол 30° относительно предыдущего и имеет сторону, равную его медиане. Первый треугольник может быть расположен в любом месте чертежного пространства и под разными углами по отношению к базовой координатной оси.

Исходные данные: координаты базовой точки привязки к началу осей координат (Pb); размер стороны треугольника (L); угол наклона основания треугольника относительно базовой оси (At).

В программе использована циклическая конструкция ПОКА-ЦИКЛ , которая обеспечивается функцией WHILE

; Программа 2. Построение семейства треугольников

; Функция ввода исходных данных

(DEFUN ID()

(SETQ Pb (GETPOINT "\n Input base point>: ")

At (GETANGLE Pb"\n Input base angle>:")

L(GETDIST Pb "\n Input side of a triangle>:")

); Конец функции SETQ

); Конец функции ввода данных

; Функция построения треугольника

(DEFUN TR(L A / P1 P2)

; P1, P2 - локальные переменные

; Функция определения координат точек

( SETQ P 1 ( POLAR Pb (+ A (/ PI 3)) L )

P2 (POLAR Pb A L)

); Конец функции SETQ

(COMMAND "PLINE" Pb "W" "0.5" "" P1 P2 "c")

);Конец функции TR

; Головная функция построения семейства треугольников

(DEFUN C:TRIA()

; Ввод начальных параметров

(SETQ AN 0.0

PI2(* PI 2)

PI3(/ PI 6))

(ID)

; Начало цикла вычерчивания треугольников

(WHILE (<= AN PI2 )

(TR L AT)

; Изменение значений аргументов функции TR

(SETQ AN(+ AN PI3)

AT(+ AT PI3)

L(* L (/(SQRT 3)2)))

); Конец цикла WHILE

);Конец функции TRIA

Результаты запуска программы иллюстрируются на рис.13.

а) б) в)

Рис. 13. Фигуры, построенные программой C:TRIA с базовым углом (градусы): ноль (а); 90 (б); минус 45 (в)

5.2.3. Программа построения чертежа типовой детали “Втулка”

Назначение программы. Построение изображения типовой детали, принадлежащей к классу 71 [14].

Исходные данные: координаты базовой точки привязки изображения к началу осей координат; диаметры отверстия (D1), буртика (D3) и валика (D2); длины втулки (L1) и буртика (L2). Чертеж втулки с исходными данными и точками, необходимыми для построения изображения, приведен на рис. 10.

Алгоритм нижеприведенной программы построения чертежа втулки является упрощенным вариантом алгоритма, описанного в разделе 4.3.

; Программа 3. Чертеж втулки

;Функция ввода исходных данных

(DEFUN INDAT()

; Установка начальных параметров изображения

(COMMAND "LIMITS" "" "200,100"

"ZOOM" "All"

) ; Конец функции COMMAND

; Ввод размерных параметров

(SETQ P0(GETPOINT "\n Введите базовую точку P0 >:")

D1(GETREAL "\n Введите диаметр отверстия D1 >: ")

D2(GETREAL "\n Введите диаметр валика D2 >:")

D3(GETREAL "\n Введите диаметр буртика D3 >: ")

L1(GETDIST P0 "\n Введите длину втулки L1 >: ")

L2(GETDIST P0 "\n Введите толщину буртика L2 >: ")

) ; Конец функции SETQ

) ; Конец функции INDAT

; Функция расчета координат точек

(DEFUN XYP()

(SETQ PI2 (/ Pi 2)

P01(POLAR P0 0.0 L1)

P1 (POLAR P0 Pi2 (/ D1 2))

P2 (POLAR P0 Pi2 (/ D2 2))

P3 (POLAR P2 0.0 (- L1 L2))

P4 (POLAR P3 Pi2 (/(- D3 D2)2))

P5 (POLAR P4 0.0 L2)

P6 (POLAR P1 0.0 L1)

) ; Конец функции SETQ

) ; Конец функции XYP

; Функция формирования графического изображения втулки

(DEFUN GRV()

; Формирование верхней части втулки

(COMMAND “PLINE” P1 “w” “0.5” “” P2 P3 P4 P5 P6 “c”

“MIRROR” P1 “” P0 P01 “”

“PLINE” P1 (POLAR P1 (- Pi2) D1) “”

“PLINE” P6 (POLAR P6 (- Pi2) D1) “”

“HATCH” “U” “45” “2” “N” P2 (POLAR P2 (- Pi2) D2) “”

“LINETYPE” “S” “ CENTER ” “”

“LINE” (POLAR P0 PI 3) (POLAR P01 0.0 3) “”

“LINETYPE” “S” “CONTINUOUS” “”

) ; Конец функции COMMAND

) ; Конец функции GRV

; Функция простановки размеров

(DEFUN DIMV()

(SETQ P11 (POLAR P1 (- PI2) D1)

P12 (POLAR P2 (- PI2) D2)

P14 (POLAR P4 (- PI2) D3)

P15 (POLAR P5 (- PI2) D3)

PD1 (POLAR P1 PI 5)

PD2 (POLAR P1 PI 15)

PD3 (POLAR P5 0.0 10)

PL1 (POLAR P15 (- PI2) 20)

PL2 (POLAR P15 (- PI2) 10)

) ; Конец функции SETQ

(COMMAND

“DIMDEC” 0

“DIMASZ” 2

“DIMTXT” 3

“DIMTVP” 1.5

“DIMTIH” “OFF”

“DIMTOH” “OFF”

“DIM”

“VER” P1 P11 PD1 “%%c <>”

“VER” P2 P12 PD2 “%%c <>”

“VER” P5 P15 PD3 “%%c <>”

“HOR” P11 P15 PL1 “ <>”

“HOR” P14 P15 PL2 “ <>”

“EXIT” ; Конец команды DIM

) ; Конец функции COMMAND

) ; Конец функции DIMV

; Головная функция

(DEFUN C:VT()

(INDAT) ; Вызов функции ввода исходных данных

(XYP) ; Вызов функции расчета координат точек

(GRV) ; Вызов функции построения изображения втулки

(DIMV) ; Вызов функции простановки размеров

)

На рис. 14 приведены изображения втулки, вычерченные по программе C:VT.

Рис. 14. Примеры изображений втулки, полученные программой C:VT

5.2.4. Программа построения чертежа

типовой детали “Прокладка ”

Назначение программы. Построение чертежа детали типа прокладка, принадлежащей к классу 74 [14].

Исходные данные: координата базовой точки (P0); длина (LG) и ширина (HG) прокладки; размеры, задающие расположение центров отверстий (L1, L2, H1, H2); размер отверстий (D), толщина прокладки (S). Чертеж прокладки с исходными данными приведен на рис.15. Программа построения чертежа прокладки составлена по алгоритму в соответствии с рекомендациями, изложенными в гл.4.

Рис. 15. Чертеж – прототип прокладки

; Программа 4. Чертеж прокладки

; Функция ввода исходных данных

(DEFUN INDAT()

(COMMAND "LIMITS" "" "200,100"

"ZOOM" "A"

) ; Конец функции COMMAND

(SETQ P0 '(100 50) P1 '(100 150)

P2 '(160 150) P3 '(160 50)

PC1 '(120 70) PC2 '(120 130)

PC3 '(140 70) PC4 '(140 130)

D 10 PI2 (/ PI 2)

PLE1 ‘(150 100) PLE2 ‘(170 120)

)

(COMMAND "LINETYPE" "S" "CONTINUOUS" ""

"ZOOM" "w" "70,30" "165,165"

"PLINE" P0 "w" "0.5" "" P1 P2 P3 "c"

"CIRCLE" PC1 "D"D

"CIRCLE" PC2 "D"D

"CIRCLE" PC3 "D"D

"CIRCLE" PC4 "D" D

"DIM"

"DIMDEC" 0

"DIMASZ" 2

"DIMTXT" 3

"DIMTVP" 1.5

"DIMTIH" "OFF"

"DIMTOH" "OFF"

"HOR" P0 P3 (POLAR P0 (- PI2) 10) "LG"

"HOR" P1 PC2 (POLAR P1 PI2 10) "L1"

"HOR" PC2 PC4 (POLAR P1 PI2 10) "L2"

"VER" P0 PC1 (POLAR P0 PI 10) "H1"

"VER" PC1 PC2 (POLAR P0 PI 10) "H2"

"VER" P0 P1 (POLAR P0 PI 20) "HG"

"DIA" (POLAR PC1 (/ PI 6) 5) "%%C D" ""

“DIMBLK” “DOT”

“LEA” PLE1 PLE2 “” “S”

“DIMBLK” “.”

"EXIT"

)

(DEFUN LPARAM(POINT1 POINT2 / DIM)

(SETQ DIM (SSNAME(SSGET "C" POINT1 POINT2)0))

(REDRAW DIM 3)

)

(DEFUN INPARAM(PARAM POINT1 POINT2 ANG / DIM)

(SETQ DIM (SSNAME(SSGET "C" POINT1 POINT2)0))

(COMMAND "TEXT" POINT2 "3" ANG (RTOS PARAM 2 1))

(REDRAW DIM 4)

)

(PROMPT " Введите :")

(LPARAM '(127 43) '(134 41))

(SETQ LG (GETREAL "\n LG >:"))

(INPARAM LG '(127 43) '(134 41) "0")

(LPARAM '(77 97) '(79.5 104))

(SETQ HG (GETREAL "\n HG >:"))

(INPARAM HG '(77 97) '(79.5 104) "90")

(LPARAM '(108 163) '(113 160.5))

(SETQ L1 (GETREAL "\n L1 >:"))

(INPARAM L1 '(108 163) '(113 160.5) "0" )

(LPARAM '(127 163) '(134 160.5))

(SETQ L2 (GETREAL "\n L2 >:"))

(INPARAM L2 '(127 163) '(134 160.5)"0" )

(LPARAM '(87 57.5) '(89.5 63))

(SETQ H1 (GETREAL "\n H1 >:"))

(INPARAM H1 '(87 57.5) '(89.5 63) "90" )

(LPARAM '(87 97.5) '(89.5 104) )

(SETQ H2 (GETREAL "\n H2 >:"))

(INPARAM H2 '(87 97.5) '(89.5 104) "90")

(LPARAM '(127 82) '(135.5 79.5) )

(SETQ D (GETREAL "\n D >:"))

(INPARAM D '(127 82) '(135.5 79.5)"30")

(LPARAM '(165 120) '(170 115) )

(SETQ S (GETREAL "\n S >:"))

(INPARAM S '(165 120) '(170 115) "0")

(SETQ ENDPAR(GETSTRING"\n Конец ввода . Нажмите любую клавишу "))

(COMMAND "ERASE" "c" ‘(75 165) ‘(175 40) "")

)

;Функция расчета координат точек

(DEFUN XYPOINT()

(SETQ P0(GETPOINT "\n Координаты точки привязки P0 >:")

P1(POLAR P0 PI2 HG)

P2(POLAR P1 0.0 LG)

P3(POLAR P0 0.0 LG)

PC1(LIST(+(CAR P0)L1)(+(CADR P0)H1))

PC2(POLAR PC1 PI2 H2)

PC3(POLAR PC2 0.0 L2)

PC4(POLAR PC1 0.0 L2)

)

)

; Функция построения изображения прокладки

(DEFUN DRAWING()

(SETVAR “CELTSCALE” 10)

(COMMAND

"LINETYPE" "S" "CONTINUOUS" ""

"PLINE" P0 "W" "0.5" "" P1 P2 P3 "C"

"DONUT" (- D 1) (+ D 1) PC1 PC2 PC3 PC4 ""

"DIM"

"HOR" P0 P3 (POLAR P0 (- PI2) 10) "<>"

"HOR" P1 PC2 (POLAR P1 PI2 10) "<>"

"HOR" PC2 PC3 (POLAR P1 PI2 10) "<>"

"VER" P0 PC1 (POLAR P0 PI 10) "<>"

"VER" PC1 PC2 (POLAR P0 PI 10) "<>"

"VER" P0 P1 (POLAR P0 PI 20) "<>"

"DIA" (POLAR PC1 0.0 (/ D 2)) "<>"

(POLAR PC1(/ PI 6) (/ D 2))

“DIMBLK” “DOT”

(SETQ PLE1 (POLAR PC4 PI2 (/ H2 2))

PLE2(POLAR PLE1 (/ PI 4) (*(+(- LG L1 L2)5)2)))

“LEA” PLE1 PLE2 “”

(STRCAT “ S” (ITOA(FIX S))) “*”

“DIMBLK” “.”

"EXIT"

"LINETYPE" "S" "CENTER2" ""

"LINE" (POLAR PC1 PI (+(/ D 2)2))

(POLAR PC4 0.0 (+(/ D 2)2)) ""

"LINE" (POLAR PC1 (- PI2) (+(/ D 2)2))

(POLAR PC2 PI2 (+(/ D 2)2)) ""

"LINE" (POLAR PC2 PI (+(/ D 2)2))

(POLAR PC3 0.0 (+(/ D 2)2)) ""

"LINE" (POLAR PC4 (- PI2) (+(/ D 2)2))

(POLAR PC3 PI2 (+(/ D 2)2)) ""

"LINETYPE" "S" "CONTINUOUS" ""

)

)

; Головная функция

(DEFUN C:PROK()

(INDAT)

(XYPOINT)

(DRAWING)

)

Варианты изображений прокладки, полученные программой C:PROK, приведены на рис. 16.

Рис. 16. Примеры изображений прокладки, полученные программой C: PROK

Контрольные вопросы и задачи

  • 1. Как можно использовать программы, написанные на Автолиспе, в среде Автокада?
  • 2. Как создать новую команду Автокада с помощью Автолисп программы?
  • 3. Перечислите функции пользователя программы C:TRIA.
  • 4. Составьте алгоритм программы C:TRIA.
  • 5. Какие функции Автолиспа использованы для расчета координат точек в функции XYP в программе построения изображения втулки – C:VT?
  • 6. Добавьте в программу C:VT функцию простановки отклонений размеров, допусков формы и расположения поверхностей.
  • 7. Напишите на языке Автолисп программу заполнения в диалоговом режиме основной надписи чертежа.
  • 8. Найдите в программе C:TRIA цикл и объясните как он организован.
  • 9. Напишите на языке Автолисп программу аналогичную программе C:TRIA для другой геометрической фигуры.
  • 10. Напишите на языке Автолисп программу построения чертежа зубчатого колеса.

5.3. Отладка программ Автолиспа

В процессе отладки программ приходится исправлять различного вида ошибки [11]. Если функция *ERROR* не определена пользователем, тогда ошибка является стандартной и сообщение о ней выводится на экран дисплея в виде: error: <message> (ошибка: <сообщение>). Ниже в табл. 9 приведены сообщения об ошибках, которые генерирует интерпретатор Автолиспа.

Таблица 9

Сообщения интерпретатора Лиспа о синтаксических ошибках

Сообщение об ошибке:

Описание причин:

1

2

bad argument type

Неправильный тип аргумента функции

bad association list

Неправильный ассоциативный список, объявленный функцией ASSOC

bad entmod list

Неправильный список функции ENTMOD

bad formal argument list

Неправильный список формальных аргументов функции.

bad function

Неправильно указано имя функции в списке

bad list

Неправильно образован список

bad node

Ошибочный узел памяти переменной, определенной функцией TYPE

bad node type in list

Неверный узел памяти переменной, определенной функцией FOREACH

bad point argument или bad point value

Неправильно указаны значения координат точки

boolе arg1 < 0 or >15

Неправильный первый аргумент функции BOOLE. Он должен быть целым числом между 0 и 15

can't evaluate expression

Невозможно вычислить выражение. Эта ошибка может быть вызвана неправильным местоположением десятичной точки или неправильно сформулированным выражением

console break

Выполнено прерывание командой CTRL C

divide by zero

Ошибка деления на нуль

extra right paren

В выражении или программе обнаружены лишние правые скобки

file not open

Ошибка открытия файла, например, описатель файла для операции ввода-вывода указан неверно

function cancelled

Выполнена отмена функции, например, введена команда CTRL C в ответ на подсказку

function undefined for argument

Аргумент функции не соответствует диапазону его значений

function undefined for real

Аргумент функции не может быть действительным числом

Окончание табл.9

1

2

improper argument

Аргумент несовместим с функцией, например, у функции GCD один из аргументов отрицательное число или ноль

incorrect number of arguments to a function

Неправильное количество аргументов в определяемой пользователем функции, т. е. не соответствует количеству формальных аргументов, объявленных функцией DEFUN

insufficient node space

Недостаточно памяти для того, чтобы выполнить необходимые процедуры

insufficient string space

Недостаточно памяти для строки текста

invalid argument

Неправильный тип аргумента или аргумент находится вне диапазона

invalid character

Выражение содержит неправильный символ

invalid dotted pair

Неправильно задана точечная пара

lispstack overflow

Стек Автолиспа переполнен. Переполнение стека происходит из-за многократного повторения функции или очень больших списков аргументов функции. Необходимо увеличить LISPSTACK для переменных

malformed list

Неправильно сформирован список Лисп-программы. Сообщение выдается, если в Лисп-программе не хватает правых скобок

misplaced dot

Неправильное местоположение десятичной точки, действительное число начинается с десятичной точки

null function

Несуществующая функция

quit\ exit abort

Вызов функций QUIT или EXIT, которые не используются в Автолиспе

too few argyments

Указано недостаточно число аргументов при вызове функции

too many argument

Указаны лишние аргументы при вызове функции

unexpected signal nnn

Получен неожиданный сигнал (сообщение выдается только в системе UNIX)

 



Назад Далее