Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
AutoCAD
Visual LISP, AutoLISP и DXF
стр. 1 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
ОГЛАВЛЕНИЕ
Введение....................................................................................................................................................................................4
Постановка задачи.............................................................................................................................................................5
Начало работы в Visual LISP.............................................................................................................................................7
Знакомство с форматированием кода в Visual LISP.......................................................................................................8
Анализ кода..........................................................................................................................................................................8
Создание фиктивных функций в программе....................................................................................................................9
Проверка кода с помощью Visual LISP............................................................................................................................10
Выполнение программы в Visual LISP.............................................................................................................................11
Итоги занятия 1...............................................................................................................................................................11
стр. 2 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Построение границы дорожки...........................................................................................................................................27
стр. 3 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Введение
Целью данного учебного пособия является создание новой команды AutoCAD, которая строит
на экране парковую дорожку, выложенную круглой плиткой. Учебное пособие состоит из семи
занятий. По мере их прохождения инструкции по выполнению отдельных задач постепенно
становятся менее подробными. При возникновении вопросов следует обращаться к электронной
справочной системе по VLISP.
Файлы с исходным кодом для каждого этапа разработки имеются на установочном компакт-
диске AutoCAD. Они копируются в систему только при полной установке, или если в ходе
стр. 4 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
выборочной установки выбран компонент «Примеры». Если при последней установке AutoCAD
файлы учебного пособия не были скопированы, необходимо снова запустить программу
установки, выбрать вариант «Добавить» и установить компонент «Примеры».
<Папка AutoCAD>\Tutorial\VisualLISP\Lesson1
<Папка AutoCAD>\Tutorial\VisualLISP\Lesson2
и т.д.
<Папка AutoCAD>\Tutorial\VisualLISP\MyPath
Вместо этой строки в каждом конкретном случае следует вводить путь, по которому реально
находится рабочая папка.
Постановка задачи
стр. 5 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Чтобы посмотреть, как программа должна работать в конечном итоге, можно запустить готовую
версию приложения, поставляемую с AutoCAD.
Для запуска имеющегося примера
3. Нажмите «Закрыть».
6. В ответ на запрос «Half Width of Path» (половина ширины дорожки) введите 50 (если
работа ведется в Британской системе единиц, следует ввести 2).
стр. 6 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
7. В диалоговом окне «Garden Path Tile Specifications» нажмите «OK».
Посмотрев, как должно работать приложение, можно приступать к его разработке в среде
VLISP. Но вначале следует уяснить, что происходит, когда среда VLISP ожидает передачи
управления из AutoCAD. Возможно, при запуске примера уже возникала подобная ситуация.
Для знакомства с поведением Visual LISP при ожидании передачи управления из AutoCAD
В окне VLISP указатель мыши заменяется специальным курсором VLISP, обозначающим, что
ввод команд или текста в окне VLISP запрещен. Он напоминает, что для возобновления работы
VLISP необходимо завершить выполняющуюся в AutoCAD программу AutoLISP.
стр. 7 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
)
;;; Display a message to let the user know the command name.
(princ "\nType gpath to draw a garden path.")
(princ)
3. Выберите «Файл» >> «Сохранить как» и сохраните код в новом файле
<папка AutoCAD>\Tutorial\VisualLISP\MyPath\gpmain.lsp.
4. Проверьте свою работу.
VLISP форматирует текст программы по мере его ввода, добавляя необходимые отступы и
пробелы. Для того, чтобы отформатировать в VLISP код, скопированный из другого файла,
следует выбрать из меню VLISP «Сервис» >> «Форматировать код в редакторе».
Анализ кода
Выражение defun описывает новую функцию. Основная функция в данном случае называется
C:GPath. Приставка C: обозначает, что к функции можно обращаться из командной строки
AutoCAD — точно так же, как к любой команде. Для вызова приложения в ответ на подсказку
«Команда:» необходимо ввести Gpath. Для запроса у пользователя ввода информации
используются функции gp:getPointInput и gp:getDialogInput. Функция gp:drawOutline строит
границу дорожки. Эти функции имеют префикс gp:, обозначающий, что они используются
только в приложении построения парковой дорожки. Подобные префиксы рекомендуется (хотя
и не обязательно) использовать для того, чтобы отличать функции, используемые
исключительно в рамках одного приложения, от совместно используемых функций и утилит.
Вызов функции princ ближе к концу служит для вывода подсказки. После загрузки приложения
в командной строке выдается подсказка, в которой говорится какое имя команды надо ввести
для построения парковой дорожки. Последняя функция princ, не имеющая строковых
аргументов, служит для мягкого выхода из программы (то есть без возвращения главной
функцией результата). При отсутствии последнего выражения princ подсказка выдавалась бы
дважды.
стр. 8 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Для того, чтобы программа выполнялась правильно, требуется еще три функции. Главная
функция программы содержит вызовы трех пользовательских функций:
gp:getPointInput
gp:getUserInput
gp:drawOutline
Теперь необходимо создать три описания фиктивных функций. Фиктивные функции пока будут
заменять полные функции, к разработке которых мы еще вернемся. Их наличие позволяет
проверять работу программы до того, как в нее будут добавлены все элементы, необходимые
для выполнения приложения.
1. Поместите курсор в окне редактора в самое начало кода программы и нажмите пару раз
ENTER для ввода пустых строк.
2. Введите перед главной функцией следующее:
;;; Function gp:getPointInput will get path location and size
(defun gp:getPointInput ()
(alert
"Function gp:getPointInput will get user drawing input"
)
;; For now, return T, as if the function worked correctly.
T
)
;;; Function gp:getDialogInput will get path parameters
(defun gp:getDialogInput ()
(alert
"Function gp:getDialogInput will get user choices via a dialog"
)
;;For now, return T, as if the function worked correctly.
T
)
;;; Function gp:drawOutline will draw the path boundary
(defun gp:drawOutline ()
(alert
(strcat "This function will draw the outline of the polyline"
"\nand return a polyline entity name/pointer."
)
)
;; For now, simply return a quoted symbol. Eventually, this
;; function will return an entity name or pointer.
'SomeEname
)
Каждая функция содержит в конце строку, состоящую из одного символа «T». Она используется
в качестве возвращаемого значения. Каждая функция AutoLISP должна возвращать в
вызвавшую ее функцию какое-либо значение. Буква «T» используется в AutoLISP для значения
«true» (истина); именно оно будет передано в вызывающую функцию. Файл gpmain.lsp
организован таким образом, что для перехода к следующему этапу выполнения программы
каждая вызываемая функция должна возвращать значение, отличное от nil (что обозначает «нет
значения»).
стр. 9 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
По умолчанию функции AutoLISP всегда возвращают значение последнего вычисленного
внутри нее выражения. В фиктивных функциях единственным выражением является обращение
к функции alert. Однако функция alert всегда возвращает значение nil. Таким образом, будучи
вызванной последней в gp:getPointInput, она возвратит nil и переход через if к функции
gp:getDialogInput станет невозможным.
При возникновении затруднений см. главу «Developing Programs with Visual LISP» электронного
документа Visual LISP Developer's Guide. Сначала следует попытаться установить причину
ошибки самостоятельно. Если на поиск ошибки уходит слишком много времени, для
продолжения работы над учебным пособием можно воспользоваться файлом примера
gpmain.lsp, находящимся в папке lesson1.
2. Из меню VLISP выберите «Файл» >> «Открыть файл» и откройте файл gpmain.lsp,
расположенный в папке \Tutorial\VisualLISP\lesson1.
стр. 10 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Окно «Консоль Visual LISP» воспринимает ввод команд в формате AutoLISP, поэтому все имена
функций должны заключаться в скобки.
Замечание: Если окно AutoCAD было свернуто, сообщения не будут видны. Поэтому
перед вызовом функции gpath свернутое окно AutoCAD следует развернуть (с помощью
панели задач или ALT+TAB).
Итоги занятия 1
Постановка задачи.
Другим большим преимуществом локальных переменных является то, что они упрощают
отладку и усовершенствование приложений. Так, например, никогда нельзя быть точно
уверенным, когда и какая именно функция изменила значение глобальной переменной.
Проследить же изменение локальной переменной значительно проще. Таким образом,
локальные переменные позволяют сократить количество побочных эффектов (выражающихся в
том, что одна часть программы влияет на ее другую часть).
стр. 12 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Применение локальных переменных в программе
В том виде, как она есть на данный момент, функция не выполняет практически никаких
действий. Нам нужно расширить ее, добавив функции ввода пользовательских данных
(начальной и конечной точек, а также ширины дорожки).
2. Поместив курсор в окне консоли за последней скобкой блока кода (или на следующей
строке), нажмите ENTER для замены предыдущей загруженной версии функции
gp:getPointInput.
стр. 13 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Изучение функции gp:getPointInput
2. После того, как первая точка указана, программа запоминает ее значение (список из трех
координат X, Y и Z) в переменной StartPt.
6. Функция getdist позволяет как указывать точку на экране, так и вводить численное
значение. Результат выполнения функции getdist хранится в переменной HalfWidth.
7. После этого программа встречает значение «T», находящееся внутри функции. Так как
далее не следует никаких других функций, данная функция завершается и возвращает
значение «T». Именно оно и выводится в окне консоли.
Данные необходимо каким-то образом передать из одной функции в другую. Для этого можно,
например, создать список значений, полученных функцией gp:getPointInput, как описано ниже:
(defun gp:getPointInput ( / StartPt EndPt HalfWidth )
(if (setq StartPt (getpoint "\nStart point of path: "))
(if (setq EndPt (getpoint StartPt "\nEndpoint of path: "))
(if (setq HalfWidth (getdist EndPt "\nHalf width of path: "))
(list StartPt EndPt HalfWidth)
)
)
)
)
Скопируйте этот вариант gp:getPointInput в окно консоли и нажмите ENTER. Теперь можно
воспользоваться еще одной служебной функцией окна консоли.
стр. 14 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
2. Когда в окне консоли появится подсказка (gp:getPointInput), нажмите ENTER для
повторного выполнения функции.
Функция возвращает список, содержащий в себе два вложенных списка и одно вещественное
число (с плавающей точкой). Возвращаемые значения выглядят приблизительно следующим
образом:
((4.46207 4.62318 0.0) (7.66688 4.62318 0.0) 0.509124)
Хотя предыдущий пример работает, того же самого результат можно добиться другим, более
удобным, способом. В следующем упражнении создается ассоциативный список
(обрабатываемый LISP-функцией assoc). В ассоциативном списке с каждым элементом-
значением связывается свой ключевой код. Ниже приведен пример ассоциативного списка:
((10 4.46207 4.62318 0.0) (11 7.66688 4.62318 0.0) (40 . 1.018248))
В этом списке ключевыми кодами являются числа 10, 11 и 40. Эти ключевые коды служат
уникальным индексом списка. С помощью данного механизма AutoCAD возвращает в AutoLISP
информацию об объектах, полученную при выполнении программы. Код 10 обозначает
начальную точку, код 11 обычно используется для конечной точки.
В ассоциативном списке порядок следования значений не важен. Даже при изменении порядка
элементы ассоциативного списка всегда можно идентифицировать. Например, код 11 обозначает
конечную точку вне зависимости от того, где она располагается в общем списке.
((11 7.66688 4.62318 0.0) ; order of list
(40 . 1.018248) ; has been
(10 4.46207 4.62318 0.0)) ; modified
Значения ключевых кодов для ассоциативных списков необходимо документировать. Так, для
парковой дорожки коды 10, 11, 40, 41 и 50 используются следующим образом:
Следует обратить внимание на то, что при построении списка программа умножает половину
ширины, указанную пользователем, на 2, преобразуя ее таким образом в полную ширину.
Теперь можно продвинуться дальше. Вызвав функцию снова, сохраним полученный результат в
переменной gp_PathData. Для этого в ответ на подсказку в окне консоли введите следующее:
(setq gp_PathData (gp:getPointInput))
Для просмотра содержимого только что описанной переменной введите в окне консоли:
_$ gp_PathData
стр. 16 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Введите имя переменной для контроля ее значения. В данном случае введем переменную
gp_PathData, только что описанную в окне консоли. Открывается диалоговое окно
«Контрольное значение»:
VLISP выводит значение переменной в окне «Контрольное значение» на отдельной строке (см.
основное окно на рисунке). Таким образом, длинные списки в окне целиком не умещаются.
Окно контрольных значений можно растянуть, но можно поступить и иначе.
В диалоговом окне «Изучение» показаны тип данных изучаемой переменной (в данном случае
LIST—список) и ее значение. Каждый элемент списка выводится в этом диалоговом окне на
отдельной строке.
3. Дважды щелкните мышью на строке с кодом 11. Открывается еще одно диалоговое окно
«Изучение»:
стр. 17 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Теперь необходимо обновить основную функцию C:GPath в файле gpmain.lsp. Она должна
выглядеть следующим образом:
(defun C:GPath (/ gp_PathData)
;; Ask the user for input: first for path location and
;; direction, then for path parameters. Continue only if you
;; have valid input. Store the data in gp_PathData.
(if (setq gp_PathData (gp:getPointInput))
(if (gp:getDialogInput)
(progn
;; At this point, you have valid input from the user.
;; Draw the outline, storing the resulting polyline
;; pointer in the variable called PolylineName.
(setq PolylineName (gp:drawOutline))
(princ "\nThe gp:drawOutline function returned <")
(princ PolylineName)
(princ ">")
(Alert "Congratulations - your program is complete!")
) ;_ end of progn
(princ "\nFunction cancelled.")
) ;_ end of if
(princ "\nIncomplete information to draw a boundary.")
) ;_ end of if
(princ) ; exit quietly
);_ end of defun
При копировании и вставке кода перед описанием функции C:GPath: следует добавить
следующий заголовок:
;;;**************************************************************;
;;; Function: C:GPath The Main Garden Path Function ;
;;;--------------------------------------------------------------;
;;; Description: This is the main garden path function. It is a ;
;;; C: function, meaning that it is turned into an ;
;;; AutoCAD command called GPATH. This function ;
;;; determines the overall flow of the garden path ;
;;; program. ;
;;;**************************************************************;
;;; The gp_PathData variable is an association list of the form: ;
;;; (10 . Starting Point) - List of 3 reals (a point) denoting ;
;;; starting point of the garden path. ;
;;; (11 . Ending Point) - List of 3 reals (a point) denoting ;
;;; endpoint of the garden path. ;
;;; (40 . Width) - Real number denoting boundary ;
;;; width. ;
;;; (41 . Length) - Real number denoting boundary ;
;;; length. ;
;;; (50 . Path Angle) - Real number denoting the angle of ;
;;; the path, in radians. ;
;;; (42 . Tile Size) - Real number denoting the size ;
;;; (radius) of the garden path tiles. ;
;;; (43 . Tile Offset) - Spacing of tiles, border to border. ;
;;; ( 3 . Object Creation Style) ;
;;; - Object creation style indicates how ;
;;; the tiles are to be drawn. The ;
;;; expected value is a string and one ;
;;; one of three values (string case ;
;;; is unimportant): ;
;;; "ActiveX" ;
;;; "Entmake" ;
;;; "Command" ;
;;; ( 4 . Polyline Border Style) ;
стр. 19 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
;;; - Polyline border style determines ;
;;; the polyline type to be used for ;
;;; path boundary. The expected value ;
;;; one of the following (string case is;
;;; unimportant): ;
;;; "Pline" ;
;;; "Light" ;
;;;**************************************************************;
Для того, чтобы код был понятен самому разработчику при редактировании программы и
добавлении в нее новых возможностей месяцы спустя. Человеческой памяти
свойственно быстро забывать подробности реализации алгоритмов, и даже самая
очевидная последовательность функций через некоторое время может восприниматься
как непонятный набор скобок.
Для того, чтобы код был понятен другим людям, несущим ответственность за
дальнейшее сопровождение программы. Читать код, написанный другим человеком,
утомительно и сложно — особенно если в нем практически не содержится
комментариев.
Точка останова — это символ (точка), который помещается в исходный код для обозначения
места, в котором выполнение программы временно приостанавливается. VLISP выполняет код
до тех пор, пока не встретит точку останова. Обнаружив ее, VLISP переходит в режим ожидания
указаний от программиста. Следует обратить внимание, что окончательного прекращения
работы программы в этот момент не происходит.
Панель «Отладка» разделена на три основные группы, в каждой из которых имеется по три
кнопки. При выполнении программы в режиме отладки панель выглядит следующим образом:
стр. 21 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Первые три кнопки позволяют выполнять код программы по шагам.
Следующие три кнопки служат для задания или удаления точек останова, добавления
переменных для контроля их значений и перехода к месту последнего останова в
исходном коде.
1. В окне редактора VLISP, содержащем файл gpmain.lsp, установите указатель мыши перед
открывающей скобкой функции setq в следующей строке кода внутри функции
gp:getPointInput:
(setq HalfWidth (getdist EndPt "\nHalf width of path: "))
2. Щелкните один раз мышью. Курсор устанавливается в указанную позицию, как видно на
следующей иллюстрации:
Кнопка «Точка останова Вкл/Откл» действует как переключатель между состояниями «Вкл» и
«Откл». Если в положении курсора нет точки останова, то она ставится, если уже имеется —
удаляется.
стр. 22 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
4. Нажмите кнопку «Загрузка активного окна редактирования» на панели «Инструменты»,
чтобы загрузить файл.
VLISP выполняет программу обычным образом вплоть до точки останова. В данном случае
программа запрашивает ввести первые две точки дорожки (начальную и конечную).
Для пошагового выполнения кода программы используются три крайние слева кнопки панели
«Отладка». Они служат для выполнения следующих действий:
Переход к концу текущей функции, внутри которой произошел останов (т.е. шаг с
выходом).
стр. 23 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Перед тем, как сделать выбор, следует еще раз проверить статус выделенного выражения и
положение курсора. В данном случае выделенное выражение включает в себя вложенную в setq
функцию getdist, а курсор располагается в самом начале выделенного блока.
2. Ответьте на запрос.
После того, как ширина задана, управление снова передается в VLISP. Следует обратить
внимание на положение курсора на индикаторе.
3. Снова нажмите кнопку «Шаг с обходом». VLISP переходит к началу следующего блока
кода и выделяет блок целиком.
Замечание: Если в ходе выполнения упражнения был сделан неправильный выбор или
пропущены какие-либо шаги, его можно легко начать сначала. Для этого сначала следует нажать
кнопку «Сброс» на панели «Отладка». Выполнение кода VLISP прекращается, и система VLISP
возвращается на верхний уровень. Теперь можно начать все с пункта 1.
Если окно контрольных значений не видно на экране, для его вывода достаточно нажать на
панели кнопку «Окно контрольных значений».
Если в окне контрольных значений все еще содержится переменная gp_PathData, следует нажать
кнопку «Очистить окно», расположенную в верхней части окна.
стр. 24 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
2. Нажмите кнопку «Добавить контрольное значение» в окне контрольных значений, или
щелкните правой кнопкой мыши и выберите «Добавить контрольное значение» из
контекстного меню.
Кроме того, пользователь может изменить значение переменной и проследить, как это повлияет
на выполнение программы. Пусть, например, переменная halfwidth должна принимать только
целые значения. Однако в результате неточного ввода точек ее значение может оказаться равным
1.94818. Изменяя значение переменной вручную, можно выяснить, как это скажется на
поведении программы.
Следует обратить внимание на то, что значение в окне «Контрольное значение» изменилось. Но
можно ли при этом быть уверенным, что именно это новое значение используется при создании
ассоциативного списка (вложенный список с кодом 40)? Для проверки этого добавим еще одно
выражение в окно контрольных значений.
стр. 25 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Шаг с выходом из функции gp:getPointInput и переход к C:Gpmain
Необходимо пояснить еще один момент: что происходит со значениями локальных переменных
при выходе из функции gp:getPointInput.
Наш первый сеанс отладки завершен. При этом не следует забывать, что программа все еще
находится в состоянии останова.
Необходимо запомнить, что для удаления отдельной точки останова следует поместить курсор в
ее позицию в тексте программы и нажать кнопку «Точка останова Вкл/Откл».
Итоги занятия 2
Для чего необходимо переводить угловые величины в радианы? Дело в том, что AutoCAD при
работе с углами оперирует радианами, а большинство людей привыкли измерять углы в
градусах. Благодаря этой функции пользователь может вводить значения углов в градусах, а
AutoLISP сам преобразует их в радианы.
Функция возвращает число 3.14159. Таким образом 180 градусов преобразуются в 3.14159
радиан. Не правда ли, это число что-то напоминает? Ну, конечно же — это число «пи».
Для того, чтобы использовать функцию в программе, следует просто скопировать ее из окна
консоли в файл gpmain.lsp. Функцию можно вставить в любое место файла; но, естественно, не
в код какой-либо уже имеющейся функции.
Преобразование 3М точек в 2М
5. Снова проверим работу функции, на этот раз с помощью функции getpoint. В ответ на
подсказку в окне консоли введите следующее:
(setq myPoint(getpoint))
6. Укажите точку в графическом окне AutoCAD.
Теперь добавим функцию в файл gpmain.lsp (точно так же, как это было сделано с
функцией Degrees->Radians). Новый код должен выглядеть следующим образом:
;;;--------------------------------------------------------------;
;;; Function: 3dPoint->2dPoint ;
;;;--------------------------------------------------------------;
;;; Description: This function takes one parameter representing a;
;;; 3D point (list of three integers or reals), and ;
;;; converts it into a 2D point (list of two reals).;
;;; There is no error checking on the 3D point ;
;;; parameter -- it is assumed to be a valid point. ;
;;;--------------------------------------------------------------;
;;; To do: Add some kind of parameter checking so that this ;
;;; function won't crash a program if it is passed a ;
;;; null value, or some other kind of data type than a ;
;;; 3D point. ;
;;;--------------------------------------------------------------;
(defun 3dPoint->2dPoint (3dpt)
(list (float(car 3dpt)) (float(cadr 3dpt)))
)
стр. 29 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Функции ActiveX
Функция entmake
Функция command
На этом занятии объясняется построение объектов с помощью ActiveX. На пятом занятии будут
использоваться функция entmake и команды AutoCAD.
Когда AutoLISP впервые был встроен в AutoCAD, единственным средством для создания
объектов была функция command. Она позволяет программисту вызывать из программы на
AutoLISP практически любую команду, которая может быть выполнена из командной строки
AutoCAD. Это—надежный способ, но он не настолько быстр, как функции ActiveX, и не
обеспечивает такой же гибкости, как entmake.
стр. 30 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
(strcat "This function will draw the outline of the polyline "
"\nand return a polyline entity name/pointer."
)
)
;; For now, simply return a quoted symbol. Eventually, this
;; function will return an entity name or pointer.
'SomeEname
)
В том виде, как она есть, функция не выполняет практически никаких действий. Однако,
ассоциативный список, хранящийся в переменной gp_PathData, позволяет рассчитать все
характерные точки, необходимые для построения контура дорожки. Теперь определим, каким
образом информация из этой переменной будет передаваться в функцию gp:drawOutline.
Почему так? Если одна и та же переменная используется только двумя функциями, описанными
в одном файле (как в приведенном примере), установить, где была описана и для чего
используется переменная, нетрудно. Однако, если таких функций много и они располагаются в
различных файлах (как часто случается), потребуется много усилий, чтобы выяснить, что
представляет собой переменная gp_PathData.
Лучший способ передать информацию из одной функции в другую — это передать вызываемой
функции параметры (аргументы). Разработаем функцию таким образом, чтобы она ожидала
передачи аргументов. Вспомним функцию Degrees->Radians. Ей передавался параметр
numberOfDegrees:
(defun Degrees->Radians (numberOfDegrees)
(* pi (/ numberOfDegrees 180.0)))
При вызове функции необходимо передать ей число. Число внутри функции Degrees->Radians
объявляется параметром, называемым numberOfDegrees. Например:
_$ (degrees->radians 90)
1.5708
Можно также передать функции аргумент, являющийся переменной. Например, пусть имеется
переменная aDegreeValue. Следующие функции присваивают ей значение 90 и передают его
функции Degrees->Radians:
_$ (setq aDegreeValue 90)
90
_$ (degrees->radians aDegreeValue)
1.5708
стр. 31 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Работа с ассоциативным списком
Это достаточно просто. Однако в тексте функции необходимо указать, каким образом
информация из ассоциативного списка должна обрабатываться. Выяснить структуру списка
можно с помощью средства VLISP «Изучить».
Функция cdr возвращает второй и все следующие за ним элементы списка. В данном примере
cdr находит значение угла, которое является вторым и последним элементом значения,
возвращаемого функцией assoc.
стр. 32 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
После этих объяснений при понимании следующего фрагмента кода затруднения возникать не
должны:
(setq PathAngle (cdr (assoc 50 BoundaryData))
Width (cdr (assoc 40 BoundaryData))
HalfWidth (/ Width 2.00)
StartPt (cdr (assoc 10 BoundaryData))
PathLength (cdr (assoc 41 BoundaryData))
Есть еще пара вопросов, которые требуется рассмотреть. Во-первых, необходимо установить,
каким образом строится дорожка под заданным пользователем углом. Из функции
gp:getPointInput можно легко получить исходный угол наклона дорожки. Для построений
нужно рассчитать два вектора, перпендикулярных этому углу.
Имеющиеся данные позволяют найти с помощью функции polar четыре угловые точки
дорожки.
стр. 33 из 34
AutoCAD. Visual LISP, AutoLISP и DXF. Учебное пособие по Visual LISP
Функция polar возвращает 3М точку, расположенную под заданным углом и на заданном
расстоянии от исходной точки. Например, точку p2 функция polar находит, откладывая от точки
p1 расстояние, равное PathLength, вдоль вектора, повернутого на угол PathAngle против
часовой стрелки относительно оси X.
стр. 34 из 34