5. РАЗРАБОТКА ПРОГРАММ НА ЯЗЫКЕ АВТОЛИСП |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
План.
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, должно начинаться с символов "С:". Командами Автокада можно оформить только функции, не имеющие аргументов. Например:
Подфункции INDAT, PARAM, DRQ необходимо описать до их вызова в головной (последней) функции C:SQC. Таким образом, структуру Лисп-программы можно представить следующим образом:
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 Контрольные вопросы и задачи
5.3. Отладка программ Автолиспа В процессе отладки программ приходится исправлять различного вида ошибки [11]. Если функция *ERROR* не определена пользователем, тогда ошибка является стандартной и сообщение о ней выводится на экран дисплея в виде: error: <message> (ошибка: <сообщение>). Ниже в табл. 9 приведены сообщения об ошибках, которые генерирует интерпретатор Автолиспа. Таблица 9 Сообщения интерпретатора Лиспа о синтаксических ошибках
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||