Глава 12. AutoLISP в среде Visual LISP.
Часть 2.
Функция lambda является непоименованной пользовательской функцией, которую можно определить в любом месте программы и которой можно тут же воспользоваться. Формат функции:
(lambda <аргументы> <выражения>) — параметр <аргументы> Оформляется в виде списка временных переменных, а параметр <выражения> — любая последовательность выражений, оперирующих выбранными аргументами; возвращается результат последнего вычисленного выражения.
Обращение к описанной функции lambda осуществляется с помощью функций apply или mapcar. Поясним на примерах.
Выражение (lambda (u v w) (abs (+ и (* 2 v) (* з w) ) ) ) является опи-санием непоименованной функции, вычисляющей абсолютную величину суммы u+2v+3w, где u, v и w — имена временных переменных, выбранных для обозначения аргументов (действие переменных не распространяется за пределы функции lambda). Для использования созданной таким образом одноразовой функции можно в программе вставить, например, текст: (apply '(lambda (u v w) (abs (+ u (* 2 v) (* 3 w)))) (list 4.7 -3.2 10.5)), результатом которого будет 29.8. Вычислитель AutoLISP подставит вместо u, v и w, соответственно, 4.7, -3.2 и 10.5 и вычислит выражение (abs (+ 4.7 (* 2 -3.2) (* 3 10.5))).
Второй пример:
(mapcar '(lambda (q) (+ 1.0 q (* q q) (* q q q))) (list 1.7 2.2 5.8 3.0)) — возвращает (10.503 18.688 235.552 40.0).
Здесь функция, вычисляющая выражение l + q + q^2 + q^3, поочередно применяется к каждому из элементов списка (list 1.7 2.2 5.8 3.0).
Пользователь может создавать свои функции и применять их параллельно со встроенными. Не рекомендуется в качестве имен своих функций брать зарезервированные имена, т. к. это приведет к некорректной работе отдельных команд системы AutoCAD. Для того чтобы получить полный перечень зарезервированных символов AutoLISP, можно воспользоваться функцией atoms-family, имеющей следующий синтаксис:
(atoms-family <форма> [<список>])
Если аргумент <список>, который содержит строковые имена символов, проверяемых на резервирование, задан, то функция возвращает имена тех символов, которые отнесены в данной версии системы AutoCAD к резервированным; если аргумент <список> не задан, то функция возвращает полный список зарезервированных символов (основу этого списка составляют имена функций); аргумент <форма> может принимать значения 0 или 1, он влияет на форму возвращаемого списка (при 0 в список помещаются символы, при 1 — строки).
Пример:
(acad_strisort (atoms-family l)) — возвратит список зарезервированных символов, который будет тут же с помощью функции acad_strlsort отсортирован по алфавиту.
Для создания функций пользователя предназначена специальная функция defun:
(defun <имя> ([<аргументы>] [/ <переменные>]) <выражения>) — описывает тело функции, ее аргументы и локальные переменные (т. е. переменные, которые не являются глобальными и имеют действие только в теле самой функции; вне тела функции эти символы не определены); возвращаемым значением функции является результат последнего вычисленного выражения ее тела.
Пример:
(defun oursum (al а2 а3 / s)
(setq s (+ a1 а2))
(- s a3)
) ; конец тела функции
Здесь определена функция с именем oursum. У функции три аргумента: a1, а2 и аЗ — вместо них AutoLISP подставит значения, с которыми эта функция будет вызвана. Переменная s используется для временного хранения результата операции суммирования. В теле функции всего два выражения: первое вычисляет сумму a1 и а2 и сохраняет ее в переменной s, а второе вычисляет разность между s и а3. Вычисленная разность является значением последнего выражения в теле функции, поэтому является и возвращаемым значением функции oursum. Как аргументы al, а2 и а3, так и переменная s являются локальными переменными, т. е. их значения не доступны вне тела функции. Для того чтобы функцией oursum можно было воспользоваться в текущем рисунке AutoCAD, ее необходимо предварительно сохранить в текстовом файле с расширением lsp (например, ourfunctions.lsp) и затем загрузить этот файл с помощью функции load:
(load "ourfunctions.lsp")
Имя загружаемого файла с расширением lsp может содержать и путь. При отсутствии такого пути AutoCAD ищет файл в путях доступа к файлам поддержки, заданных в настройке (см. рис. 11.5). После того, как файл, содержащий тело функции oursum, загружен, можно обратиться к функции в любом месте программы, задав значения ее трех аргументов, например:
(setq newvall (oursum 55.02 0.933 -2.64))
Разумеется, при обращении к функции oursum в качестве аргументов могут быть использованы любые выражения, результатами вычисления которых будут значения необходимого типа (в данном примере — это три вещественных числа).
Замечание
Файл с расширением Isp не обязан содержать только тело одной функции. В нем могут присутствовать тела других функций или исполняемые выражения.
Загрузить файл с LISP-программами можно и с помощью пункта AutoLISP (AutoLISP), Загрузить (Load) падающего меню Сервис (Tools), который вызывает диалоговое окно Загрузка/выгрузка приложений (Load/Unload Applications), приведенное на рис. 12.6.
В языке AutoLISP системы AutoCAD 2000 присутствуют еще такие функции, как defun-q, defun-q-list-set и defun-q-list-ref, позволяющие обращаться к телу функции как к списку, в который необходимо внести изменения.
Пользовательские файлы с Lisp-программами можно компилировать. Для этого используется специальная функция vlisp-compile:
(vlisp-compile '<режим> <имя1> [<имя2>])
Рис. 12.6. Диалоговое окно Загрузка/выгрузка приложений
Функция имеет следующие аргументы:
Обычное значение параметра <режим> — st. При необходимости оптимизировать исполняемый код можно воспользоваться другими вариантами.
В результате компиляции образуется файл с расширением fas, на загрузку которого требуется меньше времени, чем на загрузку файла с исходным кодом (с расширением Isp), поэтому для отлаженных программ использование fas-файлов предпочтительнее. Для загрузки компилированных файлов также применяется функция load.
Замечание
Функция компиляции работает при загруженной среде разработки приложений Visual LISP (см. разд. 12.7).
12.6. Работа с примитивами AutoCAD
При разработке прикладного программного обеспечения часто приходится работать с примитивами рисунка, из которых нужно извлекать данные, изменять их и передавать для дальнейшего использования. Самая распространенная схема получения доступа к графическим объектам следующая.
В качестве средств интерактивного выбора примитивов используются функции entsel или ssget. При необходимости сканирования рисунка для поиска в нем по определенному свойству (имени слоя, цвету и т. п.) выбор примитивов осуществляется с помощью функции ssget.
Функция entsel возвращает список, первым элементом которого является имя указанного пользователем примитива. Это имя может быть извлечено с помощью функций car или nth.
Функция ssget возвращает имя набора, состоящего из некоторого количества имен примитивов (при неудачном выборе вместо имени набора может быть возвращен nil). Длина набора оценивается с помощью функции sslength, а извлечение из него нужного элемента выполняется функцией ssname.
Далее к полученному имени примитива применяется функция entget, которая возвращает список с полным набором точечных пар, содержащих характеристики рассматриваемого примитива. Затем с помощью функций assoc и cdr из этого списка читаются нужные свойства примитива.
Проиллюстрируем приведенную схему следующим примером. Предположим, что в рисунке на слое HOLES находятся отверстия, построенные с помощью команды КРУГ (CIRCLE). Необходимо прочитать все эти круги и сформировать два списка, в первом из которых собрать радиусы кругов, а во втором — точки с координатами центров. Примерный вариант такой программы приведен в листинге 12.13.
Листинг 12.13. Пример функции rcl, работающей с примитивами рисунка
(defun rcl ( / )
; Начальные значения списков радиусов (list rad) и центров (list cen) (setq list_rad '() list_cen '())
; Создание набора из кругов на слое HOLES
(setq nab_cir (ssget "_X" (list (cons 8 "HOLES") (cons 0 "CIRCLE"))))
; Проверка, сформировался ли набор nab cir
; (если нет, то предыдущая операция вернет nil)
(if (null nab_cir)
(progn
(princ "\пНет кругов на слое HOLES. "); сообщение об отсутствии
(princ); тихий выход
); конец progn
(progn
(setq i -1 nab_len (sslength nab_cir))
; Цикл по количеству элементов набора nab_cir
(repeat nab len
(setq i (1+ i))
; Выбор следующего примитива и получение его списка
(setq cirlist (entget (ssname nab_cir i)))
(setq radcir (cdr (assoc 40 cirlist))) .
(setq cencir (cdr (assoc 10 cirlist)))
; Добавление радиуса и точки центра к спискам list rad и list cen
(setq list rad (append list rad (list radcir)))
(setq list_cen (append list_cen (list cencir)))
); конец repeat
; Печать результирующих списков
(princ "\nРадиусы: ")
(princ list_rad)
(princ "\nЦентры: ")
(princ list cen)
); конец progn
) ; конец if
) ; конец defun
Функцию rcl следует сохранить (например, в файле rcl.lsp), после чего ее можно загрузить в память:
(load "rcl.lsp")
Возможно, что при загрузке файла rcl.isp перед его именем придется добавить полный путь к месту его расположения. Если файл загрузился без ошибок, то система AutoCAD возвращает в верхнем регистре имя последней загруженной функции (RCL). Теперь остается только обратиться к ней в командной строке:
(rcl)
Возможный вид результата работы функции rcl:
Радиусы: (66.0916 29.1292)
Центры: ((179.603 194.961 0.0) (43.0525 184.539 0.0))((179.603 194.961 0.0) (43.0525 184.539 0.0))
В данном примере все использованные в функции rcl переменные были глобальными, что позволит воспользоваться их значениями другим программам. Однако нетрудно заметить, что по окончании работы функции rcl полезными являются только переменные list_rad и list_cen. Остальные переменные хранят промежуточные результаты и, скорее всего, уже больше не нужны. Для аккуратности следует либо всем ненужным переменным в конце работы программы присвоить значение nil, либо включить их имена в список локальных переменных функции rcl, например:
(defun rcl ( / nab cir i nab_len radcir cencir cirlist) ...
Среда Visual LISP введена в систему AutoCAD 2000 для упрощения процесса написания и отладки программ на языке AutoLISP. На рис. 12.1 показано диалоговое окно Visual LISP для AutoCAD (Visual LISP for AutoCAD), которое появляется на экране, если пользователь вводит в командной строке команду VLISP (такое же наименование применяется и в англоязычной версии AutoCAD). Другой формой этой команды является VLIDE. К аналогичному результату приводит использование пункта AutoLISP, Редактор Visual LISP (Visual LISP Editor) падающего меню Сервис (Tools).
Рис. 12.7. Плавающее положение панелей диалогового окна Visual LISP для AutoCAD
Диалоговое окно Visual LISP для AutoCAD (Visual LISP for AutoCAD) является самостоятельной оболочкой внутри системы AutoCAD, со своими падающими меню и панелями инструментов. Панели инструментов могут находиться не только в фиксированном положении (см. рис. 12.1), но и в плавающем (см. рис. 12.7).
Внутри рабочей зоны располагаются окна для открытых текстовых файлов (могут редактироваться файлы LISP-программ, DCL-файлы диалоговых окон, SQL-файлы операций с базами данных, файлы программ на языке С), окно Консоль Visual LISP (Visual LISP Console) (используется для связи с системой AutoCAD), окно Трассировка (Trace) (используется для отладки программ).
В состав среды Visual LISP входят девять падающих меню: Файл (File), Правка (Edit), Поиск (Search), Вид (View), Проект (Project), Отладка (Debug), Сервис (Tools), Окно (Window), Справка (Help). Во всех падающих меню есть и постоянные пункты, и пункты, которые меняют свое состояние или исчезают в зависимости от конкретного этапа разработки программы.
Рис. 12.8. Падающее меню Файл
Меню Файл (File) (рис. 12.8) предназначено для выполнения операций с файлами и включает в себя следующие пункты:
Назначение пунктов соответствует их наименованиям. Пункт Обратить (Revert) позволяет восстановить содержимое файла в активном окне, аналогично пункту Открыть заново (Reopen). Работа пункта Собрать приложение (Make Application) рассмотрена в разд. 12.8.
Меню Правка (Edit) (рис. 12.9) содержит следующие пункты:
Рис. 12.9. Падающее меню Правка >
Первые семь пунктов меню соответствуют аналогичным пунктам меню Правка (Edit) других приложений Windows 95/98. Пункт Проверка скобок (Parantheses Matching) содержит подпункты операций для контроля редактируемого текста:
Два первых подпункта позволяют находить в тексте парную закрывающую или парную открывающую скобки для скобки, находящейся у текущей позиции курсора. Два последних подпункта выполняют аналогичные операции, но при этом еще и выделяют нужные участки текста.
Меню Поиск (Search) (рис. 12.10) предназначено для операций текстового редактора Visual LISP (в частности, операций поиска и замены) и включает в себя следующие пункты:
Рис. 12.10. Падающее меню Поиск
Поясним назначение некоторых из этих пунктов (смысл остальных пунктов ясен из наименований). Пункт Дописать словом из окна (Complete Word by Match) дает возможность редактору Visual LISP дописать (закончить) начатое вами слово аналогично предыдущему слову с таким же началом в текущем окне редактируемой программы. Пункт Дописать словом из списка (Complete Word by Apropos) позволяет получать варианты дописывания слова из списка символов AutoLISP, куда входят имена встроенных функций (рис. 12.11).
Рис. 12.11. Применение операции Дописать словом из списка
С помощью закладок можно помечать нужные места в тексте для быстрого перемещения между ними в дальнейшем. Операции установки, удаления закладок и переходов между закладками выполняются с помощью подпунктов Закладка Вкл/Откл (Toggle Bookmark), Следующая закладка (Next Bookmark), Предыдущая закладка (Previous Bookmark), Убрать все закладки (Clear All Bookmarks) пункта Закладки (Bookmarks). Еще два подпункта — Выделить до следующей закладки (Select to Next Bookmark) и Выделить до предыдущей закладки (Select to Previous Bookmark) — того же пункта меню позволяют облегчить операции выделения больших участков текста.
Падающее меню Вид (View) (см. рис. 12.12) предназначено для операций просмотра различной вспомогательной информации во время работы L1SP-программы, а также для работы с панелями инструментов диалогового окна Visual LISP для AutoCAD (Visual LISP for AutoCAD).
Рис. 12.12. Падающее меню Вид
Меню состоит из следующих пунктов:
Пункт Изучить (Inspect) позволяет вызывать специальные окна Изучение (Inspect), в которых можно посмотреть состояние переменных, списков, наборов, примитивов, а также выражений AutoLISP. Имя изучаемого объекта или выражение должно быть предварительно выделено в тексте программы; если ничего не было выделено, то перед открытием очередного окна Изучение (Inspect) выдается запрос имени. Пример открытого окна Изучение (Inspect) приведен на рис. 12.13, где рассмотрен список с характеристиками окружности.
Рис. 12.13. Окно Изучение
Пункт Стек трассировки (Trace Stack) выводит на экран одноименное окно. В этом окне приводится перечень последних выполненных операций (рис. 12.14).
В верхней части окна расположены кнопки:
Если в окне Стек трассировки (Trace Stack) выделить какую-нибудь строку, то с помощью правой.кнопки мыши можно вызвать контекстное меню с дополнительными операциями над элементами стека трассировки (объем контекстного меню может меняться): Изучить (Inspect), Печать (Print), Символ функции (Function Symbol), Копировать (Copy), Локальные переменные (Local Variables), Положение в тексте (Source Position), Позиция вызова функции (Call Point Source).
Пункт Поиск ошибок (Error Trace) падающего меню Вид (View) вызывает одноименное окно (рис. 12.15) с информацией об ошибках, возникших при выполнении программы.
Рис. 12.14. Окно Стек трассировки
Рис. 12.15. Окно Поиск ошибок
Если выделить в этом окне строку, то нажатием правой кнопки мыши можно вызвать контекстное меню для получения дополнительных сведений об элементе окна Поиск ошибок (Error Trace). Контекстное меню имеет те же пункты, что и контекстное меню окна Стек трассировки (Trace Stack). На рис. 12.16 показан пример дополнительного окна, вызванного с помощью пункта Показать сообщение (Show Message), которое появляется в контекстном меню для строки SYNTAX-ERROR.
Рис. 12.16. Окно Инфо с дополнительной информацией об ошибке
Пункт Инспектор символов (Symbol Service) падающего меню Вид (View) открывает одноименное окно (рис. 12.17), которое выполняет функции, похожие на функции окна Изучение (Inspect), но только для символов AutoLISP.
Рис. 12.17. Окно Инспектор символов
Окно имеет три поля: Имя (Name), Значение (Value) и Флаги (Flags). Назначение первых двух полей очевидно (имя символа и значение символа), а поле Флаги (Flags) содержит четыре флажка, которые могут быть установлены или сброшены для выбранного символа:
Окно Инспектор символов (Symbol Service) в верхней части имеет четыре кнопки (слева направо):
Пункт Окно контрольных значений (Watch Window) падающего меню Вид (View) выводит на экран окно Контрольное значение (Watch) (рис. 12.18).
Окно отображает значения выбранных символов в ходе выполнения программы. Добавление символов к этому окну производится либо с помощью окна Инспектор символов (Symbol Service) (кнопкой Контрольное значение (Watch)), либо с помощью первой (левой) из четырех кнопок (Добавить контрольное значение (Add Watch)), расположенных в верхней части окна Контрольное значение (Watch). Перечислим эти кнопки:
Пункт Параметры справочного списка (Apropos Window) падающего меню Вид (View) выводит на экран окно Параметры справочного списка (Apropos) (рис. 12.19).
Рис. 12.18. Окно Контрольное значение
Рис. 12.19. Окно Параметры справочного списка
Замечание
Поскольку при работе в среде Visual LISP система AutoCAD жестко "держит" размер окна, а наименования окон в русской версии могут состоять из большего количества символов, чем в английской, то система AutoCAD в этом случае может сокращать наименования окон, заканчивая их многоточием. Например, на рис. 12.19 окно Параметры справочного списка в действительности будет называться как "Параметры справочного сп..."
Данное окно позволяет просматривать список зарезервированных символов (в первую очередь, имен встроенных функций). Введенная в верхнем поле последовательность букв (на рис. 12.19 введена одна буква "f") является основным критерием формирования списка выводимых имен (эти буквы должны обязательно присутствовать в именах всех символов списка). Пользователь может с помощью флажков указать, должна ли эта последовательность обязательно присутствовать в начале имени или может встретиться в другой части символа, а также возможно ли использование специальных знаков типа "*" или "#", как в функции wcmatch (см. разд. 12.4.5). На рис. 12.20 приведено результирующее окно Справочный список найденных символов (Apropos results) с символами, имеющими префикс "f".
Пункт Окно точек останова (Breakpoints Window) падающего меню Вид (View) открывает окно Точки останова (Breakpoints) (рис. 12.21), используемое в отладке программ.
Рис. 12.20. Окно Справочный список
Рис. 12.21. Окно Точки останова найденных символов
Пункт Окно вывода (Output Window) позволяет открыть окно <Сообщения сборки> (< Builder Ouput>) для вывода сообщений, генерируемых в процессе разработки приложений (рис. 12.22).
Рис. 12.22. Окно <Сообщения сборки>
Пункт Консоль LISP (LISP Console) падающего меню Вид (View) вызывает очень важное окно, называемое Консоль Visual LISP (Visual LISP Console) (рис. 12.23), которое в среде Visual LISP является аналогом зоны командных строк системы AutoCAD. В нем можно вводить выражения AutoLISP, загружать и выполнять функции, а также читать значения переменных. Сюда же Visual LISP выводит свои сообщения.
Рис. 12.23. Окно Консоль Visual LISP
Пункт Обзор базы данных рисунка (Browse Drawing Database) падающего меню Вид (View) имеет подпункты Все объекты (Browse All Entities), Таблицы (Browse Tables), Блоки (Browse Blocks), Набор (Browse Selection) и Расширенные данные (Inquire Extended Data...), при выборе которых вызываются соответствующие окна для просмотра базы данных графических примитивов и неграфических объектов текущего рисунка (рис. 12.24).
Рис. 12.24. Окна обзора базы данных рисунка
Пункт Панели инструментов (Toolbars) падающего меню Вид (View) вызывает диалоговое окно Панели инструментов (Toolbars) (рис. 12.25), которое управляет видимостью пяти панелей среды Visual LISP.
Рис. 12.25. Диалоговое окно Панели инструментов
Рис. 12.26. Падающее меню Проект
Флажки этого окна должны быть установлены около имен тех из пяти панелей (Стандартная (Standard), Поиск (Search), Сервис (Tools), Отладка (Debug), Вид (View)), которые необходимо вывести на экран. Изменения вносятся с помощью кнопок Скрыть все (Hide All), Показать все (Show All), Применить (Apply). Кнопка Закрыть (Close) закрывает диалоговое окно Панели инструментов (Toolbars).
Падающее меню Проект (Project) (рис. 12.26) дает возможность работать с проектами.
Проект — это объединение группы LISP-программ в приложение, работающее в среде системы AutoCAD и компилированное в один файл с расширением fas (возможен вариант, когда каждой из программ создается свой FAS-файл, хотя это менее удобно). Меню Проект (Project) имеет следующие пункты:
Эти пункты рассмотрены в разд. 12.8.2. Последние (дополнительные) строки в меню показывают имена открытых проектов. Активный проект помечен флажком.
Падающее меню Отладка (Debug) (рис. 12.27) позволяет отлаживать программы в среде Visual LISP.
Это меню имеет такие пункты:
Рис. 12.27. Падающее меню Отладка
Эти пункты и соответствующие им операции рассмотрены в разд. 12.8. J.
Падающее меню Сервис (Tools) (рис. 12.28) предназначено для вспомогательных операций.
Рис. 12.28. Падающее меню Сервис (первый вариант)
Если в среде Visual LISP активно окно Консоль Visual LISP (Visual LISP Console), то меню Сервис (Tools) имеет следующие пункты:
Пункт Режим AutoCAD (AutoCAD Mode) включает или отключает режим использования окна Консоль Visual LISP (Visual LISP Console) в качестве командной строки системы AutoCAD (появляется подсказка Команда: (Command:)). Это дает возможность вводить команды AutoCAD прямо в окне консоли. Если такой режим установлен, то в меню слева от данного пункта стоит флажок.
Пункт Оформление окна (Window Attributes) состоит из пяти подпунктов:
Подпункт Цвета синтаксических элементов (Syntax Coloring) доступен только в том случае, если в активном окне находится текст файла, имеющего расширение, отличное от Isp. Тогда вызывается окно Цветовой стиль (Color Style) (на рис. 12.29 показано окно, открытое при работе с DCL-файлом), в котором можно выбрать цветовую гамму текстового редактора, отвечающую одному из предлагаемых вариантов. Подробнее о цветовой гамме текстового редактора рассказано в разд. 12.7.3.
Подпункт Настроить текущее (Configure Current) открывает окно Оформление окна (Window Attributes) (рис. 12.30), в котором можно подкорректиро-вать действующие цветовые установки разных элементов текста. Оформляемые элементы перечислены в раскрывающемся списке.
Рис. 12.29. Окно Цветовой стиль
Рис. 12.30. Окно Оформление окна
Подпункт Оформление текущего окна по прототипу (Set Current Window to Prototype) меняет установки активного окна на установки прототипа, а подпункт Оформление всех окон по прототипу (Set All Windows to Prototype) выполняет ту же операцию над всеми окнами.
Подпункт Шрифты (Fonts) вызывает стандартное диалоговое окно Выбор шрифта (Select Font) (рис. 12.31) для выбора используемых в окнах шрифтов.
Рис. 12.31. Диалоговое окно Выбор шрифта
Пункт Параметры среды (Environment Options) падающего меню Сервис (Tools) имеет три подпункта:
Подпункт Общие параметры (General Options) вызывает диалоговое окно Общие параметры (General Options), имеющее вкладки Общие (General) (рис. 12.32) и Диагностические (Diagnostic) (рис. 12.33), позволяющие менять различные настройки среды Visual LISP.
Подпункт Параметры форматирования Visual LISP (Visual LISP Format Options) раскрывает диалоговое окно Опции форматирования (Format options) (рис. 12.34), управляющее установками форматирования для текстового редактора Visual LISP.
Третий подпункт — Параметры разметки страницы (Page Setup Options) пункта Параметры среды (Environment Options) вызывает диалоговое окно Параметры страницы (Page Setup) (рис. 12.35) для операций вывода текстов на печать из среды Visual LISP.
Рис. 12.32. Диалоговое окно Общие параметры, вкладка Общие
Рис. 12.33. Диалоговое окно Общие параметры, вкладка Диагностические
Пункт Сохранить параметры (Save Settings) падающего меню Сервис (Tools) позволяет сохранять настройки рабочего стола Visual LISP (последние открытые окна, их параметры и т. п.). Можно задать автоматическое сохранение настроек, установив соответствующие флажки в поле РАБОЧИЙ СТОЛ (DESKTOP) вкладки Общие (General) диалогового окна Общие параметры (General Options) (см. рис. 12.32).
Рис. 12.34. Диалоговое окно Опции форматирования
Рис. 12.35. Диалоговое окно Параметры страницы
Если в среде Visual LISP активно окно с текстом редактируемой программы, то меню Сервис (Tools) (рис. 12.36) имеет следующие дополнительные пункты:
Первые шесть из перечисленных пунктов позволяют загружать для выполнения, проверять или форматировать как текст программы, так и его выделенную часть. Работа этих пунктов рассмотрена в разд. 12.7.3 и 12.8.1. Пункт Инструменты интерфейса (Interface.Tools) имеет два подпункта:
Эти подпункты позволяют загружать для выполнения редактируемый DCL-файл или его выделенную часть.
Падающее меню Окно (Window) (рис. 12.37) по структуре аналогично меню с аналогичным наименованием других приложений Windows.
Рис. 12.36. Падающее меню Сервис (второй вариант)
Рис. 12.37. Падающее меню Окно
Оно позволяет управлять взаимным расположением нескольких одновременно открытых окон в среде Visual LISP. Пункт Активизировать AutoCAD (Activate AutoCAD) данного меню сворачивает диалоговое окно Visual LISP для AutoCAD (Visual LISP for AutoCAD) и делает временно доступным основное окно системы AutoCAD (например, для выполнения в рисунке каких-нибудь построений). В нижней части падающего меню Окно (Window) приводится список открытых окон и флажком помечено активное окно.
Последнее падающее меню Справка (Help) (рис. 12.38) состоит из двух пунктов и выполняет справочные функции.
Рис. 12.38. Падающее меню Справка
12.7.2. Обзор панелей инструментов
В оболочку Visual LISP входят пять панелей инструментов:
Как видно из данного перечня, наименования панелей похожи на наименования рассмотренных выше падающих меню. Назначение панелей также аналогично назначению соответствующих падающих меню.
В панель инструментов Стандартная (Standard) (рис. 12.39) входят следующие кнопки (слева направо):
Рис. 12.39. Панель инструментов Стандартная
Девять первых кнопок этой панели аналогичны одноименным кнопкам панели инструментов Стандартная (Standard) системы AutoCAD. Последняя кнопка Дописать слово (Complete word) соответствует пункту Дописать словом из списка (Complete Word by Apropos) падающего меню Поиск (Search), позволяющему закончить начатое слово элементом списка стандартных символов.
Панель инструментов Поиск (Search) (рис. 12.40) выполняет функции, аналогичные функциям падающего меню Поиск (Search).
Рис. 12.40. Панель инструментов Поиск
В нее входят семь следующих кнопок:
Назначение всех этих кнопок, кроме третьей, аналогично назначению соответствующих пунктов и подпунктов падающего меню Поиск (Search). Кнопка Поиск строки на панели инструментов (Find toolbar string) работает вместе с раскрывающимся списком, находящимся в панели инструментов Поиск (Search) и выполняет поиск символа, имя которого выбрано в этом списке или введено в список с клавиатуры.
Панель инструментов Сервис (Tools) (рис. 12.41) имеет девять следующих кнопок:
Рис. 12.41. Панель инструментов Сервис
Первые шесть пунктов панели аналогичны первым шести пунктам падающего меню Сервис (Tools), если пользователь с помощью редактора работает с текстом программы или ее фрагментом (см. рис. 12.36).
Пункты Закомментировать блок (Comment block) и Раскомментировать блок (Uncomment block) позволяют легко вставлять (с помощью точек с запятой) или снимать комментарии в выделенных строках текста программы. Пункт Справка (Help) служит для получения справочной информации.
Панель инструментов Отладка (Debug) (рис. 12.42) имеет следующие кнопки:
Рис. 12.42. Панель инструментов Отладка
Кроме того, в процессе выполнения программы в отладочном режиме, с точками остановов, в панели появляется последняя кнопка (на рис. 12.42 она показана, но в обычном режиме эта кнопка не отображается). Кнопка показывает, где находится курсор во время текущего останова (перед скобками или после).
Режимы отладки программ рассмотрены в разд. 12.8.1. В панель инструментов Вид (View) (рис. 12.43) входят следующие кнопки:
Рис. 12.43. Панель инструментов Вид
Наименования кнопок говорят о том, что они выполняют операции, закрепленные за рассмотренными выше различными пунктами падающих меню: Режим AutoCAD (AutoCAD Mode) меню Сервис (Tools), выбор окна с помощью списка окон меню Окно (Window), Консоль LISP (LISP Console) меню Вид (View), Изучить (Inspect) меню Вид (View), Стек трассировки (Trace Stack) меню Вид (View), Инспектор символов (Symbol Service) меню Вид (View), Параметры справочного списка (Apropos Window) меню Вид (View), Окно контрольных значений (Watch Window) меню Вид (View).
12.7.3. Написание программ в текстовом редакторе среды Visual LISP
В среде Visual LISP можно открывать в своем окне и редактировать текстовые файлы следующих типов: LISP-программ (с расширением Isp), DCL-фаилы диалоговых окон (с расширением del), SQL-файлы операций с базами данных (с расширением sql), файлы программ на языке C++ (с расширением с). Включенный в состав среды текстовый редактор оказывает существенную помощь в написании файлов этих типов, поскольку уже в процессе ввода текста выполняет синтаксический анализ, выделяя символы, соответствующие скобкам, операторам, операндам, комментариям и т. д. Результаты своего синтаксического анализа редактор отображает цветом букв набранного текста. Выбор настройки редактора в соответствии с типом файла можно сделать с помощью пункта Оформление окна (Window Attributes), Цвета синтаксических элементов (Syntax Coloring) падающего меню Сервис (Tools) (см. рис. 12.29). По умолчанию редактор настроен на работу с текстами LISP-программ.
Цветовая гамма, обычно используемая для синтаксического анализа программ на языке LISP, следующая:
При желании можно внести изменения в цветовую палитру с помощью пункта Оформление окна (Window Attributes), Настроить текущее (Configure Current) падающего меню Сервис (Tools) (см. рис. 12.30).
Пункт Параметры среды (Environment Options) падающего меню Сервис (Tools) тоже может помочь в установлении большого количества удобств для конкретного пользователя.
Незаменимым средством быстрого комментирования выделенного участка текста и снятия комментариев являются кнопки Закомментировать блок (Comment block) и Раскомментировать блок (Uncomment block) панели инструментов Сервис (Tools).
Синтаксическая проверка текста всего открытого файла или выделенного фрагмента может быть выполнена с помощью пунктов Проверить выделенный фрагмент (Check Selection) и Проверить текст в редакторе (Check Text in Editor) падающего меню Сервис (Tools) или аналогичных кнопок в панели Сервис (Tools). Для проверки соответствия закрывающих и открывающих скобок хорошо пользоваться пунктом Проверка скобок (Parantheses Matching) падающего меню Правка (Edit).
При перезаписи файла с расширением lsp Visual LISP создает копию предыдущего состояния файла (копии присваивается расширение _ls).
С помощью Visual LISP удобно писать не отдельные программы, а целые приложения. Приложения только из LSP-файлов (FAS-приложения) можно создавать с помощью механизма проектов, рассмотренного в разд. 12.8.2. Если в приложение необходимо включить DCL-файлы диалоговых окон или вспомогательные текстовые файлы, то можно пользоваться инструментом разработки сложных приложений (VLX-приложений, см. разд. 12.8.3}. Отладочные возможности изучаются в разд. 12.8.1.
12.8.1. Средства отладки программ
Специальное окно Консоль Visual LISP (Visual LISP Console) заменяет пользователю в среде Visual LISP зону командных строк системы AutoCAD. С консоли можно вводить выражения AutoLISP, загружать и выполнять функции, в него же выводятся сообщения Visual LISP и системы AutoCAD.
Для загрузки LISP-программы (аналогично загрузке файла с помощью функции load языка AutoLISP), находящейся в открытом окне текстового редактора, следует применить пункт Загрузка текста в редактор (Load Text in Editor) падающего меню Сервис (Tools) или кнопку Загрузка активного окна редактирования (Load active edit window) панели инструментов Сервис (Tools). На рис. 12.44 показано сообщение, генерируемое Visual LISP о загрузке файла.
Возможно пошаговое выполнение программы, когда пользователь поочередно выделяет и загружает фрагменты текста (используются пункт Загрузить выделенный фрагмент (Load Selection) падающего меню Сервис (Tools) или соответствующая кнопка панели инструментов Сервис (Tools)).
Рис. 12.44. Сообщение о загрузке файла в окне Консоль Visual LISP
В окне Консоль Visual LISP (Visual LISP Console) в качестве приглашения пользователя к вводу применяются символы "_$". Так, например, если на предыдущем шаге пользователь загрузил файл rcl.lsp с одноименной программой, то он может выполнить ее, введя в консоли "(rcl)". Visual LISP выполнит программу и, если в ней нет ошибок, выведет результат на консоль (рис. 12.45).
Рис. 12.45. Сообщения о выполнении программы в окне Консоль Visual LISP
Прямо с консоли можно читать значения глобальных переменных. Для этого нужно в ответ на приглашение ввести с консоли имя переменной. Visual LISP выведет ее текущее значение (на. рис. 12.46 показано значение переменной list_rad).
Замечание
В среде Visual LISP при чтении значения переменной не требуется ввод перед именем переменной восклицательного знака, как это необходимо в системе AutoCAD (см. разд. 12.1).
При отладке программы удобно следить за значениями выбранных переменных. Для этого используются пункты Изучить (Inspect), Инспектор символов (Symbol Service), Окно контрольных символов (Watch Window), рассмотренные при изучении падающего меню Вид (View). Вызов при помощи этих пунктов соответствующих окон (см. рис. 12.13, 12.17 и 12.18) показывает текущие значения выбранных переменных или выражений. Содержимое этих окон может быть скопировано в окно Трассировка (Trace) для последующего обобщения.
Рис. 12.46. Чтение значения глобальной переменной в окне Консоль Visual LISP
При наличии ошибок следует также пользоваться пунктами Стек трассировки (Trace Stack) и Поиск ошибок (Error Trace), выводящие соответствующие одноименные окна (см. рис. 12.14 и 12.15).
Действенным средством отладки является расстановка в программе точек ее прерывания (останова). Это выполняется с помощью пункта Точка останова Вкл/Откл (Toggle Breakpoint) падающего меню Отладка (Debug) или с помощью кнопки Точка останова Вкл/Откл (Toggle breakpoint) панели инструментов Отладка (Debug). В этом случае при выполнении программа останавливается, дойдя до точки прерывания, и ждет указания от пользователя о возможном варианте продолжения работы. Для продолжения есть пункты Шаг с заходом (Step Into), Шаг с обходом (Step Over), Шаг с выходом (Step Out), Продолжить (Continue), Сброс до верхнего уровня (Reset to Top Level), Выход из текущего уровня (Quit Current Level) падающего меню Отладка (Debug) или аналогичные им кнопки панели инструментов Отладка (Debug).
Особенно эффективно сочетание точек прерывания с открытым окном контрольных значений (см. рис. 12.18). Выполняя свою программу по частям, вы будете следить за тем, как при этом изменяются значения контрольных переменных.
Пункт Анимация (Animation) падающего меню Отладка (Debug) дает возможность следить за ходом выполнения программы по исходному тексту, т. к. Visual LISP поочередно выделяет те выражения программы, которые обрабатываются в текущий момент времени.
Несколько LISP-программ, выполняемых совместно, можно объединять в проекты. Каждый такой проект является самостоятельным приложением, который может работать в исходных текстах или в компилированных файлах с расширением fas. Кроме того, проект можно скомпилировать в единый FAS-файл, что даст преимущества по скорости загрузки и выполнения.
Операции с проектами собраны в падающее меню Проект (Project). Для создания нового проекта используется пункт Новый проект (New Project), который открывает диалоговое окно Новый проект... (New Project...) (рис. 12.47).
Рис. 12.47. Диалоговое окно Новый проект...
В этом окне нужно ввести имя файла с данными о проекте. Файл образуется автоматически, в него заносится информация о входящих в него программах и режимах компиляции. Расширение у файла проекта prj. После ввода имени проекта появляется окно Свойства проекта (Object Properties) (рис. 12.48).
Диалоговое окно имеет две вкладки: Файлы проекта (Project Files) и Параметры сборки (Build Options). В первой из них нужно в поле Искать в (Look in) выбрать папку с LSP-файлами и в появившемся списке окна обнаруженных файлов с помощью кнопки > перенести нужные имена в правую часть. Если файлы проекта находятся в разных папках, то можно поменять имя папки и выбрать из нее следующую часть включаемых файлов. Для файлов, включенных из разных папок, с помощью щелчка правой кнопкой мыши по имени файла можно вызвать контекстное меню, где при выборе пункта Имена и размеры файлов (Log filenames and size) выводится в нижнюю часть диалогового окна для каждого выделенного имени его полное имя и размер (рис. 12.49).
Рис. 12.48. Диалоговое окно Свойства проекта, вкладка Файлы проекта
Рис. 12.49. Полные имена и размеры файлов, включенных в проект
По окончании формирования полного списка компонент нового проекта можно их упорядочить с помощью кнопок Начало (Тор), Вверх (Up), Вниз (Down), Нижняя (Bottom). Чаще всего такое упорядочение не нужно, но иногда оно требуется (например, если есть специальные файлы инициализации, то их надо вынести наверх, чтобы они загружались первыми).
Рис. 12.50. Диалоговое окно Свойства проекта, вкладка Параметры сборки
Вкладка Параметры сборки (Build Options) окна Свойства проекта (Object Properties) (рис. 12.50) устанавливает режимы компиляции и связи. В частности, поле Режим слияния файлов (Merge files mode) устанавливает, будут ли FAS-файлы создаваться для каждого LSP-файла отдельно или проект будет компилироваться в единый файл (FAS-приложение). Здесь же можно задать папки для размещения FAS-файлов и временных файлов.
Окончание работы в окне завершается щелчком по кнопке Применить (Apply). Кнопка OK (OK) закрывает диалоговое окно, после чего на экране появляется окно открытого проекта. На рис. 12.51 показан пример проекта newp из трех файлов.
Рис. 12.51. Окно проекта
В верхней части этого окна имеются пять кнопок операций с проектом (слева направо):
Наименования кнопок аналогичны наименованиям пунктов падающего меню Проект (Project). В созданные ранее проекты можно вносить изменения, их можно загружать как в компилированном виде, так и виде исходных текстов.
Другой вид приложений — это VLX-приложения, в состав которых могут входить не только LSP-файлы, но и DCL-файлы диалоговых окон (описание процесса их создания в настоящую книгу не входит), FAS-файлы, DVB-файлы Visual Basic for Applications и текстовые файлы (ТХТ-файлы). Все включаемые компоненты собираются в единый файл приложения с расширением vlx. Свойства приложения сохраняются в одноименном файле с расширением prv, который используется для повторной сборки приложения.
Для создания нового сложного приложения следует воспользоваться пунктом Собрать приложение (Make Application) падающего меню Файл (File). Пункт имеет следующие подпункты:
Для создания нового приложения следует выбрать подпункт Мастер новых приложений (New Application Wizard), который открывает диалоговое окно Режим Мастера (Wizard Mode) (рис. 12.52).
В этом окне необходимо задать режим, определяющий тип приложения: Простой (Simple) или Сложный (Expert). Простое приложение может состоять только из файлов с LISP-программами (аналогично FAS-приложенню), а сложное — может включать DCL-файлы, DVB-файлы и др.
Разберем вариант создания сложного приложения. В случае выбора опции Сложный (Expert) и щелчка по кнопке Далее > (Next >) открывается диалоговое окно Папка приложения (Application Directory) (рис. 12.53).
Рис. 12.52. Диалоговое окно Режим Мастера
Рис. 12.53. Диалоговое окно Папка приложения
Здесь нужно заполнить Имя приложения (Application Name) (поле Целевой файл (Target File) при этом сформирует имя нового приложения с расширением vix), а в поле Расположение приложения (Application Location) ввести полное имя папки, в которую будут записаны файл приложения с расширением vix и файл свойств приложения с расширением prv (основная часть имени этого файла будет взята из имени приложения). Папку можно выбрать также с помощью кнопки Обзор (Browse). После задания параметров и нажатия на кнопку Далее > (Next >) переходим в окно Параметры приложения (Application Options) (рис. 12.54).
По умолчанию в данном окне флажок Отдельное именное пространство (Separate Namespace) не установлен. Это означает, что функции и глобальные переменные вашего приложения будут доступны во всех одновременно открытых рисунках, т. е. поддерживается многодокументный режим.
Рис. 12.54. Диалоговое окно Параметры приложения
Замечание
Многодокументный режим задается с помощью значения системной переменной SDI, равного 0 (при 1 можно одновременно открывать в AutoCAD только один рисунок). Если установить флажок Отдельное именное пространство (Separate Namespace), то изменения глобальных переменных, сделанные вашим приложением, не будут распространяться на другие открытые рисунки, т. е. ваше приложение будет иметь собственное пространство имен символов.
При наличии флажка в поле Отдельное именное пространство (Separate Namespace) пользователю доступно поле Поддержка ActiveX (ActiveX Support) (по умолчанию поддержка включена, но от нее при необходимости можно отказаться).
Рис. 12.55. Диалоговое окно LISP-файлы для сборки приложения
Следующее окно (рис. 12.55) — LISP-файлы для сборки приложения (LISP Files to Include) — дает возможность перечислить все файлы с расширениями lsp (исходные тексты), fas (компилированные файлы) и prv (файлы проектов), которые нужно интегрировать в создаваемое приложение.
Кнопки Добавить (Add) и Удалить (Remove) позволяют, соответственно, добавлять или удалять компоненты. Кнопками Начало (Тор), Вверх (Up), Вниз (Down) и Нижняя (Bottom) можно регулировать порядок включения элементов LISP-программ в приложение. Раскрывающийся список имеет три строки (Исходные LISP-файлы (LISP source files), Скомпилированные LISP-файлы (Compiled LISP files) и Файлы проектов Visual LISP (Visual LISP project files)), помогающие добавлять в приложение компоненты нужного типа.
Следующее окно (рис. 12.56) Файлы ресурсов (Resource Files to Include) не появится, если вы выбрали режим простого приложения (см. рис. 12.52).
Рис. 12.56. Диалоговое окно файлы ресурсов
В качестве дополнительных ресурсов к вашему приложению могут быть добавлены элементы, перечисленные в раскрывающемся списке (три первых типа могли быть выбраны в предыдущем окне):
DCL-фаилы — это файлы диалоговых окон, структура которых в настоящей книге не изучается, но примеры которых можно найти в папке Support программного обеспечения системы AutoCAD 2000. DVB-файлы — это файлы приложений, написанные на языке Visual Basic for Applications (написание таких приложений тоже является темой для отдельной книги). Текстовые файлы — это любые текстовые файлы с расширением txt, в которых вы храните какую-то дополнительную информацию и которую приложению в какой-то момент нужно будет прочитать.
После задания всех дополнительных ресурсов переходим в очередное окно — Параметры компиляции приложения (Application Compilation Options) (рис. 12.57).
Рис. 12.57. Диалоговое окно Параметры компиляции приложения
В этом окне нужно выбрать режим компиляции Стандартная (Standard) или Оптимизация и Связывание (Optimize and Link). Оптимизация уменьшает размер объектного кода и время загрузки приложения, но при неправильном использовании зарезервированных символов может привести к неправильной работе приложения и системы AutoCAD.
Последнее окно, в которое можно попасть с помощью мастера создания нового приложения, — это диалоговое окно Просмотр параметров / Сборка приложения (Review Selections / Build Application) (рис. 12.58).
Если в данном окне сохранить флажок Собрать приложение (Build Application) и щелкнуть по кнопке Завершить (Finish), то Visual LISP создаст файлы приложения (с расширением vlx) и свойств приложения (с расширением prv). Если флажок сбросить и нажать на кнопку Завершить (Finish), то тогда будет создан только PRV-файл, по которому можно в дальнейшем собрать приложение. Для этого нужно воспользоваться подпунктом Собрать приложение (Make Application) одноименного пункта падающего меню Файл (File). Подпункт Свойства имеющихся приложений (Existing Application Properties) позволяет просмотреть и изменить свойства или состав приложения, а подпункт Перекомпилировать приложение (Rebuild Application) — перекомпилировать приложение, если изменились какие-то его компоненты (DCL-файлы, LSP-файлы и т. д.).
Рис. 12.58. Диалоговое окно Просмотр параметров / Сборка приложения
Загрузить в среде Visual LISP собранное приложение можно с консоли с помощью функции AutoLISP load или пункта Загрузить файл (Load File) падающего меню Файл (File).
Если приложение нужно загрузить в сеансе AutoCAD без среды Visual LISP, то используются либо функция load, либо пункт AutoLISP, Загрузить (Load) падающего меню Сервис (Tools), либо пункт Приложения (Load Application) того же меню.
Если вы хотите, чтобы ваше приложение автоматически загружалось при загрузке системы AutoCAD или открытии рисунка, вам необходимо добавить соответствующую строку на языке AutoLISP в файлы acad.lsp или acaddoc.lsp, например:
(load "rcl.vlx")
Ваше приложение с именем rcl.vix будет загружаться при загрузке того файла (acad.lsp или acaddoc.lsp), в который вы добавили эту строку. Файл acaddoc.lsp автоматически загружается при открытии каждого нового рисунка (для AutoCAD рисунки являются документами), а файл acad.lsp — только при начальной загрузке AutoCAD. Чтобы у системы AutoCAD был доступ к вашим файлам acad.isp и acaddoc.lsp, пути к ним должны быть внесены в пути доступа к файлам поддержки (см. рис. 11.5), либо файлы должны размещаться в рабочей папке AutoCAD, которая указана в настройке ярлыка AutoCAD на рабочем столе операционной системы Windows.
Если вам нужно, чтобы приложение не только автоматически загружалось, но и автоматически выполнялось, добавьте в файл acad.isp или acaddoc.isp еще строку обращения к головной функции вашего приложения, например:
(rcl)