60
Ñàíêò-Ïåòåðáóðã 2006 Методические указания к выполнению курсовой и дипломной работы ÔÅÄÅÐÀËÜÍÎÅ ÀÃÅÍÒÑÒÂÎ ÏÎ ÎÁÐÀÇÎÂÀÍÈÞ Ãîñóäàðñòâåííîå îáðàçîâàòåëüíîå ó÷ðåæäåíèå âûñøåãî ïðîôåññèîíàëüíîãî îáðàçîâàíèÿ ÑÀÍÊÒ-ÏÅÒÅÐÁÓÐÃÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ ÀÝÐÎÊÎÑÌÈ×ÅÑÊÎÃÎ ÏÐÈÁÎÐÎÑÒÐÎÅÍÈß ПРОГРАММИРОВАНИЕ В AUTOCAD

Программирование на AutoLISP.Salova

  • Upload
    -

  • View
    533

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Программирование на AutoLISP.Salova

Ñàíêò-Ïåòåðáóðã2006

Методические указания к выполнению

курсовой и дипломной работы

ÔÅÄÅÐÀËÜÍÎÅ ÀÃÅÍÒÑÒÂÎ ÏÎ ÎÁÐÀÇÎÂÀÍÈÞÃîñóäàðñòâåííîå îáðàçîâàòåëüíîå ó÷ðåæäåíèå

âûñøåãî ïðîôåññèîíàëüíîãî îáðàçîâàíèÿÑÀÍÊÒ-ÏÅÒÅÐÁÓÐÃÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ

ÀÝÐÎÊÎÑÌÈ×ÅÑÊÎÃÎ ÏÐÈÁÎÐÎÑÒÐÎÅÍÈß

ПРОГРАММИРОВАНИЕ В AUTOCAD

Page 2: Программирование на AutoLISP.Salova

2

© ГОУ ВПО «Санкт-Петербургский

государственный университет

аэрокосмического приборостроения», 2006

Составитель И. А. Салова Рецензент доктор технических наук, профессор В. В. Хрущев

Рассматриваются основы программирования на языке AutoLisp всреде VisualLisp. Приводится пример документированной диалоговойпрограммы и примеры заданий для выполнения курсовой работы.

Методические указания предназначены для студентов специаль-ности “Управление и информатика в технических системах” и смеж-ных специальностей.

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

Подписано к печати 27.04.06. Формат 60×84 1/16. Бумага офсетная. Печать офсетная.

Усл. печ. л. 3,54. Уч. -изд. л. 3,9. Тираж 150 экз. Заказ № 228

Редакционно-издательский отдел

Отдел электронных публикаций и библиографии библиотеки

Отдел оперативной полиграфии

ГУАП

190000, Санкт-Петербург, ул. Б. Морская, 67

Редактор А. В. Семенчук

Компьютерная верстка Н. С. Степановой

Page 3: Программирование на AutoLISP.Salova

3

ПРЕДИСЛОВИЕ

AutoCad широко используется как «графический кульман». Одна-ко AutoCad является не только графическим редактором, но и мощнойсредой программирования для создания автоматизированных рабочихмест для специалистов различных направлений. AutoCad является от-крытой системой, что дает возможность дополнять стандартные сред-ства собственными наработками. Основной язык программирования всреде AutoCad – AutoLisp (один из диалектов языка программированиявысокого уровня Common LISP), созданный в 1986 г. и являющийся соб-ственной разработкой компании Autodesk; LISP – это сокращение отLISting Processing (обработка списков). AutoLisp относится к функцио-нальным языкам программирования, так как в основу положено понятие функции.

Задача курсовой работы – освоение языка программированияAutoLisp и разработка программы параметризованной геометрическоймодели или чертежа.

Page 4: Программирование на AutoLISP.Salova

4

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.

Page 5: Программирование на AutoLISP.Salova

5

Действительные числа – это положительные или отрицательныечисла с десятичной точкой. Не разрешается начинать или заканчи-вать число десятичной точкой

2.12 3.11592652543 -92722.121344 1.23544Е+17.Переменные в AutoLisp не надо описывать – тип данных определя-

ется автоматически при присвоении переменной значения.Типы данных AutoLisp с помощью функции TYPE идентифицируют-

ся следующим образом:

Переменная может быть атомом (целого, вещественного или стро-кового типа), а может быть списком.

Выражение – список, в котором первым элементом является имяфункции.

(имя функции аргумент1 аргумент2 … аргументN)Предопределенные символы:

T – логическая константа, имеющая значение “истина”,Nil – пустое значение (оно же в логических операциях имеет

значение “ложь”),Pi – постоянная 3.14159…,Pause – постоянная, позволяющая ввести паузу при работе ко-

манды AutoCad.Комментарии начинаются с символа ; .

1.2. Системные переменные AutoCad

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

иицкнуфеинечанзеомеащарвзоВ хыннадпиТ

TNI ыничилевеылеЦ

LAER йокчотйещюавалпсалсиЧ

RTS ытнатснокеывокортС

ELIF волйафыротпирксеД

TSIL ялетавозьлопиицкнуфииксипС

RBUS psiLotuAиицкнуфеиннертунВ

MYS йыньловмиС

Page 6: Программирование на AutoLISP.Salova

6

Все настройки графического редактора управляются системнымипеременными. Системные переменные делятся на:

модифицируемые пользователем;защищенные (нельзя изменять ни программно, ни при помощи ко-

манды).Для доступа к системной переменной из программы используется

функция(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() ; – пользовательская функция ; GEOM(подпрограмма)

.

Page 7: Программирование на AutoLISP.Salova

7

. ; тело функции .

)(defun C:Myfunc() ;) основная программа Myfunc.(VVOD) ; вызов функции VVOD(GEOM) ; вызов функции 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))

Page 8: Программирование на AutoLISP.Salova

8

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+],

Page 9: Программирование на AutoLISP.Salova

9

удерживая клавишу CTRL. Будет найдена ответная правая скобка. Принажатии CTRL + [выявляется ответная левая скобка.

3.3. Форматирование текста программы

Указать на панели инструментов кнопку – Format Edit Window.

Текст программы примет наглядный удобный вид для чтения програм-

мы. Для форматирования части текста используется кнопка –

Format Selection. Предусмотрена возможность детальной настройкирежима форматирования (рис. 1):

Tools (инструменты)\Environment Options(настройка рабочей среды )\VisualLisp 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”))

Page 10: Программирование на AutoLISP.Salova

10

Рис. 1. Диалоговое окно настройки режима форматирования: а – русский

вариант; б – английский вариант

б)

а)

Page 11: Программирование на AutoLISP.Salova

11

В нижнюю строку консоли вводится имя функции с ее параметрами,заключенными в скобки, т. е. (mo). Начнется выполнение программы.

3.5. Устранение ошибок на стадии выполнения программы

После устранения синтаксических ошибок наступает очередь оши-бок, связанных с неправильными значениями переменных, неверно при-мененными функциями и т. д. Эти ошибки выявляются в процессе вы-полнения программы. При наличии рассматриваемых ошибок программапрерывается и в консоль выводится сообщение об ошибке. Для опреде-ления по тексту программы места ее прерывания применяют трасси-ровку или режим анимации.

Отладка в режиме анимации

Надо указать в падающем меню Debug (Отладка) \ Animate (Ани-мация), a затем загрузить и начать выполнение отлаживаемой про-граммы, введя с консоли ее имя (mo). На экране наблюдается вы-полнение программы в замедленном режиме. Выполняемые функциипоследовательно высвечиваются. В случае ошибки анимация пре-рывается, место ошибки в тексте программы остается выделенным.

Если анимация “затянулась”, ее можно прервать с клавиатуры кла-вишей BREAK. Скорость анимации регулируется в меню редактораVLISP: Tools (Инструменты) \ Environment Options (Настройки рабо-чей среды) \ General Options (Общие настройки)\ Diagnostic (Диагно-стика).

Контроль значений переменных

Необходимость контроля значений переменных возникает в двухслучаях: программа прерывается по ошибке, программа выполняетсядо конца, но дает неверный или сомнительный результат, и требуетсяпроконтролировать алгоритм вычислений. Если вследствие ошибки про-изошло прерывание программы, можно посмотреть значения всех пе-ременных и результаты выполнения любого выражения в тексте про-граммы до момента прерывания. Это позволит разобраться впричинах, вызвавших ошибку. Сначала с помощью анимации опреде-ляется место ошибки. Затем следует установить курсор на символкакой-либо переменной или выделить курсором необходимое выраже-

ние и нажать кнопку панели инструментов Возникнет окно на-

Page 12: Программирование на AutoLISP.Salova

12

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

Искусственное прерывание программы

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

месте по тексту программы и указать кнопку – Toggle breakpoint

на панели инструментов VLISP. Место остановки выделится красныммаркером. После этого надо запустить программу, ее выполнение прерветсяв указанном месте. Значения переменных, вычисленные к моменту за-

данного прерывания, можно посмотреть посредством клавиши .

Для продолжения программы следует нажать кнопку –continue.

Во время прерывания можно посмотреть текущее состояние рисунка.Для этого нужно перейти в графическое окно AutoCad, указав кнопку

на панели задач (как правило, в нижней стро-

ке экрана). Чтобы вернуться в редактор (для продолжения отладки программы),

укажите кнопку Visual LISP в панели задач .

Если отладка закончена и нужно завершить выполнение программы,необходимо отменить прерывание. Для этого курсор устанавливается

на маркер прерывания и повторно нажимается клавиша . Красный

маркер останова снимается. В тексте программы можно задать не-сколько точек останова и последовательно переходить от одной к дру-

гой, нажимая кнопку .

Page 13: Программирование на AutoLISP.Salova

13

4. ВСТРОЕННЫЕ ФУКЦИИ

4.1 Геометрические функции

В AutoCad существуют два понятия системы координат: мировая (МС) ипользовательская система координат (ПСК). Здесь и далее при описании фун-кций используется ПСК, однако все нижесказанное справедливо и для МС.

кечотяинадазыбосопС

ытанидроокеынтюлосбА ытанидроокеынрялоП

))YX('>акчот<qtes(

))YXtsil(>акчот<qtes(

-баcКСПвукчоттеащарвзовяицкнуФ

)YX(иматанидроокимынтюлос

)>еиняотссар<>логу<>акчот<ralop(

ясюущядохан,КСПвукчоттеащарвзоВмеиняотссаримолгумыннадаздопястеяремзилогу;икчотйоннадазто

-осачвиторпиинелварпанвханаидарвXисотоиклертсйов

ыремирП

))52.055.001('0pqtes(

))52.055.001tsil(0pqtes(

))0020)0201('ralop(1pqtes(

))001)0.4ip/(0pralop(2pqtes(

иицкнуфеиксечиртемоегеигурД

)>2акчот<>1акчот<ecnatsid( ямувдуджемеиняотссартеащарвзоВимакчотимынремхерт

)>2акчот<>1акчот<elgna( йыннавозарбо,ханаидарвлогутеащарвзоВ2укчотв1икчотзимыннелварпан,мочул.йинеортсопитсоксолпйещукетХюьсои

иклертсйовосачвиторпястеяремзилогУ

>2акчот<>1акчот<sretni(

)]rap[>4акчот<>Закчот<

-тохувдяинечесерепукчоттеащарвзоВ-чотЗакчот(и)2акчот1aкчот(вокзер

дрооквынежарывикчотесВ.)4ак -анийынвитатьлукафилсЕ.КСПйещукетхат

ястеялвяитеувтстусирпrapтнемугра-тоенеинечесерепястеяледерпоот,lin-охорп,хымярпхынченоксеба,вокзер

еачулсмотэВ.икчотитэзеречхищядясогещужакакчотясьтяледерпотедуб

,теувтстустоrapежилсЕ.яинечесерептижелданирпяинечесерепакчотот

икзертоеачулсмотэВ.макзертомиобоечани,)ясьтакесерепынжлодикзерто(

linнещарвзовтедуб

Page 14: Программирование на AutoLISP.Salova

14

Режим объектной привязки несомненно важен при интерактивнойработе в AutoCad. Иногда удобно определять точки по функции (osnap<точка> <режим>), которая возвращает точку, являющуюся резуль-татом применения объектной привязки, задаваемой в строке “режим”для указанной точки. Режим – строковая константа, состоящая из одно-го или более идентификаторов объектной привязки, разделенных запя-тыми, как, например,

“_end” (конечная); “_mid” (середина); “_int” (пересечение) “_nea” (ближайшая)

Например, (setq pt2 (osnap pt1 “_end, _mid”))

4.2. Математические функции

AutoLisp включает в себя достаточно широкий набор встроенныхфункций, позволяющих производить математические вычисления. Ар-гументами математических функций являются числа, которые могутбыть как целыми, так и вещественными. Если все аргументы – целыечисла, то результат операции также будет целым числом, а любая дроб-ная часть будет опущена. Если хотя бы один аргумент – вещественноечисло, то результат операции будет вещественным числом (например,число 2.0 считается вещественным, поскольку в нем присутствует де-сятичная точка). К математическим функциям относятся:

“_nod” (узел) ,“_qua” (квадрант)“_cen” (центр )

яицкнуФ еинечанзаН

)...>2олсич<>1олсич<+( вотнемуграхесваммуС

))31+(aqtes( � 4

)...>2олсич<>1олсич<-( ьтсонзаР

))7401-(aqtes( � 1-

еинатичывот,1онварвотнемуграолсичилсЕ

0зиястидовзиорп

)...>2олсич<>1олсич<*( лесичхесвеинедевзиорптеащарвзоВ

)...>2олсич<>1олсич</( еонтсачтеащарвзови2олсичан1олсичтилеД

сЕ еоврепот,вотнемуграхувдеелобонадазил

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

)23/( � )75/(1 � 0

)0.75/( � 682417.0

)>олсич<+1(

)>олсич<-1(

-тсйедилиоголецеинешьнемуилиеинечилевУ

1аналсичогоньлетив

Page 15: Программирование на AutoLISP.Salova

15

4.3. Функции для работы со списками

яицкнуФ еинечанзаН

)>олсич<sba( -ивтсйедяинечанзогонтюлосбаеинелсичыВ

алсичоголецилиогоньлет

)1.1-sba( � 1.1

)>олсич<nis( огоннадаз,алгуасунисеинечанзтеащарвзоВ

ханаидарвмотнемугра

)>олсич<soc( огоннадаз,алгуасунисокеинечанзтеащарвзоВ

ханаидарвмотнемугра

>1олсич<nata(

)]>2олсич<[

-кратеащарвзовот,>2олсич<онадазенилсЕ

снегнат -бо,ханаидарв>1олсич<йоннемереп

.наидар]ip-,ip[–йинечанзхымитсуподьтсал

абоынадазилсЕ -наткраястеащарвзовот,алсич

сич<йоннемерепснег н-аидарв>2олсич</>1ол

ьлун–>2олсич<илсЕ.ха , зтоитсомисивазвот

-или+ястеащарвзов>1олсич<йоннемерепакан

)дарг09–или09+(наидар697075.1

)>ьнепетс<рхе( иицкнуфйоньлаицненопскэеинечанзтеялсичыВ

меинавонсос е >ьнепетс<мотнемуграи

)1pxe( � )0pxe(…817.2 � 0.1

>еинавонсо<tpxe(

)>ьнепетс<

иицкнуфйоньлаицненопскэеинечанзтеялсичыВ

юьнепетсимеинавонсоимынназакус

)22tpxe( � )22-tpxe(4 � 4

)1–4tpxe( � )еылецатнемуграабо(0

)0.1–4tpxe( � тнемугранидоыбятох(52.0

)йынневтсещев

яицкнуФ еинасипО

)…2рыв1рывtsil( вотнемугразикосипстеялватсоС

икчотйоньлачанеинадаз–))003002001tsil(0pqtes(

-орпогонремхувдялд(003,002,001иматанидроокс

)вотнемуграхувдончотатсодавтснартс

)косипсrac( еинечанз–аксипстнемелэйыврептеащарвзоВ

-роокястижредосpXйоннемерепв–))0prac(pXqtes(

0pикчотXатанид

)косипсrdc( -еР.оговрепеморк,аксипсытнемелэесвтеащарвзоВ

моксипсястеялвятатьлуз

))0prdc(Uqtes(

)003002(косипсястижредосUйоннемерепВ

Page 16: Программирование на AutoLISP.Salova

16

яицкнуФ еинасипО

)косипсrdac( .еинечанз–аксипстнемелэйоротвтеащарвзоВ))0prdac(pYqtes())0prdc(rac(онтнелавивкэотЭ

0pикчотYатанидроокястижредосpYйоннемерепВ

)косипсrddac( отЭ.еинечанз–аксипстнемелэйитерттеащарвзоВремирпан,)))0prdc(rdc(rac(онтнелавивкэ

ястижредосpZйоннемерепВ.))0prddac(pZqtes(0pикчотZатанидроок

)косипсремонhtn( .моремонмынжунсаксипстнемелэтеакелвзИ0ремонтеемиаксипстнемелэйывреП

)d0htn())41312111('dqtes( � )d4htn(11 � lin

)косипсtsal( илсе,linилиаксипстнемелэйинделсоптеащарвзоВ))(‘tsal(тсупкосипс � ))093261(‘tsal(lin � 09

)косипсesrever( имыннелватсереп,иматнемелэскосипстеащарвзоВекдяропмонтарбов

))41312111(‘esrever( � )11213141()linesrever( � ))(‘esrever(lin � lin

)косипсhtgnel( вотнемелэулсичеонвар,олсичеолецтеащарвзоВ))(‘htgnel(ексипсв � )linhtgnel(0 � 0

))973251(‘htgnel( � 4

1косипсdneppa(

…2косипс

)Nкосипс

ытнемуграесВ.нидоввоксипсеиняилстеянлопыВимаксипсьтыбынжлод

))1801(’6–0271(‘dneppa( � )18016–0271(

)>2гра<>1гра<snoc( теадзосилитнемелэйыврепуксипсктеялвабоДурапюунчечот

))0201(‘05snoc( � )020105()5402(‘)0201(‘snoc( � )5402)0201((

)42snoc( � )”0“8snoc()4.2( � )”0“.8()lin262snoc( � )262(

>тнемелэ<rebmem(

)>косипс<

илсЕ.уксипсатнемелэьтсонжелданирптеяреворП-зовот,ексипсв>тнемелэ<теавижуранбояицкнуф

енилсе,linтеащарвзовилиаксипскотатсотеащарвтеавижуранбо

))31024(‘1rebmem( � )31())6324(‘4rebmem( � )6324(

))542(‘0rebmem( � ))lin08(rebmem(lin � lin

>йывон<tsbus(

)>косипс<>йыратс<

йывонантнемелэйыратсексипсвтеянемаЗ))07511(‘56tsbus( � )07611(

evomer-lv(

>тнемелэ<

)>косипс<

аксипсзимеинечанзмыннадазстнемелэтеяладУ))844630(‘4evomer-lv( � )8630(

))8730(‘5evomer-lv( � )8730(

Page 17: Программирование на AutoLISP.Salova

17

4.4. Функции преобразования

яицкнуФ еинасипО

>яицкнуф<‘ylppa(

)>косипс<

матнемелэмесвокондеречоопюицкнуфтеянемирП))532tsil(*‘ylppa(аксипс � )532*(онтнелавивкэотЭ.03

))532tsil(xam‘ylppa( � 5 -ьламискамтеащарвзов.е.теинечанзеон

)>косипс<lave( моврепанексипсВ.еинежарывкаккосипстеялсичыВиицкнуфямиьтяотсонжлодетсем

)alave())3642xam‘tsil(aqtes( � 6

>ями<hcaerof(

>1рыв<>косипс<

)>Nрыв<…>2рыв<

еиненлопывеоксечилкицьтавозинагротеяловзоП-немерепотсемвяялватсдопондеречооп,йинежарыв

аксипсытнемелэ)>ями<(алкицйон)12s01sqtes())54321tsil(aqtes(

)))p2s*(2sqtes())p1s+(1sqtes(aphcaerof( � 021021=2s51=1s:татьлузеР

racpam(

>яицкнуф<‘

>1косипс<

…>2косипс<

)>Nкосипс<

-жакматнемелэмыврепкалачансюицкнуфтюянемирПимыротвокметаз,вотнемуграхищюуделсопзиогод

йыроток,косипсйывонвястюянидеъбоытатьлузеР.д.тмеинечанзмымеащарвзовястеялвя

*‘racpam( ’ )32( ’ ))51( � )512()53*()12*(:яиненлопывамехС

яицкнуФ еинасипО

)>олсич<xif( метупеолецвалсичогоньлетивтсйедеинавозарбоерПитсачйонбордяинавысарбто

)50.01–xif( � )0.0xif(01 � )54.04xif(0 � 04

)>олсич<taolf( еоньлетивтсйедвалсичоголецеинавозарбоерП)51taolf( � 0.51

>олсич<sotr(

]>мижер<[

)]>ьтсончот<[

укортсвалсичогонневтсещевеинавозарбоерП–>олсич< олсичеолецилиеонневтсещев

–>ьтсончот<йынчитясед–2йынчуан–1>мижер<-тсещевиинелватсдерпввоканзхынчитяседовтсечилок

.алсичогонневытнемуграилсЕ мижер и ьтсончот -сиот,ыназакуен

еыннелвонатсу,юиначломуопяинечанзястюузьлопцинидеаметсис–STINULхыннемерепхынметсисв

воканзолсич–CERPULи)313549.01sotr( � ”10+E590.1“)323549.01sotr( � )023549.01sotr(”549.01“ � ”11“

)>еолец<aoti( алсичоголецяинавозарбоерптатьлузертеащарвзоВукортсв)61aoti( � ”61“

Page 18: Программирование на AutoLISP.Salova

18

яицкнуФ еинасипО

)>акортс<iota( еолецвикортсяинавозарбоерптатьлузертеащарвзоВ)”5.2“iota(:ьтсачяанбордястеакестО.олсич � 2

)>акортс<fota( икортcяинавозарбоерптатьлузертеащарвзоВолсичеоньлетивтсйедв

)”41“fota( � )”30.92–“fota(0.41 � 30.92–

>акортс<fotgna(

[ )]>еинелватсдерп<

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

ханаидарвалгуйоничилевясеещю-немерепйонметсистеувтстевтоос–>еинелватсдерп<

:STINUAйон,ыднукес,ытуним,ысударг–1,еынчитяседысударг–0

ыцинидееиксечифаргопот–4,ынаидар–3,ыдарг–2)0”03“fotgna( � 996325.0

)1””\45'72d33“fotgna( � 470485.0

>логу<sotgna(

]>еинелватсдерп<[

)]>ьтсончот<[

укортсвханаидарвалгуяинечанзеинавозарбоерП,ыназакуеньтсончоТиеинелватсдерПытнемуграилсЕ

-нелвонатсу,юиначломуопяинечанзястюузьлопсиотхыннемерепхынметсисвеын

воканзолсич–CERPUAцинидеаметсис-STINUA)001sotgna( � )311sotgna(”75“ � ””\54'71d75“)011sotgna( � ”d75“

>акортс<fotsid(

)]>мижер<[

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

.sotrиицкнуфяантарбО.еонневтсещевв)2”1“fotsid( � 0.1

4.5. Функции для работы со строками

>1акортс<taсrts()>Nакортс<…>2акортс<

кортсяицанетакноК)”яиниля-“)21aoti(tacrts( � ”яиниля-21“

>1акортс<nelrts()>Nакортс<…>2акортс<

-угра-кортсхесвунилдюунраммустеялсичыВ)”ПАУГ“nelrts(вотнем � 4

>акортс<rtsbus()]>овтсечилок<[>олачан<

иицизопйоннадазсукортсдоптеяледыВ)23”FEDCBA“rtsbus( � ”DC“

)>олсич<rhc( удокопловмисйоворфиц-онневкубтеачулоПволовмисыцилбатйещюувтсйед

)291rhc( � )еокссур(”A“

>акортс<IICSA( атскетикортсаловмисоговрепдоктеачулоПволовмисецилбатйещюувтсйедоп

)”A“iicsa( � 291

Page 19: Программирование на AutoLISP.Salova

19

4.6. Логические функции AutoLisp

Логический оператор – это функция, сравнивающая между собой дваили больше аргумента. Результат сравнения (т. е. некоторое утверж-дение, касающееся двух аргументов) может быть либо истиной (Т), либоложью (nil). Основные логические функции – это И (AND), ИЛИ (OR) иНЕ (NOT):

яицкнуФ еинасипО

)...2рыв1рывdna( сечиголяиненлопывтатьлузертеащарвзоВ огок

И ястеащарвзоВ.йинежарывмоксипсдан ,lin

йинежарывзи)ондоыбятох(еобюлилсе

еинечанзтееми ачулсмонвиторпв,lin е Т–

)linTdna( � )2TTdna(lin � T

)тнемелэton( -сечиголяиненлопывтатьлузертеащарвзоВ

мотнемуграмиовсданЕНогок

)...2рыв1рывro( -сечиголяиненлопывтатьлузертеащарвзоВ

-арвзоВ.йинежарывмоксипсданИЛИогок

-ечанзтюемиытнемуграесвилсе,linястеащ

авелсвотнемуграекнецоирпилсе;linеин

,lin–енеинежарывястеачертсвоварпан

Тястеащарвзов

)>Nгра<…>2гра<>1гра<=( иалсич(вотнемуграавтсневаракреворП

)000.01-01-0.01-=()икортс � T

-темоногирттатьлузерьтавинварсенешчуЛ

:йотнатсноксйицкнуфхиксечир

))0nis(xqtes( � 0.0

))ip0.2*(nis(yqtes( � 610-e12944.2-

)yx=( � lin

)>Nгра<…>2гра<>1гра<=/( огобюлвотнемуграавтсневаренакреворП

)икортсиалсич(апит

)>Nгра<…>2гра<>1гра<<( -зовопвотнемуграеинежолопсартеяреворП

)икортсиалсич(оварпанавелс,юинатсар

)0332<( � )0322<(Т � lin

)”k“”b“”a“<( � T

)>Nгра<…>2гра<>1гра<=<( опвотнемуграеинежолопсартеяреворП

)икортсиалсич(оварпанавелс,юинавыбуен

)0322=<( � T

)>Nгра<…>2гра<>1гра<>( опвотнемуграеинежолопсартеяреворП

)икортсиалсич(оварпанавелс,юинавыбу

)3503>( � T

Page 20: Программирование на AutoLISP.Salova

20

Рекомендации по использованию функций = eq и equal

= – для сравнения только целых чисел и строкeq – для проверки, не указывают ли две переменные на один и тот жесписокequal – для проверки равенства значений выражений (для чисел и спис-ков с возможностью допуска

яицкнуФ еинасипО

)>Nгра<…>2гра<>1гра<=>( -зовенопвотнемуграеинежолопсартеяреворП

ртсиалсич(оварпанавелс,юинатсар )ико

)5503=>( � T

)>2грa<>1гра<qe( ыпиТ.вотнемуграхувдовтсневартеяреворП

TеинечанзеомеащарвзоВ.еыбюл–вотнемугра

linили

)00.0101qe( � =ончитнедиT

)”CBA“”cba“qe( � =ончитнедиlin

))111tsil(aqtes(

bqtes( )abqe()a � -акуеыннемерепевд–T

косипсежтотинидоантюавыз

qtes( ))111tsil(a bqtes( sil( ))111t

)baqe( � аксипсхынзаравдотЭlin

)]>ксупод<[>2грa<>1гра<lauqe( лесичялд(воткеъбохувдовтсневартеяреворП

еиненварсничилевхыволсичзивоксипси

орп )аксуподхаледерпвястидовзи

qe( lau )01–0.01– � T

qe( lau )200.0200.30.3 � T

e( lauq )1.0)0.331.21(‘)99.231.200.1(‘ � T

)>олсич<psunim( ьтсоньлетациртоаналсичакреворП

m( psuni )0 � lin m( psuni ))934215-( � T

)>олсич<porez( 0аналсичакреворП

( porez )0.0 � (0 porez )1 � lin

)>гра<llun( еыбюл–вотнемуграыпиТ

( llun )”tt“ � (lin ‘llun ))( � T

)>гра<prebmun( илимылецтнемуграилястеялвя,теяреворП

молсичмыньлетивтсйед

)>гра<psil( моксипстнемуграилястеялвя,теяреворП

Page 21: Программирование на AutoLISP.Salova

21

4.7. Функции условного ветвления программ

яицкнуФ еинасипО

)]>2рыв<[>1рыв<>еиволсу<fi( -fiапитюицарепоюунволсутеянлопыВ

-арвзоВ.еыбюлвотнемуграыпиТ.esle-neht

еинечанзеоннелсичыв:еинечанзеомеащ

илионнитси–>еиволсу<илсе,>1рыв<

lin–>еиволсу<илсе,>2рыв<еинечанз

linот,теувтстусто>2рыв<илсЕ

))01b–()01a+()ba>(fi(

ngorp(

)

ялделаксаПвкобоксхынротарепоголанА

воротарепохынжолс

)ba>(fi(

ngorp(

)1–cqtes(

)аc–(dqtes(

)de(qtes

ngorpdne;)

ngorp(

)2cqtes(

))ba*(dqtes(

))bd*(eqtes(

ngorpdne;)

fidne;)

).…>1рыв<>1еиволсу<(dnoc(

]).…>2рыв<>2еиволсу<([

апитяицарепояанволсУ esac елаксаПв

)(mmnufed(

)1ccqtes(

dnoc(

)”йынсарК“CBAQTES()1cc=((

)0001001(')000(‘”enil_“DNAMMOC(

)”C_“)0001052(‘

)1cc=(dne;)

)”йынсарК“CBAQTES()2cc=((

)001)000(‘”elcric_“DNAMMOC(

)2cc=(dne;)

1<ссили2>ссилсе;)”“T(

dnocdne;)

nufeddne;)

Page 22: Программирование на AutoLISP.Salova

22

4.8. Функции цикла

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) … “”)

яицкнуФ еинасипО

>1рыв<>еиволсу<elihw(

)]>Nрыв<.…>2рыв<[

-еворпонтаркогонмопалкицяицарепО

-юл–вотнемуграыпиТ.юиволсуумомеяр

еенделсоп–еинечанзеомеащарвзоВ.еыб

linилиеинежарыв

)1lairotcaf1iqtes(

)ni<(elihw(

)1i+(iqtes(

))ilairotcaf*(lairotcafqtes(

elihwdne;)

>1рыв<>овтсечилок<taeper(

)]>Nрыв<.…>2рыв<[

-наворискифсалкицюицарепотеянлопыВ

йинеротвопмовтсечилокмын

еоньлетижолопеолец–>овтсечилок<

)1lairotcaf1iqtes(

)n–1(taeper(

*(lairotcafqtes()1i+(iqtes( )ilairotcaf )

taeperdne;)

Page 23: Программирование на AutoLISP.Salova

23

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 – точки оси отражения

Page 24: Программирование на AutoLISP.Salova

24

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 – установка текущего слоя, если такого нет, то создает;

Page 25: Программирование на AutoLISP.Salova

25

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 надо сначала найтиимя примитива в базе данных с тем, чтобы впоследствии извлекатьгеометрические характеристики.

Page 26: Программирование на AutoLISP.Salova

26

яицкнуФ еинасипО

)tsaltne( авитимирпогенделсопямитеащарвзоВ

))tsaltne(eqtes(

)etegtne( мовитимирпсмынназявс,мыннадкпутсоД

йоннемерепВ e авитимирпямиястинарх

йищяотсос,косипстеащарвзовяицкнуФ -допзи

евитимирпоеыннадесвхыротокв,воксипс

-ориппургс).п.титевц,йолс,еиксечиртемоег(

юинечанзанумоньланоицкнуфопынав

,ремирпаН

>0050202:аткеъбоямИ<.1-((

)”ENIL“.0(

)”0“.8(

)0.0222.061874.37.01(

)…)0.0374.422456.052.11(

)хыннад_косипсдокcossa( удокопхыннадаксипсзихыннадробыВ

0(урапюунчечоттеащарвзов–)de0cossa( . )”ENIL“

)”ENIL“(авитимирпями–))de0cossa(rdc(

акзертоалачанакчот–)))de01cossa(rdc(1Pqtes(

атанидроок–X–))))de01cossa(rdc(rac(Xqtes(

акзертоалачан

)]акзаксдоп[lestne( -октнемелэйывреп,косипстеащарвзовяицкнуФ

-отва,авитимирпогоннарбывямиьтсеогорот

ялдйоннавозьлопси,икчотытанидроок–йор

-ос]акзаксдоп[етнемуграВ.авитимирпяиназаку

авитимирпеиназакуанасорпазтскетястижред

мыньлетазябоястеялвяентнемугрА

))”тнемелэетижакУn\“lestne(eqtes(

:косипсйымеащарвзоВ

))00.000.500.3(>410006:emanytitnE<(

авитимирпхыннадуксипскапутсодялД e -уделс

)))erac(tegtne(deqtes(еинежарывитсеввте

ями<[txentne(

)]>авитимирп

теащарвзовяицкнуфатэатнемугразебевозывирП

езабвавитимирпогоннеладуен,оговрепями

))txentne(1eqtes(акнусир

ямитеащарвзовяицкнуф,тнемуграястеемиилсЕ

евтсечаквилсе,linилиавитимирпогещюуделс

авитимирпогенделсопямионазакуатнемугра

))1etxentne(2eqtes(акнусир

Page 27: Программирование на AutoLISP.Salova

27

Практически все команды редактирования работают не с отдель-ными примитивами, а с группой примитивов. Функции для работы снабором примитивов представлены в таблице.

яицкнуФ еинасипО

йеицкнуфсиинатечосвьтавозьлопсионжоМ

:lestne

))))”витимирпижакУ“lestne(rac(txentne(3eqtes(

ями<ledtne(

)>авитимирп

-етзиястеяладу,етнемугравйынназаку,тнемелЭ

,ежетречанястеавилванатссовиажетречогещук

еснаесмещукетвмитэдерепнеладулыбноилсе

-отчинуывитимирпеымеяладУ.яинавориткадер

-кадераснаесяиначнокоелсопажетречзиястюаж

яинаворит

оговрепямиястеавиавсирп–))txentne(1eqtes(

екнусирвавитимирп

1eеинеладу–)1eledtne(

1eеинелвонатссов–)1eledtne(

яицкнуФ еинасипО

)tegss(

)”L_“tegss(

))001002(‘)00(‘”W_“tegss(

))0201('tegss(

витимирпумондооптеарибыВ мовтсдерсоп

йыджактедубенаркэаН.енаркэаняиназаку

ткеъбоетиребыВсорпазясьтялвяопзар

ямитеащарвзовяицкнуФ.)tcejbonoitceles(

:ремирпан,едивваробан

>2:tesnoitceleS<

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

,екмарвясеищядохан,ывитимирптеарибыВ

)001002(‘и)00(‘иматанидроокйоннадаз

-чотзеречйищядохорп,витимирптеарибыВ

.)0201(‘ук

))tegss(ssqtes(

)робанhtgnelss( еробанввовитимирполсичтеащарвзоВ

))sshtgnelss(nqtes())tegss(ssqtes(

)ремонробанemanss( допавитимирпямитеащарвзоВ моремон зи

аробан . теемиеробанввитимирпйывреП

он .0рем

оговрепямитеащарвзов–))0ssemanss(eqtes(

аробанзиавитимирп

tessменемисробантеадзос–))tegss(tessqtes(

Page 28: Программирование на AutoLISP.Salova

28

яицкнуФ еинасипО

-оврепямитеачулоп–))0tessemanss(1tneqtes(

tessвавитимирпог

-течямитеачулоп–))3tessemanss(4tneqtes(

авитимирпоготрев

авитимирп_ямиbmemss(

)робан

-взоВ.робанввитимирпилтидохв,теяреворП

-сарвтидохвноилсе,авитимирпямиястеащар

с .тидохвенилсе–linили,робанйымеавиртам

-сопхиробантеадзос–))”L_“tegss(robanqtes(

аробанямитеащарвзовиавитимирпогендел

>7:tesnoitceleS<

-ирпямитеащарвзов–)roban)tsaltne(bmemss(

-редосвитимирпйинделсопкаккат,авитим

еробанвястиж

)ddass(

)авитимирп_ямиddass(

авитимирп_ямиddass(

)робан

авитимирпогонидезебробанйывонтеадзоС

))ddass(ssqtes(

витимирпнидойищажредос,робантеадзоС

))1eddass(1ssqtes(

йищюувтсещусежувястеялвабодвитимирП

робан

))txentne(1eqtes( – витимирпоговрепями1eв а

екнусирв

ванатсу–))ddass(ssqtes( робанйовелунтеавил

)вотнемелэ0(

моротокв,робантеащарвзов–)ss1eddass(

1eинемиопвитимирпнелвабод

,витимирптеачулоп–))1etxentne(2eqtes(

1eазйищюуделс

моротокв,ssробантеащарвзов–)ss2eddass(

2eазйищюуделс,витимирпнелвабод

авитимирп_ямиledss(

)робан

-зоВ.аробанзиавитимирпямитеажотчинУ

-епоилсе,аробанями–еинечанзеомеащарв

ар -ирпилсе,linили,аненлопывяинеладуяиц

им иеробанвястижредосенвит огеьтиладу

язьлен

)ss1eledss(

Page 29: Программирование на AutoLISP.Salova

29

7. ОРГАНИЗАЦИЯ ДИАЛОГА В AUTOLISP

7.1. Использование функций семейства GETдля ввода данных

Простейший способ организации диалога – ввод данных с клавиату-ры. Для этого существует семейство функций GET. Все функции GETожидают ответа пользователя, т. е. приостанавливают выполнение про-граммы до тех пор, пока не будет осуществлен ввод (нажата клавишаENTER). Ввод может быть произведен как с клавиатуры, так и припомощи устройства указания мыши. Все вводимые данные автомати-чески преобразуются в нужный тип данных. Ниже приведены функциисемейства GET. В квадратных скобках указаны необязательные аргу-менты. Знак \n указывает на то, что текст запроса будет вводиться сновой строки в поле команды.

яицкнуФ еинасипО

)]асорпазтскет[tniteg( олсичеолецястидовВ

))”водяровтсечилоКn\“tniteg(mqtes(

)]асорпазтскет[laerteg( алсичогоньлетивтсйеддовВ

))”АыноротсунилдетидевВn\“laerteg(tsarqtes(

)]асорпазтскет[gnirtsteg( икортсдовВ

))”оволсидевВn\“gnirtsteg(tsqtes(

тскет[]акчот[tniopteg(

)]асорпаз

илсе,YиXикчоттанидроокадоввтеадижО

-изер“теусиречани,]акчот[тнемуграназакуен

етнемугравйонназаку,икчотто”юинилюувон

осипстеащарвзоВ.аросрукяинежолопод,]акчот[ к

))”укчотидевВ\“tniopteg(1tpqtes(

тскет[]акчот[tsidteg(

)]асорпаз

назакуилсе,олсичеоньлетивтсйедтеащарвзоВ

ястеавызакуеачулсмотэВ.]акчот[тнемугра

,назакуен]акчот[тнемуграилсЕ.акчотяаротв

-ивтсйедилиеолец–еиняотссарястидоввот

олсичеоньлет

))”еиняотссаридевВn\“tsidteg(sqtes(

-сорпаз[drowkteg(

)]акзаксдоп

,оволсеовечюлкялетавозьлопутеавишарпаЗ

иицкнуфищомопирпеенареоннеледерпо

миндосинтеадапвосентевтоилсЕ.TEGTINI

daCotuA,моволсмывечюлкмыннеледерпо

теадапвостевтоилсЕ.доввьтиротвоптисорпоп

Page 30: Программирование на AutoLISP.Salova

30

7.2. Диалоговое окно

Программа на языке AUTOLISP с использованием диалогового окнасостоит из двух файлов:

файла описания диалогового окна на языке DCL (файла .dcl) ;файла на языке АutoLisp (файла .lsp).Файл на языке DCL состоит из логических единиц – директив, рас-

полагаемых в файле последовательно. Каждая директива описываетполе или способ группировки полей. Все элементы языка DCL являют-ся чувствительными к регистру. Для записи директив используютсятолько латинские буквы. В каждом диалоговом окне содержатся одноили несколько полей, определяющих функции окна. К основным типамполей относятся базовые поля: клавиши, кнопки, текстовые поля, поляизображений. Поля могут обрамляться рамкой. В Autocad включеныфайлы base.dcl и acad.dcl. Файл base.dcl содержит определения базо-

яицкнуФ еинасипО

DROWKTEGяицкнуф,моволсмывечюлкс

юувокортскаковолсеовечюлкотэтеащарвзов

утнатснок

)”теНаД“1tegtini(

))”:]теН/аД[?ьтижлодорП“drowkteg(ylperqtes(

)]акортс[]галф[tegtini( -нададоввогещюуделсопяинечинарготеадаЗ

-тсешдерпнежлодtegtiniиицкнуфвозыВ.хын

мяицкнуфкюинещарбоеммаргорпвьтавов

тнемугрА.tniopteg,elgnateg,tsidteg,laerteg,tniteg

:яинечанзеищюуделсьтаминирптежом]галф[

–доввйотсуп(доввйотсуптеашерзарен–1

)>RETNE<ишивалкеитажанотэ

0доввтеашерзарен–2

лесичхыньлетациртодоввтеашерзарен–4

яинадазялдястеузьлопси]акортс[тнемугрА

едоввирпволсхывечюлкаксипс

адоввоготсуптерпаз–)1tegtini(

)2(0адовви)1(адоввоготсуптерпаз–)3tegtini(

0адовв,)1(адоввоготсуптерпаз–)7tegtini(

)4(лесичхыньлетациртоадовви)2(

теащерпазон,доввйотсуптеашерзар–)6tegtini(

)4(лесичхыньлетациртои)2(0довв

)”теНаД“1tegtini(

Page 31: Программирование на AutoLISP.Salova

31

вых, предварительно определенных полей общего пользования. Пред-варительно определенные поля не могут быть переопределены пользо-вателем. Этот файл не следует модифицировать! Файл acad.dcl содер-жит определения всех стандартных диалоговых окон. Все определенныепользователем DCL-файлы автоматически ссылаются на поля, опре-деленные в файле base.dcl. Каждое поле может иметь атрибуты.

Для просмотра DCL-файла без его запуска в редакторе VisualLispследует использовать пункт Interface Tools (Инструменты интерфейса)в меню TOOLS (Сервис). Директива описания диалога использует имя,ключевое слово dialog и метку label с названием диалогового окна.

ялоппиТ еинасипО

xob_tide: илитидоввьлетавозьлопморотокв,елоП.елопеовотскеТ

ткадер теури юувотскет кетйымидоввилcE.укортс с -ерпт

в "ьтитуркорп"онжомоге,ялопоговотскетыремзартеашы

иинелварпанмоньлатнозирогв

ытубиртА еинечанЗ

=lebaL ,)иицамрофнийомидоввеинавзанилисорпаз(акортС

икчываквяаннечюлказ

=htdiw_tidE йокмарйоннечинарго,ялопитсачйомеуриткадеранириШ

-иртаилсЕ.аловмисыниришхацинидевялопоговотскет

ястеяришсаракмарот,0внелвонатсуилиназакуентуб

онжомзовотэокьлоксан,окьлотсан

=timil_tidE итсеввтежомеороток,воловмисолсичеоньламискаМ

-кам,231–юиначломуоП.елопеовотскетвьлетавозьлоп

652–мумис

=eulaV яатсуп–юиначломуоп(икчываквяаннечюлказ,акортС

екмарвеоннещемзар,еовотскетеинечанзеондохсИ.)”“–

nmuloc: -ревястюагалопсарикнолокытнемелэесВ.йелопакнолоК

акнолоК.елйаф-LCDвяинежолопсарекдяропвоньлакит

меинечюлксиаз(йелопыпитеыбюльтажредостежом

икнолокеигурдиыдяряачюлкв,)аробывикпонкйоньледто

nmuloc_dexob: укмареенгурковюуннавосираняащюеми,акнолоК

)уцинарг(

тубиртА еинечанЗ

=lebaL тубиртА.)екмарвикнолокеинавзан(акортсеинечанЗ

l leba ,икнолокулгумовелменхреввелопкакястидовыв

укмарвйоннечюлказ

Page 32: Программирование на AutoLISP.Salova

32

ялоппиТ еинасипО

wor: ынежолопсарялопогеон,екнолокнечиголанА.дяР

елйаф-LCDвяинежолопсарекдяропвоньлатнозирог

wor_dexob: )уцинарг(укмарогенгурковюуннавосиранйищюеми,дяР

тубиртА еинечанЗ

=lebaL тубиртА.)екмарвадяреинавзан(акортсеинечанЗ lebal

-нечюлказ,адярулгумовелменхреввелопкакястидовыв

укмарвогон

egami: еонроткевястеажарботоогоротокиртунв,киньлогуомярП

-йалсазакопялдястеузьлопсиеинежарбозИ.еинежарбози

имартемарапимыньламрофсажетречад

ытубиртА еинечанЗ

=roloC -ирп,атевцремонкакйыннеледерпо,акнусиранофтевЦ

-ломуоп(немихыньловмисзиондоили,dacotuAвйытян

:)7юинач

;анкооговоголаидйинилтевцйищукет–enil_golaiD

оговоголаидволовмистевцйищукет–dnuorgerof_golaiD

;)атскетялд(анко

;анкооговоголаиданофтевцйищукет–dnuorgkcab_golaiD

;анаркэогоксечифарганофтевцйищукет–dnuorgkcab_cihparG

ястеажарботоенофмонречан()йынреч(0тевц–kcalB

;)йылебкак

;)йытлеж(2тевц–wolleY;)йынсарк(1тевц–deR

;)йобулог(4тевц–nayC;)йынелез(3тевц–neerG

;)йывотелоиф(6тевц–atnegaM;)йинис(5тевц–eulB

)йылеб(7тевц–etihW

=oitar_tcepsA етосывогекяинежарбозиыниришеинешонтотеяледерпО

допястеяногдопелопот,)0.0(юлунонвареинечанзилсЕ

яинежарбозиыремзар

=htdiW

=thgieH

ялопаниришиатосыВ

nottub_oidaR: хынненидеъбо,копонкаппургилиандО.аробывакпонК

,копонкзиандоанарбывилсЕ.аробывдярилиукнолокв

аробывикпонК.анечюлктотедубакпонкяагурдяабюлот

-понкилсЕ.аробывхадярилихакнолоквокьлотястюялвяоп

от,аробывадярилиикнолокенванещемзараробывак

екбишобоеинещбоосястеялвяоп

Page 33: Программирование на AutoLISP.Salova

33

Ниже приведено описание общих атрибутов, пригодных для любыхполей.

ялоппиТ еинасипО

ытубиртА еинечанЗ

=lebaL аробывишивалктоавелсйымидовыв,тскетотЭ

=eulaV –атубиртаеинечанзилсЕ.акортсикчываквяаннечюлкаЗ

-ктоот,ьлун–илсе,анечюлкваробывакпонкот,ациниде

илсЕ.юлунынчиголанаяинечанзеигурдеыбюл;анечюл

тубиртатюемикопонкокьлоксенманичирпот-микакоп

яянделсопокьлотанечюлквтедуб,ецинидейынвар,eulaV

хинзи

_dexoB:

nmuloc_oidar

укмареенгурковюуннавосираняащюеми,аробывакнолоК

икнолокектемончиголанаястеуткартактеМ.)уцинарг(

екмарв

wor_oidar_dexoB: укмарогенгурковюуннавосиранйищюеми,аробывдяР

recapS -мокхялецвокьлотястеузьлопсИ.ьлетиледзар,елопеотсуП

йелопхынжемсеинежолопсариремзарантеяилвииквоноп

elitrrE ,оливарпкак,еороток,исипданелопотЭ.икбишоелоП

оноюиначломуоП.анкооговоголаидузинвястеялвяоп

,еинещбоосменвьтизарбототежомаммаргорпон,отсуп

”rorre“мочюлксюлопеинечанзвиовсирп

атубиртапиТ еинасипО

=yeK -едерпочюлК.икчываквяаннечюлказ,акортс–еинечанЗ

йоммаргорпястеузьлопсииIICSAхаловмисвямитеял

д онжлоделопеонвиткаеоджаК.елопотэаниклыссял

-олаидялдоньлакинуогоротокеинечанз,чюлкйовсьтеми

-ьтянемзитежом,юлопеоннеовсирп,еинечанЗ.анкооговог

ытобарямервовяс

=thgie_dexiF рптетсаренялопатосыВ.ялопатосывяаннаворискиФ и

яинечанзеынжомзоВ.анкооговоголаидеквонопмок eurT

)eslaFюиначломуоп(eslaFили

=htdiw_dexiF тетсаренялопанириШ.ялопаниришяаннаворискиФ

рп яинечанзеынжомзоВ.анкооговоголаидеквонопмоки

)eslaFюиначломуоп(eslaFилиeurT

Page 34: Программирование на AutoLISP.Salova

34

Предусмотрены клавиши выхода из диалогового окна.

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, mm”; key = “edit2”; fixed_width=true; edit_limit = 6; } }

:row { : edit_box { label=”Радиус скругления R, mm “; fixed_width=true; key = “edit3”;

ашивалК еинасипО

ylno_kO аДишивалкyekчюлК.)KO(аДашивалкяанневтснидЕ

”tpecca“еинечанзтееми

lecnac_kO -натс–)lecnaCdnaKO(анемтОиаДшивалкяицанибмоК

-омхыротокв,нокохывоголаидялдяицанибмокяантрад

ишивалкyekчюлК.еыннадвяиненемзиясьтисонвтуг

”lecnac“еинечанзтееми)lecnaC(анемтО

pleh_lecnac_kO -ивалкйонтраднатсосанаворинибмоксlecnac_koаппурГ

теемиьщомоПишивалкyekчюлК.)pleH(ьщомоПйеш

”pleh“еинечанз

Page 35: Программирование на AutoLISP.Salova

35

edit_limit = 6; } : edit_box { label=”Толщина b, mm “; fixed_width=true; key = “edit4”; edit_limit = 6; } }

: 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;

Page 36: Программирование на AutoLISP.Salova

36

color=0; } spacer; } spacer; ok_cancel; errtile; }

Экранная форма этого меню показана на рис. 2. Рисунок в диалого-вом окне представляет собой слайд. Для его создания используетсякоманда MSLIDE (ДСЛАЙД), которая создает файл с расширением.sld. Созданный слайд не подлежит редактированию.

П р и м е р колонки с кнопками выбора:: boxed_radio_column{ label=”Direction”; fixed_height=true; fixed_width=true;

Рис. 2. Экранная форма меню для приложения COIL.lsp

Page 37: Программирование на AutoLISP.Salova

37

: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 для управления диалоговыми окнами.

иицкнуфеинавзаН еинасипО

golaid_daol( ями

)алйаф

З -ечанзеолецтеащарвзоВ.лйаф-LCDйынназакутеажурга

-кнуфхавозывхищюуделсопвеомеузьлопси,)di_lcd(еин

.golaid_daolnuиgolaid_wenйиц

В!ЕИНАМИНВ теуделсеналйафями еинеришсарьтялватсв

golaid_daolnu(

)di_lcd

linтеащарвзовадгесВ.лйаф-LCDйынназакутеажургыВ

golaid_wen( ями

анко )di_lcd

аногетидовыв,монкомывоголаидеинелварпутеаничаН

тнемугрА.наркэ анкоями тнемугрА.акортс– di_lcd -ерпо

иицкнуфмовозывястеяледерпо(лйаф-LCDтеялед

l golaid_dao иицкнуфиинешревазмоншепсуирП.)

.lin–еачулсмонвиторпв,)eurt(Tтеащарвзов)golaid_wen(

йеицкнуфеомеащарвзовьтяреворптеуделсадгесВ

golaid_wen еинечанз

Page 38: Программирование на AutoLISP.Salova

38

иицкнуфеинавзаН еинасипО

)golaid_trats( -жлодонкоеовоголаиД.енкомовоголаидвголаидтеаничаН-кнуфмовозывонаворизилаицинионьлетиравдерпьтыбон

ииц golaid_wen еинежарывакоп,мынвиткаястеатсоонкО.тувозывенмотарвзовсавозывяицкнуфилияивтсйед

юицкнуф golaid_enod иицкнуфвозывончыбО. golaid_enod

чюлкмищюеми,мелопсназявс ”tpecca“ -алкончыбо(ашив ”kO“ или) ”lecnac“ ашивалкончыбо( ”анемтО“ )

golaid_enod(

[ еиняотсоc )]

-аркэсогетеарибуиенкомовоголаидвголаидтеашреваЗтнемугрА.ан еиняотсос илсЕ.мыньлетазябоястеялвяен

еоротокеньтиовсирптеуделсумеот,ястеузьлопcитнемуграолсичеолец

elit_noitca( чюлк

еинежарыв

яивтсйед )

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

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

-еткясьтащарботежомеинежарыВ.ялопмелетавозьлопялоптубирта(ялопюинечанзумещук eulav -неледерпо,)

умоннеледерпо,инемиогекeulav$как,ремирпан,умонытнемугрА.yek$как яивтсйедеинежарывичюлк -тюялвя

имакортсяс

вотубиртаийелопактобарбО

elit_tes( чюлк

еинечанз )

тнемугрА.ялопогонназакуялдеинечанзтеавилванатсУчюлк тнемугра,елоптеяледерпо еинечанз еомеавиавсирп–

имакортсястюялвяытнемуграесВ.еинечанз

elit_teg( чюлк ) укортстеащарвзоВ.ялопеинечанзтеавишарпаЗ

йинежарбозиеинадзоС

elit_xmid( чюлк )

elit_ymid( чюлк )

оговоголаидхацинидевялопыремзартюащарвзовиицкнуФ.елоптеяледерпочюлК.анко

ялопунириштеащарвзоВялопутосывтеащарвзоВ

egami_trats(

чюлк )

яинежарбозиогонназакуяинадзосссецорптеаксупаЗмотнемуграмоннеледерпо,елопв чюлк

1y1xegami_edils(

2y2x адйалсями )

)00(олачаН.енкомовоголаидв)dls.(дйалстеажарботО-ьледтоьтыбтежомдйалС.улгуменхревмовелвястидохан

икетоилбибеватсосвясьтидоханили)dls.*(молйафмын-ызакуалачансикетоилбибзиевозывирП.)bls.*(водйалс.адйалсямихакбоксхылгурквметаз,икетоилбибямиястеав

адйалслогуйоротв–2Y2X,адйалсикватсвакчот–1Y1X

)egami_dne( яинежарбозияинадзосеинешреваЗ

Page 39: Программирование на AutoLISP.Salova

39

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

Page 40: Программирование на AutoLISP.Salova

40

; Функция отображает введенные значения в соответствующих полях; диалогового окна, либо устанавливает исходные значения по умолча; нию.

(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”)

Page 41: Программирование на AutoLISP.Salova

41

(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)

Page 42: Программирование на AutoLISP.Salova

42

(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 (); основная функция ; Отключение эхо-вывода (запросы команд и ответы на них не ; отображаются на экране

Page 43: Программирование на AutoLISP.Salova

43

(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)”)

Page 44: Программирование на AutoLISP.Salova

44

(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

Page 45: Программирование на AutoLISP.Salova

45

(command “–·LINE” p2 pt1 p4 “”) (command “

–·LINE” p21 p3 p41 “”)

) (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)

“_N”) ; $endmark – функция, возвращающая набор $COIL (command “

–·PLINE” p4 “_W” “0.5” “0.5” p41 “”)

(command “–·

MIRROR” (_$endmark “$COIL1”) “” p2 (polar p2 (/ pi2.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);тихий выход из программы)

Page 46: Программирование на AutoLISP.Salova

46

7.6. Библиотека часто встречающихся функций

Обычно часто повторяющиеся в разных программах функциирасполагают в отдельном файле. Таким файлом может быть ACAD.lspили файл ACADDOC.lsp. При запуске AutoCad всегда производитсяпоиск файла ACAD.lsp по библиотечному пути поиска. При обнаруже-нии этого файла его содержимое загружается в оперативную память,и функции становятся доступными для любой программы. По умол-чанию файл ACAD.lsp загружается только один раз – при запускеAutoCad. Если требуется, чтобы часто встречающиеся функции заг-ружались всегда при открытии или создании чертежа, необходимо дляэтих целей использовать файл ACADDOC.lsp, в который поместитьэти функции. Загрузкой файла ACAD.lsp с каждым вновь открывае-мым чертежом можно управлять с помощью опции Load ACAD.LSPwith 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)

Page 47: Программирование на AutoLISP.Salova

47

((= 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) )

Page 48: Программирование на AutoLISP.Salova

48

8. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА ИЗ ФАЙЛА

яицкнуФ еинечанзаН

>ковологаз<delifteg(

>еинеришсар<>ями<

)>галф<

алйафаксиопонкоеовоголаидтеавызыВ

анкооговоголаидеинавзан–ковологаЗ

ксиопястеаничанйоротокс,икпапилиалйафями–ямИ

)”*“анястеянемаз”“(.алйафеинеришсар–еинеришсаР

иицкнуфяицпо–галФ

ьтавозьлопсиязьлен(алйафоговониинадзосирп–1

)алйафогещюувтсещусаробывялд

-еришсармыбюлсалйафямиьтидоввтеашерзар–4

)огензебили(меин

-отокв,икпапямикакястеуткартямитнемугра–61

лйафьтаксиоданйор

delifteg( “ -ибыв)61”cod“”ыдурТ/:D“”лйафетиребыВ

алйафаксиопялдголатакястеар

-ибыв)71”cod“”ыдурТ/:D“”лйафетинархоC“delifteg(

яиназакузебалйафяиненархосялдголатакястеар

аголаиделопвалйафинеми

)1”cod“”a/.ыдурТ/:D“”лйафетинархоC“delifteg(

меиназакусалйафяиненархосялдголатакястеарибыв

аголаиделопвалйафинеми

)>лйаф<elifdnif( илсЕ.)умонлопилиумоктарк(инемиоплйафтещИ

от,итупогонлопзебалйафямитижредостнемугра

-траднатсопиеголатакмечобарвястеянлопывксиоп

еонлоптеащарвзоВ.аксиопмятупdaCotuAялдмын

теналйафилсе,linилиалйафями

>лйаф<nepo(

)>мижер<

яиненлоподилиисипаз,яинетчялдлйафтеавырктО

:аловмисогондозиакортс–мижеР

ьсипаз–”w“

еинетч–”r“

еиненлопод–”a“

linилиалйафротпиркседтеащарвзоВ

))”w“”TXT.A“nepo(fqtes(

)>ротпирксед<esolc( )fesolc(алйафуротпиркседоплйафтеавыркаЗ

enil-daer(

)>ротпирксед<

зиилиырутаивалксволовмисукортстеавытичС

яавотскет–еинечанзеомеащарвзоВ.алйафоготыркто

ястеащарвзовот,алйафценоктунгитсодилсЕ.акортс lin

алйафзи–))fenil-daer(tsqtes(

ырутаивалкc–))enil-daer(1tsqtes(

Page 49: Программирование на AutoLISP.Salova

49

П р и м е р:(setq jj (open “limit.dat” “r”)) (if jj (progn (setq bz (atof (read-line jj))) (setq hj (atof (read-line jj))) )

яицкнуФ еинечанзаН

rahc-daer(

)>ротпирксед<

-ктозиилиырутаивалкарефубзиловмистеавытичС

-орпдок–олсичеолецтеащарвзоВ.алйафоготыр

аловмисогоннатич

акортсenil-etirw(

)>ротпирксед<

лйафйытырктовутнатснокюувокортстеавысипаЗ

юутязв,укортстеащарвзовяицкнуФ.наркэанили

лйафвисипазирпикчывактеаксупои,икчывакв

)f”РЕМИРП“enil-etirw(

>док<rahc-etirw(

)>ротпирксед<

мыннадазсловмисйоворфиц-онневкубтеавысипаЗ

еинечанзеомеащарвзоВ.наркэанилилйафвмодок

-азязьлеН.)аловмисогоннедевывдок(олсичеолец–

ястидовыв–)05rahc-etirw(.0модоксловмисьтасип

05еинечанзеомеащарвзови2арфиц

)>лйаф<eteled-elif-lv( еинеладуилсе,Tеинечанзтеащарвзов,лйафтеяладУ

.оненлопывенеинеладуилсе–lin;оненлопыв

)”txt.a“eteled-elif-lv(

иицкнуфеыньлетинлопоД

)>еинещбоос<tpmorp( -ечанзеомеащарвзоВ.наркэанеинещбоостидовыВ

linеин

)>еинещбоос<trela( сенкомовоголаидвнаркэанеинещбоостидовыВ

linеинечанзеомеащарвзоВ.KOйокпонк

:кортсокьлоксенитсевывомидохбоенилсЕ

яинавориммаргорпкызЯn\psiLotuAотЭ“tacrts(tsqtes( n\

))”daCotuAедерсв

)tstrela(

)cnirp( щарвзовеН.дохывйихиТ -сИ.яинечанзогокакинтеа

п ыммаргорпецноквястеузьло

)irpret( -боосеондеречО.укортсюувонанросруктидовереП

икортсйовонсястидовывеинещ

Page 50: Программирование на AutoLISP.Salova

50

(progn (setq bz 0.8) (setq hj 4.0) ) )

9. СОЗДАНИЕ VLX-ПРИЛОЖЕНИЯ

В состав приложения могут входить не только LSP-файлы, но и DCL-файлы диалоговых окон, FAS-файлы, DVB-файлы Visual Basic forApplications и текстовые файлы (ТХТ-файлы). Все включаемые компо-ненты собираются в единый файл приложения с расширением vlx. Свой-ства приложения сохраняются в одноименном файле с расширением prv,который используется в случае повторной сборки приложения. Для со-здания нового VLX-приложения следует воспользоваться пунктом MakeApplication (Собрать приложение) меню File (Файл). Пункт имеет сле-дующие подпункты:

New Application Wizard (Мастер новых приложений);Existing Application Properties (Свойства имеющихся приложений);Make Application (Собрать приложение);Rebuild Application (Перекомпилировать приложение).

Для создания нового приложения следует выбрать подпункт NewApplication Wizard (Мастер новых приложений), который открывает диа-логовое окно Wizard Mode (Режим Мастера), приведенное на рис. 3.

Рис. 3. Окно Wizard Mode

Page 51: Программирование на AutoLISP.Salova

51

В этом окне необходимо задать режим, определяющий тип приложе-ния: Simple (Простой) или Expert (Сложный). Простое приложение можетсостоять только из файлов с LISP-программами (аналогично FAS-прило-жению), а сложное может включать DCL-файлы, DVB-файлы и т. д.

В случае выбора положения переключателя Expert (Сложный) и щел-чка по кнопке Next (Далее) открывается диалоговое окно ApplicationDirectory (Папка приложения). Здесь нужно заполнить поле (рис. 4)Application Name (Имя приложения), а в поле Application Location (Рас-положение приложения) ввести полное имя папки, в которую будут запи-саны файл приложения с расширением vlx и файл свойств приложения срасширением prv (основная часть имени этого файла будет взята из имени приложения).

Папку удобнее выбирать с помощью кнопки Browse (Обзор). Послезадания имени приложения поле Target File (Целевой файл) покажет имяфайла нового приложения с расширением vlx. Нажатие кнопки Next (Да-лее) приводит к следующему окну (рис. 5) – Application Options (Пара-метры приложения). По умолчанию в данном окне флажок SeparateNamespace (Отдельное именное пространство) не установлен. Это оз-начает, что функции и глобальные переменные вашего приложения бу-дут доступны другим приложениям. Следующее окно (рис. 6) – LISPFiles to Include (LISP-файлы для сборки приложения) дает возможностьперечислить все файлы с расширениями lsp (исходные тексты), fas (ком-

Рис. 4. Окно Application Directory

Page 52: Программирование на AutoLISP.Salova

52

пилированные файлы) и prv (файлы проектов), которые необходимо ин-тегрировать в создаваемое приложение. Кнопки Add (Добавить) иRemove (Удалить) позволяют, соответственно, добавлять или удалятькомпоненты. Кнопками Тор (Начало), Up (Вверх), Down (Вниз) и Bottom(Нижняя) можно регулировать порядок включения элементов LISP-про-

Рис. 5. Окно Application Options

Рис. 6. Окно LISP Files to Include

Page 53: Программирование на AutoLISP.Salova

53

грамм в приложение. Раскрывающий список имеет три строки (LISPsource files (Исходные LISP-файлы),

Compiled LISP files (Скомпилированные LISP-файлы) и Visual LISPproject files (Файлы проектов Visual LISP)), помогающие добавлять вприложение компоненты нужного типа. Кнопки Add (Добавить) и Remove(Удалить) позволяют, соответственно, добавлять или удалять компо-ненты. Кнопками Тор (Начало), Up (Вверх), Down (Вниз) и Bottom (Ниж-няя) можно регулировать порядок включения элементов LISP-программв приложение. Раскрывающий список имеет три строки (LISP sourcefiles (Исходные LISP-файлы), Compiled LISP files (СкомпилированныеLISP-файлы) и Visual LISP project files (Файлы проектов Visual LISP)),помогающие добавлять в приложение компоненты нужного типа.

Диалоговое окно (рис. 7) Resource Files to Include (Файлы ресур-сов) не появится, если выбран режим простого приложения. В качестведополнительных ресурсов к вашему приложению могут быть добавле-ны элементы, перечисленные в раскрывающемся списке (три первыхтипа могли быть выбраны в предыдущем окне):

LISP source files (Исходные LISP-файлы);Compiled LISP files (Скомпилированные LISP-файлы);Visual LISP project files (Файлы проектов Visual LISP);

Рис. 7. Окно Resource Files to Include

Page 54: Программирование на AutoLISP.Salova

54

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

Page 55: Программирование на AutoLISP.Salova

55

ти к неправильной работе приложения и системы 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-программу построения параметрического чертежа.

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

Page 56: Программирование на AutoLISP.Salova

56

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 с.

Page 57: Программирование на AutoLISP.Salova

57

ПРИЛОЖЕНИЕ

ПРИМЕРЫ ЗАДАНИЙ ДЛЯ КУРСОВОЙ РАБОТЫ

1

3

5

7

2

4

6

8

Page 58: Программирование на AutoLISP.Salova

58

Продолжение прил.

9

11

13

15

10

12

14

16

Page 59: Программирование на AutoLISP.Salova

59

Окончание прил.

17

19

21

23

18

20

22

24

Page 60: Программирование на AutoLISP.Salova

60

СОДЕРЖАНИЕ

Предисловие ...................................................................................................... 3

1. Характеристика языка AutoLisp .................................................................. 4

1. 1. Типы данных ......................................................................................... 4

1.2. Системные переменные AutoCad ........................................................ 5

1.3. Функция присвоения ............................................................................ 6

2. Структура программы на языке AutoLisp ................................................... 6

3. Правила отладки в среде VISUALLISP .......................................................... 8

3.1. Синтаксические ошибки ....................................................................... 8

3.2. Устранение синтаксических ошибок .................................................... 8

3.3. Форматирование текста программы ................................................... 9

3.4. Загрузка и выполнение программы .................................................... 10

3.5. Устранение ошибок на стадии выполнения программы ................... 11

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

4.1 Геометрические функции...................................................................... 13

4.2. Математические функции .................................................................... 14

4.3. Функции для работы со списками ....................................................... 15

4.4. Функции преобразования ..................................................................... 17

4.5. Функции для работы со строками ........................................................ 18

4.6. Логические функции AutoLisp ............................................................ 19

4.7. Функции условного ветвления программ ........................................... 21

4.8. Функции цикла ..................................................................................... 22

5. Вызов команд AutoCad из программы ....................................................... 22

6. Доступ к примитивам и средствам AutoCad .............................................. 25

7. Организация диалога в AutoLisp .................................................................. 29

7.1. Использование функций семейства GET для ввода данных................ 29

7.2. Диалоговое окно ................................................................................... 30

7.3. Пример диалогового окна .................................................................... 34

7.4. Управление диалоговым окном из программы на языке AutoLisp ... 37

7.5. Пример программы на языке AutoLisp .............................................. 39

7.6. Библиотека часто встречающихся функций ........................................ 46

8. Организация ввода-вывода из файла ............................................................ 48

9. Создание VLX-приложения ........................................................................... 50

10. Методические указания к выполнению курсовой работы ..................... 55

Библиографический список ............................................................................. 56

Приложение ....................................................................................................... 57