ÔÅÄÅÐÀËÜÍÎÅ ÀÃÅÍÒÑÒÂÎ ÏÎ ÎÁÐÀÇÎÂÀÍÈÞ
Ãîñóäàðñòâåííîå îáðàçîâàòåëüíîå ó÷ðåæäåíèå âûñøåãî ïðîôåññèîíàëüíîãî îáðàçîâàíèÿ ÑÀÍÊÒ-ÏÅÒÅÐÁÓÐÃÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ ÀÝÐÎÊÎÑÌÈ×ÅÑÊÎÃÎ ÏÐÈÁÎÐÎÑÒÐÎÅÍÈß
ПРОГРАММИРОВАНИЕ В AUTOCAD Методические указания к выполнению курсовой и дипломной работы
Ñàíêò-Ïåòåðáóðã 2006
Составитель И. А. Салова Рецензент доктор технических наук, профессор В. В. Хрущев Рассматриваются основы программирования на языке AutoLisp в среде VisualLisp. Приводится пример документированной диалоговой программы и примеры заданий для выполнения курсовой работы. Методические указания предназначены для студентов специальности “Управление и информатика в технических системах” и смежных специальностей. Подготовлены кафедрой управления и информатики в технических системах и рекомендованы к изданию редакционно-издательским советом Санкт-Петербургского государственного университета аэрокосмического приборостроения.
Редактор А. В. Семенчук Компьютерная верстка Н. С. Степановой
Подписано к печати 27.04.06. Формат 60×84 1/16. Бумага офсетная. Печать офсетная. Усл. печ. л. 3,54. Уч. -изд. л. 3,9. Тираж 150 экз. Заказ № 228
Редакционно-издательский отдел Отдел электронных публикаций и библиографии библиотеки Отдел оперативной полиграфии ГУАП 190000, Санкт-Петербург, ул. Б. Морская, 67
© ГОУ ВПО «Санкт-Петербургский государственный университет аэрокосмического приборостроения», 2006
2
ПРЕДИСЛОВИЕ AutoCad широко используется как «графический кульман». Однако AutoCad является не только графическим редактором, но и мощной средой программирования для создания автоматизированных рабочих мест для специалистов различных направлений. AutoCad является открытой системой, что дает возможность дополнять стандартные средства собственными наработками. Основной язык программирования в среде AutoCad – AutoLisp (один из диалектов языка программирования высокого уровня Common LISP), созданный в 1986 г. и являющийся собственной разработкой компании Autodesk; LISP – это сокращение от LISting Processing (обработка списков). AutoLisp относится к функциональным языкам программирования, так как в основу положено понятие функции. Задача курсовой работы – освоение языка программирования AutoLisp и разработка программы параметризованной геометрической модели или чертежа.
3
1. ХАРАКТЕРИСТИКА ЯЗЫКА AUTOLISP 1.1. Типы данных Основные типы данных в AutoLisp:списки; строка; действительные числа; целые числа; дескрипторы файлов; точечная пара; имена примитивов AutoCad; наборы AutoCad; встроенные функции (subr). В программировании на AutoLisp используются символы и символьные структуры. Символ – это имя, состоящее из букв, цифр и специальных знаков за исключением () – круглых скобок; . – точки; ‘ – апострофа; “ – кавычек; ; – точки с запятой. Список представляет собой упорядоченную последовательность, элементами которой являются атомы или списки. Списки заключаются в круглые скобки, элементы списка разделяются пробелами. Список всегда начинается с открывающейся скобки и заканчивается закрывающейся. Атом – это неделимый элемент списка. Понятия списка и атома являются ключевыми понятиями языков семейства LISP. Любые другие типы данных являются либо атомами, либо списками. Примеры списков: Примеры атомов: ( 34 26.8) 12.6 (“CAT” “EATS” “MOUSE”) “MOUSE” (1 (12 9.28) (“ГУАП” “Факультет”)) () (setq point ‘(100.0 25.2 7.8)) (* 2 5) Строковая константа выглядит как набор печатных символов, заключенных в кавычки. Целые числа могут быть положительными или отрицательными (без дробей и десятичной точки). Диапазон целых чисел – -2147483648 до 2147483647. Исключение для функции GETINT – диапазон -32768 +32767. 4
Действительные числа – это положительные или отрицательные числа с десятичной точкой. Не разрешается начинать или заканчивать число десятичной точкой 2.12 3.11592652543 -92722.121344 1.23544Е+17. Переменные в AutoLisp не надо описывать – тип данных определяется автоматически при присвоении переменной значения. Типы данных AutoLisp с помощью функции TYPE идентифицируются следующим образом: Возвращаемое значение функции
INT REAL STR FILE LIST SUBR SYM
Тип данных
Целые величины Числа с плавающей точкой Строковые константы Дескрипторы файлов Списки и функции пользователя Внутренние функции AutoLisp Символьный
Переменная может быть атомом (целого, вещественного или строкового типа), а может быть списком. Выражение – список, в котором первым элементом является имя функции. (имя функции аргумент1 аргумент2 … аргументN) Предопределенные символы: T – логическая константа, имеющая значение “истина”, Nil – пустое значение (оно же в логических операциях имеет значение “ложь”), Pi – постоянная 3.14159…, Pause – постоянная, позволяющая ввести паузу при работе команды AutoCad. Комментарии начинаются с символа ; . 1.2. Системные переменные AutoCad Среда графического редактора AutoCad позволяет изменять режимы, переопределять лимиты, менять размеры прицелов объектной привязки и выбора объектов, получать информацию о различных установках графического редактора. 5
Все настройки графического редактора управляются системными переменными. Системные переменные делятся на: модифицируемые пользователем; защищенные (нельзя изменять ни программно, ни при помощи команды). Для доступа к системной переменной из программы используется функция (getvar “имя системной переменной “), а для ее изменения – функция (setvar “имя системной переменной “ “новое значение”). 1.3. Функция присвоения (setq <переменная1> <выражение1> [<переменная2> <выражение2>… <переменнаяN> <выражениеN>]) П р и м е р: (setq a “bb” b 2.5 c ‘(0 0)) В любое время можно посмотреть значение переменной из командной строки AutoCad. Восклицательный знак !, введенный в командной строке, означает, что следующий за ним идентификатор является именем переменной AutoLisp. Command: !b <ENTER> Command:!a “bb” (set ‘a 3) – эквивалентно – (setq a 3) (set ‘b ‘c) – возвращает символ c (set ‘a ‘(+ k f)) – возвращает список (+ k f) 2. СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ AUTOLISP (defun VVOD() . . .
; – пользовательская функция VVOD ; (подпрограмма) ; тело функции
) (defun GEOM() . 6
; – пользовательская функция ; GEOM(подпрограмма)
. . ) (defun C:Myfunc() (VVOD) (GEOM) )
; тело функции
;) основная программа Myfunc. ; вызов функции VVOD ; вызов функции GEOM
Все функции составляют файл, например с именем My.lsp. Он вводится с помощью текстового редактора, например БЛОКНОТа или в среде VisualLisp. 1. Для запуска программы My.lsp в текущем рисунке необходимо: в командной строке AutoCad набрать строку (load “My” [“Файл не найден”]) или (load “E:\\Student\\My”) или из меню Сервис выбрать пункт Приложения, и из открывающегося окна выбрать свой файл. Полный путь доступа указывать необязательно, если сделать в AutoCad дополнительные настройки, для чего выбрать пункт меню Сервис – Настройка. Из открывшегося диалогового окна выбрать закладку Files – Support File Search Path и c помощью кнопки Add добавить имя своего пути доступа. В случае удачной загрузки возвращаемое значение функции load – имя последней загружаемой функции. Необязательный текст сообщения “Файл не найден” появляется в случае, если файл отсутствует. Для запуска программы My.lsp во всех рисунках необходимо ввести команду: (vl-load-all <файл>) Возвращается значение T в случае успешной загрузки. 2. После успешного выполнения п. 1 в командной строке набрать имя основной функции Myfunc или последней строкой программы после основной функции использовать одну из записей: (command (C:My)) (vl-cmdf (C:My))
7
3. ПРАВИЛА ОТЛАДКИ В СРЕДЕ VISUALLISP 3.1. Синтаксические ошибки К синтаксическим относятся ошибки, вызванные недостаточным или избыточным количеством скобок или кавычек, нарушением формата записи функций и др. Для проверки всего текста программы следует указать кнопку панели инструментов
– Check Edit Window. Возникает окно Build Output
(Окно вывода). При отсутствии синтаксических ошибок в окне выводится сообщение [CHECKING TEXT myprog.lsp loading...] ; Check done. – Проверка завершена Иначе выводится сообщение с указанием ошибки, например сообщение “error malformed list on input (неправильный список на входе)” – недостает правой скобки; “extra right paren on input (лишняя правая скобка на входе )“; “ malformed string on input (неверная строка на входе)” – пропущена кавычка; “too few arguments in SETQ (слишком мало аргументов в SETQ)” – нарушен формат функции setq. Для проверки выделенной части программы следует выбрать кнопку
– Check Selection. 3.2. Устранение синтаксических ошибок
Следует дважды щелкнуть на строке сообщения об ошибке, которое выделено, как правило, голубым цветом, – произойдет переход в текстовое окно редактирования. Если ошибка связана с нарушением формата функции, эта функция будет выделена. Если имеется лишняя скобка, она также будет обнаружена. В остальных случаях необходимо проверить соответствие скобок. Для этого нужно: перейти в текстовое окно программы; установить курсор мыши в начало проверяемого выражения перед его левой скобкой, и нажать последовательно сочетание клавиш CTRL+], 8
удерживая клавишу CTRL. Будет найдена ответная правая скобка. При нажатии CTRL + [выявляется ответная левая скобка. 3.3. Форматирование текста программы Указать на панели инструментов кнопку
– Format Edit Window.
Текст программы примет наглядный удобный вид для чтения программы. Для форматирования части текста используется кнопка
–
Format Selection. Предусмотрена возможность детальной настройки режима форматирования (рис. 1): Tools (инструменты)\Environment Options(настройка рабочей среды )\Visual Lisp Format (настройка формата Visual LISP). Для комментирования части программы следует использовать клавишу
, а для снятия комментария – клавишу
.
3.4. Загрузка и выполнение программы После устранения синтаксических ошибок программу нужно загрузить в оперативную память и выполнить. Для этого надо указать кнопку панели инструментов
– Load active edit window. Произойдет загруз-
ка программы в оперативную память. Откроется окно консоли. Для выполнения программы необходимо ввести в консоль имя выполняемой функции. П р и м е р: (defun mo () (setq p0 nil p1 nil p2 nil p3 nil) (setq a 100 b 100 ) (setq p0 (list 0 0)) (setq p1 (polar p0 0 a) p2 (polar p1 (/ pi 2.0) b) p3 (polar p2 pi a) ) (command “_LINE” p0 p1 p2 p3 “_C”) ) 9
а)
б)
Рис. 1. Диалоговое окно настройки режима форматирования: а – русский вариант; б – английский вариант
10
В нижнюю строку консоли вводится имя функции с ее параметрами, заключенными в скобки, т. е. (mo). Начнется выполнение программы. 3.5. Устранение ошибок на стадии выполнения программы После устранения синтаксических ошибок наступает очередь ошибок, связанных с неправильными значениями переменных, неверно примененными функциями и т. д. Эти ошибки выявляются в процессе выполнения программы. При наличии рассматриваемых ошибок программа прерывается и в консоль выводится сообщение об ошибке. Для определения по тексту программы места ее прерывания применяют трассировку или режим анимации. Отладка в режиме анимации Надо указать в падающем меню Debug (Отладка) \ Animate (Анимация), a затем загрузить и начать выполнение отлаживаемой программы, введя с консоли ее имя (mo). На экране наблюдается выполнение программы в замедленном режиме. Выполняемые функции последовательно высвечиваются. В случае ошибки анимация прерывается, место ошибки в тексте программы остается выделенным. Если анимация “затянулась”, ее можно прервать с клавиатуры клавишей BREAK. Скорость анимации регулируется в меню редактора VLISP: Tools (Инструменты) \ Environment Options (Настройки рабочей среды) \ General Options (Общие настройки)\ Diagnostic (Диагностика). Контроль значений переменных Необходимость контроля значений переменных возникает в двух случаях: программа прерывается по ошибке, программа выполняется до конца, но дает неверный или сомнительный результат, и требуется проконтролировать алгоритм вычислений. Если вследствие ошибки произошло прерывание программы, можно посмотреть значения всех переменных и результаты выполнения любого выражения в тексте программы до момента прерывания. Это позволит разобраться в причинах, вызвавших ошибку. Сначала с помощью анимации определяется место ошибки. Затем следует установить курсор на символ какой-либо переменной или выделить курсором необходимое выражение и нажать кнопку
панели инструментов Возникнет окно на11
блюдения Watch, в верхней строке которого приведено текущее значение проверяемой переменной или выражения. Анализ выведенного значения, как правило, позволяет понять ошибку. Искусственное прерывание программы Наиболее сложно устранить ошибку, если программа выполняется без “сбоя”, но выдает неверный результат. В этом случае программу искусственно прерывают и осматривают значения переменных. Для прерывания программы достаточно установить курсор в необходимом месте по тексту программы и указать кнопку
– Toggle breakpoint
на панели инструментов VLISP. Место остановки выделится красным маркером. После этого надо запустить программу, ее выполнение прервется в указанном месте. Значения переменных, вычисленные к моменту заданного прерывания, можно посмотреть посредством клавиши Для продолжения программы следует нажать кнопку
.
–continue.
Во время прерывания можно посмотреть текущее состояние рисунка. Для этого нужно перейти в графическое окно AutoCad, указав кнопку на панели задач (как правило, в нижней строке экрана). Чтобы вернуться в редактор (для продолжения отладки программы), укажите кнопку Visual LISP в панели задач
.
Если отладка закончена и нужно завершить выполнение программы, необходимо отменить прерывание. Для этого курсор устанавливается на маркер прерывания и повторно нажимается клавиша
. Красный
маркер останова снимается. В тексте программы можно задать несколько точек останова и последовательно переходить от одной к другой, нажимая кнопку
12
.
4. ВСТРОЕННЫЕ ФУКЦИИ 4.1 Геометрические функции В AutoCad существуют два понятия системы координат: мировая (МС) и пользовательская система координат (ПСК). Здесь и далее при описании функций используется ПСК, однако все нижесказанное справедливо и для МС. Способы задания точек Абсолютные координаты
Полярные координаты
(s e tq <точка> '(X Y)) (s e tq <точка> (lis t X Y)) Функция возвращает точку в ПСК c абсолютными координатами (X Y)
(s e tq p0 '(100.5 50.25)) (s e tq p0 (lis t 100.5 50.25))
(polar <точка> <угол > <расстояние>) Возвращает точку в ПСК, находящуюся под заданным углом и расстоянием от заданной точки; угол измеряется в радианах в направлении против часовой стрелки от оси X Примеры (s e tq p1 (polar '(10 20) 0 200)) (s e tq p2 (polar p0 (/ pi 4.0) 100))
Другие геометрические функции (dis tance <точка 1> <точка 2>) Возвращает расстояние между двумя трехмерными точками Возвращает угол в радианах, образованный (angle <точка 1> <точка 2>) лучом, направленным из точки 1 в точку 2 и осью Х текущей плоскости построений. Угол измеряется против часовой стрелки Возвращает точку пересечения двух от(inte rs <точка 1> <точка 2> резков (точкa 1 точка 2) и (точка З точ<точка З> <точка 4> [par]) ка 4). Все точки выражены в координатах текущей ПСК. Если факультативный аргумент par присутствует и является nil, то определяется пересечение не отрезков, а бесконечных прямых, проходящих через эти точки. В этом случае будет определяться точка кажущегося пересечения. Если же par отсутствует, то точка пересечения принадлежит обоим отрезкам. В этом случае отрезки (отрезки должны пересекаться), иначе будет возвращен nil
13
Режим объектной привязки несомненно важен при интерактивной работе в AutoCad. Иногда удобно определять точки по функции (osnap <точка> <режим>), которая возвращает точку, являющуюся результатом применения объектной привязки, задаваемой в строке “режим” для указанной точки. Режим – строковая константа, состоящая из одного или более идентификаторов объектной привязки, разделенных запятыми, как, например, “_end” (конечная); “_nod” (узел) , “_mid” (середина); “_qua” (квадрант) “_int” (пересечение) “_cen” (центр ) “_nea” (ближайшая) Например, (setq pt2 (osnap pt1 “_end, _mid”)) 4.2. Математические функции AutoLisp включает в себя достаточно широкий набор встроенных функций, позволяющих производить математические вычисления. Аргументами математических функций являются числа, которые могут быть как целыми, так и вещественными. Если все аргументы – целые числа, то результат операции также будет целым числом, а любая дробная часть будет опущена. Если хотя бы один аргумент – вещественное число, то результат операции будет вещественным числом (например, число 2.0 считается вещественным, поскольку в нем присутствует десятичная точка). К математическим функциям относятся: Функция
Назначение
(+ <число1> <число2> ...) Сумма всех аргументов (setq a (+ 1 3)) 4 (- <число1> <число2> ...) Разность (setq a ( - 10 4 7)) - 1 Если число аргументов равно 1, то вычитание производится из 0 (* <число1> <число2> ...) Возвращает произведение всех чисел (/ <число1> <число2> ...) Делит число 1 на число 2 и возвращает частное Если задано более двух аргументов, то первое число делится на произведение всех остальных (/ 3 2 ) 1 (/ 5 7) 0 (/ 5 7.0) 0.714286 Увеличение или уменьшение целого или дейст(1+ <число>) вительного числа на 1 (1- < число>)
14
Функция
(abs <число>)
(s in <число>) (cos <число>) (atan <число1> [<число2>])
(е хр <сте пе нь>)
(e xpt <основание > <сте пе нь>)
Назначение
Вычисление абсолютного значения действительного или целого числа (abs - 1.1) 1.1 Возвращает значение синуса угла, заданного аргументом в радианах Возвращает значение косинуса угла, заданного аргументом в радианах Если не задано <число 2>, то возвращает арктангенс переменной <число 1> в радианах, область допустимых значений – [pi, - pi] радиан. Если заданы оба числа, то возвращается арктангенс переменной <число 1>/<число 2> в радиа- н ах. Если <число 2> – нуль, то в зависимости от з нака переменной <число 1> возвращается + или 1.570796 радиан (+90 или –90 град) Вычисляет значение экспоненциальной функции с основанием е и аргументом <степень> (exp 1) 2.718… (exp 0) 1.0 Вычисляет значение экспоненциальной функции с указанными основанием и степенью (expt 2 2) 4 (expt - 2 2) 4 (expt 4 – 1) 0 (оба аргумента целые) (expt 4 – 1.0) 0.25 (хотя бы один аргумент вещественный)
4.3. Функции для работы со списками Функция
Описание
(lis t вы р1 вы р2 …) Составляет список из аргументов (setq p0 (list 100 200 300)) – задание начальной точки с координатами 100, 200, 300 (для двухмерного пространства достаточно двух аргументов) Возвращает первый элемент списка – значение (car список) (setq Xp (car p0)) – в переменной Xp содержится координата X точки p0 Возвращает все элементы списка, кроме первого. Ре(cdr список) зультат является списком (setq U (cdr p0)) В переменной U содержится список (200 300)
15
Функция
Описание
Возвращает второй элемент списка – значение. Это эквивалентно (car (cdr p0)) (setq Yp (cadr p0)) В переменной Yp содержится координата Y точки p0 (caddr список) Возвращает третий элемент списка – значение.Это эквивалентно (car (cdr (cdr p0))), например (setq Zp (caddr p0)). В переменной Zp содержится координата Z точки p0 (nth номе р список) Извлекает элемент списка с нужным номером. Первый элемент списка имеет номер 0 (setq d '(11 12 13 14)) (nth 0 d) 11 (nth 4 d) nil (las t список) Возвращает последний элемент списка или nil, если список пуст (last ‘( )) nil (last ‘(16 23 90)) 90 (re ve rs e список) Возвращает список с элементами, переставленными в обратном порядке (reverse ‘(11 12 13 14)) (14 13 12 11) (reverse nil) nil (reverse ‘( )) nil (le ngth список) Возвращает целое число, равное числу элементов в списке (length ‘( )) 0 (length nil) 0 (length ‘(15 23 7 9)) 4 Выполняет слияние списков в один. Все аргументы (appe nd список1 должны быть списками список2 … (append ‘(17 20 – 6 ’(10 8 1)) (17 20 – 6 10 8 1) списокN) (cons <арг1> <арг2>) Добавляет к списку первый элемент или создает точечную пару (cons 50 ‘(10 20)) (50 10 20) (cons ‘(10 20) ‘(20 45) ((10 20) 20 45) (cons 8 “0”) (8 . “0”) (cons 2 4) (2 . 4) (cons 262 nil) (262) (me mbe r <эле ме нт> Проверяет принадлежность элемента списку. Если функция обнаруживает <элемент> в списке, то воз<список>) вращает остаток списка или возвращает nil, если не обнаруживает (member 1‘(4 20 1 3)) (1 3) (member 4 ‘(4 2 3 6)) (4 2 3 6) (member 0 ‘(2 4 5)) nil (member (80 nil)) nil Заменяет в списке старый элемент на новый (s ubs t <новы й> <старый> <список>) (subst 6 5 ‘(11 5 7 0)) (11 6 7 0) Удаляет элемент с заданным значением из списка (vl-re move (vl- remove 4 ‘(0 3 6 4 4 8)) (0 3 6 8) <эле ме нт> (vl- remove 5 ‘(0 3 7 8)) (0 3 7 8) <список>) (cadr список)
16
Функция
Описание
(apply ‘<ф ункция> Применяет функцию поочередно ко всем элементам <список>) списка (apply ‘* (list 2 3 5)) 30. Это эквивалентно (* 2 3 5) (apply ‘max (list 2 3 5)) 5 т. е. возвращает максимальное значение Вычисляет список как выражение. В списке на первом (e val <список>) месте должно стоять имя функции (setq a (list ‘max 2 4 6 3)) (eval a) 6 Позволяет организовать циклическое выполнение (fore ach <имя> <список> <вы р1> выражений, поочередно подставляя вместо перемен<вы р2>…<вы рN>) ной цикла (<имя>) элементы списка (setq a (list 1 2 3 4 5)) (setq s1 0 s2 1) (foreach p a (setq s1 (+ s1 p)) (setq s2 (* s2 p))) 120 Результат: s1 = 15 s2 = 120 Применяют функцию сначала к первым элементам каж(mapcar дого из последующих аргументов, затем ко вторым и ‘<ф ункция> т. д. Результаты объединяются в новый список, который <список1> является возвращаемым значением <список2>… (mapcar ‘* ’(2 3) ’(1 5)) (2 15) <списокN>) Схема выполнения: (* 2 1) (* 3 5)
4.4. Функции преобразования Функция
(fix <число>)
(float <число>) (rtos <число> [<ре жим>] [<точность>])
(itoa <це лое >)
Описание
Преобразование действительного числа в целое путем отбрасывания дробной части (fix – 10.05) 10 (fix 0.0) 0 (fix 40.45) 40 Преобразование целого числа в действительное (float 15) 15.0 Преобразование вещественного числа в строку <число> – вещественное или целое число <режим> 1 – научный 2 – десятичный <точность> – количество десятичных знаков в представлении вещественного числа. Если аргументы ре жим и точность не указаны, то используются значения по умолчанию, установленные в системных переменных LUNITS – система единиц и LUPREC – число знаков (rtos 10.9453 1 3) “1.095E+01” (rtos 10.9453 2 3) “10.945” (rtos 10.9453 2 0) “11” Возвращает результат преобразования целого числа в строку (itoa 16) “16”
17
Функция
Описание
Возвращает результат преобразования строки в целое число. Отсекается дробная часть: (atoi “2.5”) 2 (atof <строка>) Возвращает результат преобразования cтроки в действительное число (atof “14”) 14.0 (atof “–29.03”) –29.03 (angtof <строка> Преобразование строки, представляющей значение уг[<пре дставле ние >]) ла в различных форматах в вещественное число, являющееся величиной угла в радианах <представление> – соответствует системной переменной AUNITS: 0 – градусы десятичные, 1 – градусы, минуты, секунды, 2 – грады, 3 – радианы, 4 – топографические единицы (angtof “30” 0) 0.523699 (angtof “33d27'54\”” 1) 0.584074 Преобразование значения угла в радианах в строку (angtos <угол> [<пре дставле ние >] Если аргументы Представление и Точность не указаны, то используются значения по умолчанию, установлен[<точность>]) ные в системных переменных AUNITS - система единиц AUPREC – число знаков (angtos 1 0 0) “57” (angtos 1 1 3) “57d17'45\”” (angtos 1 1 0) “57d” (dis tof <строка> Преобразование строки, представляющей вещественное значение в одном из форматов линейных единиц, [<ре жим>]) в вещественное. Обратная функции rtos. (distof “1” 2) 1.0 (atoi <строка>)
4.5. Функции для работы со строками (s trсat <строка1> Конкатенация строк <строка2> …<строкаN>) (strcat (itoa 12) “- я линия”) “12- я линия” (s trle n <строка1> Вычисляет суммарную длину всех строк- аргу<строка2> …<строкаN>) ментов (strlen “ГУАП”) 4 Выделяет подстроку с заданной позиции (s ubs tr <строка> <начало> [<количе ство>]) (substr “ABCDEF” 3 2) “CD” Получает буквенно- цифровой символ по коду (chr <число>) действующей таблицы символов (chr 192) “A” (русское) Получает код первого символа строки текста (ASCII <строка> по действующей таблице символов (ascii “A”) 192
18
4.6. Логические функции AutoLisp Логический оператор – это функция, сравнивающая между собой два или больше аргумента. Результат сравнения (т. е. некоторое утверждение, касающееся двух аргументов) может быть либо истиной (Т), либо ложью (nil). Основные логические функции – это И (AND), ИЛИ (OR) и НЕ (NOT): Функция
(and выр1 выр2 ...)
(not эле ме нт) (or выр1 выр2 ...)
(= <арг1> <арг2> … <аргN>)
(/= <арг1> <арг2> … <аргN>) (< <арг1> <арг2> … <аргN>)
(<= <арг1> <арг2> … <аргN>)
(> <арг1> <арг2> … <аргN>)
Описание
Возвращает результат выполнения логического И над списком выражений. Возвращается nil, если любое (хотя бы одно) из выражений имеет значение nil, в противном случае – Т (and T nil) nil (and T T 2) T Возвращает результат выполнения логического НЕ над своим аргументом Возвращает результат выполнения логического ИЛИ над списком выражений. Возвращается nil, если все аргументы имеют значение nil; если при оценке аргументов слева направо встречается выражение не – nil, возвращается Т Проверка равенства аргументов (числа и строки) (= - 10.0 - 10 - 10.000) T Лучше не сравнивать результат тригонометрических функций с константой: (setq x (sin 0)) 0.0 (setq y (sin (* 2.0 pi)) - 2.44921e- 016 (= x y) nil Проверка неравенства аргументов любого типа (числа и строки) Проверяет расположение аргументов по возрастанию, слева направо (числа и строки) (< 2 3 30) Т (< 2 2 30) nil (< “a” “b” “k”) T Проверяет расположение аргументов по неубыванию, слева направо (числа и строки) (<= 2 2 30) T Проверяет расположение аргументов по убыванию, слева направо (числа и строки) (> 30 5 3) T
19
Функция
Описание
(>= <арг1> <арг2> … <аргN>) Проверяет расположение аргументов по невозрастанию, слева направо (числа и строки) (> =30 5 5) T (eq <арг1>
) Проверяет равенство двух аргументов. Типы аргументов – любые. Возвращаемое значение T или nil (eq 10 10.00) T идентично = (eq “abc” “ABC”) nil идентично = (setq a (list 1 1 1)) (setq b a) (eq b a) T – две переменные указывают на один и тот же список (setq a (list 1 1 1)) (setq b (list 1 1 1)) (eq a b) nil Это два разных списка (equal <арг1> [<допуск>]) Проверяет равенство двух объектов (для чисел и списков из числовых величин сравнение п роизводится в пределах допуска) (equal – 10.0 –10) T (equal 3.0 3.002 0.002) T (equal ‘(1.00 2.13 2.99) ‘(1 2.13 3.0) 0.1) T
Рекомендации по использованию функций = eq и equal = – для сравнения только целых чисел и строк eq – для проверки, не указывают ли две переменные на один и тот же список equal – для проверки равенства значений выражений (для чисел и списков с возможностью допуска (minusp <число>) (zerop <число>) (null <арг>) (numberp <арг>) (lisp <арг>)
20
Проверка числа на отрицательность (minusp 0) nil (minusp (- 51 24 39)) T Проверка числа на 0 (zerop 0.0) 0 (zerop 1) nil Типы аргументов – любые (null “tt”) nil (null ‘( )) T Проверяет, является ли аргумент целым или действительным числом Проверяет, является ли аргумент списком
4.7. Функции условного ветвления программ Функция
Описание
(if <условие> <выр1> [<выр2>]) Выполняет условную операцию типа ifthen- else. Типы аргументов любые. Возвращаемое значение: вычисленное значение <выр1>, если <условие> – истинно или значение <выр2>, если <условие> – nil Если <выр2> отсутствует, то nil (if (> a b) (+ a 10) (–b 10)) (progn Аналог операторных скобок в Паскале для … сложных операторов (if (> a b) ) (progn (setq c – 1) (setq d (–c а) setq (e d) );end progn (progn (setq c 2) (setq d (* a b)) (setq e (* d b)) ); end progn ); end if (cond (<условие 1> <выр1>….) Условная операция типа cas e в Паскале [(<условие 2> <выр2>….)] (defun mm() (setq cc 1) (cond ((= cc 1) (SETQ ABC “Красный”) (COMMAND “_line” ‘(0 0 0) '(100 100 0) ‘(250 100 0) “_C”) ); end (=cc 1) ((= cc 2) (SETQ ABC “Красный”) (COMMAND “_circle” ‘(0 0 0) 100) ); end (=cc 2) (T “”); если сс>2 или сс<1 );end cond ); end defun
21
4.8. Функции цикла Функция
Описание
Операция цикла по многократно проверяемому условию. Типы аргументов – любые. Возвращаемое значение – последнее выражение или nil (setq i 1 factorial 1) (while (< i n) (setq i (+ i 1) (setq factorial (* factorial i)) ); end while (re pe at <количе ство> <вы р1> Выполняет операцию цикла с фиксированным количеством повторений [<вы р2>….<вы рN>]) <количество> – целое положительное (setq i 1 factorial 1) (repeat (1 – n) (setq i (+ i 1) (setq factorial (* factorial i)) ); end repeat
(while <условие> <выр1> [<выр2>….<вырN>])
5. ВЫЗОВ КОМАНД AUTOCAD ИЗ ПРОГРАММЫ Вызов команд AutoCad из программы на AutoLisp осуществляется с помощью функции command: (command “Имя_команды” aргумент1 аргумент2 …) Имя команды – строковая константа. Аргументы – строки, действительные или целые числа, точки. Пустая строка “” равносильна нажатию пробела на клавиатуре. Если требуется ввод данных с клавиатуры, то используется “\\” или слово pause. Имена команд должны начинаться с префикса “_.”, а опций – с префикса “_”. Точка в префиксе команды означает, что используется “ настоящая ” команда, а не переопределенная пользователем. П р и м е р ы записи команд: 1. LINE – Отрезок (command “_.LINE” “ \\” “\\” … “”) – n точек (command “_.LINE” pt1 pt2 … “”) (command “_.LINE” ‘(10 30) ‘(40 50) … “”) 22
2. CIRCLE – Круг (command “_.CIRCLE” pt1 R) (command “_.CIRCLE” ‘(0 0) 100) (command “_.CIRCLE” pt1 ”_D” D) – задание диаметра (command “_.CIRCLE” ”_2P” pt1 pt2) – по двум точкам (command “_.CIRCLE” ”_3P” pt1 pt2 pt3) – по трем точкам (command “_.CIRCLE” ”_TTR” “\\” “\\” R) – касательная, касательная, радиус 3. ARC – Дуга (command “_.ARC” pt1 pt2 pt3) – по трем точкам (command “_.ARC” pt1 “_C” pt2 “_A” 120) – начало, центр, угол (command “_.ARC” pt1 “_C” pt2 “_L” 100) – начало, центр, хорда (command “_.ARC” pt1 “_E” pt2 “_A” 120) – начало, конец, угол 4. ERASE – Cотри (command “_.ERASE” e “”) – e – набор объектов, может состоять из одного объекта (command “_.ERASE” e1 e2 e3 “”) – стирание нескольких объектов 5. OFFSET – Подобие (command “_.OFFSET” a e pt1) – а – величина смещения e – примитив (command “_.OFFSET” 50 e ‘(30 200)) 6. MOVE – Перенос (command “_.MOVE” e “” pt1 pt2) – e – примитив 7. COPY – Копирование (command “_.COPY” e “” pt1 pt2) 8. ROTATE – Поворот (command “_.ROTATE” e “” pt1 A) – A – угол поворота, e – примитив; pt1 – центр вращения (command “_.ROTATE” e “” pt1 “_R” pt2 pt3 A) – pt2 pt3 – точки задания характерного отрезка, A – абсолютное значение угла. 9. SCALE – Масштабирование (command “_.SCALE” e “” pt1 m) – pt1 – опорная точка, m – масштабный коэффициент. (command “_.SCALE” e “” pt1 “_R” pt2 pt3 L)- – pt2 pt3 – точки задания характерного отрезка, L – значение длины отрезка. 10. MIRROR –Зеркало (command “_MIRROR” ee “” pt1 pt2 “_N”) – ee – примитив или набор примитивов, pt1 и pt2 – точки оси отражения 23
11. ARRAY – Массив (command “_.ARRAY” e “” “_P” p1 n 360 “_Y”) – круговой массив, n – число элементов (command “_.ARRAY” e “” “_R” n_row n_col –30 50) – прямоугольный массив 12. DIVIDE – Деление примитива (command “_.DIVIDE” e n) 13. MEASURE – Деление отрезка на отрезки заданной длины (command “_.MEASURE” e L) 14. EXPLODE – Расчленить (command “_.EXPLODE” e) 15. TEXT – Текст (command “_.TEXT” pt0 “0” “ПРИМЕР”) – текст с заранее установленным стилем текста (command “_.TEXT” “_C” pt0 “0” “ПРИМЕР”) – центрированный текст (command “_.STYLE” name_st name_shrift “5” “0.9” “15” “” “” “”) 16. REGION –Область (command “_.REGION” e1 … en “”) 17. UCS – ПСК (command “_.UCS” “_O” pt1) – перемещает точку отсчета в новую (command “_.UCS” “_3P” pt1 pt2 “”) – задание ПСК по 3 точкам (command “_.UCS” “_S” “a1”) – сохранение ПСК под именем a1 (command “_.UCS” “_W”) – переход в мировую систему координат (command “_.UCS” “_R” “a1”) – переход в ранее созданную ПСК 18. POLYGON – Многоугольник (МН-угол) (command “_.POLYGON” n “_E” pt1 pt2) – многоугольник по стороне pt1 и pt2 – начало и конец стороны (command “_.POLYGON” n ptc “_I “ R) – вписанный многоугольник (command “_.POLYGON” n ptc “_C “ R) – описанный многоугольник 19. DONUT – Кольцо (command “_.DONUT” dv dn ptc1 ptc2 “”) 20. LAYER – Слой (command “_.LAYER” “_N” “OSI “ “_L” “CENTER” “OSI “ “_C” “1” “_OSI “ “_S” “_OSI “ “ “) N – создание нового слоя; L – задание типа слоя; С – задание цвета слоя; S – установка текущего слоя, если он создан; M – установка текущего слоя, если такого нет, то создает; 24
LO – блокировка слоя; U – разблокировка слоя; ON – включает видимость слоя; OFF – отключает видимость слоя; F – замораживает слой; T – разморозить слой Если в программе используется функция COMMAND, то в начале программы надо отключить объектную привязку, а в конце программы вернуть ее в прежнее состояние. П р и м е р: (defun С:My() (setvar ”CMDECHO” 0) ; отключение эхо-вывода (запросы команд и ; ответы на них не отображаются на экране (setq old_osmode (getvar “OSMODE”));сохранение текущей объектной ;привязки в переменной (setvar “OSMODE” 0); отключение объектной привязки (setq a nil b nil ……) ; обнуление всех переменных внутри программы … … (setvar “ORTHOMODE” 1); включение режима OРТO; … … (setvar “ORTHOMODE” 0); отключение режима OРТO; … … (setvar “OSMODE” old_osmode); включение ранее сохраненной ; объектной привязки (setvar “CMDECHO” 1); включение эхо-вывода (setq C:COIL nil); освобождение оперативной памяти, занимаемой ;функцией ) 6. ДОСТУП К ПРИМИТИВАМ И СРЕДСТВАМ AUTOCAD Любой, создаваемый в АutoCad, чертеж состоит из отдельных примитивов, геометрическое описание которых хранится в специальном формате в файле чертежа. В сеансе редактирования каждый примитив имеет имя, по которому его распознает сам AutoCad. Имена меняются от сеанса к сеансу. В программе на AutoLisp надо сначала найти имя примитива в базе данных с тем, чтобы впоследствии извлекать геометрические характеристики. 25
Функция
Описание
Возвращает имя последнего примитива (setq e (entlast)) (e ntge t e ) Доступ к данным, связанным с примитивом В переменной e хранится имя примитива Функция возвращает список, состоящий из подсписков, в которых все данные о примитиве (геометрические, слой, цвет и т. п.) сгруппированы по функциональному назначению Например, ((- 1 . <Имя объекта:2020500> (0 . “LINE”) (8 . “0”) (10. 73.478 160.222 0.0) (11. 250.654 224.473 0.0)…) (assoc код список_данных) Выбор данных из списка данных по коду (assoc 0 ed) – возвращает точечную пару (0 .“LINE”) (cdr (assoc 0 ed)) – имя примитива (“LINE”) (setq P1 (cdr (assoc 10 ed))) – точка начала отрезка (setq X (car (cdr (assoc 10 ed)))) – X – координата начала отрезка (e nts e l [подсказка]) Функция возвращает список, первый элемент которого есть имя выбранного примитива, а второй – координаты точки, использованной для указания примитива. В аргументе [подсказка] содержится текст запроса на указание примитива Аргумент не является обязательным (setq e (entsel “\nУкажите элемент”)) Возвращаемый список: (<Entity name:600014> (3.00 5.00 0.00)) Для доступа к списку данных примитива e следует ввести выражение (setq ed (entget (car e))) (entnext [<имя При вызове без аргумента эта функция возвращает имя первого, не удаленного примитива в базе примитива>]) рисунка (setq e1 (entnext)) Если имеется аргумент, функция возвращает имя следующего примитива или nil, если в качестве аргумента указано имя последнего примитива рисунка (setq e2 (entnext e1)) (entlast)
26
Функция
(e ntde l <имя примитива>)
Описание
Можно использовать в сочетании с функцией e nts e l: (setq e3 (entnext (car (entsel “Укажи примитив”)))) Элемент, указанный в аргументе, удаляется из текущего чертежа и восстанавливается на чертеже, если он был удален перед этим в текущем сеансе редактирования. Удаляемые примитивы уничтожаются из чертежа после окончания сеанса редактирования (setq e1 (entnext)) – присваивается имя первого примитива в рисунке (entdel e1) – удаление e1 (entdel e1) – восстановление e1
Практически все команды редактирования работают не с отдельными примитивами, а с группой примитивов. Функции для работы с набором примитивов представлены в таблице. Функция
(ssget)
(ssget “_L”) (ssget “_W” ‘(0 0) ‘(200 100)) (ssget '(10 20))
(s s le ngth набор) (ssname набор номер)
Описание
Выби рает п о одн ому п ри ми ти в посредством указания на экране. На экране будет каждый раз появляться запрос Выберите объект (selection object). Функция возвращает имя набора в виде, например: <Selection set: 2> Выбирает последний примитив без запроса Выбирает примитивы, находящиеся в рамке, заданной координатами ‘(0 0) и ‘(200 100) Выби рает п ри ми ти в , п роходящи й через точку ‘(10 20). (setq ss (ssget)) Возвращает число примитивов в наборе (setq ss (ssget)) (setq n (sslength ss)) Возвращает имя примитива под номе ром из набора. Перв ы й п ри ми ти в в н аборе и меет н омер 0. (setq e (ssname ss 0)) – возвращает имя первого примитива из набора (setq sset (ssget)) – создает набор с именем sset
27
Функция
(s s me mb имя_примитива набор)
(ssadd)
(ssadd имя_примитива) (ssadd имя_примитива набор)
(s s de l имя_примитива набор)
28
Описание
(setq ent1 (ssname sset 0)) – получает имя первого примитива в sset (setq ent4 (ssname sset 3)) – получает имя четвертого примитива Проверяет, входит ли примитив в набор. Возвращается имя примитива, если он входит в рассматриваемый набор, или nil – если не входит. (setq nabor (ssget “_L”)) – создает набор их последнего примитива и возвращает имя набора <Selection set:7> (ssmemb (entlast) nabor) – возвращает имя примитива, так как последний примитив содержится в наборе Создает новый набор без единого примитива (setq ss (ssadd)) Создает набор, содержащий один примитив (setq ss1 (ssadd e1)) Примитив добавляется в уже существующий набор (setq e1 (entnext)) – в e1 имя первого примитива в рисунке (setq ss (ssadd)) – устанавливает нулевой набор (0 элементов) (ssadd e1 ss) – возвращает набор, в котором добавлен примитив по имени e1 (setq e2 (entnext e1)) – получает примитив, следующий за e1 (ssadd e2 ss) – возвращает набор ss, в котором добавлен примитив, следующий за e2 Уничтожает имя примитива из набора. Возвращаемое значение – имя набора, если операция удаления выполнена, или nil, если примитив не содержится в наборе и удалить его нельзя (ssdel e1 ss)
7. ОРГАНИЗАЦИЯ ДИАЛОГА В AUTOLISP 7.1. Использование функций семейства GET для ввода данных Простейший способ организации диалога – ввод данных с клавиатуры. Для этого существует семейство функций GET. Все функции GET ожидают ответа пользователя, т. е. приостанавливают выполнение программы до тех пор, пока не будет осуществлен ввод (нажата клавиша ENTER). Ввод может быть произведен как с клавиатуры, так и при помощи устройства указания мыши. Все вводимые данные автоматически преобразуются в нужный тип данных. Ниже приведены функции семейства GET. В квадратных скобках указаны необязательные аргументы. Знак \n указывает на то, что текст запроса будет вводиться с новой строки в поле команды. Функция
(getint [текст запроса]) (ge tre al [те кст запроса]) (getstring [текст запроса] ) (ge tpoint [точка] [те кст запроса])
(getdist [точка] [текст запроса])
(ge tkword [запросподсказка])
Описание
Вводится целое число (setq m (getint “\nКоличество рядов”)) Ввод действительного числа (setq rast (getreal “\nВведите длину стороны А”)) Ввод строки (setq st (getstring “\nВведи слово”)) Ожидает ввода координат точки X и Y, если не указан аргумент [точка], иначе рисует “резиновую линию” от точки, указанной в аргументе [точка], до положения курсора. Возвращает список (setq pt1 (getpoint “\Введи точку”)) Возвращает действительное число, если указан аргумент [точка]. В этом случае указывается вторая точка. Если аргумент [точка] не указан, то вводится расстояние – целое или действительное число (setq s (getdist “\n Введи расстояние”)) Запрашивает у пользователя ключевое слово, определенное ранее при помощи функции INITGET. Если ответ не совпадает ни с одним определенным ключевым словом, AutoCad попросит повторить ввод. Если ответ совпадает
29
Функция
(initget [флаг] [строка])
Описание
с ключевым словом, функция GETKWORD возвращает это ключевое слово как строковую константу (initget 1 “Да Нет”) (setq reply (getkword “Продолжить ?[Да/Нет]:”)) Задает ограничения последующего ввода данных. Вызов функции initget должен предшествовать в программе обращению к функциям getint, getreal, getdist, getangle, getpoint. Аргумент [флаг] может принимать следующие значения: 1 – не разрешает пустой ввод (пустой ввод – это нажатие клавиши <ENTER>) 2 – не разрешает ввод 0 4 – не разрешает ввод отрицательных чисел Аргумент [строка] используется для задания списка ключевых слов при вводе (initget 1) – запрет пустого ввода (initget 3) – запрет пустого ввода (1) и ввода 0 (2) (initget 7) – запрет пустого ввода (1), ввода 0 (2) и ввода отрицательных чисел (4) (initget 6) – разрешает пустой ввод, но запрещает ввод 0 (2) и отрицательных чисел (4) (initget 1 “Да Нет”)
7.2. Диалоговое окно Программа на языке AUTOLISP с использованием диалогового окна состоит из двух файлов: файла описания диалогового окна на языке DCL (файла .dcl) ; файла на языке АutoLisp (файла .lsp). Файл на языке DCL состоит из логических единиц – директив, располагаемых в файле последовательно. Каждая директива описывает поле или способ группировки полей. Все элементы языка DCL являются чувствительными к регистру. Для записи директив используются только латинские буквы. В каждом диалоговом окне содержатся одно или несколько полей, определяющих функции окна. К основным типам полей относятся базовые поля: клавиши, кнопки, текстовые поля, поля изображений. Поля могут обрамляться рамкой. В Autocad включены файлы base.dcl и acad.dcl. Файл base.dcl содержит определения базо30
вых, предварительно определенных полей общего пользования. Предварительно определенные поля не могут быть переопределены пользователем. Этот файл не следует модифицировать! Файл acad.dcl содержит определения всех стандартных диалоговых окон. Все определенные пользователем DCL-файлы автоматически ссылаются на поля, определенные в файле base.dcl. Каждое поле может иметь атрибуты. Для просмотра DCL-файла без его запуска в редакторе VisualLisp следует использовать пункт Interface Tools (Инструменты интерфейса) в меню TOOLS (Сервис). Директива описания диалога использует имя, ключевое слово dialog и метку label с названием диалогового окна. Тип поля
:e dit_box
Атрибуты Label= Edit_width=
Edit _limit =
Value= :column
:boxed_column Атрибут Label=
Описание
Текстовое поле. Поле, в котором пользователь вводит или редактирует текстов ую строку. Ecли вводимый текст превышает размеры текстового поля, его можно "прокрутить" в горизонтальном направлении Значение Строка (запрос или название вводимой информации), заключенная в кавычки Ширина редактируемой части поля, ограниченной рамкой текстового поля в единицах ширины символа. Если атрибут не указан или установлен в 0, то рамка расширяется настолько, насколько это возможно Максимальное число символов, которое может ввести пользователь в текстовое поле. По умолчанию – 132, максимум – 256 Строка, заключенная в кавычки (по умолчанию – пустая – “ ”). Исходное значение текстовое, размещенное в рамке Колонка полей. Все элементы колонки располагаются вертикально в порядке расположения в DCL- файле. Колонка может содержать любые типы полей (за исключением отдельной кнопки выбора), включая ряды и другие колонки Колонка, имеющая нарисованную вокруг нее рамку (границу) Значение Значение строка (название колонки в рамке). Атрибут labe l выводится как поле в верхнем левом углу колонки, заключенной в рамку
31
Тип поля
:row :boxed_row Атрибут Label=
:image
Атрибуты Color=
Aspect_ratio=
Width= Height= :Radio_button
32
Описание
Ряд. Аналогичен колонке, но его поля расположены горизонтально в порядке расположения в DCL- файле Ряд, имеющий нарисованную вокруг него рамку (границу) Значение Значение строка (название ряда в рамке). Атрибут labe l выводится как поле в верхнем левом углу ряда, заключенного в рамку Прямоугольник, внутри которого отображается векторное изображение. Изображение используется для показа слайда чертежа с формальными параметрами Значение Цвет фона рисунка, определенный как номер цвета, принятый в Autocad, или одно из символьных имен (по умолчанию 7): Dialog_line – текущий цвет линий диалогового окна; Dialog_foreground – текущий цвет символов диалогового окна (для текста); Dialog_background – текущий цвет фона диалогового окна; Graphic_background – текущий цвет фона графического экрана; Black – цвет 0 (черный) (на черном фоне отображается как белый); Red – цвет 1 (красный); Yellow – цвет 2 (желтый); Green – цвет 3 ( зеленый); Cyan – цвет 4 (голубой); Blue – цвет 5 (синий); Magenta – цвет 6 (фиолетовый); White – цвет 7 (белый) Определяет отношение ширины изображения к его высоте Если значение равно нулю (0.0), то поле подгоняется под размеры изображения Высота и ширина поля Кнопка выбора. Одна или группа кнопок, объединенных в колонку или ряд выбора. Если выбрана одна из кнопок, то любая другая кнопка будет отключена. Кнопки выбора появляются только в колонках или рядах выбора. Если кнопка выбора размещена вне колонки или ряда выбора, то появляется сообщение об ошибке
Тип поля
Описание
Атрибуты Label= Value=
Значение Это текст, выводимый слева от клавиши выбора Заключенная в кавычки строка. Если значение атрибута – единица, то кнопка выбора включена, если – нуль, то отключена; любые другие значения аналогичны нулю. Если по каким- то причинам несколько кнопок имеют атрибут Value, равный единице, будет включена только последняя из них :Boxed_ Колонка выбора, имеющая нарисованную вокруг нее рамку radio_column (границу). Метка трактуется аналогично метке колонки в рамке :Boxed_radio_row Ряд выбора, имеющий нарисованную вокруг него рамку Пустое поле, разделитель. Используется только в целях комSpacer поновки и влияет на размер и расположение смежных полей Поле ошибки. Это поле надписи, которое, как правило, Errtile появляется внизу диалогового окна. По умолчанию оно пусто, но программа может отобразить в нем сообщение, присвоив значение полю с ключом “error”
Ниже приведено описание общих атрибутов, пригодных для любых полей. Тип атрибута
Key=
Fixed_ eight=
Fix ed_widt h=
Описание
Значение – строка, заключенная в кавычки. Ключ определяет имя в символах ASCII и используется программой для ссылки на это поле. Каждое активное поле должно иметь свой ключ, значение которого уникально для диалогового окна. Значение, присвоенное полю, может изменяться во время работы Фиксированная высота поля. Высота поля не растет при компоновке диалогового окна. Возможные значения True или False (по умолчанию False) Ф и кси ров ан н ая ши ри н а п оля. Ши ри н а п оля н е растет п ри компоновке диалогового окна. Возможные значения True или False (по умолчанию False)
33
Предусмотрены клавиши выхода из диалогового окна. Клавиша
Ok_only Ok_cancel
Ok_cancel_help
Описание
Единственная клавиша Да (OK). Ключ key клавиши Да имеет значение “accept” Комбинация клавиш Да и Отмена (OK and Cancel) – стандартная комбинация для диалоговых окон, в которых могут вноситься изменения в данные. Ключ key клавиши Отмена (Cancel) имеет значение “cancel” Группа ok_cancel скомбинирована со стандартной клавишей Помощь (Help). Ключ key клав и ши Помощь и меет зн ачен и е “help”
7.3. Пример диалогового окна Текст содержится в файле COIL.dcl. COIL : dialog { label = ”Введите исходные данные”; :row { : edit_box { label=”Высота h, mm ”; key = “edit1”; fixed_width=true; edit_limit = 6; } : edit_box { label=”Ширина L, key = “edit2”; fixed_width=true; edit_limit = 6; } }
mm”;
:row { : edit_box { label=”Радиус скругления R, mm “; fixed_width=true; key = “edit3”; 34
edit_limit = 6; } : edit_box { label=”Толщина b, fixed_width=true; key = “edit4”; edit_limit = 6; } }
mm “;
: row { : boxed_column { label = ”Точка вставки”; : button { label =”Укажите точку вставки >”; key = “pick_pt”; } : row { : edit_box { label = “X:”; key = “x_pt”; edit_width = 7; } : edit_box { label = “Y:”; key = “y_pt”; edit_width = 7; } } } } :row { spacer; :image { key=”cir_image”; height=8; width=14; 35
color=0; } spacer; } spacer; ok_cancel; errtile; } Экранная форма этого меню показана на рис. 2. Рисунок в диалоговом окне представляет собой слайд. Для его создания используется команда MSLIDE (ДСЛАЙД), которая создает файл с расширением .sld. Созданный слайд не подлежит редактированию.
Рис. 2. Экранная форма меню для приложения COIL.lsp
П р и м е р колонки с кнопками выбора: : boxed_radio_column{ label=”Direction”; fixed_height=true; fixed_width=true; 36
:radio_button { label=”LEFT”; key=”L”; fixed_height=true; fixed_width=true; } :radio_button { label=”Right”; key=”R”; fixed_height=true; fixed_width=true; } } 7.4. Управление диалоговым окном из программы на языке AutoLisp Описание диалогового окна на языке DCL является статической картиной формы окна. Все действия во время диалога и после закрытия окна определяются функциями вызова диалогового окна и обработки результатов диалога, содержащимися в управляющей программе. Ниже приведены функции AutoLisp для управления диалоговыми окнами. Название функции
(load_dialog имя файла)
(unload_dialog dcl_id) (ne w_dialog имя окна dcl_id)
Описание
Загружает указанный DCL- файл. Возвращает целое значение (dcl_id), используемое в последующих вызовах функций new_dialog и unload_dialog. ВНИМАНИЕ! В имя файла не следует вставлять расширение Выгружает указанный DCL- файл. Всегда возвращает nil Начинает управление диалоговым окном, выводит его на экран. Аргумент имя окна – строка. Аргумент dcl_id определяет DCL- файл (определяется вызовом функции load_dialog). При успешном завершении функции (new_dialog) возвращает T (true), в противном случае – nil. Всегда следует проверять возвращаемое функцией ne w_dialog значение
37
Название функции
Описание
Начинает диалог в диалоговом окне. Диалоговое окно должно быть предварительно инициализировано вызовом функции ne w_dialog. Окно остается активным, пока выражение дей ств и я и ли фун кц и я в ызов а с в озв ратом н е в ызов ут функцию done _dialog. Обычно вызов функции done _dialog св язан с п олем, и меющи м ключ “acce pt” (обычн о клав и ша “Ok”) и ли “cance l” (обычн о клав и ша “Отме на”) Завершает диалог в диалоговом окне и убирает его с экра(done_dialog на. Аргумент состояние не является обязательным. Если [cостояние]) аргумент иcпользуется, то ему следует присвоить некоторое целое число (action_tile ключ Присваивает действие, которое будет выполняться после выбора пользователем определенного поля. Аргумент ключ выражение представляет имя поля, которое будет вызывать действие действия) Аргумент выражение действия вычисляется после выбора пользователем поля. Выражение может обращаться к текущему значению поля (атрибут поля v alue), определенному, например, как $value к его имени, определенному как $key. Аргументы ключ и выражение действия являются строками Обработка полей и атрибутов Устан ав ли в ает зн ачен и е для указан н ого п оля. Аргумен т (set_tile ключ ключ определяет поле, аргумент значение – присваиваемое значение) значение. Все аргументы являются строками (ge t_tile ключ) Запрашивает значение поля. Возвращает строку Создание изображений Функции возвращают размеры поля в единицах диалогового окна. Ключ определяет поле. (dimx_tile ключ) Возвращает ширину поля (dimy_tile ключ) Возвращает высоту поля (s tart_image Запускает процесс создания указанного изображения в поле, определенном аргументом ключ ключ) (slide_image x1 y1 Отображает слайд (.sld) в диалоговом окне. Начало (0 0) x2 y2 имя слайда) находится в левом верхнем углу. Слайд может быть отдельным файлом (*.sld) или находиться в составе библиотеки слайдов (*.slb). При вызове из библиотеки сначала указывается имя библиотеки, затем в круглых скобках имя слайда. X1 Y1 – точка вставки слайда, X2 Y2 – второй угол слайда (end_image) Завершение создания изображения (start_dialog)
38
7.5. Пример программы на языке AutoLisp (prompt “\nЖдите.. Программа загружается …”); необязательная ; строка (defun rs_error () (set_tile “error” “”) ;удаление содержимого поля ошибки в диало;говом окне ) ; Проверка ввода координаты X. (defun do_x_pt() (check_real (setq x_pt (get_tile “x_pt”)) “x_pt”) ; ) ; Проверка ввода координаты Y. (defun do_y_pt() (check_real (setq y_pt (get_tile “y_pt”)) “y_pt”) ; ) ; Проверка ввода координаты. Она возвращает либо real_number, либо ; nil (defun check_real (real_number coord); (if (distof real_number 2); функция distof c аргументом 2 – преоб; разование строки в вещественное число в десятичном виде (progn ; координата введена правильно (rs_error) ; удаление содержимого поля ошибки в диалоговом ; окне real_number ) (progn ; координата введена неправильно (set_tile «error» ; установка сообщения в поле ошибки диа; логового окна (strcat “Incorrect coordinate” (strcase (substr coord 1 1)) “.” ) ) nil );end progn );end if );end defun check_real 39
; Функция отображает введенные значения в соответствующих полях ; диалогового окна, либо устанавливает исходные значения по умолча ; нию. (defun defaults() (if x_pt (set_tile “x_pt” x_pt) (progn (set_tile “x_pt” (rtos 0.0000 2)) (setq x_pt (rtos 0.0000 2)) );end progn );end if (if y_pt (set_tile “y_pt” y_pt) (progn (set_tile “y_pt” (rtos 0.0000 2)) (setq y_pt (rtos 0.0000 2)) ) ) (if h ; поле Высота (set_tile “edit1” h) (progn ; по умолчанию (set_tile “edit1” “40”) (setq h “40”) ) ) (if L ; поле Ширина (set_tile “edit2” L) (progn ; по умолчанию (set_tile “edit2” “30”) (setq L “30”) ) ) (if r ; поле Радиус сопряжения (set_tile “edit3” r) (progn ; по умолчанию (set_tile “edit3” “3”) 40
(setq r “5”) ) ) (if b ; поле Толщина S (set_tile “edit4” b) (progn ; по умолчанию (set_tile “edit4” “3”) (setq b “3”) ) ) );end defun ; Проверка введенных данных на возможность геометрического по; строения (defun check_dat () (setq h (get_tile “edit1”)) ; (setq L (get_tile “edit2”)) (setq r (get_tile “edit3”)) (setq b (get_tile “edit4”)) (if (or (<= (atof h) (* 2.0 (atof r))) (<= (atof h) 0) (< (atof r) 0) (<= (atof b) 0) (<= (atof L) 0) (>= (* (atof r) 2.0) (atof L)) ) (progn (if (<= (atof h) 0) (progn (set_tile “error” “ ОШИБКА: Надо h > 0 !!! “) nil ) (if (<= (atof L) 0) (progn (set_tile “error” “ОШИБКА: Надо L > 0 !!! “) nil ) (if (< (atof r) 0) 41
(progn (set_tile “error” “ ОШИБКА: Надо r >= 0 !!! “) nil ) (if (<= (atof b) 0) (progn (set_tile “error” “ ОШИБКА: Надо b > 0 !!! “) nil ) (if (>= (* (atof r) 2.0) (atof L)) (progn (set_tile “error” “ ОШИБКА: Надо L > 2*r !!! “) nil ) (if (<= (atof h) (* 2.0 (atof r))) (progn (set_tile “error” “ “ ОШИБКА: Надо h > 2*r !!! “) nil ) );end if );end if );end if );end if );end if );end if );end progn (progn ; ошибок нет (rs_error) ; очистка поля ошибки диалогового окна (done_dialog 1) ; завершение диалога (setq what_next 1) ) ); end if );end defun check_dat (defun C:COIL (); основная функция ; Отключение эхо-вывода (запросы команд и ответы на них не ; отображаются на экране 42
(setvar “CMDECHO” 0); ; сохранение текущей объектной привязки в переменной (setq old_osmode (getvar “OSMODE”)) (setvar “OSMODE” 0); отключение объектной привязки ; “обнуление” всех переменных, участвующих в диалоговом окне (setq h nil L nil R nil x_pt nil y_pt nil b nil) (if (< (setq dcl_id (load_dialog “COIL”)) 0) (exit)); загрузка DCL; файла диалога и досрочный выход из программы, если dcl_id об; ращается в 0, ; т. е. файл не найден (setq what_next 6) (while (< 2 what_next) (if (not (new_dialog “COIL” dcl_id)) (exit)); досрочный выход из ; про граммы в случае неудачного завершения функции (defaults); вызов функции задания исходных значений по умол; чанию (setq x (dimx_tile “cir_image”) ; определяет ширину и высоту изоб; ражения y (dimy_tile “cir_image”)) (start_image “cir_image”); запуск процесса создания изображе; ния в поле (slide_image 0 0 x y “COIL”); отображает слайд COIL.sld в окне ; диалога (end_image); завершение создания изображения (action_tile “accept” “(check_dat)”); при нажатии клавиши “ОК” – ; вызов функции; проверки введенных данных (action_tile “cancel” “(done_dialog 0)”); при нажатии клавиши ; “Cancel” завершение диалога (отмена диалогового окна) (action_tile “edit1” “(setq h $value)”); присвоение значений полям (action_tile “edit2” “(setq L $value)”) (action_tile “edit3” “(setq R $value)”) (action_tile “edit4” “(setq b $value)”) (action_tile “pick_pt” “(done_dialog 4)”); завершение диалога без ; его отмены (action_tile «x_pt» “(do_x_pt)”); присвоение полям X и Y введен; ных значений (action_tile “y_pt” “(do_y_pt)”) 43
(setq what_next (start_dialog)); Начинает диалог в диалоговом ; окне. (if (= what_next 4) (progn (setq pt1 (getpoint “ ”)); запрос точки вставки чертежа в графи; ческом поле (setq x_pt (rtos (car pt1) 2 4)) (setq y_pt (rtos (cadr pt1) 2 4)) ) );end if ); end while (unload_dialog dcl_id); выгрузка DCL-файла. (if (/= what_next 0) (progn (setq h (atof h)) (setq L (atof L)) (setq r (atof r)) (setq b ; (atof b)) (setq x_pt (atof x_pt)) (setq y_pt (atof y_pt)) (setq pt1 (list x_pt y_pt)) ; точка вставки чертежа ; определение вспомогательных точек (setq p2 (polar pt1 0 (/L 2.0))); (setq p21 (polar p2 (/ PI 2.0) b)) (setq pt11 (polar pt1 0 r)) (setq pt12 (polar pt1 (/ pi 2.0) r)) (setq p3 (polar (polar pt1 0 b) (/ pi 2) b)) (setq p31 (polar p3 0 r)) (setq p32 (polar p3 (/ pi 2.0) r)) (setq p4 (polar pt1 (/ PI 2.0) (/ (+ h b b) 2.0))) (setq p41 (polar p4 0 b)) (setq pc (polar (polar pt1 0 r) (/ PI 2.0) r)) (setq pc1 (polar (polar p3 0 r) (/ PI 2.0) r)) (_$mark “$COIL”); задание начала набора $COIL (см. в фай; ле acad.lsp) (_$mark “$COIL1”); задание начала набора $COIL1 (см. в ; файле acad.lsp) (if (= r 0) (progn 44
(command “–·LINE” p2 pt1 p4 “”) (command “–·LINE” p21 p3 p41 “”)
“_N”)
) (progn (command “–·LINE” pt11 p2 “”) (command “–·LINE” pt12 p4 “”) (command “–·LINE” p21 p31 “”) (command “–·LINE” p32 p41 “”) (command “–·ARC” “_C” pc pt12 pt11) (command “–·ARC” “_C” pc1 p32 p31) ) );end if (command “–·MIRROR” (_$endmark “$COIL”) “” p4 (polar p4 0 L)
; $endmark – функция, возвращающая набор $COIL (command “–·PLINE” p4 “_W” “0.5” “0.5” p41 “”) (command “–·MIRROR” (_$endmark “$COIL1”) “” p2 (polar p2 (/ pi 2.0) h) “_N”) (command “–·PLINE” p2 “_W” “0.5” “0.5” p21 “”) (setq e1 (entlast)) (command “–·MIRROR” e1 “” p4 p41 “_N”) ) ) ;end if (command “–·ZOOM” “_E”) (command “–·REDRAW”) (setq C:COIL nil) ; включение ранее сохраненной объектной привязки (setvar “OSMODE” old_osmode) (setvar “CMDECHO” 1) (princ);тихий выход из программы )
45
7.6. Библиотека часто встречающихся функций Обычно часто повторяющиеся в разных программах функции располагают в отдельном файле. Таким файлом может быть ACAD.lsp или файл ACADDOC.lsp. При запуске AutoCad всегда производится поиск файла ACAD.lsp по библиотечному пути поиска. При обнаружении этого файла его содержимое загружается в оперативную память, и функции становятся доступными для любой программы. По умолчанию файл ACAD.lsp загружается только один раз – при запуске AutoCad. Если требуется, чтобы часто встречающиеся функции загружались всегда при открытии или создании чертежа, необходимо для этих целей использовать файл ACADDOC.lsp, в который поместить эти функции. Загрузкой файла ACAD.lsp с каждым вновь открываемым чертежом можно управлять с помощью опции Load ACAD.LSP with Every Drawing (Загружать ACAD.lsp с каждым рисунком), находящейся на вкладке System (Система) диалогового окна Options (Настройка). Если этот флажок не установлен, в чертежи будет автоматически загружаться только файл ACADDOC.lsp. Оба файла представляют собой обычные текстовые файлы. Ниже представлены функции, которые могут составить основу файлов ACAD.lsp или ACADDOC.lsp. (defun _$rtd ($a) ; функция преобразования радианы в градусы (* (/ 180.0 pi) $a) (defun _$dtr ($a) ; функция градусы в радианы (* (/ pi 180.0) $a)) (defun arcsin (x /) ; функция Arcsin угла, заданного в радианах (cond ((= x 0.0) 0.0) ((= x 1.0) (/ pi 2)) ((= x –1.0) (/ (- 0 pi) 2)) (t (atan (/ x (sqrt (abs (- 1 (* x x))))))) ) ) (defun arccos (x /); функция Arccos угла, заданного в радианах (cond ((= x 0.0) (/ PI 2.0)) ((= x 1.0) 0.0) 46
((= x –1.0) PI) (t (- (/ PI 2.0) (atan (/ x (sqrt (abs (- 1 (* x x)))))))) ) ) (defun _$mark ($mark) ; установка маркера начала формирования ; набора; примитивов (if (set (read $mark) (entlast)) nil (progn (command “_POINT” “@”) (set (read $mark) (entlast)); (entdel (eval (read $mark))); ) ) ) (defun _$endmark ($mark); конец формирования набора примитивов; ; возвращает набор примитивов (if (eval (read $mark)) (progn (setq $ss (ssadd)) (while (set (read $mark) (entnext (eval (read $mark)))) (ssadd (eval (read $mark)) $ss) ) ) ) ) (defun _$rline (); ожидание нажатия клавиши ENTER (prompt “\n <<< To continue press <ENTER> >>>”) (read-line) )
47
8. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА ИЗ ФАЙЛА Функция
Назначение
(getfiled <заголовок> Вызывает диалоговое окно поиска файла <имя> <расширение> Заголовок – название диалогового окна <флаг>) Имя – имя файла или папки, с которой начинается поиск Расширение – расширение файла. (“” заменяется на “*”) Флаг – опция функции 1 – при создании нового файла (нельзя использовать для выбора существующего файла) 4 – разрешает вводить имя файла с любым расширением (или без него) 16 – аргумент имя трактуется как имя папки, в которой надо искать файл (getfiled “Выберите файл” “D:/Труды” “doc” 16) выбирается каталог для поиска файла (getfiled “Cохраните файл” “D:/Труды” “doc” 17) выбирается каталог для сохранения файла без указания имени файла в поле диалога (getfiled “Cохраните файл” “D:/Труды./a” “doc” 1) выбирается каталог для сохранения файла с указанием имени файла в поле диалога (findfile <файл>) Ищет файл по имени (краткому или полному). Если аргумент содержит имя файла без полного пути, то поиск выполняется в рабочем каталоге и по стандартным для AutoCad путям поиска. Возвращает полное имя файла или nil, если файла нет (open <файл> Открывает файл для чтения, записи или дополнения <режим>) Режим – строка из одного символа: “w” – запись “r” – чтение “a” – дополнение Возвращает дескриптор файла или nil (setq f (open “A.TXT” “w”)) (close <дескриптор>) Закрывает файл по дескриптору файла (close f) (read- line Считывает строку символов с клавиатуры или из открытого файла. Возвращаемое значение – текстовая <дескриптор>) строка. Если достигнут конец файла, то возвращается nil (setq st (read- line f)) – из файла (setq st1 (read- line)) – c клавиатуры
48
Функция
(read- char <дескриптор>) (write- line строка <дескриптор >)
(write- char <код> <дескриптор >)
(vl- file- delete <файл>)
Назначение
Считывает символ из буфера клавиатуры или из открытого файла. Возвращает целое число – код прочитанного символа Записывает строковую константу в открытый файл или на экран. Функция возвращает строку, взятую в кавычки, и опускает кавычки при записи в файл (write- line “ПРИМЕР” f) Записывает буквенно- цифровой символ с заданным кодом в файл или на экран. Возвращаемое значение – целое число (код выведенного символа). Нельзя записать символ с кодом 0. (write- char 50) – выводится цифра 2 и возвращаемое значение 50 Удаляет файл, возвращает значение T, если удаление выполнено; nil – если удаление не выполнено. (vl- file- delete “a.txt”) Дополнительные функции
(prompt <сообщение>) Выводит сообщение на экран. Возвращаемое значение nil (alert <сообщение>) Выводит сообщение на экран в диалоговом окне с кнопкой OK. Возвращаемое значение nil Если необходимо вывести несколько строк: (setq st (strcat “Это AutoLisp\nЯзык программирования\n в среде AutoCad”)) (alert st) (princ ) Тихий выход. Не возвращает никакого значения. Используется в конце программы (terpri) Переводит курсор на новую строку. Очередное сообщение выводится с новой строки
П р и м е р: (setq jj (open “limit.dat” “r”)) (if jj (progn (setq bz (atof (read-line jj))) (setq hj (atof (read-line jj))) ) 49
(progn (setq bz 0.8) (setq hj 4.0) ) ) 9. СОЗДАНИЕ VLX-ПРИЛОЖЕНИЯ В состав приложения могут входить не только LSP-файлы, но и DCLфайлы диалоговых окон, FAS-файлы, DVB-файлы Visual Basic for Applications и текстовые файлы (ТХТ-файлы). Все включаемые компоненты собираются в единый файл приложения с расширением vlx. Свойства приложения сохраняются в одноименном файле с расширением prv, который используется в случае повторной сборки приложения. Для создания нового VLX-приложения следует воспользоваться пунктом Make Application (Собрать приложение) меню File (Файл). Пункт имеет следующие подпункты: New Application Wizard (Мастер новых приложений); Existing Application Properties (Свойства имеющихся приложений); Make Application (Собрать приложение); Rebuild Application (Перекомпилировать приложение). Для создания нового приложения следует выбрать подпункт New Application Wizard (Мастер новых приложений), который открывает диалоговое окно Wizard Mode (Режим Мастера), приведенное на рис. 3.
Рис. 3. Окно Wizard Mode
50
В этом окне необходимо задать режим, определяющий тип приложения: Simple (Простой) или Expert (Сложный). Простое приложение может состоять только из файлов с LISP-программами (аналогично FAS-приложению), а сложное может включать DCL-файлы, DVB-файлы и т. д. В случае выбора положения переключателя Expert (Сложный) и щелчка по кнопке Next (Далее) открывается диалоговое окно Application Directory (Папка приложения). Здесь нужно заполнить поле (рис. 4) Application Name (Имя приложения), а в поле Application Location (Расположение приложения) ввести полное имя папки, в которую будут записаны файл приложения с расширением vlx и файл свойств приложения с расширением prv (основная часть имени этого файла будет взята из имени приложения).
Рис. 4. Окно Application Directory
Папку удобнее выбирать с помощью кнопки Browse (Обзор). После задания имени приложения поле Target File (Целевой файл) покажет имя файла нового приложения с расширением vlx. Нажатие кнопки Next (Далее) приводит к следующему окну (рис. 5) – Application Options (Параметры приложения). По умолчанию в данном окне флажок Separate Namespace (Отдельное именное пространство) не установлен. Это означает, что функции и глобальные переменные вашего приложения будут доступны другим приложениям. Следующее окно (рис. 6) – LISP Files to Include (LISP-файлы для сборки приложения) дает возможность перечислить все файлы с расширениями lsp (исходные тексты), fas (ком51
Рис. 5. Окно Application Options
Рис. 6. Окно LISP Files to Include
пилированные файлы) и prv (файлы проектов), которые необходимо интегрировать в создаваемое приложение. Кнопки Add (Добавить) и Remove (Удалить) позволяют, соответственно, добавлять или удалять компоненты. Кнопками Тор (Начало), Up (Вверх), Down (Вниз) и Bottom (Нижняя) можно регулировать порядок включения элементов LISP-про52
грамм в приложение. Раскрывающий список имеет три строки (LISP source files (Исходные LISP-файлы), Compiled LISP files (Скомпилированные LISP-файлы) и Visual LISP project files (Файлы проектов Visual LISP)), помогающие добавлять в приложение компоненты нужного типа. Кнопки Add (Добавить) и Remove (Удалить) позволяют, соответственно, добавлять или удалять компоненты. Кнопками Тор (Начало), Up (Вверх), Down (Вниз) и Bottom (Нижняя) можно регулировать порядок включения элементов LISP-программ в приложение. Раскрывающий список имеет три строки (LISP source files (Исходные LISP-файлы), Compiled LISP files (Скомпилированные LISP-файлы) и Visual LISP project files (Файлы проектов Visual LISP)), помогающие добавлять в приложение компоненты нужного типа.
Рис. 7. Окно Resource Files to Include
Диалоговое окно (рис. 7) Resource Files to Include (Файлы ресурсов) не появится, если выбран режим простого приложения. В качестве дополнительных ресурсов к вашему приложению могут быть добавлены элементы, перечисленные в раскрывающемся списке (три первых типа могли быть выбраны в предыдущем окне): LISP source files (Исходные LISP-файлы); Compiled LISP files (Скомпилированные LISP-файлы); Visual LISP project files (Файлы проектов Visual LISP); 53
DCL files (DCL-файлы); DVB files (DVB-файлы); Text files (Текстовые файлы). После задания всех дополнительных ресурсов появляется окно (рис. 8) – Application Compilation Options (Параметры компиляции приложения). В этом окне нужно выбрать режим компиляции Standard (Стандартная) или Optimize and Link (Оптимизация и связывание). Оптимизация уменьшает размер объектного кода и время загрузки приложения, но при неправильном использовании зарезервированных символов может привес-
Рис. 8. Окно Application Compilation Options
Рис. 9. Окно Review Selections / Build Application
54
ти к неправильной работе приложения и системы AutoCAD. Последнее окно (рис. 9), в которое можно попасть с помощью Мастера создания нового приложения, – диалоговое окно Review Selections / Build Application (Просмотр параметров/Сборка приложения). Если в данном окне оставить включенным флажок Build Application (Собрать приложение) и щелкнуть по кнопке Finish (Завершить), Visual LISP создаст файлы приложения (с расширением vlx) и свойства приложения (с расширением prv). Если флажок снять и нажать на кнопку Finish (Завершить), будет создан только PRV-файл, по которому можно в дальнейшем собрать приложение. Для этого нужно воспользоваться подпунктом Make Application (Собрать приложение) одноименного пункта меню File (Файл). Подпункт Existing Application Properties (Свойства имеющихся приложений) позволяет просмотреть и изменить свойства или состав приложения, а подпункт Rebuild Application (Перекомпилировать приложение) – перекомпилировать приложение, если изменились какие-либо его компоненты (DCL-файлы, LSP-файлы и т. д.). Загрузить в среде Visual LISP собранное приложение можно с консоли с помощью функции LISP load или пункта Load File (Загрузить файл) меню File (Файл). Если приложение необходимо загрузить в сеансе AutoCAD без среды Visual LISP, используют либо функцию load, либо пункт AutoLISP, Load (Загрузить) меню Tools (Сервис) или пункт Load Application (Приложения) того же меню. 10. МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ Цель курсовой работы: освоение на практике программирования в среде VisualLisp и разработка программы параметрического чертежа по заданию преподавателя. Студент должен: 1. Выявить набор необходимых и достаточных размеров для написания программы. 2. Составить DCL-файл диалогового окна для решаемой задачи. 3. Создать слайд чертежа с указанием необходимых и достаточных формальных размеров. 4. Написать LSP-программу построения параметрического чертежа. Программа должна содержать функцию проверки вводимых данных на предмет возможности правильного построения геометрии. 55
5. Отладить LSP-программу. 6. Запустить на выполнение разработанную программу и получить чертеж в среде AutoCad. 7. Оформить пояснительную записку, которая должна содержать: постановку задачи; эскиз с формальными параметрами-размерами; эскиз с указанием точек, использованных при разработке программы; текст DCL-файла; копию экрана с разработанным диалоговым окном; текст LSP-файла с комментариями; чертеж, построенный с помощью разработанной программы. В Приложении приведены примеры заданий для выполнения курсовой работы. В разрабатываемых программах число повторяющихся элементов должно быть произвольным и заданным в диалоговом окне.
Библиографический список 1. Полещук Н. Н. Visual LISP и секреты адаптации AutoCad. СПб.: БХВ-Петербург, 2001. 576 c. 2. Кудрявцев Е. AutoLisp.Программирование в AutoCad 14. М.: ДМК, 1999. 365 c. 3. Кречко Ю. AutoCad: программирование и адаптация. М.: Диалог-МИФИ, 1995. 235 c. 4. Полещук Н. Н. AutoCad 2002. СПб.: БХВ-Петербург, 2003. 1200 c. 5. Зуев C. А., Полещук Н. Н. САПР на базе AutoCad – как это делается. СПб.: БХВ-Петербург, 2004. 1168 с. 6. Харрингтон Д., Барчард Б., Питцер Д.AutoCad 2002 для конструкторов. Искусство проектирования. Киев: ООО «ТИД ДС», 2002. 944 с.
56
ПРИЛОЖЕНИЕ ПРИМЕРЫ ЗАДАНИЙ ДЛЯ КУРСОВОЙ РАБОТЫ 1
2
3
4
5
6
7
8
57
Продолжение прил. 9
10
11
12
13
14
15
16
58
Окончание прил. 17
18
19
20
21
22
23
24
59
СОДЕРЖАНИЕ Предисловие ...................................................................................................... 1. Характеристика языка AutoLisp .................................................................. 1. 1. Типы данных ......................................................................................... 1.2. Системные переменные AutoCad ........................................................ 1.3. Функция присвоения ............................................................................ 2. Структура программы на языке AutoLisp ................................................... 3. Правила отладки в среде VISUALLISP .......................................................... 3.1. Синтаксические ошибки ....................................................................... 3.2. Устранение синтаксических ошибок .................................................... 3.3. Форматирование текста программы ................................................... 3.4. Загрузка и выполнение программы .................................................... 3.5. Устранение ошибок на стадии выполнения программы ................... 4. Встроенные функции .................................................................................... 4.1 Геометрические функции ...................................................................... 4.2. Математические функции .................................................................... 4.3. Функции для работы со списками ....................................................... 4.4. Функции преобразования ..................................................................... 4.5. Функции для работы со строками ........................................................ 4.6. Логические функции AutoLisp ............................................................ 4.7. Функции условного ветвления программ ........................................... 4.8. Функции цикла ..................................................................................... 5. Вызов команд AutoCad из программы ....................................................... 6. Доступ к примитивам и средствам AutoCad .............................................. 7. Организация диалога в AutoLisp .................................................................. 7.1. Использование функций семейства GET для ввода данных ................ 7.2. Диалоговое окно ................................................................................... 7.3. Пример диалогового окна .................................................................... 7.4. Управление диалоговым окном из программы на языке AutoLisp ... 7.5. Пример программы на языке AutoLisp .............................................. 7.6. Библиотека часто встречающихся функций ........................................ 8. Организация ввода-вывода из файла ............................................................ 9. Создание VLX-приложения ........................................................................... 10. Методические указания к выполнению курсовой работы ..................... Библиографический список ............................................................................. Приложение .......................................................................................................
60
3 4 4 5 6 6 8 8 8 9 10 11 13 13 14 15 17 18 19 21 22 22 25 29 29 30 34 37 39 46 48 50 55 56 57