Лабораторная работа №7.
Тема: Дополнительные функции AutoLISP. Примеры создания и использования новых функций для решения прикладных задач.
Цель: Изучить назначение и формат используемых функций, дополнительных функций для вы-полнения прикладных задач САПР; ознакомиться с примерами определения функций.
Ход работы.
1. Запустить AutoCAD одним из возможных способов. Загрузить Visual LISP.
2. Ознакомиться с другими встроенными функциями языка AutoLISP.
Рассмотрим дополнительные функции, используемые в AutoLISP, которые применяются в системе для решения специфичных задач. Среди них можно выделить следующие:
(AUTOCAD_COLORDLG <целое число> [NIL]) — определение цвета. Целое число в диапазоне 0-256 определяет цвет;
Например:
(AUTOCAD_COLORDLG 3) ; определяет зеленый цвет
(AUTOCAD_HELPDLG HELPFILE TOPIC) — вызывает устаревшие средства справки (если они есть);
(AUTOCAD_STRLSORT <список>) — сортирует список строк в алфавитном порядке;
Например:
(SETQ MOS ‘( «JAN» «FEB» «MAR» «APR» «MAY» «JUN» «JUL»
«AUG» «SEP» «ОСТ» «NOV» «DEC»))
(AUTOCAD_STRLSORT MOS)
(«APR» «AUG» «DEC» «FEB» «JAN» «JUL» «JUN» «MAR» «MAY» «NOV» «ОСТ» «SEP»)
(ADS) — возвращает список имен в настоящее время загруженных приложений и их пути;
Например:
(ADS) ; вызов функции
(«FILES/PROGS/PROG1» «PROG2») ;результат выполнения
(ALLOC <целое число>) — устанавливает размер сегмента к данному числу узлов. Функция возвращает предыдущий размер сегмента;
Например:
(ALLOC 5) ; новый размер сегмента
256 ; предыдущее значение
(ARX) — возвращает список в настоящее время загруженных приложений ARX с их путями;
Например:
(ARX)
(«FILES/PROGS/PROG1» «PROG2»)
Примечание! ObjectARX — представляет собой специализированную среду для создания прило-жений на базе С++, позволяющая пользовательским приложениям интегрироваться в AutoCAD, поддерживает LISP и приложения на LISP. (ARX — AutoCAD Runtime eXtention).
(ARXLOAD <приложение> [параметр]) — загружает приложение ObjectARX;
Например:
(ARXLOAD «/MYAPPS/APPX»)
«/MYAPPS/APPX»
(ARXUNLOAD <приложение> [параметр]) — разгружает приложение ARX,
Например:
(ARXUNLOAD «APPX»)
«APPX»
(ATOMS-FAMILY <0 или 1> [список строк]) — возвращает список в настоящее время опреде-ленных символов: если 0, то совокупность атомов возвращает имя символа как список. Если 1, возвращается имя символа как список строк;
Например:
(ATOMS-FAMILY1 ‘(«CAR» «CDR» «XYZ»))
(«CAR» «CDR» NIL )
(AUTOARXLOAD <имя> <список строк>) — предопределяет название команды, чтобы загру-зить связанный файл ARX;
Например:
(AUTOARXLOAD «BONUSAPP» ‘ (» APPl » » APP2 » » APP3 «))
(AUTOLOAD <имя LSP файла > <список строк>) — загружает LSP файл;
Например:
(AUTOLOAD «BONUSAPP» ‘(» APPl » » APP2 » » APP3 «))
(AUTOXLOAD <имя приложение ADS > <список строк>) — предопределяет название команды, чтобы загрузить связанное приложение ADS;
Например:
(AUTOXLOAD «BONUSAPP» ‘(» APPl » » APP2 » » APP3 «))
(COMMAND [команды AutoCAD и их параметры]…) — выполняет заданные команды AutoCAD;
Строка пустого указателя (» «) эквивалентна нажатию клавиши Enter на клавиатуре. Вызов функции (COMMAND…) без параметров эквивалентен нажатию клавиши Esc и отменяет большинство команд AutoCAD.
Функция (COMMAND…) оценивает каждый аргумент и посылает его в AutoCAD в ответ на по-следовательные подсказки.
Например:
(SETQ PTl ‘(2 3) PT2 ‘(7 8))
(COMMAND «LINE» PTl PT2 «»)
В результате будет изображена линия от точки с координатами (2,3) до точки (7,8).
Если приложение использует иностранный язык в AutoCAD, названия команд должны начи-наться с подчеркивания, с тем чтобы они могли транслироваться. Когда используется префикс точки (чтобы избежать использования переопределенных команд), подчеркивание можно раз-мещать в любом порядке: и «._LINE», и «_.LINE» допустимы.
Команды, выполненные из функции (COMMAND…), не отображаются на экране в командной строке, если переменная системы CMDECHO установлена в 0.
Функции ввода пользователя (GETXXX…), (GETANGLE…), (GET-STRING…), (GETINT…), (GETPOINT…) и т. д. не должны использоваться внутри функции (COMMAND…). B против-ном случае на экране появится следующее сообщение: AutoCAD rejected function (AutoCAD отклонил функцию).
(CVUNIT <число или список чисел> <исходная система измерения> <требуемая система изме-рения>) — преобразует числа из одной системы измерения в другую.
Функция (CVUNIT…) успешно проводит преобразование, если используемые системы изме-рений есть в файле AUTOCAD.UNT и если они совместимы по размерности;
Например:
(CVUNIT3 3 «MINUTE» «SECOND») ; вызов функции
180.0 ; результат
(CVUNIT 2.0 «INCH» «CM»)
5.08
(CVUNIT ‘(1.0 3.4) «FT» «CM»)
(30.48 103.632)
(GETENV…) — обеспечивает доступ подпрограммам AutoLISP к текущим значениям перемен-ных среды операционной системы;
(GETCFG…) и (SETCFG…) — позволяют в приложениях AutoLISP просматривать и изменять значения параметров в разделе APPDATA фай-лаАиТОСАО14.СРС.
(MENUCMD…) — управляет показом графических окон меню. Эта функция отображает, изме-няет или делает запрос с одного из подменю текущего меню и принимает строковый параметр, который определяет подменю и его действие, чтобы впоследствии выполнить его.
Строковый параметр состоит из двух полей, отделяемых знаком =. Он может выглядеть, к примеру, следующим образом:
«MENU_AREA=ACTION»
(MENUCMD «S=OSNAP») ; отображает экранное подменю ** OSNAP
(TEXTSCR) — отображает текстовое окно;
(TEXTPAGE) — очищает текстовое окно перед отображением текстового окна;
(REDRAW) — перерисовка всей графической области, она может определять одиночный объект, который будет (или нет) выведен повторно. Если объект сложный, типа ломаной линии или блока, может быть произведена перерисовка всего объекта или его заголовка;
(GRTEXT…) — обеспечивает показ текста непосредственно на экране или в областях меню, с высвечиванием или без него;
(GRDRAW…) — рисует вектор в текущей области просмотра с контролем над цветом и высвечи-ванием;
(GRVECS…) — рисует множественные векторы.
3. Примеры определения пользовательских функций
3.1. Определение функции под именем COPY_L, которая строит копию списка L.
(DEFUN COPY_L (L) ; определение функции
(COND ( (NULL L) NIL) ; проверка значения аргумента L
(Т (CONS (CAR L) (COPY_L (CDR L))))) ; выполнить функцию CONS, если верно
) ; конец описания
(COPY_L ‘ (А В С D E) ) ; обращение к функции
(А В С D E) ; результат
3.2. Определение функции под именем REMOVE, которая удаляет из списка L все совпа-дающие с данным символом А (списком) элементы.
(DEFUN REMOVE (A L) ; определение функции
(COND ( (NULL L) NIL) ; проверка значения аргумента L
((EQUAL A (CAR L)) (REMOVE A (CDR L))) ; проверка равенства
(Т (CONS (CAR L) (REMOVE A (CDR L))))) ; если истинно выполнить задачу
) ; конец описания
(REMOVE ‘A ‘ (С D E A G) } ; обращение к функции
(С D E G) ; результат
3.3. Определение функции под именем EARLYAB, которая проверяет, находится ли эле-мент А ранее элемента В в списке L в соответствии с заданным упорядоченным списком LU.
(DEFUN EARLYAB (A B LU)
(COND ((NULL LU) NIL)
((EQ A (CAR LU)) Т)
((EQ В (CAR LU)) NIL)
(Т (EARLYAB А В (CDR LU))) )
)
(EARLYAB ‘C ‘F ‘ (А В С D E F) ) ; обращение к функции
Т ; результат
3.4. Определение функции под именем ADDNL, которая прибавляет к числовым элемен-там списка L число N.
(DEFUN ADDNL (N L)
(COND ((NULL L) NIL)
(T (CONS (+ N (CAR L)) (ADDNL N (CDR L))) ) )
)
(ADDNL 5 ‘ (6 7 10) ) ; обращение к функции
(11 12 15) ; результат
3.5. Определение функции под именем LINEZN, которая изображает горизонтальную ли-нию с заданным числом выбранного знака.
(DEFUN LINEZN (N ZNAK)
(COND ((= N 0) (PRINC))
(Т (PRINC ZNAK) (LINEZN (- N 1) ZNAK)))
)
(LINEZN 16 «*») ; обращение к функции
**************** ; результат
Примечание! Вместо звездочки в функции (LINEZN…) можно использовать и другие символы, например, + и т. д.
3.6. Определение функции под именем MNOJL, которая преобразует список в множество, то есть в список, в который каждый элемент входит только один раз.
(DEFUN MNOJL ( L )
(COND ( (NULL L) NIL)
( (MEMBER (CAR L) (CDR L) ) (MNOJL (CDR L) ) )
(Т (CONS (CAR L) (MNOJL (CDR L))) ) )
)
(MNOJL ‘ (А В A D ) ) ; обращение к функции
(В A D ) ; результат
3.7. Определение функции под именем DELLAST, которая удаляет последний элемент списка.
(DEFUN DELLAST ( L )
(COND ((NULL L) NIL)
((NULL (CDR L)) NIL)
(Т (CONS (CARL) (DELLAST (CDRL)))))
)
(DELLAST ‘ (А В С D E) ) ; обращение к функции
(А В С D) ; результат
3.8. Определение функции под именем ASSOCL, которая строит ассоциативный список.
(DEFUN ASSOCL (L1 L2)
(MAPCAR ‘CONS Ll L2)
)
(ASSOCL ‘ (1 2 3) ‘ (ONE TWO THREE) ) ; обращение к функции
((1 . ONE) (2 . TWO) (3 . THREE)) ; результат выполнения
3.9. Определение функции под именем READL, которая из множества вводимых элемен-тов в строке образует список элементов.
(DEFUN READL ()
(PRINC (STRCAT «(» (READ-LINE) «)»))
)
(READL) ; обращение к функции
AB С 1 2 34 ; вводимые данные с клавиатуры
(AB С 1 2 34) ; результат работы функции
3.10. Определение функции под именем READS, которая считывает строку в виде списка из файла. Запрос названия диска, каталога и имени файла должен проводиться в диалоговом режиме.
(DEFUN READS ()
(SETQ DD (GETSTRING «\n Введите имя диска — «)
CC (GETSTRING «\n Введите имя каталога — «)
ЕЕ (GETSTRING «\n Введите имя файла — «)
F1 (STRCAT DD «:\\» CC «\\» ЕЕ )
FF (EVAL (LIST «OPENF1 «»r»))
SS (READ (STRCAT «(» (READ-LINEFF) «)» )))
(CLOSE FF) )
(READS) ; обращение к функции
Допустим, файл под именем SETDGR.REZ содержится на диске С: в каталоге ORGANIZA. Первая строка файла выглядит так: 10 11. Тогда при обращении к функции под именем READS появится следующая запрашивающая информация. Справа приведены ответы:
Введите имя диска — С ; вводим имя диска С
Введите имя каталога — ORGANIZA ; вводим имя каталога
Введите имя файла — SETDGR.REZ ; вводим имя файла
(10 11) ; результат работы функции
Далее обратимся к функциям для выполнения различных вычислительных операций.
3.11. Определение функции (под именем FАСТ) для расчета факториала с использованием рекуррентной формулы:
N! = N * (N-1) * (N-2) *… 3 * 2 * 1
или
N! =N* (N-1)!
Применяя AutoLISP получаем следующее решение:
(DEFUN FACT (N)
(IF (= N 0) 1 (* N (FACT (- N 1))))
)
(FACT 4) ; обращение к функции
24 ; результат
Одной из наиболее часто встречающихся операций при работе со списками является их со-единение. Посмотрим, как эту операцию можно выполнить с помощью предлагаемой ниже про-граммы.
3.12. Определение функции под именем APPEND, которая по двум спискам строит новый список, содержащий в определенной последовательности все элементы первого и второго спи-сков.
(DEFUN APPEND (Ll L2) ; соединение двух списков в один
(IF (NULLL1) L2 (CONS (CARL1) (APPEND (CDRL1) L2)))
)
(APPEND ‘ (А В С) ‘ (D E F G H) ) ; вызов функции
(А В С D E F G H) ; результат работы функции
3.13. Определение функции под именем MNOGST, которая вычисляет степенной много-член
Y = А0 + Aj X + А2 X2 + А3 X3 +…
Для вычисления степенного многочлена используем схему Горнера:
Y = А0 + X ( А, + X ( А2 + X ( А3 +…)))
которая обеспечивает получение результата при минимальном числе операций. Получаем:
(DEFUN MNOGST (X LA) ; функция вычисления многочлена
(SETQ Y 0
N (LENGTH LA) ; определение числа членов в многочлене
I 0) ; обнуление счетчика
(REPEAT (- N 1)
(SETQ I (+ I 1)
Y (* X (+ (NTH (- N I) LA) Y) )) )
(SETQ Y (+ (NTH 0 LA) Y))
)
Запишем данную функцию в файл под именем MNOGST.LSP. Допустим, этот файл находится на диске С: в подкаталоге LISP каталога AUTOCAD. Обращение к этому файлу будет выгля-деть так:
С:\\AUTOCAD\\LISP\\MNOGST.LSP
Далее в этом же файле запишем оператор для вывода результатов расчета в этот же файл:
(SETQFW (OPEN «C:\\AUTOCAD\\LISP\\MNOGST.LSP» «а»))
Переменную FW часто называют дескриптором файла. Вызовем в том же файле функцию под именем MNOGST для вычисления заданного степенного многочлена, например, многочлена вида:
Y = 0.5 + X + 2X2 + ЗХ3 + 4X4 + 5X5
для X = 2. Для этого выполним функцию c указанием аргументов:
(MNOGST 2 ‘ (0.5 1 2 3 4 5) ) ; Обращение к функции
Запишем результат расчета в файл MNOGST.LSP.
(PRINT У FW) ; вывод результатов в файл с дескриптором FW
Примечание! Ниже представлен результат расчета, записанный в файл MNOGST.LSP:
258.5 ; результат
3.14. Определение функции под именем CHEB, которая вычисляет полином Чебы-шева. Для вычисления полиномов Чебышева первого рода известна явная и рекуррентная формулы:
В явной формуле верхний индекс суммирования означает ближайшее целое число, не превос-ходящее N/2.
Рекуррентную формулу чаще всего применяют при N >= 1, полагая Т0(Х) = 1 и T1(X) = X.
С использованием AutoLISP данную задачу можно представить так:
(DEFUN CHEB (X N) ; Функция вычисления полинома Чебышева
(COND ((EQ N 0) 1) ((EQ N 1) X)
(Т (- (* 2 X (CHEB X (- N 1)) ) (CHEB X (- N 2)) ) ) ) )
Запишем данную функцию в файл под именем CHEB.LSP. Далее в этом же файле запишем оператор для вывода результатов расчета в этот же файл.
(SETQ FW (OPEN «C:\\ALISP\\CHEB.LSP» «а»))
Вызовем функцию под именем CHEB для вычисления полинома Чебышева с заданными па-раметрами и проведем вывод результатов расчета в файл с дескриптором FW.
(PRINT (CHEB 2 5) FW) ; обращение к функции
Примечание! Ниже представлен результат расчета, записанный в файл CHEB.LSP.
362 ; результат
В отличие от языков высокого уровня, LISP, в том числе AutoLISP, предоставляет возмож-ность конструирования функций языка самой программой и последующего ее выполнения.
В качестве примера рассмотрим следующее.
3.15. Составить программу, которая сформирует функцию под именем MAXD для определения максимального из чисел, вводимых в диалоговом режиме.
(SETQ A (LIST MAX)) ; определение начального списка А
(SETQ N (GETINT «\n Введите число чисел в массиве. N = «)
I 1) (REPEAT N
(SETQ В (GETREAL (STRCAT «\n Введите » (ITOA I) «-e число: «)) I (+ I 1)
A (CONS В А) ; формирование списка А
)
)
(SETQ MAXD (REVERSE A)) ; формирование функции в виде списка
(EVAL MAXD) ; выполнение функции
После загрузки файла в командной строке появятся запросы Необходимо ввести нужную ин-формацию, например:
Введите число чисел в массиве. N = 6
Введите 1-е число 5.5
Введите 2-е число 7
Введите 3-е число 10.45
Введите 4-е число 3.1
Введите 5-е число 9
Введите 6-е число 1.17
10.45 ; результат
3.16. Определение функции под именем MODES, которая сохраняет значения системных переменных:
(DEFUN MODES (L)
(SETQ MLST NIL) (REPEAT (LENGTH L)
(SETQMLST (APPENDMLST (LIST (LIST (CARL)
(GETVAR (CAR L)))))) (SETQ L (CDR L))) )
Затем вызовем функцию MODES для сохранения определенных системных переменных, на-пример:
(MODES ‘( «BLIPMODE» «GRIDMODE» «ORTHOMODE» «OSMODE» «SURFTAB1»
«SURFTAB2» «UCSFOLLOW»))
3.17. Определение функции под именем MODER, которая восстанавливает значения сис-темных переменных:
(DEFUN MODER ()
(REPEAT (LENGTH MLST)
(SETVAR (CAAR MLST) (CADAR MLST))
(SETQ MLST (CDR MLST))) )
Практическое задание.
1. Изучить действие рассмотренных в работе функций на аналогичных примерах с другими параметрами.
2. Создать программу по заданию, установленному индивидуально преподавателем.