- •1. Введение
- •2. Неавтоматизированное создание чертежей в AutoCad
- •3. Программирование в AutoCad
- •4. Элементы языка AutoLisp
- •5. Интегрированная среда Visual lisp
- •6. Применение функций AutoLisp
- •7. Функции вывода графических примитивов
- •8. Диалоги и диалоговые окна
- •Работа с диалогами из lisp-программ
- •Атрибуты заголовка диалога
- •Элементы диалога
- •Атрибуты элементов диалога
- •Переменные действия
- •Функции, работающие с графическими элементами
- •9. Управление работой AutoCad с помощью системных переменных
- •10. Меню и адаптации
- •11. Введение в технологию ActiveX
- •Безопасные массивы
- •Объекты и семейства
- •Варианты
- •Свойства
- •Другие функции ActiveX
- •События и реакторы
- •12. Программы, созданные на платформе AutoCad спдс GraphiCs
- •13. Специализированные программы для архитектуры и строительства
- •Ат Венцы
- •Комплекс программных продуктов, объединенных компанией аскон
- •Лоцман: спдс
- •Компас-график
4. Элементы языка AutoLisp
В языке AutoLISP прописные и строчные буквы отождествляются, аналогично, например, языку Pascal.
Основной конструкцией языка является список.
Список имеет вид ‘( … ), если он является константой, или ( … ), если выражение в скобках необходимо вычислить или выполнить.
элемент списка, который может быть:
встроенной функцией;
константой;
идентификатором;
списком (то есть вложенным списком).
Ниже перечислены допустимые типы констант и идентификаторов, а также их некоторые особенности:
целые в диапазоне 32768…32767;
вещественные (действительные); вещественные константы не должны начинаться с десятичной точки;
текстовые (строковые) – набор символов в двойных кавычках;
логические, принимающие значения T – true, истина или Nil – ложь;
точечная пара – особый двухэлементный список вида (a . b), в котором разделителем элементов списка выступает точка с пробелами; точечные пары используются для работы с примитивами рисунка;
точечный список – особый многоэлементный список вида
(a1 a2 … an . b);
файловые дескрипторы;
имена графических примитивов AutoCAD;
наборы AutoCAD (например, графических примитивов).
Существуют еще некоторые более сложные типы данных.
Имеется одно существенное отличие языка AutoLISP от многих других языков программирования: идентификаторы в ходе выполнения программы могут менять свой тип.
Основным средством для сохранения значений, вычисляемых другими выражениями, является функция setq. Рассмотрим фрагменты программ, написанных на языках AutoLISP и Pascal, выполняющих операции присваивания.
AutoLISP |
Pascal |
(setq a 1 b 2 c (+ a b)) |
a:=1; b:=2; c:=a+b; |
Оба фрагмента могут быть записаны в одну строку. На языке AutoLISP это будет выглядеть следующим образом:
(setq a 1 b 2 c (+ a b)) |
Если переменной присвоить значение “nil”, то такая переменная удаляется из памяти.
Для выполнения различных команд AutoCADа применяется функция command. Чаще всего функция command используется для вывода (получения на экране изображения) графических примитивов, например:
(setq p1 ‘(10 10) p2 ‘(50 100) p3 ‘(0 0))
(command “line” p1 p2 p3 “”) |
;задание координат точек p1, p2, p3 ;проведение линии |
В данном примере координаты точек заданы в виде списков-констант.
В команде вывода отрезков символы “” эквивалентны нажатию клавиши ESC при «ручном» черчении.
Если AutoCAD русифицирован, то возможно использование русских имен графических примитивов, например:
(command “отрезок” p1 p2 p3 “”) |
Существует универсальная запись имен графических примитивов для любых реализаций AutoCAD. Тот же пример будет записан так:
(command “_line” p1 p2 p3 “”) |
В любом случае рекомендуется использовать универсальную запись. Тогда не будет проблем с переносимостью программ с одного компьютера на другой.
Многие команды имеют опции, каким-либо образом изменяющие ее действие. Опции команд также рекомендуется вводить по-английски с предварительным подчеркиванием, например:
(command “_line” p1 p2 p3 “_c”) |
В данном примере ломаная линия, состоящая из двух отрезков, будет замкнута от последней точки к первой.
С помощью одной функции command можно обратиться к нескольким командам:
(command “_color” 2 “_line” p1 p2 “”) |
или:
(command “_color” 2 “_line” p1 p2 “”) |
Для выполнения команд AutoCAD существует еще одна функция –vl-cmdf. Основное ее отличие от функции command:
функция command выполняет последовательно записанные в нее команды и выражения;
функция vl-cmdf предварительно проверяет все записанные в нее команды и выражения на выполнимость; это исключает возможность частичного (незавершенного, ошибочного) выполнения команд.
Если пользовательская функция использует внешние файлы на диске, например, для чтения исходных данных или записи результатов, чертежей и т.д., то необходимо указывать имена файлов.
Имена файлов в AutoLISP являются символьными данными и заключаются в кавычки.
Имена файлов в AutoLISP формируются по обычным правилам операционных систем, за исключением того, что вместо символа обратной косой черты «\», разделяющего имена дисков, папок и файлов, используется символ прямой косой черты «/», например:
“c:/Program Files/ACAD2000/acad2000.cfg”.
В то же время можно использовать и обратную косую черту, но в виде двойной косой черты «\\»:
“c:\\Program Files\\ACAD2000\\acad2000.cfg”.
В разделе 3 была рассмотрена простая структура пользовательской функции без аргументов и локальных переменных. Если в функцию необходимо передавать данные для обработки и (или) воспользоваться аппаратом локальных переменных, то структура пользовательской функции будет иметь следующий вид:
(defun имяфункции ( аргументы / локпеременные) ( выражения ) ) |
Аргументы (необязательные параметры) – переменные, разделяемые пробелами, которые используются в качестве аргументов функции. Понятию «аргументы» соответствует понятие «параметры процедур» во многих других алгоритмических языках программирования.
Локальные переменные (необязательные параметры) – разделяются пробелами. К локальным переменным имеет доступ только та функция, где они объявлены.
Значения аргументов и локальных переменных не являются глобальными и не доступны другим функциям.
Признаком хорошего стиля программирования является использование локальных переменных всегда, когда они нужны только внутри какой-либо функции. Это экономит память, отводимую под данные, и повышает «понятность» текста программы.
Вызов функции с передачей в аргументы численных значений осуществляется следующим образом:
(имяфункции a1 a2 …) |
В каждом документе (чертеже) есть область памяти (пространство имен), в которой располагаются глобальные функции, переменные и т.д. со своими значениями.
Этими переменными могут пользоваться все приложения (например, пользовательские LISP-программы), загружаемые в данный чертеж, что удобно при организации взаимодействий различных приложений в одном чертеже. Однако избыточное количество глобальных переменных отнимают память в пространстве имен. Освободить участок памяти, занимаемый глобальной переменной, можно присвоением ей значения nil.
Локальные переменные не занимают места в пространстве имен и не создают проблем, связанных с наличием там свободного места.
Существует еще одна область памяти – внедокументное пространство имен (blackboard). Оно играет роль буфера, в который копируются переменные, необходимые нескольким документам (чертежам). С помощью специальных функций LISP-программа, выполняемая в одном чертеже, может передать в blackboard значения переменных, а другая LISP-программа другого чертежа может этими переменными воспользоваться.
Язык LISP является мощным средством обработки списков. Вместо функции defun можно использовать функцию defun-q. Она аналогична функции defun. Отличие заключается в том, что в имени пользовательской функции сохраняется исходный текст функции в виде списка. Имя пользовательской функции можно использовать как обычную переменную, вплоть до того, что можно создать функцию, которая изменяет свой собственный исходный текст (сама себя программирует).
В языке AutoLISP есть средства для создания новых команд AutoCAD.
Пользовательские функции, имена которых начинаются с префикса c:, а сами функции не содержат аргументов, определяют новые команды системы AutoCAD.
(defun c:mycom () ( выражения ) ) |
После загрузки текста функции mycom в память к ней можно обратиться в командной строке AutoCAD:
Command: mycom |
Этот прием можно использовать для выполнения макрокоманд, состоящих из последовательности элементарных операций.
