visual lisp и секреты адаптации autocad

577

Upload: wst

Post on 28-Jul-2015

6.052 views

Category:

Documents


98 download

TRANSCRIPT

Page 1: Visual LISP и секреты адаптации AutoCAD
Page 2: Visual LISP и секреты адаптации AutoCAD

Николай Полещук

Дюссельдорф • Киев • Москва * Санкт-Петербург

Page 3: Visual LISP и секреты адаптации AutoCAD

УДК 681.3.06

Книга опытного преподавателя и разработчика приложений знакомит с методамисоздания и адаптации автоматизированных рабочих мест на базе системы AutoCADфирмы Autodesk, включая разработку программ, меню, панелей, справок, диалого-вых окон. Подробно описаны языки AutoLISP, DIESEL, DCL и среда Visual LISP.Изложены приемы объектно-ориентированного программирования с применениемтехнологии ActiveX. Книга содержит множество примеров и уникальную справоч-ную информацию. Приведенный материал опирается на версию AutoCAD 2000 иучитывает особенности версии AutoCAD 2000L

Для разработчиков прикладных системи опытных пользователей системы AutoCAD

Группа подготовки издания:

Главный редактор Екатерина Кондукова

Зав. редакцией Наталья Таркова

Редактор Анна Кузьмина

Компьютерная верстка: Ольги Сергиенко,Натальи Смирновой

Корректоры: Зинаида Дмитриева,

Наталия Першакова

Дизайн обложки Ангелины Лужиной

Зав. производством Николай Тверских

Полещук Н. Н.Visual LISP и секреты адаптации AutoCAD. — СПб.: БХВ-Петербург,2001.-576 с: ил.

ISBN 5-94157-020-1

© Н. Н. Полещук, 2001© Оформление, издательство "БХВ-Петербург", 2001

Лицензия ИД № 02429 от 24.07.00. Подписано в печать 22.03.01.Формат 70x100 Vie. Печать офсетная. Усл. печ. л. 46,44.

Тираж 5000 экз. Заказ № 155."БХВ-Петербург", 198005, Санкт-Петербург, Измайловский пр., 29.

Гигиеническое заключение на продукцию, товар, № 77.99.1.953.П.950.3.99от 01.03.1999 г. выдано Департаментом ГСЭН Минздрава России.

Отпечатано с готовых диапозитивовв ордена Трудового Красного Знамени ФГУП «Техническая книга»

Министерства Российской Федерации по делам печати,телерадиовещания и средств массовых коммуникаций

198005, Санкт-Петербург, Измайловский пр., 29.

Page 4: Visual LISP и секреты адаптации AutoCAD

Содержание

Предисловие 17

Глава 1. Средства адаптации AutoCAD 19

1.1. Шаблоны 201.2. Файл acad.pgp 251.3. Настройка AutoCAD для подключения средств пользователя 311.4. Настройка ярлыка AutoCAD 411.5. Формирование графических библиотек пользователя 441.6. Центр управления AutoCAD 471.7. Слайды 481.8. Программные средства адаптации 51

Глава 2. Язык AutoLISP 53

2.1. Интерпретатор AutoLISP 532.1.1. Вычисляемые выражения 542.1.2. Функция setq 552.1.3. Комментарии 56

2.2. Символы 572.2.1. Типы данных 572.2.2. Предопределенные символы 592.2.3. Переменные 592.2.4. Функция load 602.2.5. Функция vl-load-all 61

2.3. Выполнение команд AutoCAD из AutoLISP 612.3.1. Функция command 612.3.2. Функция vl-cmdf. 64

2.4. Арифметические функции 642.4.1. Функция + 642.4.2. Функция — 652.4.3. Функция * 652.4.4. Функция / 662.4.5. Функция /+ 662.4.6. Функция /— 672.4.7. Функция ~ ..,. 672.4.8. Функция abs 67

Page 5: Visual LISP и секреты адаптации AutoCAD

Содержание

2.5. Логические функции 682.5.1. Функция = 682.5.2. Функция/= 682.5.3. Функция < 692.5.4. Функция <= 692.5.5. Функция > 702.5.6. Функция >= 702.5.7. Функция and. 712.5.8. Функция or 712.5.9. Функция not 722.5.10. Функция null 722.5.11. Функция // 732.5.12. Функция progn 732.5.13. Функция cond 742.5.14. Функция minusp 762.5.15. Функция zerop 762.5.16. Функция numberp 762.5.17. Функция listp 772.5.18. Функция vl-consp 772.5.19. Функция atom 782.5.20. Функция vl-symbolp 782.5.21. Функция boundp 782.5.22. Функция eq 792.5.23. Функция equal 792.5.24. Функция while 792.5.25. Функция repeat 80

2.6. Функции вычислений 812.6.1. Функция fix.. 812.6.2. Функция гет 822.6.3. Функция max 822.6.4. Функция min 832.6.5. Функция gcd 832.6.6. Функция angle 832.6.7. Функция distance 842.6.8. Функция sqrt 842.6.9. Функция sin 842.6.10. Функция cos 852.6.11. Функция atan 852.6.12. Функция ехр 852.6.13. Функция expt 862.6.14. Функция log 862.6.15. Функция logand 862.6.16. Функция logior 872.6.17. Функция Ish 872.6.18. Функция Boole 882.6.19. Функция inters 892.6.20. Функция polar 892.6.21. Функция textbox 902.6.22. Функция vports 902.6.23. Функция vl-symbol-value 922.6.24. Функция set. 93

Page 6: Visual LISP и секреты адаптации AutoCAD

Содержание

2.7. Функции преобразования данных 932.7.1. Функция type 932.7.2. Функция float 942.7.3. Функция itoa 942.7.4. Функция rtos 952.7.5. Функция atoi 962.7.6. Функция atof. 962.7.7. Функция angtof 962.7.8. Функция angtos 972.7.9. Функция distof 982.7.10. Функция trans 982.7.11. Функция cvunit 100

2.8. Функции обработки строк 1012.8.1. Функция chr. 1012.8.2. Функция ascii 1012.8.3. Функция read 102

v 2.8.4. Функция strcase 1032.8.5. Функция strcat 1032.8.6. Функция strlen 1042.8.7. Функция substr 1042.8.8. Функция wcmatch 1052.8.9. Функция vl-string->list 1062.8.10. Функция vl-list->string 1062.8.11. Функция vl-string-elt 1072.8.12. Функция vl-string-left-trim 1072.8.13. Функция vl-string-right-trim 1072.8.14. Функция vl-string-trim 1082.8.15. Функция vl-string-mismatch 1082.8.16. Функция vl-string-position 1082.8.17. Функция vl-string-search 1092.8.18. Функция vl-string-subst 1092.8.19. Функция vl-string-translate 1102.8.20. Функция vl-symbol-name 1102.8.21. Пример (функция ending) 1112.8.22. Пример (функция strcaser) '. 111

2.9. Функции обработки списков и точечных пар 1122.9.1. Функция list 1122.9.2. Функция append 1132.9.3. Функция nth ИЗ2.9.4. Функция reverse 1142.9.5. Функция car. 1142.9.6. Функция cdr. 1142.9.7. Функции caar, cadrw аналогичные им 1152.9.8. Функция cons 1162.9.9. Функция vl-list* 1162.9.10. Функция member 1172.9.11. Функция assoc 1182.9.12. Функция apply 1182.9.13. Функция mapcar 1192.9.14. Функция vl-every 1192.9.15. Функция foreach 120

Page 7: Visual LISP и секреты адаптации AutoCAD

Содержание

2.9.16. Функция eval 1202.9.17. Функция quote 1202.9.18. Функция acad_strlsort 1212.9.19. Функция last 1212.9.20. Функция subst 1212.9.21. Функция length •. 1212.9.22. Функция vl-list-length 1222.9.23. Функция vl-member-if. 1222.9.24. Функция vl-member-if-not 1232.9.25. Функция vl-position 1232.9.26. Функция vl-remove 1232.9.27. Функция vl-remove-if. 1242.9.28. Функция vl-remove-if-not 1242.9.29. Функция vl-some 1252.9.30. Функция vl-sort 1252.9.31. Функция vl-sort-i 1262.9.32. Функция vl-catch-all-apply 1262.9.33. Функция vl-catch-all-error-message 1272.9.34. Функция vl-catch-all-error-p 127

2.10. Функции ввода данных и указания объектов 1272.10.1. Функция initget 1282.10.2. Функция getfcword 1302.10.3. Функция getint 1312.10.4. Функция getreal. 1322.10.5. Функция getdist 1322.10.6. Функция getangle 1322.10.7. Функция getorient 1332.10.8. Функция getpoint 1332.10.9. Функция getcorner 1342.10.10. Функция getstring 1342.10.11. Функция getvar. 1342.10.12. Функция setvar 1352.10.13. Функция getenv 1352.10.14. Функция setenv 1362.10.15. Функция getc/g 1362.10.16. Функция setcfg 1362.10.17. Функция getcname 1362.10.18. Функция getfiled 1372.10.19. Функция acadcolordlg 138

2.11. Функции печати, вывода сообщений и доступа к файлам 1392.11.1. Функция flndfile 1392.11.2. Функция open 1402.11.3. Функция close 1402.11.4. Функция read-line 1412.11.5. Функция write-line 1412.11.6. Функция princ 1412.11.7. Функция phnl 1422.11.8. Функция print 1422.11.9. Функция read-char. 1422.11.10. Функция write-char 1432.11.11. Функция prompt 143

Page 8: Visual LISP и секреты адаптации AutoCAD

Содержание

2.11.12. Функция alert 1432.11.13. Функция terpri 1442.11.14. Функция vl-directory-ftles 1442.11.15. Функция vl-flle-copy 1452.11.16. Функция vl-file-delete 1462.11.17. Функция vl-file-directory>-p 1462.11.18. Функция vl-file-rename 1462.11.19. Функция vl-file-size 1472.11.20. Функция vl-file-systime 1472.11.21. Функция vl-filename-base 1482.11.22. Функция vl-filename-directory 1482.11.23. Функция vl-fdename-extension 1482.11.24. Функция vl-filename-mktemp , 1492.11.25. Функция vl-princ-to-string 1502.11.26. Функция vl-prini-to-string 1502.11.27. Пример работы с файлами 151

2.12. Функции доступа к примитивам AutoCAD 1522.12.1. Функция entlast 1532.12.2. Функция entnext 1532.12.3. Функция entsel 1542.12.4. Функция entdel 1552.12.5. Функция entget 1552.12.6. Функция entmake 1572.12.7. Функция entmakex 1572.12.8. Функция entmod 1582.12.9. Функция entupd 1582.12.10. Функция handent 1582.12.11. Функция nentsel 1582.12.12. Функция nentselp 1592.12.13. Наборы 1602.12.14. Функция ssget 1602.12.15. Функция ssadd 1622.12.16. Функция ssdel. 1632.12.17. Функция sslength 1632.12.18. Функция ssmemb 1632.12.19. Функция ssname 1642.12.20. Функция ssnamex 1642.12.21. Функция sssetftrst 1662.12.22. Функция ssgetfirst 1672.12.23. Пример работы с примитивами AutoCAD 167

2.13. Функции доступа к табличным данным 1702.13.1. Таблицы 1702.13.2. Функция tblsearch 1702.13.3. Функция tblnext 1712.13.4. Функция tblobjname 1712.13.5. Схема работы с таблицами 1722.13.6. Функция setview 1722.13.7. Функция snvalid 174

2.14. Функции, работающие с расширенными данными 1752.14.1. Структура расширенных данных 1752.14.2. Функция regapp 177

Page 9: Visual LISP и секреты адаптации AutoCAD

Содержание

2.14.3. Присоединение расширенных данных 1772.14.4. Функция xdsize 1782.14.5. Функция xdroom 179

2.15. Функции, работающие со словарями и Х-записями 1792.15.1. Словари 1792.15.2. Функция namedobjdict 1802.15.3. Функция dictsearch 1802.15.4. Функция dictnext 1812.15.5. Функция dictadd 1832.15.6. Функция dictremove 1842.15.7. Функция dictrename 1842.15.8. Функция layoutlist 1852.15.9. Х-записи 185

2.16. Разработка функций пользователя 1872.16.1. Функция lambda 1882.16.2. Функция defun 1882.16.3. Создание дополнительных команд системы AutoCAD с помощьюпользовательских функций 1922.16.4. Функция defun-q 1922.16.5. Функция defun-q-list-ref. 1942.16.6. Функция defim-q-list-set. 1942.16.7. Функция function 1952.16.8. Функция vlisp-compile 1952.16.9. Функция exit 1962.16.10. Функция quit 1962.16.11. Функция *error*. 1962.16.12. Функция vl-acad-defun 1972.16.13. Функция vl-acad-undefun 1982.16.14. Функция vl-exit-with-error. 1982.16.15. Функция vl-exit-with-value 1982.16.16. Функция atoms-family 1992.16.17. Функция trace 1992.16.18. Функция untrace 200

2.17. Функции работы с памятью, приложениями и реестром Windows 2002.17.1. Функция ver 2012.17.2. Функция тет 2012.17.3. Функция alloc 2012.17.4. Функция expand 2022.17.5. Ф у н к ц и я ^ 2022.17.6. Функция vl-registry-read 2022.17.7. Функция vl-registry-write 2032.17.8. Функция vl-registry-delete 2032.17.9. Функция vl-registry-descendents 2042.17.10. Функция arx 2042.17.11. Функция arxload 2052.17.12. Функция arxunload 2052.17.13. Функция autoload. 2062.17.14. Функция autoarxload 2062.17.15. Функция vl-arx-import 2072.17.16. Функция vl-doc-export. 2072.17.17. Функция vl-doc-import 207

Page 10: Visual LISP и секреты адаптации AutoCAD

Содержание

2.17.18. Функция vl-list-exported-functions 2082.17.19. Функция vl-list-loaded-vlx 2092.17.20. Функция vl-vlx-loaded-p 2092.17.21. Функция vl-unload-vlx 2102.17.22. Функция vl-get-resource 2102.17.23. Функция vl-vbaload. 2112.17.24. Функция vl-vbarun 2112.17.25. Функция vl-bb-set 2112.17.26. Функция vl-bb-ref 2122.17.27. Функция vl-doc-set 2132.17.28. Функция vl-doc-ref. 2132.17.29. Функция vl-load-all 2142.17.30. Функция vl-propagate 2142.17.31. Глобальные и локальные переменные 2152.17.32. Именные пространства 2172.17.33. Проблемы многодокументного режима 218

2.18. Другие функции 2192.18.1. Функция osnap 2192.18.2. Функция redraw 2202.18.3. Функция graphscr 2212.18.4. Функция textscr 2212.18.5. Функция textpage 2212.18.6. Функция grtext 2212.18.7. Функция grdraw ч 2242.18.8. Функция grvecs 2242.18.9. Функция grclear 2252.18.10. Функция grread 2252.18.11. Функция initdia 2282.18.12. Функция tablet 229

2.19. Файлы автоматической загрузки функций пользователя 2302.19.1. Файл acad.lsp 2302.19.2. Файл acaddoc.lsp 2312.19.3. Системная переменная ACADLSPASDOC 2322.19.4. Функция sr.startup 232

Глава 3. Среда Visual LJSP 233

3.1. Обзор меню Visual LISP 2343.1.1. Меню Файл 2343.1.2. Меню Правка 2353.1.3. Меню Поиск 2363.1.4. Меню Вид 2373.1.5. Меню Проект 2443.1.6. Меню Сервис 2463.1.7. Меню Окно 2503.1.8. Меню Справка 251

3.2. Обзор панелей инструментов Visual LISP 2513.2.1. Панель инструментов Стандартная 2513.2.2. Панель инструментов Поиск 2523.2.3. Панель инструментов Сервис 2523.2.4. Панель инструментов Отладка 2533.2.5. Панель инструментов Вид 254

Page 11: Visual LISP и секреты адаптации AutoCAD

10 Содержание

3.3. Текстовый редактор среды Visual LISP 2543.3.1. Настройка текстового редактора 2553.3.2. Средства текстового редактора 255

3.4. Разработка приложений 2563.4.1. Средства загрузки и отладки программ 2573.4.2. Проекты 2593.4.3. VLX-приложения 2623.4.4. Загрузка приложений 267

Глава 4. Меню 269

4.1. Файлы меню 2694.1.1. Загрузка базового меню 2704.1.2. Загрузка фрагментного меню 271

4.2. Разделы меню 2734.2.1. Добавление заголовка в строку падающих меню 2754.2.2. Вызов панели инструментов 277

4.3. Функции AutoLISP, работающие с меню 2794.3.1. Функция menugroup 2794.3.2. Функция menucmd 280

4.4. Структура заголовков и пунктов меню 2824.4.1. Структура заголовка : 2834.4.2. Структура пункта меню 2844.4.3. Пауза в пункте меню 286

4.5. Падающие меню 2874.5.1. Добавление меню 2874.5.2. Удаление меню 2884.5.3. Вывод меню на графический экран 2884.5.4. Отметка пункта меню 2894.5.5. Отключение пункта меню 2894.5.6. Восстановление пункта меню 2904.5.7. Замена меню 2904.5.8. Справка о состоянии пункта меню 2904.5.9. Каскадные меню 2914.5.10. Операции с падающими меню в меню других разделов 292

4.6. Экранные меню 2934.6.1. Активация зоны экранных меню 2934.6.2. Уровни меню 2954.6.3. Средства смены меню 2974.6.4. Использование комбинации ЛН 298

4.7. Графические меню 2994.7.1. Структура пункта 2994.7.2. Вызов меню 301

4.8. Кнопочные меню 3014.9. Планшетные меню 3024.10. Панели инструментов 302

4.10.1. Адаптация панели 3024.10.2. Создание новой панели 3054.10.3. Структура данных о панели 3054.10.4. Операции с пиктограммами кнопок 308

4.11. Контекстные меню 3094.11.1. Разделы с контекстными меню 3104.11.2. Схема работы контекстных меню 310

Page 12: Visual LISP и секреты адаптации AutoCAD

Содержание 1J_

4.12. Раздел HELPSTRINGS 3124.13. Раздел ACCELERATORS 3134.14. Язык DIESEL 314

4.14.1. Выражения 3144.14.2. Функции 3144.14.3. Сообщения об ошибках, 3154.14.4. Использование в меню 3154.14.5. DIESEL и AutoLISP 316

4.15. MNL-файлы 316

Глава 5. Диалоговые окна 320

5.1. Язык DCL 3205.1.1. Директивы 3205.1.2. Директива описания диалога 324

5.2. Открытие и закрытие диалоговых окон 3285.2.1. Функция ioadjiialog 3285.2.2. Функция unloadjiialog 3285.2.3. Функция new dialog 3295.2.4. Функция startdialog 3295.2.5. Функция done jiialog 3305.2.6. Функция term jiialog 3305.2.7. Пример вызова диалогового окна 330

5.3. Поля 3315.3.1. Атрибуты полей 3325.3.2. Основные поля 3365.3.3. Группировка полей 3425.3.4. Поля надписей 3445.3.5. Поля с кнопкой выхода 3455.3.6. Поля промежутков 346

5.4. Функции, работающие с полями 3475.4.1. Функция actionjile 3485.4.2. Функция modejile 3495.4.3. Функция set tile 3505.4.4. Функция getjile 3545.4.5. Функция getjjttr 3555.4.6. Функция clientjJatajile 3555.4.7. Переменные действия 355

5.5. Функции, работающие со списками 3575.5.1. Функция startJist 3575.5.2. Функция addjist 3575.5.3. Функция endjist 358

5.6. Функции, работающие с графическими полями 3585.6.1. Функция startjmage 3585.6.2. Функция endjmage 3595.6.3. Функция fdljmage 3595.6.4. Функция slidejmage 3605.6.5. Функция vector image 3605.6.6. Функция dimxjMe 3615.6.7. Функция dimyjile 361

5.7. Дополнительные приемы программирования диалоговых окон 3615.7.1. Временный выход из диалогового окна 361

Page 13: Visual LISP и секреты адаптации AutoCAD

12 Содержание

5.7.2. Вложенные диалоговые окна 3635.7.3. Пароли 365

Глава 6. Создание справочной системы 366

6.J. HELP-файлы Windows 3666.1.1. Структура HELP-файлов 3676.1.2. CNT-файлы :...3706.1.3. Функция help 3716.1.4. Вызов WIN-справки с помощью внешней команды 3736.1.5. Вызов WIN-справки с помощью функции startapp 373

6.2. HTML-справки 3746.2.1. Вызов HTML-справки с помощью CNT-файла -. 3746.2.2. Вызов HTML-справки с помощью внешней команды 3746.2.3. Вызов HTML-справки с помощью функции startapp 374

6.3. Устаревшие справочные файлы AutoCAD 3756.3.1. Функция acad_helpdlg 375

6.4. Контекстно-зависимая справка к командам пользователя 3756.4.1. Функция setfunhelp 3756.4.2. Особенности применения функции setfunhelp 376

Глава 7. Технология ActiveX 377

7.1. Расширение языка AutoLISP 377.1. Объекты 377.2. Функция vl-load-com 379.3. Свойства 379.4. Функция vlax-get-acad-object 380.5. Функция vla-get-activedocument 380.6. Функция vla-get-modelspace 381.7. Функция vla-get-paperspace 381.8. Подготовка к работе с ActiveX 381.9. Методы 382.10. VLA-объекты 382.11. Функция \iax-ename->vla-object 383.12. Функция vlax-vla-object->ename 383.13. Работа со свойствами 383.14. Варианты 384.15. Функция vlax-make-variant 384J 6 . Функция vlax-variant-type 385.17. Функция vlax-variant-vahte 386.18. Функция vlax-variant-change-type 386.19. Функция vlax-3D-point 386.20. Безопасные массивы 387.21. Функция vlax-make-safearray 387.22. Функция vlax-safearray-put-element 388

.1.23. Функция vlax-safearray-fill 3891.24. Пример создания VLA-объекта 3891.25. Функция vlax-dump-object 3891.26. Другие функции ActiveX 391

7.2. Функции команд и методов 3917.2.1. Функция vlax-add-cmd 3917.2.2. Функция vlax-remove-cmd 392

Page 14: Visual LISP и секреты адаптации AutoCAD

Содержание 13_

7.2.3. Функция vlax-invoke-method 3937.2.4. Функция vlax-product-key 393

7.3. Функции операций с объектами 3937.3.1. Функция vlax-erased-p 3937.3.2. Функция vlax-method-applicable-p 3947.3.3. Функция vlax-typeinfo-available-p 3947.3.4. Функция vlax-object-released-p 3947.3.5. Функция vlax-release-object 3947.3.6. Функция vlax-read-enabled-p 3957.3.7. Функция vlax-write-enabled-p 3957.3.8. Функция vlax-create-object 3957.3.9. Функция vlax-get-object 3957.3.10. Функция vlax-get-or-create-object 3957.3.11. Функция vlax-import-type-library 3967.3.12. Функция vlax-map-collection 3967.3.13. Функция vlax-for 397

7.4. Функции операций со словарями 3977.4.1. Функция vlax-ldata-put 3977.4.2. Функция vlax-ldata-get , 3977.4.3. Функция vlax-ldata-list 3987.4.4. Функция vlax-ldata-delete 3987.4.5. Функция vlax-ldata-test 398

7.5. Функции преобразований 3997.5.1. Функция vlax-safearray-get-dim 3997.5.2. Функция vlax-safearray-get-1-bound 3997.5.3. Функция vlax-safearray-get-u-bound 3997.5.4. Функция vlax-safearray-get-element 3997.5.5. Функция vlax-safearray-type 4007.5.6. Функция vlax-safearmy->list 4007.5.7. Функция vlax-tmatrix 400

7.6. Функции операций со свойствами 4007.6.1. Функция vlax-get-property 4017.6.2. Функция vlax-put-property 4017.6.3. Функция vlax-property-available-p 401

7.7. Функции операций с кривыми 4027.7.1. Функция vlax-curve-getArea 4027.7.2. Функция vlax-curve-getStartPoint 4027.7.3. Функция vlax-curve-getEndPoint 4027.7.4. Функция vlax-curve-getPointAtDist 4027.7.5. Функция vlax-curve-getDistAtPoint 4037.7.6. Функция vlax-curve-getStartParam 4037.7.7. Функция vlax-curve-getEndParam 4037.7.8. Функция vlax-curve-getParamAtPoint 4037.7.9. Функция vlax-curve-getPointAtParam 4047.7.10. Функция vlax-curve-getParamAtDist 4047.7.11. Функция vlax-curve-getDistAtParam 4047.7.12. Функция vlax-curve-isClosed 4047.7.13. Функция vlax-curve-isPeriodic 4047.7.14. Функция vlax-curve-isPlanar 4057.7.15. Функция vlax-curve-getClosestPointTo 4057.7.16. Функция vlax-curve-getClosestPointToProjection 405

Page 15: Visual LISP и секреты адаптации AutoCAD

14 Содержание

7.7.17. Функция vlax-curve-getFirstDeriv 4067.7.18. Функция vlax-curve-getSecondDeriv 406

7.8. Реакторы 4067.8.1. Классификация реакторов 4067.8.2. Функция vlr-types 4087.8.3. Функция vlr-reactors 4087.8.4. Функция vlr-type 4097.8.5. Действия реакторов 4097.8.6. Функция vlr-reaction-names 4097.8.7. Функция vlr-beep-reaction 4107.8.8. Функция vlr-trace-reaction 4107.8.9. Создание реакторов 4107.8.10. Функция vlr-acdb-reactor 4117.8.11. Функция vlr-docmanager-reactor 4127.8.12. Функция vlr-linker-reactor 4147.8.13. Функция vlr-object-reactor ..4147.8.14. Функция vlr-editor-reactor 4167.8.15. Функция vlr-command-reactor. 4187.8.16. Функция vlr-deepclone-reactor 4197.8.17. Функция vlr-dwg-reactor 4207.8.18. Функция vlr-dxf-reactor 4217.8.19. Функция vlr-insert-reactor 4227.8.20. Функция vlr-lisp-reactor 4237.8.21. Функция vlr-miscellaneous-reactor. .• 4247.8.22. Функция vlr-mouse-reactor 4257.8.23. Функция vlr-sysvar-reactor 4257.8.24. Функция vlr-toolbar-reactor. 4267.8.25. Функция vlr-undo-reactor. 4277.8.26. Функция vlr-wblock-reactor 4287.8.27. Функция vlr-window-reactor 4307.8.28. Функция vlr-xref-reactor 4317.8.29. Функция vlr-readion-set. 4367.8.30. Операции с реакторами 4367.8.31. Функция vlr-reactions 4367.8.32. Функция vlr-remove 4377.8.33. Функция vlr-remove-all 4377.8.34. Функция vlr-add 4377.8.35. Функция vlr-added-p 4377.8.36. Функция vlr-current-reaction-name 4377.8.37. Функция vlr-data 4387.8.38. Функция vlr-data-set 4387.8.39. Функция vlr-owner-add 4387.8.40. Функция vlr-owner-remove 4387.8.41. Функция vlr-owners 4387.8.42. Функция vh-notiflcation 4397.8.43. Функция vlr-set-notification 4397.8.44. Временные и постоянные реакторы 4397.8.45. Функция vlr-pers 4407.8.46. Функция vlr-pers-release 4407.8.47. Функция vlr-pers-p 4407.8.48. Функция vlr-pers-Iist 440

Page 16: Visual LISP и секреты адаптации AutoCAD

Содержание 15

7.8.49. Правила работы с реакторами 4407.8.50. Пример построения реактора 441

Глава 8. Особенности AutoCAD 2000i 444

Приложение 1. Основные файлы поддержки, участвующие в адаптации 449

Приложение 2. Стандартный вариант файла acad.pgp .'. 452

Приложение 3. Стандартный вариант файла acad.unt 464

Приложение 4. Файл acad.mnu 468

Приложение 5. Алфавитный перечень функций языка AutoLISP 488

Приложение 6. Функция ending 508

Приложение 7. Функция divpts 510

Приложение 8. Функция strcaser 513

Приложение 9. Функция тарко 515

Приложение 10. Функция xdapp 520

Приложение 11. Функция setlout 522

Приложение 12. Функция al_vps 527

Приложение 13. Функция vl_fs 535

Приложение 14. Функции ffp^flp 538

Приложение 15. DXF-коды объектов AutoCAD 544

Приложение 16. Перечень функций языка DIESEL 559

Предметный указатель 563

Page 17: Visual LISP и секреты адаптации AutoCAD

Мы не в силах повысить качествоВашего Интернет-соединения..

Но мы можем повысить эффективность его работы!!!

Get ReGet!Re Get - это менеджер закачек, позволяющий легко и быстро

скачивать файлы с FTP- и HTTP-серверов. Если у Васхороший канал, ReGet использует все преимуществаВашего Интернет-соединения. Если качество связиоставляет желать лучшего, ReGet позволит свестинеудобства к минимуму и гарантированно скачатьвсе файлы.

ReGet 1.7- новая версия с поддержкой MS Internet Explorer 5.5,Windows 2000 и улучшенной системой автообновлений.

ReGet - оптимизирован для работы на российскихтелефонных линиях. Ему не страшны обрывы связи,плохие каналы, загруженные серверы.

ReGet - надежный попутчик в путешествиях по Сети.

Скачай себе бесплатную версию!yinniw.reget.com

J

Page 18: Visual LISP и секреты адаптации AutoCAD

Предисловие

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

Пользователям, которые достаточно долго работают в AutoCAD и не соби-раются покупать созданных на его базе специализированных приложений(например, Mechanical Desktop, AutoCAD Architectural Desktop фирмыAutodesk или Cadmech минской фирмы "Интермех"), обычно хочется допол-нить мощные инструменты системы AutoCAD такими, которые бы макси-мально облегчили и ускорили обычную работу или, наоборот, учли бы осо-бенности нового проекта (например, нестандартные требования заказчика кструктуре и форме чертежей). Ваши наработки могут стать источником та-ких дополнений.

Однако применение дополнительных средств требует выполнения дополни-тельной настройки AutoCAD, чтобы сделать, например, доступными папки,в которых хранятся соответствующие объекты, нарабатываемые отдельнымипользователями или целыми подразделениями. Глава 1 данной книги по-священа вопросам подключения подобных средств, в том числе и таких, ко-торые не связаны с применением языков программирования.

Более серьезные варианты адаптации требуют знаний языка AutoLISP —традиционно основного языка программирования в среде AutoCAD. ЯзыкAutoLISP занимает центральное место в книге и изучается в главе 2, а в гла-ве 3 рассматривается удобная среда программирования Visual LISP, облег-чающая написание и отладку программ.

Page 19: Visual LISP и секреты адаптации AutoCAD

18 Visual LISP и секреты адаптации AutoCAD

Когда у пользователя накапливается достаточно много своих элементов, емууже хочется собрать эти элементы воедино и операции с ними вынести всвое меню, которое бы дополняло и расширяло (а иногда и полностью за-меняло) стандартное меню. Вопросы разработки меню и панелей инстру-ментов изложены в главе 4.

Программирование в Windows немыслимо без диалоговых окон, которыекрасиво оформляют операции ввода данных и установки режимов работыпрограммы. Как разрабатывать диалоговые окна и обращаться к ним изязыка AutoLISP — об этом читатель узнает из главы 5.

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

Глава 7 разбирает проблемы создания программ с применением функций,входящих в расширение языка AutoLISP и реализующих мощную современ-ную технологию ActiveX, а глава 8 — некоторые особенности системы Auto-CAD 2000i.

При изложении вопросов использовалась русскоязычная версия системыAutoCAD 2000, а сообщения и команды приведены в русском варианте, но санглийскими соответствиями в скобках. Там, где и в русскоязычной версииприменяется английская терминология, в скобках дается русский перевод.Ряд приводимых в книге замечаний дают представление об особенностяханалогичных возможностей в предыдущих версиях системы AutoCAD.

В книге приведено большое количество примеров, часть из которых напи-сана автором, а часть — его коллегами по Санкт-Петербургскому Централь-ному научно-исследовательскому институту технологии судостроения. Авторвыражает свою признательность разработчикам, предоставившим для пуб-ликации тексты своих программ: Н. Г. Карпушкиной, А. И. Рудневу,В. А. Савельевой, Л. Р. Свиридовой. Эти тексты могут свободно использо-ваться без коммерческих целей, но с обязательным указанием авторов.

Те читатели, которые хотят подробнее познакомиться с работой системыAutoCAD, могут обратиться к книгам автора, вышедшим в издательстве"БХВ-Петербург": "Самоучитель AutoCAD 2000" и "Самоучитель AutoCAD 2000и Visual LISP". Они является не только учебниками, но и содержат справоч-ную информацию, необходимую опытным пользователям (перечень русскихи английских команд, описание системных переменных и т. д.).

Page 20: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 1

Средства адаптации AutoCAD

К наработкам, которые могут стать источником дополнения AutoCAD доновой специализированной системы с чертежно-графической основой, от-носятся:

• шаблоны чертежей (например, форматы со своими штампами);

• DWG-файлы с графическими элементами схем, планов;

П файлы с пользовательскими штриховками, формами, шрифтами, типамилиний;

• файлы сценариев:

П файлы справочной системы;

• меню с названиями пунктов, адаптированными для работы специалистовконкретных направлений;

• программы, написанные на языках AutoLISP, Visual Basic, C++ и испол-няемые в среде AutoCAD;

• программы, написанные на любых языках и оформленные как внешниеприложения, которые не требуют среды AutoCAD, но исполняются па-раллельно с сеансом AutoCAD (например, готовят файлы с какими-тоданными).

Адаптации или замене могут быть подвергнуты некоторые файлы поддержкипрограммного обеспечения системы AutoCAD. Более подробный переченьфайлов поддержки, которые обычно участвуют в адаптации AutoCAD, при-веден в приложении 1.

Вопрос применения шаблонов рассматривается в разе). 1.1, подключениевнешних приложений с использованием системного файла acad.pgp —в разд. 1.2. Разделы 1.3 и 1.4 посвящены настройке AutoCAD и его окруже-ния для подключения средств, разработанных пользователем. Разделы 1.5—1.7повествуют о подключении файлов из архивов графической информации.

Page 21: Visual LISP и секреты адаптации AutoCAD

20 Visual LISP и секреты адаптации AutoCAD

В разд. 1.8 обзорно рассматриваются программные средства разработки при-ложений, функционирующих в среде AutoCAD. Создание новых штриховок,форм, шрифтов и типов линий ввиду ограниченности объема книги не рас-сматривается. Частично освещены вопросы использования файлов сценари-ев (см. разд. 1.4, 1.7).

1.1. ШаблоныПриступая к работе с системой AutoCAD, вы должны выбрать режим рабо-ты, что позволяет сделать появляющееся на экране диалоговое окно Началоработы (Startup) (рис. 1.1).

Начало работы

D DПростейший шаблон

Единицы по умопчанию

Г* британские (Футы и

(* Метрические

01

ПояснениеБуаут использованы метрические единицы

выводить это окно при каждом начале работы OK I Отмена

Рис. 1.1. Диалоговое окно Начало работы, режим Простейший шаблон

Замечание

Если данное окно не появляется, то это означает, что оно отключено в на-стройке AutoCAD. Для восстановления используйте команду НАСТРОЙКА(OPTIONS) и в диалоговом окне Настройка (Options) выберите вкладку Систе-ма (System), в которой установите флажок Выводить начальное диалоговоеокно (Show Startup Dialog).

Четыре большие кнопки в верхней левой части окна задают варианты работы:

• Открытие рисунка (Open a Drawing) — открыть существующий рисунок(файл AutoCAD с расширением dwg);

П Простейший шаблон (Start from Scratch) — создать новый (пустой) рису-нок с теми установками системных переменных, слоев, блоков, групп,

Page 22: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 21

типов линий, имен зарегистрированных приложений, листов, видов, ви-довых экранов, пользовательских систем координат (ПСК), стилей муль-тилиний, текстовых стилей, размерных стилей, стилей печати, которые(установки) используются по умолчанию;

• По шаблону (Use a Template) — создать новый рисунок по шаблону;

П Вызов мастера (Use a Wizard) — создать новый рисунок, но с использо-ванием программы-мастера, которая позволяет в диалоговом режиме на-строить линейные единицы измерения, угловые единицы измерения, на-правление и начало отсчета углов и размеры зоны лимитов.

В зависимости от того, какая кнопка режима нажата, диалоговое окно На-чало работы (Startup) появляется в одном из четырех различных видов.AutoCAD запоминает режим, выбранный пользователем при входе, и в сле-дующий раз предлагает именно его в качестве режима по умолчанию. В пер-вый раз после установки AutoCAD всегда предлагается режим Простейшийшаблон (Start from Scratch).

В случае выбора режима По шаблону (Use a Template) окно принимает вид,приведенный на рис. 1.2.

\&Начало работы

• Q шаблону

Выберите шаблон

Din a4 tiamed plot -tyle dw\Generi; 24ir* •- j-in title block color dependent plot Л1е- d<'tGeneric 24m > 32m title block named plot Jvfe* d 'tl.o aO color dependent plot Me' d\ >t1-е эО nanied plut styl^ d"-rtI io а1 с -J\O\ deper ider it plot ttylp- d^ 't150 a\ named plot <iyle-^ dwtНо э2 tolor dependetit plot * ^ l e * d> <t"0 a l named plot ; ty le; dwt'.o a j color dependent plut ctyle- dvt

J

Iso a4 color depetident plof T M e . d^'tho a4 narned plot styles dwt

Описание шаблона

Рамка и основная надпись формата IbO ^3 Именованные стили печати

В^ыводт-ь это окно при t . a ^ o n начапе работы

Обзор

ОК

Рис. 1.2. Диалоговое окно Начало работы, режим По шаблону

Список Выберите шаблон (Select a Template) предлагает вам выбрать в спискеодин из 54 поставляемых обычно с AutoCAD 2000 шаблонов, которые явля-ются файлами с расширением dwt и располагаются в папке d:\AutoCAD 2000\Template. В настоящей книге я предполагаю, что бы вы установили про-граммное обеспечение AutoCAD в папку AutoCAD 2000 диска d; если вы

Page 23: Visual LISP и секреты адаптации AutoCAD

Visual LISP и секреты адаптации AutoCAD

установили в другую, то и в ней образуется интересующая нас папкаTemplate. Итак, перечень шаблонов таков:

О Acad — named plot styles.dwt

• Acad.dwt

• Acadiso — named plot styles.dwt

П Acadiso.dwt

П Ansi a (portrait) — color dependent plot styles.dwt

О Ansi a (portrait) — named plot styles.dwt

• Ansi a — color dependent plot styles.dwt

П Ansi a — named plot styles.dwt

• Ansi b — color dependent plot styles.dwt

• Ansi b — named plot styles.dwt

P Ansi с — color dependent plot styles.dwt

• Ansi с — named plot styles.dwt

• Ansi d — color dependent plot styles.dwt

• Ansi d — named plot styles.dwt

• Ansi e — color dependent plot styles.dwt

• Ansi e — named plot styles.dwt

• Ansi layout templates.dwt

D Architectural, english units — color dependent plot styles.dwt

• Architectural, english units — named plot styles.dwt

• Din aO — color dependent plot styles.dwt

• Din aO — named plot styles.dwt

• Din al — color dependent plot styles.dwt

• Din al — named plot styles.dwt

• Din a2 — color dependent plot styles.dwt

П Din a2 — named plot styles.dwt

• Din a3 — color dependent plot styles.dwt

• Din a3 — named plot styles.dwt

П Din a4 — color dependent plot styles.dwt

• Din a4 — named plot styles.dwt

• Generic 24inx32in title block — color dependent plot styles.dwt

• Generic 24inx32in title block — named plot styles.dwt

Я Iso aO — color dependent plot styles.dwt

Page 24: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 23

П Iso аО — named plot styles.dwt

П Iso al — color dependent plot styles.dwt

• Iso al — named plot styles.dwt

• Iso a2 — color dependent plot styles.dwt

• Iso a2 — named plot styles.dwt

• Iso a3 — color dependent plot styles.dwt

• Iso a3 — named plot styles.dwt

• Iso a4 — color dependent plot styles.dwt

• Iso a4 — named plot styles.dwt

• Jis aO — color dependent plot styles.dwt

• Jis aO — named plot styles.dwt

• Jis al — color dependent plot styles.dwt

О Jis al — named plot styles.dwt

• Jis a2 — color dependent plot styles.dwt

• Jis a2 —- named plot styles.dwt

• Jis a3 — color dependent plot styles.dwt

• Jis a3 — named plot styles.dwt

• Jis a4 (landscape) — color dependent plot styles.dwt

• Jis a4 (landscape) — named plot styles.dwt

• Jis a4 (portrait) — color dependent plot styles.dwt

• Jis a4 (portrait) — named plot styles.dwt

• Metric layout templates.dwt

Названия файлов говорят об их назначении. Большинство шаблонов созда-ны в двух вариантах — для цветозависимых стилей печати (color dependentplot styles) и именованных стилей печати (named plot styles). При выделениистроки с именем файла шаблона в области Описание шаблона (TemplateDescription) (рис. 1.2) появляется комментарий, сохраняемый вместе с шаб-лоном — как, например, для шаблона acadiso.dwt в русской версии AutoCAD:"Обычный международный (метрический) шаблон. Цветозависимые стилипечати".

Присутствующая в окне кнопка Обзор (Browse) позволяет загружать шаблонне только из стандартной папки шаблонов AutoCAD, но и из любой другой(данная кнопка для этого открывает диалоговое окно Выбор файла шаблона(Select Template File)).

Пользователь может сформировать свои шаблоны и сделать их доступнымив диалоговом окне Начало работы (Startup). Для этого сначала нужно сред-

Page 25: Visual LISP и секреты адаптации AutoCAD

24 Visual LISP и секреты адаптации AutoCAD

ствами AutoCAD создать рисунок с теми объектами (отрезками, полилиния-ми, надписями и т. д.), которые вы хотите включить в новый шаблон. Затем,не выходя из рисунка, с помощью команды СОХРАНИТЬ КАК (SAVEAS)или соответствующего ей пункта Сохранить как (Save As) падающего менюФайл (File) следует вызвать диалоговое окно Сохранение рисунка (SaveDrawing As), в котором в поле Тип файла (Save as type) необходимо выбратьопцию Шаблон рисунка AutoCAD (*.dwt) (AutoCAD Drawing Template(*.dwt)), а в поле Имя файла (File name) ввести имя файла шаблона без рас-ширения — например, Формат А2хЗ. В качестве папки для размещения шаб-лона предлагается папка Template, но пользователь перед сохранением мо-жет выбрать другую папку.

После задания имени файла, папки и нажатия кнопки Сохранить (Save)AutoCAD открывает диалоговое окно Описание шаблона (Template Descrip-tion), в котором нужно заполнить поле Описание (Description), в раскры-вающемся списке Единицы (Units) выбрать единицы измерения (рис. 1.3).

Описание

Формат А2:С

Единицы

Метрические

даШШШ£111§

(534x12Ы n 4I ^ I

Отмена

: Справка

Рис. 1.3. Диалоговое окноОписание шаблона

Начало работы Мл!По шаблону

Выберите шаолон

Jis a1 -color dependent pluf Jyle dwtJis a1 -named plot „'/le- 1> >iJis a2 -color dependent plot styles.dvvtJis a2 -named plot style;: dvvtJis a3 -color dependent pfot slyles.dwtJis. a3 -named plot styles.dvvt

.з4 (landscape) -coloj dependent plot styles, dwtэ4 [land dpr| f эг r-d pj i t i le d id-llr; rtrait| LI с d ^ p n i d c r i t f l U t v l ^ d*\ra4 [jn.rlrdt| r d n e d p L ^ M M d «t

lri Ь i uffei iFlal d t

Описание шаблонаОбзор...

£blE 1ДИТЬ " TJ • t НО ПрИ Y Л-ДОМ На-1аЛе работы OK Отмена

Рис. 1.4. Появление нового имени в списке шаблонов

Page 26: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 25_

Если вы сохранили шаблон Формат А2хЗ в стандартной папке Template, то вследующий раз этот шаблон вместе со своим комментарием будет доступенпри создании нового рисунка (рис. 1.4).

1.2. Файл acad.pgpПодключение внешних приложений осуществляется через файл acad.pgp,стандартный вариант которого находится в папке Support программногообеспечения системы AutoCAD (например, d:\AtitoCAD 2000\Support). Этотфайл при вызове AutoCAD ищется сначала в рабочем каталоге (о выборерабочего каталога см. разд. 1.3 и 1.4), а затем по списку путей настройкиAutoCAD (о настройке см. разд. 1.3), и первый же обнаруженный файлс именем acad.pgp читается, а его установки загружаются в оперативную па-мять.

iv З а м е ч а н и е )

В версиях AutoCAD, функционирующих в среде MS DOS (до 13-й включитель-но), список путей поиска читается из переменной окружения ACAD, задаваемойв системных переменных среды.

В файле acad.pgp определяются имена команд, вызывающих внешние при-ложения, а также псевдоимена (aliases) стандартных команд (например, аб-бревиатуры). В приложении 2 приведены полные тексты стандартных файловacad.pgp в том виде, в каком они формируются сразу же после установки накомпьютер русскоязычной и англоязычной версий AutoCAD. Строки файла,начинающиеся точкой с запятой, являются комментариями.

Файл acad.pgp, приведенный в приложении 2, имеет следующие составныечасти:

• комментарий фирмы Autodesk по организации файла;

• описание формата внешних команд;

• имена внешних команд;

П описание формата псевдоимен стандартных команд;

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

• псевдоимена для совместимости с 13-й версией AutoCAD (в русскоязыч-ной версии AutoCAD 2000 отсутствуют);

• псевдоимена для совместимости с 14-й версией AutoCAD;

• псевдоимена устаревших команд;

• дополнительные псевдоимена.

Ваш вариант файла acad.pgp может содержать все эти части или только не-которые из них.

Page 27: Visual LISP и секреты адаптации AutoCAD

26 Visual LISP и секреты адаптации AutoCAD

Внешние команды (т. е. вызывающие внешние приложения, функционирую-щие в среде MS DOS или Windows) в файле acad.pgp имеют такой формат:

-KGM.!ri,i:a~-, [<приложение>] , <флаг>[, [*]<подсказка>, [<код>] ]

Здесь угловые скобки заменяют один параметр (параметры <приложение> и• г:: лскг;зка> могут состоять из нескольких слов, разделенных пробелами), аквадратные скобки показывают, что параметр может быть опущен. Общееколичество запятых в этом выражении должно равняться двум или четырем(в зависимости от того, используется <подсказка> или нет). Пояснения кпараметрам:

О <команда> — имя внешней команды (должно состоять только из одногослова, без пробелов), которое вводит пользователь в командной строкеAutoCAD при необходимости обращения к внешнему приложению;

О <лриложг)нке> — команда операционной системы, вызывающая внешнееприложение;

Я флаг- — битовый флаг, формируемый как сумма четырех битов, прини-мающих значения 0 или 1 и умножаемых на соответствующий вес (см.далее);

О <подсхазка> — текст запроса, выдаваемого перед выполнением и; пнегоприложения; если в текст подсказки включаются пробелы, то он • лженпредваряться символом * (если в битовом флаге установлен бит 8, тосимвол * в подсказке не требуется);

,3 <код> — код возврата (1,2 чли 3; см. далее).

Приведем пример вызова в стандартном файле acad.pgp (см. приложение 2)текстового редактора Notepat (Блокнот) как внешнего приложенияWindows:

NOTEPAD, START NOTEPAD, I, " Редактировать файл:,

При вызове этой команды (набором ее имени в командной строке)AutoCAD выдает запрос:

Редактировать файл:(File to edit:)

В ответ на этот запрос нужно ввести имя файла, который будет обрабаты-ваться редактором Блокнот (Notepad), например, e:\Temp\begin.txt. ЗатемAutoCAD передает в операционную систему команду запуска внешнего при-ложения с его параметрами (START NOTEPAD e:\temp\begin.txt), а операци-онная система открывает новое окно, в котором работает вызванный редак-тор с указанным вами файлом (рис. 1.5).

Когда операционная система не может найти исполняемый файл приложе-ния по имени, поданному в файле acad.pgp, тогда нужно указать в файле

Page 28: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 27

acad.pgp полное имя требуемого исполняемого файла (с полным путем ирасширением, например, START c:\Windows\notepad.exe).

о Щ begin. IHI - Блокнот

Правка Поиск £прзвкаПараметры операций:15, 16, - 1 . 9 9 7 , 7 9 8 . 1 1 , Зс12, MSt, 2 8 . 1 8 2 , 88,107, МЫ)

_ j j Пои ?

J

ЛистГ/ •JJ

(Команда notepadРедактировать файл е{Команда

03955,0 3949 0 0000* ШАГ СЕТКА 0Р7О. ОТС-ПОЛЯР ПРИВЯЗКА|ОТС-ПРИВ ВЕС|М0ДЕГ

РИС. 1.5. Вызов приложения Блокнот (Notepad) с помощью внешней команды

Важной внешней командой в файле acad.pgp является команда START безпараметров, которая используется для выполнения в своем окне любогоприложения Windows. При обращении к этой команде AutoCAD выдает за-прос:

Выполнить приложение:

(Application to start:)

В ответ на это нужно ввести такое имя исполняемого файла приложения,которое понятно операционной системе Windows (например, winword, есливам нужен текстовый процессор MS Word). По необходимости имя испол-няемого файла может содержать полный путь. Операционная система от-крывает отдельное окно, в котором выполняет названное приложение (ана-логично окну, открытому на рис. 1.5 для программы Блокнот (Notepad)). Поокончании работы приложения окно автоматически закрывается.

Другой вариант вызова приложения — открыть окно приложения DOS спомощью команды ДОС (SHELL). Для совместимости с предыдущими вер-

Page 29: Visual LISP и секреты адаптации AutoCAD

28 Visual LISP и секреты адаптации AutoCAD

сиями в русскоязычной версии AutoCAD 2000 оставлены аналоги — коман-ды ДОС1 и SH, а в англоязычной версии — команда SH.

Команда ДОС (SHELL) выдает запрос:

Команда ОС:(OS Command:)

В этот момент нужно ввести имя исполняемого приложения — например,c:\nc\nc для запуска программы Norton Commander (рис. 1.6).

После выхода из внешнего приложения (например, после выхода из NortonCommander с помощью функциональной клавиши <F10>) окно приложениязакрывается.

Команду ДОС (SHELL) и ее аналоги можно также использовать для вызоваприложений Windows. При вводе команды START для приложений DOSмогут возникать проблемы.

Интересен вариант, когда вы в ответ на запрос команды ДОС (SHELL) вместоввода команды операционной системы нажмете клавишу <Enter>. ТогдаWindows открывает окно AutoCAD Shell Active с подсказкой MS DOS (рис. 1.7),в котором вы можете выполнять DOS-команды (например, c:\nc\nc для за-грузки Norton Commander).

iD

D о*4s И • . to Ьч К Q,

| • Поспи - ПОСЛПЮ I - ••• Ппслзю j ] | Послпю ~3

/ .£.

СП *f*

г оj i

' - С

. иU ГD ГА •

j'SAuloCAD Shell Active - NCMAIN

Г -Его j

acadscar arx acisobi arj-acadvba arx aetflatcn ar>acasetup arx acmted ar>acbiock arx acopni ar>acbrowse arx acorbit ar>acdccJ1*-l arx acoscale &n

i T E S c d a l a c d e rSAMPLE : acdcii~i arx acsiofcg .SUP№BT acdcsy-vi arx acsiuiTEMPLATE acdcte^-l arx acsoiidsтехтийЕЗ acdcxr-i arx apploadTUIXWIAL acdun arx aseПОЛЬЗОЙ! acdorcler arx asHisp .v i i d e „ds acepiotx arx a t t e d i t iaceidapp arx achlnkMi arx condlg .acadps or?< acisffiui arx dv^aids

«. <3r a wii23v1ew exe drw^wmfk372ans1 set ev-Иеуе!8502ansi set faces'e«33«nsi set f tshI8652ans1 set f l i pI8662ansi set 1co26ib':ansi243? set mouseansi285Q set msptdibansi2S63 set ncansisses set ncansiiSee set nc•—-——i e x e nc

exe ncjbug . . tiss RC .• • •b S

-Имя ' ••' e x e n c : r ! $

e x e n c e x i t c w n i iП55 nc_exit docnss ncciean exelnss ncciean 1~ti5s псйй еexe nCdd msgnss ncedit exeexe ncedit extcfg ncedit msgexe nctf "••""•ext n c f ff i l ncffhip nclabelico ncmainin$ ncnetirH ncnet msgjitrag ncpscrip Шг\\

•КАТАЛОГ* 19.iO.99 10:O5

• H Л Модель X Лист1 I Лист2 /

J

~ 1з 4tic ncКоманда:

404.5523; 2,3646 , ЙОООО : ШАГ' СЕТКА; ОРТСГ ОТС-ПОЛЯР| ПРИВЯЗКА:|ОТС-ПРИВ ВЕС|МОДЕГ

Рис. 1.6. Вызов внешнего приложения DOS с помощью команды ДОС (SHELL)

Page 30: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 29

ia Mi rt Q* Q, «C Ib if U" I F

_ j

1A'

462 4503,2701063,0 0000 ШАГ. СЕТКА ОРТО 0ТС:ПОЛЯР ПРИВЯЗКАfOTC-ПРИВ ВЕС|МОДЕГ

Рис. 1.7. Окно AutoCAD Shell Active

Это окно уже автоматически не закрывается, даже если вы вызывали в нем вкачестве приложения знакомую нам программу c:\nc\nc и затем вышли изнее с помощью клавиши <Fl0>. Для закрытия окна нужно использоватьстандартную кнопку Закрыть (Close) в правом верхнем углу окна. Другойспособ закрыть окно и вернуться в AutoCAD — ввести в этом окне в качест-ве команды EXIT.

Параметр <флаг> во внешней команде — это битовый флаг, формируемыйкак сумма четырех битов, принимающих значения 1 (установлен) или 0 (неустановлен) и умножаемых на соответствующие весовые значения (нумеру-ются по степеням числа 2):

• бит 1: если установлен, то команды AutoCAD будут доступны до завер-шения приложения;

П бит 2: если установлен, то приложение будет выполняться в свернутомвиде;

О бит 4: если установлен, то приложение будет выполняться "скрытым";

О бит 8: если установлен, то в ответ на запрос приложения (например,имени редактируемого файла) можно взять строку аргумента в кавычки.

Page 31: Visual LISP и секреты адаптации AutoCAD

_30 Visual LISP и секреты адаптации AutoCAD

Биты 2 и 4 взаимно исключают друг друга. Поэтому если даже заданы оба,то используется только бит 2.

Самыми употребляемыми значениями битового флага являются:

П О — запустить приложение и ждать его завершения;

П 1 — запустить приложение и не ждать завершения;

• 3 — свернуть и не ждать;

• 5 — скрыть и не ждать.

Значения 2 и 4 обычно не применяются, поскольку они делают AutoCADнедоступным до окончания работы приложения.

Бит 8 позволяет командам правильно работать с именами файлов, вклю-чающими пробелы (например, "Heating Ventilation Air Conditioning.dwg").В то же время установка этого бита может препятствовать использованиюв качестве аргументов команды списка файлов, разделенных пробелами.В этом случае бит 8 лучше не устанавливать.

Код возврата внешней команды (параметр <код>) — это необязательное зна-чение, которое выдается в операционную систему после завершения внеш-него приложения. Код является указанием для системы AutoCAD выполнитьдополнительные операции и может принимать значения:

• 1 — загрузить в текущий рисунок DXB-файл с именем $cmd.dxb; послезагрузки указанный файл удаляется; операция загрузки аналогична дей-ствию команды ИМПОРТД (DXBIN);

• 2 — в текущем рисунке создает описание нового блока (имя блока фор-мируется из ответа, данного пользователем на запрос внешнего приложе-ния) из объектов DXB-файла, имеющего имя Scmd.dxb; имя блока долж-но быть допустимым (например, не содержать недопустимых символов ине повторять имен уже существующих блоков); сформированное имяописанного блока устанавливается системой AutoCAD как имя по умол-чанию для команды ВСТАВИТЬ (INSERT); файл Scmd.dxb после созда-ния описания блока уничтожается.

Если вам нужны действия, выполняемые и по коду 1, и по коду 2, то следу-ет установить код возврата, равный 3. Значения кода возврата меньше 1 ибольше 3 являются ошибочными.

О том, как система AutoCAD разбирает ввод пользователя с клавиатуры иотличает имя стандартной команды от имени внешней команды или отимени системной переменной см. разд. 1.3.

Помимо имен внешних команд, в файле acad.pgp могут присутствоватьпсевдоимена стандартных команд системы AutoCAD. Как правило, это со-кращения или перевод команд. Формат псевдоимен команд следующий:

<лсевдоимя>,*<комакда>

Page 32: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 31

Псевдоимя должно быть короче полного имени команды, по крайней мере,на две буквы. Использование псевдоимен особенно удобно для тех пользо-вателей, которые привыкли вводить команды с клавиатуры. Из листинговприложения 2 видно, что в стандартной настройке русскоязычной системыAutoCAD 2000 можно набирать СЛ вместо команды СЛОЙ, ПРД — вместоПОЛРЕД, а в стандартной настройке англоязычной системы LA — вместоLAYER, РЕ — вместо PEDIT и т. д.

Как было сказано выше, загрузка файла acad.pgp выполняется одновремен-но с загрузкой системы AutoCAD. Если нужно внести изменения в этотфайл и загрузить его заново, не выходя из сеанса редактирования AutoCAD,необходимо пользоваться командой ПЕРЕИН (REINIT). Далее в появив-шемся диалоговом окне Переинициализация (Reinitialization) (рис. 1.8) нуж-но установить флажок PGP-файл и нажать кнопку ОК.

Переинициализания

Инициализация портов ввода-вывода —

• Инициализация Файлов и ijcrpoifcfe™ ;'—

"Г йр-1ййр:ч; ;' :'-•-•.,> '\-\'Г :;;. . .:" ' .

Г" PGP-файл : : ."':-.''

|[ ЬХ il: ; Отмена I :Рис. 1.8. Диалоговое окноПереинициализация

Аналогичная переинициализация файла acad.pgp может быть выполнена пу-тем задания системной переменной RE-INIT значения 16.

1.3. Настройка AutoCADдля подключения средств пользователяКоманда НАСТРОЙКА (OPTIONS) системы AutoCAD позволяет не тольконастраивать элементы графического интерфейса, но и влиять на работупрограммного обеспечения. Правильно сделанные установки облегчают ра-боту с объектами, созданными пользователями (заготовками чертежей, гео-метрическими библиотеками, файлами приложений и т. д.). Текущие на-стройки можно экспортировать из AutoCAD в файл профиля (с расширени-ем arg), чтобы затем в нужный момент импортировать их в AutoCAD. Наодном компьютере могут быть несколько ярлыков для запуска AutoCAD 2000с различными настройками (например, когда применяются несколько плохосовместимых между собой приложений, работающих в среде AutoCAD). Нарис. 1.9 приведен пример содержимого папки с тремя такими ярлыками (онастройке ярлыков см. разд. 1.4).

Команда НАСТРОЙКА (OPTIONS) вызывает диалоговое окно Настройка(Options) (рис. 1.10).

Page 33: Visual LISP и секреты адаптации AutoCAD

32 Visual LISP и секреты адаптации AutoCAD

I S Приложения AutoCAD 2D00

~M° П Р а ЫВИД Перевод

_| С , , IIIDOV'S1 Рабочим стоп

АGenHulHS

Юбъектов: 3

АПАКТ-15

1збрэнное £правкэ

Вырезать Копировать Встаеить

Приношения AufuCnD 2000

ЛPifTM t opn-jc 15

2,83 КБ ', £g Мой компьютер

-,lQlx(mm

Отменить

Рис. 1.9. Ярлыки, вызывающие AutoCAD 2000 с разными настройками

ЩНасгройка 3 ~х\

Ter-уший профиль 4<Unriamed Pfohle>> £P Текущий рисунок Drawingl.dwg

Файлы |эиран Отг'рьггиех'Сохранение] Печать] Система] Пользо&ательские | Построения Выбор] Профили|

Пути доступа, имена Файпое и палг-и

^ ^ f f i ^ r i i j T b доступа к файлам п с ц д д е р ж к и ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ м

+ IJ£*j Путь поиск а рабочих ФайпоЕ поддер-ti и

+ цт5-*, 11уть достчпа к драйверам устройств

+. Щ Путь доступа к файлам проектов

='+ | j Имена Файлов меню, справочной системы и др.+. (J Имена Файлов редактора, словаря и шрифтов

.+ 'Г\ Имена Файла печати, программы ФОНОВОЙ печати и раздела пролога

'+' U Путь к Файлам поддержки печати

,+;• 1 ^ | Путь поиска приложений ObjectARX

' + • l ^ j П а п к а Д Л Я Ф а й л а а в т о с о х р а н е н и я

':+\- 1 ^ | Положение источников данных

:+, ^ Папка для шаблона рисунка

Обзор-.

Добавить...

Отер,'

••:•:-•••»;«••'.

'+ ^*| Папка для файла журнала

+ Ijfi; Папка для временных Файлов

+ I^i Папка дня временных файлов внешних ссыпок _XJ

;Укатите папки, в которых AutoCAD должен искать Файлы шрифтов, меню, приложений,рисунков для вставши, типов линий и образцов штриховки, если их нет в текущей папке.

ОК, | Отмена Справка

Рис. 1.10. Диалоговое окно Настройка, вкладка Файлы

Диалоговое окно Настройка (Options) имеет девять вкладок: Файлы (Files),Экран (Display), Открытие/Сохранение (Open and Save), Печать (Plotting),Система (System), Пользовательские (User Preferences), Построения (Draf-ting), Выбор (Selection), Профили (Profiles). В верхней части окна поле Те-кущий профиль (Current profile) показывает имя текущего профиля (Unna-med Profile — имя профиля по умолчанию), а поле Текущий рисунок (Currentdrawing) — имя текущего рисунка с расширением dwg (Drawingl.dwg — имянового рисунка по умолчанию). О профилях пойдет речь в данном разделениже, при рассмотрении вкладки Профили (Profiles/

Page 34: Visual LISP и секреты адаптации AutoCAD

Глава 1 Средства адаптации AutoCAD 33_

Вкладка Файлы (Files) является самой важной в настройке и задает именафайлов или пути для поиска файлов следующих типов:

• Путь доступа к файлам поддержки (Support File Search Path)

• Путь поиска рабочих файлов поддержки (Working Support File Search Path)

• Путь доступа к драйверам устройств (Device Driver File Search Path)

• Путь доступа к файлам проектов (Project Files Search Path)

• Имена файлов меню, справочной системы и др. (Menu, Help, and Miscel-laneous File Names)

• Имена файлов редактора, словаря и шрифтов (Text Editor, Dictionary, andFont File Names)

• Имена файла печати, программы фоновой печати и раздела пролога (PrintFile, Spooler, and Prolog Section Names)

П Путь к файлам поддержки печати (Printer Support File Path)

• Путь поиска приложений ObjectARX (Search Path for ObjectARX Appli-cations)

• Папка для файла автосохранения (Automatic Save File Location)

• Положение источников данных (Data Sources Location)

• Папка для шаблона рисунка (Drawing Template File Location)

• Папка для файла журнала (Log File Location)

• Папка для временных файлов (Temporary Drawing File Location)

П Папка для временных файлов внешних ссылок (Temporary ExternalReference File Location)

• Папка для поиска текстур (Texture Maps Search Path)

Шестнадцать пунктов настройки указывают имена файлов программно-го обеспечения или пути поиска файлов поддержки, шаблонов, протокола ит. п. Большая часть из этих пунктов представлена в виде дерева, в которомможет быть несколько вариантов —- например, несколько путей. Если путейв пункте настройки несколько, тогда расположенный выше путь имеет при-оритет над ниже расположенным. Пользователь может добавлять, удалятьпути или изменять их порядок. Рассмотрим подробнее пункты вкладкиФайлы (Files).

Первый пункт — Путь доступа к файлам поддержки (Support File SearchPath) — задает пути поиска таких элементов, как файлы меню, типов линий,штриховок, шрифтов, рисунков (при вставке этих рисунков в текущий чер-теж с помощью команды ВСТАВИТЬ (INSERT)). Эти же пути используютсядля обнаружения и загрузки файла acad.pgp, структура которого рассмотренав предыдущем разделе.

2 Зал. 155

Page 35: Visual LISP и секреты адаптации AutoCAD

34 Visual LISP и секреты адаптации AutoCAD

Щелчок по плюсу, находящемуся слева от наименования пункта, позволяетраскрыть содержимое этого пункта и увидеть составляющие его пути(рис. 1.11).

Любой из путей, входящих в состав пункта, можно удалить. Для этогощелкните мышью сначала по удаляемому пути, а затем — по кнопке Уда-лить (Remove), расположенной в правой части диалогового окна Настройка(Options).

•С'"**^^ Путь доступа к Файлам поддержки

,| i - * D:\AUTOCAD2000\support

I I - , D:\AUT0CAD20CI0\fonts

i | -г D:\AUTOCAD2000\help

! i i-г DMUTOCAD2000\ezpiess

Рис. 1 . 1 1 . Пункт Путь доступак файлам поддержкив раскрытом виде

Путь доступа к Файлам поддержки

-г D:\AUTOCAD2000\support

т D:\AUTOCAD2000\lonts

-г D:\AUTOCAD2000\help

--г D:WJTOCAD2000\enpiess

Рис. 1.12. Добавление нового путик пункту Путь доступа к файламподдержки

Если нужно добавить новый путь к уже имеющимся, щелкните по кнопкеДобавить (Add). Снизу появится дополнительная пустая строка (рис. 1.12).

Теперь содержимое добавляемого пути нужно либо ввести с клавиатуры впоявившемся прямоугольнике, либо (что практичнее) щелкнуть по кнопкеОбзор (Browse) и в открывшемся новом окне Обзор папок (Browse for Folder)выбрать мышью интересующую вас папку. Если вы хотите, чтобы ваша пап-ка просматривалась системой AutoCAD раньше других, воспользуйтеськнопкой Вверх (Move Up). Однократный щелчок по этой кнопке переме-щает выделенный путь на одну строку вверх. После нескольких щелчковваша папка поднимется на самый верх. На рис. 1.13 показана новая папкаD:\Paktl5, занявшая верхнюю строку в пункте Путь доступа к файлам под-держки (Support File Search Path).

P-"^^ Путь доступа к Файлам поддержки

j -г D:\AUTOCAD2000\supporl

! -г D:\AUTOCAD2000\font*

| -г D:\AUT0CAD2000\help

i -т D:\AUTOCAD2000\expressРис. 1.13. Перемещение папкив списке путей

Кнопка Вниз (Move Down) позволяет перемещать выделенную папку на од-ну строку вниз. Щелчок по расположенным в нижней части окна Настройка(Options) кнопкам Применить (Apply) и затем ОК занесет сделанные навкладке изменения.

с ЗамечаниеВозможно использование путей, заданных в системных переменных среды(например, если в качестве добавляемого пути ввести %MYPATH%, а систем-

Page 36: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 35_

ная переменная MYPATH задана в файле autoexec.bat и определяет нужныйвам путь или пути, разделенные точкой с запятой). Такие пути начинают дейст-вовать при следующей загрузке AutoCAD 2000.

Второй пункт — Путь поиска рабочих файлов поддержки (Working SupportFile Search Path) — определяет пути к файлам поддержки, которые вы хоти-те добавить конкретно в вашей версии системы, базирующейся на графиче-ском процессоре AutoCAD. Он является расширением предыдущего пунктанастройки. Все пути предыдущего пункта Путь доступа к файлам поддержки(Support File Search Path) автоматически отражаются в данном пункте, но выможете ввести и дополнительные.

( Замечание )Если в первом пункте вы использовали переменные среды, то во втором пунктевместо этих переменных будет показано их содержимое в раскрытом виде. На-пример, пусть в файле autoexec.bat было записано SET MYPATH=c:\bdr\111076;d:\plans. Тогда в пункте Путь поиска рабочих файлов поддержки(Working Support File Search Path) появятся сразу две строки: c:\bdr1\111076 иd:\plans.

Пункт Путь доступа к драйверам устройств (Device Driver File Search Path)указывает на папку, в которой AutoCAD ищет драйверы для экрана, мыши,принтера и т. д.

Пункт Путь доступа к файлам проектов (Project Files Search Path) указываетпуть к папке проекта, с которым связывается текущий рисунок. Папка про-екта используется для хранения загружаемых в рисунок файлов внешнихссылок. Системная переменная AutoCAD с именем PROJECTNAME запо-минает имя проекта.

Пункт Имена файлов меню, справочной системы и др. (Menu, Help, and Mis-cellaneous File Names) задает имена и местоположение таких файлов (на-помню: мы считаем, что AutoCAD 2000 установлен в папку d:\AutoCAD 2000):

• Файл меню (Menu File) — по умолчанию d:\AutoCAD 2000\support\acad(расширение mnu); текущее меню может быть изменено также с помощьюкоманды МЕНЮ (MENU);

• Файл справки (Help File) — по умолчанию d:\AutoCAD 2000\help\acad.hlp;

П Начальный узел Интернета (Default Internet Location) — по умолчаниюd:\AutoCAD 2000\home.htm; задает адрес начальной страницы, открывае-мой по команде БРАУЗЕР (BROWSER); хранится в системной перемен-ной AutoCAD с именем INETLOCATION;

• Файл настройки (Configuration File) — по умолчанию d:\AutoCAD 2000\acad2000.cfg; этот файл запоминает большую часть текущих настроекAutoCAD; имя файла может изменяться только с помощью переключате-ля /с (см. описание переключателей в данном разделе ниже);

Page 37: Visual LISP и секреты адаптации AutoCAD

36 . Visual LISP и секреты адаптации AutoCAD

П Сервер сетевых лицензий (License Server) — задает имя сервера при сете-вой установке AutoCAD 2000; значение хранится в системной перемен-ной ACADSERVER.

Пункт Имена файлов редактора, словаря и шрифтов (Text Editor, Dictionary,and Font File Names) вкладки Файлы (Files) позволяет переопределить сле-дующие элементы:

• Текстовый редактор (Text Editor Application) — имя приложения, заме-няющего стандартный текстовый редактор, используемый для редактиро-вания мультитекста (хранится в системной переменной AutoCAD с име-нем MTEXTED);

• Главный словарь (Main Dictionary) — имя основного словаря, применяе-мого в операциях проверки правописания (хранится в переменнойDCTMAIN);

• Вспомогательный словарь (Custom Dictionary File) — имя вспомогатель-ного словаря, используемого для проверки орфографии (хранится в сис-темной переменной DCTCUST);

• Файл альтернативного шрифта (Alternate Font File) — имя файла альтер-нативного шрифта, используемого системой AutoCAD при невозможно-сти загрузить шрифт, на который имеется ссылка в текущем рисунке и окотором нет информации в файле acad.fmp (таблица замены шрифтов);хранится в системной переменной FONTALT;

• Файл соответствия шрифтов (Font Mapping File) — имя файла таблицызамены шрифтов (по умолчанию acad.fmp); хранится в системной пере-менной FONTMAP.

Пункт Имена файла печати, программы фоновой печати и раздела пролога(Print File, Spooler, and Prolog Section Names) задает опции настройки печати:

• Имя файла чертежа для командных файлов (Plot File Name For LegacyPlotting Scripts) — имя файла чертежа по умолчанию с целью использова-ния для печати пакетных командных файлов, созданных предыдущимиверсиями AutoCAD; в AutoCAD 2000 имя файла чертежа обычно образу-ется ПО Правилу: имя_рисунка-имя_листа.р11:;

• Программа фоновой печати (Print Spool Executable) — имя исполняемогофайла для фоновой печати чертежей (настраивается с помощью мастерадобавления плоттера, в котором задается использование буферизации);в пакетном файле печати может присутствовать параметр %s, который ав-томатически заменяется на имя выводимого файла;

• Имя раздела пролога в файле PostScript (PostScript Prolog SectionName) — имя раздела пролога в файле acad.psf, используемого командойЭКСПОРТПС (PSOUT) для вывода; хранится в системной переменнойPSPROLOG.

Page 38: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 37_

Пункт Путь к файлам поддержки печати (Printer Support File Path) задает пу-ти, необходимые для работы программ печати:

• Папка для фоновой печати (Print Spooler File Location) — папка, в кото-рой размещаются файлы печати;

• Путь поиска конфигураций печати (Printer Configuration Search Path) —папка поиска файлов конфигурации принтера (с расширением рсЗ);

• Путь поиска файлов описания принтеров (Printer Description File SearchPath) — папка поиска файлов описаний принтеров (с расширением ртр);

• Путь поиска таблиц стилей печати (Plot Style Table Search Path) — папкадля поиска файлов с таблицами именованных и цветозависимых стилейпечати (с расширениями stb и ctb).

Пункт Путь поиска приложений ObjectARX (Search Path for ObjectARXApplications) задает пути для поиска приложений, разработанных на языкеC++ с помощью пакета ObjectARX (о средствах разработки приложенийсм. разд. 1.7). Пути оформляются аналогично гиперссылкам в рисункеAutoCAD и разделяются точкой с запятой.

Пункт Папка для файла автосохранения (Automatic Save File Location)управляет местоположением файлов автосохранения (заносится в системнуюпеременную SAVEFILEPATH).

Пункт Положение источников данных (Data Sources Location) определяетпуть для чтения баз данных, связанных с чертежом. В случае его изменениянужно обязательно перезагрузить AutoCAD.

Пункт Папка для шаблона рисунка (Drawing Template File Location) задаетпапку для поиска шаблонов, используемых при создании новых чертежей(см. разд 1.1).

Пункт Папка для файла журнала (Log File Location) указывает местораспо-ложение файла журнала, если опция ведения такого файла задана на вклад-ке Открытие/Сохранение (Open and Save). Значение хранится в системнойпеременной LOGFILEPATH.

Пункт Папка для временных файлов (Temporary Drawing File Location) задаетпапку для направления рабочих файлов AutoCAD, которые могут заниматьдостаточно большой объем. Временные файлы автоматически уничтожаютсяпри выходе из системы AutoCAD. Значение хранится в системной перемен-ной TEMPPREFIX, которая доступна только для чтения. Рекомендуется об-ратить внимание на этот пункт при работе в сети и с жесткими дисками,имеющими небольшой объем свободного места, а также при чтении файловрисунков с CD-ROM.

Пункт Папка для временных файлов внешних ссылок (Temporary ExternalReference File Location) контролирует размещение файлов внешних ссылок,если установлена опция Разрешена с копированием (Enabled with Copy) для

Page 39: Visual LISP и секреты адаптации AutoCAD

38 Visual LISP и секреты адаптации AutoCAD

функции Подгрузка файлов внешних ссылок (Demand Load Xrefs) во вклад-ке Открытие/Сохранение (Open and Save) диалогового окна Настройка(Options). Значение хранится в системной переменной XLOADPATH.

Пункт Папка для поиска текстур (Texture Maps Search Path) задает путь дляпоиска файлов с текстурами (для операций тонирования).

Для адаптации AutoCAD 2000 большое значение имеет вкладка Профили(Profiles) диалогового окна Настройка (Options) (рис. 1.14).

1М Настройка

f«4Pliii**'npM»ttK:.i <fUrnamtdfiqtie» , "'•••. :

: Щ fекищийрисунок Dtawirjgt.oVyg : ,'

файлы) Экран] Отдагтие/Соиранёние |; Печать j Система) Пользовательские! Пойроенио] Эыйор ! ПроФилй;1|

: И ме£щиеся: профили:

<<Unnamed Profile» Установить

Переименовать..,

..-.-• Удалить:

ИМПОРТ...

'••С*ос •

;Ttie default profde name:;;

0К : Отмена Справка

Рис. 1.14. Диалоговое окно Настройка, вкладка Профили

Профили — это совокупность параметров настройки, которые можно сохра-нять с именем, вызывать по имени, а также экспортировать в файлы с рас-ширением arg (для передачи пользователям, работающим на других компью-терах) и, если необходимо, — импортировать настройки из файлов с расши-рением arg.

Левую часть вкладки Профили (Profiles) диалогового окна Настройка (Op-tions) занимает список Имеющиеся профили (Available Prifiles) с наименова-ниями профилей, запоминаемых системой AutoCAD. Текущий профиль вэтом перечне выделен темным цветом. Профиль по умолчанию в новом ри-сунке имеет название <<Unnamed Profile>>. В нем сохраняются измененияпараметров настройки до тех пор, пока пользователь не сохранит их под но-

Page 40: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 39_

вым именем. Ниже поля Имеющиеся профили (Available Prifiles) отображает-ся комментарий (описание), который сохраняется вместе с профилем.

В правой части рассматриваемой вкладки расположены кнопки операцийнад профилями:

• Установить (Set Current) — устанавливает в рисунке текущим профильс отмеченным именем;

• Добавить (Add to List) — сохраняет текущие установки AutoCAD в новомпрофиле;

П Переименовать (Rename) — переименовывает профиль;

• Удалить (Delete) — удаляет профиль (это возможно только в том случае,если профиль не является текущим);

• Экспорт (Export) — выполняет экспорт профиля в файл с расширениемarg;

П Импорт (Import) — выполняет импорт профиля из файла с расширениемarg;

• Сброс (Reset) — восстанавливает установки, действующие в системеAutoCAD 2000 по умолчанию.

Для сохранения текущих установок в новом профиле следует пользоватьсякнопкой Добавить (Add to List), которая открывает диалоговое окно Добав-ление профиля (Add Profile) (рис. 1.15).

\Ш Добавление ПРОФИЛЯ

я профиля:

]CAD -profile 1

Цписание:, .

Параметры системы проектирования 1

: Отмена • Рис. 1.15. Диалоговое окноДобавление профиля

В этом окне в поле Имя профиля (Profile name) нужно ввести имя новогопрофиля, а в поле Описание (Description) — комментарий к профилю. Послесохранения с помощью кнопки Принять (Accept) введенные значения по-явятся в списке профилей, отображаемых во вкладке Профили (Profiles) диа-логового окна Настройка (Options) (рис. 1.16).

Кнопка Установить (Set Current) делает текущим профиль, имя которого вданный момент отмечено в списке Имеющиеся профили (Available profiles).Изменение отражается в расположенном в верхней части диалогового окнаНастройка (Options) поле Текущий профиль (Current profile).

Если щелкнуть по кнопке Экспорт (Export), то откроется диалоговое окноЭкспорт профиля (Export Profile) (рис. 1.17).

Page 41: Visual LISP и секреты адаптации AutoCAD

40 Visual LISP и секреты адаптации AutoCAD

j k Настройка

Ф аи лы J Экран ]. 0ткр

Имеющиеся; профили;

Печать) &1СТвма.|':Пря»зовательг;кив| Пострчення j;Bbi6op Профили I

«Unnamed Profile»

,: -Экспорт'.: ••':.";);

• Параметры системы проектирования 1

Отмена" Справка ;

Рис. 1.16. Добавление нового профиля

(Экспорт профиля

Сохранить g:

_ J Data Links2JD(VI J ExpressJ Fonts

_JHelp_J Plot Styles

a AutoCAD2000

L_J PlottersCJ SampleCJ SupportD TemplateCI3 TexturesCJ Tutorial

|л] Temp.arg

Цмя файла:

1ип файла: • (Профили (".ARG) ОтйёНа ;

Рис. 1.17. Диалоговоеокно Экспорт профиля

В данном окне пользователь должен выбрать или ввести имя файла с рас-ширением arg для экспорта в этот файл текущих параметров настройки.

Еще четыре кнопки вкладки Профили (Profiles) диалогового окна Настройка(Options) дают возможность переименовывать, удалять, импортировать про-филь или восстанавливать параметры настройки по умолчанию.

Page 42: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 41

С другими операциями настройки системы AutoCAD можно познакомитьсяв книге "Самоучитель AutoCAD 2000", упомянутой в предисловии.

Выполненная настройка путей поддержки влияет на механизм поиска и за-грузки файлов по имени. Например, если AutoCAD ищет файл внешнихкоманд и псевдокоманд acad.pgp, то система сначала просматривает рабочийкаталог (папку, заданную в настройке ярлыка AutoCAD — см. разд. 1.4), за-тем поочередно проходит по путям доступа к файлам поддержки (если ихнесколько, то в направлении сверху вниз). Первый же найденный файл сподходящим именем загружается, и поиск его в других папках система ужене выполняет. Тот же алгоритм применяется при поиске других файлов(acad.lsp, acaddoc.lsp, acad.lin и т. д. — см. приложение I).

1.4. Настройка ярлыка AutoCADДополнительные возможности дает настройка ярлыка, используемого длязапуска AutoCAD 2000. На одном компьютере может быть несколько такихярлыков, настроенных по-разному (см. рис. 1.9).

Если на рабочем столе Windows щелкнуть правой кнопкой мыши по ярлыкуAutoCAD и в контекстном меню выбрать команду Свойства (Properties), то впоявившемся диалоговом окне на вкладке Ярлык (Shortcut) или Программа(Program)1 вы увидите текущую настройку (рис. 1.18).

Свойства: AutoCAD 2000

Общие Ярлык |

. J f c Auto№D.2Q00::

ТиГ> объекта: .:; Приложение':

Файл: 1llD:\AutoCAD2000\acadexe"

Рабочий кэталог. : J"d:NAutoCAD 2000"

=• Сочетание клавиш: ]Нет

]Стацдаргный размер

'•" !.'.: . • ...:'.' • " • '.' j1 '•• '.. • •• •.; ..• *• '' • "• '*:••Найти объект1,:.. | Сменить значок . |

ок...- Прищемить..! Рис. 1.18. Диалоговое окноСвойства: AutoCAD 2000

1 Вкладка Программа (Program) относится только к диалоговым окнам ярлыков DOS-про-грамм. — Ред.

Page 43: Visual LISP и секреты адаптации AutoCAD

42 Visual LISP и секреты адаптации AutoCAD

Поле Рабочий каталог (Start in) определяет самую первую папку, с которойAutoCAD начинает поиск файлов в различных операциях. Если объект с за-данным именем будет найден в этой папке, то в папках, указанных в на-стройке в пункте Путь доступа к файлам поддержки (Support File SearchPath), поиск уже не выполняется. Поэтому файлы адаптации, созданныепользователем, следует размещать в рабочем каталоге, путь к которому сле-дует задать в настройке ярлыка AutoCAD 2000.

ЗамечаниеВерсии AutoCAD, работающие в среде MS DOS, начинают поиск файлов с те-кущего каталога.

В поле Файл (Cmd file) указывается командная строка для запуска головногомодуля acad.exe, причем в ней можно использовать переключатели, влияю-щие на режим начала работы AutoCAD. Допустимо в данном поле вместокомандной строки указать имя командного файла, который будет выполнен.

Перечислим переключатели и их назначение:

• /с — задание пути к файлу конфигурации, имеющему расширение cfg;

• /s — задание путей к файлам поддержки;

О /ъ — задание имени выполняемого файла сценария;

• /г — восстановление текущего системного устройства указания;

• /t — задание имени шаблона;

• /noiogo — загрузка без традиционной заставки AutoCAD;

П /ч — задание имени начального вида;

• /р — задание имени профиля.

Все переключатели, кроме /noiogo, требуют задание после себя значения(пути или имени). Переключатели отделяются от имени исполняемого фай-ла acad.exe, друг от друга и от значений пробелами. Часто значения, кото-рые вводятся в командной строке для переключателей, для правильной ра-боты, приходится окаймлять двойными кавычками (если в путях использу-ются пробелы, то кавычки обязательны). Теперь несколько подробнее обиспользовании переключателей.

П Переключатель /с задает путь к нужному файлу конфигурации AutoCADили полное имя файла, имеющего расширение cfg. В файл конфигурациизаносятся текущие настройки системы AutoCAD. По умолчанию исполь-зуется имя acad2000.cfg, расширение cfg может быть опущено. Если файлконфигурации с указанным именем не существует, то AutoCAD создаетего (если в командной строке был задан только путь, без имени, то соз-дается файл с именем acad2000.cfg).

Если переключатель /с не задан, то AutoCAD 2000 ищет файлы настрой-ки в каталоге с исполняемыми файлами AutoCAD, а затем проверяет пу-

Page 44: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 43

ти, указанные в переменных среды ACADCFGW и ACADCFG. Примеркомандной строки с переключателем /с:

"d:\AutoCAD 2000\acad.exe" /с "e:\New_conf\my_confl"

В этом примере AutoCAD прочитает в качестве файла конфигурациифайл my_confl.cfg, расположенный в папке e:\New_conf.

• Переключатель /s определяет пути поиска файлов поддержки, находя-щихся не в рабочем каталоге (например, файлов меню, файлов шрифтов,файлов типов линий, файлов штриховок и файлов с программами наязыке Auto LISP). Пути, указываемые в переключателе, должны разде-ляться точкой с запятой. Количество путей не должно превышать 15.Если переключатель не задан, AutoCAD ищет файлы по путям поискафайлов поддержки, заданным в диалоговом окне Настройка (Options).Пример использования переключателя /s:

"d:\AutoCAD 2000\acad.exe" /s "f:\Userfonts;f:\myhatch;d:\Programs\LISP"

ЗамечаниеВ ранних версиях AutoCAD читал пути поиска файлов поддержки из перемен-ной среды с именем ACAD. В последней версии пути, заданные в переменнойACAD, добавляются в список путей поиска после стандартных путей настройки.

• Переключатель /ъ задает имя файла сценария (имя пакетного файла срасширением scr), автоматически запускающегося при загрузке AutoCAD.Если файл сценария не может быть найден, то AutoCAD выдаст соответ-ствующее сообщение. Пример использования переключателя /ь с файломdefine.scr (в этом файле, например, могут быть команды установки раз-мерных переменных):

"d:\AutoCAD 2000\acad.exe" /Ь "f:\User\define"

• Переключатель /г используется для запуска AutoCAD с восстановлениемтекущего системного устройства указания. Одновременно создается но-вый файл настройки (по умолчанию его имя acad2000.cfg), а предыду-щий файл конфигурации переименовывается с заменой расширения cfgна bak.

• Использование переключателя /t является указанием системе AutoCADо том, что будет создаваться новый рисунок, и после переключателя зада-ется имя шаблона (файла с расширением dwt) или прототипа (файла срасширением dwg). Работа с шаблонами рассмотрена в разд. 1.1. Если за-дано имя прототипа, то содержимое файла-прототипа будет скопированов создаваемый рисунок. Пример использования переключателя:

"d:\AutoCAD 2000\acad.exe" /t "f:\User\Templates\Back"

Page 45: Visual LISP и секреты адаптации AutoCAD

Visual LISP и секреты адаптации AutoCAD

П Переключатель /noiogo позволяет при запуске AutoCAD 2000 не показы-вать стандартную заставку, что уменьшает время начальной загрузки.

• Переключатель /v задает имя вида, который устанавливается при откры-тии существующего рисунка. Например:

"d:\AutoCAD 2000\acad.exe" Housel20 /v plan

Переключатель /v редко применяется для настройки ярлыка, чаще —в командных файлах. В этом примере между именем исполняемого файлаи переключателем стоит имя рисунка House 120, который следует открытьс видом plan (см. также замечание в конце данного раздела).

П Переключатель /р задает пользовательский профиль, который нужно ус-тановить при запуске AutoCAD. Указанный профиль действует только досмены его с помощью диалогового окна Настройка (Options). Подробнеео профилях см. разд. 1.3. Можно в качестве имени профиля задать имяфайла с расширением arg, откуда профиль будет импортирован. Если не-обходимый профиль не найден, то устанавливается текущий (в новых ри-сунках — профиль по умолчанию). Пример:

"d:\AutoCAD 2000\acad.exe" /р "Ship model profile"

( Замечание )Командные файлы могут использоваться не только в настройке ярлыкаAutoCAD, но и для запуска AutoCAD без помощи ярлыка. В этом случае послеимени исполняемого файла может вставляться параметр с именем рисунка,после которого идут переключатели. Расширение dwg опускается. Если ри-сунок, имя которого указано, не существует, то он создается. Например, вкомандном файле может быть следующая строка: acad.exe f : \P lans\DrawinglO8 /b def ine.

1.5. Формированиеграфических библиотек пользователяСамые распространенные объекты, которые пользователям хочется видеть всоставе своей специализированной системы (или автоматизированного ра-бочего места) — это графические файлы с расширением dwg, т. е. рисунки,созданные самими пользователями. Количество наработок у каждого опыт-ного работника достаточно велико и растет ежедневно. Графические файлы,которые станут стандартными элементами будущих чертежей и математиче-ских моделей трехмерных изделий, нужно классифицировать (распределитьпо папкам, которые естественно называть графическими библиотеками),дать им имена в соответствии с разработанной классификацией — и первыйвариант вашей системы готов! Можно вставлять такие файлы в свои черте-жи с помощью команды ВСТАВИТЬ,(JNSERT).

Page 46: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 45

Дальнейшим шагом улучшения вашей системы должно стать меню, в кото-ром пункты соответствуют стандартизованным наименованиям вставляемыхобъектов и сами вызывают команду ВСТАВИТЬ (INSERT) с необходимымиопциями. А еще лучше сделать меню с пиктограммами вставляемых изобра-жений. По вопросам разработки меню см. главу 4. Процесс получения слай-дов, которые могут помочь при разработке графических меню, рассмотренв разд. 1.7.

Начиная с 15-й (т. е. AutoCAD 2000) версии, AutoCAD хранит вместе с ри-сунком растровый образец, который представляет собой уменьшенное изо-бражение рисунка в целом. Это дает возможность при открытии рисунка ипри вставке его в другой рисунок видеть в области Предварительный про-смотр (Preview) диалогового окна Выбор файла рисунка (Choose DrawingFile) (рис. 1.19) образец, что позволяет легче ориентироваться в большоймассе рисунков.

Выбор файла рисунка

Папка:

ИмяФайла: |Востокомблема

1ип Файлов ^Рисунки (".d

Рис. 1.19. Просмотр растровых образцов при вставке рисунков

( Замечание )Для вставки могут использоваться и файлы рисунков предыдущих версий. Од-нако они не содержат растровых образцов и поэтому не будут отображатьсяв области Предварительный просмотр (Preview). Такие рисунки полезно со-хранить повторно с помощью AutoCAD 2000.

Графической библиотекой может стать не только папка с набором рисунков,но даже один файл, в котором расположены стандартные элементы буду-щего чертежа. Такая возможность появилась в AutoCAD после реализациитехнологии ActiveX. Рассмотрим этот механизм на примере, приведенном нарис. 1.20.

Благодаря появлению в AutoCAD 2000 многодокументного режима можнооткрыть сразу несколько окон с рисунками. На рис. 1.20 отображены тририсунка: Drawingl, Electrical Power и Drawing2. Средний рисунок (Electrical

Page 47: Visual LISP и секреты адаптации AutoCAD

46 Visual LISP и секреты адаптации AutoCAD

Power) содержит некоторое количество элементов электрических схем. Выможете, щелкнув левой кнопкой мыши, выделить элемент, который пред-стоит копировать, например, в Drawing 1. Теперь в рисунке Electrical Powerможно, нажав и удерживая левую кнопку мыши, перетащить выделенныйэлемент в окно рисунка Drawing 1, не трогая появившихся ручек. При этомпод стрелкой указателя мыши появится прямоугольник, символизирующийкопирование в технологии ActiveX. Когда вы отпустите кнопку мыши, токопируемый элемент появится на новом месте. Описанную операцию бук-сировки можно выполнить, нажав и удерживая правую кнопку мыши вместолевой.

A AutoCAD 2000 - НЕ ДЛЯ ПЕРЕПРОДАЖИ

Правка Ёиа-'-!ВстйЬка":.Фрнзат:":£ервиС:';£исЬввмнвдРазмерЬ! P^^^U'^'ty&vi&i^^ ^^I'J:^ '':.-: :-i ч ',••• ,• ••

О ! ПО

• 1 •{•Г; Оo i a :

Щг

[Команда:Команда•|Команда

1' 0430/9 0192,0 0000

Рис. 1.20. Применение многодокументного режима для копирования элементов

Копирование объектов в другой рисунок может выполняться и с помощьюбуфера обмена Windows. Этой цели служат меню Правка (Edit), а такжекоманды ВБУФЕР (CUTCLIP), КБУФЕР (COPYCLIP), БТКОПИРОВАТЬ(COPYBASE), ВСТБУФЕР (PASTECLIP), ВСТИСХОД (PASTEORIG),ВСТБЛОК (PASTEBLOCK), рассмотренные в книге "Самоучитель AutoCAD2000" в разд. 7.1.

Дальнейшее развитие эта схема манипуляции объектами разных рисунковполучила с появлением Центра управления AutoCAD (AutoCAD DesignCen-ter), рассматриваемого в следующем разделе.

Page 48: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 47

1.6. Центр управления AutoCADПомимо обычных графических объектов (отрезков, надписей, полилиний ит. д.) в рисунках образуются еще и неграфические объекты (слои, текстовыестили и т. д.), работа с которыми выполняется особым образом. Для облег-чения их использования и для возможности работы с элементами сразумногих рисунков в состав AutoCAD 2000 включено диалоговое окно Центруправления (DesignCenter) (рис. 1.21).

I Центр отравления

*, _j HELP V]_1 Plot Styles_J PLOTTERS

- ._] SAMPLE+ _J ACTIVEX• | Database Connectivity —'- | DesignCenter

+. О Analog Integrated Circuits dwg* И AutoCAD 2000 Textstyles and L- FJ5 Basic Electronics.dwg

E il Блоки[51 Внешние ссылки[£| ЛистыЬ^ Размерные стили^ Слои^ \ Т екстовые стилиrrrri Т ипы линий

Л CMOS Integrated Dtcuits-dwg^ Electrical Power.dwg?J Fasteners • Metric dwgTU Fasteners • US dwg^ Home • Space Planner.dwg^ House Designer dwg"3 HVAC - Heating Ventilation Air С Ч

«1 1 •!

—«I'l-

Battery

- - ^

Circuit Breaker

Diode-Zener

Fuse

Capacitor

Li

Diode

Full Wave Bridge

ОGenerator - AC

D.\AutoCAD2000\SAMPLE\DesignCentef\Basic Electronics.с!«д\Блоки {элементов: 24)

J

Рис. 1.21. Диалоговое окно Центр управления

Данное диалоговое окно вызывается командой ЦУВКЛ (ADCENTER) илищелчком по кнопке Центр управления AutoCAD (AutoCAD DesignCenter) [В].

Закрыть диалоговое окно Центр управления (DesignCenter) можно либо по-вторным щелчком по кнопке Центр управления AutoCAD (AutoCADDesignCenter), либо командой ЦУОТКЛ (ADCCLOSE), либо щелчком порасположенной в правом верхнем углу стандартной кнопке закрытия окна.

Окно позволяет просматривать сами рисунки, находящиеся в любом месте,а также их следующие элементы:

• блоки;

• внешние ссылки;

Page 49: Visual LISP и секреты адаптации AutoCAD

_4S Visual LISP и секреты адаптации AutoCAD

О листы;

• размерные стили;

О слои;

• текстовые стили;

• типы линий;

• растровые изображения, вставленные с помощью команды ИЗОБВСТА-ВИТЬ (IMAGEATTACH).

На рис. 1.21 видно, что в рисунке Basic Electronic.dwg, поставляемом в каче-стве примера с AutoCAD 2000, присутствуют описания блоков, имена и рас-тровые образцы которых отображаются в правой части диалогового окна.Если выделить какое-нибудь из описаний блоков, его изображение и свя-занный с ним комментарий появятся в правой нижней части (эти два поляна рис. 1.21 пока пусты).

Любой из перечисленных выше элементов может быть скопирован в теку-щий рисунок перетаскиванием. Если в одном рисунке собрать несколькоописаний блоков определенного направления, то доступ к этим блокам, ихкопирование легко осуществляется с помощью Центра управленияAutoCAD. To же самое относится и к внешним ссылкам, имеющимся в ри-сунке. Поэтому в качестве графической библиотеки пользователя может вы-ступить отдельный файл с находящимися в нем описаниями блоков ивнешними ссылками.

1.7. СлайдыДля получения пиктограмм графических объектов полезно создавать слайдырисунков, которыми можно впоследствии воспользоваться при разработ-ке меню. Слайды — это растровые изображения в специальном форматеAutoCAD. Файлы слайдов имеют расширение sld, они могут объединяться вбиблиотеки слайдов (файлы библиотек получают расширение sib).

Создание слайдов осуществляется в системе AutoCAD с помощью командыДСЛАЙД (MSLIDE). Перед тем как создать слайд, нужно открыть рисунок,по которому вы хотите получить слайд, и установить нужный вид (файлслайда является образом видимой части активного (текущего) графическогоэкрана, поэтому все лишнее должно быть либо заморожено с помощью сло-ев, либо должно оказаться за пределами видимой части рисунка). Желатель-но, чтобы видовые экраны, используемые для создания слайдов, имели от-ношение ширины к высоте 3:2.

Затем нужно ввести команду ДСЛАЙД (MSLIDE), которая откроет диалого-вое окно Создание файла слайда (Create Slide File) (рис. 1.22).

В этом окне остается назначить имя файлу, который получит расшире-ние sld.

Page 50: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 49

• Создание Файла слайда

Сохранить в: AutoCAD2000 Eng

iJiData Links!j ' D r v

,,..1 Express

I j Fonts

I ! Help

2i Plot Styles

L J Plotters

L3 Sample

C j Support

G j Template

:_J T extures

C j Tutorial

имя Файла: jDrawingi

1ил Файла:; | Слайды p.tld)

tpijpaHwf ь I

• Отмена;

Рис. 1.22. Диалоговоеокно Создание файласлайда

Просмотр слайдов выполняется в AutoCAD командой СЛАЙД (VSLIDE).Листинг 1.1 иллюстрирует, как можно воспользоваться слайдами для созда-ния презентаций.

! Листинг 1.1. Сценарий слайдовой презентации

; Старт прокрутки слайдов; Загрузить слайд первой детали_VSLIDE PARTI; Предварительная загрузка слайда второй детали_VSLIDE *PART2; Задержка 10 сек._DELAY 10000; Показать предварительно загруженный слайд детали_VSLIDE; Предварительная загрузка слайда чертежа сечения

_VSLIDE *SECTION

; Задержка 20 сек.

_DELAY 20000

; Показать предварительно загруженный слайд сечения

_VSLIDE

; Задержка 30 сек.

_DEIAY 30000

; Перейти к началу цикла

_RSCRIPT

В этом листинге приведен файл сценария (расширение файла должно бытьscr). Это пакетный файл, содержащий команды AutoCAD и их необходимыепараметры (т. е. ответы на запросы команд). Строки, начинающиеся с точкис запятой, являются комментариями.

Page 51: Visual LISP и секреты адаптации AutoCAD

50 Visual LISP и секреты адаптации AutoCAD

В рассматриваемом примере использованы английские имена команд, нос подчеркиваниями (чтобы сценарий работал как в английской, так и в рус-ской версиях AutoCAD).

Предположим, файл сценария имеет имя present.scr, тогда его можно запус-тить на выполнение, введя команду ПАКЕТ (SCRIPT) и выбрав затем вдиалоговом окне Выбор файла пакета (Choose Script File) файл с именемpresent.scr. Рассмотрим функционирование нашей презентации.

Для работы презентации должны быть созданы файлы слайдов рисунковдеталей partl.sld и part2.sld и файл слайда чертежа сечения section.sld (файлсечения будет иллюстрировать применение деталей parti и part2).

Строка _VSLIDE PARTI вызывает на экран слайд partl.sld первой детали (ондолжен находиться в одной из папок, на просмотр которых настроенAutoCAD).

Далее с помощью строки _VSLIDE *PART2 выполняется чтение в оперативнуюпамять с диска слайда part2.sld второй детали. При этом изображение самогослайда пока не выводится на экран.

Строка _DELAY юооо задерживает на экране слайд первой детали на 10 се-кунд. При этом используется команда ЗАДЕРЖКА (DELAY), для которойвремя задержки указывается в миллисекундах.

ЗамечаниеПараметр команды ЗАДЕРЖКА (DELAY) должен иметь значение не менее 1и не более 32 767. Для более длительных задержек можно использовать не-сколько команд ЗАДЕРЖКА (DELAY) подряд.

Затем строка _VSLIDE показывает предварительно загруженный слайд детали(имя слайда не задано, т. к. нужно показать слайд, уже прочитанный в па-мять).

Следующие две строки (_VSLIDE ^SECTION И _DELAY 20000) выполняют пред-варительную загрузку слайда чертежа сечения section.sld и задерживают наэкране слайд второй детали на 20 секунд.

После этого слайд сечения из памяти выводится на экран (VSLIDE) И задер-живается на 30 секунд (_DELAY ЗОООО).

Стоящая в конце файла сценария строка RSCRIPT передает управление вначало. Использованная при этом команда ВПАКЕТ (RSCRIPT) позволяет"зациклить" пакет, что удобно, например, для презентации на выставке. Па-кет будет выполняться до тех пор, пока вы не прервете его работу клавишей<Esc>.

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

Page 52: Visual LISP и секреты адаптации AutoCAD

Глава 1. Средства адаптации AutoCAD 51_

Для соединения слайдов в библиотеку используется специальная утилитаslidelib.exe, которая располагается в папке Support программного обеспече-ния AutoCAD.

Утилита работает вне сеанса системы AutoCAD как самостоятельный ис-полняемый модуль и имеет следующий формат (в командной строкеWindows):

sl idelib библиотека<список

Здесь библиотека — это имя файла библиотеки (расширение sib указывать ненадо), а список— это текстовый файл с именами слайдов (например, list.ts),в котором в каждой строке находится по одному имени слайда (без расши-рения sld). С помощью перераспределения ввода (символ <) файл спискаподается утилите slidelib.exe (в командной строке Windows), например:

slidelib exhibition<list.ts

Операционная система будет читать построчно файл списка l i s t . t s и пере-давать имена утилите slidelib ДЛЯ формирования библиотеки exhibition.

Команда СЛАЙД (VSLIDE) может показать слайд, являющийся элементомбиблиотеки, следующим образом:

СЛАЙД exhibition(parti)

Здесь exhibition — имя библиотеки, a parti — имя входящего в нее слайда.

1.8. Программные средства адаптацииБолее мощными средствами адаптации AutoCAD являются такие инстру-менты программирования:

О Visual LISP — на основе языка LISP;

• Visual Basic for Applications — на основе языка Basic;

• ObjectARX — на основе языка C++.

Самый первый язык программирования, который появился в средеAutoCAD, — это язык LISP (точнее, его специальная версия подAutoCAD — язык AutoLISP). В состав системы AutoCAD 2000 входит средапрограммирования Visual LISP, предназначенная для написания и отладкипрограмм и создания приложений. Язык AutoLISP рассматривается в на-стоящей книге в главе 2, а среда Visual LISP — в главе 3.

Более молодой язык, появившийся в AutoCAD, — язык Basic, для использо-вания которого требуется среда Microsoft Visual Basic for Applications (ее ва-риант входит в AutoCAD 2000). А самым мощным инструментом можно на-звать пакет ObjectARX, который распространяется отдельно и позволяетразрабатывать приложения на языке C++. Последние два средства в даннойкниге не описываются.

Page 53: Visual LISP и секреты адаптации AutoCAD

52 Visual LISP и секреты адаптации AutoCAD

В главе 4 будут рассмотрены вопросы создания меню (с применением языкаAutoLISP и без него), а в главе 5 — вопросы разработки диалоговых окон,без которых невозможно представить себе современное приложение.

Все перечисленные инструментальные средства позволяют создавать новыекоманды, которые будут работать наравне со стандартными командамиAutoCAD. Система должна анализировать, какие команды вводит пользова-тель (стандартные, внешние и т. д.) и использует для этого следующую схе-му обработки ввода с клавиатуры (если какой-то из пунктов дал положи-тельный результат, то дальнейшая проверка не выполняется):

1. Если пользователем введен пробел или нажата только клавиша <Enter>,то AutoCAD повторяет предыдущую команду; если предыдущих командеще не было, то AutoCAD выполняет команду ПОМОЩЬ (HELP).

2. Проверяется список встроенных команд AutoCAD. Если имени коман-ды не предшествует точка, то проверяется список переопределенныхкоманд.

3. Проверяется список команд драйверов устройств.

4. Проверяется список внешних команд, заданных в файле acad.pgp.

5. Проверяется список команд, созданных приложениями.

6. Проверяется список системных переменных. В случае положительногорезультата выполняется команда УСТПЕРЕМ (SETVAR) с данной сис-темной переменной.

7. Проверяется список псевдоимен, заданных в файле acad.pgp. При поло-жительном результате выполняется соответствующая команда AutoCAD.

8. Если предыдущие пункты не привели к положительному результату, товыдается сообщение о неизвестной команде.

Page 54: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 2

Язык AutoLISP

Язык программирования AutoLISP — это вариант языка LISP, в которыйдобавлены функции доступа к объектам, таблицам и словарям системыAutoCAD. Основой языка LISP является работа со списками, которые могутиметь произвольную длину и включать элементы разной природы (числа,текстовые строки, указатели файлов и т. д.). В то же время в языке доступ-ны обычные арифметические вычисления, логические операции, работа сфайлами и т. д. С помощью языка AutoLISP можно писать программы иливводить в командной строке выражения, которые затем вычисляет системаAutoCAD. Для чтения и разбора выражений в систему AutoCAD встроен ин-терпретатор AutoLISP.

В данной главе изучаются основные функции языка AutoLISP и приводятсяпрактические примеры. На базе языка в главах 4 и 5 будет рассмотрено на-писание файлов меню и программирование диалоговых окон.

Для разработки и отладки программ на AutoLISP удобно пользоваться вхо-дящей в систему AutoCAD 2000 интегрированной средой Visual LISP, изу-чаемой в главе 3. Там же будут рассмотрены дополнительные функции, дос-тупные только после загрузки Visual LISP и повышающие эффективностьработы системы AutoCAD.

Вопросы языка AutoLISP, рассматриваемые в данной главе, не являютсяспецифическими для системы AutoCAD 2000. Поэтому предлагаемый мате-риал может быть использован для изучения теми читателями, которые пи-шут программы на языке AutoLISP в версиях 10—14.

2.1. Интерпретатор AutoLISPВ AutoCAD входит интерпретатор AutoLISP, начинающий работать, если выв командной строке в ответ на стандартную подсказку Команда: (Command:)введете открывающую скобку (. В этот момент AutoCAD настраивается на

Page 55: Visual LISP и секреты адаптации AutoCAD

54 Visual LISP и секреты адаптации AutoCAD

прием и вычисление выражения Auto LISP, которое должно иметь форму спи-ска, т. е. начинаться открывающей скобкой и заканчиваться закрывающей, аэлементы списка должны отделяться друг от друга пробелами. Например,для получения суммы трех чисел вы можете ввести:

(+ 223.75 16.002 89.899)

Как только вы завершите ввод своего выражения нажатием клавиши <Enter>,AutoCAD вычислит указанное выражение и выдаст результат (рис. 2.1):329.651 (замечу, что десятичная точка в вещественных числах играет рольразделителя между целой и дробной частями).

A \ # • •

К i • M Л Модель /j Лист1 А Лист2 :

. , 'оманда ( + 22Э 7 5 1 6 . 0 0 2 8 9 . 8 9 9 )

,329.651 Рис. 2 . 1 . Использование вычислителя.команда выражений интерпретатора AutoLISP

ЗамечаниеКлавиатурный ввод выражений AutoLISP встречается сравнительно редко.Обычно выражения AutoLISP записываются в текстовый файл с расширениемIsp, который затем загружается в AutoCAD с помощью функции load (см.разд. 2.2.4).

2.1.1. Вычисляемые выраженияВ приведенном примере для вычисления было предложено выражение, от-крывающееся и закрывающееся круглыми скобками и состоящее из четырехэлементов: первый — имя функции сложения (+), остальные — аргументыфункции, т. е. слагаемые (223.75, 16.002 и 89.899). Это иллюстрирует формувычисляемых выражений языка AutoLISP:

(<функция> [ < а р г у м е н т 1 > [ < а р г у м е н т 2 > . . . [ < а р г у м е н т Ы > ] . . . ] ] )

З д е с ь <функция> — ЭТО ИМЯ фуНКЦИИ, < а р г у м е н т 1 > , < а р г у м е н т 2 > , ...,

<аргументи> — аргументы функции, разделяемые, по крайней мере, однимпробелом. Квадратные скобки в приведенной форме указывают на возмож-ное отсутствие находящихся между ними аргументов. Количество аргумен-тов зависит от синтаксиса функции. Существуют функции, которые вызы-ваются без аргументов. Алфавитный список функций AutoLISP приведенв приложении 5.

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

Page 56: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP S5_

Основное правило AutoLISP — баланс скобок, т. е. количество открываю-щих скобок должно быть равно количеству закрывающих. Иначе AutoCAD,обнаружив дисбаланс (например, если пользователь забыл ввести конечнуюскобку), выдаст об этом сообщение (рис. 2.2).

A V

М|

И ' < ' > I Hl\ Модель Л Лист! X ЛисггТ

iBbiSepume объектыКоманда (+ 223 75 16 002.89 899 РИС. 2.2. Сообщение1(_> _ о дисбалансе скобок

Для разрешения ситуации, изображенной на рис. 2.2, необходимо ввестизакрывающую скобку и нажать клавишу <Enter>. После этого вы получитерезультат вычисления. В интегрированной среде разработки Visual LISP (см.гл. 3) предусмотрены механизмы проверки скобок в файлах с текстамипрограмм.

В качестве любого аргумента функции может быть введено некоторое вы-числяемое выражение, ограниченное скобками, или символ AutoLISP(о символах см. разд. 2.2).

Выражения AutoLISP могут быть как простыми, так и составными, т. е. вних могут в качестве элементов использоваться другие выражения, причемразделяющими знаками в выражениях являются круглые скобки, пробелы идвойные кавычки (двойные кавычки должны ограничивать с двух сторонтекстовые константы — о текстовых или строковых константах см. разд. 2.2).Например:

( - ( + 5 6 . 0 2 2 7 8 . 1 1 ) ( + 1 2 3 . 7 7 7 8 . 0 ) )

Здесь имя функции (вычитание), которой переданы два аргумента в ви-де выражений, причем каждое из них является операцией сложения (т. к. вних использована функция +). Сначала интерпретатор AutoLISP вычислитвыражения во внутренних скобках (в нашем примере получатся результаты134.132 и 201.77), а затем подставит эти значения и вычислит выражение(- 134.132 201.77), что должно дать результат -67.638 (отрицательное число).

2.1.2. Функция setqИнтерпретатор AutoLISP вычисляет значение каждого введенного выраже-ния и возвращает его в среду AutoCAD. На рис. 2.1 видно, что возвращенозначение 329.651. Возвращаемое значение, в свою очередь, либо может бытьпередано для дальнейших вычислений в выражение более высокого уровня,

Page 57: Visual LISP и секреты адаптации AutoCAD

56 Visual LISP и секреты адаптации AutoCAD

как в последнем примере разд. 2.1.1 (аргументы функции верхнего уровнябыли вычисляемыми выражениями), либо может быть сохранено в перемен-ной (человеку, знакомому с программированием, ясно, что это — именован-ные участки памяти для хранения данных) с помощью функции присвоенияsetq, имеющей следующий синтаксис:

(setq <переменная1> <выражение1> [<переменная2> <выражение2> ...[<переменнаяЫ> <выражениеК1> ] ... ] )

Функция setq может использоваться с любым количеством аргументов, ко-торое должно быть обязательно четным и не менее двух. В качестве аргу-ментов <переменная1>, <переменная2> И Т. Д. МОГут ИСПОЛЬЗОВатьсЯ Любыесимволы (имена) AutoLISP, не занятые в наименованиях функций. О сим-волах речь пойдет в разд. 2.2. В качестве аргументов <выражение1>,<выражение2> и т. д. могут использоваться выражения AutoLISP, имена пе-ременных или константы (например, числа).

Функция setq — основное средство для сохранения значений, возвращае-мых другими выражениями. Пример:

( s e t q myd (- (+ 5 6 . 0 2 2 7 8 . 1 1 ) (+ 1 2 3 . 7 7 7 8 . 0 ) ) )

Значение выражения, которое вычислялось в разд. 2.1.2, будет сохранено впеременной myd.

В дальнейшем прочитать значение переменной myd можно с помощью опе-рации ! (восклицательный знак). Если в командной строке AutoCAD в ответна стандартную подсказку Команда: (Command:) ввести !myd, то AutoCADвыдаст текущее значение переменной myd (в нашем примере: 329.651).

2.1.3. КомментарииВ текст программы полезно вставлять комментарии, поясняющие, например,особенности алгоритма. Комментарием считается часть строки, начиная ссимвола; (точка с запятой), после которого не следует сразу же символ |(вертикальная черта), и кончая последним символом строки. Закомментиро-ванной может быть вся строка программы.

Если комментарий нужно вставить в середину строки, тогда началом ком-ментария должны быть символы ; |, а концом комментария — символы | ;(причем конец комментария может располагаться на другой строке).

; Закомментирована вся строка

(setq two_pi (+ pi pi)) ; Закомментирован конец строки

(setq md (+ 56.022;I внутренний

комментарий |;78.11))

(command "_CIRCLE" '(0 0) 50) ; рисование окружности

Page 58: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 57_

2.2. СимволыСимволы AutoLISP — это слова, состоящие из группы буквенно-цифровыхзнаков и являющиеся именами функций или переменных, используемыхдля хранения данных пользователя. В символах AutoLISP не должны ис-пользоваться разделители выражений, к которым относятся круглые скобки,пробелы и двойные кавычки, и служебные знаки — . (точка), , (запятая),; (точка с запятой), ' (апостроф), / (косая черта), \ (обратная косая черта).Написание символов не должно соответствовать написанию чисел (напри-мер, символ не должен состоять из одних цифр).

Зарезервированными являются символы, используемые как имена функций,а также некоторые обозначения констант (см. разд. 2.2.2). Полный переченьфункций языка AutoLISP приведен в приложении 5.

( Замечание ^ )В именах символов AutoLISP регистр (верхний или нижний) не имеет значения.ПОЭТОМУ setq, SETQ, SETq, Setq, sETQ Обозначают ОДНу И Ту Же фуНКЦИЮ setq.

2.2.1. Типы данныхAutoLISP работает с объектами следующих типов:

• целое число;

П вещественное число;

• строка;

П список;

• точечная пара;

• дескриптор файла;

• указатель функции, приложения;

• примитив AutoCAD;

• набор выбора;

• VLA-объект.

^амечгшиеТип символа может быть получен с помощью функции type (см. разд. 2.7.1).

Символам AutoLISP могут быть присвоены значения любых типов (этимязык AutoLISP выгодно отличается от языков высокого уровня типаFORTRAN). Пользователь в явном виде может задавать константы следую-щих типов: целые, вещественные, строковые и списковые.

Page 59: Visual LISP и секреты адаптации AutoCAD

58 Visual LISP и секреты адаптации AutoCAD

Целые числа могут быть как положительными, так и отрицательными илинулями. Диапазон допустимых значений — от —2,147,483,648 до +2,147,483,647(крайние значения включены в допустимые; запятые могут использоватьсякак разделители триад цифр).

( Замечание ~ )Функция g e t i n t , запрашивающая ввод целого числа, позволяет использоватьзначения только в диапазоне между -32 768 и +32 767. Аналогичный диапазонзначений целых чисел допускался в языке AutoLISP предыдущих версий.

К целым числам относятся слова, состоящие лишь из цифр. Кроме того,целые числа могут иметь знак (+ или -). Если пользователь пытается задатьцелое число, не лежащее между описанными выше предельными значения-ми, то вводимое значение преобразуется в вещественное.

Вещественные числа — это слова, которые состоят из цифр, содержат внутритолько одну десятичную точку. Могут иметь знак (+ или -). В состав веще-ственного числа может входить латинский символ е или Е С показателемстепени числа 10 (научная форма представления вещественных чисел). Ве-щественные числа не должны начинаться с десятичной точки (например,вместо .5 следует писать 0.5).

Строковые константы начинаются и заканчиваются кавычками (сами ка-вычки в длину константы не входят) и содержат внутри себя текст, которыйможет состоять из любых знаков, в т. ч. пробелов, скобок, апострофов. Осо-бо рассматривается знак \, который является служебным и предназначендля ввода в текстовую строку некоторых специальных знаков (например,кавычек и самого знака \). Константа "" считается строкой нулевой длины.В строковые константы могут входить управляющие знаки печати, напри-мер: \п — переход на новую строку, \t — символ табуляции.

Списковые константы — это списки, состоящие из постоянных элементовлюбого типа (списки, как и функции, открываются и закрываются круглы-ми скобками). Для того чтобы AutoCAD не вычислял выражение как функ-цию, постоянные списки предваряются апострофом перед открывающейскобкой.

Примеры констант:

° 57

° -100092

° 12.98207

"string(2) for printing"

"52\\_1" (первая косая черта является служебной, вторая — значащимсимволом; если распечатать такую строку, то получим 52\_i)

Page 60: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 59_

° ' ( 1 5 100 - 2 )

° ' ( " А а " " Б б " " В в " " Г г " "Дд" " Е е " )

° ' ( " П е р в ы й " 1 5 " o n l i n e " 9 0 . 2 2 " " )

Функция setq возвращает значение, совпадающее со значением выражения,присваиваемого последней переменной (<переменнаяы>), поэтому тип резуль-тата совпадает с типом этого выражения.

Есть функции, которые преобразуют значение из одного типа в другой(например, функции atoi, fix, float, rtos и др.). Эти функции рассматри-ваются в разд. 2.7.

2.2.2. Предопределенные символыК зарезервированным символам, значения которых пользователям не реко-мендуется изменять, помимо имен функций, относятся следующие:

• т — единственная логическая константа, имеющая значение "истина";

• nil — пустое значение (оно же в логических операциях играет роль изначения "ложь"); это значение не эквивалентно числу 0 или пустойстроке ("");

• pi — постоянная, равная отношению длины окружности к диаметру(3.14159...);

• pause — постоянная, позволяющая ввести паузу при работе командыAutoCAD (используется в функции command).

Представленные четыре символа называются еще предопределенными сим-волами.

ЗамечаниеФункциям, требующим в качестве аргумента логическое значение, вместо тможно передавать любое значение, отличное от n i l (например, число, строкуи т. д.).

2.2.3. ПеременныеДля хранения данных пользователь может вводить свои символы (пере-менные), не совпадающие по написанию с зарезервированными или ранеезанятыми. Создание новых переменных осуществляется с помощью функ-ции setq, например:

(setq rl 15.33 s24 9)

Здесь вводятся переменные r l и s24, получающие, соответственно, значения15.зз (вещественное) и 9 (целое). При этом к той части оперативной памя-

Page 61: Visual LISP и секреты адаптации AutoCAD

60 Visual LISP и секреты адаптации AutoCAD

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

( Замечание ^

В многодокументном режиме (когда в одном сеансе AutoCAD открыто несколь-ко рисунков) переменные одного рисунка обычно недоступны в другом рисунке.Для передачи требуется экспортировать переменные во внедокументное имен-ное пространство (см. разд. 2.17.33).

Переменные могут использоваться в любых выражениях, например:

( s e t q уу2 (+ 20.56 ууО) )

2.2.4. Функция loadВвод с клавиатуры выражений AutoLISP не всегда удобен, поэтому можнозаписать предварительно свои строки на языке AutoLISP в файл с расшире-нием lsp (текст располагается в файле произвольным образом построчно, необязательно каждое новое выражение начинать с новой строки; желательнозаканчивать строку на разделителе — пробеле или скобке), а затем загрузитьэтот файл с помощью функции load. Синтаксис функции следующий:

(load <файл> [<сообщение>])

Здесь <файл> — это строка с именем загружаемого файла, а <сообщение> —строка с текстом сообщения, которое нужно вывести, если загружаемыйфайл не будет обнаружен. Возвращаемое значение в случае удачной загруз-ки — результат последнего выражения или имя последней функции, если вфайле находятся определения функций (см. функцию defun). В случае, еслизагружаемый файл не найден, возвращается текст сообщения об ошибке.

Например:

(load "longwid.lsp" "Файл не найден")

Аргумент <сообщение> может быть опущен, в этом случае при ошибке за-грузки выдается стандартное сообщение AutoCAD. Аргумент <файл> обычносодержит имя файла, который ищется в соответствии с настройкой рабочегокаталога и путей поиска файлов поддержки (см. разд. 1.3). Однако можноуказывать И ПОЛНОе ИМЯ С Путем— Например, "f:/Dis/Progs/longwid.lsp"или "f :\\Dis\\Progs\\iongwid.isp". В качестве разделителя каталогов можетиспользоваться косая черта или обратная косая черта, но обратная чертадолжна обязательно удваиваться (см. замечание к текстовым константамв разд. 2.2.1).

Page 62: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 61_

Если расширение в имени файла опущено, то AutoCAD пытается выполнитьзагрузку, поочередно добавляя следующие расширения:

П vlx

• fas

• lsp

Расширение vlx соответствует файлам VLX-приложений, fas — компилиро-ванным LISP-файлам или файлам FAS-приложений, lsp — исходным LISP-файлам. Для непосредственного редактирования пользователю доступнытолько файлы с расширением lsp, т. к. файлы с расширениями vlx и fas неявляются текстовыми. О компилированных файлах (с расширением fas) ифайлах приложений (с расширениями fas и vlx) см. главу 3.

2.2.5. Функция vl-load-allСистема AutoCAD 2000 разрешает работу одновременно с несколькими от-крытыми документами (рисунками). Поэтому возникает проблема, загруженли файл с расширением lsp в конкретный рисунок. Функция load выполняетзагрузку только в текущий документ. Для того чтобы обеспечить загрузкуLISP-файла во все уже открытые и открываемые в данном сеансе AutoCADрисунки, следует пользоваться функцией vi-ioad-aii:

(vl- load-al l <файл>)

Аргумент <файл> — текстовая строка с именем файла (расширение файламожет быть тем же, что и у первого аргумента функции load). Возвращае-мого значения нет, если загрузка не выполнилась. Возвращается значение тв случае успешной загрузки.

См. также разд. 2.17.29.

2.3. Выполнение команд AutoCADиз AutoLISPОчень важной является функция command, которая имитирует ввод пользова-теля в командной строке AutoCAD с клавиатуры. Аналогичную роль играетфункция vi-cmdf (различия между ними разбираются в разд. 2.3.2).

2.3.1. Функция commandСинтаксис функции:

(command [ < п а р а м е т р 1 > [ < п а р а м е т р 2 > . . . [<параметрЫ>] . . . ] ] )

Возвращаемое значение — nil.

Page 63: Visual LISP и секреты адаптации AutoCAD

62 Visual LISP и секреты адаптации AutoCAD

Функция может вызываться без параметров — это равносильно нажатиюклавиши <Esc>, что прерывает действие активной команды. Если парамет-ры используются, то их количество может быть любым. Каждый из пара-метров чаще всего является текстовой строкой, имитирующей набор симво-лов строки на клавиатуре с нажатием клавиши <Enter>.

(~ Замечание ^Если в качестве параметров функции command передаются выраженияAutoLISP, то среди этих выражений не должны фигурировать функции интерак-тивного ввода ( g e t i n t , g e t r e a l , getpoint И Т. Д. — см. разд. 2.10). Если ука-занное ограничение было в программе нарушено, то результат операции непредсказуем. Следует вынести использование функций интерактивного вводаперед функцией command.

Предположим, нужно нарисовать отрезками рамку формата размером 210на 297 (левый нижний угол рамки взять в точке (0,0) и верхний правый —в точке (210,297)). Вспомним, что команда рисования отрезков в AutoCADназывается ОТРЕЗОК (LINE). Если вы не уверены, что ваша программа бу-дет работать на компьютере с русской версией AutoCAD, то используйтеанглийские имена команд с подчеркиванием (в данном случае — _LINE).С такими именами команды будут выполняться в любой версии системы.Если бы вы выполняли задачу без программы, то вводили с клавиатуры сле-дующие команды и опции:

• _LINE

П 0,0

• 210,0

• 210,297

• 0,297

По этим указаниям AutoCAD вызовет команду _LINE, возьмет в качествепервой точки (0,0), в качестве второй — (210,0), в качестве третьей —(210,297), в качестве четвертой — (0,297), а _с (соответствует опции Замк-нуть (Close)) замкнет отрезки на первую точку (опции тоже желательно вво-дить английские и с подчеркиванием). Программа, имитирующая описан-ный алгоритм, занимает одну строку и выглядит так, как показано в лис-тинге 2.1.

i Листинг 2.1. Построение прямоугольника (вариант 1) j

(command "_LINE" "0,0" "210,0" "210,297" "0,297" "_С")

Можно указанное построение выполнить в несколько строк (в несколькообращений К ФУНКЦИИ command).

Page 64: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 63_

\ Листинг 2.2. Построение прямоугольника (вариант 2) I

(command "_LINE" "0,0" "210,0")

(command "210,297" "0,297")

(command "_C")

В листинге 2.2 использовано трехкратное обращение к функции command,в каждом из которых количество параметров должно быть не меньше одного.

Можно координаты точек задавать не как строку, а как списки из двух чи-сел целого или вещественного типа (листинг 2.3).

\ Листинг 2.3. Построение прямоугольника (вариант 3) \

(command "__LINE" ' ( 0 0) ' (210 0) ' (210 297) ' (0 297) " _ С " )

Апостроф опускать нельзя, поскольку выражение (210 0) без апострофа бу-дет рассматриваться как обращение к функции 210 с аргументом о.

Там, где требуется ввод чисел, можно в качестве аргументов передаватьфункции command именно числа, а не-строки с числами, например: :

(command "_COLOR" "I")(command "_COLOR" 1)

Оба выражения выполняют одну и ту же операцию (в качестве текущегоустанавливают красный цвет, который имеет номер 1), но в первом случаеномер цвета задается как строка, а во втором — как целое число.

Можно в одной функции command обратиться сразу к нескольким командамсистемы AutoCAD, например:

(command "_COLOR" I "_ZOOM" " _ E " )

Эта программная строка выполнит команду ЦВЕТ (COLOR) для установкикрасного цвета и команду ПОКАЗАТЬ (ZOOM) с опцией ГРАНИЦЫ(EXTENTS).

Для имитации варианта, когда пользователь вместо ввода опции нажимаетклавишу <Enter>, в качестве параметра функции command выступает тексто-вая строка нулевой длины (""). Например, если бы вы в варианте, приве-денном в листинге 2.1, захотели завершить команду _LINE не опцией _с(замкнуть прямоугольник), а нажатием на клавишу <Enter> (не замыкатьпрямоугольник), то соответствующая программная строка выглядела бы так:

(command " _ L I N E " " 0 , 0 " " 2 1 0 , 0 " " 2 1 0 , 2 9 7 " " 0 , 2 9 7 " " " )

В приложениях 7, 9, 11, 12 приведены примеры функций, использующихвнутри себя функцию command.

Page 65: Visual LISP и секреты адаптации AutoCAD

64_ Visual LISP и секреты адаптации AutoCAD

2.3.2. Функция vl-cmdfФункция vl-cmdf имеет следующий синтаксис:

( v l - c m d f [ < п а р а м е т р 1 > [ < п а р а м е т р 2 > . . . [<параметрЫ>] . . . ] ] )

Аргументами могут быть любые выражения, которые нужно передать в ко-мандную строку AutoCAD (в т. ч. команды, опции команд, данные, выраже-ния AutoLISP и т. д.). В отличие от функции command, в качестве параметровфункции vl-cmdf могут фигурировать выражения AutoLISP, содержащиефункции интерактивного ввода (getint и т. п.).

Отсутствие аргументов функции равносильно нажатию пользователем кла-виши <Esc>.

Возвращаемое значение — т, если все выражения, переданные в команднуюстроку, выполнились без сбоев, и ni l — при обнаружении ошибок.

Основное отличие функции vl-cmdf от функции command заключается в том,что проверка выполнимости команд AutoCAD с заданными параметрамиосуществляется до реального начала их исполнения. И если обнаруживаетсякакая-то ошибка, то ни один из параметров функции vl-cmdf не выполня-ется системой AutoCAD, и генерируется сообщение об ошибке приложения.Это исключает возможность частичной работы любых команд AutoCAD(т. е. когда выполняются первые операции, а затем команда выдает сбой).

Функция command же передает параметры по одному в командную строку,и AutoCAD по одному пытается их выполнить.

В примерах, приведенных в листингах 2.1—2.3, функцию command можно бы-ло бы заменить на функцию vl-cmdf.

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

Для каждой функции указывается синтаксис, количество и типы аргумен-тов, а также тип возвращаемого значения.

2.4.1. Функция +Вычисляет сумму чисел.

(+ [<число1> [<число2> ... [<число№>] ... ]])

Типы аргументов: целые или вещественные числа.

Page 66: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 65_

Тип возвращаемого значения: целое, если все аргументы целые; веществен-ное, если хотя бы один аргумент является вещественным.

Если количество аргументов равно нулю, то возвращается о (целое). Есликоличество аргументов равно 1, то возвращается значение, равное значениюаргумента.

Примеры:

° ( + 1 3 ) возвращает 4

° ( + - 2 2 ) возвращает о

° (+ 12 7 11.00) возвращает зо.о

2.4.2. Функция -Вычисляет разность чисел.

(- [<число1> [<число2> . . . [<число1Я>] ... ] ] )

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если все аргументы целые; веществен-ное, если хотя бы один аргумент является вещественным.

Если аргументы не заданы, то возвращается о (целое). Если количество ар-гументов равно 1, то возвращается значение, вычитаемое из 0 (т. е. <число1>с противоположным знаком). Если количество аргументов равно 2 и более,то из первого числа вычитается сумма всех остальных.

Примеры:

° (-3) возвращает -з

° (- -2 i . i 0.3) возвращает-3.4

2.4.3. Функция *Вычисляет произведение чисел.

(* [<число1> [<число2> ... [<числоИ>] ...]])

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если все аргументы целые; веществен-ное, если хотя бы один аргумент является вещественным.

Если количество аргументов равно нулю, то возвращается о (целое). Есликоличество аргументов равно 1, то возвращается значение аргумента. Есликоличество аргументов равно 2 и более, то выполняется перемножение всехаргументов.

Примеры:

° (* 3) возвращает з

° (* -2 1.1 0.3) возвращает-о.бб

3 Зак. 155

Page 67: Visual LISP и секреты адаптации AutoCAD

66 Visual LISP и секреты адаптации AutoCAD

( Замечание }При перемножении больших целых чисел следует учитывать, что произведениеможет выйти за границы допустимых значений и функция выдаст непред-сказуемый результат. Так, выражение (* 12345 987654) вернет значение-692313258, что заведомо не может быть правильным, т. к. произведение по-ложительных чисел должно быть положительным. В таких случаях числа сле-дует перемножать в вещественном виде.

2.4.4. Функция /Вычисляет частное чисел.

(/ [<число1> [<число2> ... [<число№>] ... ]])

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если все аргументы целые; веществен-ное, если хотя бы один аргумент является вещественным.

Если количество аргументов равно нулю, то возвращается о (целое). Есликоличество аргументов равно 1, то возвращается значение аргумента. Есликоличество аргументов равно 2 и более, то выполняется деление первогоаргумента на произведение всех остальных.

Примеры:

° (/ 3) возвращает з

° (/-2 1.10.3) возвращает -6.06061 (реальный результат будет полученс максимальной точностью, но на экран обычно выводятся шесть знача-щих цифр)

а {/ 5 12) возвращает о

( З а м е ч а н и е ^При делении целых чисел результат должен быть того же типа, что и аргумен-ты, т. е. целым, поэтому он усекается до целого (путем отбрасывания дробнойчасти). Этим объясняется, что выражение (/ 5 12) возвращает значение 0.

2.4.5. Функция 1+Увеличивает аргумент на 1.

(1+ <число>)

Тип аргумента: целое или вещественное число.

Тип возвращаемого значения: целое, если аргумент целый; вещественное,если аргумент является вещественным.

Page 68: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 67_

Примеры:

° (1+3) возвращает 4

° ( l + l . i ) возвращает 2.1

2.4.6. Функция 1-Уменьшает аргумент на I.

( 1 - <число>)

Тип аргумента: целое или вещественное число.

Тип возвращаемого значения: целое, если аргумент целый; вещественное,если аргумент является вещественным.

Примеры:

° (1-3) возвращает г

° ( l - i . i ) возвращает о. 1

2.4.7. Функция ~Вычисляет дополнение числа до —1 (т. е. сумма возвращаемого значенияфункции и аргумента <число> равна —1).

(~ <число>)

Тип аргумента: целое число.

Тип возвращаемого значения: целое.

Примеры:

° (~ 3) возвращает -4

° (~ 0) возвращает -i

2.4.8. Функция absВычисляет абсолютную величину числа.

(abs <число>)

Тип аргумента: целое или вещественное число.

Тип возвращаемого значения: целое, если аргумент целый; вещественное,если аргумент является вещественным.

Примеры:

(abs 3) возвращает з

° (abs -1.1) возвращает 1.1

Page 69: Visual LISP и секреты адаптации AutoCAD

68 Visual LISP и секреты адаптации AutoCAD

2.5. Логические функцииВ следующих разделах рассматриваются функции логических и условныхопераций и проверок. Здесь же приводятся функции while и repeat, позво-ляющие организовывать циклы.

2.5.1. Функция =Проверяет равенство аргументов (рекомендуется использовать для чисел илистрок).

(= <аргумент1> [<аргумент2> ... [<аргументЫ>]...])

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значения аргументов сов-пали, и nil, если не совпали).

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

Примеры:

° {= -ю.о -ю -ю.ооо) возвращает т

° (=3) возвращает т

° (= 80 "80") возвращает nil

° (=2 30) возвращает nil

° (= "STR56" "str56" Mstr56") возвращает nil

° (= "abcde" "abcde") возвращает Т

См. также функции eq и equal в разд.2.5.19 и 2.5.20.

2.5.2. Функция /=Проверяет неравенство аргументов (рекомендуется использовать для чиселили строк).

(/= <аргумент1> [<аргумент2> ... [<apryMeHTN>]...])

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значения каких-то аргу-ментов не совпали, и nil, если совпади). Если задан только один аргумент,то возвращается т.

Page 70: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 69_

Примеры:

° (/= 3) возвращает т

° (/= -1.0 -1) возвращает ni l

° (/= 2 30) возвращает т

° (/= "STR56" "str56" "str56") возвращает т

° (/= "abcde" "abcde") возвращает ni l

2.5.3. Функция <Проверяет расположение аргументов по возрастанию, слева направо.

(< <аргумент1> [<аргумент2> . . . [<аргумент1>3>] . . . ] )

Типы аргументов: числа (целые, вещественные) или строки.

Тип возвращаемого значения: логическое (т, если значения аргументов рас-положены по возрастанию, и ni l — в противном случае). Для текстовыхстрок производится посимвольное сравнение, по возрастанию кодов сим-волов1.

Если задан только один аргумент, то возвращается т.

Примеры:

° (< 3) возвращает т

° (< ~1.о 0) возвращает т

° (< 2 2 30) возвращает ni l

° (< "а" "Ь" "к") возвращает тп (< "abcde" "abcde") возвращает ni l

° (< "q" "qa") возвращает т

° (< "qa" "q") возвращает ni l

2.5.4. Функция <=Проверяет расположение аргументов по неубыванию, слева направо.

(<= <аргумент1> [<аргумент2> ... [<аргументЫ>]...])

Типы аргументов: числа (целые, вещественные) или строки.

Тип возвращаемого значения: логическое (т, если значения аргументов рас-положены по неубыванию, и ni l — в противном случае). Для текстовых

1 В данном случае имеются в виду символы кодовой таблицы, т. е. один символ — одинзнак. — Ред.

Page 71: Visual LISP и секреты адаптации AutoCAD

70 Visual LISP и секреты адаптации AutoCAD

строк производится посимвольное сравнение, по неубыванию кодов сим-волов.

Если задан только один аргумент, то возвращается т.

Примеры:п (<= 3) возвращает т

° (<= -1.0 0) возвращает т

° (<= 2 2 30) возвращает т

° {<= "а" "Ь" "к") возвращает т0 (<= "abcde" "abcde") Возвращает Т

D ( < = ,.q.- »qa") возвращаетт

° {<= "qa" "q") возвращает ni l

2.5.5. Функция >Проверяет расположение аргументов по убыванию, слева направо.

(> <аргумент1> [<аргумент2> ... [<аргументЫ>]...])

Типы аргументов: числа (целые, вещественные) или строки.

Тип возвращаемого значения: логическое (т, если значения аргументов рас-положены по убыванию, и nil — в противном случае). Для текстовых строкпроизводится посимвольное сравнение, по убыванию кодов символов.

Если задан только один аргумент, то возвращается т.

Примеры:

° (> 3) возвращает тп (> -1.0 0) возвращает nil

° (> 2 2 30) возвращает nil

п (> „

а„ „

ь„ „

k,,j возвращает nil

° (> "abcde" "abcde") возвращает n i l

D ( > иди " q a . i) возвращает n i l

° (> "qa" "q") возвращает т

2.5.6. Функция >=Проверяет расположение аргументов по невозрастанию, слева направо.

(>= <аргумент1> [<аргумент2> . . . [<аргумент№>].. .])

Типы аргументов: числа (целые, вещественные) или строки.

Page 72: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 71_

Тип возвращаемого значения: логическое (т, если значения аргументов рас-положены по невозрастанию, и ni l — в противном случае). Для текстовыхстрок производится посимвольное сравнение, по невозрастанию кодов сим-волов.

Если задан только один аргумент, то возвращается т.

Примеры:

° (>= 3) возвращает т

(>-- -1.0 0) возвращает ni l

° (>= 2 2 30) возвращает nil

о (>= »а" "b" "к") возвращает nilа (>= "abcde" "abcde") возвращает Т

а ( > = „q., ..q a") возвращает nil

о (>= " q a " "q") возвращает т

2.5.7. Функция andВыполняет операцию логического И.

(and [<аргумент1> [<аргумент2> . . . [<аргументМ>] ...-]])

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значения всех аргументовистинны, и ni l — в противном случае). К истинным, помимо т, относятсявсе значения (числовые, строковые и т. д.), кроме nil.

Если аргументы не заданы или задан только один аргумент, то возвращается т.

Примеры:

° (and 3) возвращает т

° (and т nil т) возвращает nil

° (and т т 2) возвращает т

° (and "a" "b" "к") возвращает т

2.5.8. Функция orВыполняет операцию логического ИЛИ.

(or [<аргумент1> [<аргумент2> . . . [<а.ргументЫ>] ...]])

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значение хотя бы одногоаргумента истинно, и nil — в противном случае). К истинным, помимо т,относятся все значения (числовые, строковые и т. д.), кроме nil.

Page 73: Visual LISP и секреты адаптации AutoCAD

72 Visual LISP и секреты адаптации AutoCAD

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

Примеры:п (or 3) возвращает т

° (or т ni l т) возвращает тn (or т т 2) возвращает т• (ОГ „а„ „ь„ „k,,j возвращает та (or nil nil) возвращает nil

2.5.9. Функция notВыполняет операцию логического отрицания.

(not <аргумент>)

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значение аргумента равноnil, и ni l — в противном случае).

Примеры:

° (not T) возвращает nil

° (not nil) возвращает тD (not 15.88) возвращает nil

° (not "Tram") возвращает nil

2.5.10. Функция nullВыполняет операцию проверки на nil.

(null <аргумент>)

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значение аргумента равноnil, и ni l — в противном случае).

Фактически идентична функции not. Традиционно функция null употреб-ляется для проверки непустоты списков (поскольку пустой список • о иден-тичен nil), a not — для аргументов других типов.

Примеры:

° (null т) возвращает nilа (null nil) возвращает т

° (null '()) возвращает?

° (null "Tram") возвращает nil

Page 74: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP . 73_

2.5.11. Функция ifВыполняет условную операцию типа if-then-else (если-то-иначе).

(if <условие> <выражение1> [<выражение2>])

Типы аргументов: любые.

Возвращаемое значение: вычисленное значение аргумента <выражение1>,если значение аргумента <условие> отлично от ni l (напомню, что ni l влогических операциях используется как "ложь"); значение аргумента<выражение2>, если значение аргумента <условие> равно nil (причем когда<выражение2> опущено, тогда возвращается nil). Используется как условныйоператор.

Примеры:

° (if (> а ь) 1 Ю) возвращает 1, если а>ь, и ю — в других случаях

° (if (= hi h2) (+ ы 15) (* hi 2.5)) возвращает результат вычислениявыражения (+ hi 15), если значения hi и h2 равны; иначе— результатвычисления выражения (* hi 2.5)

0 (if (< a b) "a<b") возвращает строку "a<b" ИЛИ nil (т. К. <выражение2>опущено)

° (if n i l "Point") возвращает ni l (т. к. <усповие> всегда ложно)

Если функция if используется для обработки по условию не одного выра-жения, а нескольких, то эти выражения следует объединить с помощью рас-сматриваемой в следующем разделе функции progn (иначе произойдет син-таксическая ошибка, вызванная неправильным количеством аргументов приобращении к функции if).

2.5.12. Функция ргодпОбъединяет несколько (не менее двух) выражений в одно, когда по синтак-сису AutoLISP может использоваться только одно (как в функции if).

(progn <выражение1> <выражение2> ... [<выражение"Ы>])

Типы аргументов: любые.

Рассмотрим использование функции progn на таком примере. Пусть привыполнении условия (> а Ь) нужно вычислить выражения (setq с -1),(setq d (- с a b)) и (* d b), а при невыполнении условия — рассчитатьвыражения (setq с 2), (setq d (* а Ъ) ) И (* d с) .

1 Листинг 2.4. Пример совместного использования функций if и progn i

(if (> a b)

(progn

Page 75: Visual LISP и секреты адаптации AutoCAD

74 Visual LISP и секреты адаптации AutoCAD

(setq с -1)

(setq d ( - c a b ) )

(* d b)

); конец progn

(progn

(setq с 2)

(setq d (* a b) )

(* d c)

); конец progn

); конец if

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

2.5.13. Функция condУсловная операция (типа case в языках -программирования высокого уров-ня) с любым количеством условий.

( c o n d ( < у с л о в и е 1 > [ < в ы р а ж е н и е 1 > . . . ] ) [ ( < у с л о в и е 2 > [ < в ы р а ж е н и е 2 > . . . ] ) ] . . . )

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

Возвращаемое значение: последнее вычисленное выражение последнегосписка. Если вычисляемое выражение отсутствует (не задано в последнемсписке), то возвращается результат вычисления последнего аргумента<условие>. Если аргументы функции cond не заданы, то возвращается nil .

Примеры:

° (cond) возвращает ni l

° (cond (14)) возвращает 14

Впрочем, использование функции cond с неполным количеством аргументовне имеет особого смысла.

Рассмотрим задачу: переменной mycoior нужно присвоить текстовое значе-ние с наименованием одного из основных цветов AutoCAD ("красный","желтый", "зеленый", "голубой", "синий") в зависимости от текущего значенияпеременной ее, которая принимает значения 1, 2, 3, 4, 5. Если значение пе-ременной ее оказалось отличным от перечисленных, то переменной mycoiorнужно присвоить "" (пустая строка).

Page 76: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 75_

; Листинг 2.5. Пример 1 использования функции cond ;

(setq mycolor(cond

((= ее 1) "красный")((= ее 2) "желтый")( (= се 3) "зеленый")( (= ее 4) "голубой")( (= се 5) "синий")(Т "")

); конец cond

); конец setq

Функция setq присваивает переменной mycolor результат вычисления функ-ции cond. Значение, возвращаемое функцией cond, вычисляется по следую-щей схеме. Сначала рассматривается список, заданный в качестве первогоаргумента— ((= ее 1) "красный") — и проверяется условие, являющеесяпервым элементом этого списка. Если оказалось, что значение ее равно 1 и,значит, первое условие возвращает "истину", то дальнейшее рассмотрениеаргументов функции cond не выполняется, а в качестве возвращаемого зна-чения принимается "красный". Если первое условие не вычислилось как"истина", то проверяется второе условие и т. д. В качестве последнего, шес-того, условия стоит т (т. е. "истина" при любых значениях), поэтому еслизначение переменной се не совпало с 1, 2, 3, 4, 5, то в качестве возвращае-мого значения функции cond будет принято (пустая строка).

Еще один пример иллюстрирует случай, когда по истинности значения ар-гумента <условие> выполняются несколько операторов.

| Листинг 2.6. Пример 2 использования функции cond ;

(cond((= ее 1) ( s e t q abc "красный")

(command "_PLINE" " - 5 0 , 1 2 0 . 4 5 " "97 .66,23 .124" " 4 5 . 7 , 8 0 0 ""_C")

) ; = cc 1((= cc 2) ( s e t q abc "желтый")

(command "_CIRCLE" " - 5 0 , 1 2 0 . 4 5 " "100")) ; = cc 2

); конец cond

В этом примере функция cond проверяет значение переменной ее. Если оноравно 1, то функция setq присваивает переменной abc значение "красный",а затем AutoCAD рисует замкнутую полилинию с тремя вершинами. Еслизначение се равно 2, то функция setq присваивает переменной abc значение"желтый", a AutoCAD рисует окружность радиуса 100. Если окажется, что

Page 77: Visual LISP и секреты адаптации AutoCAD

76 Visual LISP и секреты адаптации AutoCAD

значение ее не равно ни 1, ни 2, то функция cond вернет nil, не изменяяпри этом значения переменной abc и не строя никаких новых примитивовAutoCAD. Поскольку функция command является последним выражением какв первом, так и во втором условиях функции cond, то во всех трех случаяхбудет возвращено значение nil (nil является возвращаемым значениемфункции command — см. разд. 2.3.1). Однако в данном примере функция condприменена не ради возвращаемого значения, а для изменения значения пе-ременной abc и построения дополнительной полилинии или окружности.

2.5.14. Функция minuspПроверка числа на отрицательность.

(minusp <число>)

Тип аргумента: целое или вещественное число.

Возвращаемое значение: т, если <число> отрицательно, и ni l — в противномслучае.

Примеры:

° (minusp 0) возвращает nil

° (minusp -7.1230) возвращает т

° (minusp (- 52 24 39)) возвращает т

2.5.15. Функция zeropПроверка числа на нуль.

(zerop <число>)

Тип аргумента: целое или вещественное число.

Возвращаемое значение: т, если <число> равно нулю, и ni l — в противномслучае.

Примеры:n (zerop 0) возвращает т

° (zerop о.О) возвращает т

° (zerop 1) возвращает nil

° (zerop -21.82) возвращает nil

2.5.16. Функция numberpПроверка типа аргумента на число.

(numberp <аргумент>)

Page 78: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 77_

Тип аргумента: любой.

Возвращаемое значение: т, если <аргумент> является вещественным или це-лым числом, и n i l — в противном случае.

Примеры:

° (numberp 0) возвращает т

° (nuirberp -ю.о) возвращает т

° (numberp "1") возвращает n i lп (numberp ' (-21.82)) возвращает n i l (список из одного числа уже не от-

носится к числам)

2.5.17. Функция listpПроверка типа аргумента на список.

(listp <аргумент>)

Тип аргумента: любой.

Возвращаемое значение: т, если <аргумент> является списком или nil (т. к.пустой список ' о вырождается в nil), и ni l — в противном случае.

Примеры:

° (l istp 0) возвращает n i l

о (l istp -ю.о) возвращает n i l

° (l istp "1") возвращает n i l

° (l istp '(-21.82)) возвращает т

° (listp nil) возвращает т

2.5.18. Функция vl-conspПроверяет, является ли <аргумент> непустым списком или непустой точеч-ной парой (сравните с функцией listp).

(vl-consp <аргумент>)

Возвращаемое значение — т или nil.

Примеры:

° (vl-consp '(15.0 66.109)) возвращает т

° (vl-consp ' ( ) ) возвращает n i l

° (vl-consp 50) возвращает n i l

Page 79: Visual LISP и секреты адаптации AutoCAD

78 Visual LISP и секреты адаптации AutoCAD

2.5.19. Функция atomПроверяет, является ли <аргумент> атомом (т. е. не списком).

(atom <аргумент>)

Возвращаемое значение — т или nil.

Примеры:

° (atom nil) возвращает т

° (atom '(12 3)) возвращает nil

° (atom '()) возвращает т

° (atom i) возвращает т

2.5.20. Функция vl-symbolpПроверяет, является ли <аргумент> символом.

(vl-symbolp <аргумент>)

Возвращаемое значение — т или nil.

Примеры:

° (vl-symbolp т) возвращает т

° (vi-symboip nil) возвращает nil

° (vi-symboip i) возвращает nil

° (vl-symbolp ч-) возвращает т

2.5.21. Функция boundpПроверка, присвоено ли значение символу.

(boundp <аргумент>)

Тип аргумента: любой.

Возвращаемое значение: т, если <аргумент> указывает на символ, имеющийзначение (но не nil), и n i l , если значение не задано или равно n i l (дляAutoLISP это одно и то же). Для указания на имя функции его следуетпредварять апострофом.

Примеры: *а (boundp '+) возвращает?

° (boundp 'and) возвращает т

° (boundp "1") возвращает nil

Page 80: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 79_

2.5.22. Функция eqПроверяет равенство двух аргументов (аналогична функции =).

(eq <аргумент1> <аргумент2>)

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если значения аргументов сов-пали, и ni l , если не совпали).

Примеры:

° (eq -ю.о -Ю) возвращает т

° (eq о 3) возвращает n i lD (eq "g80" "g80") Возвращает Т

° (eq "abc" "ABC") возвращает ni l

2.5.23. Функция equalПроверяет равенство двух объектов (для чисел и списков из числовых вели-чин сравнение производится в пределах допуска).

(equal <аргумент1> <аргумент2> [<допуск>])

Типы аргументов: любые.

Тип возвращаемого значения: логическое (т, если абсолютная величина раз-ности аргументов не превосходит значения аргумента <допуск>, и nil, еслине совпали; когда <допуск> не задан, то его значение считается равным ну-лю). Для аргументов, не являющихся числами или списками из чисел,<допуск> не используется.

Примеры:

° (equal -Ю.о -Ю) возвращает т

° (equal з.ооо 3.002 0.002) возвращает тп (equal "font" "font") возвращает т

° ( e q u a l ' ( 1 . 0 0 2 . 1 3 2 . 9 9 ) ' ( 1 2 . 1 3 3 . 0 ) 0 . 1 ) в о з в р а щ а е т Т

° ( e q u a l ' ( 1 . 0 0 2 . 1 3 2 . 9 9 ) ' ( 1 2 . 1 3 з . О ) o . o o o i ) в о з в р а щ а е т n i l

2.5.24. Функция whileВыполняет операцию цикла по многократно проверяемому условию.

(while <условие> <выражение1> [<выражение2> . . . [<выражениеН>]...])

Типы аргументов: любые.

Page 81: Visual LISP и секреты адаптации AutoCAD

80 Visual LISP и секреты адаптации AutoCAD

Функция while прекратит свою работу, когда на некотором шаге аргумент<условие> получит значение nil. При неудачном задании цикл, организуе-мый с помощью функции while, может оказаться бесконечным.

Возвращаемое значение: значение аргумента <выражениеы>, когда последнеевычисление аргумента <условие> выдало значение, отличное от nil. Еслиуже на первом шаге <условие> имеет значение nil, то функция while воз-вращает n i l .

Рассмотрим следующий пример. Пусть надо вычислить значение п! (фак-ториал), т. е. произведение целых чисел от 1 до п. В данном подразделе вос-клицательный знак используется как знак функции факториала.

i Листинг 2.7. Пример использования функции while (вычисление факториала) \

(setq i I factorial 1)

(while (< i n)

(setq i (1+ i) )

(setq factorial (* factorial i))

}; конец while

Рассмотрим работу примера, когда число п равно 11 (т. е. вычисляется 11!).

В программе используются переменные i (является счетчиком цикла) иfactorial (накапливает произведение чисел, формирующее факториал). Пе-ред входом в цикл они получают начальные значения — соответственно, 1 и1 (по определению 1! считается равным 1).

Функция while проверяет условие (< i п) для текущего значения i, и еслирезультат вычисления условия отличен от nil, то выполняет внутренниеоперации (две операции с участием функции setq). Таким образом, припервом входе в цикл i равно 1, проверяемое условие (< i n) возвращаетзначение т ("истина") и функция while увеличивает i на 1 (получается i=2)и умножает переменную factorial на i: factoriai=i*2 (не что иное, как 2!).

Далее снова передается управление на вход в цикл (уже при i=2). Проверкаусловия опять дает результат "истина", поэтому i получает значение 3 (2+1),a factorial — 6 (2*3). И так далее, пока i не станет равным п (11) и про-грамма покинет цикл, не выполняя внутренних операций. Результат: приn=ii factoriai=39,9i6,800 (запятые разделяют триады цифр).

2.5.25. Функция repeatВыполняет операцию цикла с фиксированным количеством повторений.

(repeat <количество> [<выражение1> . . . ] )

Типы аргументов: <количество> — целое число (имеют смысл только по-ложительные числа), <выражение1> — любое выражение. После аргумента

Page 82: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 81_

<выражение1> могут идти другие выражения, которые нужно выполнитьвнутри цикла.

Возвращаемое значение: значение последнего вычисленного выражения.Если <количество> имеет значение 0 или отрицательно или после аргумента<количество> не заданы выражения, то функция repeat возвращает nil.

Переработаем предыдущий пример (см. листинг 2.7) — вместо while вос-пользуемся функцией repeat.

Листинг 2.8. Пример использования функции repeat(вычисление факториала)

(setq i I factorial 1)(repeat (1- n)

(setq i (1+ i))(setq factorial (* factorial i))

); конец repeat

Поскольку входные значения i=i и factoriai=i!=i, то остается умножитьfactorial на 2, 3, ..., п. Количество таких умножений равно п-i, что на язы-ке AutoLISP записывается как (i-п). Остальное работает, как в предыдущемпримере.

2.6. Функции вычисленийВычислительные функции также достаточно широко представлены в языкеAutoLISP.

2.6.1. Функция fixВыполняет операцию усечения числа до целого (отбрасывается дробная часть).

(fix <число>)

Тип аргумента: целое или вещественное число.

Тип возвращаемого значения: целое.

Примеры:

° (fix -10.083) возвращает-10

° (fix 37) возвращает 37

° (fix 0.0) возвращает о

° (fix 40.45) возвращает 40

Page 83: Visual LISP и секреты адаптации AutoCAD

82_ Visual LISP и секреты адаптации AutoCAD

2.6.2. Функция remПолучение остатка от деления аргумента <число1> на <число2>, затем остаткаот деления результата на <числоЗ> и т. д.

( r e m [ < ч и с л о 1 > [ < ч и с л о 2 > . . . [ < ч и с л о Ы > ] . . . ] ] )

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если все аргументы целые, и вещест-венное, если хотя бы один из аргументов вещественный.

Если аргументы не заданы, то возвращается о. Если задан только' аргумент<число1>, то возвращается его значение.

Примеры:

° (rem) возвращает о

° (rem 7) возвращает 7

° (rem 14 2) возвращает о

° (rem 15 6.0) возвращает з.о

° (rem 12.9 3.5) возвращает 2.4

о (rem so 17 3) возвращает 1

° (rem -ю -3) возвращает-1

° (rem ю -3) возвращает i

° (rem -10 3) возвращает - i

В приложении 6 приводится функция ending, которая использует функ-цию rem в операции согласования окончания слова с сопутствующим числи-тельным.

2.6.3. Функция maxОпределение максимального из чисел.

(max [<число1> [<число2> ... [<числоЫ>] ... ]])

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если все аргументы целые, и вещест-венное, если хотя бы один из аргументов вещественный.

Если аргументы не заданы, то возвращается о. Если задан только один аргу-мент <число1>, то возвращается его значение.

Примеры:D (max о -2 -12) возвращает о

° (max 7 3.4 2.0092) возвращает 7. 0

Page 84: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 83_

2.6.4. Функция minОпределение минимального из чисел.

(min [<число1> [<число2> ... [<числоЫ>] ... ]])

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если все аргументы целые, и вещест-венное, если хотя бы один из аргументов вещественный.

Если аргументы не заданы, то возвращается 0. Если задан только аргумент<число1>, то возвращается его значение.

Примеры:

° (min о -2 -12) возвращает -12

° (mir; 7 3 .4 2 . 0 0 9 2 ) в о з в р а щ а е т 2 . 0 0 9 2

2.6.5. Функция gcdВычисление наибольшего общего делителя для двух положительных целыхчисел.

(gcd <число1> <число2>)

Типы аргументов: целые.числа.

Тип возвращаемого значения: целое.

Примеры:

° (gcd 42 12) возвращает б

° (gcd 7 34) возвращает 1

2.6.6. Функция angleВычисление угла между осью X текущей системы координат и вектором,идущим из первой точки, заданной аргументом <точка1>, во вторую точку,заданную аргументом <точка2>. Если точки трехмерные, то функция вычис-ляет угол между осью X и проекцией вектора, идущего из первой точки вовторую, на текущую плоскость построений.

(angle <точка1> <точка2>)

Типы аргументов: списки из двух или трех чисел (т. е. дву- или трехмерныеточки).

Возвращаемое значение — угол в радианах.

Примеры:

° (angle ' (0 0) '(250.0 о.о)) возвращает о.о

° (angle ' ( loo 0) ' ( loo юо.О)) возвращает 1.5708 (AutoCAD показываетна экране в качестве возвращаемого значения 1.5708, но на самом деле

Page 85: Visual LISP и секреты адаптации AutoCAD

84_ Visual LISP и секреты адаптации AutoCAD

результат будет с максимально возможной точностью — 15 знаков последесятичной точки)

° ( a n g l e ' ( О 0 ) ' ( 5 0 . 0 5 0 . 0 ) ) в о з в р а щ а е т 0 . 7 8 5 3 9 8

2.6.7. Функция distanceВычисление расстояния между первой точкой, заданной аргументом <точка1>,и второй точкой, заданной аргументом <точка2>. Если точки трехмерные, тофункция вычисляет угол между осью X и проекцией вектора, идущего изпервой точки во вторую точку, на текущую плоскость построений.

(distance <точка.1> <точка2>)

Типы аргументов: списки из двух или трех чисел (т. е. дву- или трехмерныеточки).

Возвращаемое значение — угол в радианах. Если обе точки или хотя бы од-на из них двумерная (третья координата оставшейся точки игнорируется), товозвращается двумерное расстояние между точками. Если обе точки трех-мерные, то вычисляется расстояние в трехмерном пространстве.

Примеры:D ( d i s t a n c e ' ( 0 0 ) ' ( 2 5 0 . 0 0 . 0 ) ) В о з в р а щ а е т 2 5 0 . 0

° ( d i s t a n c e ' ( - 1 . 0 0 . 4 1 3 2 . 0 0 2 ) ' ( 2 5 . 1 3 4 . 5 6 . 0 ) ) в о з в р а щ а е т 4 3 . 1 1 7 5

2.6.8. Функция sqrtВычисление квадратного корня.

(sqrt <число>)

Тип аргумента: неотрицательное целое или вещественное число.

Возвращаемое значение — вещественное число.

Примеры:

° (sqrt 25) возвращает 5.0

° (sqrt 1.88) возвращает 1.37ИЗ

2.6.9. Функция sinВычисление синуса угла.

(sin <число>)

Тип аргумента: целое или вещественное число (угол в радианах).

Возвращаемое значение — вещественное число.

Page 86: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP

Примеры:в (sin -1) возвращает-0.841471

° (sin о.О) возвращает о.о

2.6.10. Функция cosВычисление косинуса угла.

(cos <число>)

Тип аргумента: целое или вещественное число (угол в радианах).

Возвращаемое значение — вещественное число.

Примеры:

° (cos -l) возвращает 0.540302

° (cos 0.0) возвращает l.o

° (cos (* pi 0.5)) возвращает б. 123ОЗе-оп (практически 0)

2.6.11. Функция atariВычисление арктангенса.

(atan <число1> [<число2>])

Тип аргумента: целое или вещественное число.

Возвращаемое значение — вещественное число (угол в радианах).

Если второй аргумент опущен, то вычисляется арктангенс аргумента <число1>.Если заданы оба аргумента, то вычисляется арктангенс частного от деленияпервого аргумента на второй (<число1>/<число2>). Если <число2> равно нулю,то возвращается угол +pi/2 или -pi/2 (знак выбирается по знаку аргумента<число1>).

Примеры:

° (atan 1) Возвращает 0.785398

о (atan -1 0) ВОЗВращаеТ -1.5708

2.6.12. Функция ехрВычисление натурального антилогарифма — результата возведения в сте-пень постоянной е (2.71828).

(ехр <число>)

Тип аргумента: целое или вещественное число.

Возвращаемое значение — вещественное число.

Page 87: Visual LISP и секреты адаптации AutoCAD

Visual LISP и секреты адаптации AutoCAD

Примеры:0 (exp 1) Возвращает 2.71828

° (exp o.o) возвращает i . о

° (exp pi) возвращает 23.1407

2.6.13. Функция exptВозведение числа в степень.

(expt <основание> <степень>)

Типы аргументов: целые или вещественные числа.

Тип возвращаемого значения: целое, если оба аргумента целые, и вещест-венное, если хотя бы один аргумент — вещественное число. Если <степень>не является целым числом, то <основание> должно быть положительным.

Примеры:

° (expt 2 2) возвращает 4

° (expt -2 2.0) возвращает 4.о

° (expt 4 -1) возвращает о (оба аргумента целые)

° (expt 2 -1.0) возвращает о. 5

° (expt -1 -1.0) возвращает-1. о

2.6.14. Функция logВычисление натурального логарифма.

(log <число>)

Тип аргумента: положительное целое или вещественное число.

Тип возвращаемого значения: вещественное число.

Примеры:п (log 1) возвращает о. оD (log 2.205) возвращает 0.790728

2.6.15. Функция logandВычисление побитового И для списка целых чисел.

( l o g a n d [ < ч и с л о 1 > [ < ч и с л о 2 > . . . [ < ч и с л о Ы > ] . . . ] ] )

Тип аргументов: целые числа.

Тип возвращаемого значения: целое число.

Page 88: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP

Побитовое И работает следующим образом. Каждое целое число может бытьпредставлено в двоичном виде (иначе говоря, в виде суммы степеней чис-ла 2, в которой перед степенью 2 стоит множитель 0 или 1; показатель степе-ни в данной сумме может быть от 0 до 30). Например: 5 = 1х20+0х2'+1х22 == 1012, 3 = 1х2°+1х2> = 112.

31-й (старший) разряд в таком представлении отводится под знак (минусусоответствует 1, плюсу — 0). После перевода всех чисел в двоичное пред-ставление, выполняется поразрядная (побитовая) операция И по следующе-му правилу:

(logand 0 0)= (logand 10)= (logand 0 1) = 0; (logand 11) - 1

Если аргументы не заданы, то возвращается о. Если задан только один аргу-мент <число1>, то возвращается его значение.

Примеры:

° (logand з 5) возвращает 1

° (logand 2) возвращает 2

° (logand) возвращает о

2.6.16. Функция logiorВычисление побитового ИЛИ для списка целых чисел.

(logior [<число1> [<число2> . . . [<числоК!>] ...]])

Тип аргументов: положительные целые числа.

Тип возвращаемого значения: целое число.

Побитовое ИЛИ работает по следующему правилу:

(logior 10)= (logior 0 1)= (logior 11)= 1; (logior 0 0) = 0

Если аргументы не заданы, то возвращается о. Если задан только один аргу-мент, то возвращается <число1>.

Примеры:a (logior з 5) возвращает 7

° (logior 2) возвращает 2

2.6.17. Функция IshВычисление побитового сдвига целого числа.

(Ish [<число> [<сдвиг>]])

Тип аргументов: целые числа.

Тип возвращаемого значения: целое число.

Page 89: Visual LISP и секреты адаптации AutoCAD

88 Visual LISP и секреты адаптации AutoCAD

Побитовый сдвиг выполняется для двоичного представления чисел (о дво-ичном представлении см. разд. 2.6.15). Побитовый сдвиг выполняется влево,если <сдвиг> положителен, и вправо, если <сдвиг> отрицателен. Целые числамогут иметь не более чем 32 бита (нумерация битов от 0 для младшего раз-ряда до 31 — этот разряд является знаковым), поэтому если старшие разря-ды при сдвиге влево выходят за 31-й разряд, то они теряются. При сдвигевправо младшие разряды теряются.

Если аргументы не заданы, то возвращается о. Если задан только один аргу-мент или <сдвиг> равен 0, то возвращается <число>.

Примеры:п (ish 2 1) возвращает 4

° (Ish 3 30) возвращает -1073741824

° (ish 15 -1) возвращает 7

° (ish 15 -2) возвращает з

° (ish 15 -3) возвращает 1п (ish is -4) возвращает о

2.6.18. Функция BooleУниверсальная побитовая булева функция.

( B o o l e < о п е р а т о р > <число1> [<число2> . . . ] ] )

Тип аргументов: целые числа.

Аргумент <оператор> должен иметь значение от 0 до 15, что соответствует16-ти вариантам булевых функций. Остальные аргументы — произвольныецелые числа.

Тип возвращаемого значения: целое число.

Номер любой булевой функции (они все двуместные, т. е. имеют два аргу-мента, каждый из которых может быть 0 или 1) кодируется следующим об-разом:

• если функция для пары ц и возвращает 1, то к ее номеру добавляется

1 = 2";

• если функция для (1 0) возвращает 1, то добавляется 2 = 2';

• если функция для (0 1) возвращает 1, то добавляется 4 = 22;

• если функция для (0 0) возвращает 1, то добавляется 8 = 23.

При таком кодировании уже знакомые нам функции logand и logior полу-чат номера 1 и 7.

Page 90: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 89_

Булева функция применяется побитно к аргументам <число1> и <число2>,затем к результату и аргументу <числоЗ> и т. д.

Если заданы только два аргумента (<оператор> и <число1>), то возвращаетсязначение аргумента <число!>.

Примеры:

° (Boole is -з 45) возвращает -1

° (Boole 8 16 П) возвращает -18

2.6.19. Функция intersГеометрическая функция inters имеет следующий синтаксис:

(inters <точка1> <точка2> <точкаЗ> <точка4> [<признак>])

Вычисляет координаты точки пересечения двух отрезков, один из которыхограничен точками, заданными в качестве аргументов <трчка1> и <точка2>,а второй — точками, определенными аргументами <точкаЗ> и <точка4>. Еслизаданный аргумент <признак> равен nil, тогда вместо точки пересечения от-резков ищется точка пересечения двух прямых, проходящих, соответствен-но, через первый и второй отрезки.

Типы аргументов: первые четыре аргумента — списки из двух или трех чи-сел, представляющих двумерные или трехмерные точки; <признак> — любоезначение (важно только, равно оно nil или нет).

Возвращаемое значение: список с координатами точки пересечения или nil,если пересечения нет.

Если все точки трехмерные (т. е. аргументы заданы списками из трех чисел),то ищется пересечение отрезков или прямых в пространстве и возвращается,соответственно, список с координатами трехмерной точки. Если хотя быодна точка двумерная, то вычисляется пересечение проекций отрезков илипрямых на текущую плоскость построений и возвращается список с коор-динатами двумерной точки.

Примеры:

° ( i n t e r s " ( 6 . 2 0 4 . 7 7 ) ' ( - 5 . 1 3 2 . 4 9 ) ' ( 1 - 3 8 2 . 1 9 ) ' ( - 2 . 2 2 5 . 6 1 ) ) В О З -

в р а щ а е т ( - 0 . 0 1 8 5 3 5 7 3 . 5 1 8 6 1 )

° ( i n t e r s ' ( О . о 4 . 0 ) ' ( 4 . 0 о . О ) ' ( - 1 . 0 - 1 . 0 ) ' ( О . о о . О ) n i l ) в о з в р а щ а е т(2.0 2.0)

2.6.20. Функция polarВычисляет координаты второй точки, отстоящей от первой точки, заданнойаргументом <точка>, на расстояние, величина которого указана в качествеаргумента <расстояние>. При этом отрезок, построенный из первой точки во

Page 91: Visual LISP и секреты адаптации AutoCAD

90 Visual LISP и секреты адаптации AutoCAD

вторую, в проекции на текущую плоскость построений должен образоватьс осью X угол, равный значению аргумента <угол> (в радианах).

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

Аргументы: <точка> — список из двух или трех чисел, представляющих со-бой координаты двумерной или трехмерной точки; <угол> — вещественноечисло, представляющее собой угол, в радианах, с положительным направле-нием оси X текущей плоскости построений; <расстояние> — положительноевещественное число.

Примеры:

( p o l a r ' ( 1 5 . 6 6 33.2) -0.659 3.6689) Возвращает (18.5607 30.9534)

° ( p o l a r ' ( - 2 . 4 2 1 2.32 6.812) 1.45 12.53) Возвращает (-0.9111 14.75876.812)

2.6.21. Функция textboxВычисляет две точки, расположенные по диагонали в вершинах прямо-угольника, описанного вокруг примитива типа TEXT.

(textbox <список>)

Аргумент <список> должен представлять собой список с данными примитиватипа TEXT (о структуре такого списка для объектов AutoCAD см. разд. 2.12).Если список неполный, то отсутствующие данные берутся по умолча-нию. Минимальный объем такого списка должен содержать точечную пару сDXF-кодом 1 (т. е. сам текст надписи).

Пример:

° (textbox '((1 . "Остров сокровищ"))) Возвращает ((0.0 0.0 0.0) (33.75

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

2.6.22. Функция vportsВыводит список с координатами видовых экранов в текущей вкладке (про-странства модели или пространства листа).

(vports)

Возвращаемое значение — список с номерами и координатами видовых эк-ранов. Форма списка зависит от значения системной переменной TILEMODE.

Если переменная TILEMODE равна 1, что соответствует вкладке Модель(Model), тогда координаты видовых экранов даются таким образом, что ле-вый нижний угол графического экрана имеет координаты (0.0 0.0), а верх-ний правый — (1.0 1.0).

Page 92: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 91

Примеры значений, возвращаемых при TILEMODE = 1:

• ((2 (О.о о.о) (1.0 1.0))) — для одноэкранной конфигурации;

П ( ( 2 ( 0 . 5 0 . 0 ) ( 1 . 0 1 . 0 ) ) ( 3 ( 0 . 0 0 . 5 ) ( 0 . 5 1 . 0 ) ) ( 4 ( 0 . 0 0 . 0 ) ( 0 . 50.5))) — для трехэкранной конфигурации (два экрана расположены сле-ва, один — справа; экран с номером 2 является активным, рис. 2.3).

i#AutoCAD 2000 НЕ ДЛЯ ПЕРЕПРОДАЖИ IDiawingll

Послов - Послою Послою

0 Файл Правка £иц Встэюл •одлат Сервис £и«ж«ние Размер"» Реаакт Ен>»« Q"» Справка

О ' DD: DO

• >•_ПО

__JU_J__J

ft»

К : < ' » И '\ Модель I Яи«1 i Яисг2 /

_ _ _ _ _ _ _ _ _ _ _ _1 Ц г ( 0 , 5 .0,0.! Ц... _...OJ.) (.3 (О, .0.0,5) ( О. ...S... 1. ...О2J (..1..I0. 0 ...0 0) С 0....S... 0. .5.).).){Команде _и _г

Рис. 2.3. Трехэкранная конфигурация видовых экранов в пространстве модели

Как правило, видовой экран с номером 1 зарезервирован для служебнойинформации.

Если системная переменная TILEMODE имеет значение 0, что соответству-ет одной из вкладок пространства листа, тогда координаты видовых экрановвыводятся в системе координат листа.

Примеры значений, возвращаемых функцией vports при TILEMODE=0:

• ( ( 1 ( 0 . 0 0 . 0 ) ( 5 3 5 . 4 8 7 2 9 7 . 0 ) ) ( 2 ( 2 6 . 6 7 2 0 . 3 2 ) ( 2 4 0 . 0 3 1 8 2 . 8 8 ) ) ) —для одноэкранной конфигурации (видовой экран неактивен);

О ((2 (26.67 20.32) (240.03 182.88)) (1 (-72.5709 -12.6111) (339.271215.811))) — для одноэкранной конфигурации (видовой экран активен);

• ((5 (134.711 10.1631) (259.285 195.756)) (1 (-72.5709 -12.6111)(339.271 215.811)) (4 (10.1378 10.1631) (134.711 102.96))

Page 93: Visual LISP и секреты адаптации AutoCAD

92 Visual LISP и секреты адаптации AutoCAD

(3 (10.1378 102.96) (134.711 195.756) ) ) — ДЛЯ ТреХЭКрЭННОЙ КОНфИГу-рации (два экрана расположены слева, один — справа; активен располо-женный справа видовой экран с номером 5, рис. 2.4).

\&AutoCAD 2000 - НЕ ДЛЯ ПЕРЕПРОДАЖИ - [Drawing!)

айл Правка Вид Вставка Формат £врвис Р.исоьэние Размеры Редакт Express £кнр Справка • :

O S j ^ * ft) a rf ^ ~ * • j ^ J=5 4 BS SO « £< Q* Q <K: ! > ^

- | f l j x j

; €t ГТТ^Змо J J B Послов3 I - Послою 2J I ' Послоо ~\\\ Послою

o i g g 3

© J . E J ]

O ; /'.?

'••г-I P fW i r ijEi'j-TiiA-i/1

L. J

~3

U

!< i i ' > , И ,\ Модель j Лист! [Лист2 / ^

-12.6111) (339 271 21S.811)) (4 (10.1378 10.1631) (134 711 102.96)) (3 (10.1378102 46) (134 711 195 756))){Команде : I -iLJ -if

.46 3459.624 2043.00000;ШАГ СЕТКА OPTQ ОТС-ПОЛЯР ПРИВЯЗКА ОТС-ПРИВ ВЕС,|МОДЕГ

Рис. 2.4. Трехэкранная конфигурация видовых экранов в пространстве листа

В последних примерах видно, что видовой экран с номером 1 — это самопространство листа.

2.6.23. Функция vl-symbol-valueВозвращает значение символа, имя которого подано в качестве аргумента.

(vl-symbol-value '<символ>)

Аналогична операции получения значения символа с помощью восклица-тельного знака (!) в командной строке AutoCAD (см. разд. 2.1.2).

Примеры:

° (vi-symboi-vaiue "г) возвращает тD (vl-symbol-value "pi) возвращает 3.14159

° (vl-symbol-value 'load) Возвращает #<SUBR @01dll0cd0 LOAD>

Page 94: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 93_

2.6.24. Функция setПрисваивает значение символу, на который ссылается первый аргумент(сравните с функцией setq — см. разд. 2.1.2).

(set '<символ> <значение>)

Пример:

° ( s e t 'newrad 45.5) Возвращает 4 5.5

Следующие выражения приводят к одному результату (присвоению новогозначения символу pw):п (set 'pw 1)

° (setq pw 1)D (set (read "pw") 1)

2.7. Функции преобразования данныхВ следующих разделах рассматриваются функции преобразования данных, атакже функция type, определяющая тип конкретного символа. Функция fix,позволяющая усекать вещественные числа до ближайшего меньшего целого,приведена в разд. 2.6.1.

2.7.1. Функция typeОпределение типа символа.

(type <символ>)

Тип аргумента: символ (имя функции или переменной).

Если <символ> не является именем функции или переменной с присвоеннымзначением, то возвращается nil. Другие варианты возвращаемого значения:

П ENAME — имя примитива AutoCAD;

П EXRXSUBR — имя приложения ObjectARX;

• FILE — указатель (дескриптор) файла;

• INT — целое число;

• LIST — список;

П PAGETB — таблица диспетчера страничной организации памяти;

• PICKSET — набор выбора;

• REAL — вещественное число;

• SAFEARRAY — безопасный массив;

• STR — строка;

• SUBR — встроенная функция AutoLISP;

Page 95: Visual LISP и секреты адаптации AutoCAD

Visual LISP и секреты адаптации AutoCAD

О SYM — символ;

• VARIANT — вариант;

• USUBR — пользовательская функция AutoLISP;

П vLA-объект — объект Visual LISP, использующий технологию ActiveX.

Некоторые из перечисленных вариантов возвращаемого значения доступнытолько при использовании других средств разработки приложений. Типыданных, доступные в Visual LISP, приведены в разд. 2.2.1.

Примеры:

° (type 15) возвращает имт

° (type i+) возвращает SUBR

° (type "15") возвращает S T R

° (type '(15 16 17)) возвращает L I S T

2.7.2. Функция floatПреобразование целого числа в вещественное.

(float <число>)

Тип аргумента: целое или вещественное число.

Если <число> — целое, то возвращается результат его преобразования в ве-щественное. Если <число> — вещественное, то оно же и возвращается в ка-честве значения функции float.

Примеры:

° (float 15) возвращает 15.0а (float -15) возвращает-15.0а (float 15.3) возвращает 15.3

2.7.3. Функция itoaПреобразование целого числа в строку.

(itoa <целое>)

Тип аргумента: целое число.

Возвращается строка, являющаяся результатом преобразования аргумента<целое> в символьное представление.

Примеры:

° (itoa 16) возвращает "16"а ( i toa -29031) Возвращает "-29031"

° (itoa 0) возвращает "0"

Page 96: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 95_

2.1 А. Функция rtosПреобразование вещественного числа в строку.

(rtos <число> [<режим> [<точность>]])

Аргументы: <число> — вещественное или целое число; <режим> — целое(номер режима представления вещественных чисел); <точность> — количе-ство десятичных знаков в представлении вещественных чисел. Аргументы<режим> и <точность> имеют тот же смысл и принимают те же значения, чтои системные переменные LUNITS и LUPREC. Если аргументы <режим> и<точность> опущены, то в качестве их значений принимаются текущие зна-чения LUNITS и LUPREC. На форму возвращаемого значения может ока-зывать влияние системная переменная UNITMODE.

Допустимые значения аргумента <режим>:

П 1- научный;

• 2 — десятичный;

П 3 — инженерный (футы и дюймы);

• 4 — архитектурный (футы и дюймы);

• 5 — дробный.

Возвращается строка, являющаяся результатом преобразования аргумента<число> в символьное представление с заданной точностью.

Примеры:D (rtos, 10.9453 1 3) ВОЗВращаеТ "1.095Е+01"

° (rtos 10.9453 2 3) возвращает "ю.945"

° (rtos ю.9453 з 3) возвращает мо'-ю.945\"" (обратная косая чертапредшествует двойной кавычке, как символу дюйма, чтобы не путать еес двойной кавычкой, являющейся признаком конца строки)

° (rtos ю.9453 4 3) возвращает "0 '- i i\"" (здесь тоже для вывода внут-ренней двойной кавычки использована обратная черта)

° (rtos ю.9453 2 0) возвращает "11"D (rtos ю 2 3) возвращает "11"

° (rtos ю.ооооо 2 3) возвращает "10", если значение системной перемен-ной DIMZ1N равно 8 или 12 (замыкающие нули отбрасываются); воз-вращает "ю.ооо" при других значениях DIMZIN

° (rtos pi 2 10) ВОЗВращаеТ "3.1415926536"

Чаще всего применяется десятичный режим (номер 2).

Page 97: Visual LISP и секреты адаптации AutoCAD

96 Visual LISP и секреты адаптации AutoCAD

2.7.5. Функция atoiПреобразование строки в целое число.

(atoi <строка>)

Тип аргумента: строковый.

Возвращается целое число, для которого <строка> является строковым пред-ставлением.

Примеры:

° (atoi "14") возвращает 14

° (atoi "-29031") возвращает -29031

° (atoi "1234324674568458") возвращает 2147483647 (в данном случаерезультат не соответствует действительности, поскольку число цифрв строковом представлении превысило допустимый максимум; следуетвоспользоваться функцией atof, рассматриваемой ниже)

° (atoi "-290.821") возвращает -290 (дробная часть игнорируется)

2.7.6. Функция atofПреобразование строки в вещественное число.

(atof <строка>)

Тип аргумента: строковый.

Возвращается вещественное число, для которого <строка> является строко-вым представлением.

Примеры:

° (atof "14") возвращает 14.0п (atof "-29.031") Возвращает-29.031D (atof "1234324674568458") возвращает 1.23432е+015

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

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

Аргументы: <строка> — строка, <представление> — целое число. Значенияаргумента <представление> соответствуют значениям системной переменнойAUNITS. Если <представление> опущено, то в качестве его значения прини-мается текущее значение переменной AUNITS.

Page 98: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 97_

Допустимые значения аргумента <представление>:

• 1 — градусы;

• 2 — градусы, минуты, секунды;

• 3 — грады;

• 4 - радианы;

• 5- топографические единицы.

Возвращается вещественное значение угла в радианах, для которого<строка> является строковым представлением (возможно, в другом форматепредставления углов). Если <строка> представлена в неправильном формате,то возвращается nil.

Примеры:

° (angtof "30" 0) возвращает о. 523599 (перевод угла из градусов в радианы)a (angtof "334.365g" 2) возвращает 5.25219

° (angtof "33d27'54\"" 1) Возвращает 0.584074

° (angtof "_N 89d54'31\" __W" 4) Возвращает 3.14

2.7.8. Функция angtosПреобразование значения угла в радианах в строку, в соответствии с форма-том (ФУНКЦИЯ angtos ЯВЛЯеТСЯ обратной К ФУНКЦИИ angtof).

(angtos <угол> [<представление> [<точность>]])

Аргументы: <угол> — вещественное или целое значение угла в радианах;<представление> и <точность> — целые числа. Значения аргумента<представление> соответствуют значениям системной переменной AUNITS,значения аргумента <точность> — значениям системной переменнойAUPREC. Если <представление>" и <точность> опущены, то в качестве ихзначений принимаются текущие значения переменных AUNITS и AUPREC.

Возвращается <строка>, являющаяся строковым представлением значенияугла. На форму результата оказывает влияние значение системной перемен-ной UN1TMODE. Необходимо также учитывать значение переменнойANGBASE.

Примеры:

° (angtos l.oo 0) возвращает "57.296"

° (angtos 1 0) возвращает "57.296"D (angtos 3.14000 0) возвращает "179.909"D (angtos 3.14000 1) ВОЗВращаеТ "17 9d54'31\""

° (angtos 3.14000 2) возвращает "199.899д"

4 Зах. 155

Page 99: Visual LISP и секреты адаптации AutoCAD

98 ' Visual LISP и секреты адаптации AutoCAD

° (angtos 3.14000 3) возвращает "3.140r"

° (angtos 3.14000 4) возвращает мс 89d54'3i\" з" в русскоязычной версииAutoCAD (или "N 89d54'3i\" w" в англоязычной версии)

2.7.9. Функция distofПреобразование строки, представляющей вещественное значение в одномиз форматов линейных единиц, в вещественное число. Функция distof яв-ляется обратной по отношению к функции rtos.

(distof <строка> [<режим>])

Аргументы: <строка> — строка, представляющая число в одном из форматов;<режим> — целое число, значения которого соответствуют значениям сис-темной переменной LUNITS (см. разд. 2.7.4). Если аргумент <режим> опу-щен, то в качестве его значения принимается текущее значение системнойпеременной LUNITS.

Возвращаемое значение: вещественное число. Если <строка> имеет непра-вильную структуру, то возвращается nil.

Примеры:D (distof "i" 2) возвращает l.о

° (distof "1.0945E+01" 1) возвращает ю. 945

° (distof "О'-1О.945\"" 3) ВОЗВращаеТ 10. 945

2.7.10. Функция transПреобразование координат точки из одной системы координат (СК) в другую.

(trans <точка> <СК-из> <СК-в> [<признак>])

Аргументы: <точка> — точка (список из двух или трех чисел, соответствую-щий двумерной или трехмерной точке); <ск-из> — код СК, в которой поданаргумент <точка> (т. е. СК, из которой нужно преобразовать точку), можетбыть целым числом или именем примитива AutoCAD; <ск-в> — код СК,в которую нужно преобразовать точку, может быть целым числом или име-нем примитива AutoCAD. Необязательный аргумент <признак>, если он за-дан и отличен от ni l (например, т), то меняет интерпретацию аргумента<точка>: в этом случае список из двух или трех чисел рассматривается не каккоординаты точки, а как координаты вектора перемещения.

Аргументы <ск-из> и <ск-в> могут принимать следующие значения:

• имя примитива (в том виде, в каком оно возвращается функциямиssname, entsel, nentsel, entnext, entlast);

Page 100: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 99_

• трехмерный вектор выдавливания (вектор нормали к плоскости);

• цифровой код от 0 до 3 (объясняется ниже).

Цифровой код системы координат может принимать такие значения:

• 0 — мировая СК (МСК)

• 1 — текущая С К (ТСК)

• 2 — экранная СК (ЭСК)

• 3 — экранная СК листа (ЭСКЛ)

Имеются определенные условия использования этих кодов в аргументах<ск-из> и <ск-в> (иначе говоря, не всякое значение <ск-из> сочетается с лю-бым значением <ск-в> и наоборот).

Коды 0 и 1 могут использоваться в аргументах <ск-из> и <ск-в> в любых со-четаниях. Это означает, что если <ск-из> = 0, то <ск-в> может быть или лю-бым цифровым кодом (от 0 до 3), или именем примитива, или вектором вы-давливания; аналогично если <ск-в> = 0, то <ск-из> может быть или любымцифровым кодом (от 0 до 3), или именем примитива, или вектором выдав-ливания.

Цифровой код 2 сочетается с разными вариантами, но его интерпретациязависит от цифрового кода другой СК. Если вторая СК имеет код 0 или 1,то первая СК (с кодом 2) является ЭСК текущего видового экрана. Есливторая СК имеет код 3, то первая СК (с кодом 2) является ЭСК текущеговидового экрана в пространстве модели.

Цифровой код 3 (ЭСКЛ) используется только в паре с цифровым кодом 2другой СК (см. выше).

Имя примитива в качестве аргумента <ск-из> используется в том случае,когда координаты точки, хранящейся вместе с примитивом (например, на-чальная или конечная точки отрезка, центр окружности, вершина полили-нии и т. п.), нужно пересчитать из системы координат объекта (СКО) вдругую СК. В некоторых операциях (например, при работе с функциейentmake) возникает необходимость пересчитать точку в СКО — здесь имяпримитива будет фигурировать в качестве аргумента <ск-в>.

Замечание

Некоторые объекты (например, трехмерные полилинии) не имеют особой СКОи хранят свои данные в МСК.

Свои преимущества имеет и способ, когда трехмерный вектор выдавливанияприменяется в качестве <ск-в> или <ск~из> (например, при проектированииобъекта на плоскость с известным вектором нормали). Это способ не мо-жет использоваться для тех объектов, у которых в качестве СКО фигурируетМСК.

Page 101: Visual LISP и секреты адаптации AutoCAD

100 Visual LISP и секреты адаптации AutoCAD

Возвращаемым значением функции trans является список из трех коорди-нат точки (или вектора перемещения) в новой СК. Если значения <ск-из> и<ск-в> заданы противоречиво, то возвращается ni l (например, если функцияtrans вызывается с цифровым кодом СК, равным 3, из пространства моде-ли, а не из пространства листа).

Как было сказано выше, в качестве аргумента <точка> может фигурироватьдвумерная точка. В этом случае AutoCAD преобразует точку из двумернойв трехмерную, добавляя координату Z по следующему алгоритму.

Если задан аргумент <признак> и его значение отлично от ni l (т. е. аргумент<точка> интерпретируется не как точка, а как вектор перемещения), то до-бавляемая координата Z получает значение 0. Если признак не задан илиравен nil, то значение координаты Z зависит от аргумента <ск-из> и выби-рается по табл. 2.1.

Таблица 2.1. Выбор функцией trans координаты 2для двумерной точки

СК-из Значение Z

МСК 0.0

ТСК Текущий уровень (значение системной переменной ELEVATION)

СКО 0.0

ЭСК В проекции на текущую плоскость построений (т. е. плоскость ТСК плюстекущий уровень)

ЭСКЛ В проекции на текущую плоскость построений (т. е. плоскость ТСК плюстекущий уровень)

Рассмотрим пример. Предположим, в качестве ТСК выбрана система коор-динат, у которой оси параллельны осям МСК, а начало находится в точкеХ=10, Y=10, Z=10. Тогда:

° ( t r a n s ' ( i l l ) o i ) в о з в р а щ а е т ( - 9 . 0 - э . о - 9 . 0 )

° ( t r a n s ' ( i l l ) о 1 т ) в о з в р а щ а е т ( l . o l . o 1 . 0 )

2.7'.11. Функция СУ unitПреобразует значение из одной системы единиц измерения в другую.

(cvunit <значение> <е-из> <е-в>)

Аргументы: <значение> — число или список из двух или трех чисел; <е-из> —единица измерения, в которой задано <значение>; <е-в> — единица измере-ния, в которую надо перевести <значение>.

Возвращаемое значение имеет тот же тип (число или список), что и аргу-мент <значение>. Если преобразование невозможно, то возвращается nil.

Page 102: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1_01_

Наименования единиц измерения, которые могут быть использованы в ка-честве аргументов <е-из> и <е-в>, должны быть перечислены в файлеacad.unt (см. приложение 3).

Примеры:

° (cvunit I "minute" "second") возвращает 60.0

° (cvunit 1 "минут" "секунд") возвращает 60.о

° (cvunit 1 "минута" "секунда") возвращает 60.0

'D (cvunit I'"minute" "hour") возвращает 0.016667

° (cvunit '(1.0 2.0) "дюйм" "см") Возвращает (2.54 5.08)

2.8. Функции обработки строкВ следующих разделах разбираются функции, позволяющие выполнять опе-рации над строками (постоянными или переменными). В качестве примеровприведены полезные функции ending и strcaser.

2.8.1. Функция chrПолучает буквенно-цифровой символ (строку из одного буквенно-цифрового символа) по коду действующей таблицы символов.

(chr <целое>)

Аргумент: целое число от 1 до 255. Если подается целое число вне указан-ного диапазона, то результат функции chr непредсказуем.

Тип возвращаемого значения: строковое.

Примеры:

° (chr 192) возвращает "А" (русская буква)

° (chr 224) возвращает "а" (русская буква)D (chr 32) возвращает " " (пробел)

° (chr 48) возвращает "0"

С" Замечание ^Заглавные русские буквы (А—Я) имеют коды 192—223, а строчные (а—я) —коды 224—255.

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

волов.(ascii <строка>)

Page 103: Visual LISP и секреты адаптации AutoCAD

102 Visual LISP и секреты адаптации AutoCAD

Тип аргумента: строковый.

Тип возвращаемого значения: целое.

Примеры:

° (ascii "А") возвращает 192 (А — русская буква)

° (ascii "А") возвращает 65 (А — латинская буква)

° (ascii "ABCDEFGH") возвращает 65 (все буквенно-цифровые символы, кро-ме первого, игнорируются)

° (ascii "") возвращает о

° (ascii "\"") возвращает 34 (код двойной кавычки)

2.8.3. Функция readЧитает аргумент, являющийся строкой, до первого пробела (или до конца,если пробелов нет) и возвращает прочитанное значение как символ AutoLISP(т.. е. имя функции или переменной).

(read <строка>)

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

Если строка-аргумент начинается с пробелов, то эти пробелы пропускаютсядо первого буквенно-цифрового символа, отличного от пробела. Если всястрока-аргумент состоит из пробелов, то возвращается nil.

Тип аргумента: строковый.

Тип возвращаемого значения: целое число, вещественное число, список илисимвол.

Примеры:

° (read "А") возвращает А (сравните с примером в разд. 2.6.24)

° (read " А ") возвращает А

° (read "В с D E F") возвращает в

° (read "23.55") возвращает 23. 550 (read "10 масса") возвращает 10

D (read " ") возвращает nil

° (read "(li 13 15 17)) возвращает (11 13 15 17)D (read "\"Радиус\" \"Диаметр\"") Возвращает "Радиус"

Page 104: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1_03_

2.8.4. Функция strcaseПреобразует строку в верхний или нижний регистр.

(strcase <строка> [<признак>])

Аргумент <строка> — текстовая строка, символы которой нужно преобразо-вать. Если аргумент <признак> опущен или равен nil, то функция strcaseвыполняет преобразование всех буквенно-цифровых символов строки вверхний регистр. Если <признак> задан и его значение отлично от nil, товыполняется преобразование строки в нижний регистр.

Символы, отличные от букв (например, цифры, знаки препинания) не пре-образуются.

Замечание )Если функцию s t r c a s e применять при работе с англоязычной версией AutoCAD(или с локализованной, но не русскоязычной версией), то она может непра-вильно преобразовывать русские буквы. Для "перевода" русских строк жела-тельно иметь свою собственную функцию. См. пример в разд. 2.8.10.

Примеры:а (strcase "AbcdE FGh-38") возвращает "ABCDE FGH-38"0 (strcase "AbcdE FGh-38" nil) возвращает "ABCDE FGH-38"

° (strcase "AbcdE FGh-38" T) Возвращает "abcde fgh-38"

° (strcase "AbcdE FGh-38" 79) Возвращает "abcde fgh-38" (аргумент

<признак> имеет значение 7 9, что не равно nil, поэтому обрабатываетсякак т)

2.8.5. Функция strcatКонкатенация (сцепление) строк.

(strcat [<строка1> [<строка2> ... [<строкаЫ>] ... ]])

Тип аргументов: строковый.

Если аргументы не заданы, то возвращается пустая строка ("").

Примеры:

° (strcat "Happy N" "ew " "Year") возвращает "Happy New Year"

° (strcat (itoa 12) "-я линия") возвращает "12-я линия"

° (strcat "Петербург") возвращает "Петербург"

° (strcat) возвращает ""

Page 105: Visual LISP и секреты адаптации AutoCAD

104 Visual LISP и секреты адаптации AutoCAD

2.8.6. Функция strlenВычисляет суммарную длину всех строк-аргументов (длина строки — этоколичество символов' в строке).

(strlen [<строка1> [<строка2> ... [<строкаЫ>] ... ]])

Тип аргументов — строковый.

Если аргументы не заданы, то возвращается о.

Примеры:

° (strlen "Happy N" "ew " "Year") Возвращает 14

° (strlen (itoa 12) "-я линия") возвращает ю

° (strlen "Петербург") возвращает 9

° (strlen) возвращает о

2.8.7. Функция substrВыделяет подстроку, начиная с заданной позиции.

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

Аргументы: <строка> — строка, из которой нужно выделить подстроку;<начало> — номер буквенно-цифрового символа в строке, с которого нужноначать выделение подстроки; <количество> — количество символов, котороенужно включить в подстроку. Аргумент <начало> — целое число (не мень-ше 1); номером 1 обозначается первый символ аргумента <строка>. Аргумент<количество> — целое число; если аргумент <количество> не указан или за-дан большим, чем осталось в анализируемой строке, начиная с позиции<начало>, то возвращается полный остаток аргумента <строка> от заданногоместа.

Если аргумент -«количество равен о, то функция substr возвращает "".

Примеры:

° (substr "Happy New Year" 7 3) Возвращает "New"D (substr "Happy New Year" 7) возвращает "New Year"0 (substr "Happy New Year" 7 23) возвращает "New Year"

° (substr "Happy" 7 з) возвращает ""

° (substr "Happy" з 0) возвращает ""

Один знак — один символ (кроме двойных кавычек). — Ред.

Page 106: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 105

2.8.8. Функция wcmatchПроверяет строку на соответствие ее символов образцу (шаблону).

(wcmatch <строка> <образец>)

Аргументы: <строка> — строка, структуру которой нужно проверить;<образец> — особая строка (образец), определяющая требования к прове-ряемой структуре. Аргумент <образец> может содержать как обычные алфа-витно-цифровые знаки, так и специальные групповые знаки (wild-card-characters), рассматриваемые в табл. 2.2. Можно в строке <образец> задатьсразу несколько шаблонов, на соответствие каждому из которых <строка>будет проверена; шаблоны должны разделяться с помощью запятой.

Таблица 2.2. Специальные знаки, допустимые в образце

Знак Назначение

#

@

. (точка)

, (запятая)

" (обратныйапостроф)

Заменяет одну любую цифру

Заменяет одну любую букву

Заменяет любой символ, не являющийся ни буквой, ни цифрой

Заменяет любую последовательность любых символов, даже пус-тую; может использоваться в любом месте аргумента <образец>

Заменяет ровно один любой символ

Если стоит в начале образца, заданного аргументом <образец>, тоозначает "все, кроме определенного аргументом <образец>"

Заменяет любой из символов, перечисленных в скобках

Заменяет любой символ, кроме перечисленных в скобках

Между двумя однотипными знаками указывает на диапазон

Разделяет два шаблона

Превращает специальный знак в обычный

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

Возвращаемое значение: т — если <строка> соответствует образцу, n i l — еслине соответствует.

Page 107: Visual LISP и секреты адаптации AutoCAD

106 Visual LISP и секреты адаптации AutoCAD

Примеры:

° (wcmatch "Happy New Year" "н*") возвращает т, т. к. проверяемая строканачинается с буквы н

0 (wcmatch "Happy New Year" "h*") возвращает ni l (при Проверке внутристрок символы н и h считаются разными)

° (wcmatch "Happy New Year" "??ppy*, *New*, * * *") возвращает Т, Т. К. Все

три проверяемых шаблона соблюдены

° (wcmatch "Happy New Year" "*#*") возвращает nil, Т. К. нет НИ ОДНОЙ

цифрыD (wcmatch "Happy New Year" "H[adgt]*") ВОЗВращает ТD (wcmatch "Happy***day" "Happy

4*"*

4**") ВОЗВращает Т

о (wcmatch "Year 2000" "@ea@ [1-6J000") ВОЗВращает Т

2.8.9. Функция vl-string->listПреобразует строку в список с кодами буквенно-цифровых знаков.

(vl-string->list <строка>)

Аргумент: текстовая строка.

Возвращаемое значение — список с кодами по действующей таблице симво-лов или nil, если <строка> — пустая строка.

Примеры:

° ( v l - s t r i n g - > l i s t "AutoCAD'1) ВОЗВращает ' (65 117 116 111 67 65 68)D ( v l - s t r i n g - > l i s t "Автокад") ВОЗВращает ' (192 226 242 238 234 224 228)

° (vi-string->iist "") возвращает nil

2.8.10. Функция vl-list->stringПреобразует список с кодами буквенно-цифровых знаков в строку.

(vl-list~>string <список>)

Аргумент: список из целых положительных чисел (каждое число должнобыть не больше 256).

Возвращаемое значение — строка, в которой буквенно-цифровые символыимеют коды, взятые из аргумента <список>. Для пустого списка возвращает-ся пустая строка ("")

Примеры:а ( v l - l i s t - > s t r i n g '(210 224 240 224 241 32 193 243 235 252 225 224))

возвращает "Тарас Бульба"D ( v i - i i s t - > s t r i n g n i l ) возвращает ""

Page 108: Visual LISP и секреты адаптации AutoCAD

Глава 2. ЯЗЫКАШОШР \ Ю7_

2.8.11. Функция vl-string-eltВозвращает код буквенно-цифрового символа, расположенного в строке наместе с заданным номером (первая буква имеет номер 0).

(vl-string-elt <строка> <позиция>)

Аргументы: <строка> — текстовая строка, <позиция> — целое число.

Возвращаемое значение — целое число (код буквенно-цифрового знака подействующей таблице символов).

Примеры:

о ( v l - s t r i n g - e l t "Татьяна" 5) возвращает 237 (КОД буквы "н")

° ( v l - s t r ing-e l t "Татьяна" 0) возвращает 210 (КОД буквы "Т")

2.8.12. Функция vl-string-left-trimУбирает в начале строки все перечисленные символы.

(vl-string-left-trim <перечень> <строка>)

Аргументы: текстовые строки.

Возвращаемое значение — значение аргумента <строка>, из которого слеваубраны все символы, перечисленные в аргументе <перечень>.

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

Примеры:

° (vl-string-left-trim "лидер" "дистанция") Возвращает "станция"D (vl-string-left-trim " " " таблица") возвращает "таблица"

2.8.13. Функция vl-string-right-trimУбирает в конце строки все перечисленные символы.

(vl-string-right-trim <перечень> <строка>)

Аргументы: текстовые строки.

Возвращаемое значение — значение аргумента <строка>, из которого справаубраны все символы, перечисленные в аргументе <перечень>.

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

Page 109: Visual LISP и секреты адаптации AutoCAD

108 Visual LISP и секреты адаптации AutoCAD

Примеры:0 (vl-string-right-trim "лоция" "дистанция") возвращает "дистан"

° (vl-string-right-trim " year" "commentary ") возвращает "comment"

2.8.14. Функция vl-string-trimУбирает в начале и в конце строки все перечисленные символы.

(vl-string-trim <перечень> <строка>)

Аргументы: текстовые строки.

Возвращаемое значение — значение аргумента <строка>, из которого слеваи справа убраны все символы, перечисленные в аргументе <перечень>.

Функция является комбинацией функций vl-string-left-trim И vl-string-right-trim.

Примеры:

° (v l-s t r ing-tr im "декларация" "дистанция") возвращает "стан"D (v l-s t r ing-tr im " " " comment ") возвращает "comment"

2.8.15. Функция vl-string-mismatchСверяет две строки, начиная с заданных позиций, и возвращает количествосовпавших последовательностей буквенно-цифровых символов.

(vl-string-mismatch <строка1> <строка2> [<позиция1> [<позиция2>[<регистр>]]])

Аргументы." <строка1> И <строка2> — строки, <позиция1> И <позиция2> —

числа (номера позиций в сверяемых строках; отсчет позиций в строке начи-нается с 0); <регистр> — любое значение (имеет значение только ni l или неnil). По умолчанию аргументы <позиция1> и <позиция2> принимают значе-ние 0, <регистр> — Т.

Примеры:

° (vl-string-mismatch "декларация" "дистанция") Возвращает 1

° (vl-string-mismatch "декларация" "дистанция" 7 6) Возвращает 3D (vl-string-mismatch "Merry Christmas" "MER" 0 0 T) возвращает 3

2.8.16. Функция vl-string-positionИщет буквенно-цифровой знак с определенным кодом в строке, начинаяс заданной позиции (возможен поиск с конца строки).

(vl-string-position <код> <строка> [<начало> [<обратно>]])

Page 110: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP

Аргументы: <код> — код (положительное целое число), с которым разыски-вается буквенно-цифровой символ; <строка> — анализируемая строка;<начало> — номер позиции, начиная с которого анализируется строка (пер-вый символ строки имеет номер 0); <обратно> - признак поиска с концастроки (если не nil, то поиск идет с конца).

Возвращаемое значение — число, являющееся номером позиции первогонайденного в аргументе <строка> символа с заданным кодом. Если требуе-мый символ не обнаружен, то возвращается nil.

Примеры:

° (vl-string-position 49 "1111" 0) возвращает О

° (vl-string-position 4 9 "1111" 1) возвращает 1

° (vi-string-position 49 " n i l " 1 т) возвращает з

о (vl-string-position 48 "1111") ВОЗВращаеТ nil

° (vl-string-position (ascii "t") "Autodesk") возвращает 2

2.8.17. Функция vl-string-searchИщет заданную последовательность буквенно-цифровых символов (образец)в строке, начиная с заданной позиции.

(vl-string-search <образец> <строка> [<начало>])

Аргументы: <образец> и <строка> — текстовые строки; <начало> — номер по-зиции, с которой начинается анализ аргумента <строка> (по умолчанию — 0).Отсчет позиций в строке начинается с 0.

Возвращаемое значение — целое число с номером позиции, начиная с кото-рой обнаружено присутствие аргумента <образец> в аргументе <строка>. Если<образец> не обнаружен, то возвращается nil.

Примеры:

о (vl-string-search "ain" "Training") Возвращает 2n (vl-string-search "ain" "Training" 4) возвращает nil

2.8.18. Функция vl-string-substЗаменяет в строке одну последовательность буквенно-цифровых символовна другую, начиная с определенного номера позиции.

(vl-string-subst <новые> <старые> <строка> [<начало>])

Аргументы: <новые>, <старые> и <строка> — текстовые строки; <начало> —номер позиции в аргументе <строка>, с которого начинается поиск нужной

Page 111: Visual LISP и секреты адаптации AutoCAD

110 Visual LISP и секреты адаптации AutoCAD

последовательности символов для замены (по умолчанию — 0). Первыйсимвол в строке имеет номер 0.

Возвращаемое значение — строка, являющаяся результатом выполнения за-мены последовательности символов в аргументе <строка>. Если последова-тельность символов <старые> встречается в аргументе <строка> несколькораз, то производится только первая замена.

Примеры:

° (vl-string-subst "цып" "ва" "валенок") Возвращает "цыпленок"

° (vl-string-subst "12" "a" "a para" 0) Возвращает "12 para"

° (vl-string-subst "12" "a" "a para" 2) возвращает "а р12га"

° (vl-string-subst "12" "a" "a para" 5) возвращает "а раг12"

° (vl-string-subst "12" "b" "a para" 0) возвращает "a para"

2.8.19. Функция vhstring-translateЗаменяет в строке символы одной группы на символы другой группы.

(vl-string-translate <rpynnal> <группа2> <строка>)

Аргументы: текстовые строки.

Возвращаемое значение — строка с замененными символами (если символыиз аргумента <группа1> найдены в аргументе <строка>). Обычно количествосимволов в аргументе <групла1> равно количеству символов в аргументе<группа2>. Если количество символов в первом и втором аргументах отли-чаются, то в каждой из групп используются только первые символы(лишние, -не имеющие пары в другой группе, игнорируются).

Примеры:0 (vl-string-translate "12" "ab" "year 1921") возвращает "year a9ba"D (vl-string-translate "abc" "w" "abca") Возвращает "wcbw"

2.8.20. Функция vl-symbol-nameВыводит имя символа в форме текстовой строки.

(vl-symbol-name '<символ>)

Аргумент — символ AutoLISP.

Возвращаемое значение — строка.

Примеры:D (vl-symbol-name 'pi) ВОЗВращает "p i "D (vl-symbol-name 'cadr) ВОЗВращает "cadr"

Page 112: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1JJ_

2.8.21. Пример (функция ending)В приложении 6 приведен текст полезной функции ending, позволяющейсогласовать окончание слова (существительного, прилагательного, глагола)с сопутствующим числительным. Данная функция полезна, например, есливашей программе нужно выводить текст "Обнаружены N серьезных ошибок"при разных N. Однако если N = 1, то текст должен выглядеть так: "Обна-ружена 1 серьезная ошибка"; если N = 2 — то "Обнаружены 2 серьезныеошибки"; если N = 5 — то "Обнаружены 5 серьезных ошибок" и т. д. (изме-няемые окончания подчеркнуты).

Разберем эту функцию.

(ending <число> <окончание1> <окончание2> <окончаниеЗ>)

Возвращает строку с тем окончанием, которое соответствует числу, подан-ному в качестве первого аргумента.

Аргументы: <число> — числительное, с которым согласуется слово;<окончание1> — строка-окончание, которое нужно выдать, если <число> = 1-,21, 31, ...; <окончание2> — строка-окончание, которое нужно выдать, если<число> = 2, з, 4, 22, 23, 24, ...; <окончаниеЗ> — строка-окончание, котороенужно выдать, если <число> = о, 5, б, 7, 8, 9, 11, 12, ... .

Выражение (ending n "а" "ы" "ы") возвращает "а" при п = 1, "ы" при п = 2,"ы" при п = 5, поэтому оно может быть использовано как окончание к стро-ке "Обнаружен".

Выражение (ending n "ая" "ые" "ых") возвращает "ая" при п=1, "ые" прип=2, "ых" при п=5, поэтому оно может стать окончанием к строке "серьезн".

Аналогично выражение (ending n "ка" "ки" "ок") возвращает "ка" при п=1,"ки" при п=2, "ок" при п=5, поэтому оно может быть использовано какокончание к строке "ошиб".

Поэтому выражение (strcat "Обнаружен" (ending n "а" "ы" "ы") " " (itoa n)" серьезн" (ending n "ая" "ые" "ых") " ошиб" (ending n "ка" "ки" "ок") )будет выводить согласованный текст "Обнаружены N серьезных ошибок"для разных п.

2.8.22. Пример (функция strcaser)В приложении 8 приведен текст функции strcaser, являющейся расширени-ем функции strcase для русского алфавита (в некоторых версиях AutoCADмогут быть ситуации, когда функция strcase работает с русскими букваминеправильно).

Обращение к функции:

(strcaser <строка> <признак>)

Преобразует строку в верхний или нижний регистр.

Page 113: Visual LISP и секреты адаптации AutoCAD

112 Visual LISP и секреты адаптации AutoCAD

Аргумент <строка> — текстовая строка, символы которой нужно преобразо-вать. Если аргумент <признак> равен nil, то функция strcaser выполняетпреобразование всех буквенно-цифровых символов строки в верхний ре-гистр. Если значение аргумента <признак> отлично от nil, то производитсяпреобразование строки в нижний регистр. В отличие от стандартной функ-ции strcase, При обращении К фуНКЦИИ strcaser аргумент <признак> не

должен опускаться.

Примеры:D (strcaser "С Новым годом" nil) ВОЗВращавТ "С НОВЫМ ГОДОМ"

D (strcaser "С Новым годом" Т) Возвращает "с новым годом"

2.9. Функции обработки спискови точечных парВ этом разделе рассматриваются функции, работающие со списками и то-чечными парами. Точечная пара — это особый двухэлементный список вида(а . ь), в котором в качестве разделителя выступает точка. Первый элементтакого списка называют DXF-кодом, а второй — данными этого кода. Основ-ной способ создания точечных пар — функция cons. Точечные пары исполь-зуются для работы с примитивами рисунка (см. разд. 2.12).

Есть отличия в работе некоторых функций со списками и с точечными па-рами.

2.9.1. Функция listФункция l i s t — это основная функция, позволяющая создать список. Об-ращение к функции:

(list [<элемент1> [<элемент2> ... [<элементЫ>] ... ]])

Объединяет элементы в список.

В качестве аргументов, образующих список, могут выступать любые объек-ты, которыми оперирует AutoLISP. Самый распространенный список — этосписок из двух или трех вещественных чисел, который представляет точку.

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

Примеры:п ( l i s t 1 2 . 1 2 0 . 3 4 5 . 8 8 ) Возвращает ( 1 2 . 1 2 0 . 3 4 5 . 8 8 )

° ( l i s t l . i n i l т ) возвращает ( i . i n i l т )D ( l i s t i " a d 2 " ( l i s t 0 1 2 ) ) в о з в р а щ а е т ( i " a d 2 " ( 0 1 2 ) ) (третьим э л е -

м е н т о м н о в о г о с п и с к а является с п и с о к из ч и с е л 0, 1 и 2)

Page 114: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1J3_

° ( l is t l ' to . "LINE")) возвращает (l (0 . "LINE")) (вторым элементомнового списка является точечная пара (о . "LINE"))

2.9.2. Функция appendВыполняет слияние списков в один.

( a p p e n d [ < с п и с о к ! > [ < с п и с о к 2 > . . . [ < c r r a c o K N > ] . . . ] ] )

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

Если присутствует только один аргумент, то его значение и возвращаетсяв качестве значения функции append. Если аргументы опущены, то возвра-щается nil.

Примеры:D (append ' (17 200 -6) ' (-10 8 1)) ВОЗВращаеТ (17 200 -6 -10 8 1)D (append ' (17 200 -6) ' (nil T nil)) Возвращает (17 200 -6 nil T nil)D (append '(17 200 -б)) возвращает (17 200 -6)

° (append) возвращает n i l

° (append n i l •(!)) возвращает (i) ( n i l рассматривается как список нуле-вой длины, т. е. ' о)

0 ( a p p e n d . 1 ( 1 7 2 0 0 - 6 ) ' ( ( 6 2 . 1 1 ) ) ) В О З В р а щ а е Т ( 1 7 2 0 0 - 6 ( 6 2 . 1 1 ) )

(в этом примере второй аргумент — это список, в котором единственнымэлементом является точечная пара (62 . И))

2.9.3. Функция nthИзвлекает из списка элемент по порядковому номеру (нумерация элементовсписка выполняется слева направо и начинается с нуля).

(nth <номер> <список>)

Типы аргументов: <номер> — целое неотрицательное число, <список> — не-пустой список любой длины.

Возвращается значение элемента на соответствующем месте списка. Еслиномер превышает длину списка или равен ей, то возвращается nil.

Примеры:

° (nth о ' (11 12 13 14)) возвращает и

° (nth 1 ' (11 12 13 14)) возвращает 12

Page 115: Visual LISP и секреты адаптации AutoCAD

/14 Visual LISP и секреты адаптации AutoCAD

° ( n t h 2 ' ( l i 12 13 1 4 ) ) в о з в р а щ а е т 13

° ( n t h 3 ' ( l i 12 13 1 4 ) ) в о з в р а щ а е т 14

° ( n t h 4 ' ( l i 1 2 1 3 1 4 ) ) в о з в р а щ а е т n i l

2.9.4. Функция reverseПереворачивает список (образует новый список, в котором элементы пере-ставлены в противоположном порядке по отношению к исходному списку).

(reverse <список>)

Тип аргумента: <список> — любой список (точечные пары не допускаются)ИЛИ n i l .

Возвращаемое значение — перевернутый список или nil.

Примеры:

° (reverse '(11 12 13 14)) Возвращает (14 13 12 11)

° (reverse nil) Возвращает nil

° ( r e v e r s e ' ( ) ) в о з в р а щ а е т n i l

2.9.5. Функция carИзвлекает первый элемент списка или DXF-код точечной пары.

(саг <список>)

Аргументом функции могут быть список, точечная пара или nil.

Если аргументом является список, то возвращается первый элемент списка;если аргументом является точечная пара, то возвращается DXF-код (первыйэлемент точечной пары). Если в качестве аргумента подан nil (или эквива-лентный ему пустой список), то возвращается nil.

Примеры:

° (саг ' ( 1 1 12 13 14)) возвращает 11

D (car ' ( 0 . " L I N E " ) ) возвращает о

° (саг ' ( ) ) возвращает n i l

2.9.6. Функция cdrИзвлекает подсписок без первого элемента или данные точечной пары.

(cdr <список>)

Аргументом функции могут быть список, точечная пара или nil.

Если аргументом является список, то возвращается тот же список, но безпервого элемента; если аргументом является точечная пара, то возвращают-

Page 116: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLlSP U5_

ся данные (второй элемент точечной пары). Если в качестве аргумента пере-дан ni l (или эквивалентный ему пустой список), то возвращается nil.

Примеры:

° (cdr '(11 12 13 14)) возвращает (12 13 14)

° (cdr '(0 . " L I N E " ) ) возвращает " L I N E "

° (cdr '()) возвращает nil

2.9.7. Функции caar, cadrv\ аналогичные им

От функций саг и cdr путем их повторения в разных комбинациях от двухдо четырех раз, в языке AutoLlSP образованы следующие функции (всего ихдвадцать восемь):

П (сааг <список>) — равносильно (саг (саг <список>));

• (cadr <спмсск>) — равносильно (car (cdr <список>));

• (cdar <список>) —равносильно (cdr (car <список>) )', •

П (cddr <список>) — равносильно (cdr (cdr <список>) ) ;

• (caaar <список>) — равносильно (car (car (car <список>) ) ;

• (caadr <список>) —равносильно (car (car (cdr <список>) ) ) ;

П (cadar <список>) —равносильно (car (cdr (car <список>) ) );

• (caddr <список>) — равносильно (car (cdr (cdr <список>) )

П (cdaar <список>) —равносильно (cdr (car (car <список>) ) );

• (cdadr <список>) —равносильно (cdr (car (cdr <список>) )

П (cddar <список>) —равносильно (cdr (cdr (car <список>) )

• (cdddr <список>) — равносильно (cdr (cdr (cdr <список>) ) ).

• (caaaar <список>) — равносильно (car (car (car (car <сгшсок>) ) ) ) ;

• (caaadr <список>) —равносильно (car (car (car (cdr <список>) ) ) ) .

Аналогичным методом раскрываются оставшиеся функции (caaaar, caaddr,cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cdddar,

cddadr, cddddr).

П р и м е р ы :

° (cadr ' ( i l 12 13 14)) возвращает 12

° (cddr ' ( i l 12 13 14)) возвращает (13 14)0 (cdddr ' ( 1 1 12 13 14)) возвращает (14)

° (cadddr ' ( i l 12 13 14)) возвращает 14

Page 117: Visual LISP и секреты адаптации AutoCAD

/16 Visual LISP и секреты адаптации AutoCAD

" (cddddr ' ( i i 12 13 14)) возвращает n i l

° (cadr ' ( ( i i 12 13 14))) возвращает n i l

° (caar ' ( ( i i 12 13 14))) возвращает i i

° (cadr '((11 12 13 14) (21 22 23 24))) Возвращает (21 22 23 24)

° (cddr '((11 12 13 14) (21 22 23 24))) Возвращает nil

° (cdadr '((11 12 13 14) (21 22 23 24))) возвращает (22 23 24)0 (cadadr '((11 12 13 14) (21 22 23 24))) возвращает 22

° (cddadr '((11 12 13 14) (21 22 23 24))) возвращает (23 24)

2.9.8. Функция consДобавляет к списку первый элемент или создает точечную пару.

(cons <аргумент1> <аргумент2>)

Если <аргумент2> является списком, то функция cons добавляет в него<аргумент1> в качестве нового первого элемента.

Если <аргумент2> является атомом (т. е. не списком), то функция cons соз-дает точечную пару ТИПа (<аргумент1> . <аргумент2>). ФуНКЦИЯ cons ЯВЛЯ-ется основным инструментом создания точечных пар, которые совместнос целочисленными первыми элементами используются в структуре прими-тивов AutoCAD (см. разд. 2.12).

Примеры:D (cons 67.4 '(10.3 -3.9)) возвращает (67.4 Ю.З -3.9)

(cons "Happy" '("New" "Year")) возвращает ("Happy" "New" "Year")

° (cons 2 4) возвращает (2 . 4)

° (cons 8 "0") возвращает (8 . "0")D (cons 62 i) возвращает (62 . i)

° (cons 262 n i l ) возвращает (262) (nil интерпретируется как пустой спи-сок, т. е. г о )

2.9.9. Функция vl-list*Создает список, точечную пару, точечный список или возвращает значениепервого аргумента, если остальные аргументы не заданы.

(vl-list* <объект1> [<объект2> ... [<объектЫ>]...])

Аргументы — любые.

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

Page 118: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 117

Если количество аргументов равно двум, а <объект2> — атом (т. е. не спи-сок), то возвращается точечная пара из значений двух аргументов. Если ко-личество аргументов равно двум, а <объект2> — список, то возвращаетсясписок, в котором первым элементом является значение аргумента <объект1>,а вторым элементом — результат применения функции cdr к аргументу<объект2> (т. е. фактически вместо функции vi-i ist* выполняется функ-ция cons).

Если количество аргументов больше двух, а <объектм> — атом, то возвраща-ется точечный список (см. примеры ниже), в котором значения первых ар-гументов отделены точкой от значения последнего аргумента. Если количе-ство аргументов больше двух, а <объекты> — список, то возвращается спи-сок, в котором на первом месте стоят значения всех аргументов, кромепоследнего аргумента, а последним элементом является результат примене-ния фуНКЦИИ cdr К аргументу <o6beKTN>.

Примеры:

° (vi-iist* 77) возвращает 77

° (vl-list* 77 55) возвращает (77 . 55)

° ( v l - l i s t * 77 ' ( 5 5 ) ) ВОЗВращаеТ (77 55)

п ( v l - l i s t * 77 ' ( 5 5 0 ) ) в о з в р а щ а е т (77 55 0)

° ( v l - l i s t * 42 77 55) в о з в р а щ а е т (42 77 . 55) ( э т о и е с т ь т о ч е ч н ы й с п и с о к )

п ( v l - l i s t * 12 94 77 ' ( 5 5 0 ) ) ВОЗВращаеТ (12 94 77 55 0)

2.9.10. Функция memberПроверяет принадлежность элемента списку.

(member <элемент> <список>)

Типы аргументов: олемент> — любой, <список> — список.

Если функция member обнаруживает олемент> в аргументе <список>, то воз-вращает остаток списка, начиная с этого места; если <элемент> в аргументе<список> не обнаруживается, то функция возвращает nil.

Примеры:

о (member 1 ' (4 50 1 2)) возвращает (12)п (member 4 ' (4 50 1 2) ) возвращает (4 50 1 2)

D (member 0 ' (4 50 1 2) ) возвращает nilD (member 80 nil) ВОЗВращаеТ nil

Page 119: Visual LISP и секреты адаптации AutoCAD

/18 Visual LISP и секреты адаптации AutoCAD

2.9.11. Функция assoc

Функция assoc применяется к сложному списку, в котором элементами яв-ляются списки или точечные пары, и выбирает из этих элементов (внут-ренних списков и точечных пар) тот, у которого первый элемент имеет за-данное значение.

(assoc <код> <список>)

Если в аргументе <список> имеется несколько элементов, удовлетворяющихтребуемому условию, то в качестве возвращаемого значения выбираетсяпервый из них. Функция assoc — основной инструмент в операции, когдаиз списка с данными примитива AutoCAD нужно выбрать тот элемент, ко-торый содержит точечную пару с нужным DXF-кодом свойства (цвета, типалинии, веса и т. д.).

Возвращаемое значение — точечная пара или список, являющиеся элемен-тами аргумента <список> и имеющие в качестве своего первого элемента за-данный <код>.

Примеры:D (assoc 8 ' ( ( 8 . "Walls") (6 . "ACAD_ISO05W100") ) ) ВОЗВращаеТ

(8 . "Walls")

° (assoc 7 ' ( ( 8 • "Walls") (6 . "ACAD_ISO05WIOO") )) возвращает n i l

° ( a s s o c 6 2 ' ( ( 6 2 . 4 ) ( 6 . " A C A D _ I S O 0 5 W 1 0 0 " ) ) ) В О З В р а щ а е Т ( 6 2 . 4 )

° ( a s s o c 1 0 ' ( ( 1 0 1 7 . 2 1 3 . 5 2 . 0 9 ) ( 1 0 6 1 2 . 0 4 5 . 9 2 3 . 3 ) ) ) В О З В р а щ а е Т

( 1 0 1 7 . 2 1 3 . 5 2 . 0 9 )

2.9.12. Функция applyПрименяет функцию, имя которой задано в первом аргументе после апост-рофа, поочередно ко всем элементам списка, заданного аргументом<список>.

(apply '<функция> <список>)

Примеры:

° (apply •* ( l i s t 2 3 5)) равносильно (* 2 з 5), поэтому возвращает зо

(apply 'max ( l i s t 2 3 5)) Возвращает 5

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

Page 120: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 119

2.9.13. Функция тарсагПрименяет функцию, имя которой задано аргументом <функция>, сначала кпервым элементам каждого из последующих аргументов, являющихся спи-сками (<список1>, ..., <cnMcoKN>), затем— ко вторым элементам и т.д.; ре-зультаты объединяются в новый список, который является возвращаемымзначением.

( т а р с а г ' < ф у н к ц и я > < с п и с о к 1 > [ < с п и с о к 2 > . . . [ < с п и с о к ] \ 1 > ] . . . ] )

П р и м е р ы :

° (тарсаг •* ' ( 2 3) ' ( 1 5 ) ) возвращает (2 15), т . к . первый элемент ре-зультирующего с п и с к а вычисляется к а к (* 2 1), а второй — к а к (* з 5)

° (тарсаг ' - ' ( 2 3) ' ( 1 5)) возвращает (1 -2) , т . к . первый элемент ре-зультирующего списка вычисляется как (- 2 i ) , а второй — к а к (- з 5;

2.9.14. Функция vl-everyПроверяет, возвращает ли тест-функция результат т со всеми списками-аргументами (функция применяется сначала к первым элементам всех спи-сков, затем ко вторым элементам и т. д.).

(vl-every '<тест-функция> <список1> [<список2> ... [<списокМ>]...])

Аргументы: <тест-функция> — любая функция (тест-функция), которая мо-жет выполнить свою проверку с тем же количеством аргументов, что и ко-личество списков-аргументов функции vl-every, и которая возвращает т илиn i l ; <список1>, ..., <списокы> — списки, из которых передаются тест-функ-ции сначала первые элементы, затем — вторые элементы и т. д. до исчерпа-ния хотя бы одного из списков-аргументов.

Если для элементов с одинаковыми номерами (первых, вторых и т. д.) всехсписков тест-функция возвращает т, то и функция vi-every возвращает т.В других случаях функция vl-every возвращает n i l .

Примеры:

° (vl-every •= ' (5 6) ' (5.0 б.о 7.0)) возвращает т (поскольку в первомсписке только два элемента, то проверка на равенство выполняется двараза, и оба раза результат — т)

° (vi-every '< ' (2 l) ' ( 5 б) ' (5 .0 6.5)) возвращает n i l (уже для первыхэлементов функция < дает результат n i l )

о (vi-every '< n i l ' ( 5 6) ' (5.0 6.5)) возвращает т ( n i l — это список изнуля элементов, поэтому проверка выполняется 0 раз и результат долженбыть т)

В качестве тест-функций могут использоваться также функции lambda иfunction (см. разд. 2.16).

Page 121: Visual LISP и секреты адаптации AutoCAD

120 Visual LISP и секреты адаптации AutoCAD

2.9.15. Функция foreach

Функция foreach позволяет организовать циклическое выполнение выраже-ний (их может быть несколько), поочередно подставляя вместо переменнойцикла (аргумента <имя>) элементы списка.

(foreach <имя> <список> [<выражение1> [<выражение2>... [<выражениеЫ>]...]])

Функция возвращает значение последнего вычисленного выражения. Еслиаргументы <выражение1>, ..., <выражениеЫ> не заданы, ТО функция foreach

возвращает n i l .

Пример:D (setq si 0 s2 1)

(foreach p ' (1 2 3 4 5) (setq si (+ si p) ) (setq s2 (* s2 p) ) ) BO3-

вращает 120 (результат вычисления s2 — произведения чисел списка);кроме того, в переменной si сформируется сумма чисел списка

2.9.16. Функция eval

Функция eval позволяет сформировать список и затем вычислить его(evaluate) как выражение. В таком списке на первом месте должно стоятьимя функции.

(eval <список>)

Пример:

° (setq mylist (list 'max 1.7 9.34 6.7))

( e v a l m y l i s t ) В о з в р а щ а е т 9 . 3 4 ( в ы ч и с л я е т с я в ы р а ж е н и е ( m a x 1 . 7 9 . 3 4 6 . 7 ) )

2.9.17. Функция quote

Функция quote является обратной по отношению к функции eval и позво-ляет обрабатывать выражение как список, т. е. не вычисляя его. Сокращен-ным вариантом имени функции quote является одинарная кавычка.

(quote <список>)

Примеры:

° ( q u o t e 6 7 8 2 1) В о з в р а щ а е т ( 6 7 8 2 1 )

° ' (16 23 90) в о з в р а щ а е т (16 23 90)

Кавычка очень часто используется при построении постоянных списков.См. также функцию function (разд. 2.16).

Page 122: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 121

2.9.18. Функция acad_strlsortПозволяет отсортировать по возрастанию список, элементами которого яв-ляются строки.

(acad_strlsort <список>)

Примеры:

° (acad_str isort ' ("Пн" "Вт" "Ср" "чт" "Пт" "сб" "Вс")) возвращает("Вс" "Вт" "Пн" "Пт" "Сб" "Ср" "Чт")

° (acad_str lsort '("Январь" "Февраль" "Март")) возвращает("Март" "Февраль" "Январь")

2.9.19. Функция last

Функция last возвращает последний элемент списка, заданного аргументом<список>, или nil, если список пуст.

(last <список>) - '

Примеры:

° (last ' ()) возвращает ni l

° (last ' (16 23 90)) возвращает 90

2.9.20. Функция substЗаменяет в списке старый элемент на новый.

(subst <новый> <старый> <список>)

Аргументы: <новый> и <старый> — любые символы AutoLISP; <список> — этосписок, в,котором элемент <старый> нужно заменить на элемент <новый>.

Возвращаемое значение — список с замененным, возможно, элементом.

Примеры:а ( s u b s t 6 5 ' (11 5 7 0 ) ) в о з в р а щ а е т ( и б 7 0)

D ( s u b s t 5 11 ' ( 1 1 5 1 0 ) ) Возвращает (5 5 7 0)

2.9.21. Функция lengthВозвращает длину (количество элементов) списка.

(length <список>)

Аргумент — список (может быть nil). Точечные пары и точечные списки недопускаются (сравните с функцией vi-iist-iength).

Возвращаемое значение — неотрицательное целое число.

Page 123: Visual LISP и секреты адаптации AutoCAD

122 Visual LISP и секреты адаптации AutoCAD

Примеры:D (length • о ) возвращает о

° (length nil) возвращает о0 (length '(15 23 1 7 9) ) Возвращает 5

2.9.22. Функция vHist-lengthВозвращает длину (количество элементов) списка.

' vi-list-length <список>)

Аргумент — список, точечная пара или точечный список (см. описаниефункции vi-i ist* в разд. 2.9.9), может быть nil.

Возвращаемое значение: для списка — положительное целое число, дляm i — о, для точечных пар и точечных списков — nil .

Примеры:

° (vi-iist-iength '()) возвращает о

° (vi-iist-iength nil) возвращает о

° { v i - i i s t - i e n g t h ' ( 2 0 4 0 ) ) в о з в р а щ а е т 2

° ( v l - l i s t - l e n g t h ' ( 2 0 . 5 ) ) в о з в р а щ а е т n i l

D ( v l - l i s t - l e n g t h ' ( 2 0 4 0 . 5 ) ) в о з в р а щ а е т n i l

2.9.23. Функция vl-member-ifПроверяет истинность результата применения тест-функции хотя бы к од-ному элементу списка.

(vl-member-if '<тест-функция> <спмсок>)

Аргументы: <тест-функция> — одноместная функция, применяемая поэле-ментно ко второму аргументу; <список> — список с проверяемыми эле-ментами.

Возвращаемое значение: остаток списка <список>, начиная с того элемента,для которого впервые тест-функция выд&та результат, отличный от nil. Ес-ли для всех элементов аргумента <список> тест-функция вернула nil, тофункция vi-member-if тоже возвращает nil.

Примеры:D (vl-member-if ' zerop '(1.2 0.0 0.0 3.6 0.0)) возвращает (0.0 0.0 3.60.0)

° (vl-member-if 'numberp '(T "000.000")) возвращает nil

В качестве тест-функций могут быть использованы также функции lambdaи function (см. разд. 2.16).

Page 124: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 123_

2.9.24. Функция vl-member-if-notПроверяет, возвращает ли тест-функция, примененная хотя бы к одномуэлементу списка, ложный результат.

(vl-member-if-not '<тест-функция> <список>)

Аргументы: <тест-функция> — одноместная функция, применяемая поэлемент-но ко второму аргументу; <список> — список с проверяемыми элементами.

Возвращаемое значение: остаток списка <список>, начиная с того элемента,для которого впервые тест-функция выдала результат, равный nil. Если длявсех элементов аргумента <список> тест-функция вернула не nil, то функ-ция vi-member-if-not тоже возвращает nil.

Примеры:

° ( v l - m e m b e r - i f - n o t ' z e r o p ' ( 0 . 0 0 . 0 3 . 6 0 . 0 ) ) в о з в р а щ а е т ( 3 . 6 0 . 0 )

° ( v l - m e m b e r - i f - n o t ' n u m b e r p ' (T " 0 0 0 . 0 0 0 " ) ) В о з в р а щ а е т (Т " 0 0 0 . 0 0 0 " )

В качестве тест-функций могут использоваться также функции lambda иfunction (см. разд. 2.16).

2.9.25. Функция vl-positionВыдает номер позиции элемента в списке.

(vl-position <элемент> <список>)

Аргументы: <элемент> — любой объект, проверяемый на присутствие в спи-ске; <список> — список, в котором проверяется наличие объекта олементх

Возвращаемое значение — целое число, являющееся номером позиции ис-комого элемента в списке (первый элемент списка имеет номер 0). Еслиолемент> в аргументе <список> не обнаружен, то возвращается nil.

Примеры:

° ( v l - p o s i t i o n 4 " ( 0 3 6 4 7 8 ) ) в о з в р а щ а е т з

о ( v l - p o s i t i o n 5 ' (0 3 6 4 7 8 ) ) в о з в р а щ а е т n i l

2.9.26. Функция vhremoveУдаляет элемент с заданным значением из списка.

(vl-remove <элемент> <список>)

Аргументы: олемент> — любой объект, проверяемый на присутствие в спи-ске; <список> — список, из которого нужно удалить объект <элемент>.

Возвращаемое значение — <список>, но без всех вхождений удаляемого объ-екта олементх Если олемент> в списке не обнаружен, то возвращается ста-рое значение аргумента <список>.

Page 125: Visual LISP и секреты адаптации AutoCAD

124 . Visual LISP и секреты адаптации AutoCAD

Примеры:

° ( v l - r e m o v e 4 ' ( 0 3 6 4 4 8 ) ) в о з в р а щ а е т ( 0 3 6 8 )D ( v l - r e m o v e 5 ' ( 0 3 6 4 7 8 ) ) В О З В р а щ а ё Т ( 0 3 6 4 7 8 ) -

2.9.27. Функция vl-remove-ifУдаляет из списка все элементы, возвращающие т при проверке тест-функ-цией.

(vl-remove-if '<тесг-функция> <список>)

Аргументы: <тест-функция> — функция, применяемая для проверки пооче-редно к каждому элементу списка; <список> — список, из которого нужноудалить объекты.

Возвращаемое значение — <список>, но без всех вхождений удаляемого объ-екта олементх Если элемент в списке не обнаружен, то возвращается ста-рое значение аргумента <список>.

Примеры:

° (vl-remove-if 'minusp '(-50 3 -6 -4 4 8)) возвращает (3 4 8)

° (vl-remove-if 'listp '(0 nil 6 4 (7 8))) возвращает (0 6 4)

В качестве тест-функций могут использоваться также функции lambda иfunction (см. разд. 2.16).

2.9.28. Функция vl-remove-if-notУдаляет из списка все элементы, возвращающие nil при проверке тест-функцией.

(vl-remove-if-not '<тест-функция> <список>)

Аргументы: <тест-функция> — функция, применяемая для проверки пооче-редно к каждому элементу списка; <список> — список, из которого нужноудалить объекты.

Возвращаемое значение — <список>, но без всех вхождений удаляемого объ-екта олементх Если элемент в списке не обнаружен, то возвращается ста-рое значение аргумента <список>.

Примеры:0 (vl-remove-if-not 'minusp '(-50 3 -6 -4 4 8)) Возвращает (-50 -6 -4)

(vl-remove-if-not 'listp '(0 nil 6 4 (7 8))) возвращает (nil (7 8))

° (vl-remove-if-not 'listp '(0 () 6 4 (7 8))) возвращает (nil (7 8))

В качестве тест-функций могут фигурировать также функции lambda иfunction (см. разд. 2.16).

Page 126: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 125_

2.9.29. Функция vl-someПроверяет в списках поочередно элементы с одинаковым номером всехсписков на предмет возвращения тест-функцией результата т.

(vl-some '<тест-функиия> <список1> [<список2> . . . [<списокК1>]...])

Аргументы: <тест-функция> — функция, применяемая одновременно к эле-ментам с одинаковыми номерами (к первым, ко вторым и т. д.) всех спи-сков; <список1>, ... <списоки> — списки с проверяемыми элементами.

Возвращаемое значение — т, если тест-функция дала результат т хотя быодин раз (на элементах с одинаковыми номерами для всех списков). В про-тивном случае возвращается n i l .

Примеры:

° (vl-some ' = ' ( 2 4 6) ' (0 3 6) ' ( 9 5 6 ) ) возвращает т

° (vl-some v = ' ( 2 4 6) '(0 3 6) ' ( 9 5 6 ) ) возвращает т

° (vl-some '> ' (2 4 6) ' (0 3 6) ' ( 9 5 6 ) ) возвращает n i l

В качестве тест-функций могут применяться также функции lambda иfunction (см. разд. 2.16).

2.9.30. Функция vl-sortСортирует элементы в списке таким образом, чтобы тест-функция выдаваларезультат т после применения ее к новому списку. Повторяющиеся элемен-ты при перестановке удаляются.

(vl-sort <список> '<тест-функция>)

Аргументы: <список> — список, элементы которого сортируются; <тест-Функция> — функция, которая может быть применена сразу ко всем элемен-там списка в качестве аргументов.

Возвращаемое значение — список, в котором все элементы взяты из аргу-мента <список>, НО отсортированы С ПОМОЩЬЮ ФУНКЦИИ <тест-функция>.

Примеры:

° (vi-sort ' ( 0 4 2 1 ) •>) возвращает ( 4 2 1 0 )0 (vl-sort ' ( 0 4 0 2 2 1 ) '<) Возвращает ( 0 1 2 4 )

В качестве тест-функций могут фигурировать также функции lambda иfunction (см. разд. 2.16). Например,

(vl-sort '((2.2 2.0) (4.1 3.6) (1.5 2.4)) (function (lambda (el e2)(> (car el) (car e2)))))

в о з в р а щ а е т с п и с о к ( ( 4 . 1 з . б ) - ( 2 . 2 2 . 0 ) ( 1 . 5 2 . 4 ) ) с д в у м е р н ы м и т о ч к а м и ,у п о р я д о ч е н н ы м и п о у б ы в а н и ю п е р в о й к о о р д и н а т ы .

Page 127: Visual LISP и секреты адаптации AutoCAD

126 Visual LISP и секреты адаптации AutoCAD

2.9.31. Функция vl-sort-iВычисляет номера элементов в списке для сортировки элементов таким об-разом, чтобы тест-функция выдавала результат т после применения ее к но-вому списку. Повторяющиеся элементы при перестановке не удаляются(сравните с функцией vi-sort).

(vl-sqrt-i <список> '<тест-функция>)

Аргументы: <список> — список с номерами (целыми числами), указываю-щими порядок сортировки элементов; <тест-функция> — функция сортиров-ки, которая может быть применена сразу ко всем элементам списка в ка-честве аргументов. Номер первого элемента списка равен 0.

Возвращаемое значение — список, в котором номера элементов указанытаким образом, чтобы выполнялась сортировка с помощью функции <тест-

Фуикция>.

Примеры:р ( v i - s o r t - i ' ( 0 4 2 1 ) •>) в о з в р а щ а е т а 2 з 0 )а ( v l - s o r t - i ' ( 0 4 0 2 2 1 ) ' < ) в о з в р а щ а е т ( 2 0 5 4 3 1 )

Могут использоваться для алгоритма сортировки также пользовательскиефункции lambda и function (см. разд. 2.16). Например,

(vl-sort-i '((2.2 2.0) (4.1 3.6) (1.5 2.4)) (function (lambda (el e2)(> (car el) (car e2) ) ) ) )

в о з в р а щ а е т с п и с о к ( i о 2 ) .

2.9.32. Функция vl-catch-all-applyПередает указанной функции список в качестве аргументов и дает возмож-ность фиксировать ошибки (сравните с функцией apply, не предоставляю-щей такую возможность).

(vl-catch-all-apply '<функция> <список>)

Аргументы: <функция> — имя функции, которой передается список в качест-ве аргументов; <список> — список, элементы которого передаются как аргу-менты фуНКЦИИ <функция>.

Возвращаемое значение — результат применения функции <функция> к спи-ску <список>. Если применение функции <функция> приводит к ошибке, товозвращается специальный объект с характеристиками ошибки (см. описа-ние функции vl-catch-all-apply-error-message).

Примеры:

° (vl-catch-all-apply '* ' (6 -2 3) ) ВОЗВращаеТ -36

° (vl-catch-all-apply ' sqr t '(-2)) Возвращает #<%catch-all-apply-error%>,что является объектом типа VL-CATCH-ALL-APPLY-ERROR; далее для

Page 128: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 127

расшифровки объекта можно воспользоваться функцией vi-catch-aii-error-message

2.9.33. Функция vl-catch-all-error-messageРасшифровывает сообщение об ошибке, закодированное в объекте, котороепри сбое возвращает функция vi-catch-aii-appiy.

(vl-catch-all-error-message <объект>)

Аргумент — объект типа VL-CATCH-ALL-APPLY-ERROR, возвращенныйфункцией vl-catch-all-apply.

Возвращаемое значение — строка с текстом сообщения об ошибке.

Пример (связан с примером предыдущего раздела):

° (setq em (vl-catch-all-apply ' s q r t ' ( -2))) возвращает #<%catch-all-apply-error%>

(vl-catch-all-error-message em) возвращает "функция для аргумента незадана: -2" (в английской версии сообщение выглядит так: "functionundefined for argument: -2")

2.9.34. Функция vl-catch-all-error-pПроверяет, является ли объект, возвращенный функцией vi-catch-aii-appiy, объектом типа VL-CATCH-ALL-APPLY-ERROR.

(vl-catch-all-error-p <аргумент>)

Тип аргумента — любой.

Возвращаемое значение: т, если <аргумент> относится к объектам типаVL-CATCH-ALL-APPLY-ERROR; и nil, если <аргумент> имеет другой тип.

Пример (связан с примером из разд. 2.9.32):

° (setq em (vl-catch-all-apply ' s q r t ' ( -2)) ) возвращает #<%catch-all-apply-error%>

(vl-catch-al l-error-p em) возвращает т

Для сравнения: (type em) возвращает VL-CATCH-ALL-APPLY-ERROR

2.10. Функции ввода данныхи указания объектовВ следующих разделах рассматриваются функции, которые дают возмож-ность пользователю вводить данные в интерактивном режиме. Здесь жеприводятся функции доступа к системной информации (переменным окру-жения, системным переменным и т. п.).

Page 129: Visual LISP и секреты адаптации AutoCAD

128 Visual LISP и секреты адаптации AutoCAD

2.10.1. Функция initgetЗадает ограничения последующего ввода данных.

(initget [<флаг>] [<строка>])

Вызов функции initget должен предшествовать в программе обращению кфункциям getint, getreal, getdist, getangle, getorient, getpoint, getcorner,getkword (а также К рассматриваемым В разд. 2. /^функциям entsel, nentselи nentseip), поскольку именно для них устанавливаются ограничения.

В частности, initget может сохранять за пользователем возможность нажа-тия клавиши <Enter> вместо ввода данных (например, для выбора значенияпо умолчанию), а может и не сохранять. Отсутствие вызова функцииinitget перед обращением к функциям getint, getreal и т. п. означает, чтов этом обращении нет ограничений на ввод данных.

Аргумент <флаг> функции initget — это битовый флаг, который долженбыть целым числом (от 0 до 255), являющимся суммой битов с соответст-вующими каждому из них весовыми значениями (нумеруются по степенямчисла 2). Биты описываются в табл. 2.3. Если бит не установлен, то его зна-чение в битовом флаге считается равным нулю.

Таблица2.3. Значения битов функции initget

Бит Назначение

1 Не разрешает пустой ввод (пустой ввод— это нажатие только клавиши<Enter>)

2 Не разрешает ввод нуля

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

8 Разрешает указание точек за пределами лимитов, несмотря на значениесистемной переменной LIMCHECK

16 Данный бит не задействован

32 Заставляет AutoCAD использовать штриховую линию вместо сплошной длярезиновой нити и резиновой рамки; если значение системной переменнойPOPUPS равно нулю, то AutoCAD игнорирует данный бит

64 Запрещает ввод третьей координаты для точки в функции g e t d i s t

128 Разрешает произвольный ввод в качестве ключевого слова; преобладаетнад другими битами и ключевыми словами; в частности, данный бит позво-ляет игнорировать значение бита 1

Примеры использования битового флага:

° (initget 1) — не разрешен пустой вводD (initget 3) — не разрешены пустой ввод и ввод нуля (3 = 1+2)

Page 130: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 129_

° (initget 7) — не разрешены пустой ввод, ввод нуля и ввод отрицатель-ных чисел (7 = 1+2+4)

° (initget 6) — разрешен пустой ввод, но не разрешены ввод нуля и вводотрицательных чисел (6 = 2+4)

Аргумент <строка> функции initget — это строка, ограниченная двойнымикавычками, которая задает ключевые слова, являющиеся допустимыми вари-антами ввода. В аргументе <строка> различные варианты ключевых слов раз-деляются одним или большим количеством пробелов, например: "А Б в г д".Если пользователю при выборе ключевого слова разрешаются сокращенныеварианты, тогда обязательная часть ключевого слова в аргументе <строка>должна быть указана в верхнем регистре, например: "ПЕРесечение". В этомслучае к допустимым относятся следующие варианты ввода: "ПЕР", "пер","ПЕРЕ", "пере", "перес", "ПЕРЕСЕЧЕН", "ПЕРЕСЕЧЕНИЕ" (после Трех обязательныхбукв может идти любое количество необязательных букв, вплоть до набораполного ключевого слова; при вводе букв верхний и нижний регистры рав-ноправны); недопустимыми вариантами будут "п", "ПЕ", "П", "пе".

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

(initget "выХод")

Здесь допустимыми вариантами ввода будут "х", "хо", "ход" или "выход","вых", "выхо".

Если ключевое слово в аргументе <строка> указано только в верхнем илитолько в нижнем регистре, то рядом через запятую можно указать сокра-щенный вариант: "КРАСНЫЙ,КР" — это равносильно записи "красный".

В локализованных (т. е. переведенных на другие языки) версиях системыAutoCAD в аргументе <строка> могут присутствовать варианты ввода как длялокализованной, так и для английской версий. Тогда в начале должны идтилокализованные ключевые слова, а затем их английские аналоги, причемпервый английский аналог обязан начинаться с символа подчеркивания.Количество локализованных ключевых слов должно равняться количествуанГЛИЙСКИХ ключевых СЛОВ. Например: "Прямой Криволинейный _ S t r a i g h t

curved". В этом случае даже при вводе русского варианта будет возвращатьсяанглийское значение ("Straight" ИЛИ "Curved").

Сама функция initget всегда возвращает nil . Однако за ней (не обязательнов следующей строке) должна идти функция, для которой функция initgetустановила ограничения ввода. В качестве возвращаемого значения этафункция (например, getreal) выдаст допустимое значение, указанное поль-зователем, причем в случае ввода сокращенного варианта ключевого сло-ва — полный вариант ключевого слова.

Поскольку не все биты функции initget используются со всеми функциямиввода данных, то в табл. 2.4 разбираются варианты применения (в случаевозможности использования ставится плюс).

5 Зак 155

Page 131: Visual LISP и секреты адаптации AutoCAD

130 Visual LISP и секреты адаптации AutoCAD

Таблица 2.4. Биты функции ini tget и их использование в функциях ввода

Функция Бит1 Бит 2 Бит 4 Бит 8 Бит 32 Бит 64 Бит 128

getint + + + +

getreal + + + +

getdist + + + + + +

getangle + + + +

getorient + + + +

getpoint + + + +

getcorner + + + +

getkword + +

ФуНКЦИИ entse l , nentsel И nentselp He ИСПОЛЬЗУЮТ биты фуНКЦИИ i n i t g e tи управляются только ключевыми словами.

Функция getstring не использует ни биты, ни ключевые слова функцииinitget.

2.10.2. Функция getkwordДает возможность пользователю ввести допустимое ключевое слово.

(getkword [<запрос>])

Аргумент о а п р о о — произвольная текстовая строка.

Возвращаемое значение (ключевое слово или nil) зависит от допустимыхключевых слов и битов, установленных соответствующим предварительнымВЫЗОВОМ ФУНКЦИИ i n i t g e t .

В листинге 2.9 рассматривается пример совместной работы функций initgetИ getkword.

i Листинг 2.9. Пример использования функции getkword :

( in i tge t 1 "Да Нет")(setq reply (getkword "Преобразовать линию? [Да/Нет]: "))

В ЭТОМ примере фуНКЦИЯ getkword ВЫВОДИТ запрос "Преобразовать линию?[Да/нет]: " и ожидает ответа пользователя. По окончании ввода пользова-телем допустимого ответа AutoLISP присваивает переменной reply значение

Page 132: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 131

"Да" или "нет". Если введен недопустимый ответ, то генерируется сообще-ние об ошибке, и снова повторяется предыдущий запрос.

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

2.10.3. Функция getintДает возможность пользователю ввести целое число (в диапазоне от —32 768до +32 767) или допустимое ключевое слово.

(getint [<запрос>])

Аргумент о а п р о о — произвольная текстовая строка.

Возвращаемое значение — целое число, ключевое слово или nil. Зависит отдопустимых ключевых слов и битов, установленных соответствующим пред-варительным вызовом функции initget.

В листингах 2.10 и 2.11 рассматривается пример совместной работы функ-ций initget И getint.

I Листинг 2.10. Пример 1 использования функции g e t i n t i

(initget 6)(setq numb (getint "Введите номер участка (<1>): "))

В этом примере сначала устанавливаются ограничения на будущий ввод це-лого числа (не допускаются нуль и отрицательные числа). Разрешен пустойВВОД. ФуНКЦИЯ g e t i n t ВЫВОДИТ на Экран запрос "Введите номер участка(<1>): ". Ее возвращаемым значением будет nil, если пользователь ответитпростым нажатием клавиши <Enter>, или введенное пользователем допус-тимое целое число (например, п ) . В случае ввода пользователем недопусти-мого целого числа (например, о или -2) функция getint выдаст сообщениеоб ошибочном значении и будет ожидать допустимого варианта ввода.

В программе, приведенной в листинге 2.10, далее должна быть предусмотре-на обработка пустого ввода для того, чтобы в этом случае присвоить пере-менной numb значение по умолчанию (l):

(if (not numb) (setq numb 1))

Листинг 2.11. Пример 2 использования функции g e t i n t

( in i tge t 6 "Левый Правый Нижний Верхний")(setq numb (getint "Введите номер участка (<1>) или[Левый/Правый/Нижний/Верхний]: "))

Page 133: Visual LISP и секреты адаптации AutoCAD

132 Visual LISP и секреты адаптации AutoCAD

В этом примере устанавливаются ограничения на будущий ввод целого чис-ла (не допускаются нуль и отрицательные числа), однако разрешены пустойввод и ввод одного из четырех ключевых слов. Далее в программе долженидти анализ значения переменной numb на nil, на положительное целоечисло и на ключевые слова ("Левый", "Правый", "Нижний", "Верхний").

2.10.4. Функция getrealДает возможность пользователю ввести вещественное число или допустимоеключевое слово.

(getreal [<запрос>])

Аргумент о а л р о о — произвольная текстовая строка.

Возвращаемое значение — вещественное число, ключевое слово или nil.Зависит от допустимых ключевых слов и битов, установленных соответст-вующим предварительным вызовом функции initget.

2.10.5. Функция getdistПолучает расстояние (как вещественное число) с помощью ввода числа (наклавиатуре в текущей форме линейных единиц) или указания двух точек(мышью или в координатах на клавиатуре), если не задан аргумент <точка1>.Если задана точка с помощью аргумента <точка1>, то расстояние можно по-лучить с помощью ввода числа (на клавиатуре) или указания одной точки,до которой расстояние будет вычисляться от точки, заданной аргументом<точка1>.

(getdist [<точка1>] [<запрос>])

Типы аргументов: <точка1> — список из двух или трех чисел (координатыдвумерной или трехмерной точки), о а п р о о — произвольная текстоваястрока.

Возвращаемое значение — вещественное число (в текущей форме линейныхединиц), ключевое слово или nil . Зависит от допустимых ключевых слов ибитов, установленных соответствующим предварительным вызовом функцииinitget.

2.10.6. Функция getangleПолучает угол (как вещественное число в радианах) с помощью ввода числа(на клавиатуре в текущей форме угловых единиц) или указания двух точек(мышью или в координатах на клавиатуре), если не задан аргумент <точка1>.Если аргумент <точка1> задан, то угол можно получить с помощью вводачисла (на клавиатуре в радианах) или указания одной точки, до которой

Page 134: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 133_

расстояние будет вычисляться от точки, заданной аргументом <точка1>; привводе угла с помощью числа он принимается с учетом значения системныхпеременных ANGBASE и ANGDIR; возвращаемое значение учитывает зна-чение ANGBASE и игнорирует значение ANGDIR.

(getangle [<точка1>] [ОапроО] )

Типы аргументов: <точка1> — список из двух или трех чисел (координатыдвумерной или трехмерной точки), оапроо — произвольная текстоваястрока.

Возвращаемое значение — вещественное число, ключевое слово или nil.Зависит от допустимых ключевых слов и битов, установленных соответст-вующим предварительным вызовом функции initget.

2.10.7. Функция getorientПолучает угол как функция getangle, однако возвращаемое значение неучитывает значений системных переменных ANGBASE и ANGDIR (т. е. какбудто ANGBASE=0, ANGD1R=O).

(getorient [<точка1>] [<запрос>])

Типы аргументов: <точка1> — список из двух или трех чисел (координатыдвумерной или трехмерной точки), оапроо — произвольная текстоваястрока.

Возвращаемое значение — вещественное число, ключевое слово или nil.Зависит от допустимых ключевых слов и битов, установленных соответст-вующим предварительным вызовом функции initget.

2.10.8. Функция getpointДает возможность пользователю ввести точку с помощью клавиатуры илимыши. Если задан аргумент <точка1>, то при вводе точки с помощью мыширисуется резиновая нить, начинающаяся в точке, заданной аргументом<точка1>.

(getpoint [<точка1>] [<запрос>])

Типы аргументов: <точка1> — список из двух или трех чисел (координатыдвумерной или трехмерной точки), о а п р о о — текстовая строка.

Возвращаемое значение — список (координаты трехмерной точки в текущейсистеме координат), ключевое слово или nil. Зависит от допустимых клю-чевых слов и битов, установленных соответствующим предварительным вы-зовом функции initget.

Page 135: Visual LISP и секреты адаптации AutoCAD

134 Visual LISP и секреты адаптации AutoCAD

2.10.9. Функция getcornerДает возможность пользователю ввести точку с помощью клавиатуры илимыши. При вводе точки с помощью мыши рисуется резиновая рамка, начи-нающаяся в точке, заданной аргументом <точка1> (этот аргумент не можетбыть опущен).

(getcorner <точка1> [<запрос>])

Типы аргументов: <точка1> — список из двух или трех чисел (координатыдвумерной или трехмерной точки), оапроо — произвольная текстоваястрока.

Возвращаемое значение — список (координаты трехмерной точки в текущейсистеме координат), ключевое слово или nil . Зависит от допустимых клю-чевых слов и битов, установленных соответствующим предварительным вы-зовом функции initget.

2.10.10. Функция getstringДает возможность пользователю ввести строку с клавиатуры. Если заданаргумент <флаг> и он отличен от nil, то в строке, вводимой пользователем,допускаются пробелы (признаком конца является нажатие клавиши<Enter>). Если аргумент <флаг> отсутствует или задан равным nil, то при-знаком конца строки является пробел или нажатие клавиши <Enter>.

(getstring [<флаг>] [<запрос>])

Типы аргументов: <флаг> — любое значение (рекомендуется использоватьтолько т или nil), оапроо — текстовая строка.

Возвращаемое значение — строка (в случае пустого ввода возвращаетсястрока нулевой длины, т. е. "")•

Работа функции getstring не связана с предварительным вызовом функцииinitget.

2.10.11. Функция getvarЧитает текущее значение системной переменной с наименованием, задан-ным аргументом <имя>.

(getvar <имя>)

Тип аргумента: текстовая строка (в верхнем или нижнем регистрах) с на-именованием системной переменной AutoCAD.

Возвращаемое значение — текущее значение указанной системной пере-менной в текущем рисунке (если задано недопустимое имя переменной, товозвращается nil).

Page 136: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 135

Примеры:

° (getvar "ciAYER") возвращает значение системной переменной CLAYER(имя текущего слоя)

° (getvar "PDMODE") возвращает значение системной переменной PDMODE(текущий формат отображения точек)

п (getvar "CURSORSIZE") возвращает значение системной переменнойCURSORS1ZE (текущий размер перекрестия устройства указания)

2.10.12. Функция setvarПрисваивает новое текущее значение системной переменной с наименова-нием, заданным аргументом <имя>. Данная функция не может изменять зна-чения системных переменных, которые имеют пометку "только чтение"("read only").

(setvar <имя> <значение>)

Типы аргументов: <имя> — текстовая строка (в верхнем или нижнем регист-рах) с наименованием системной переменной AutoCAD, <значение> — чис-ло, список или строка (конкретный тип определяется именем переменной).

Возвращаемое значение — новое значение указанной системной перемен-ной. В случае попытки присвоить недопустимое значение или использоватьимя несуществующей переменной выдается сообщение об ошибке.

Примеры:

° (setvar "CECOLOR" "3") возвращает "3" — новое значение системной пе-ременной CECOLOR (номер текущего цвета)

° (setvar "CECOLOR" 3) выдает сообщение: ; ошибка: Настройка системнойпеременной AutoCAD отвергнута: "CECOLOR" 3 (; error. AutoCAD variablesetting rejected: "CECOLOR" 3)

2.10.13. Функция getenvЧитает текущее значение переменной окружения с наименованием, задан-ным аргументом <имя>.

(getenv <имя>)

Тип аргумента: текстовая строка (в верхнем или нижнем регистрах) с на-именованием переменной окружения (например, именем переменной, оп-ределенной в файле autoexec.bat).

Возвращаемое значение — значение указанной переменной (если в систем-ном окружении такая переменная не задана, то возвращается nil).

Page 137: Visual LISP и секреты адаптации AutoCAD

136 Visual LISP и секреты адаптации AutoCAD

Пример:n (getenv "TEMP") возвращает значение переменной окружения TEMP (на-

пример, "C:\\WINDOWS\\TEMP")

2.10.14. Функция setenvПрисваивает новое значение переменной окружения с наименованием, за-данным аргументом <имя>.

(setenv <имя> <значение>)

Типы аргументов: текстовые строки.

Возвращаемое значение — значение аргумента <значение>.

Пример:0 ( s e t e n v "MYJENWAR" "SPACE") ВОЗВращаеТ "SPACE"

Для того чтобы сбросить значение переменной окружения, ей следует при-своить значение "" (после этого функция getvar в качестве ее значения вы-даст nil).

2.10.15. Функция getcfgИзвлекает данные приложения из раздела AppData файла acad.cfg.

(getcfg <строка>)

Строка, заданная аргументом <строка> должна иметь вид "AppData/HM#_приложения /имя_раздела/ ... /имя_параметра".

Тип возвращаемого значения — строка.

2.10.16. Функция setcfgЗаписывает данные приложения в раздел AppData файла acad.cfg.

{setcfg <имя> <значение>)

Аргумент <имя> должен иметь вид "АррОа!а/имя_приложения/имя_раздела/ ... /имя_параметра" (допустимая длина — до 496 символов).

Возвращаемое значение — значение аргумента <значение> или nil (в случаеошибки).

2.10.17. Функция getcnameПолучает имя команды в Локализованной или английской версии AutoCAD.

(getcname <имя>)

Page 138: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 137

Тип аргумента: строковый.

Возвращаемое значение — строка или nil.

Примеры".

° (getcname "_JLINE") ВОЗВращаеТ "ОТРЕЗОК"

° (getcname "ОТРЕЗОК") возвращает "_LINE"

2.10.18. Функция getfiledВызывает диалоговое окно поиска файла.

(getfiled <заголовок> <имя> <расширение> <флаг>)

Аргумент <заголовок> используется как заголовок диалогового окна; ар-гумент <имя> — это имя искомого файла или папки, с которой предлага-ется начать поиск; аргумент <расширение> — расширение искомого файла(<расширение>, равное "", заменяется на "*") ; аргумент <флаг> — опциифункции (см. ниже).

Типы аргументов: строковые (кроме последнего, который должен быть це-лым числом).

Возвращаемое значение — строковое (имя файла, выбранного пользовате-лем) ИЛИ nil.

Пример:п (getfiled "Выберите файл данных для расчета" "С:\\Ritm\\GenhullW911"

"dat" 16) вызывает окно, приведенное на рис. 2.5.

| Выберите Файл данных дпя расчета

Цапка: | J 9 1 1 3 M А з\л\ Genh_OO datJ*\ Genh_01.dati^] Get*_08,dat

Имя Файла: Дткрьгть |

Тип файлов: ".dat 2] Отмена [

Обнаружить 1 Найти... IР и с . 2 . 5 . Диалоговоеокно, вызываемоефункцией g e t f i l e d

Второй аргумент функции getfiled, в зависимости от значения четвертогоаргумента (<флаг>), может задавать либо имя файла по умолчанию, либо

Page 139: Visual LISP и секреты адаптации AutoCAD

138 Visual LISP и секреты адаптации AutoCAD

папку, с которой предлагается начать поиск. Битовый флаг, задаваемый ар-гументом <флаг>, получается как сумма тех битов, нумеруемых степенямичисла 2, которые будут установлены. Описание битов приведено в табл. 2.5.

Таблица 2.5. Значения битов функции get filed

Бит Значение

1 Подсказка имени при создании нового файла (нельзя использовать длявыбора существующего файла)

2 Не используется

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

8 Если бит 1 не установлен, то система AutoCAD выполняет поиск файла, имякоторого задано в аргументе <имя>, по списку путей, заданных в настройке,причем g e t f i l e d возвращает имя файла без пути; в противном случае воз-вращается полное имя файла (с путем)

16 Аргумент <имя> трактуется как имя папки, в которой нужно искать файл;при этом в поле Имя файла (File name) ничего не вписывается по умолча-нию (рис. 2.5); аналогичный эффект достигается и в том случае, если аргу-мент <имя> заканчивается обратной косой чертой

32 Если установлен бит 1, то не будет выводиться предупреждающее сообще-ние при записи поверх существующего файла

64 Не передает файл, если в качестве имени задан URL-адрес

128 Не допускается использование URL-адресов

2.10.19. Функция acad_colordlgВызывает диалоговое окно с палитрой, в котором пользователь должен вы-брать цвет.

(acad colordlg <номер> [<флаг>])

Аргумент <номер> показывает в окне цвет, предлагаемый в качестве значенияпо умолчанию. Если аргумент <флаг> не опущен и задан равным nil, то вокне гасятся кнопки с цветами ПОСЛОЮ (BYLAYER) и ПОБЛОКУ(BYBLOCK).

Типы аргументов: <номер> — целое число в диапазоне 0—256 (0 соответству-ет значению ПОБЛОКУ (BYBLOCK), 256 - ПОСЛОЮ (BYLAYER)),<флаг> — любое значение.

Возвращаемое значение — целое число (номер цвета, выбранного пользова-телем). Если пользователь нажмет кнопку Отмена (Cancel), то возвращает-ся n i l .

Page 140: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 139

Пример:

° (acad_coiordig 4) вызывает диалоговое окно Выбор цвета (Select Color),приведенное на рис. 2.6.

\ЩВыбор цвета

Стандартные цвета

Ш ШОттенки серого

• • 2 -

Логические цвета

Подлою I По£поку |

Полная цветовая палитра

Цвет

Рис. 2 .6. Диалоговое окноВыбор цвета

В качестве значения цвета по умолчанию на рис. 2.6 предлагается "голубой",имеющий номер 4.

2.11. Функции печати, вывода сообщенийи доступа к файламВ данном разделе рассматриваются функции, выполняющие операции сфайлами (поиск, открытие и закрытие), операции чтения и записи строкили символов в файл, а также операции вывода сообщений на экран. Здесьже рассматриваются близкие по духу функции vi-prini-to-string иvl-princ-to-string.

Примеры работы с файлами приведены в разд. 2.11.27 и в приложении 13.

2.11.1. Функция findfileИщет файл по имени (краткому или полному).

(findfile <файл>)

Если аргумент содержит имя файла без полного пути, то поиск выполняетсяв рабочем каталоге и по стандартным для системы AutoCAD путям поискафайлов (см. настройку путей файлов поддержки AutoCAD — разд. 1.3). Воз-

Page 141: Visual LISP и секреты адаптации AutoCAD

140 Visual LISP и секреты адаптации AutoCAD

вращается полное имя файла, если файл найден, или nil — в противномслучае. Аррумент должен быть текстовой строкой.

Пример:0 (findfile "acad.hlp") возвращает "d:\\AutoCAD2000\\Help\\acad.hlp"

° (findfile "acad.mnu") возвращает "d:\\AutoCAD2000\\Support\\acad.hlp"

Согласно официальной документации, функция findfile должна выполнятьпоиск не только файла, но и папки по имени. Но не всегда функция в этомслучае работает правильно.

2.11.2. Функция openОткрывает файл.

(open <файл> <режим>)

Аргументы: <файл> — имя открываемого файла; <режим> — это строка из од-ного символа, определяющего режим, в котором открывается файл ("w" или"W" — запись, "а" или "А" — дополнение, "г" или "R" — чтение). В преды-дущих версиях AutoLISP не допускалось указание режима в верхнем регистре.

Если аргумент <файл> указывает на несуществующий файл в режимах "w","w, "а" и "А", то он создается. Если указано неполное имя (без пути), тофайл ищется в рабочем каталоге и по списку путей файлов поддержки.

Возвращаемое значение — дескриптор файла (при успешном открытии) илиnil (при неудаче).

Пример:D (setq fo (open "Norms.txt" "w")) возвращает #<file "Norms.txt">

(дескриптор файла)

Дескриптор будет использоваться в операциях записи в этот файл, поэтомуего обязательно нужно сохранять в какой-нибудь переменной.

2.11.3. Функция closeЗакрывает файл.

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

Единственным аргументом является <дескриптор> — переменная, создавае-мая функцией open и управляющая процессами записи и чтения.

Функция close возвращает nil, если указан действительный дескриптор,или сообщение об ошибке.

Пример (продолжение примера из разд. 2.11.2):

° (close fo) возвращает nil

Page 142: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP U1_

2.11.4. Функция read-lineЧитает строку из файла с заданным дескриптором.

(read-line [<дескриптор>])

Если аргумент <дескриптор> опущен, то выполняется чтение строки с кла-виатуры (строка должна закончиться нажатием клавиши <Enter>).

Возвращаемое значение — текстовая строка, прочитанная из файла илис клавиатуры.

Дескриптор содержит внутри себя информацию о текущей записи (т. е. тойзаписи, с которой будет выполняться очередная операция чтения или запи-си). Сразу же после выполнения функции open дескриптор указывает напервую запись файла.

Пример применения функции read-line см. в разд. 2.11.27.

2.11.5. Функция write-lineЗаписывает строку, заданную аргументом <строка>, в файл с дескриптором,заданным аргументом <дескриптор>. Если аргумент <дескриптор> опущен илиравен nil, то система AutoCAD выводит строку на экран. При записи стро-ка, заданная аргументом <строка>, заносится в файл (или выводится на эк-ран) без ограничивающих ее двойных кавычек.

(write-line <строка> [<дескриптор>])

Возвращаемое значение — значение аргумента <строка>.

Пример:

° (write-l ine "Плазовая книга" fo) возвращает "Плазовая книга"

2.11.6. Функция princЗаписывает значение аргумента <аргумент>, который может быть любым вы-ражением AutoLISP (а также числом, списком, строкой, именем примитиваи т. д.), в виде текстовой строки в файл с заданным дескриптором.

(princ [<аргумент> [<дескриптор>]])

Если аргумент <дескриптор> опущен или равен ni l , то <аргумент> выводитсяна экран. Если <аргумент> — строка, то при записи она заносится в файл(или выводится на экран) без ограничивающих ее двойных кавычек.

Возвращаемое значение — вычисленное значение аргумента <аргумент>. Ес-ли опущены оба аргумента, то функция осуществляет так называемый тихийвыход, т. е. не возвращает никакого значения, в том числе nil.

Page 143: Visual LISP и секреты адаптации AutoCAD

142 Visual LISP и секреты адаптации AutoCAD

Примеры:D (princ '(12.0 9.4) fo) возвращает (12.0 9.4)

° (prin-c "Мороз и солнце" fo) возвращает "Мороз и солнце"

° (princ) не возвращает ничего

2.11.7. Функция prinlФункция аналогична princ. Но если <аргумент> — строка, то при записи оназаносится в файл (или выводится на экран) с ограничивающими двойнымикавычками; специальные символы (обратная косая черта, кавычки, конецстроки и т. п.) предваряются обратной косой чертой.

(prinl [<аргумент> [<дескриптор>]])

Возвращаемое значение — вычисленное значение аргумента <аргумент>. Еслиопущены оба аргумента, то функция prinl тоже осуществляет тихий выход.

Примеры:

° (prinl '(12.0 9.4) fo) возвращает (12.0 9.4)

° (prinl "Мороз и солнце" fo) возвращает "Мороз и солнце"

° (prinl) не возвращает ничего

2.11.8. Функция printФункция аналогична prinl, но при выводе добавляет перед значением аргу-мента <аргумент> символ конца строки предыдущей записи, а после значе-ния — пробел.

(print [<аргумент> [<дескриптор>]])

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

Примеры:n (print '(12.0 9.4) fo) возвращает (12.0 9.4)

п (print "Мороз и солнце" fo) возвращает "Мороз и солнце"

° (print) не возвращает ничего

2.11.9. Функция read-charЧитает символ из файла. Если аргумент не задан, то выполняет чтение сим-вола из буфера клавиатуры.

(read-char [<дескриптор>])

Page 144: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP Ш_

Возвращает целое число — код прочитанного символа (аналогично функцииascii). При чтении из буфера клавиатуры — для клавиши <Enter> функциявозвращает 10.

См. пример в разд. 2.11.27.

2.11.10. Функция write-charЗаписывает буквенно-цифровой символ с заданным кодом в файл.

(write-char <код> [<дескриптор>])

Если аргумент <дескриптор> не задан, то выводит символ на экран.

Возвращаемое значение — целое число (код выведенного символа). Невоз-можно с помощью данной функции записать символ с кодом 0.

Примеры:

° (write-char 50) возвращает 50 (предварительно на экран выводится циф-ра 2, т. к. буквенно-цифровой символ "2" имеет код 50, а затем выводитсявозвращаемое значение; поэтому кажется, что возвращено значение 250,а не 50)

° (setq wcod (write-char 50)) возвращает 50 (если прочитать значение пе-ременной wcod, то оно тоже будет равно 50)

2.11.11. Функция promptВыводит сообщение на экран (если используется установка системыAutoCAD на двухэкранный вычислительный комплекс, то выводит сообще-ние на оба экрана). Чтобы избежать этого дублирования, можно пользовать-ся для вывода сообщений функцией princ.

(prompt <сообщение>)

Аргумент — текстовая строка.

Возвращаемое значение — nil.

Пример:а (prompt "День чудесный") ВОЗВращает nil

2.11.12. Функция alertПозволяет вывести на экран диалоговое окно с сообщением системыAutoCAD.

(alert <сообщение>)

Аргумент — текстовая строка.

Возвращаемое значение — nil.

Page 145: Visual LISP и секреты адаптации AutoCAD

144 Visual LISP и секреты адаптации AutoCAD

Максимальная длина строки <сообщение> зависит от многих вещей (в част-ности, от платформы) и может быть установлена пользователем самостоя-тельно. В случае превышения допустимой длины AutoCAD обрезает сооб-щение. При необходимости вывести сообщение в несколько строк нужноиспользовать знаки конца строки (\п).

Пример:

(setq lines (strcat "Я вас любил: любовь еще, быть может,\п"

"В душе моей угасла не совсем;\пНо пусть она вас больше не тревожит;\п"

"Я не хочу печалить вас ничем."))

(alert lines)

выводит на экран окно, изображенное на рис. 2.7.

Я вас любил: любовь еще; быть может,'В дйшв моей агасла не совсем;Но пусть она вас больше не тревожит;Я не хочз печалить вас ничем.

[. Ж | Рис. 2 . 7 . Диалоговое окно,вызываемое функцией a l e r t

В данном примере выведены четыре строки, поскольку трижды был исполь-зован знак конца строки. Выход из диалогового окна, изображенного нарис. 2.7, — щелчок по кнопке ОК.

2.11.13. Функция terpriПереводит курсор экрана на новую строку (очередное сообщение будет вы-водиться с начала следующей строки).

(terpri)

Возвращаемое значение — nil.

Фактически является аналогом (princ "\n"), но с другим возвращаемымзначением.

2.11.14. Функция vl-directory-filesВыводит список с именами файлов и папок, расположенных внутри указан-ной папки.

(vl-directory-files [<лапка> <образец> <флаг>])

Аргументы: <папка> — текстовая строка (имя папки (каталога), из которойнужно распечатать список с именами файлов и папок); <образец> — тексто-вая строка (DOS-шаблон для выбора имен файлов); <флаг> — целое число(флаг управления выводом имен папок).

Page 146: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1_45_

Если аргумент <папка> равен "" или ni l или опущен, то в качестве рассмат-риваемой папки принимается рабочий каталог AutoCAD (см. разд. 1.4). Еслиаргумент <образец> опушен или задан равным nil, в качестве его значенияпринимается "*.*".

Аргумент <флаг> может принимать только три значения:

• -1 — выводить только имена папок;

• о — выводить имена и файлов, и папок;

• 1 — выводить только имена файлов.

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

Возвращаемое значение — список с именами найденных файлов и папокили nil, если по заданному шаблону и флагу ничего не найдено.

Примеры:

° ( v l - d i r e c t o r y - f i l e s "d:\\AutoCAD2000" " a c a d . * " 1) возвращает( ( " a c a d . t l b " "acad.xmx" " a c a d . e x e " )

° ( v l - d i r e c t o r y - f i l e s ) ВОЗВращаеТ ДЛИННЫЙ СПИСОК ( " . " " . . " "TUTORIAL"

" a c u i l 5 . d l l " "acopm.arx" "AcDim.arx" "AcRefEd.arx" . . . ) (СПИСОК обор-

ван)

2.11.15. Функция vl-file-соруКопирует содержимое файла-источника в целевой файл. Если целевой файлсуществует, то либо копирование не выполняется, либо содержимое файла-источника дописывается в конец целевого файла.

(vl-file-copy <источник> <цель> [<добавление>])

Аргументы: <источник> — текстовая строка (имя файла-источника, т. е. фай-ла, из которого выполняется копирование); <цель> — текстовая строка(имя целевого файла, т. е. файла, в который выполняется копирование);<добавление> — признак, разрешающий добавление информации в конеццелевого файла, если он существовал до операции копирования (если аргу-мент <добавление> задан и не равен nil, то дописывание разрешено; иначегенерируется сообщение об ошибке).

Возвращаемое значение — целое число при успешном выполнении копиро-вания. При ошибке возвращается nil. Причинами ошибки могут быть, на-пример, такие ситуации:

• не существует файл-источник (или в качестве имени файла-источниказадано имя папки);

О целевой файл существует, но добавление в него не разрешено;

П сбой при чтении файла-источника;

Page 147: Visual LISP и секреты адаптации AutoCAD

146 Visual LISP и секреты адаптации AutoCAD

D сбой при записи (например, целевой файл защищен от записи);

• совпадают имена файла-источника и целевого файла.

Примеры:D (vi-fiie-copy "acad.isp" "acadl.lsp") возвращает nil (файл-источник

не найден)

° (vl-file-copy "acad2000.cfg" "acad2000dup.cfg") возвращает 483

2.11.16. Функция vl-file-deleteУдаляет файл с заданным именем.

(vl-file-delete <файл>)

Аргумент — текстовая строка с именем файла.

Возвращаемое значение — т, если удаление выполнено; ni l , если удалениене выполнено.

Пример (продолжение второго примера из предыдущего раздела):

° (vl-file-delete "acad2000dup.cfg") возвращает Т

См. также пример, приведенный в приложении 13.

2.11.17. Функция vMile-directory-pПроверяет, является ли имя, указанное в качестве аргумента, именем папки.

(vl-file-directory-p <имя>)

Аргумент — текстовая строка.

Возвращаемое значение — т, если аргумент указывает имя папки, и ni l —в остальных случаях.

Если аргумент <имя> не содержит полного пути к файлу, то проверяетсятолько рабочий каталог системы AutoCAD.

Примеры:D (vl-file-directory-p "Help") возвращает Т

° (vl-file-directory-p "Help2") Возвращает nil

2.11.18. Функция vl-file-renameПереименовывает файл или папку.

(vl-file-rename <старое> <новое>)

Аргументы — текстовые строки.

Page 148: Visual LISP и секреты адаптации AutoCAD

Глава 2. ЯзыкАиШЭР U7_

Возвращаемое значение — т, если переименование выполнено, и nil, еслипереименование невозможно.

Если аргумент <старое> не содержит полного пути к файлу, то переимено-вываемый файл (папка) ищется только в рабочем каталоге системы AutoCAD.

Пример:

° (vi-fiie-rename "Heip.txt" "Heip2.txt") возвращает т, если в рабочемкаталоге найдены файл или папка с именем "Heip.txt", и переименова-ние возможно

2.11.19. Функция vl-file-sizeВычисляет размер файла в байтах.

(vl-file-size <имя>)

Аргумент — текстовая строка.

Возвращаемое значение — целое число (размер файла в байтах). Если указаннесуществующий файл или аргумент является именем папки, то возвраща-ется nil.

Если аргумент <имя> не содержит полного пути к файлу, то анализируемыйфайл ищется только в рабочем каталоге системы AutoCAD.

Пример:

° (vl-file-size "acad.exe") возвращает 6868992, если в качестве рабочегокаталога указана папка с программным обеспечением системы AutoCAD

2.11.20. Функция vl-file-systimeВычисляет дату и время последней модификации файла.

(vl-file-systime <имя>)

Аргумент — текстовая строка с именем файла.

Возвращаемое значение — список из восьми целочисленных элементов:

П год

• месяц

• день недели

• день месяца

• часы

• минуты

• секунды

а о

Page 149: Visual LISP и секреты адаптации AutoCAD

148 Visual LISP и секреты адаптации AutoCAD

В качестве дня недели возвращается его порядковый номер (0 — воскре-сенье, 1 — понедельник, 2 — вторник и т. д.).

Пример:

° ( v l - f i l e - s y s t i m e " p l a n . d w g " ) МОЖет вернуть (1999 7 3 14 11 24 52 0 ) ,

что означает 14 июля 1999 года, 3-й день недели (среда), 11 час. 24 мин.52 сек.

2.11.21. Функция vhfilename-baseВыделяет имя файла, без расширения и пути.

{vl-filename-base <имя>)

Аргумент — текстовая строка с полным или кратким именем файла.

Возвращаемое значение — текстовая строка с именем файла (без расшире-ния и пути).

Функция не проверяет существования файла.

Пример:

° (vl-filename-base "d:\\Projectl2\\Resul\\valc02.1st") возвращает "valcO2"

См. также пример, приведенный в приложении 13.

2.11.22. Функция vl-filename-directoryВыделяет путь из полного имени файла.

(vl-filename-directory <имя>)

Аргумент — текстовая строка с именем файла.

Возвращаемое значение — строка (путь к файлу).

Функция не проверяет существования файла. Удобно использовать ее в парес функцией findfile, возвращающей полное имя файла.

Примеры:0 (vl-filename-directory "d:\\Projectl2\\Resul\\valc02.1st") возвращает

"d:\\Projectl2\\Resul"

° (vl-filename-directory "acad.lsp") возвращает ""

См. также пример, приведенный в приложении 13.

2.11.23. Функция vl-filename-extensionВыделяет расширение из имени файла.

(vl-filename-extension <имя>)

Аргумент — текстовая строка с именем файла.

Page 150: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 1J9_

Возвращаемое значение — текстовая строка с расширением файла, начина-ется с точки. Если имя файла не содержит расширения, то возвращает-ся nil.

Примеры:

° (vl-filename-extension "d:\\Projectl2\\Resul\\valc02.1st") возвращает".1st"

° (vl-filename-extension "acad.lsp") возвращает ".lsp"D (vl-filename-extension "acad") возвращает nil

См. также пример, приведенный в приложении 13.

2.11.24. Функция vl-filename-mktempВычисляет уникальное (т. е. не совпадающее с именами существующихфайлов) имя для временного файла.

(vl-filename-mktemp [<образец> [<папка> [<расширение>]]])

Аргументы: <образец> — образец префикса, используемого при построенииимени временного файла; <папка> — папка, в которой нужно разместитьвременный файл; <расширение> — расширение, с которым нужно сформиро-вать имя временного файла. Все аргументы — текстовые строки.

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

Если аргумент <образец> не задан, то по умолчанию принимается "$VL~~".

Если <образец> определяет главную часть имени временного файла длинойболее пяти символов, то используются только первые пять.

Если аргумент <папка> не задан или задан равным nil, то в качестве папки,в которой предполагается размещение временного файла, принимается пап-ка, вычисляемая по следующему алгоритму:

П папка с именем из аргумента <образец>, если он задан с путем;

• папка, имя которой задано в переменной окружения ТМР;

• папка, имя которой задано в переменной окружения TEMP;

О рабочий каталог системы AutoCAD (см. разд. 1.4).

Если аргумент <расширение> не задан, то расширение временного файла из-влекается из аргумента <образец> (может оказаться и пустой строкой). Еслиаргумент <расширение> указан без начальной точки, то его значение добавля-ется к главной части имени временного файла.

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

Page 151: Visual LISP и секреты адаптации AutoCAD

150 Visual LISP и секреты адаптации AutoCAD

Примеры:

° (vl-filename-mk'temp) Возвращает "С: \\WINDOWS\\TEMP\\$VL—001"

° (vl-filename-mktemp "abcdefgh") возвращает "С: \\WINDOWS\\TEMP\\abcde002"D (vi-filename-mktemp "xxx" "c:\\Temp" "$хх") Возвращает

"с:\\Тетр\\ххх003$хх"0 (vl-filename-mktemp "xxx" "c:\\Temp" ".$xx") Возвращает

"с:\\Temp\\xxx004.$хх"

ЗамечаниеВсе фаЙЛЫ С именами, сгенерированными функцией vl-filename-mkterrp ВОвремя сеанса работы в среде Visual LISP, автоматически удаляются при выхо-де из Visual LISP.

2.11.25. Функция vl-princ-to-stringПреобразует в строку любой аргумент, по аналогии с тем, как функцияprinc выводит данные в файл.

(vl-princ-to-string <аргумент>)

Тип аргумента — любой.

Возвращаемое значение — текстовая строка.

Примеры:п (vi-princ-to-string 1) возвращает " 1 "

° (vl-princ-to-string 'open) возвращает "open"

° (vl-princ-to-string "Снегурочка") возвращает "Снегурочка"

° (vl-pr.inc-to-string '(70 34 1)) возвращает " (70 34 1)а (v i-pr inc-to-str ing ' (8 . "тхт")) возвращает " (8 . тхт)

2.11.26. Функция vl-prinl-to-stringПреобразует в строку любой аргумент, по аналогии с тем, как функцияprini выводит данные в файл.

(vl-prinl-to-string <аргумент>)

Тип аргумента — любой.

Возвращаемое значение — текстовая строка

Примеры:

° (vi-prini-to-string 1) возвращает " 1 "D (vl-prinl-to-string 'open) возвращает "open"

Page 152: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 151_

° (vl-prinl-to-string "Снегурочка") Возвращает "\"Снегурочка\""

(vi-prini-to-string '(70 34 1)) возвращает " (70 34 1)п (vi-prini-to-string '(8 . "тхт")) возвращает " (8 . \"тхт\")

2.11.27. Пример работы с файламиПриведенные в данном разделе функции AutoLISP дают пользователю воз-можность работы только с файлами последовательного доступа. Указателемпозиции в файле, с которой далее будет происходить чтение (запись), яв-ляется переменная, хранящая дескриптор этого файла. Механизм работыс файлами отображен в примере, приведенном в листинге 2.12.

I Листинг 2.12. Пример использования функций работы с файлами :

; Операции записи(setq ff (open "с:\\test.txt" "w"))(write-line "Первая строка" ff)(write-char 65 ff)(write-char 67 ff)(write-line "Вторая строка" ff)(close ff); Операции чтения

( s e t q f f (open " c : W t e s t . t x t " " r " ) )(setq si (read-char ff))

(setq s2 (read-char ff))

(setq strl (read-line ff))

(setq str2 (read-line ff))

(setq str3 (read-line ff) )

(close ff)

(setq ff nil)

Первое выражение— (setq ff (open "c:\Ytest.txt" "w")) — создает пере-менную ff, в которую заносится дескриптор файла c:\test.txt, открываемогодля записи (в первом аргументе функции open обратная косая черта удваива-ется). Затем выражение (write-line "Первая строка" ff) заносит в открытыйфайл первую запись (текст "Первая строка" из 13 символов) и символыс кодами 13 и 10, которые в файлах последовательного доступа разделяютзаписи.

(~ З а м е ч а н и е ^

В операционной системе UNIX признаком конца записи является один символс кодом 10.

Page 153: Visual LISP и секреты адаптации AutoCAD

152 Visual LISP и секреты адаптации AutoCAD

После этого указатель файла показывает на начало второй записи, куда по-очередно — С ПОМОЩЬЮ ДВукраТНОГО применения фуНКЦИИ write-char —заносятся символы с кодами 65 (буква А) И 67 (буква с). Затем в продолже-ние второй записи файла с помощью функции write-iine заносится текст"вторая строка" (13 символов) и добавляются символы с кодами 13 и 10,означающие конец второй записи файла. Вслед за этим файл с дескрипто-ром f f закрывается функцией close.

Вторая часть листинга начинается функцией открытия того же файла, ноуже в режиме чтения. Затем с помощью двукратного применения функцийread-char читаются два первых символа первой записи, которые запомина-ются в переменных si и s2. После этого в переменную s t r i читается оста-ток первой записи. Далее в переменную str2 читается вторая запись файла.Третья операция чтения с помощью функции read-line приносит nil, по-скольку в файле c:\test.txt третьей записи нет. По окончании выполнениярассмотренной программы переменная ff очищается (в ней хранился деск-риптор файла). Другие переменные получат такие значения:

si = 207 (код символа п)

s2 =229 (КОД СИМВОЛа е)

strl = "рвая строка"

str2 = "АСВторая строка"

str3 = nil

Функции princ, prini, print и prompt чаще всего применяются для выводасообщений в командную строку системы AutoCAD, причем prini и printвыводят сообщения в кавычках (другие особенности описаны выше). Вместофункции write-iine для записи в файл можно пользоваться функциейprinc, но заносить признак конца записи, который выглядит как \п, пользо-ватель должен сам. Например:

(princ "Первая запись\n" ff)

Другой пример работы с файлами — приложение 13, в котором использованыфуНКЦИИ getfiled, vl-filename-base, vl-filename-directory, vl-filename-

extension, vl-file-delete, write-iine, open, close.

2.12. Функции доступак примитивам AutoCADРисунок в системе AutoCAD имеет организацию, аналогичную организациибазы данных, в которой элементы (графические примитивы и неграфиче-ские объекты) имеют списковую структуру. Каждый примитив обладаетсвоим типом. Перечислим все эти типы примитивов в алфавитном порядке.

Page 154: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 153

3DFACE

3DS0LID

ACAD_PROXY_ENTITY

ARC

ARCAL1GNEDTEXT

ATTDEF

ATTRIB

BODY

CIRCLE

DIMENSION

ELLIPSE

HATCH

IMAGE

INSERT

LEADER

LINE

LWPOLYLINE

MLINE

MTEXT

OLEFRAME

OLE2FRAME

POINT

POLYLINE

RAY

REGION

RTEXT

SEQEND

SHAPE

SOLID

SPLINE

TEXT

TOLERANCE

TRACE

VERTEX

VIEWPORT

WIPEOUT

XLINE

Как правило, наименование типа совпадает с английским именем командысистемы AutoCAD, которая создает графический объект.

Функции, рассматриваемые в данном разделе, работают с примитивами ри-сунка, обращаясь непосредственно к их внутренней структуре. AutoLISPимеет средства выбора графических объектов, как по их порядковому номе-ру, так и по определенным признакам (цвету, слою и т. п.).

2.12.1. Функция entlastСинтаксис функции:

(entlast)

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

Функция возвращает nil, если в рисунке нет неудаленных примитивов(например, когда вы только что создали новый рисунок). Иначе возвращает-ся имя последнего основного примитива в следующем виде:

<Имя объекта: 14а4158>(<Entity name: 14а4158>)

Фактически имя примитива определяет адрес в базе данных рисунка, по ко-торому начинается информация о примитиве.

Полученное имя следует сохранить в переменной, например:

(setq eela (entlast))

2.12.2. Функция entnext

Выводит имя следующего примитива (подпримитива).

(entnext [<примитив>])

Page 155: Visual LISP и секреты адаптации AutoCAD

154 Visual LISP и секреты адаптации AutoCAD

В качестве единственного аргумента функции entnext может выступать ра-нее полученное имя примитива текущего рисунка.

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

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

Пример:

° (setq el (entnext)) возвращает имя первого неудаленного примитиварисунка

(setq e2 (entnext е2)) возвращает имя примитива, следующего за el

(setq еЗ (entnext еЗ)) возвращает имя примитива, следующего за е2

Функция entiast возвращает имя последнего основного примитива. Этоозначает, что если последним созданным графическим объектом рисункаявляется сложный объект (например, полилиния типа POLYLINE), то вследза ним в базе рисунка следуют подпримитивы, т. е. вершины (имя прими-тива — VERTEX), а завершается перечисление подпримитивов полилиниипримитивом SEQEND.

Пример (в предположении, что объект типа POLYLINE является последнимосновным примитивом):

° (setq eela (entiast)) возвращает имя основного примитива последнейполилинии

(setq vi (entnext eela)) возвращает имя примитива, являющегося пер-вой вершиной полилинии >

(setq v2 (entnext vi)) возвращает имя примитива, являющегося второйвершиной полилинии

См. также примеры использования функции entnext в приложении 14.

ЗамечаниеВ легкой полилинии (примитиве типа LWPOLYLINE) нет подпримитивов, и ин-формация обо всех вершинах может быть извлечена из основного примитива.

2.12.3. Функция entsel

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

(entsel [<запрос>])

Аргумент о а п р о о — любая строка текста.

Page 156: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 155_

Возвращаемое значение — список, состоящий из двух элементов: имени вы-бранного примитива и точки, которой пользователь указал объект (такаяточка, как правило, оказывается вне самого примитива, поскольку точностьуказания мышью зависит от величины прицела). Можно задать объект вво-дом на клавиатуре ключевого слова Последний (Last) — тогда в возвращае-мом списке координаты точки будут нулевыми.

Пример:D (setq esl (entsel "Выберите объект: ")) возвращает (<Имя объекта:14а9960> (301/791 138.438 0.0))

Имя указанного пользователем объекта фигурирует в качестве первого эле-мента списка, являющегося возвращаемым значением, и может быть извле-чено из такого списка, например, с помощью функции саг.

См. также примеры в приложении 14.

2.12.4. Функция entdel

Позволяет удалять неудаленные основные примитивы и восстанавливатьпримитивы, ранее удаленные в данном сеансе редактирования.

(entdel <примитив>)

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

Примеры:0 (command "_LINE" '(ЮО.О 56.8) '(150.3 -15.5) "") рисует отрезок И ВОЗ-

вращает n i lа (setq ki (entdel (ent la s t ) ) ) удаляет только что нарисованный отрезок

И возвращает <Имя объекта: 4002ed58>

° (entdel ki) восстанавливает удаленный примитив и возвращает <имяобъекта: 4002ed58>

2.12.5. Функция entgetПолучает список с характеристиками примитива и является основным инст-рументом извлечения информации о геометрии и свойствах.

(entget <примитив> [<приложения>])

Здесь аргумент <примитив> — это имя примитива для получения его данных,аргумент <приложения> — это список с именами приложений, с помощьюкоторых к примитиву привязаны расширенные данные (о расширенныхданных см. разд. 2.14 и приложение 10).

Page 157: Visual LISP и секреты адаптации AutoCAD

156 Visual LISP и секреты адаптации AutoCAD

Предположим, в рисунке первым объектом является отрезок (тип примити-ва — LINE). Тогда выражение(setq le (entget (entnext)))

должно вернуть примерно такой список:

((-1 . <Имя объекта: 14а4158>) (0 . '"LINE")(330 . <Имя объекта: 14a40f8>) (5 . "2В") (100 . "AcDbEntity") (67 . 0)(410 . "Model") (8 . "0") (100 . "AcDbLine") (10 201.536 140.622 0.0)(11 285.148 96.5053 0.0) (210 0.0 0.0 1.0))

В этом списке элементами являются точечные пары и списки, причем и втех и в других первыми элементами выступают целые числа, называемыеDXF-кодами (см. также разд. 2.9.11 и приложение 15). Под соответствующимкодом в точечных парах и списках находятся данные определенного типа:

• КОД — 1 указывает ИМЯ ПрИМИТИВа (<Имя объекта: 14а4158>);

П код 0 — тип примитива ( " L I N E " ) ;

• код 5 — метку (внутренний номер примитива в рисунке);

• код 8 — имя слоя ("0");

• код 10 — координаты начальной точки (201.536 140.622 о.о>;

• КОД 1 1 — К о о р д и н а т ы К О Н е Ч Н О Й ТОЧКИ ( 2 8 5 . 1 4 8 9 6 . 5 0 5 3 0 . 0 ) ;

• код 210 — направление вектора нормали к плоскости, в которой описанпримитив.

П код 410 — имя вкладки пространства модели или листа.

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

Продолжим пример с отрезком:

° (cdr (assoc 0 le)) возвращает "LINE" (тип примитива)

° (cdr (assoc 8 le)) возвращает "0" (имя слоя)п ( c d r ( a s s o c 10 l e ) ) Возвращает ( 2 0 1 . 5 3 6 1 4 0 . 6 2 2 0 . 0 )п ( c d r ( a s s o c 1 1 l e ) ) Возвращает ( 2 8 5 . 1 4 8 9 6 . 5 0 5 3 0 . 0 )

Кроме того, по коду 62 можно было бы извлечь номер цвета примитива, покоду 6 — имя типа линии, по коду 48 — собственный масштаб типа линии,по коду 311 — вес линии (умноженный на 100). В рассмотренном вышесписке le точечных пар с такими DXF-кодами нет, поэтому для них дейст-вуют значения по умолчанию: ПОСЛОЮ (BYLAYER) или 1.

Рассмотрим, какой примерный список можно было бы получить для окруж-ности (объекта типа CIRCLE):

Page 158: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1S7_

( (-1 . <Имя объекта: 14а4160>) (0 . "CIRCLE")(330 . <Имя объекта: 14a40f8>) (5 . "2С") (100 . "AcDbEntity") (67 . 0)(410 . "Model") (8 . "0") (100 . "AcDbCircle") (10 387.691 142.198 0.0)(40 . 27.8941) (210 0.0 0.0 1.0))

Для окружности DXF-коды —1, 0, 410, 8, 210 имеют тот же смысл, что и длявсех примитивов (в том числе и для примитива типа LINE). Под кодом 40находится радиус окружности, а точечная пара с DXF-кодом 10 хранит всебе данные о центре.

Поэтому для рассматриваемой окружности:

° (cdr (assoc 40 l e ) ) возвращает 27.8941 (радиус)D (cdr (assoc 10 l e ) ) возвращает (387.691 142.198 0.0)

Сравнивая справочную информацию, выдаваемую командой СПИСОК(LIST), и список, получаемый с помощью функции entget, можно получитьгеометрический смысл DXF-кодов для примитивов других типов.

2.12.6. Функция entmakeЕсли построить в программе список, описывающий примитив (кроме то-чечной пары с DXF-кодом —1), то можно создать в рисунке такой примитивс помощью функции:

(entmake <список>)

Создает новый примитив по списку, структура которого аналогична струк-туре списка, возвращаемого функцией entget. Функция entmake не можетсоздать примитив типа VIEWPORT.

Возвращаемое значение — аргумент <список> или n i l , если создание объектаневозможно.

Пример:

° (entmake ' ( ( 0 . "CIRCLE") (10 500.0 0.0 0.0) (40 . 50.0))) создает НО-ВЫЙ примитив — окружность с центром в точке (500 о 0) и радиусом 50;остальные свойства (слой, цвет и т. д.), данные о которых отсутствуютв списке, берутся по умолчанию; возвращаемое значение — ((о . "CIRCLE")( 1 0 5 0 0 . 0 0 . 0 0 . 0 ) ( 4 0 . 5 0 . 0 ) )

2.12.7. Функция entmakexСоздает новый примитив или неграфический объект по списку с данными,аналогично функции entmake. Является основным инструментом созданиясловарей и Х-записей (см. разд. 2.15).

(entmakex <список>)

Page 159: Visual LISP и секреты адаптации AutoCAD

158 Visual LISP и секреты адаптации AutoCAD

Возвращаемое значение — имя нового примитива или nil, если созданиеобъекта невозможно.

Пример:

° (entmakex '((0 . "CIRCLE") (10 500.0 0.0 0.0) (40 . 50.0))) создает

новый примитив — окружность с центром в точке (500 о 0) и радиусом50. Возвращается имя примитива, например: <имя объекта: 4002ed70>

2.12.8. Функция entmodФункция entmod похожа на функцию entmake, но получает в качестве аргу-мента список, который содержит точечную пару с DXF-кодом -1 (т. е. имясуществующего в рисунке примитива) и модифицирует примитив в соответ-ствии с новым списком (в списке могут изменяться любые данные, кромеимени примитива, типа примитива и метки):

(entmake <список>)

Функция entmod изменяет примитив в базе рисунка и возвращает значениеаргумента <список> при успешном завершении или nil — при невозможно-сти выполнить изменение.

2.12.9. Функция entupdПерерисовывает примитив на экране с учетом изменений, внесеннных, на-пример, функцией entmod.

(entupd <примитив>)

Аргумент <примитив> — это имя примитива в том виде, в котором оно выво-дится, например, функцией entiast.

Возвращаемое значение — имя примитива или nil (при ошибке).

2.12.10. Функция handentПолучает имя примитива или неграфического объекта по его метке.

(handent <метка>)

Аргумент <метка> — это текстовая строка с шестнадцатеричной меткой в томвиде, в каком она возвращается функцией entget.

Возвращаемое значение — имя примитива или ni l (при ошибке).

2.12.11. Функция nentselЗапрашивает объект и для простого примитива возвращает такой же списокиз имени примитива и точки указания, как и функция entsei. Однако если

Page 160: Visual LISP и секреты адаптации AutoCAD

Глава 2. ЯзыкАиЮЦЭР 159_

указанный пользователем примитив является трехмерной полилинией(POLYLINE), то первым элементом возвращаемого списка будет имя под-примитива начальной вершины (VERTEX) участка, на котором указываласьполилиния. Если указанный пользователем объект является вхождениемблока (INSERT), то возвращается список из двух или четырех элементов(см. ниже).

(nentsel [<запрос>])

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

Выберите объект:

(Select object:)

Функция nentsel работает с блоками (точнее, с примитивами типа INSERT)следующим образом. В случае если пользователь указал атрибут блока, тофункция возвращает список из двух элементов: первым является имя объек-та-атрибута, а вторым — точка указания атрибута. В случае если пользова-тель указал не атрибут, а объект, принадлежащий вхождению блока, то воз-вращается список из четырех элементов: первым является имя примитива, спомощью которого был указан блок, вторым — точка указания, третьим —матрица размером 4x3 для преобразования точек из системы координат объ-екта (СКО) в МСК, четвертым — список с именем блока, содержащим ука-занный примитив (если примитив входит в блок, который вложен в другойблок, то список содержит все имена вкладываемых блоков, начиная от са-мого внутреннего и кончая самым внешним).

Матрица размером 4x3, которая выдается в качестве третьего элемента воз-вращаемого функцией nentsel значения, имеет ВИД: ( (mOO mOl mO2) (mlО milml2) (m20 m2i m22) (m30 m3i m32)). Тогда преобразование точек из СКО вМСК идет по системе уравнений:

X'Y1

Z1

= X= X= X

*mOO -*mOl •*mO2 -

l- Y*mlO -ii- Y*mll •>ь Y*ml2 -

ь Z*m20 -i- Z*m21 -

l- Z*m22 -

h m30v m31

v m32

Здесь (х Y z) — координаты точки до преобразования, (х1 Y' Z

1) — коор-

динаты точки после преобразования.

2.12.12. Функция nentselpФункция nentselp аналогична функции nentsel, но если указанным прими-тивом является вхождение блока (INSERT), то возвращает список, в кото-ром третьим элементом является матрица преобразования размером не 4x3,а 4x4 (см. ниже).

(nentselp [Оапроо] [<точка>])

Page 161: Visual LISP и секреты адаптации AutoCAD

160 Visual LISP и секреты адаптации AutoCAD

Если задан аргумент <точка>, то запрос не выдается и аргумент выступает вкачестве точки указания.

Функция nentselp работает аналогично функции nentsei, но в случае еслипользователь указал объект, принадлежащий вхождению блока, то, как иnentsei, тоже возвращается список из четырех элементов, однако третьимэлементом в списке является матрица размером 4x4, которая служит дляпреобразования точек из системы координат объекта (СКО) в МСК. Матри-ца имеет вид: ( (nOO nOl п()2 пОЗ) (nlO nil nl2 п13) (п20 п21 п22 п23) (0.0о.о о.о 1.0)). Преобразование точек из СКО в МСК идет по такой системеуравнений:

X'

Y'

Z '

= X

= X

*nOO н

* n l O -

*n20 -

Ь Y

I- Y

h Y

* n O l н

* П 1 1 n'

* n 2 1 -i

r Z

i- Z

i_ 1-7

*nO2 -*nl2 -*n22 -

v nO3f- nl3

v n33

Смысл списков (X Y z) и (X' у z ? ) тот же, что и для функции nentsei .

2.12.13. НаборыСледующая группа функций — это функции, работающие с наборами объ-ектов. Набор — это временное множество, в которое входят имена основныхпримитивов рисунка (как правило, они собираются по какому-то признаку-фильтру). Неосновные примитивы (составные части блока или вершиныполилинии) не могут входить в набор. Имя набора обычно сохраняется вкакой-нибудь переменной AutoLISP, чтобы затем можно было извлекать изнабора нужные примитивы.

Наборы уничтожаются при выходе из сеанса редактирования рисунка.

( Замечание " )При необходимости сохранять наборы примитивов в рисунке следует оформ-лять их в виде групп с помощью команды ГРУППА (GROUP). Группы относятсяк неграфическим объектам, существующим внутри рисунка.

Количество одновременно открытых наборов в рисунке не должно превы-шать 128. В предыдущих версиях системы AutoCAD количество наборов,которые могут быть одновременно открыты, было еще меньше (например,в Ю-й версии оно равнялось всего шести).

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

2.12.14. Функция ssgetФункция ssget формирует набор по запросу или признаку:

(ssget [<метод>] [<точка1> [-<точка2>] ] [<список>] [<фильтр>] )

Page 162: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP ]61_

Аргумент <метод> — это текстовая строка, принимающая одно из следующихзначений, характеризующих метод выбора примитивов (в локализованнойверсии системы AutoCAD все перечисляемые строки должны спереди до-полняться символом _):

• "с" — выбор секущей рамкой;

О "ср" — выбор секущим многоугольником;

О "F" — выбор секущей линией;

• " I " — текущий выбор с помощью ручек;

• "L" — выбор последнего видимого примитива;

• "Р" — последний сформированный ранее набор;

• "W — выбор рамкой;

• "WP" — выбор многоугольником;

П "X" — вся база примитивов рисунка, включая объекты на замороженныхслоях и вне видимой части экрана, с учетом аргумента <фильтр> (в этомслучае аргумент <фильтр> не должен быть опущен);

• "А" — вся база примитивов рисунка, включая объекты на замороженныхслоях и вне видимой части экрана;

• "-.Е" — все примитивы, попадающие в прицел устройства указания;

• ":N" — выбор основных примитивов с помощью подпримитивов (вершинполилинии или сети, компонентов блока); используется только при гра-фическом варианте выбора и только для указания рамкой, секущей рам-кой и точкой; может привести к повторению примитивов в наборе, по-скольку, например, можно отметить одну и ту же полилинию с помощьюлюбой из ее вершин (см. также функцию ssnamex);

Cl ":S" — допускает выбор только одного объекта.

Аргумент <точка1> при отсутствии аргумента <точка2> определяет дополни-тельное условие для добавления в набор: включаемый примитив долженпроходить через точку, заданную аргументом <точка1>. Если заданы оба ар-гумента <точка!> и <точка2>, то определяемые ими точки являются угламипростой или секущей рамки (когда в качестве метода выбора применяютсярамки, т. е. "W" или "с,")-

Аргумент <список> представляет собой список, элементами которого явля-ются точки, используемые в методах "F", "WP", "СР".

Аргумент <фильтр> — это список со структурой, аналогичной структуре спи-ска, возвращаемого функцией entget, что позволяет оставить только те при-митивы, которые удовлетворяют дополнительным признакам (например,определенному цвету, слою, весу и т. д.).

6 Зак. 155

Page 163: Visual LISP и секреты адаптации AutoCAD

162 Visual LISP и секреты адаптации AutoCAD

Возвращаемое значение функции ssget — имя созданного набора (или n i l ,если создать набор невозможно). Имя набора возвращается в следующемвиде:

Oelection set: 2>

Фактически имя набора — это адрес в базе данных рисунка, по которомуначинается информация об объектах, включенных в набор.

Примеры:

° (ssget) выдает стандартный запрос:

Выберите объекты:

(Select objects:)

и затем создает набор в соответствии с дальнейшими указаниями поль-зователя

° (ssget '(15.78 320.1)) создает набор из примитивов, проходящих через

ТОЧКУ ( 1 5 . 7 8 3 2 0 . 1 )

D ( s s g e t " _ C " ' ( 1 . 5 7 - 4 0 . 4 ) ' ( 1 5 . 7 8 3 2 0 . 1 ) ) СОЗДЗет н а б о р И З ПрИМИТИВОВ,

в ы б и р а е м ы х с е к у щ е й р а м к о й с у г л а м и в т о ч к а х ( 1 . 5 7 - 4 0 . 4 ) и ( 1 5 . 7 8320.1)

° (ssget "__х" ' ( ( 0 . "POLYLINE") (8 . "WALLS "))) .создает набор из всехпримитивов рисунка, являющихся объектами типа POLYLINE и лежа-щими на слое WALLS

° (ssget "_A") создает набор из всех примитивов рисунка, аналогично ме-тоду "_Х" С ПУСТЫМ фильтром, Т. е. (ssget "__Х" ' ()) ИЛИ (ssget "X" ni l )

См. также пример в приложении 9.

В рисунке одновременно может быть открыто не более 128 наборов выбора.При достижении такого предела функция ssget отказывается создавать сле-дующие наборы и возвращает n i l . Чтобы удалить ненужные наборы, следуетприсвоить значение n i l переменным, хранящим имена этих наборов.

2.12.15. Функция ssaddДобавляет примитив в набор.

(ssadd [<примитив> [<набор>]])

Аргументы: <лримитив> — имя примитива, <набор> — имя набора. .

Возвращаемое значение — имя набора.

Если аргумент <набор> опущен, а аргумент <примитив> задан, то создаетсяновый набор из одного примитива. Если оба аргумента опущены, то созда-ется новый пустой набор (но его значение не равно nil).

Page 164: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 163

Примеры:п (command " _ L I N E " ' ( 2 5 0 . 0 3 5 . 0 ) ' ( 1 2 5 . 1 5 6 . 9 ) " " ) р и с у е т ОТрезОК И ВОЗ-

вращает n i l

° (setq ssl (ssadd)) возвращает <Selection set: 4>

° (ssadd (entiast) ssl) добавляет в набор ssl последний примитив (типаLINE) И возвращает <Selection set: 4>

2.12.16. Функция ssdelУдаляет примитив из набора.

(ssdel <примитив> <набор>)

Аргументы. <примитив> — имя удаляемого примитива, <набор> — имя набора,из которого нужно выполнить удаление.

Возвращаемое значение — имя набора, если операция удаления выполнена,или nil, если примитив не содержится в наборе и удалить его нельзя.

Пример (продолжение примера из разд. 2.12.15):

° (ssdel (entiast) ssl) удаляет из набора ssl последний примитив (типаLINE) и возвращает Oeiection set: 4>

2.12.17. Функция sslengthВычисляет длину набора, т. е. количество содержащихся в нем примитивов.

(ssiength <набор>)

Аргумент <набор> — имя набора.

Возвращаемое значение — целое число.

Примеры:п (sslength (ssadd)) возвращает 0, т.к. функция ssadd создала пустой

набор

° (sslength (ssget "_L")) возвращает 1, т. к. функция ssget создала набориз одного примитива (последнего примитива рисунка)

2.12.18. Функция ssmembПроверяет, входит ли примитив в набор.

(ssmemb <примитив> <набор>)

Аргументы: <примитив> — имя примитива, <набор> — имя набора.

Возвращается имя примитива (т. е. значение аргумента <примитив>), если онвходит в рассматриваемый набор, или ni l — если не входит.

Page 165: Visual LISP и секреты адаптации AutoCAD

164 Visual LISP и секреты адаптации AutoCAD

Примеры:0 (setq nabor (ssget "_L")) создает набор из последнего примитива и воз-

вращает ИМЯ набора (например, <Selection set: 7>)

° (ssmemb (entiast) nabor) возвращает имя примитива (например, <имяобъекта: 4002ed58>), Т. К. ПОСЛеДНИЙ ГфИМИТИВ СОДерЖИТСЯ В наборе nabor

2.12.19. Функция ssnameИзвлекает примитив из набора по порядковому номеру.

(ssname <набор> <номер>)

Аргумент <набор> — имя набора. Аргумент <номер> определяет номер эле-мента в наборе. Значение должно быть либо целым числом от 0 до 32 767,либо целым числом в вещественной форме больше 32 767.0. Нумерацияпримитивов в наборе начинается с нуля.

Возвращаемое значение — имя примитива или nil, если примитива с дан-ным номером в наборе нет.

Примеры (продолжение примера из разд. 2.12.18):а (ssname nabor 0) ВОЗВращаеТ ИМЯ ПрИМИТИВа (например, <Имя объекта:

4002ес158>)

° (ssname nabor i) возвращает nil, т. к. в наборе nabor содержится толькоодин объект

См. также примеры в разд. 2.12.23 и приложении 9.

2.12.20. Функция ssnamexИзвлекает имя примитива из набора по порядковому номеру (заданных со-ответствующими аргументами <набор> и <номер>), но при этом выдается до-полнительная информация о методах формирования набора (см. ниже). Ес-ли аргумент <номер> опущен, то выводится информация обо всех примити-вах набора.

(ssnamex <набор> [<номер>])

Типы аргументов — как у функции ssname.

Функция ssnamex возвращает список, в котором элементами являются опи-сания способа выбора примитивов, попавших в набор. Если аргумент<номер> не задан, то длина возвращаемого списка равна количеству элемен-тов, определяемых аргументом <набор>. Если аргумент <номер> задан, при-чем корректно, то возвращаемым значением будет список из одного элемен-та — описания способа выбора примитива с порядковым номером, равнымзначению аргумента <номер>. Если же аргумент <номер> задан неправильно,то функция ssnamex вернет nil.

Page 166: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 16S_

Описание способа выбора примитива — это список из трех элементов:(<метод> <примитив> <данные>). Параметр <метод>— целое число, котороесоответствует методу выбора функции ssget и может принимать такие зна-чения:

П О — неинтерактивный выбор ("L", "А", "X" И Т. П.);

П 1 — выбор указанием точки;

• 2 — "W" или "wp";

П 3 - "с" или "СР";

• 4 — "F".

Если на месте параметра <метод> стоит отрицательное число, то оно опреде-ляет многоугольник выбора (см. описание многоугольника ниже).

Параметр <примитив> описания способа выбора примитива является егоименем в том виде, в котором оно выводится функцией entiast. Параметр<данные> может быть либо только числом 0, либо числом 0 и списком, уточ-няющим выбор, либо числом 0 и номером многоугольника. В уточняющемсписке может быть точка, с помощью которой выбран объект. Если исполь-зован номер многоугольника (а он должен быть отрицательным: —1, —2 ит. п.), то далее будет следовать описание многоугольника с соответствую-щим номером.

Описание многоугольника — это список такого вида: (<номер_многоугольника><точка!> .. . <точкам>). Нумерация многоугольников начинается с —1 и из-меняется путем добавления -1 к очередному номеру.

Описание точки (<точка1> и т. п.) — это список из трех (или двух) элемен-тов: (<код> <база> [<вектор>]). Описание точки зависит от вида, на которомона выбиралась, и фактически представляет собой описание прямой, лучаили отрезка. Параметр <код> является кодом описания точки (0 — прямая,1 — луч, 2 — отрезок), параметр <база> представляет собой начальную точ-ку описания, а необязательный параметр <вектор> — это либо направление,в котором продолжается бесконечная линия (прямая или луч), либо смеще-ние в сторону, характерную для отрезка.

Например, если в набор паЬ5 включен один объект, который был указанточкой (7.51 16.02) на обычном виде сверху в МСК, то выражение( s s n a m e x п а Ь 5 0) в о з в р а щ а е т НеЧТО ПОХОЖее на: ( ( 1 <Имя о б ъ е к т а : 1 4 а а 5 6 0 >

0 (0 ( 7 . 5 1 1 6 . 0 2 0 . 0 ) ) ) ) .

В этом примере возвращенный функцией ssnamex список состоит из одногоэлемента (списка), в котором присутствуют следующие составные части:

• <метод> — равен 1 (соответствует выбору указанием точки).;

СЗ <примитив> — <Имя объекта: 14аа560>;

• <данные> — 0 (0 (7.51 16.02 0.0) ), ЧТО соответствует точке (7.51 16.020.0), примененной для выбора примитива.

Page 167: Visual LISP и секреты адаптации AutoCAD

166 Visual LISP и секреты адаптации AutoCAD

Другие примеры значений, возвращаемых функцией ssnamex:

• ({0 <имя объекта: 14ае578> 0)) — один примитив, выбранный неинте-рактивным методом (например, "L");

• ((3 <Имя объекта: 14ае568> 0 -1) (3 <Имя объекта: 14ае578> 0 -1} (-1(0 ('-147.787 129.133 0.0)) (0 (-64.2728 129.133 0.0)) (0 (-64.2728

22.3376 0.0)) (0 (-147.787 22.3376 о. 0)))) — два примитива, выбран-ных секущим прямоугольником с номером —1 (для прямоугольника зада-ны четыре точки);

• ((1 <Имя объекта: 14ае560> 0 (0 (74.2672 64.8218 0.0))) (2 <Имя объек-та: 14ае570> 0 -1) (2 <Имя объекта: 14ае568> 0 -1) (-1 (0 {-177.446158.755 0.0)) (0 (40.3151 158.755 0.0)) (0 (40.3151 83.1407 0.0)) (0

(-177.446 83.1407 о.О)))) — три примитива, первый из которых выбрануказанием с помощью точки (74.2672 64.8218 0.0), а второй и третийвыбраны рамкой, которая фигурирует как многоугольник с номером —1.

В этих примерах параметр <вектор> описания точек нигде не использован,т. е. объекты выбирались на виде сверху в МСК.

Наборы — удобный инструмент для выбора нужных примитивов рисункас заданными свойствами. После формирования набора затем из него с по-мощью функции ssname (или ssnamex) извлекаются нужные объекты, с кото-рыми далее выполняются необходимые операции (например: удаление, мо-дификация и т. д.).

2.12.21. Функция sssetfirstВключает ручки у примитивов, входящих в наборы, заданные аргументами<набор1> и <набор2>, но еще и подсвечивает пунктиром примитивы из набо-ра, заданного аргументом <набор2> (что означает выбор их для следующейоперации редактирования).

(sssetfirst <набор1> [<набор2>])

Аргументы — имена наборов или nil.

Возвращаемое значение — список с именами наборов, поданными в качест-ве аргументов.

Примеры:п ( c o m m a n d " _ L I N E " ' ( 2 5 0 . 0 3 5 . 0 ) ' ( 1 2 5 . 1 5 6 . 9 ) " " ) р и с у е т о т р е з о к И ВОЗ-

в р а щ а е т n i l

° (setq ssl (ssadd (entlast))) возвращает <Selection set: 6>

° (command "^CIRCLE" '(200.0 82.0) 60.0) рисует окружность и возвращает

nil

° (setq ss2 (ssadd (entlast))) возвращает <Selection set: 8>

Page 168: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 167

(sssetfirst ssl ss2) возвращает (<Selection set: 6> <Selection set:

8>) и включает ручки у отрезка и окружности, входящих, соответственно,в наборы ssl и ss2; кроме того, окружность подсвечена пунктиром(рис. 2.8)

Правка Шщ Вставка Формат Сервис Рисование Размеры Редакт Exptess Цкмо Справка

и

Команда; (sssetfirst ssl ss2)(<Selection set 6•> •'Selection setКоманда

8>)

3561456.1Э 6724, 0 0000 Ш4Г. СЕТКА DPTO ОТС-ПОЛЯР [ПРИВЯЗКА ОТС-ПРИВ ВЕС'|М0ДЕГ

Рис. 2 .8. Результат выполнения функции s s s e t f i r s t

2.12.22. Функция ssgetfirstВозвращает список с именами двух наборов, аналогичных по назначениюаргументам <набор!> и <набор2> функции sssetfirst (в текущий момент упримитивов первого набора включены только ручки, у примитивов второгонабора включены ручки и включено подсвечивание).(ssgetfirst)

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

Page 169: Visual LISP и секреты адаптации AutoCAD

168 Visual LISP и секреты адаптации AutoCAD

В качестве средств интерактивного выбора примитивов используются функ-ции entsei или ssget. При необходимости сканирования рисунка для поис-ка в нем по определенному свойству (имени слоя, цвету и т. п.) выбор при-митивов Осуществляется С ПОМОЩЬЮ фуНКЦИИ ssget.

Функция entsei возвращает список, первым элементом которого являетсяимя указанного пользователем примитива. Это имя может быть извлечено сПОМОЩЬЮ фуНКЦИЙ с а г ИЛИ n t h .

Функция ssget возвращает имя набора, состоящего из некоторого количест-ва имен примитивов (при неудачном выборе вместо имени набора можетбыть возвращено значение nil). Длина набора оценивается с помощьюфункции sslength, а извлечение из него нужного элемента выполняетсяфункцией ssname.

Далее к полученному имени примитива применяется функция entget, кото-рая возвращает список с полным набором точечных пар, содержащих харак-теристики рассматриваемого примитива. Затем с помощью функций assoc иcdr из этого списка читаются нужные свойства примитива.

Проиллюстрируем приведенную схему следующим примером. Предполо-жим, что в рисунке на слое HOLES находятся отверстия, построенные с по-мощью команды КРУГ (CIRCLE). Необходимо прочитать все эти круги исформировать два списка, в первом из которых собрать радиусы кругов, а вовтором — точки с координатами центров. Примерный вариант такой про-граммы приведен в листинге 2.13.

I Листинг 2.13. Пример работы с примитивами рисунка j

; Начальные значения списков радиусов (list_rad) и центров (list_cen)

(setq l i s t^ rad ' ( ) l i s t_cen ' ( ) )

; Создание набора из кругов на слое HOLES

(setq nab_cir (ssget "_X" ( l i s t (cons 8 "HOLES") (cons 0 "CIRCLE"))))

; Проверка, сформировался ли набор nab_cir

; (если нет, то предыдущая операция вернет ni l)

(if (null nab_cir)

(progn

(princ "\пНет кругов на слое HOLES. " ) ; сообщение об отсутствии

(princ); тихий выход

); конец progn

(progn

(setq i -1 nab_ien (sslength nab_cir))

; Цикл по количеству элементов набора nab_cir

(repeat nab__len

(setq i (1+ i ) )

; Выбор следующего примитива и получение его списка

(setq cirlist (entget (ssname nab cir i)))

Page 170: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 169_

(setq radcir (cdr (assoc 40 cirlist)))

(setq cencir (cdr (assoc 10 cirlist)))

; Добавление радиуса и точки центра к спискам iist_rad и list_cen

(setq list_rad (append list_rad (list radcir)))

(setq list_cen (append list cen (list cencir)))

); конец repeat

; Печать результирующих списков

(princ "ХпРадиусы: ")

(princ list_rad)

(princ "ХпЦентры: ")

(princ list_cen)

); конец progn

); конец if

Программу следует сохранить (например, в файле rcl.lsp), после чего ееможно загрузить в память:

(load "rcl.lsp")

Возможно, что при загрузке файла rcl.lsp перед его именем придется доба-вить полный путь к месту его расположения. Если файл загрузился безошибок, то система AutoCAD его выполнит.

Разберем схему работы программы. Для того чтобы выбрать из рисунка всекруги на слое HOLES, используется функция ssget с фильтром по имениСЛОЯ И ТИНу Примитива: (ssget "_X" ( l i s t (cons 8 "HOLES") (cons 0"CIRCLE") )). Результат (имя набора) запоминается в переменной nab_cir.

Количество объектов, попавших в набор nab_cir, вычисляется с помощьювыражения (sslength nab_cir). Затем с помощью функции ssname пооче-редно получаются имена примитивов, включенных в набор: выражение(ssname nab_cir i) для разных i возвращает имя примитива с номером i-i.

Далее формируется список с характеристиками очередного объекта-круга спомощью выражения (entget (ssname nab_cir i ) ) . После этого остаетсятолько извлечь с помощью функций cdr и assoc значения радиуса (DXF-код 40) и центра (DXF-код 10). Извлекаемые значения заносятся в резуль-тирующие СПИСКИ list__rad И list_cen.

Возможный вид результата работы программы:

Радиусы: (66.0916 29.1292)

Центры: ((179.603 194.961 0.0) (43.0525 184.539 0.0))((179.603 194.9610.0) (43.0525 184.539 0.0))

О том, как оформить эту программу в виде пользовательской функции, бу-дет рассказано в разд. 2.16.

Page 171: Visual LISP и секреты адаптации AutoCAD

170 Visual LISP и секреты адаптации AutoCAD

2.13. Функции доступак табличным даннымПомимо примитивов в рисунке всегда присутствует определенный объемнеграфической информации: описания блоков, таблицы слоев, таблицы ви-довых экранов, таблицы типов линий, размерные стили и т. п. Все они хра-нятся в базе рисунка примерно в том же виде, что и примитивы.

2.13.1. ТаблицыТабличные данные рисунка сгруппированы в таблицы, имеющие следующиеимена:

• BLOCK — таблица описаний блоков;

• LAYER — таблица слоев;

• LTYPE — таблица типов линий;

П STYLE — таблица текстовых стилей;

• DIMSTYLE — таблица размерных стилей;

• UCS — таблица именованных систем координат;

• VIEW — таблица именованных видов;

• VPORT — таблица конфигураций видовых экранов;

• APPID — таблица имен приложений.

В перечисленных таблицах находятся соответствующие табличные объекты,внутренняя организация которых аналогична организации графическихпримитивов, а методы доступа похожи на методы доступа к графическимпримитивам. Ниже рассматриваются функции языка AutoLISP, осуществ-ляющие доступ к табличным объектам.

2.13.2. Функция tblsearchПолучает список с характеристиками объекта таблицы по его заголовку.

(tblsearch <таблица> <заголовок> [<следующий>])

Аргументы: <таблица> — текстовая строка с именем таблицы, оаголовок> —текстовая строка с именем элемента таблицы, <следующий> — любое значе-ние (важно только, ni l или не nil).

Возвращаемое значение — список, соответствующий найденному объекту(или nil, если объект не обнаружен).

Если параметр <следующий> задан и не равен nil, то указатель функцииtbinext устанавливается на имя объекта таблицы с данным заголовком

Page 172: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1_71_

(следующее обращение к функции tbinext вернет данные об объекте, рас-положенном в таблице после объекта, использованного в качестве аргументаВ фунКЦИИ tblsearch).

Пример:

° (tblsearch "LTYPE" "CONTINUOUS") Возвращает ((0 . "LTYPE")(2 . "Continuous") (70 .0) (3 . "Solid line") (72 . 65) (73 . 0)(40 . 0.0))

2.13.3. Функция tbinextЧитает характеристики очередного объекта из таблицы.

(tbinext <таблица> [<признак>])

Аргументы: <таблица> — текстовая строка с именем таблицы (см.разд. 2.13.1), <признак> — любое значение (признак первого элемента табли-цы — см. ниже).

Возвращаемое значение — список с характеристиками элемента таблицыИЛИ n i l .

Если параметр <признак> задан и отличен от nil, то функция возвращаетданные первого элемента таблицы (иначе возвращаются данные объекта,следующего за тем, который был прочитан в предыдущем обращении функ-ции tbinext к той же таблице или в предыдущем обращении к функцииtblsearch, вызванной с аргументом <следующий>, имеющим значение, отлич-ное от nil). Если требуемого объекта нет (например, достигнут конец таб-лицы) или таблица пуста, то возвращается nil.

Пример:

° (tbinext "LTYPE" т) возвращает список с характеристиками типа линииC O N T I N U O U S : ((0 . "LTYPE") (2 . "Cont inuous") (70 . 0) (3 . " S o l i dl i n e " ) (72 . 65) (73 . 0) (40 . 0 .0))

Пример использования функции tbinext совместно с функцией tblsearch:

о ( t b l s e a r c h " L T Y P E " " C O N T I N U O U S " Т ) в о з в р а щ а е т ( ( 0 . " L T Y P E " )

( 2 . " C o n t i n u o u s " ) ( 7 0 . 0 ) ( 3 . " S o l i d l i n e " ) ( 7 2 . 6 5 ) (-73 . 0 )

( 4 0 . 0 . 0 ) )

(tbinext "LTYPE") возвращает имя объекта таблицы типов линий, сле-дующего за CONTINUOUS

2.13.4. Функция tblobjnameОпределяет имя (адрес) объекта таблицы по его заголовку (имени блока,слоя и т. п.).

(tblobjname <таблица> <заголовок>)

Page 173: Visual LISP и секреты адаптации AutoCAD

172 Visual LISP и секреты адаптации AutoCAD

Аргументы: <таблица> — текстовая строка с именем таблицы, <заголовок> —текстовая строка с именем элемента таблицы.

Возвращаемое значение — имя объекта (аналогично имени примитива) вбазе рисунка. Если объект с нужным заголовком не найден, то возвращает-ся nil.

Пример:0 (tblobjname "LTYPE" "CONTINUOUS") возвращает <Имя объекта: 40С2есЬ0>

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

° (seta layi (tbinext "LAYER" т)) возвращает список с данными первогослоя рисунка (первым слоем должен быть слой с именем "О"), например:( ( О . " L A Y E R " ) ( 2 . " О " ) ( 7 0 . 0 ) ( 6 2 . 7 ) ( 6 . " C o n t i n u o u s " ) )

В этом списке в точечной паре с DXF-кодом О находится имя таблицы,в которой ищется неграфический объект, с кодом 2 — имя слоя, с ко-дом 6 — тип линий примитивов слоя по умолчанию (т. е. каким типомотображать объекты с типом линии ПОСЛОЮ (BYLAYER)), с кодом 62 —цвет слоя по умолчанию, 70 — состояние слоя по отношению к операци-ям блокирования, замораживания. Нетрудно заметить, что аналогичныеDXF-коды используются в списке, возвращаемом функцией encget дляпримитивов.

° (setq iay2 (tbinext "LAYER")) возвращает список с данными второгослоя рисунка, например: цо . "LAYER") (2 . "стена!.") (70 . 4)(62 . 4 0) (6 . "ограждение1"))

п (setq Iay2name (tblobjname "LAYER" "Стена!")) возвращает <Имя объекта:14аа570>

Теперь для объекта iay2name с помощью функции entget можно получитьтот же список, что и 1ау2 в предыдущем примере.

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

2.13.6. Функция setviewСледующая функция работает с таблицей VIEW:

(setview <вид> [<экран>])

Устанавливает вид в нужном видовом экране.

Page 174: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 173_

Аргументы: <вид> — список с данными именованного вида в той форме,в какой он возвращается функциями tbinext и tbisearch для таблицыVIEW; <экран> — номер видового экрана в соответствии со значением сис-темной переменной CVPORTS (0 соответствует текущему видовому экрану).

Возвращаемое значение — значение аргумента <вид> при успешном выпол-нении или ni l — при ошибке.

Рассмотрим работу функции в пространстве модели на следующем примере,когда в рисунке создано три именованных вида: ISO, TOP и FRONT. С по-мощью функции tbisearch можно получить параметры видов:с ( s e t q s p i s o ( t b i s e a r c h " V I E W " " I S O " ) ) в о з в р а щ а е т ( ( 0 . " V I E W " )

( 2 . " I S O " ) ( 7 0 . 0 ) ( 4 0 . 6 4 6 . 0 3 5 ! ( 1 0 4 3 . 4 8 7 1 1 4 6 . 3 5 7 ) ( 4 1 . 6 2 3 . 9 6 )i l l - 1 . 0 - 1 . 0 1 . 0 ) ( 1 2 0 . 0 0 . 0 0 . 0 ) ( 4 2 . 5 0 . 0 ) ( 4 3 . 0 . 0 ) ( 4 4 . 0 . 0 )( 5 0 . 0 . 0 ) ( 7 1 . 0 ) ( 7 2 . 1 ) ( 1 1 0 0 . 0 0 . 0 0 . 0 ) ( 1 1 1 1 . 0 0 . 0 0 . 0 )( 1 1 2 0 . 0 1 . 0 0 . 0 ) ( 7 9 . 0 ) ( 1 4 6 . 0 . 0 ) )

D ( s e t q s p - t o p ( t b i s e a r c h " V I E W " " T O P " ) ) В о з в р а щ а е т ( ( 0 . " V I E W " )( 2 . " T O P " ) ( 7 0 . 0 ) ( 4 0 . 2 9 7 . 0 ) ( 1 0 2 8 8 . 3 9 9 1 4 8 . 5 ) ( 4 1 . 5 7 6 . 7 9 7 )( 1 1 0 . 0 0 . 0 1 . 0 ) ( 1 2 0 . 0 0 . 0 0 . 0 ) ( 4 2 . 5 0 . 0 ) ( 4 3 . 0 . 0 ) ( 4 4 . 0 . 0 )( 5 0 . 0 . 0 ) ( 7 1 . 0 ) ( 7 2 . 1 ) ( 1 1 0 0 . 0 0 . 0 0.0) ( 1 1 1 1 . 0 0 . 0 0 . 0 )( 1 1 2 0 . 0 1 . 0 0 . 0 ) ( 7 9 . 0 ) ( 1 4 6 . 0 . 0 ) )

о ( s e t q s p f r o ( t b i s e a r c h " V I E W " " F R O N T " ) ) в о з в р а щ а е т ( ( 0 . " V I E W " )( 2 . " F R O N T " ) ( 7 0 . 0 ) ( 4 0 . 4 3 3 . 8 4 6 ) ( 1 0 2 1 0 . 0 0 . 0 ) ( 4 1 . 8 4 2 . 5 6 3 )( 1 1 0 . 0 - 1 . 0 0 . 0 ) ( 1 2 0 . 0 0 . 0 0 . 0 ) ( 4 2 . 5 0 . 0 ) ( 4 3 . 0 . 0 ) ( 4 4 . 0 . 0 )( 5 0 . 0 . 0 ) ( 7 1 . 0 ) ( 7 2 . 1 ) ( 1 1 0 0 . 0 0 . 0 0 . 0 ) ( 1 1 1 1 . 0 0 . 0 0 . 0 )( 1 1 2 0 . 0 0 . 0 1 . 0 ) ( 7 9 . 3 ) ( 1 4 6 . 0 . 0 ) )

Если в пространстве модели разделить графический экран на несколько ви-довых экранов, то каждому из них будет соответствовать свое значение сис-темной переменной CVPORT. При активизации очередного видового экранасистемная переменная CVPORT будет менять свое значение (попробуйтепоменять активные экраны и прочитать значение системной переменной).

Пусть деление графического экрана выполнено на четыре части, тогда соз-данным видовым экранам будут соответствовать, например, такие значенияCVPORT: 2, 3, 4, 5. Теперь в каждом из видовых экранов по номеру можнозадавать именованный вид:

° (setview spiso 2) устанавливает в видовом экране 2 именованный видISO и возвращает ((0 . "VIEW") (2 . "iso") по . 0) (40 . 646.035)( 1 0 4 3 . 4 8 7 1 1 4 6 . 3 5 7 ) ( 4 1 . 6 2 3 . 9 6 ) ( 1 1 - 1 . 0 - 1 . 0 1 . 0 ) ( 1 2 0 . 0 0 . 0 0 . 0 )( 4 2 . 5 0 . 0 ) ( 4 3 . 0 . 0 ) ( 4 4 . 0 . 0 ) ( 5 0 . 0 . 0 ) ( 7 1 . 0) ( 7 2 . 1)( 1 1 0 0 . 0 0 . 0 0 . 0 ) ( 1 1 1 1 . 0 0 . 0 0 . 0 ) ( 1 1 2 0 . 0 1 . 0 0 . 0 ) ( 7 9 . 0 )( 1 4 6 . 0 . 0 ) )

° (setview sptop 5) устанавливает в видовом экране 5 именованный видТОР и возвращает ((0 . "VIEW") (2 . "ТОР") НО . 0) (40 . 297.0)( 1 0 2 8 8 . 3 9 9 1 4 8 . 5 ) ( 4 1 . 5 7 6 . 7 9 7 ) ( 1 1 0 . 0 0 . 0 1 . 0 ) ( 1 2 0 . 0 0 . 0 0 . 0 )( 4 2 . 5 0 . 0 ) ( 4 3 . 0 . 0 ) ( 4 4 . 0 . 0 ) ( 5 0 . 0 . 0 ) ( 7 1 . 0) ( 7 2 . 1)( 1 1 0 0 . 0 0 . 0 0 . 0 ) ( 1 1 1 1 . 0 0 . 0 0 . 0 ) ( 1 1 2 0 . 0 1 . 0 0 . 0 ) ( 7 9 . 0)( 1 4 6 . 0 . 0 ) )

Page 175: Visual LISP и секреты адаптации AutoCAD

174 Visual LISP и секреты адаптации AutoCAD

° (setview spfro 0) устанавливает в текущем видовом экране (текущимможет оказаться любой из четырех экранов) именованный вид FRONTИ В О З В р а щ а е Т ( ( 0 . " V I E W " ) (2 . " F R O N T " ) ( 7 0 . 0) ( 4 0 . 4 3 3 . 8 4 6 )

( 1 0 2 1 0 . 0 0 . 0 ) ( 4 1 . 8 4 2 . 5 6 3 ) ( 1 1 0 . 0 - 1 . 0 0 . 0 ) ( 1 2 0 . 0 0 . 0 0 . 0 }

( 4 2 . 5 0 . 0 ) ( 4 3 . 0 . 0 ) ( 4 4 . 0 . 0 ) ( 5 0 . 0 . 0 ) ( 7 1 . 0 ) ( 7 2 . 1)

( 1 1 0 0 . 0 0 . 0 0 . 0 ) ( 1 1 1 1 . 0 0.0 0 . 0 ) ( 1 1 2 0 . 0 0 . 0 1 . 0 ) ( 7 9 . 3 )

( 1 4 6 . 0 . 0 ) )

Аналогично выполняется установка видов в видовых экранах пространствелиста (см. также приложение 12 с похожей задачей).

2.13.7. Функция snvalidПроверяет имя на возможность использования его в качестве элемента таб-лицы (чтобы исключить, например, нелегальные имена слоев, типов линийи т. п.).

(snvalid <имя> [<флаг>])

Аргументы: <имя> — текстовая строка, <флаг> — целое число (0 или 1).

Возвращаемое значение — т, если имя является допустимым, и ni l — в про-тивном случае.

Аргумент <флаг> управляет возможностью использования символа |. Еслиаргументу <флаг> задано значение 0, то символ считается недопустимым.Если задано значение 1, то символ может встретиться в строке, но он недолжен быть первым или последним (применяется в именах слоев внешнихссылок).

К недопустимым всегда относятся пустые строки. Кроме того, в именах немогут участвовать управляющие и графические символы, а символ | не дол-жен быть первым или последним в строке.

Функция snvalid работает в двух режимах, в зависимости от текущего зна-чения системной переменной EXTNAMES. Если системная переменнаяEXTNAMES имеет значение 0, то тогда имена проверяются с теми же ограни-чениями, что и в версиях системы AutoCAD, предшествовавших AutoCAD 2000:допускаются буквы, цифры и символы доллара ($), подчеркивания (_) и де-фиса (-).

Если переменная EXTNAMES имеет значение 1 (а оно действует по умол-чанию), то функция snvalid при проверке имени предъявляет менее жест-кие требования. По-прежнему, к недопустимым относятся управляющие играфические символы, а также следующие: <, >, /, \, " (двойная кавычка),: , ? , * , , (запятая), =, ", ,• (символ с кодом 59). Символ пробела является до-пустимым.

Page 176: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 175

Примеры (для случая, когда EXTNAMES имеет значение 1):

° (snvalid "chamferg") возвращает Т0 (snvalid "chamfer*") возвращает nil

° (snvalid "chaml.fer") возвращает nilD (snvalid "cham fer") возвращает Т0 (snvalid "chamlfer" 1) возвращает Т

Примеры (для случая, когда EXTNAMES имеет значение 0):D (snvalid "chamfer@") возвращает nil

° (snvalid "chamfer*") возвращает nila (snvalid "chamlfer") возвращает nilD (snvalid "cham fer") возвращает nil

° (snvalid "chamlfer" 1) возвращает Т

2.14. Функции, работающиес расширенными даннымиК любому примитиву рисунка можно добавлять расширенные данные, т. е.текстовые или числовые данные, которые желательно хранить вместе с гео-метрией (например, марки материалов, наименования узлов, секций и т. п.).Обычно наличие такой информации позволяет разрабатывать программысвязи с базами данных (рассмотрение таких программ не является предме-том настоящей книги). Расширенные данные связываются с именем опреде-ленного приложения. У одного графического примитива могут быть данныенескольких приложений, которые располагаются последовательно в опреде-ленной структуре.

2.14.1. Структура расширенных данныхЕсли расширенные данные присоединены к примитиву, то в базе рисункаони следуют за обычными данными (DXF-коды этих данных находятся вдиапазоне от —2 до 239). Извлечь расширенные данные можно с помощьюфункции entget, при обращении к ней нужно указывать имя приложения,с которым они связаны (см. описание функции entget в разд. 2.12.5). В спи-ске, возвращаемом функцией entget, расширенные данные находятся в под-списке, начинающемся с DXF-кода —З (признак наличия расширенныхданных), в котором далее располагаются точечная пара с кодом 1001 (началорасширенных данных и имя приложения, с которым они связываются) иточечные пары с DXF-кодами 1000, 1002—1071. Назначение DXF-кодоврасширенных данных описывается в табл. 2.6.

Page 177: Visual LISP и секреты адаптации AutoCAD

176 Visual LISP и секреты адаптации AutoCAD

Таблица 2.6. Назначение DXF-кодов расширенных данных

Код Назначение

1000 Строковая константа длиной не более 255 знаков (256-й знак зарезервиро-ван под символ с кодом 0)

1001 Строковая константа, используемая только для указания имени приложе-ния, длиной не более 31 знака (если код 1001 попадает внутрь списка, ор-ганизуемого с помощью DXF-кодов 1002, то он интерпретируется как обыч-ная константа, а не имя приложения; см. далее описание DXF-кода 1002).Имя приложения должно состоять только из цифр, латинских букв и симво-лов $, -, _

1002 Строка, имеющая значения "{" или "}", которые носят тот же смысл, что илевая и правая круглые скобки в обозначении списка. С помощью группы скодом 1002 можно формировать в расширенных данных списковые структу-ры (они должны начинаться открывающей скобкой с кодом 1002, затемдолжны идти данные, включаемые в список, а закрывающая скобка с кодом1002 завершает оформление списка). См. также замечание об интерпрета-ции данных группы 1001 в таком списке

1003 Имя слоя, с которым связываются расширенные данные

1004 Двоичные данные длиной не более 127 байтов. Обрабатываются только вObjectARX

1005 Метка объекта в базе чертежа

1010 Трехмерная точка (три вещественных числа)

1011 Трехмерная точка, интерпретируемая как положение в МСК. Такая точкаперемещается, масштабируется, поворачивается и симметрируется одно-временно с родительским примитивом рисунка. Если точка попадает в рам-ку выбора команды РАСТЯНУТЬ (STRETCH), то она подвергается операциирастягивания вместе с родительским примитивом

1012 Трехмерная точка, интерпретируемая как перемещение в МСК. Такая точкане перемещается и не растягивается одновременно с основным примити-вом, но участвует вместе с ним в операциях масштабирования, поворота исимметрирования

1013 Трехмерная точка, интерпретируемая как направление в МСК. Такая точкане масштабируется, не перемещается и не растягивается одновременно сосновным примитивом, но участвует вместе с ним в операциях поворота исимметрирования. Вектор с координатами, взятыми из группы с кодом 1013,является нормализованным, т. е. единичной длины

1040 Вещественное число

1041 Вещественное число, интерпретируемое как расстояние. Оно масштабиру-ется одновременно с родительским примитивом

1042 Вещественное число, интерпретируемое как масштабный коэффициент.Масштабируется одновременно с родительским примитивом

Page 178: Visual LISP и секреты адаптации AutoCAD

Глава

Код

2. Язык AutoUSP

Назначение

177

Таблица 2.6 (окончание)

1070 16-битовое целое число (со знаком или без знака)

1071 32-битовое целое число со знаком (длинное целое). Хотя система AutoCADхранит данные группы с кодом 1071 как длинное целое, AutoLISP возвраща-ет их как вещественные числа. Функциям entmake и entmod в точечной паре скодом 1071 можно подавать либо целые числа, либо вещественные.ObjectARX трактует данные группы 1071 как длинные целые

Как было сказано выше, расширенные данные связываются с именем кон-кретного приложения. Имена приложений хранятся в рисунке в таблицеAPP1D (см. разд. 2.13.1). Чтобы занести имя приложения в эту таблицу, сле-дует пользоваться функцией regapp (см. разд. 2.14.2).

2.14.2. Функция regappЗаносит имя приложения в таблицу APP1D.

(regapp <приложение>)

Параметр <приложение> должен быть текстовой строкой (по возможностинужно выбирать имя приложения таким, чтобы оно не могло совпадать сименами приложений других разработчиков — иначе это приведет к непра-вильной работе с расширенными данными).

Функция regapp возвращает имя приложения (или nil в случае ошибки).Значение nil возвращается также, если приложение с таким именем ужерегистрировалось.

Пример:

° (regapp "SHIPDESIGN") ВОЗВращаеТ "SHIPDESIGN"

2.14.3. Присоединение расширенных данныхФункция entmake (описание см. разд. 2.12.6) может создать примитив и сразуприсоединить к нему расширенные данные. С помощью функции entmodможно добавить расширенные данные к существующему графическому объ-екту.

Предположим в качестве примера, что к последнему существующему при-митиву рисунка (пусть им является отрезок) нужно добавить расширенныеданные, связанные с приложением "GENHULL":

° (setq ie (entget (entiast))) сохраняет в переменной 1е список по-следнего примитива, у которого еще нет расширенных данных: ((-1 .<Имя объекта: 14аа578>) (0 . "LINE") (330 . <Имя объекта: 14aa4f8>)

Page 179: Visual LISP и секреты адаптации AutoCAD

178 Visual LISP и секреты адаптации AutoCAD

(5 . " 2 F " ) ( 1 0 0 . " A c D b E n t i t y " ) ( 6 7 . 0) ( 4 1 0 . " M o d e l " ) (3 . " 0 " )

( 6 2 . 1 ) ( 1 0 0 . " A c D b L i n e " ) ( 1 0 8 5 . 4 6 5 5 2 2 3 . 3 3 5 0 . 0 )

( 1 1 1 8 7 . 7 1 2 1 6 7 . 2 0 9 0 . 0 ) ( 2 1 0 0 . 0 0.0 1 . 0 ) )

D ( s e t q e d a t a ' ( ( - 3 ("GENHULL" ( 1 0 0 0 . " П л а с т м а с с а " ) ( 1 0 7 0 . 5 7 ) ) ) ) ) CO-

храняет в переменной edata список с расширенными данными, которыебудут добавлены к списку 1е (добавляются текстовая строка с DXF-кодом1000 и целое число с DXF-кодом 1070)

D ( s e t q I e 2 ( a p p e n d l e e d a t a ) ) о б ъ е д и н я е т СПИСКИ 1е И e d a t a И ф о р м и р у е т

НОВЫЙ СПИСОК 1 е 2 : ( ( - 1 . <Имя о б ъ е к т а : 1 4 а а 5 7 8 > ) (0 . " L I N E " )(330 . <Имя о б ъ е к т а : 1 4 a a 4 f 8 > ) (5 . " 2 F " ) (100 . " A c D b E n t i t y " )(67 . 0) (410 . " M o d e l " ) (8 . " 0 " ) (62 . 1) (100 . " A c D b L i n e " )(10 8 5 . 4 6 5 5 2 2 3 . 3 3 5 0 . 0 ) (11 1 8 7 . 7 1 2 1 6 7 . 2 0 9 0 . 0 ) (210 0 . 0 0 . 0 1.0)(-3 ("GENHULL" (1000 . " П л а с т м а с с а " ) (1070 . 5 7 ) ) ) )

° (entmod 1е2) модифицирует примитив по новому списку и возвращает тоже значение, что и предыдущее выражение

° (entget (entiast) '("GENHULL")) возвращает список нового последнегопримитива вместе с расширенными данными, относящимися к приложе-нию "GENHULL": ( (-1 . <Имя объекта: 14аа578>) (0 . "LINE")( 3 3 0 . <Имя о б ъ е к т а : 1 4 a a 4 f 8 > ) ( 5 . " 2 F " ) ( 1 0 0 . " A c D b E n t i t y " )(67 . 0) ( 4 1 0 . " M o d e l " ) (8 . " 0 " ) ( 6 2 . 1) ( 1 0 0 . " A c D b L i n e " )( 1 0 8 5 . 4 6 5 5 2 2 3 . 3 3 5 0 . 0 ) ( 1 1 1 8 7 . 7 1 2 1 6 7 . 2 0 9 0 . 0 ) ( 2 1 0 0.0 0 . 0 1 . 0 )( - 3 ("GENHULL" ( 1 0 0 0 . " П л а с т м а с с а " ) ( 1 0 7 0 . 5 7 ) ) ) )

Размер расширенных данных любого примитива не должен превышать16 Кбайт —1 (16 383 байта). Поэтому по мере добавления таких данных ихразмер нужно контролировать. Этой цели служат рассматриваемые нижеФУНКЦИИ x d s i z e И xdroom.

Перед записью в зону примитива новой порции расширенных данных сле-дует проверить, достаточно ли для них места.

См. также пример работы с расширенными данными в приложении 10.

2.14.4. Функция xdsizeПолучает размер в байтах, необходимый для сохранения расширенных данных.

(xdsize <список>)

Аргумент <список> — это список с расширенными данными, начинающийсяс DXF-кода - З .

Возвращаемое значение — целое число (размер в байтах).

Пример:

° ( x d s i z e ' ( - 3 ( " G E N H U L L " ( 1 0 0 0 . " П л а с т м а с с а " ) ( 1 0 7 0 . 5 7 ) ) ) ) В О З В р а -

щает 18

Page 180: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 179

2.14.5. Функция xdroom

Вычисляет количество свободных байтов в зоне расширенных данных при-митива.(xdroom <примитив>)

Аргумент — имя примитива.

Возвращаемое значение — целое число. При ошибке возвращается nil.

Пример:

° (xdroom (entiast)) возвращает 16383, если у последнего примитива нетрасширенных данных

2.15. Функции, работающие со словарямии Х-записямиСвойствами, аналогичными таблицам, обладают в рисунке разнообразныенеграфические объекты, называемые словарями (dictionaries). Пользователь-ские приложения могут создавать свои словари. Функции, рассматривае-мые в следующих разделах, выполняют операции над словарями и их эле-ментами.

2.15.1. СловариС помощью словарей система AutoCAD расширяет круг своих действий.К наиболее понятным пользователю словарям можно отнести, например,следующие:

• словарь стилей мультилиний;

П словарь групп;

• словарь растровых изображений;

• словарь листов чертежа;

• словарь стилей печати.

У словарей есть корневой словарь, который содержит имена других слова-рей рисунка. Имя (адрес) корневого словаря можно получить с помощьюфункции namedobjdict.

ДЛЯ работы СО словарями ИСПОЛЬЗУЮТСЯ фуНКЦИИ dictsearch, dictnext,dictadd, dictrename, dictremove. Все ОНИ рассмотрены ниже.

Приведена также функция layoutiist, облегчающая работу со словаремвкладок листов чертежа.

Page 181: Visual LISP и секреты адаптации AutoCAD

180 Visual LISP и секреты адаптации AutoCAD

2.15.2. Функция namedobjdictПолучение имени корневого словаря неграфических объектов рисунка.

(namedobjdict)

Возвращаемое значение — имя словаря как объекта базы данных рисунка(аналогичное имени примитива или имени таблицы как объекта).

Пример (для нового рисунка):

° (setq od (namedobjdict)) возвращает <Имя объекта: 4002есб0>

Возвращенный объект является словарем, содержащим имена остальныхсловарей рисунка. Прочитать его можно с помощью функции entget:n (entget od) возвращает ((-1 . <Имя объекта: 4002ес60>)

(О . "DICTIONARY") (330 . <Имя объекта: 0>) (5 . "С")(100 . "AcDbDictionary") (280 . 0) (281 .1) (3 . "ACAD_GROUP")(350 . <Имя объекта: 4002есб8>) (3 . "ACAD_LAYOUT")(350 . <Имя объекта: 4002ecd0>) (3 . "ACAD_MLINESTYLE")(350 . <Имя объекта: 4002есЬ8>) (3 . "ACAD_PLOTSETTINGS")(350 . <Имя объекта: 4002есс8>) (3 . "ACAD_PLOTSTYLENAME")(350 . <Имя объекта: 4002ес70>))

В этом списке точечные пары с DXF-кодом З содержат имена словарей ри-сунка:

О ACADJ3ROUP — словарь групп;

П ACAD_LAYOUT — СЛОВЭрЬ ЛИСТОВ;

О ACADJVILINESTYLE — словарь стилей мультилиний;

• ACAD_PLOTSETTINGS — словарь настроек печати;

П ACAD_PLOTSTYLENAME — словарь стилей печати.

2.15.3. Функция dictsearchЧитает характеристики элемента словаря (аналогично функции tbisearch).

(dictsearch <словарь> <заголовок> [<следующий>])

Аргументы: <словарь> — имя словаря (имя объекта базы рисунка),<заголовок> — строка с именем элемента словаря, <следующий> — признакчтения следующего за указанным в предыдущем аргументе элемента в бли-жайшем вызове функции dictnext.

Возвращаемое значение — список с характеристиками элемента словаря.

Воспользуемся примером из разд. 2.15.2 и сформированной в нем перемен-ной od, содержащей список с характеристиками корневого словаря рисунка.С помощью функции dictsearch можно получить списки с элементами не-которых из пяти словарей.

Page 182: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 181_

Пример (получение перечня листов):

о (dictsearch od "ACAD_LAYOUT") ВОЗВращаеТ({-1 . <Имя объекта: 4002ecd0>) (0.. "DICTIONARY") (5 . "1А")(102 . "{ACAD_REACTORS") (330 . <Имя объекта: 4002ес60>) (102 . "}")(330 . <Имя объекта: 4002ес60>) (100 . "AcDbDictionary") (280 . 0)(281 .1) (3 . "Model") (350 . <Имя объекта: 4002edl0>) (3 . "Лист1")(350 . <Имя объекта: 4002ecf0>) (3 . "Лист2")(350 . <Имя объекта: 4002ed30>))

Из точечных пар с DXF-кодом З этого списка можно извлечь имена вкладоклистов: листа, Лист2 (сравните с рассматриваемой в разд. 2.15.8 функциейlayoutiist). В списке вместе с именами листов фигурирует и имя вкладкипространства МОДелИ (Model).

Пример (получение перечня стилей мультилиний):

° (dictsearch od "ACAD_MLINESTYLE") ВОЗВращаеТ ((-1 . <Имя объекта: 4002есЬ8>) (0 . "DICTIONARY") (5 . "17")(102 . "{ACAD_REACTORS") (330 . <Имя объекта: 4002ес60>) (102 . "}")(330 . <Имя объекта: 4002ес60>) (100 . "AcDbDictionary") (280 . 0)(281 .1) (3 . "Standard") (350 . <Имя объекта: 4002есс0>))

Возвращенное значение показывает, что в новом рисунке имеется толькоОДИН СТИЛЬ МуЛЬТИЛИНИЙ —. Standard.

Пример (получение перечня стилей печати):

° ( d i c t s e a r c h od "ACAD_PLOTSTYLENAME") ВОЗВращаеТ((-1 . <Имя объекта:" 4002ес70>) (0 . "ACDBDICTIONARYWDFLT") (5 . "Е")(102 . "{ACAD_REACTORS") (330 . <Имя объекта: 4002ес60>) (102 . "}")(330 . <Имя объекта: 4002ес60>) (100 . "AcDbDictionary") (280 . 0)(281 .1) (3 . "Normal") (350 . <Имя объекта: 4002ес78>)(100 . "AcDbDictionaryWithDefault") (340 . <Имя объекта: 4002ес78>))

Приведенные примеры показывают, что словари могут быть разных типов.Об этом говорят отличающиеся значения, записанные в точечные пары сDXF-кодом О (нам встретились DICTIONARY И ACDBDICTIONARYWDFLT).

2.15.4. Функция dictnextЧитает очередной элемент словаря (аналогична функции tbinext, но работа-ет со словарями).

(dictnext <словарь> [<признак>])

Аргументы: <словарь> — имя словаря (имя объекта базы рисунка),<признак> — любое значение (важно только, равно оно nil или нет).

Возвращаемое значение — список с характеристиками элемента словаря.Если был достигнут конец словаря, то возвращается nil.

Если аргумент <признак> задан и не равен nil, то функция читает первыйэлемент словаря. В других случаях функция dictnext читает следующийэлемент (предыдущим был элемент, прочитанный либо в предыдущем вызо-

Page 183: Visual LISP и секреты адаптации AutoCAD

182 Visual LISP и секреты адаптации AutoCAD

ве функции dictnext, либо функцией dictsearch, вызванной с аргументом<следующий>, имеющим значение, отличное от nil).

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

Примеры (чтение характеристик вкладок листов):

° (setq dbegin (dictsearch (namedobjdict) "ACAD_LAYOUT")) ВОЗВращает

список с оглавлением словаря листов: ((-1 . <имя объекта: 4002ecd0>)(О . "DICTIONARY") (5 . "1А") (102 . "{ACAD_REACTORS")(330 . <Имя объекта: 4002ес60>) (102 . "}")(330 . <Имя объекта: 4002есбО>) (100 . "AcDbDictionary") (280 . 0)(281 .1) (3 . "Model") (350 . <Имя объекта: 4002edl0>) (3 . "Лист1")(350 . <Имя объекта: 4002ecf0>) (3 . "Лист2")(350 . <Имя объекта: 4002ed30>))

D (setq layoutdict (cdr (assoc -1 dbegin) ) ) ВОЗВращает ИМЯ СЛОВЭрЯ КЭК

Объекта рисунка: <Имя объекта: 4002ecd0>

° (dictnext layoutdict т) возвращает список с данными первой вкладкирисунка (первой является вкладка Model):((-1 . <Имя объекта: 4002edlO>) (0 . "LAYOUT") (5 . "22")(102 . "{ACAD_REACTORS") (330 . <Имя объекта: 4002ecdO>) (102 . "}")(330 . <Имя объекта: 4 002ecd0>) (100 . "AcDbPlotSettings")(2 . "HP DeskJet 720C Series") (40 . 0.0) (41 . 0.0) (42 . 0.0)(43 . 0.0) (44 . 0.0) (45 . 0.0) (46 . 0.0) (47 . 0.0) (48 . 0.0)(49 . 0.0) (140 . 0.0) (141 . 0.0) (142 . 1.0) (143 . 1.0) (70 . 1712)(72 . 0) (73 . 0) (74 .0) (7 . "") (75 . 0) (147 . 1.0) (148 . 0.0)(149 . 0.0) (100 . "AcDbLayout") (1 . "Model".) (70 . 1) (71 . 0)(10 0.0 0.0 0.0) (11 12.0 9.0 0.0) (12 0.0 0.0 0.0) (14 0.0 0.0 0.0)(15 0.0 0.0 0.0) (146 . 0.0) (13 0.0 0.0 0.0) (16 1.0 0.0 0.0)(17 0.0 1.0 0.0) (76 . 0) (330 . <Имя объекта: 4002ecf8>))

° (dictnext layoutdict) возвращает список с данными первого листарисунка (Лист1): ((-1 . <Имя объекта: 4002ecf0>) (0 . "LAYOUT")(5 . "IE") (102 . "{ACAD_REACTORS") (330 . <Имя объекта: 4002ecd0>)(102 . "}") (330 . <Имя объекта: 4002ecd0>) (100 . "AcDbPlotSettings")(1 . "") (2 . "none_device") (4 . "Letter_(8.50_x_ll.00_Inches))(40 . 6.35) (41 . 6.35) (42 . 6.35001) (43 . 6.35001) (44 . 215.9)(45 . 279.4) (46 . 0.0) (47 . 0.0) (48 . 0.0) (49 . 0.0) (140 . 0.0)(14.1 . 0.0) (142 . 1.0) (143 . 1.0) (70 . 688) (72 . 1) (73 . 1)(74 .5) (7 . "") (75 . 16) (147 . 1.0) (148 . 0.0) (149 . 0.0)(100 . "AcDbLayout") (1 . "Лист1") (70 . 1) (71 . 1) (10 -6.35001 -6.35 0.0) (11 273.05 209.55 0.0) (12 0.0 0.0 0.0) (14 26.67 20.32 0.0)(15 240.03 182.88 0.0) (146 . 0.0) (13 0.0 0.0 0.0) (16 1.0 0.0 0.0)(17 0.0 1.0 0.0) (76 . 0) (330 . <Имя объекта: 4002ecd8>)(331 . <Имя объекта: 4002ed70>))

° (dictnext layoutdict) возвращает список с данным и второго листарисунка (Лист2)." ((-1 . <Имя объекта: 4002ed30>) (0 . "LAYOUT")(5 . "26") (102 . "{ACADJREACTORS") (330 . <Имя объекта: 4002ecd0>)(102 . "}") (330 . <Имя объекта: 4002ecd0>) (100 . "AcDbPlotSettings")(1 . "") (2 . "none device") (4 . "Letter (8.50 x 11.00 Inches)")

Page 184: Visual LISP и секреты адаптации AutoCAD

Глава 2. ЯзыкАиЬиЭР 183

(40 .(45 .(141(74 .(100

6.79

. 05)

35). 4 ).0)

(7

(41 .(46 .(142 .. " ")

AcDbLayout

6.35)0.0)

1.0)(75 .") (1

(42(47 ,

. 6.35001). 0.0)

(143 . 1.16) (147. "Лист2"

(48 .0) (70. 1.0)) (70

(43 .0.0). 68(148

. 1)

6.35001(49 . 0

8) (72 .. 0.0)

(71 . 2)

) (44 .• 0)

1)(149

(140(73. 00 . 0

15.9). 0.

. 1)

. 0 )0 . 0

0)

0.0)(11 12.0 9.0 0.0) (12 0.0 0.0 0.0) (14 0.0 0.0 0.0) (15 0.0 0.0 0.0)(146 . 0.0) (13 0.0 0.0 0.0) (16 1.0 0.0 0.0) (17 0.0 1.0 0.0)(76 . 0) (330 . <Имя объекта: 4002edl8>))

Из приведенных примеров видно, что имена вкладок хранятся в точечныхпарах с DXF-кодом 1 (см. также описание функции layoutiist вразд. 2.15.8).

2.15.5. Функция dictaddДобавляет новый объект к словарю.

(dictadd <словарь> <заголовок> <новый>)

Аргументы: <словарь> — имя словаря как объекта, <заголовок> — заголовокэлемента, добавляемого к словарю, <новый> — новый элемент (имя новогообъекта как элемента базы рисунка). Для создания новых элементов слова-рей используется функция entmakex.

Возвращаемое значение — имя объекта в базе рисунка.

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

Пример (добавление нового словаря к корневому словарю):

° ( s e t q d i c l i s t ' ( ( 0 . "DICTIONARY") (100 . "AcDbDict ionary"))) ВОЗВра-

щает СПИСОК ((0 . "DICTIONARY") (100 . "AcDbDictionary") ), С ПОМОЩЬЮ

которого будет создаваться новый объект в базе рисунка

(setq newdic (entmakex d i c l i s t ) ) возвращает <Имя объекта: 4002edc0>

(dictadd (namedobjdict) "ИЗДЕЛИЯ" newdic) добавляет элемент К КОрне-

вому словарю, создавая, таким образом, новый словарь ИЗДЕЛИЯ; возвра-щает <Имя объекта: 4 002edc0>

Чтобы прочитать данные нового объекта, воспользуемся функцией entget:D (entget newdic) возвращает ((-1 . <Имя объекта: 4002edc0>)

(0 . "DICTIONARY") (5 . "38") (102 . "{ACAD_REACTORS")(330 . <Имя объекта: 4002ес60>) (102 . "}")(330 . <Имя объекта: 4002ес60>) (100 . "AcDbDictionary")(280 . 0) (281 . 1))

Этот объект должен одновременно попасть с именем ИЗДЕЛИЯ В корневойсловарь. Проверим это опять же с помощью функции entget:

° (entget (namedobjdict)) возвращает ((-1 . <Имя объекта: 4002ес60>)(О . "DICTIONARY") (330 . <Имя объекта: 0>) (5 . "С")

Page 185: Visual LISP и секреты адаптации AutoCAD

184 Visual LISP и секреты адаптации AutoCAD

(100 . "AcDbDictionary") (280 . 0) (281 . 1)(3 . "ACAD_GROUP") (350 . <Имя объекта: 4002ес68>)(3 . "ACAD_LAYOUT") (350 . <Имя объекта: 4002ecdO>)(3 . "ACAD_MLINESTYLE") (350 . <Имя объекта: 4002есЬ8>)(3 . "ACAD_PLOTSETTINGS") (350 . <Имя объекта: 4002есс8>)(3 . "ACAD_PLOTSTYLENAME") (350 . <Имя объекта: 4002ес70>)(3 . "ИЗДЕЛИЯ") (350 . <Имя объекта: 4002edcO>))

Как видим из полученного списка, в оглавлении словарей появилось имясловаря ИЗДЕЛИЯ. При формировании словарей пользователя следует иметь ввиду, что префикс ACAD_ зарезервирован для словарей, создаваемых систе-мой AutoCAD.

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

2.15.6. Функция dictremoveУдаляет элемент словаря.

(dictremove <словарь> <заголовок>)

Аргументы: <словарь> — имя словаря как объекта, <заголовок> — заголовокэлемента, удаляемого из словаря.

Возвращаемое значение — имя удаленного объекта как элемента базы ри-сунка.

Пример (удаление словаря ИЗДЕЛИЯ ИЗ корневого словаря рисунка — про-должение примера из разд. 2.15.5):

° (dictremove (namedobjdict) newdic) возвращает <Имя объекта: 4002edc0>

Функция dictremove удаляет только ссылки на объекты, использованные всловаре. Поэтому для освобождения памяти, занимаемой этими объектами вбазе рисунка, нужно выполнить их удаление как примитивов с помощьюфункции entdei. Исключением из указанного правила являются объектысловарей групп и стилей мультилиний. Система AutoCAD сама освобождаетпамять, занятую удаляемыми с помощью функции dictremove группами истилями мультилиний.

( Замечание ^Система AutoCAD не дает возможность удалить с помощью функции d i c t r e -move стили мультилиний, занятые в объектах рисунка.

2.15.7. Функция dictrenameПереименовывает элемент словаря.

(dictrename <словарь> <старое> <новое>)

Page 186: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 185_

Аргументы: <словарь> — имя словаря как объекта базы рисунка, <старое> и<новое> — текстовые строки (задают старое и новое имена переименовывае-мого элемента словаря).

Возвращаемое значение — значение аргумента <новое> при успешном пере-именовании. При ошибке возвращается nil.

Пример:0 (dictrename (namedobjdict) "ИЗДЕЛИЯ" "ДЕТАЛИ") Возвращает "ДЕТАЛИ" И

переименовывает словарь ИЗДЕЛИЯ, созданный в разд. 2.15.5.

2.15.8. Функция layoutlistПолучает имена листов текущего рисунка.(layoutlist)

Возвращаемое значение — список с текстовыми константами в качествеэлементов.

Пример (см. файл 1st floor.dwg из стандартных примеров, поставляемыхвместе с системой AutoCAD 2000):

° (layoutlist) возвращает список с именами трех листов("Architectural Plan" "Electrical Plan" "Lighting Plan")

2.15.9. Х-записи

Х-записи — это особые неграфические объекты, которые могут создаватьсяпользователями и хранить произвольные данные. Как примитивы они име-ют тип с названием XRECORD.

Х-записи являются аналогом расширенных данных (см. разд. 2.14), но обла-дают преимуществом — их размер не ограничен 16 383 байтами.

Создание Х-записей выполняется с помощью списков, содержащих, как иобычные примитивы, точечные пары с DXF-кодами в диапазоне 1—369(в отличие от расширенных данных, которые пользуются DXF-кодами 1000и больше). После создания Х-записи группируются в словари пользователя.Рассмотрим этот процесс на примере.

С ф о р м и р у е м СПИСКИ l x r l И 1хг2 ДЛЯ СОЗДанИЯ С ПОМОЩЬЮ ФУНКЦИИ entmakex

объектов типа XRECORD (точечные пары с DXF-кодами О и 100 должныбыть стандартными, остальные задаются пользователем):

° (setq lxrl '((0 . "XRECORD") (100 . "AcDbXrecord") (1 . "Рыбный цех")(10 110.0 5267.2 230.8) (11 -11.2 1234.6 429.0) (40 . 637.54) (70 . 0)))

D (setq Ixr2 '((0 . "XRECORD") (100 . "AcDbXrecord") (1 . "Камбуз")

(10 4207.2 3128.9 -234.4) (11 -687.3 5344.6 1234.6) (40 . 230.17)(70 .1)))

Page 187: Visual LISP и секреты адаптации AutoCAD

186 Visual LISP и секреты адаптации AutoCAD

Создадим с помощью функции entmakex объекты (Х-записи) xri и хг2:

° (setq xrl (entmakex lxrl)) Возвращает <Имя объекта: 4002ed58>

D (setq xr2 (entmakex Ixr2) ) возвращает <Имя объекта: 4002ed60>

Проверим с помощью функции entget данные построенных Х-записей:

° ( e n t g e t x r l ) в о з в р а щ а е т ( ( - 1 . <Имя о б ъ е к т а : 4 0 0 2 e d 5 8 > )(О . "XRECORD") ( 3 3 0 . <Имя о б ъ е к т а : 0 > ) (5 . . " 2 В " )( 1 0 0 . " A c D b X r e c o r d " ) ( 2 8 0 . 1 ) ( 1 . " Р ы б н ы й ц е х " ) ( 1 0 1 1 0 . 0 5 2 6 7 . 2

2 3 0 . 8 ) ( 1 1 - 1 1 . 2 1 2 3 4 . 6 4 2 9 . 0 ) ( 4 0 . 6 3 7 . 5 4 ) ( 7 0 . 0 ) )

° ( e n t g e t x r 2 ) в о з в р а щ а е т ( ( - 1 . <Имя о б ъ е к т а : 4 0 0 2 e d 6 0 > )(0 . "XRECORD") ( 3 3 0 . <Имя о б ъ е к т а : 0 > ) (5 . " 2 С " ) ( 1 0 0 ." A c D b X r e c o r d " ) ( 2 8 0 . 1 ) ( 1 . " К а м б у з " ) ( 1 0 4 2 0 7 . 2 3 1 2 8 . 9 - 2 3 4 . 4 )( 1 1 - 6 8 7 . 3 5 3 4 4 . 6 1 2 3 4 . 6 ) ( 4 0 . 2 3 0 . 1 7 ) ( 7 0 . 1 ) )

Видно, что интерпретатор AutoLISP при выполнении функции enmakex до-бавил к первоначальным данным Х-записей точечные пары с DXF-кодами330, 5 и 280.

Добавим новый словарь ПОМЕЩЕНИЯ К корневому словарю так же, как мы этосделали в разд. 2.15.5:

° (setq diclist '((0 . "DICTIONARY") (100 . "AcDbDictionary"))) ВОЗВра-

щает ((0 . "DICTIONARY") (100 . "AcDbDictionary"))

° (setq newdic (entmakex diclist)) Возвращает <Имя объекта: 4002ed68>

° (dictadd (namedobjdict) "ПОМЕЩЕНИЯ" newdic) возвращает <Имя объекта:4002ed68>

Проверим, что в списке словарей появился словарь ПОМЕЩЕНИЯ:D (entget (namedobjdict)) возвращает ((-1 . <Имя объекта: 4002есб0>)

(0 . "DICTIONARY") (330 . <Имя объекта: 0>) (5 . "С")(100 . "AcDbDictionary") (280 . 0) (281 .1) (3 . "ACADJ3ROUP")(350 . <Имя объекта: 4002ес68>) (3 . "ACAD_LAYOUT") (350 . <Имя объекта:4002ecd0>) (3 . "ACAD__MLINESTyLE") (350 . <Имя объекта: 4002есЬ8>)(3 . "ACAD_PLOTSETTINGS") (350 . <Имя объекта: 4002есс8>)(3 . "ACAD_PLOTSTYLENAME") (350 . <Имя объекта: 4002ес70>)(3 . "ПОМЕЩЕНИЯ") (350 . <Имя объекта: 4002ed68>))

Добавим к словарю ПОМЕЩЕНИЯ объекты xrl и хг2 с заголовками Рыбцех1 иКамбуз.'п (dictadd newdic "Рыбцех1" xrl) возвращает <Имя объекта: 4 002ed58>

п (dictadd newdic "Камбуз" хг2) возвращает <Имя объекта: 4002ed60>

Теперь если проверить с помощью функции entget списки данных Х-запи-сей xrl и хг2, то мы увидим, что списки изменились (появилась связь сословарем):

° (entget xrl) возвращает ((-1 . <Имя объекта: 4002ed58>)(0 . "XRECORD") (5 . "2В") (102 . "{ACAD_REACTORS") (330 . <Имя объек-та: 4002ed68>) (102 . "}") (330 . <Имя объекта: 4002ed68>)

Page 188: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 187_

( 1 0 0 . " A c D b X r e c o r d " ) ( 2 8 0 . 1 ) ( 1 . " Р ы б н ы й ц е х " ) ( 1 0 1 1 0 . 0 5 2 6 7 . 2

2 3 0 . 8 ) ( 1 1 - 1 1 . 2 1 2 3 4 . 6 4 2 9 . 0 ) ( 4 0 . 6 3 7 . 5 4 ) ( 7 0 . 0 ) )

D ( e n t g e t x r 2 ) в о з в р а щ а е т ( ( - 1 . < И м я о б ъ е к т а : 4 0 0 2 e d 6 0 > )

(0 . "XRECORD") (5 . " 2 С " ) ( 1 0 2 . "{ACAD_REACTORS") ( 3 3 0 . < И н я

о б ъ е к т а : 4 0 0 2 e d 6 8 > ) ( 1 0 2 . " } " ) ( 3 3 0 . <Имя о б ъ е к т а : 4 0 0 2 e d 6 8 > )

( 1 0 0 . " A c D b X r e c o r d " ) ( 2 8 0 . 1 ) ( 1 . " К а м б у з " ) ( 1 0 4 2 0 7 . 2 3 1 2 8 . 9

- 2 3 4 . 4 ) ( 1 1 - 6 8 7 . 3 5 3 4 4 . 6 1 2 3 4 . 6 ) ( 4 0 . 2 3 0 . 1 7 ) ( 7 0 . 1 ) )

Проверим с помощью функции dictnext, какие элементы имеются в слова-ре ПОМЕЩЕНИЯ:

° (dictnext newdic Т) возвращает ((-1 . <Имя объекта: 4002ed60>)(0 . "XRECORD") (5 . "20") (102 . " f ACAD__REACTORS") (330 . <Имяобъекта: 4002ed68>) (102 . ."}") (330 . <Имя объекта: 4002ed68>)(100 . "AcDbXrecord") (280 .1) (1 . "Камбуз") (10 4207.2 3128.9 -234.4)(11 -687.3 5344.6 1234.6) (40 . 230.17) (70 . 1))

а (dictnext newdic) Возвращает ( (-1 . <Имя объекта: 4002ed58>)

(0 . "XRECORD") (5 . "2В") (102 . "{ACAD_REACTORS") (330 . <Имяобъекта: 4002ed68>) (102 . "}") (330 . <Имя объекта: 4002ed68>)(100 . "AcDbXrecord") (280 . 1) (1 . "Рыбный цех") (10 110.0 5267.2230.8) (11 -11.2 1234.6 429.0) (40 . 637.54) (70 . 0))

Таким образом, в словаре ПОМЕЩЕНИЯ имеются два объекта. Как использоватьэту информацию, зависит от прикладного программного обеспечения.

2.16. Разработка функций пользователяПользователь может создавать свои функции и применять их параллельносо встроенными. Этой цели служат функция AutoLISP lambda, используемаядля описания безымянных одноразовых функций, и defun, используемая дляопределения новых именованных функций. Обе функции являются тради-ционными инструментами разработки функций пользователя в системеAutoCAD. Примеры пользовательских функций различного назначения сподробными комментариями и описаниями переменных приведены в при-ложениях 6—14.

Не рекомендуется в качестве имен своих функций брать зарезервированныеимена, т. к. это приведет к некорректной работе отдельных команд системыAutoCAD. Для того чтобы получить полный перечень зарезервированныхСИМВОЛОВ AutoLISP, МОЖНО Воспользоваться функцией atoms-family (см.разд. 2.16.16).

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

Page 189: Visual LISP и секреты адаптации AutoCAD

188 Visual LISP и секреты адаптации AutoCAD

2.16.1. Функция lambdaФункция lambda позволяет создавать безымянные пользовательские функ-ции (одноразового применения), которые можно определить и тут же вы-полнить в любом месте программы с нужными значениями аргументов. Такиефункции нужны, например, когда некоторые выражения являются элемен-тами сложных формул одноразового использования. Тогда эти выраженияоформляются в качестве аргументов, а формулы — в качестве описания

функции lambda.

Формат функции:

(lambda <аргументы> <выражения>)

Параметр <аргументы> является списком временных переменных, а параметр<выражения> — любой последовательностью выражений, оперирующих вы-бранными временными переменными.

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

Обращение к описанной в программе функции lambda осуществляется с по-мощью функций apply или mapcar. Поясним на примерах.

Выражение (lambda (u v w) (abs (+ и (* 2 v) (* з w)))) является описа-нием безымянной функции, вычисляющей абсолютную величину суммыu+2*v+3*w, где u, v и w — имена временных переменных, выбранных для обо-значения аргументов (действие переменных не распространяется за пределыфункции lambda). Для использования созданной таким образом одноразовойфункции можно в программе вставить, например, текст:

° -(apply ' (lambda (u v w) (abs (+ u (* 2 v) (* 3 w) ) ) ) ' (4 . 7 - 3 . 2 10.5) )

результатом которого будет 29.8. При вычислении AutoLISP подставитвместо u, v и w, соответственно, 4.7, -3.2 и ю . 5 и вычислит выражение (abs

( + 4 . 7 ( * 2 - 3 . 2 ) ( * 3 1 0 . 5 ) ) ) .

Второй пример:D ( m a p c a r ' ( l a m b d a (q) (+ 1.0 q (* q q) (* q q q) ) )

( l i s t 1.7 2 . 2 5 . 8 3 . 0 ) ) ВОЗВращаеТ ( 1 0 . 5 0 3 1 8 . 6 8 8 2 3 5 . 5 5 2 4 0 . 0 )

Здесь функция, вычисляющая выражение l + q + q 2 + q 3 , поочередно применя-ется к каждому из элементов списка ( l i s t 1.7 2.2 5.8 3.0).

2.16.2. Функция defunДля создания функций пользователя предназначена специальная функция

defun:

(defun <имя> ([<аргументы>]' [/ <рабочие>]) <выражения>)

Page 190: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 189_

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

Аргументы: <имя> — символ, используемый в качестве имени новой функ-ции; <аргументы> - символы, разделяемые пробелами и используемые в ка-честве аргументов новой функции; <рабочие> — символы, разделяемые про-белами, которые используются в качестве временных (рабочих) переменныхновой функции; <выражения> — любая последовательность выражений, ис-пользующих как аргументы и рабочие переменные, так и другие функции иглобальные переменные.

Возвращаемым значением самой функции defun является символ, указан-ный в качестве первого аргумента.

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

Пример:

(defun oursum (al а2 аЗ / s)

(setq s (+ al a2))

(- s a3)

); конец тела функции oursum

Здесь определена новая функция с именем oursum. У функции три аргумента(al, а2 и аЗ) и одна локальная переменная (s). Переменная s используетсядля временного хранения результата операции суммирования. В теле функ-ции всего два выражения: первое вычисляет сумму al и а2 и сохраняет ее впеременной s, а второе рассчитывает разность между s и аз. Вычисленнаяразность представляет собой значение последнего выражения в теле функ-ции, поэтому является и возвращаемым значением функции oursum. Какаргументы al, а2 и аЗ, так и переменная s называются локальными перемен-ными, т. е. их значения не являются глобальными и не доступны вне телафункции.

Для того чтобы функцией oursum можно было воспользоваться в текущемрисунке AutoCAD, необходимо либо ввести ее описание в командной строкеAutoCAD (что чаще всего довольно трудоемко), либо предварительно сохра-нить описание в текстовом файле с расширением lsp (например,ourfunctions.lsp) и затем загрузить этот файл с помощью функции load:

(load "ourfunctions.lsp")

Имя загружаемого файла с расширением lsp может содержать и путь. Приотсутствии такого пути AutoCAD ищет файл в путях доступа к файлам под-

Page 191: Visual LISP и секреты адаптации AutoCAD

190 Visual LISP и секреты адаптации AutoCAD

держки, заданных в настройке (см. разд. 1.3). После того как файл, содер-жащий тело функции oursum, загружен, можно обратиться к функции в лю-бое время текущего сеанса редактирования и в любом месте программы, за-дав значения ее трех аргументов, например:

(setq newvall (oursum 55.02 (sqrt 0.933) -2.64))

Разумеется, при обращении к функции oursum в качестве аргументов могутбыть использованы любые выражения, результатами вычисления которыхбудут значения необходимого типа (в данном примере — это три вещест-венных числа).

(~ Замечание )Файл с расширением Isp не обязан содержать только тело одной функции.В нем могут присутствовать тела других функций или исполняемые выражения.

Загрузить файл с LISP-программами можно и с помощью диалогового окнаЗагрузка/выгрузка приложений (Load/Unload Applications), рассматриваемогов разд. 3.4.4.

Вспомним пример программы работы с примитивами рисунка, приведен-ный в листинге 2.13 разд. 2.12.23. Теперь эту программу можно оформить вкачестве функции с наименованием rci (листинг 2.14).

! Листинг 2.14. Пример функции r d , работающей с примитивами рисунка \

(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 cirllst (entget (ssname nab_cir i)))

(setq radcir (cdr (assoc 40 cirlist)))

(setq cencir (cdr (assoc 10 cirlist)))

Page 192: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 1_91_

; Добавление радиуса и точки центра к спискам list_rad и list_cen

(setq list_rad (append list_rad (list radcir)))

(setq list_cen (append list_cen (list cencir)))

) ; конец repeat

; Печать результирующих списков

(princ "\пРадиусы: ")

(princ list_rad)

(princ "ХпЦентры: ")

(princ list_cen)

); конец progn

); конец if

); конец defun

Программа оформлена в виде пользовательской функции rci. Функцию rciследует сохранить (например, в файле rcl.lsp), после чего ее можно загрузитьв память:

(load "rcl.lsp")

Возможно, что при загрузке файла rcl.lsp перед его именем придется доба-вить полный путь к месту его расположения. Если файл загрузился безошибок, то система AutoCAD возвращает RCL — имя последней загруженнойфункции, переведенное в верхний регистр. Теперь остается только обра-титься к ней в командной строке:

(rcl)

Возможный вид результата работы функции rci:

Радиусы: (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))

В данном примере все использованные в функции rci переменные былиглобальными, что позволит воспользоваться их значениями другим про-граммам. Однако нетрудно заметить, что по окончании работы функции rciполезными являются только переменные l i s t rad и iist_cen. Остальныепеременные хранят промежуточные результаты и, скорее всего, уже большене нужны. Для аккуратности следует либо всем ненужным переменным вконце работы программы присвоить значение nil, либо включить их именав список рабочих переменных функции rcl, например:

(defun rcl ( / nab_cir i nab_len radcir cencir cirlist) ...

После того как ваша функция загружена в оперативную память, она вносит-ся в список символов AutoLISP данного сеанса редактирования системыAutoCAD. Поэтому значение этого символа можно прочитать с помощьюоперации ! (восклицательный знак):

° ircl возвращает #<SUBR @0id6fib8 RCL> (конкретные цифры функции,естественно, могут у вас быть другими)

Page 193: Visual LISP и секреты адаптации AutoCAD

192 Visual LISP и секреты адаптации AutoCAD

В предыдущих версиях системы AutoCAD при использовании операции !(восклицательный знак) возвращался список с телом функции.

2.16.3. Создание дополнительных командсистемы AutoCAD с помощьюпользовательских функцийОсобое значение имеют пользовательские функции, имена которых содер-жат префикс с:, а сами функции не имеют аргументов. Такие функции нетолько являются функциями, к которым можно обратиться из программы наязыке AutoLISP, но они еще и определяют новые команды системы AutoCAD(имя команды получается из имени функции отбрасыванием префикса).

Пример создания команды PRITENT приведен в листинге 2.15.

I Листинг 2.15. Пример создания команды PRITENT системы AutoCAD \

(defun c:pritent ( / wn)

(setq wn (entsel "ХпУкажите объект для определения его типа: "))

{if (null wn)

(princ "Объект не выбран. ")

(progn

(princ "Тип объекта: ")

(princ (cdr (assoc 0 (entget (car wn)))))

);prong

) ;if

(princ); тихий выход

)/defun c:pritent

После загрузки такая функция работает не только как функция, к которойможно обратиться с помощью выражения (c:pritent), но и как командаAutoCAD с именем PRITENT, которое можно вводить в командной строке.На рис. 2.9 приведен пример работы только что созданной команды.

О выводе имен функций, формирующих дополнительные команды системыAutoCAD CM. функцию vl-list-exported-functions (разд. 2.17.18).

2.16.4. Функция defun-qСоздает определение пользовательской функции аналогично функции defun,но при вызове значения символа с именем функции возвращается списокс ее телом.

(defun-q <имя> ([<аргументы>] [/ <рабочие>]) <выражения>)

Аргументы — те же, что "и у функции defun.

Page 194: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 193

ШAutoCAD 2000 - НЕ ДЛЯ ПЕРЕПРОДАЖИ [1)ы«1пд1]^ З айл Правка £иа Вставка Формат Сервис Еисование Размеры Редакт

Q

Сфав^а

P-|D|x,

Iкоманда p r i t e n tо5ъект для определения его типа Тип оБъекта LWPOI.YLIHE

;онандэL 1335283-00000

AJ АШАГ СЕТКА ОРТО' ОТС-ПОЛЯР (ПРИВЯЗКА 0ТС-Г1РHBi ВЕС,|МОДЕС

РИС. 2.9. Пример работы новой команды системы AutoCAD, созданной пользователем

Возвращаемым значением самой функции defun-q является символ, указан-ный в качестве первого аргумента.

Функция defun-q введена как временный инструмент для совместимостис предыдущими версиями системы AutoCAD и в следующих версиях можетне поддерживаться.

Рассмотрим отличия между функциями defun и defun-q на примере пользо-вательской функции oursum, приведенной в разд. 2.16.2. Создадим аналогич-ную фуНКЦИЮ oursumq, НО С ПОМОЩЬЮ defun-q!

(defun-q oursumq (al a2 аЗ / s) (setq s (+ al a2)) (- s a3))

Если загрузить обе функции — oursum и oursumq — в память с помощьюфункции load, то обе функции будут работать одинаково:

° (oursum 15 18 б) возвращает 27

° (oursumq 15 18 б) возвращает 27

Однако если посмотреть значения символов oursum и oursumq, то получимразные результаты:

° !oursum возвращает #<SUBR @oid6fcdo OURSUM> (имя указателя функции)

° ! oursumq Возвращает СПИСОК ( (Al A2 A3 / S) (SETQ S (+ Al A2)) (- S A3))

7 Зак. 155

Page 195: Visual LISP и секреты адаптации AutoCAD

194 Visual LISP и секреты адаптации AutoCAD

В последнем списке видим тело функции, без ее имени. Первый элементсписка является списком символов аргументов и символов рабочих пере-менных, а остальные элементы списка — исполняемые выражения, состав-ляющие суть функции. К этому списку можно обращаться как к обычномусписку:0 (car oursumq) Возвращает (Al А2 A3 / S)

D (cdr oursumq) ВОЗВрЭЩаеТ ( (SETQ S (+ Al A2)) (- S A3))

Поэтому можно вносить изменения в тело функции oursumq с помощьюоперации изменения списка. Можно создавать новые функции, используятело функции oursumq как основу, например:

° (setq oursumql (list (car oursumq) (cadr oursumq) ' (* s a3))) ВОЗВра-

ЩЭет ( (Al A2 A3 / S) (SETQ S (+ Al A2)) (* S A3))

Таким образом, мы создали и загрузили новую функцию oursumqi, котораяотличается от oursumq тем, что последняя операция вычитания (- s A3) за-менена в ней на операцию умножения (* s A3). Поэтому выражение(oursumqi 15 18 6) возвращает уже 198, а не 27.

2.16.5. Функция defun-q-list-refПолучает список тела функции, ранее созданной с помощью defun-q (фак-тически выполняет операцию, аналогичную восклицательному знаку в ко-мандной строке).

(defun-q-list-ref '<функция~^>)

Аргумент — символ с именем функции, созданной с помощью функцииdefun-q.

Возвращаемое значение — список с телом функции. Возвращается ml, еслив качестве аргумента подано либо не имя функции, либо имя функции, соз-данной Не С ПОМОЩЬЮ фуНКЦИИ defun-q.

Примеры (продолжение примеров из разд. 2.16.4):

° (defun-q-list-ref 'oursumqi) возвращает ( (Al A2 A3 / S)(SETQ S (+ Al A2)) (* S A3))

° (defun-q-list-ref 'oursumq) Возвращает ( (Al A2 A3 / S)(SETQ S (+ Al A2)) (- S A3))

D (defun-q-list-ref 'oursum) Возвращает nil

2.16.6. Функция defun-q-list-setСоздает функцию из списка по методу, аналогичному методу функцииdefun-q.

(defun-q-list-set ' <функция^> <список>)

Page 196: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 7£5_

Аргументы: <функция^> — символ, используемый в качестве имени созда-ваемой функции; <список> — список с телом функции (как правило, его то-же нужно предварять апострофом, чтобы он не вычислялся раньше времени).

Возвращаемое значение — символ с именем создаваемой функции.

Пример:

° (defun-q-list-set 'yourf ' ( (w) (sin (+ w w) ) ) ) создает фуНКЦИЮ И ВОЗ-врашает YOURF

2.16.7. Функция functionСообщает компилятору Visual LISP (о компиляции программ и приложенийсм. описание функции viisp-compile и главу 3) о необходимости связыванияи оптимизации функции, имя которой указано в качестве первого аргумен-та, или оптимизации выражения с функцией lambda, использованного в ка-честве значения последнего аргумента (обычные безымянные пользователь-ские функции, создаваемые с помощью функции lambda, не участвуют в оп-тимизации исполняемого кода программы).

(function <параметр>)

Аргумент <параметр> — символ, используемый в качестве имени функции,или выражение, начинающееся с функции lambda.

Пример:

° (function (lambda (g) (sqrt (+ g 56.9)))) Возвращает (quote #<SUBR@01e27ed8 -lambda->)

2.16.8. Функция vlisp-compileПользовательские файлы с LISP-программами можно компилировать. Дляэтого предназначена специальная функция viisp-compile:

(vlisp-compile '<режим> <имя1> [<имя2>])

Функция имеет следующие аргументы:

• <режим> — наименование режима компиляции; может принимать значе-ния st (стандартный), ism (оптимизация и непрямое связывание) или isa(оптимизация и прямое связывание); аргументу должен обязательнопредшествовать апостроф;

• <имя1> — имя компилируемого файла с расширением lsp;

• <имя2> — имя выходного файла с расширением fas.

Обычное значение параметра <режим> — st. При необходимости оптимизи-ровать исполняемый код можно воспользоваться другими вариантами.

В результате компиляции образуется файл с расширением fas, на загрузкукоторого требуется меньше времени, чем на загрузку файла с исходным ко-

Page 197: Visual LISP и секреты адаптации AutoCAD

196 Visual LISP и секреты адаптации AutoCAD

дом (с расширением lsp), поэтому для отлаженных программ использованиеfas-файлов предпочтительнее. Для загрузки компилированных файлов такжеПрименяется фуНКЦИЯ load.

Если аргумент <имя2> не задан, то имя компилированного файла получаетсяиз имени компилируемого файла отбрасыванием расширения lsp и добавле-нием расширения fas.

Возвращаемое значение — т, если компиляция закончилась успешно, иnil,— при ошибке.

ЗамечаниеФункция компиляции работает при загруженной среде разработки приложенийVisual LISP (см. главу 3).

2.16.9. Функция exitВызывает принудительный выход из программы (приложения).

(exit)

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

; ошибка: завершить / выйти прервать

(; error: quit / exit abort)

2.16.10. Функция quitТак же, как и предыдущая функция, вызывает принудительный выход изпрограммы (приложения).

(quit)

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

; ошибка: завершить / выйти прервать

(; error: quit / exit abort)

2.16.11. Функция *error*Функция, которая в сбойных ситуациях получает от системы AutoCADстроку с некоторым сообщением и обрабатывает его (обычно выводит разъ-ясняющее сообщение).

(*error* <сообщение>)

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

Page 198: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 197_

тем, как дать свое содержание функции *error*, запомнить ее предыдущеесостояние (для последующего восстановления).

Аргумент — текстовая строка.

Возвращаемого значения нет (кроме особых случаев — см. описание функ-ции vi-exit-with-value). В теле функции *error* должна присутствоватькакая-либо операция вывода сообщения на экран.

Пример:п (setq oiderror *error*) запоминает в переменной olderror предыдущее

состояние функции *error* и возвращает #<SUBR @oidl53fc *ERROR*>

(defun *error* (msg) (princ "ХпОшибка: ")

(if

(or

(= msg "завершить / выйти прервать")

(= msg "quit / exit abort")

); or

(princ "принудительный выход из приложения ")

(princ msg)

); if

(princ)

); defun

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

"Ошибка: принудительный выход из приложения "

Затем можно восстановить предыдущее состояние функции *error*:

(setq *error* olderror)

См. также функции vl-exit-with-error, vl-exit-with-value, vl-catch-all-apply, vl-catch-all-error-message И vl-catch-all-error-p.

2.16.12. Функция vl-acad-defunДелает функцию с именем, имеющим префикс с:, доступной приложениямObjectARX.

(vl-acad-defun '<функция>)

Аргумент — имя функции на языке AutoLISP.

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

Пример:

° (vi-acad~defun ! c:pritent) дает возможность приложениям, написаннымс помощью ObjectARX, обращаться к функции с: pritent

Page 199: Visual LISP и секреты адаптации AutoCAD

198 Visual LISP и секреты адаптации AutoCAD

2.16.13. Функция vl-acad-undefunФункция, выполняющая обратное, по отношению к функции vi-acad-defun,действие.

(vl-acad-undefun '<функция>)

Аргумент — имя функции на языке AutoLISP.

Возвращаемое значение— т, если операция выполнена успешно, и n i l —при ошибке (например, если имя функции указано неверно).

Пример:

° {vi-acad-undefun rc:pritent) не дает возможность приложениям, напи-санным с помощью ObjectARX, обращаться к функции crpritent

2.16.14. Функция vl-exit-with-errorПозволяет VLX-приложению, работающему в собственном пространствеимен, вызывать для обработки ошибок функцию *error* и передаватьуправление командной строке.

(vl-exit-with-error <сообщение"')

Аргумент — текстовая строка.

Возвращаемого значения нет.

Обращение к функции vl-exit-with-error должно быть включено в переоп-ределение функции "error*, например:

(defun *error* (msg) (princ "Нарушение нормальной работы. ")

(vl-exit-with-error (strcat "Приложение блокировано: " msg))

); defun *error*

Тогда в случае сбоя работы VLX-приложения управление будет передано впользовательскую функцию обработки ошибок с генерацией соответствую-щего сообщения.

2.16.15. Функция vl-exit-with-valueПозволяет VLX-приложению в случае сбойной ситуации вернуть в другоепространство имен то же значение, что было передано фунции vi-exit-with-vaiue в качестве ее аргумента.

(vl-exit-with~vaJue <значение>)

Аргумент — любое значение (чаще всего — целое число). Это же значениестановится возвращаемым значением функции и VLX-приложения в случаепередачи управления программе обработки ошибок.

Page 200: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 199

Пример:° (defun *error* (msg) (princ "Нарушение нормальной работы. ")

(vl-exit-with-value 517))

В случае сбоя VLX-приложение вернет значение 517.

2.16.16. Функция atoms-familyПри создании своих функций не рекомендуется в качестве имен функцийвыбирать зарезервированные имена, т. к. это приведет к некорректной рабо-те отдельных команд системы AutoCAD. Для того чтобы получить полныйперечень зарезервированных символов AutoLISP, можно воспользоватьсяфункцией atoms-family, имеющей следующий синтаксис:

(atoms-family <форма> [<список>])

Аргументы: <форма> — целое число, может принимать только значения 0 или 1;<список> — список из текстовых строк (имен, проверяемых на резервирова-ние).

Возвращаемое значение — список зарезервированных имен символовAutoLISP. Если значение аргумента <форма> равно 0, то элементами возвра-щаемого списка будут символы, а если 1 — то строки. Если аргумент<список> не задан, то возвращается полный список зарезервированных сим-волов, если задан — то возвращается та часть аргумента <список>, котораясодержит зарезервированные имена.

Пример:

° (acad_strisort (atoms-family l)) возвратит список зарезервированныхсимволов, который будет тут же с помощью функции acad_strisort от-сортирован по алфавиту

2.16.17. Функция traceТрассирует значения заданных функций.

(trace [<функция1> [<функция2> . . . [<функция!\|>] ... ] ] )

Аргументы — символы с именами функций.

Возвращаемое значение — имя функции, заданной в качестве последнегоаргумента функции. Если аргументы не заданы, то возвращается nil.

Если загружена среда Visual LISP, то значения трассируемых функций вы-водятся в диалоговое окно Трассировка (Trace) (см. разд. 3.4.1). Если средаVisual LISP не загружена, тогда значения трассируемых функций выводятсяв командную строку системы AutoCAD.

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

Page 201: Visual LISP и секреты адаптации AutoCAD

200 Visual LISP и секреты адаптации AutoCAD

Пример (на базе функции oursum из разд. 2.16.2):а (trace oursum) ВОЗВращаеТ OURSUM

Ввод выражения (oursum l б 78) возвратит следующие строки (приводятсяварианты русской и английской версий системы AutoCAD):

Ввод (OURSUM 1 6 78)(Entering (OURSUM 1 6 78))

Результат: -71(Result:-71)

-71

Если функция oursum будет использована во вводимых выражениях большееколичество раз, то оформление трассировки будет похожим, например:D ( + ( o u r s u m 1 5 3 0 ) ( o u r s u m 2 5 6 4 ) ( o u r s u m 0 1 2 ) ) в о з в р а т и т В р у с с к о й

версии такие строки:

Ввод (OURSUM 15 3 0)Результат: 18Ввод (OURSUM 2 56 4)Результат: 54Ввод (OURSUM 012)Результат: -171

2.16.18. Функция untraceОтменяет трассировку заданных функций (см. функцию trace).

(untrace [<функция1> [<функция2> ... [<функцияЫ>] ... ]])

Аргументы — символы с именами функций.

Возвращаемое значение — имя функции, заданной в качестве последнегоаргумента функции. Если аргументы Не заданы, то возвращается nil.

Пример:

° (untrace oursum) возвращает O U R S U M

2.17. Функции работы с памятью,приложениями и реестром WindowsДалее описываются различные функции, выполняющие системные опера-ции (в основном со средой, в которой функционируют разрабатываемыеприложения). При знакомстве с функциями разд. 2.17 могут понадобиться

Page 202: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 201

некоторые сведения об ARX-приложениях (на языке C++) и VLX-прило-жениях. Вопросы разработки ARX-приложений в настоящей книге не за-трагиваются. О создании VLX-приложений см. разд. 3.4.3.

В конце разд. 2.17 освещаются вопросы работы с переменными и функ-циями пользователя, именными пространствами и многодокументным ре-жимом.

2.17.1. Функция verВозвращает строку с наименованием версии языка AutoLISP.

(ver)

Пример (в русской и английской версиях системы AutoCAD дает одинако-вый результат):

° (ver) возвращает "Visual LISP 2000 (en)

2.17.2. Функция memВыводит статистику распределения странично организованной памяти иопераций сборки мусора (см. функцию дс).

(mem)

Возвращаемое значение — nil.

Пример:

° (mem) ВЫВОДИТ:

; GC calls: 11; GC run time: 36 ms

Dynamic memory segments statistic:

PgSz Used Free FMCL Segs Type

512256

4096

32

4096

4096

128

Segment

nil

14431

51

749

33

90

3

si

113334

9

1234

72

0

508

93151

9

1234

14

0

508

ze: 65536, total

13

4

1

7

6

1

lisp stacksbytecode area

CONS memory

: :new

DM Str

DMxx memory

bstack body

used: 23, free: 2

2.17.3. Функция allocУстанавливает размер сегмента для последующего вызова функции expand.

(alloc <размер>)

Page 203: Visual LISP и секреты адаптации AutoCAD

202 Visual LISP и секреты адаптации AutoCAD

Аргумент — целое число (количество размещаемых в сегменте символов,строк, функций, вещественных чисел и т. д.).

Возвращаемое значение — целое число (предыдущее значение размера сег-мента).

Пример:

° (aiioc 120) возвращает 256

2.17А. Функция expandОтводит в памяти дополнительное количество сегментов для работыAutoLISP (размер сегмента устанавливается функцией alioc).

(expand <количество>)

Аргумент — положительное целое число.

Возвращаемое значение — целое число (размер дополнительно отведеннойпамяти для хранения данных AutoLISP).

Пример:

° (aiioc loo) возвращает юоо

(expand 2) возвращает 82

Это означает, что AutoLISP получает дополнительно место для размещенияв памяти 200 символов (строк, функций, вещественных чисел) или 8200 то-чечных пар.

2.17.5. Функция дсВыполняет сборку мусора (освобождает память от неиспользуемых данных).

(дс)

Возвращаемое значение — nil.

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

2.17.6. Функция vl-registry-readЧитает данные параметра раздела реестра Windows.

(vl-registry-read <раздел> [<параметр>])

Аргументы — текстовые строки с именами раздела и параметра реестраWindows.

Page 204: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 203_

Возвращаемое значение — данные (значение) параметра из указанного раз-дела реестра. Если аргумент <параметр> не задан, то возвращаются значениявсех параметров данного раздела.

Примеры:D (vl-registry-read "HKEY_C'JRRENT_'JSER\\Control PaneiWColors"

"ButtonLight") Возвращает "223 223 223"

° (vl-registry-read "HKEY _CURRENT_USER\\SOFTWARE\\Autodesk\\AutoCAD

\\R15.0\\ACAD-l:419\\TSM" "ListColumnWidth") Возвращает" 9 6 , 6 4 , 5 6 , 4 8 , 7 2 , 2 4 0 "

2.17.7. Функция vhregistry-writeСоздает раздел реестра или записывает туда параметр и его значение.

(vl-registry-write <раздел> [<параметр> [<значение>]])

Все аргументы строковые: <раздел> — имя раздела реестра, <параметр> —имя параметра раздела, <значение> — значение, присваиваемое параметрус заданным именем.

Возвращается значение аргумента <значение>. При ошибке возвращается nil.

Данная функция не может записывать в разделы, начинающиеся сHKEYJJSERS ИЛИ HKEY_LOCAL_MACHINE.

Если значение аргумента <параметр> опущено или равно nil, то запись вы-полняется в параметр, действующий по умолчанию (его имя — пустая стро-ка). Если аргумент <значение> не задан, то в качестве значения записываетсяпустая строка.

Пример:n ( v l - r e g i s t r y - w r i t e "HKEY_CURRENT_USER\\New3" "" "1234567890") ВОЗВра-

щает "1234567890"

2.17.8. Функция vl-registry-deleteУдаляет параметр из раздела реестра или целый раздел.

(vl-registry-delete <раздел> [<параметр>])

Все аргументы строковые: <раздел> — имя раздела реестра, <параметр> —имя параметра раздела.

Возвращаемое значение — т, если удаление прошло успешно. При ошибкевозвращается nil.

Если аргумент <параметр> не задан или задан равным nil, то удаляются всепараметры из раздела с именем <раздел>.

Page 205: Visual LISP и секреты адаптации AutoCAD

204 Visual LISP и секреты адаптации AutoCAD

Пример:

° (v l-regis t ry-delete "HKEY_CURRENT_USER\\New3") ВОЗВращаеТ Т, еСЛИ уда-ление прошло успешно

2.17.9. Функция vl-registry-descendentsВыводит список подразделов данного раздела или список его параметров.

(vl-registry-descendents <раздел> [<признак>])

Аргументы: <раздел> — текстовая строка (имя раздела реестра); <признак> —любое значение или nil.

Если значение аргумента <признак> не задано или задано равным nil, то вы-водятся имена всех подразделов указанного раздела. В других случаях выво-дятся имена параметров, находящихся в данном разделе.

Возвращаемое значение — список из строковых значений или nil .

Примеры:

° (vl-registry-descendents "HKEY_LOCAL_MACHINE") возвращает (".DWF""Security" "Driver" "Config" "Network" "Hardware" "Enum" "System""Software")

° (vl-registry-descendents "HKEY_CURRENT_USER\\Control PanelWColors")

возвращает nil

° (vl-registry-descendents "HKEY_CURRENT_USER\\Control PanelWColors" "")

возвращает ("GradientlnactiveTitle" "GradientActiveTitle""HotTrackingColor" "ButtonAlternateFace" "InfoWindow" "InfoText""ButtonLight" "ButtonDkShadow" "ButtonHilight" "InactiveTitleText""ButtonText" "GrayText" "ButtonShadow" "ButtonFace" "Hi'lightText""Hilight" "AppWorkspace" "InactiveBorder" "ActiveBorder" "TitleText""WindowText" "MenuText" "WindowFrame" "Window" "Menu" "InactiveTitie""ActiveTitle" "Background" "Scrollbar")

2.17.10. Функция arxВыводит список всех загруженных в данный момент файлов с приложения-ми ObjectARX (ARX-приложениями).

(arx)

Возвращаемое значение — список из строковых величин.

Пример:

° (arx) возвращает ("acadapp.arx" "acdim.arx" "aceplotx.arx" "acetutil.arx""achapil5.dbx" "achlnkui.arx" "oleaprot.arx" "swfileconv.arx" "vl.arx")

Page 206: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 205

2.17.11. Функция arxloadЗагружает файл с ARX-приложениями. При сбое загрузки выполняет задан-ные операции.

(arx load <файл> [<сбсэй>])

Аргументы: <файл> — текстовая строка с именем загружаемого файла(расширение агх в имени файла может быть опущено); <сбой> — любое вы-ражение, которое будет вычислено (выполнено) при невозможности загруз-ки файла.

Возвращаемое значение — строка с именем файла, при успешной загрузке.При сбое загрузки возвращается результат вычисления выражения, задан-ного на случай ошибки в аргументе <сбой> (если аргумент <сбой> не был за-дан, то не возвращается ничего, но выводится стандартное сообщение обошибке).

Примеры:

° (arxload "geomcal.агх") возвращает "geomcal.arx"

° (arxload "noarx" (setq na -5)) возвращает -5, если приложениепоагх.агх не может быть загружено (при этом в результате выполнениявыражения, записанного в качестве второго аргумента, переменной паприсваивается -5)

2.17.12. Функция arxunloadВыгружает файл с ARX-приложениями. При сбое загрузки выполняет за-данные операции.

(arxunload <файл> [<сбой>])

Аргументы: <файл> — текстовая строка с именем выгружаемого файла(расширение агх в имени файла и путь могут быть опущены); <сбой> — лю-бое выражение, которое будет вычислено (выполнено) при невозможностивыгрузки файла.

Возвращаемое значение — строка с именем файла, при успешной выгрузке.При сбое выгрузки возвращается результат вычисления выражения, задан-ного на случай ошибки в аргументе <сбой>.

Примеры:

° (arxunload "geomcal.arx") Возвращает "geomcal.arx"

° (arxunload "noarx" (setq na 22)) возвращает 22, если файл поагх.агх неможет быть выгружен (при этом в результате выполнения выражения, за-писанного в качестве второго аргумента, переменной па присваива-ется 22)

Page 207: Visual LISP и секреты адаптации AutoCAD

206 Visual LISP и секреты адаптации AutoCAD

2.17.13. Функция autoloadЗадает имена команд, первое обращение к любой из которых требует загруз-ку файла приложения (с расширением Isp, fas или vlx).

(autoload <файл> <список>)

Аргументы: <файл> — текстовая строка, задающая имя файла приложения;<список> — список из текстовых строк с именами команд.

Возвращаемое значение — nil.

Как только пользователь в первый раз набирает имя команды, включенное всписок, фигурирующий в качестве второго аргумента функции autoload, такAutoCAD выполняет загрузку указанного файла (аналогично функции lead).В загружаемом файле должна быть обязательно описана функция с префик-сом с: и соответствующая вызываемой команде, иначе может произойтисбой системы (возможно зацикливание).

Пример:D (autoload "rad. fas" '("RAC" "RBC") возвращает n i l

Когда пользователь впервые введет команду RAC, то будет загружен файлrad.fas (загрузка заканчивается сообщением об инициализации) и затем ста-нет выполняться команда, например (в русской версии):

Инициализация...

На слое HOLES нет кругов.

Здесь первое сообщение — сообщение об инициализации (загрузке), вто-рое — уже сообщение исполняемой команды.

2.17.14. Функция autoarxloadЗадает имена команд, любая из которых при первом обращении требует за-грузку файла ARX-приложения.

(autoarxload <файл> <список>)

Аргументы: <файл> — текстовая строка, задающая имя файла приложенияObjectARX; <список> — список из текстовых строк с именами команд.

Возвращаемое значение — nil.

Данная функция аналогична функции autoload, но выполняет при необ-ходимости загрузку файла с расширением агх (как это делает функция

arxload).

Пример:D (autoarxload "rad.arx" '("RAC" "RBC") возвращает n i l

Page 208: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 207

2.17.15. Функция vl-arx-importПозволяет VLX-приложению, имеющему отдельное именное пространство(об отдельном именном пространстве см. разд. 2.17.25 и 3.4.3), импортиро-вать в свое пространство функцию (или функции) приложения ObjectARXили ADSRX.

(vl-arx-import [<приложение>])

Аргумент <пршюжение> — символ имени функции (с апострофом впереди)или текстовая строка с именем файла, содержащего одно или несколькоARX-приложений.

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

Примеры:

° (vl-arx-import ' cpritent)

D (vl-arx-import "pritent.arx")

2.17.16. Функция vl-doc-exportЭкспортирует в именное пространство документа (рисунка) функцию изимеющего отдельное именное пространство (об именных пространствах см.разд. 2.17.32 и 3.4.3) VLX-приложения, в котором данная функция описана.

(vl-doc-export '<функция>)

Без этой операции загружаемые в один документ VLX-приложения с от-дельными именными пространствами не могут пользоваться функциямидруг друга (см. функцию vi-doc-import), поскольку эти функции остаютсялокальными (доступными только внутри VLX-приложения).

Аргумент: символ с именем функции.

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

Пример:

° (vl-doc-export 'c:pritent) дает возможность другому VLX-приложениюс отдельным именным пространством импортировать к себе функциюс:pritent

Не следует использовать функцию vl-doc-export внутри функции defun идругих аналогичных средств (см. разд. 2.16.4—2.16.7) создания пользователь-ских функций.

2.17.17. Функция vl-doc-importИмпортирует из именного пространства документа в отдельное именноепространство текущего VLX-приложения заданные функции, ранее экспор-

Page 209: Visual LISP и секреты адаптации AutoCAD

208 Visual LISP и секреты адаптации AutoCAD

тированные другим VLX-приложением с отдельным именным пространст-вом (см. функцию vl-doc-export).

( v l - d o c - i m p o r t <приложеыие> [ '<функция1> [ ' < ф у н к ц и я 2 > ] . . .[ ' < ф у н к ц и я Ы > ] . . . ] ] )

Аргументы: <приложение> — текстовая строка с именем приложения(указывается без пути и без расширения vlx), из которого импортируютсяфункции; <функция1>, <функция2>, . . . , <функцияы> — символы с именами им-портируемых функций.

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

Пример:D (vl-doc-import "makedesign" 'c:pritent 'trlow) импортирует ИЗ VLX-

приложения makedesign.vlx в другое VLX-приложение функции c.-pritent,trlow

Не следует использовать функцию vl-doc-import внутри функции defun идругих аналогичных средств (см. разд. 2.16.4—2.16.7) создания пользователь-ских функций.

2.17.18. Функция vHist-exported-functionsВыводит список экспортированных функций.

(vl-list-exported-functions [<приложение>])

Аргумент — текстовая строка с именем приложения (путь и расширение vlxв строку не включаются).

Возвращаемое значение — список из текстовых строк с именами экспорти-рованных функций приложения, имя которого задано в качестве значенияаргумента <приложение>. Возвращается nil, если не обнаружены экспортиро-ванные функции. Если аргумент <приложение> не задан или задан равнымnil, то возвращается список всех экспортированных (подгруженных) в те-кущий документ функций, кроме функций, экспортированных из VLX-приложений с отдельными именными пространствами.

Примеры:D (vi-iist-exported-functions) возвращает список всех экспортированных

функций, в который входят функции, определяющие дополнительныекоманды AutoCAD, не входящие в основное ядро системы: ("C:-LMAN""C:-LMANMODE" "С:-PACK" "С:-REDIRMODE" "C.--XLIST" "С: 3-ЗЕРКАЛО""С:3-МАССИВ" "С:3-ПОВЕРНУТЬ" "С:3D" "C:3DARRAY" "C:3M" "С:А1_ВОХ""C:AI_CIRCTAN" "C:AI_CONE" "C:AI_DIM_TEXTABOVE" "C:AI_DIM_TEXTCENTER""C:AI_DIM_TEXTHOME" "C:AI_DISH" "C:AI_DOME" "C:AI_FMS" "C:AI__MESH""C:AI_MOLC" "C:AI_PSPACE" "C:AI_PYRAMID" "C:AI_SPHERE""C:AI_TILEMODE1" "C:AI_TORUS" "C:AI_WEDGE" "C:ALIGN" "CrARCTEXT""C:ATEXT" "C:ATTREDEF" "C:BCOUNT" "C.-BEXTEND" "C:BLOCK?" "CrBTRIM""C:BURST" "C.-CAL" "C:CCONFIG" "C:CLIPIT" "C.-DATE" "C: DDEMODES"

Page 210: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 209_

"C:DDGRIPS" "C:DDPTYPE" "C:DDRMODES" "С:DDSELECT" "С:DDVPOINT""C:DIMEX" "C-.DIMIM" "C:DWFOUT" "C:EDGE" "C:EXC" "C:EXCP" "C-.EXF""C:EXP" "C:EXPRESS" "C:EXPRESSMENU" "C:EXPRESSTOOLS" "C:EXTRIM""C:EX'W" "C-.EXWP" " C : FILTER" " C : FULLSCREEN" "C:GATTE" "C:GETSEL""C-.GIFIN" "C:GOTOURL" "C:HPCONFIG" "C:LAYCUR" "C:LAYDEL" "C:LAYFRZ""C-.LAYISO" "C:IAYLCK" "C:LAYMCH" "C:LAYMRG" " C : LAYOFF" "C:IAYON""C-.1AYTHW" "C:LAYULK" "C:LMAN" " С : LMANMODE" " C : L S P " "C:MIRROR3D""C:MKLTYPE" "C-.MKSHAPE" "C:MOCORO" "C:MPEDIT" "C:MSTRETCH" "C:MVSETUP""C:NCOPY" "C:OCECO1SIFIG" "C:PACK" "C:PCXIN" " C : P L J O I N " " C : PLJOINMODE""C:QLATTACH" "C:QLATTACHSET" "C:QLDETACHSET" "C:REDIR" "C-.REDIRMODE""C:REVCLOUD" "C:ROTATE3D" "C:RTEDIT" "C:RTEXT" "C:RTEXTAPP""C:SCR-DXFOUT-2000" "C:SCR-DXFOUT-R12" "C:SCR-DXFOUT-R13""C:SCR-DXFOUT-R14" "C:SCR-SAVEAS-2000" "C:SCR-SAVEAS-R13""C:SCR-SAVEAS-R14" "C:SCRIPTPRO" "C:SHOWURLS" " C : S P S C R I P T " "C:SSX""C:SUPERHATCH" "C:TEXTFIT" "C:TEXTMASK" "C:TEXTUNMASK" "C:TFRAMES"" C : T I F F I N " "C:TUTCLEAR" "C-.TUTDEMO" "C:TXT2MTXT" "C:TXTEXP" " C : V L I S P ""C:WIPEOOT" "C:XDATA" "C:XDLIST" " C : X L I S T " "C:XPLODE" " C : _ 3 D ""C:_3DARRAY" "C:_ATTREDEF" "C:_DDPTYPE" "C:_DDVPOINT" "C:_EDGE"" C : _ F I L T E R " "C:_MVSETUP" "C:_XPLODE" "С:ВЗОРВАТЬ" "С-.ВЫРОВНЯТЬ""С:ДИАЛТЗРЕН" "С:ДИАЛТТОЧ" "С:КАЛЬК" "С:КРОМКА" "С:ПЕРЕАТР""С-.ФИЛЬТР" "С:ФОРМАТЛ")

D (vl-list-exported-functions "pritent") возвращает ("С:PRITENT")

Первый пример показывает, каким образом можно получить список всехдополнительно описанных команд, которые были подгружены к основномуядру системы AutoCAD (сюда входят, например, такие важные команды, какЗМ (3D), VLISP, ФОРМАТЛ (MVSETUP), EXPRESSTOOLS, а также коман-ды, созданные и загруженные в сеансе редактирования пользователем).

2.17.19. Функция vl-list-loaded-vlxВыводит список всех VLX-приложений, имеющих в текущем документе от-дельные именные пространства.

(vl-list-loaded-vlx)

Возвращаемое значение — список из символов, являющихся именамифункций. При отсутствии в текущем рисунке загруженных VLX-приложе-ний с собственными именными пространствами возвращается nil.

Пример:

° (vi-iist-ioaded-vix) может вернуть (PRITENT), если в текущий рисунокбыло загружено одно имеющее отдельное именное пространство VLX-при-ложение pritent.vlx

2.17.20. Функция vl-vlx-loaded-pПроверяет, загружено ли VLX-приложение, имеющее собственное именноепространство.

(vl-vix-loaded-p <приложение>)

Page 211: Visual LISP и секреты адаптации AutoCAD

210 Visual LISP и секреты адаптации AutoCAD

Аргумент — текстовая строка с именем приложения (путь и расширение vlxв строку не включаются).

Возвращаемое значение — т, если анализируемое приложение с отдельнымименным пространством загружено, и nil — в других случаях.

Рассмотрим пример. Предположим, в текущий документ загружено прило-жение pritent.vlx. Тогда:

° (vi-vix-loaded-p "pritent") возвратит т, если приложение pritent.vlx бы-ло собрано как приложение с собственным именным пространством, иnil, если pritent.vlx не имеет собственного именного пространства (в этомслучае его функции и переменные загружаются в именное пространстворисунка).

2.17.21. Функция vl-unload-vlxВыгружает VLX-приложение, имеющее собственное именное пространство.

(vl-unload-vlx <приложемие>)

Аргумент — текстовая строка с именем приложения (путь и расширение vlxв строку не включаются).

Возвращаемое значение — т, если функции vl-unload-vlx удалось выгрузитьуказанное приложение с отдельным именным пространством. В случае сбоявыгрузки возвращаемое значение отсутствует, и выводится сообщение обошибке.

Пример:

° (vi-unioad-vix "pritent") возвращает т

Если произошла ошибка (приложение не загружено или загружено, но не ссобственным именным пространством), то выдается следующее сообщение:

; ошибка: LISP-приложение не найдено pritent(; error: LISP Application is not found pritent)

2.17.22. Функция vl-get-resourceВыводит содержимое текстового файла, включенного в сборку VLX-прило-жения.

(vl-get-resource <файл">)

Аргумент — текстовая строка с именем текстового файла, включенного вприложение (расширение txt указывать не надо).

Возвращаемое значение — текстовая строка с содержимым файла, включен-ного в VLX-приложение.

Page 212: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 211

Пример:

° (vi-get-resource "girls") может внутри работающего VLX-приложениявернуть строку (строки):"Три девицы под окном\пПряли поздно вечерком."

2.17.23. Функция vl-vbaloadЗагружает DVB-приложение.

(vl-vbaload <файл>)

Аргумент — текстовая строка с именем DVB-приложения (приложения наязыке Visual Basic for Applications).

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

Пример (файл drawline.dvb должен быть в вашей версии AutoCAD 2000 впапке Sample\Vba):

° (vl-vbaload "d:\\AutoCAD2000\\Sample\\Vba\\drawline.dvb") возвращает

ni l (в данном случае это не является признаком ошибки)

2.17.24. Функция vl-vbarunВыполняет макрос VBA, загруженный в текущий рисунок.(vl-vbarun <макрос>)

Аргумент — текстовая строка с именем макроса, загруженного в документ.

Возвращаемое значение — текстовая строка с именем макроса.

Пример:

о (vl-vbaload "d:\\AutoCAD2000\\Sample\\Vba\\drawline.dvb") Возвращает n i l

(vl-vbarun "drawiine") вызывает диалоговое окно AutoCAD VBA LineSample, приведенное на рис. 2.10.

В этом диалоговом окне щелчок по кнопке Draw Line выполняет рисованиеотрезка из точки (1,1,0) в точку (5,5,0), а щелчок по кнопке Done завершаетработу макроса и выводит "drawiine" в качестве возвращаемого значенияфункции vl-vbarun.

2.17.25. Функция vl-bb-setЗадает новое значение переменной из внедокументного именного пространства.

(vl-bb-set '<символ> <значение>)

Аргументы: <символ> — имя изменяемой переменной; <значение> — значе-ние, присваиваемое переменной (не может быть именем функции).

Возвращаемое значение функции — значение второго аргумента.

Page 213: Visual LISP и секреты адаптации AutoCAD

212 Visual LISP и секреты адаптации AutoCAD

Det Qf Q «f 5- if и

J l J i

Draws a'Lhe h AutoCAD from 1,1,0 to S,S,0

QoneJ

И \ Модель X Пнсг1 ^ Лист2 "hiКсманда tvl-vbaiun "drawline")

-VEARUH

4484832 295 7ЭЭ2.00000 ШАГ СЕТКА OPTO ОТС-ПОЛЯР [ПРИВЯЗКА ОТС-ПРИВ ВЕС[М0ДЕГ

Рис. 2.10. Диалоговое окно AutoCAD VBA Line Sample

Внедокументное пространство имен используется для передачи значениймежду документами (рисунками). Пример:

° (setq curnumber 19) возвращает 19 (значение переменной curnumber вименном пространстве текущего документа)

(vi-bb-set 'bbnmn curnmnber) возвращает 19 (значение переменной bbnumво внедокументном именном пространстве)

См. также функцию vi-bb-ref.

2.17.26. Функция vl-bb-refЧитает значение переменной из внедокументного именного пространства.

(vl-bb-ref '<символ>)

Аргумент — имя переменной (имя символа).

Возвращается значение прочитанной переменной. Если переменная с ука-занным именем во внедокументном именном пространстве не найдена, товозвращается nil.

Page 214: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 213_

Пример (продолжение примера из предыдущего раздела):

° (setq ournum (vi-bb-ref 'bbnum)) возвращает 19 (читает значение пере-менной bbnum из внедокументного именного пространства и присваиваетего переменной ournum в текущем документе)

2.17.27. Функция W-doc-sefИзменяет значение переменной в именном пространстве текущего докумен-та (рисунка).

(vl-doc-set '<символ> <значение>)

Аргументы: <символ> — имя переменной (символа) из пространства иментекущего рисунка; <значение> — любое значение.

Возвращается значение второго аргумента.

Эта функция может применяться внутри VLX-приложений, имеющих собст-венное именное пространство, для изменения значений глобальных пере-менных текущего документа. Если функция vl-doc-set используется внутриVLX-приложения без собственного именного пространства, то тогда ее дей-ствие аналогично действию функции set.

Пример:a (setq curiist '(l 2 3)) возвращает (1 2 3)

(vl-doc-set 'doclist curiist} возвращает (12 3)

См. также функцию vi-doc-ref.

2.17.28. Функция vl-doc-refЧитает значение переменной из именного пространства текущего документа(рисунка).

(vl-doc-ref '<символ>)

Аргумент <символ> — имя переменной (символа) из пространства имен те-кущего рисунка.

Возвращается значение прочитанной переменной из пространства имен те-кущего рисунка.

Эта функция позволяет YLX-приложениям со своим именным пространст-вом импортировать значения переменных из именного пространства теку-щего рисунка.

Пример (продолжение примера из предыдущего раздела):

о (setq I i s t2 (vl-doc-ref 'doclist}) возвращает (1 2 3)

ФуНКЦИЯ vl-doc-ref ЯВЛЯетСЯ обратной ПО ДеЙСТВИЮ ДЛЯ ФУНКЦИИ vl-doc-

set.

Page 215: Visual LISP и секреты адаптации AutoCAD

214 Visual LISP и секреты адаптации AutoCAD

2.17.29. Функция vl-load-allДанная функция уже была упомянута в разд. 2.2.5 в свете загрузки LSP-файлов. Вернемся к ней еще раз для более подробного рассмотрения.

(vl-load-a.ll <файл>)

Загружает файл с LISP-программами во все уже открытые документы иобеспечивает его автоматическую загрузку во все рисунки, которые будутоткрыты в данном сеансе редактирования в системе AutoCAD.

Аргумент — текстовая строка с именем загружаемого файла. Расширениефайла опускать нельзя. Если полный путь к файлу в аргументе не указан, тоAutoCAD пытается найти его сначала в рабочем каталоге, а затем в папках,указанных в путях поиска файлов поддержки, указанных в настройке систе-мы AutoCAD (см. разд. 1.3).

Возвращаемое значение не определено. В случае ошибки выводится сооб-щение о сбое загрузки.

Пример:

° {vi-ioad-aii "nofiie.vix") вызывает в случае сбоя сообщение:

; ошибка: сбой при выполнении LOAD: "nofile.vlx"(; error: LOAD failed: "nofile.vlx")

См. также использование файла acaddoc.lsp в разд. 2.19.

2.17.30. Функция vl-propagateКопирует значение переменной текущего документа во все другие открытыерисунки и обеспечивает копирование переменной во все рисунки, которыееще будут открыты в данном сеансе редактирования в системе AutoCAD.

(vl-propagate '<символ>)

Аргумент <символ> — имя переменной (символа) из пространства имен те-кущего рисунка.

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

Пример:

° (vi-propagate 'd od i i s t ) копирует значение глобальной переменнойdociiist из текущего рисунка в глобальные переменные d o d i i s t всехдругих рисунков (уже открытых или которые будут открыты в данном се-ансе редактирования)

Другой способ передачи значений переменных — использование функцийvi-bb-set и vi-bb-ref, работающих с внедокументным именным простран-ством.

Page 216: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 215_

2.17.31. Глобальные и локальные переменныеРассмотрим в данном разделе работу в одном документе (рисунке). Пере-менные, используемые в приложениях, загружаемых в данный документ,делятся на глобальные и локальные.

К локальным переменным относятся переменные, имена которых заданы приописании функций либо в перечне аргументов, либо в перечне рабочих пе-ременных (см. разд. 2.16.2, 2.16.4). Такие переменные существуют тольковнутри функции, в которой они определены, и их значения не передаютсянаружу.

Рассмотрим определение функции fkos, приведенное в листинге 2.16.

: Листинг 2.16. Пример функции, использующей-локальные переменные j

(defun fkos (rl ppl / pp2 vo)

(command "_CIRCLE" ppl rl)

(setq vo (entlast))

(initget 1)

(setq pp2 (getpoint "ХпЗадайте точку: "))

(command "__COPY" vo "" ppl pp2)

(princ "\Окружности построены. ")

(princ); тихий выход

); конец defun

В этой функции определены четыре локальные переменные: rl, ppl, pp2 иvo. Первые две из них являются аргументами функции, а две последние —рабочими переменными.

Функция fkos работает следующим образом. Сначала она строит окружностьв точке, указанной в качестве значения аргумента ppl, и радиусом, задан-ным в качестве значения аргумента rl. Имя примитива построенной окруж-ности запоминается в рабочей переменной vo.

Затем запрашивается ввод точки (пустое значение в качестве ответа на за-прос не допускается) и введенная точка (точнее, список с ее координатами)запоминается в переменной рр2, которая является рабочей. После этого сис-тема AutoCAD копирует первую окружность таким образом, что центр но-вой окружности оказывается в точке рр2.

Попробуйте загрузить функцию fkos в новый рисунок, когда в именном про-странстве документа (пространстве функций и переменных) еще нет вашихпользовательских символов, и выполнить ее — например, следующим образом:

( f k o s 5 5 . 0 ' ( 0 . 0 0 . 0 ) )

В результате работы функции fkos в рисунке будут построены две окружно-сти (одна — с центром в точке (0,0), а вторая — с центром в той точке, ко-

Page 217: Visual LISP и секреты адаптации AutoCAD

216 Visual LISP и секреты адаптации AutoCAD

торую вы укажете в ответ на запрос "Задайте точку: "). Радиус обеих ок-ружностей будет равен 55.

Если попробуем в командной строке AutoCAD прочитать значения пере-менных с помощью операции ! (восклицательный знак), то выясним, чтозначения всех локальных переменных (ri, ppi, pp2 и vo) равны nil(операции !r i , ippi, !pp2, !vo возвращают nil) — иначе говоря, все четырепеременные не определены. Связано это с тем, что значения локальных пе-ременных вне функции fkos вам не доступны. Таким образом, указанныепеременные не занимают память в пространстве имен рисунка, котороехранит значения всех символов (переменных и функций).

Остальные переменные, которые не являются локальными, считаются гло-бальными, и им отводится специальное место в именном пространстве доку-мента (рисунка). Отсюда вы можете читать их значения с помощью опера-ции !. Сейчас в именном пространстве рисунка есть уже один символ —fkos. Если вы прочитаете его значение, то получите примерно следующее:#<SUBR @01eeee9c FKOSX

Создадим в рисунке две глобальные переменные, введя с клавиатуры сле-дующее выражение:

(setq mainradius 17.89 mainpoint (list 60.345 12.107))

Поскольку указанное здесь выражение является изолированным, то оно неВХОДИТ В ТеЛО НИКаКОЙ фуНКЦИИ, И Переменные mainradius И mainpoint ЯВ-ЛЯЮТСЯ глобальными. Их значения можно прочитать:D Imainradius возвращает 17.89а !mainpoint возвращает (60.345 12.107)

Эти две переменные занимают свое место в именном пространстве докумен-та и могут в любое время использоваться пользователем или приложениями,не имеющими собственного пространства имен. Например, пользовательможет ввести:

(fkos (+ mainradius 1.1) mainpoint)

Это выражение выполнит функцию fkos и построит в текущем рисунке двеокружности с радиусом 18.99.

Изменим пример, приведенный в листинге 2.16, следующим образом (см.листинг 2.17).

Листинг 2.17. Пример функции, использующей локальные и глобальныепеременные

(defun fkosl (rl ppl / pp2)(command "_CIRCLE" ppl rl)(setq vo (entlast))

Page 218: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 217

(initget 1)(setq pp2 (getpoint "ХпЗадайте точку: "))

(command "_COPY" vo "" ppl pp2)

(princ "ХОкружности построены. ")

(princ); тихий выход

); конец defun

Функция fkosi отличается от функции fkos тем, что переменная vo переста-ла быть локальной. В таком случае она автоматически становится глобаль-ной. Если загрузить и выполнить функцию fkosi, то после выполне-ния можно будет прочитать значение переменной vo. Оно уже не будет рав-но nil:

!vo возвратит <Имя объекта: 4 002ed68>

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

Глобальные переменные удобны для использования в приложениях. Однакоизбыточное количество глобальных переменных отнимают место в памятирисунка. Освободить участок памяти, занимаемый в рисунке глобальнойпеременной, можно, присвоив этой переменной значение nil. При много-кратном освобождении памяти может быть полезна операция сборки мусора(см. функцию дс), которая дает возможность использовать эти участки дру-гим программам.

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

2.17.32. Именные пространстваИз предыдущего раздела видно, что в каждом документе (рисунке) есть об-ласть памяти (именное пространство), в котором располагаются символыдокумента, в число которых входят глобальные переменные и функции.Ими могут пользоваться все приложения, загружаемые в данный рисунок,кроме тех VLX-приложений, которые имеют собственное именное про-странство. Как собрать приложение, имеющее собственное именное про-странство, сказано в разд. 3.4.3.

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

Page 219: Visual LISP и секреты адаптации AutoCAD

218 Visual LISP и секреты адаптации AutoCAD

Однако для того, чтобы получить доступ к символам документа, VLX-при-ложение должно импортировать к себе (в свое именное пространство) необ-ходимые функции (см. функцию vi-doc-import) и значения переменных (см.ФУНКЦИЮ vl-doc-ref).

Если VLX-приложению с собственным именным пространством нужно пе-редать свои символы в именное пространство документа, то в приложениидолжны быть использованы функции vi-doc-export (экспортирует функцииприложения в именное пространство рисунка) и vi-doc-set (экспортируетзначения глобальных переменных).

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

2.17.33. Проблемы многодокументного режимаФактически, за небольшими исключениями, существующая версия языкаAutoLISP не поддерживает многодокументного режима. Пользователю пре-доставляется, в основном, возможность применять те многодокументныеоперации, которые имеются в самой системе AutoCAD (перетаскиваниеэлементов из рисунка в рисунок, диалоговое окно Центр управления Auto-CAD (AutoCAD Design Center) и т. п.).

Если ваше LISP-приложение, выполняемое в одном рисунке, захочет от-крыть другой рисунок с помощью команды ОТКРЫТЬ (OPEN), то ничегоне получится:

(command "_OPEN") вернет n i l ,

а попытка передать команде еще и имя файла:

(command "_OPEN" "Draw24") вызовет сообщение о неизвестной командеDraw24.

Во многих случаях может выручить передача управления в среду VBA, в ко-торой поддерживаются операции многодокументного режима. Например:

(command "VBASTMT" "AcadApplication.Documents.Open \"Draw24.dwg\"") yc-

пешно откроет рисунок Draw24, если он на самом деле существует. В дан-ном примере команда VBASTMT позволяет выполнить выражение на языкеVisual Basic for Applications.

Многодокументный режим в системе AutoCAD разрешается или не разреша-ется с помощью системной переменной SDI. Если переменная SDI имеетзначение I, то многодокументный режим запрещен. При таком значениисистемной переменной SDI попытка открыть следующий рисунок вызоветоперацию закрытия предыдущего открытого рисунка.

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

Page 220: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 219_

нужно установить для системной переменной SDI значение 0 (это значениеявляется значением, действующим по умолчанию).

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

Для облегчения процесса загрузки LISP-приложения (т. е. файла с расши-рением lsp, fas или vlx) во все документы можно применять функцию vi-load-all.

Если необходимо передать копию значения какой-то переменной во все ужеоткрытые рисунки, следует воспользоваться функцией vi-propagate. Она жепередаст значения указанных глобальных переменных в те документы(рисунки), которые будут в дальнейшем открыты в том же сеансе редакти-рования, В КОТОРОМ была ИСПОЛЬЗОВана фуНКЦИЯ vl-propagate.

Внедокументное именное пространство (blackboard) играет роль своеобраз-ного буфера и облегчает разрешение проблемы передачи значений глобаль-ных переменных. Если из какого-то рисунка с помощью функции vi-bb-setво внедокументное пространство имен передано значение какой-то пере-менной, то его можно будет прочитать из любого другого рисунка с помощьюФУНКЦИИ vl-bb-ref.

2.18. Другие функцииВ данном разделе рассматриваются еще несколько функций, имеющихпрактическую ценность при разработке приложений пользователя. Крометого, в главах 4— 7 будет рассмотрено большое количество функций для ра-боты с такими объектами, как меню, диалоговые окна, справочная система,а также функции, реализующие технологию ActiveX.

2.18.1. Функция osnapИзменяет указанную точку в соответствии с режимом объектной привязки.

(osnap <точка> <режим>)

Аргументы: <точка> — список с координатами двумерной или трехмернойточки в текущей системе координат; <режим> — текстовая строка с перечис-ляемыми через запятую (без пробелов) режимами одновременно действую-щих режимов ПРИВЯЗКИ ("_end", "_mid", "_int", "__nea", "_nod" И Т. Д.).

Возвращаемое значение — список из трех вещественных чисел (координатытрехмерной точки в текущей системе координат, уточненной с учетом за-данных режимов объектной привязки). Если точка определена неудачно и

Page 221: Visual LISP и секреты адаптации AutoCAD

220 Visual LISP и секреты адаптации AutoCAD

устройство указания в заданных условиях ничего не выбрало, то возвраща-ется nil.

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

Пример:

° (osnap '(16.32 4.782) • "_end,_mid") возвращает координаты трехмернойточки, уточненной с помощью применяемых одновременно функцийобъектной привязки к конечной и средней точкам

2.18.2. Функция redrawПерерисовывает указанный примитив в текущем видовом экране или всеобъекты, видимые в этом видовом экране.

(redraw [<примитив> [<режим>]])

Аргументы: <примитив> — имя примитива, <режим> — целое число (номеррежима для перерисовки объекта — табл. 2.7).

Возвращаемое значение — nil .

Если значение аргумента <режим> не указано, то выполняется перерисовкаобъекта в видовом экране, аналогично действию команды ОСВЕЖИТЬ(REDRAW). Если опущены оба аргумента, то перерисовываются все объек-ты, видимые в текущем видовом экране.

Таблица 2.7. Коды режимов функции redraw

Код Назначение

1 Показать примитив

2 Спрятать примитив

3 Подсветить примитив (выделить пунктиром)

4 Убрать подсветку примитива

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

Page 222: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 221

Примеры:

° (redraw el 2) Делает ПрИМИТИВ el Н6ВИДИМЫМ

° (redraw el l) восстанавливает видимость примитива elп (redraw el 3) подсвечивает примитив el

° (redraw el 4) убирает подсветку примитива el

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

Команда РЕГЕН (REGEN) аннулирует действие функции redraw, восстанав-ливая обычную видимость примитивов.

2.18.3. Функция graphscrАктивизирует графический экран системы AutoCAD (закрывает окно тек-стового экрана, если он был активен).

(graphscr)

Возвращаемое значение — nil.

Действие функции аналогично действию команды ГРАФЭКР (GRAPHSCR).

2.18.4. Функция textscrАктивизирует текстовый экран системы AutoCAD.

(textscr)

Возвращаемое значение — nil.

Действие функции аналогично действию команды ТЕКСТЭКР (TEXTSCR).

2.18.5. Функция textpageАктивизирует текстовый экран системы AutoCAD.

(textpage)

Возвращаемое значение — nil.

Действие функции аналогично действию функции textscr и командыТЕКСТЭКР (TEXTSCR).

2.18.6. Функция grtextЗаписывает временный текст в строку режимов или бокс экранного меню.

(grtext [<бокс> <текст> [<подсветка>]])

Аргументы: <бокс> — целое число (номер бокса или признак строки режи-мов — см. ниже), в которую будет записан текст; <текст> — текстовая стро-

Page 223: Visual LISP и секреты адаптации AutoCAD

222 Visual LISP и секреты адаптации AutoCAD

ка; <подсветка> — целое число (положительное число — признак подсветкибокса экранного меню, как будто он выбран с помощью устройства пози-ционирования).

Возвращается значение второго аргумента. В случае ошибки или отсутствияаргументов возвращается nil.

Вызов функции grtext без аргументов удаляет временные тексты, выведен-ные в строку режимов и боксы экранного меню.

Отрицательные значения аргумента <бокс> (—1 или —2) указывают на записьтекста в строку режимов, положительные или 0 — на запись в боксы экран-ного меню.

На рис. 2.11 приведена иллюстрация различных вариантов вывода времен-ного текста С ПОМОЩЬЮ фуНКЦИИ grtext.

При значении аргумента <бокс>, —1 временный текст выводится в началостроки режимов, при этом предыдущее содержимое строки сдвигается вправо.

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

О

-э &DP

'-' DDа •$»Г оО I^ с,о /

• е л

U ГВ ГA f

От О. ® В' ЪГ и ?

~Б\—п°-

Текстовое окно AutoCAD - Drawing»Средства

Комэнда0

Команда28

Команда

Команда"Текст

Команда

isetq 1

• (repeat

: (grtext

: (grtext

о;

26

-1

-2зоны счетчика

(grtext i (strcat "Текст " (ltoa i)))(setq i

"Текст начала строки режимов") "Текст начала

"Текст зоны счетчика координат")координат"

(i+ и))

строки р

ли?

"ill

J Текст ОТекст 1Текст 2Текст 3Текст 4Текст 5Текст БТекст 7Текст 3Текст 9Текст 10Текст 11Текст 12Текст 13Текст14Текст 15Текст 16Текст 17Текст 18Текст 19Текст 20Текст 21Текст 22Текст 23Текст 24

команда (grteHt —2 "Текст зоны счетчика координат")"Текст зоны счетчика координат"

|Команда:

| Текст начала строки режимов Текст зоны счетчика координат ШАГ СЕТКА ОРТО ОТОПОПЯР(ПРИВЯЗКА ОТС-ПРИВ ВЕС|МОДЕГ

Рис. 2 . 1 1 . Вывод текстовых строк с помощью функции g r t e x t

Page 224: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 223_

Вывод в зону счетчика координат осуществляется при значении аргумента<бокс> —2 и может быть выполнен либо в режиме активизированного тек-стового окна AutoCAD, либо при положении устройства указания в неак-тивном видовом экране (иначе постоянное считывание счетчика координатсбросит введенный текст). Если счетчик координат отключен (например,с помощью функциональной клавиши <F6>), то текст, выведенный с по-мощью функции grtext в зону счетчика координат, тоже будет сохраняться,хотя и в приглушенном виде.

Системная переменная SCREEN BOXES указывает максимальное количествобоксов действующего экранного меню, которое зависит от настройки систе-мы AutoCAD и настройки экрана монитора. Номер 0 соответствует самомуверхнему боксу экранного меню. Номера других боксов при движении свер-ху вниз получаются добавлением 1. Поэтому допустимыми значениями ар-гумента <бокс> функции grtext при работе с экранным меню являются це-лые числа от 0 до max—1, где max — это значение системной переменнойSCREENBOXES.

На рис. 2.11 показан вариант заполнения всех боксов экранного меню(значение переменной SCREENBOXES равно 27). Последний бокс с номе-ром 26 уже не поместился на экране, а бокс с номером 25 виден частично.

Неверные значения аргумента <боко (больше максимального или мень-ше -2) игнорируются, и функция возвращает nil.

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

При отрицательном значении аргумент <подсветка> игнорируется (работаетаргумент <текст>; если у бокса была подсветка, то она снимается). Если ука-затель мыши находится в зоне экранного меню, то аргумент <подсветка>также игнорируется.

Примеры:п (grtext -1 "Текст начала строки режимов") ВЫВОДИТ текст В начало стро-

КИ режимов И возвращает "Текст начала строки режимов"

° (grtext -2 "Текст зоны счетчика координат") ВЫВОДИТ текст В зону счет-ЧИКЭ Координат И возвращает "Текст зоны счетчика координат"

D (grtext 4 "Текст 4") выводит текст в бокс 4 экранного меню и возвра-щает "Текст 4"

п (grtext 4 " t t t " 8) подсвечивает бокс 4 экранного меню и возвраща-ет ni l

° (grtext 4 " t t t " 0) снимает подсветку бокса 4 экранного меню и возвра-щает ni l

Page 225: Visual LISP и секреты адаптации AutoCAD

224 Visual LISP и секреты адаптации AutoCAD

2.18.7. Функция grdrawРисует в текущем видовом экране временный отрезок между двумя точками.Нарисованный отрезок не является примитивом. Может быть удален с по-мощью функции redraw или команд ОСВЕЖИТЬ (REDRAW) и РЕГЕН(REGEN).

(grdraw <из> <в> <цвет> [<подсветка>])

Аргументы: <из> и <в> — списки из двух или трех вещественных чисел(координаты двумерных или трехмерных точек в текущей системе коорди-нат); <цвет> — целое число, задающее номер цвета (значение -1 использует-ся как обратный цвет при наложении рисуемого отрезка на существующиелинии рисунка); <подсветка> — целое число, управляющее подсветкой ри-суемого отрезка (0 — без подсветки, другие числа — с подсветкой пунктир-ной линией). Если значение аргумента <подсветка> опущено, то оно прини-мается равным 0.

Возвращаемое значение — nil.

Если концы заданного отрезка выходят за границы видового экрана, то от-резок рисуется только в видимой части экрана.

Пример:

° ( g r d r a w ' ( 2 8 . 0 1 5 . 5 6 ) ' ( 2 5 6 . 1 2 3 5 4 . 8 8 ) 1 1) р и с у е т пуНКТИрОМ И КрЭС-

ным цветом временный отрезок, не являющийся примитивом рисунка,и возвращает nil

2.18.8. Функция grvecsРисует группу временных отрезков в текущем видовом экране. Является

Обобщением фуНКЦИИ grdraw.

(grvecs <отрезки> [<матрица>])

Аргументы: <отрезки> — список цветов и пар точек, определяющий коорди-наты концов рисуемых отрезков в текущей системе координат и цвета от-резков (см. ниже); <матрица> — список, элементами которого являются че-тыре списка по четыре вещественных числа (матрица преобразования, ис-пользуемая В фуНКЦИИ nentselp).

{'

Возвращаемое значение — nil.

Список цветов и пар точек имеет следующий вид:

( [<цвет1>] <из1> <в1> [ [<цвет2>] <из2> <в2> . . . [[<цветМ>] <изЫ> < B N > ] . . . J ] )

Здесь <цвет1>, <цвет2>, ..., <цветы> — целые числа с номерами цветов отрез-ков. Если к номеру цвета добавить знак минус, то отрезок будет нарисован сподсвечиванием. Когда номер цвета опущен, то действует цвет, установлен-

Page 226: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 225

ный для предыдущего отрезка. Если номер цвета больше 255, тогда исполь-зуется цвет, дополнительный к цвету примитивов рисунка, оказавшихся подотрезком.

<из1>, <в1>, <из2>, <в2>, ... — списки с координатами двумерных или трех-мерных точек, определяющие концы рисуемых отрезков.

Аргумент <матрица> задает дополнительное преобразование координат вы-водимых отрезков (см. матрицу преобразования, описанную для функцииnentselp).

Пример:0 ( g r v e c s ' ( 1 1 ( 0 . 0 0 . 0 ) ( 1 0 0 . 0 5 0 . 0 ) 1 2 ( 0 . 0 0 . 0 ) ( 1 0 0 . 0 1 0 0 . 0 ) 1 3 ( 0 . 0

0 . 0 ) ( 1 0 0 . 0 1 5 0 . 0 ) ) ' ( ( 1 . 0 0 . 0 0 . 0 2 0 . 0 ) ( 0 . 0 1 . 0 0 . 0 2 0 . 0 ) ( 0 . 0 0 . 0

l .o о.о) (О.о о.о о.о 1.0))) рисует из одной точки три отрезка, сдвигаяих при этом с помощью матрицы преобразования на 20 мм по оси X ина 20 мм по оси Y и используя цвета с номерами 11, 12 и 13; возвращаетnil

2.18.9. Функция grclearУстаревшая функция. Очищает текущий видовой экран (в вашей версииможет не работать).

(grclear)

Возвращаемое значение — nil.

2.18.10. Функция grreadВводит данные пользователя с любого устройства (клавиатура, мышь и др.).Требуется очень редко, поскольку функции с префиксом get (см. разд. 2.10)обеспечивают основные варианты пользовательского ввода.

(grread [<мышь>] [<флаг> 1<курсор>]])

Аргументы: <мышь> — признак (если задан и не nil) возврата координат уст-ройства позиционирования, при движении устройства; <флаг> — флаг (целоечисло), являющийся суммой значений установленных битовых флагов (см.ниже); <курсор> — целое число, определяющее тип курсора (см. ниже).

Возвращаемое значение — список из двух элементов. Первый элемент этогосписка — код устройства, использованного для ввода; второй — либо целоечисло, либо список с координатами точки. См. ниже.

Значение аргумента <флаг> формируется из битовых флагов, перечисленныхв табл. 2.8, которые установлены (включены) в данном обращении к функ-ции grread.

8 Зак. 155

Page 227: Visual LISP и секреты адаптации AutoCAD

226 Visual LISP и секреть/ адаптации AutoCAD

Таблица 2.8. Битовые флаги функции grread

Номербита

Значениебитовогофлага

Назначение битового флага, если он включен

0 1 Возвращает координаты устройства указания при буксиров-ке. Результат — список, первый элемент которого — число 5,второй — список с координатами (X, Y) считанной точки

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

2 4 Использует форму курсора, заданную аргументом <курсор>

3 8 Не выводит сообщение об ошибке, если пользователь нажалклавишу <Esc>

Значение аргумента <флаг> получается как сумма тех битовых флагов, кото-рые включены, например: 1 = 1+0+0+0, 3 = 1+2+0+0, 7 = 1+2+4+0 и т. д.

В табл. 2.9 приведены возможные значения аргумента <курсор>, исполь-зуемые, когда в аргументе <флаг> включен битовый флаг, соответствующийбиту 2.

Таблица 2.9. Значения аргумента <курсор> функции grread

Значение Описание

О

1

2

Показывает обычное перекрестие

Не показывает никакого курсора устройства указания

Показывает курсор в форме прицела (квадрата)

В табл. 2.10 приведены варианты возвращаемых значений, являющихся спи-сками из двух элементов. Наименования меню разъясняются в главе 4.

Таблица 2.10. Элементы списка, возвращаемого функцией grread

Первый элемент

Значение

2

Описание типа ввода

Ввод с клавиатуры

Второй элемент

Значение

Любое

Описание

Буквенно-цифровойсимвол

Page 228: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoUSP 227

Таблица 2.10 (окончание)

Первый элемент Второй элемент

Значение Описание типа ввода Значение Описание

7

8

9

10

11

12

Точка, переданнаяустройством позициони-рования

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

Точка, переданнаяустройством позициони-рования (при включенномотслеживании координат)

Выбранный пункткнопочного меню

Выбранный пункт план-шетного меню TABLET1

Выбранный пункт план-шетного меню TABLET2

Выбранный пункт план-шетного меню TABLET3

Выбранный пункт план-шетного меню TABLET4

Выбранный пункт допол-нительного меню AUX

Нажатая кнопкаустройства указания(следует за вводом типа 6или типа 11)

Трехмернаяточка

0-999

1000-1999

2000-2999,

16000-16999

Трехмернаяточка

0-999

1000-1999

2000-2999

3000-3999

0-32767

0-32767

0-32767

0-32767

0-9991000-19992000-29993000-3999

Трехмернаяточка

Список с координатамиточки

Номер бокса экранногоменю

Номер пункта меню РОР1

Номер пункта меню РОР2

Номер пункта менюРОР16

Список с координатами,полученными при букси-ровке

Номер пункта менюBUTTONS1

Номер пункта менюBUTTONS2

Номер пункта менюBUTTONS3

Номер пункта менюBUTTONS4

Номер элемента меню

Номер элемента меню

Номер элемента меню

Номер элемента меню

Номер кнопки меню AUX1

Номер кнопки меню AUX2

Номер кнопки меню AUX3

Номер кнопки меню AUX4

Список с координатамиточки

8*

Page 229: Visual LISP и секреты адаптации AutoCAD

228 Visual LISP и секреты адаптации AutoCAD

Несколько дополнительных соображений по поводу работы с функциейgrread.

Нажатие клавиши <Esc> при работающей функции grread прервет действиевсех функций языка AutoLISP (в том числе и самой grread), если не вклю-чен битовый флаг 8 (см. табл. 2.8).

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

Другая ситуация с выбором пункта кнопочного или дополнительного меню.Вслед за начальным возвращаемым значением (с первым элементом 6 или 11)в буфер возврата последует значение с первым элементом 12, которое впрограмме пользователя должно быть обязательно прочитано еще однимвызовом функции grread, например:

(setq return2 (grread (setq returnl (grread))))

Оба возвращенных значения, сохраненные в переменных r e t u r n l и re tum2,далее могут быть проанализированы.

Пример:

° (grread) ждет ввода и возвращает, например, (2 1Ю) в случае нажатияклавиши <N> или, например, (3 (303.147 137.451 о.0)) в случае указа-ния точки мышью в графическом экране

2.18.11. Функция initdiaЗаставляет некоторые команды системы AutoCAD, вызываемые из LISP-программы, работать с диалоговым окном.

(initdia [<флаг>])

Аргумент <флаг> — целое число. Если значение аргумента опущено или за-дано не равным 0, то вызываемая из программы ближайшая (и только она)команда системы AutoCAD будет работать с диалоговым окном, если такаявозможность в команде предусмотрена. Если функция initdia вызвана созначением аргумента, равным 0, то досрочно сбрасывается настройка на вы-зов очередной команды в режиме диалогового окна.

Возвращаемое значение — nil.

Следующие команды при обычном вызове их из программы работают бездиалогового окна:

АТОПР (ATTDEF) БЛОК (BLOCK)

АТЭКСП (АТТЕХТ) ВИД (VIEW)

Page 230: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 229_

ВСТАВИТЬ (INSERT) ПАНЕЛЬ (TOOLBAR)

ИЗОБ (IMAGE) ПЕЧАТЬ (PLOT)

ИЗОБРЕГУЛ (IMAGEADJUST) СЛОЙ (LAYER)

КШТРИХ (ВНАТСН) СТИЛЬ (STYLE)

МТЕКСТ (МТЕХТ) ТИПЛИН (LINETYPE)

НОВОЕИМЯ (RENAME) ЦВЕТ (COLOR)

Например:

(command "^INSERT") вызывает в командной строке запрос:

Имя блока или [?]:(Block name or [?]:)

Однако если перед обращением к команде ВСТАВИТЬ (INSERT) указатьобращение к функции initdia, то ситуация изменится:

(initdia) (command " INSERT") вызывает уже диалоговое окно Вставка блока(Insert).

Функция initdia — одноразового действия. При следующем обращении изпрограммы без вызова функции initdia команда ВСТАВИТЬ (INSERT) бу-дет работать без диалогового окна.

2.18.12. Функция tabletЧитает или изменяет текущую настройку (калибровку) планшета.

(tablet <код> [<ряд1> <ряд2> <рядЗ> <нормаль>])

Аргументы: <код> — целое число (код операции, который может быть толькоО или 1); <ряд1>, <ряд2> и <рядЗ> — три трехмерные точки (списки из трехчисел), определяющие матрицу преобразования точек, координаты которыхсчитаны дигитайзером; <нормаль> — трехмерная точка (список с координа-тами в МСК), определяющая направление нормали к поверхности планшета.

Возвращаемое значение — список из пяти элементов с настройками план-шета. Если калибровка невозможна или из-за ошибки в данных, или из-затого, что дигитайзер не установлен, или из-за отключения планшета с по-мощью системной переменной TABMODE — возвращается nil.

Код операции 0 означает чтение параметров настройки, а код 1 — их изме-нение. При коде операции 0 остальные параметры должны отсутствовать.

Третья координата аргумента <рядЗ> должна быть равна 1, иначе AutoCADсам изменит ее на 1.

Page 231: Visual LISP и секреты адаптации AutoCAD

230 Visual LISP и секреты адаптации AutoCAD

Если в качестве значения аргумента <нормаль> задана ненормализованнаяточка, то AutoCAD ее сам нормализует (приводит к единичному вектору).

Примеры:

° ( t a b l e t 0) МОЖеТ в е р н у т ь (1 ( 0 . 0 0 5 6 1 7 1 7 - 0 . 0 0 0 9 7 8 9 4 2 - 7 . 5 1 7 1 )( 0 . 0 0 0 9 7 8 9 4 2 0 . 0 0 5 6 1 7 1 7 - 9 . 1 7 3 0 8 ) ( 0 . 0 0 . 0 1.0) ( 0 . 0 0 . 0 1 . 0 ) )

° ( t a b l e t 1 ' (1 о о.) ' (0 1 0 ) ' ( 0 0 1) ' ( 0 о 1)) задает такую настройкупланшета, при которой дигитайзер будет возвращать с ч и т а н н ы е к о о р д и -наты точек без д о п о л н и т е л ь н о г о преобразования

2.19. Файлы автоматической загрузкифункций пользователяВ системе AutoCAD предусмотрены средства, обеспечивающие автоматиче-скую загрузку LISP-программ при запуске сеанса редактирования системыAutoCAD, а также при открытии новых рисунков.

2.19.1. Файл acad.lspПри запуске системы AutoCAD выполняется чтение и загрузка ряда файлов.В число автоматически загружаемых файлов входят файлы acad2000.lsp иacad.lsp, которые содержат выражения на языке AutoLISP, в том числе опре-деления необходимых функций.

Файл acad2000.lsp поставляется вместе с программным обеспечением систе-мы AutoCAD (см. приложение 1) и содержит в виде исходных текстов рядважных программ, которые по каким-то причинам не вошли в ядро систе-мы. Редактировать этот файл ни в коем случае не рекомендуется.

Для загрузки программ пользователя предназначен специальный файлacad.lsp. Этот файл не входит в состав стандартного программного обеспече-ния системы AutoCAD, но при запуске AutoCAD пытается его найти и за-грузить. Последовательность поиска файла acad.lsp определяется настройка-ми ярлыка и самой системы AutoCAD (см. главу ]). Вначале просматривает-ся рабочий каталог, заданный в настройке ярлыка AutoCAD, и затем —папки файлов поддержки. Первый же обнаруженный файл с названиемacad.lsp загружается и дальнейший его поиск по другим папкам прекращается.

Если никакого файла acad.lsp в стандартных путях система не обнаружила,то это не является ошибкой и не препятствует дальнейшей работе.

Однако вы можете создать такой файл и включить в него любые выражения,которые будут выполнены в начале сеанса редактирования. Если в файлеесть определения ваших функций, то они будут загружены в память первогорисунка. В листинге 2.18 приведен пример написания файла acad.lsp.

Page 232: Visual LISP и секреты адаптации AutoCAD

Глава 2. Язык AutoLISP 231

i Листинг 2.18. Пример файла acad.lsp I

(defun fkosl (rl ppl / pp2)

(command "_CIRCLE" ppl rl) (setq vo (entlast))

(initget 1) (setq pp2 (getpoint "ХпЗадайте точку: "))

(command "_COPY" vo "" ppl pp2)

(princ "\Окружности построены. ")(princ); тихий выход

); конец defun fkosl

(defun d2r (angdeg /) (* pi (/ angdeg 180.0)))

(setq curname "Design-Ritm")

(setvar "DIMSCALE" 50.0)

(princ "Выполнена загрузка моего файла acad.lsp, ")(princ)

В приведенном примере файл acad.lsp содержит определения двух пользова-тельских функций (fkosl и d2r), а три последние строки являются выраже-ниями языка AutoLISP, которые будут выполнены при загрузке данногофайла. С помощью этих выражений сформируется значение глобальной пе-ременной curname и установится новое значение системной переменнойDIMSCALE, равное 50.0.

При необходимости вы можете добавить в файл acad.lsp выражение, котороезагрузит ваши функции из другого LSP-файла, например:

(load "d:\\User\\my_designtools.lsp")

Не рекомендуется включать в файл acad.lsp выражения, содержащие функ-ции command и vi-cmdf, поскольку до полной инициализации среды командысистемы AutoCAD не могут работать.

2.19.2. Файл acaddoc.lspЕсли файл acad.lsp загружается только один раз при запуске системы Auto-CAD (об исключениях см. следующий раздел), то файлы acad2000doc.lsp иacaddoc.lsp загружаются при открытии каждого нового документа (рисунка).

В файл acad2000doc.lsp включены функции системы, не вошедшие в основ-ное ядро, но которые нужно загрузить в память каждого рисунка. Аналогич-ную функцию выполняет файл acaddoc.lsp, но он предназначен для пользо-вателя. В этом файле тоже могут быть исполняемые выражения и определе-ния пользовательских функций.

Файл acaddoc.lsp загружается с каждым рисунком и только один раз. Поискфайла выполняется по тому же алгоритму, что и поиск файла acad.lsp(сначала в рабочем каталоге, указанном в ярлыке, затем в путях настройки).Первый же обнаруженный файл с таким именем загружается и дальнейшийего поиск в данном рисунке прекращается.

Page 233: Visual LISP и секреты адаптации AutoCAD

232 Visual LISP и секреты адаптации AutoCAD

2.19.3. Системная переменная ACADLSPASDOCВ обычном варианте настройки системы AutoCAD файл acad.lsp за весь се-анс редактирования загружается только один раз, даже если в этом сеансеоткрывалось много рисунков. На данный процесс оказывает влияние значе-ние системной переменной ACADLSPASDOC.

Эта системная переменная может принимать только два значения: 0 (обыч-ное значение) и 1. Последнее значение заставляет систему AutoCAD загру-жать файл acad.lsp с каждым открываемым рисунком, аналогично файлуacaddoc.lsp.

2.19.4. Функция sr.startupВ системе AutoCAD предусмотрено одно имя для пользовательской функ-ции (s : : startup), которая будучи записанной в файл acad.lsp илиacaddoc.lsp, автоматически выполняется при открытии каждого рисунка по-сле его полной инициализации.

Page 234: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 3

Среда Visual LISP

Среда Visual LISP введена в систему AutoCAD 2000 для упрощения процессанаписания и отладки программ на языке AutoLISP. На рис. 3.1 показаноокно Visual LISP для AutoCAD (Visual LISP for AutoCAD), которое появляет-ся на экране, если пользователь вводит в командной строке команду VLISP(такое же наименование применяется и в англоязычной версии AutoCAD).Другой формой этой команды является VLIDE. К вызову того же окна при-водит выбор пункта AutoLISP, Редактор Visual LISP (Visual LISP Editor)в меню Сервис (Tools).

[ Щ Visual LISP дня AutoCAD <Diawing1_dwg>

Ф.айл Цравка Поиск В.ИД Проект £ервис QKHO Справка

Ш КОНСОЛЬ Visual LISP

_ $_ $

I Visual LISP окно консоли L 00002 C00Q04

Рис. 3 . 1 . Окно Visual LISP для AutoCAD

Окно Visual LISP для AutoCAD (Visual LISP for AutoCAD) является само-стоятельной оболочкой внутри системы AutoCAD, со своими меню и пане-

Page 235: Visual LISP и секреты адаптации AutoCAD

234 Visual LISP и секреты адаптации AutoCAD

лями инструментов. Панели инструментов могут находиться не только вфиксированном положении, как на рис. 3.1, но и в плавающем — рис. 3.2.

14Й Visual LISP для AutoCAD <Drawrng1 dwg>

.Файл Драека Поиск Вир. Проект Охладка Сервис .Окно Справка

. Окно трассировки вывода L 00001 С 00001

Рис. 3.2. Плавающее положение панелей диалогового окна Visual LISP для AutoCAD

Внутри рабочей зоны располагаются окна для открываемых текстовых фай-лов (могут редактироваться файлы LISP-программ, DCL-файлы диалоговыхокон, SQL-файлы обработки баз данных, файлы программ на языке С) —окно Консоль Visual LISP (Visual LISP Console) (используется для связи с си-стемой AutoCAD), окно Трассировка (Trace) (служит для отладки программ).

3.1. Обзор меню Visual LISPВ состав среды Visual LISP входят девять пунктов меню: Файл (File), Правка(Edit), Поиск (Search), Вид (View), Проект (Project), Отладка (Debug), Сервис(Tools), Окно (Window), Справка (Help). Во всех меню есть как постоянныепункты, так и меняющие свое состояние или исчезающие в зависимости отконкретного этапа разработки программы.

3.1.1. Меню ФайлМеню Файл (File) (рис. 3.3) предназначено для выполнения операций с фай-лами и включает в себя следующие пункты:

О Новый файл (New File)

О Открыть файл (Open File)

Page 236: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 235

D Открыть заново (Reopen)

• Сохранить (Save)

• Сохранить как (Save As)

П Сохранить Все (Save All)

• Закрыть (Close)

• Обратить (Revert)

• Закрыть все (Close All)

• Печать (Print)

• Параметры печати (Print Setup)

П Собрать приложение (Make Application)

• Загрузить файл (Load File)

• Выход (Exit)

Назначение пунктов соответствует их наименова-ниям. Пункт Обратить (Revert) позволяет восстано-вить содержимое файла в активном окне, анало-гично пункту Открыть заново (Reopen). Работапункта Собрать приложение (Make Application) рас-смотрена в разд. 3.4.3.

Файл Правка Поиск

. Н овый Файл

Открыть Файд..СЗткрьпъ заново

СохранитьСохранить как.,.

Сохранить Исе

Закрыть ,. О^ретить •"' •:

Закрыть все : :

Печать,.. • ;Параметры печати...

Собрать приложение

Загрузить файл...

Бьщод

Ёид RpogKi

Ctrl-N

Ctt(-0

Ctfl-SСЫ-Alt-S

M-Shift-S

CU1-F4

C(il-P

Dtl-Shift-L

Aft-Q : Рис. 3.3. Меню Файл

3.1.2. Меню ПравкаМеню Правка (Edit) (рис. 3.4) содержит следующие пункты:

• Отменить (Undo)

О Повторить (Redo)

• Вырезать (Cut)

• Копировать (Сору)

• Вставить (Paste)

• Удалить (Delete)

П Выделить все (Select All)

Page 237: Visual LISP и секреты адаптации AutoCAD

236 Visual LISP и секреты адаптации AutoCAD

П Проверка скобок (Parantheses Matching)

G Дополнительные функции (Extra Commands)

! Дравка Поиск ВидОтменить

• № ; 1 ч , . « : . я г ' • -••

. Вставить :••Удалить

ПрЬает Ощакнз, /;; CUE

-• '.'ХЖ: .:

•'•; :• Del '.•'.•••-• : V C t i l A ' ; .

• • ciii-м V:

Дополнительные Функции СЫ-Е > Рис. 3.4. Меню Правка

Первые семь пунктов меню соответствуют аналогичным пунктам менюПравка (Edit) других приложений Windows 95/98. Пункт Проверка скобок(Parantheses Matching) содержит подпункты операций для контроля редакти-руемого текста:

• Найти закрывающую (Match Forward)

О Найти открывающую (Match Backward)

• Выделить до конца (Select Forward)

П Выделить до начала (Select Backward)

Два первых подпункта позволяют находить в тексте парную (закрывающуюили открывающую) скобку для скобки, находящейся у текущей позициикурсора. Два последних подпункта выполняют аналогичные операции, нопри этом еще и выделяют нужные участки текста.

3.1.3. Меню ПоискМеню Поиск (Search) (рис. 3.5) предназначено для операций текстового ре-дактора Visual LISP (в частности, операций поиска и замены) и включает всебя следующие пункты:

• Найти (Find)

О Заменить (Replace)

П Найти/Заменить далее (Find/Replace Next)

• Дописать словом из окна (Complete Word by Match)

О Дописать словом из списка (Complete Word by Apropos)

• Закладки (Bookmarks)

• Первое сообщение (First Message)

• Следующее сообщение (Next Message)

Page 238: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 237

П Перейти на строку (Go to Line)

• Последняя правка (Go to Last Edited)

Поиск Вид Проект Отладка

Найти.:.Заменить...- ' :

Йайги/Заменить далее

Дописать Словом из £кна: Дописать словом из списка

Закладки •

Перейти на строку... 'Последняя пеавкз

Сервис :§кйо-:;

Ш - F : ч : •'••.••.:

cm: v ••::.'-

га ;..:. ;•,;• : .:;;

Orl-Space • ;. ...

Ctrl-SHfeSpsce

' •'"••"•••..• \ I '.

f-.il-.. ';•'• ;•, •;• ',: ;

w s v . •:••"•••:;Otl-SWl-S:

wp12

''•APPNAME•APPSETftPPTYPE

Рис. З.6. Применение операцииДописать словом из списка

Рис. 3.5. Меню Поиск

Поясним назначение некоторых из этих пунктов (смысл остальных пунктовясен из наименований). Пункт Дописать словом из окна (Complete Word byMatch) дает возможность редактору Visual LISP дописать (закончить) нача-тое вами слово аналогично предыдущему слову с таким же началом в теку-щем окне редактируемой программы. Пункт Дописать словом из списка(Complete Word by Apropos) позволяет получать варианты дописывания сло-ва из списка символов AutoLISP, куда входят имена встроенных функций(рис. 3.6).

С помощью закладок можно помечать нужные места в тексте для быстрогоперемещения между ними в дальнейшем. Операции установки, удалениязакладок и переходов между закладками выполняются с помощью подпунк-тов Закладка Вкл/Откл (Toggle Bookmark), Следующая закладка ("NextBookmark), Предыдущая закладка (Previous Bookmark), Убрать все закладки(Clear All Bookmarks) пункта Закладки (Bookmarks). Еще два подпункта —Выделить до следующей закладки (Select to Next Bookmark) и Выделить допредыдущей закладки (Select to Previous Bookmark) — того же пункта менюпозволяют облегчить операции выделения больших участков текста.

3.1.4. Меню ВидМеню Вид (View) (рис. 3.7) предназначено для операций просмотра различ-ной вспомогательной информации во время работы LISP-программы, а так-же для работы с панелями инструментов окна Visual LISP для AutoCAD(Visual LISP for AutoCAD).

Меню состоит из следующих пунктов:

П Изучить (Inspect)

П Стек трассировки (Trace Stack)

Page 239: Visual LISP и секреты адаптации AutoCAD

238 Visual LISP и секреты адаптации AutoCAD

П Поиск ошибок (Error Trace)

О Инспектор символов (Symbol Service)

• Окно контрольных значений (Watch Window)

• Параметры справочного списка (Apropos Window)

• Окно точек останова (Breakpoints Window)

• Окно вывода (Output Window)

D Консоль LISP (LISP Console)

П Обзор базы данных рисунка (Browse Drawing Database)

• Панели инструментов (Toolbars)

; £ца Проект Охлэдка Сервис йИзучить... :

Стек трассировки ', :

. ПОИСК О Щ Й б о к -; .. •• • . •"' . ••

Инспектор симдолра.:: ;: •:,.-'

йкноi1 контррльдая ЗначенийПараметры справочного списка,..

Обзор £азы даннык рисунка

Панели инструментов

но Справка

CbfSWt-l.

Ctrl-Shift-T

Qrl-Shift-R

Ctrl-Shift-A

Рис. 3.7. Меню Вид

Пункт Изучить (Inspect) позволяет вызывать специальные окна Изучение(Inspect), в которых можно посмотреть состояние переменных, списков, на-боров, примитивов, а также выражений AutoLISP.

Имя изучаемого объекта или выражение должно быть предварительно выде-лено в тексте программы. Если ничего не было выделено, то перед открыти-ем очередного окна Изучение (Inspect) выдается запрос имени. Пример от-крытого окна Изучение (Inspect) приведен на рис. 3.8, где рассмотрен спи-сок с характеристиками окружности.

J И , Изучение: LIST

JIM . <Имяа&екта: 14a3dSO>|fO. "CIRCLE"! (330 . <Имяо6ъекта: 14a3cf8>l(5. "2C"]|lflO. "АсОЬЕпЙЛ167. С

.ЮШ...,..<И,мя.о&Шз:.1.4аЗйЕ0>][ l j ( 0 . "CIRCLE")[2] (330. <Имд объекта: 14a3c(S>)РК5.-2С")[4)1100. "AcDbEntity")(51(67.0)[6] (410. "Model")17](8. "HOLES")[81(100. MAcDbC»cle"J(91(10179.603174.1180.0)(10) (40. 11.5871)[111(2100.00.01.0)

Рис. З.8. Окно Изучение

Page 240: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 239

Пункт Стек трассировки (Trace Stack) выводит на экран одноименное окно.В этом окне приводится перечень последних выполненных операций (рис. 3.9).

В верхней части окна расположены кнопки:

• Освежить (Refresh) — очищает содержимое окна;

П Копировать в окно трассировки/журнал (Copy to Trace/Log) — копируеттекст в специальное окно Трассировка (Trace), в котором, как в протоко-ле, накапливаются сведения по отладке программы.

Если в окне Стек трассировки (Trace Stack) выделить какую-нибудь строку,то с помощью правой кнопки мыши можно вызвать контекстное меню сдополнительными операциями над элементами стека трассировки (объемконтекстного меню может меняться): Изучить (Inspect), Печать (Print), Сим-вол функции (Function Symbol), Копировать (Сору), Локальные переменные(Local Variables), Положение в тексте (Source Position), Позиция вызовафункции (Call Point Source).

1Щ Стек, трассировки

HICVLIDE)<3> :CALLBACK-ENTRY<4 iRO SUBR САИБЛСГ

щПОИСК ошибок

; TOP COMMANDл CALLB"CI' EtITR i

[4] 1С ,LIDE|c, CAUEACt ENTRYE "RQ bUBR CMLLE^

Рис. З.9. ОкноСтек трассировки Рис. 3.10. Окно Поиск ошибок

Пункт Поиск ошибок (Error Trace) из меню Вид (View) вызывает одноимен-ное окно (рис. 3.10) с информацией об ошибках, возникших при выполне-нии программы.

Если выделить в этом окне строку, то по нажатию правой кнопки мышиможно вызвать контекстное меню для получения дополнительных сведенийоб элементе окна Поиск ошибок (Error Trace). Контекстное меню имеет теже пункты, что и контекстное меню окна Стек трассировки (Trace Stack). Нарис. 3.11 показан пример дополнительного окна, вызванного с помощьюпункта Показать сообщение (Show Message), которое появляется в контекст-ном меню для строки SYNTAX-ERROR.

Пункт Инспектор символов (Symbol Service) из меню Вид (View) открываетодноименное окно (рис. 3.12), которое выполняет функции, похожие нафункции окна Изучение (Inspect), но только для символов AutoLISP.

• • : . , " • / ' ; • • ' • ' . • • • . • • - : • • • ' • ' • ' • • • • - ' • ' '•" :

• ; ' | " \ ' . : E R R O R - B R E A K . : " ' . . '. • '

. •'Xjf^ неверно сформирванный список-на.входе

• ' • • •• .

I Z I M Z Z l ]

Рис. 3.11. Диалоговое окно Инфос дополнительной информацией об ошибке

Page 241: Visual LISP и секреты адаптации AutoCAD

240 Visual LISP и секреты адаптации AutoCAD

| щ Инспектор символов

шшшИмя :

j u s r f i A D ••• ,.:•;:<•••

Ш90ЕЕ1ЛН1Я1ВНЯ.-ПрИЯа

•Флаги : - . _ . . i _ < ~ . -

Г" Храссировка ;

Г" Отладка на egjqae.:.

•-•"•''My •'•I

BUtS

: г

• . . '•• • ;

• ' : . i : " • • ' • . • • ' . - • ' ' • : . ' ' - ' "

• • : ' • . • • ' . • -:•' • :

• : . . " ' - ' . . . - ' . :

Защита от присвоения

ЗКВтргг в AutoCAD

:0тмвна ; :

Рис. 3.12. Диалоговое окноИнспектор символов

Окно имеет два поля: Имя (Name), Значение (Value) и группу Флаги (Flags).Назначение полей очевидно (имя символа и значение символа), а группаФлаги (Flags) содержит четыре флажка, которые могут быть установленыили сброшены для выбранного символа:

О Трассировка (Trace) — отслеживание с помощью трассировки;

• Отладка на входе (Debug on Entry) — отладка при входе в функцию;

О Защита от присвоения (Protect Assign) — защита специальных символов отслучайного присвоения (например, Т, pi и др.);

• Экспорт в AutoCAD (Export to AutoCAD) — экспорт функции в AutoCAD,чтобы сделать ее доступной для приложений ObjectARX.

Окно Инспектор символов (Symbol Service) в верхней его части имеет четырекнопки (слева направо):

О Контрольное значение (Watch) — добавляет символ к окну Контрольноезначение (Watch);

О Изучить (Inspect) — открывает окно Изучение (Inspect) для данного сим-вола;

СЗ Показать описание (Show Definition) — вызывает окно текстового редак-тора и выделяет в нем текст символа, являющегося пользовательскойфункцией;

О Справка (Help) — вызывает справку по Visual LISP с описанием символа,являющегося встроенной функцией.

Пункт Окно контрольных значений (Watch Window) меню Вид (View) выво-дит на экран окно Контрольное значение (Watch) (рис. 3.13).

Окно отображает значения выбранных символов в ходе выполнения про-граммы. Добавление символов к этому окну производится либо с помощьюокна Инспектор символов (Symbol Service) (кнопкой Контрольное значение(Watch)), либо с помощью первой (левой) из четырех кнопок (Добавить кон-

Page 242: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 241

трольное значение (Add Watch)), расположенных в верхней части окна Кон-трольное значение (Watch). Перечислим эти кнопки:

• „ Добавить контрольное значение (Add Watch)

• Очистить окно (Clear Window)

П Сортировать выражения (Sort Expressions)

• Копировать в окно трассировки/журнал (Copy to Trace/Log)

Пункт Параметры справочного списка (Apropos Window) меню Вид (View)выводит на экран окно Параметры справочного списка (Apropos) (рис. 3.14).

LIST ...RAD.;iO..Offl i

Рис. 3.13. Окно Контрольноезначение

| Щ Параметры справочного en..

Г £ помощью WCMATCH

Г~ Симвооы нижнего регистра

Рис. 3.14. Диалоговое окноПараметры справочного списка

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

Данное окно позволяет просматривать список зарезервированных символов(в первую очередь, имен встроенных функций). Введенная в верхнем полепоследовательность букв (на рис. 3.14 введена одна буква f) является основ-ным критерием формирования списка выводимых имен (эти буквы должныобязательно присутствовать в именах всех символов списка). Пользовательможет с помощью флажков указать, должна ли эта последовательность обя-зательно присутствовать в начале имени или может встретиться в другойчасти символа, а также возможно ли использование специальных знаковтипа * или #, как в функции wcmatch (см. разд. 2.8.8). На рис. 3.15 приведенорезультирующее окно Справочный список найденных символов (Aproposresults) с символами, имеющими префикс "F".

Page 243: Visual LISP и секреты адаптации AutoCAD

242 Visual LISP и секреты адаптации AutoCAD

I Щ Справочный список найденных символов [ щ Точки останова

FAS4-FILEFILEFILEDIA-SAVEFILEDIA_OLDFILENAMEFILLJMAGEFINDFILEFITSTR2LENFIXFLAGFLGFLOATFLTFMSAFMSBFNAFNAMEFNSPLITLFORCEFOREACHFORMATFUFUN-, Цr l ' •

cl L5P(294]

Рис. 3 . 1 6 . Диалоговое окноТочки останова

Рис. 3.15. Окно Справочный списокнайденных символов

Пункт Окно точек останова (Breakpoints Window) меню Вид (View) открываетокно Точки останова (Breakpoints) (рис. 3.16), используемое в отладке про-грамм.

Пункт Окно вывода (Output Window) позволяет открыть окно <Сообщениясборки> (<Builder Ouput>) для вывода сообщений, генерируемых в процессеразработки приложений (рис. 3.17).

Щ Visual LISP для AutoCAD <Dia*ing1.dwg>

Псинск Вт Проект Дараметры Справка

#4("г »* С) О

JL£. V *~7« ч '„ *Г ^ * ^Ш -сСообщения сборки>

[FflSDUMPING object format -> "D:/flutoCflD2000/t-cl .fas"]

; Compilation complete.

- i L J

J

Окно вывода RO L 00008 С 00001

Рис. 3 . 1 7 . Окно «Сообщения сборки>

Page 244: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 243

Пункт Консоль LISP (LISP Console) меню Вид (View) вызывает очень важ-ное окно, называемое Консоль Visual LISP (Visual LISP Console) (рис. 3.18),которое в среде Visual LISP является аналогом зоны командных строк сис-темы AutoCAD. В нем можно вводить выражения AutoLISP, загружать и вы-полнять функции, а также читать значения переменных. Сюда же VisualLISP выводит свои сообщения.

e V i s u a l LISP дня AutoCAD <Diawing1 dwg>

файл Правка Поиск £ид Проект Отладка Сервис Окно Справка

} ' О ' Лф

3Е)

И Комсояь Visual LISP

; 1 Форма загружен из I K e d i t o r •1D:/flutoCflD2eee/i-cl.LSP">$ ( t c l )

$ ( u l i s p - c o n p i l e ' s t " r c l . l s p " )

AJ

Visual LISP окна консоли L 00007 С0000Б

Рис. 3 . 1 8 . Окно К о н с о л ь Visual LISP

Пункт Обзор базы данных рисунка (Browse Drawing Database) меню Вид(View) имеет подпункты Все объекты (Browse All Entities), Таблицы (BrowseTables), Блоки (Browse Blocks), Набор (Browse Selection) и Расширенные дан-ные (Inquire Extended Data), при выборе которых вызываются соответст-вующие окна для просмотра базы данных графических примитивов и негра-фических объектов текущего рисунка (рис. 3.19).

ЩОБЪЕКТЫ AUTOCAD 1ШТАБЛИЦЫ РИСУНКА<

Ш В Ш . . м а . & , И !<LWPQLYUNE> <Имя объекта: 149ed60><LINE> <Имя объекта: 149ed68><UME> <Имя объекта: H9ed7Q><UNE> <Имя объекта: 149ed78>

!;; Меню таблиц рисчнка

Ж Изучение: ИСК5ЕТUSelection set: 6>

<Типы линий> ....<Слом> ....<Стили> ....<Виды> ....<Размерные стнли> ....<П ользоватеяьскме системы к.оораинзт><Прнложения>

|0)<UHE> <Имя объекта 149ed68>I1)<LWPQLYUME> <Иияосгъекта 149ed8C[2] <C1RCLE> <Имя объекта: 149ed58> „ _ _ _[3] <LINE> <Имя объекта: 149ed78> i |<Ы5-а>[4] <ЦНЕ><Имя объекта: 149ed70> '

ЩЕЛОКИ AUTOCAD

Рис. 3 . 1 9 . Окна обзорабазы данных рисунка

Пункт Панели инструментов (Toolbars) меню Вид (View) вызывает диалого-вое окно Панели инструментов (Toolbars) (рис. 3.20), которое управляет ви-димостью пяти панелей среды Visual LISP.

Page 245: Visual LISP и секреты адаптации AutoCAD

244 Visual LISP и секреты адаптации AutoCAD

| Щ Панели инетрамеиггов 13)

1 К? Поиск ;

{ f/ Сервис •

: К" Дтлаяка " i

•! Р й и я '•••••;••

Скрыть все |

.Показатьвсе |

Применить |:'

Закрыть | Рис. 3.20. Диалоговое окноПанели инструментов

Флажки этого окна должны быть установлены около имен тех из пяти пане-лей (Стандартная (Standard), Поиск (Search), Сервис (Tools), Отладка(Debug), Вид (View)), которые необходимо вывести на экран. Изменениявносятся с помощью кнопок Скрыть все (Hide All), Показать все (Show All),Применить (Apply). Кнопка Закрыть (Close) закрывает диалоговое окно Па-нели инструментов (Toolbars).

3.1.5. Меню ПроектМеню Проект (Project) (рис. 3.21) дает возможность работы с проектами.

Проект —__ это объединение группы LISP-программ в приложение, работа-ющее в среде системы AutoCAD и компилированное в один файл с расши-рением fas (возможен вариант, когда каждой из программ создается свойFAS-файл, хотя это менее удобно). Такое приложение называется FAS-npu-ложением.

Проект Отладка £ервис Экно

£тфыгь проект,..

^Закрыть проект

Свойства проекта...

Загрузить FAS-Файл проекта - .' Загрузить исходные файлу проекта •

Собрать FAS-Файл проектаПерекомпилировать FAS-Фэйл проекта

Рис. 3 . 2 1 . Меню Проект

Меню Проект (Project) имеет следующие пункты:

П Новый проект (New Project)

О Открыть проект (Open Project)

О Закрыть проект (Close Project)

• Свойства проекта (Project Properties)

• Загрузить FAS-файл проекта (Load Project FAS File)

• Загрузить исходные файлы проекта (Load Project Source Files)

Page 246: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 245

О Собрать FAS-файл проекта (Build Project FAS)

• Перекомпилировать FAS-файл проекта (Rebuild Project FAS)

Эти пункты рассмотрены в разд. 3.4.2. По-следние (дополнительные) строки в менюпоказывают имена открытых проектов. Ак-тивный проект помечен флажком.

Меню Отладка (Debug) (рис. 3.22) позво-ляет отлаживать программы в среде VisualLISP.

Отладка Сервис Окно Справка

.Шаг. с заходом • . .. •

: / Щ а г с ' о б х о д о м • • ' . •

:. 'Шаг с выходом ' \ ;•'•

ПррДОЛЖИТЬ •••_•• ;•;/

£ б р о с д о в е р х н е г о у р о в н я

Дыход из текущего уровня

Добавить контрольное значение.,.Результат последнего вычисления

"" : ' ' " ' " " "• " " ": :',""' :"",_""г~Точка останова 6кл/Откл •;;.:Удалить все хочки останова: .

Причина последнего останова

Команда трассировки ;:

Дстанов • • ••

. Останов на ошибкеАнимация

F8 '., •Shift-F8C№SMtf8 ::.Ш-FS

ctrt-Q ;.

Dil-W

aii-Sbift-F3:;y;

Dt№9 ;

• " . ' : : ' : : . . ' • • • . •

Рис. 3.22. Меню Отладка

Это меню имеет такие пункты:

ГЛ Шаг с заходом (Step Into)

• Шаг с обходом (Step Over)

• Шаг с выходом (Step Out)

• Продолжить (Continue)

П Сброс до верхнего уровня (Reset to Top Level)

О Выход из текущего уровня (Quit Current Level)

• Добавить контрольное значение (Add Watch)

• Результат последнего вычисления (Watch Last Evaluation)

О Точка останова Вкл/Откл (Toggle Breakpoint)

П Удалить все точки останова (Clear All Breakpoints)

• Причина последнего останова (Last Break Source)

• Команда трассировки (Trace Command)

П Останов (Stop Once)

• Останов на ошибке (Break On Error)

• Анимация (Animate)

D Прервать вычисления (Abort Evaluation)

Эти пункты и соответствующие им операции рассмотрены в разд. 3.4.1.

Page 247: Visual LISP и секреты адаптации AutoCAD

246 Visual LISP и секреты адаптации AutoCAD

3.1.6. Меню СервисМеню Сервис (Tools) (рис. 3.23) предназначено для вспомогательных опе-раций.

Если в среде Visual LISP активно окно Консоль Visual LISP (Visual LISPConsole), то меню Сервис (Tools) имеет следующие пункты:

• Режим AutoCAD (AutoCAD Mode)

• Оформление окна (Window Attributes)

• Параметры среды (Environment Options)

П! Сохранить параметры (Save Settings)

Сервис Qr.no Справка

Режим AutoCAD CM-Shift-C

Дформление окнаПараметры среды

Сохранить параметры

B EЦ

; гг

; i £

: г

С

зет".Йс|"-ФайЛы---'

Нет . ; :

AutoUSP

S 3 ,: • ••••;/;';' ••SQL: . : ' .

ОК ^~1 Отмена

i

J

Рис. 3 . 2 3 . Меню Сервис(первый вариант)

Рис. 3.24. Диалоговое окноЦветовой стиль

Пункт Режим AutoCAD (AutoCAD Mode) включает или отключает режимиспользования окна Консоль Visual LISP (Visual LISP Console) в качествекомандной строки системы AutoCAD (появляется подсказка Команда:(Command:)). Это дает возможность вводить команды AutoCAD прямо в окнеконсоли. Если такой режим установлен, то в меню слева от данного пунктастоит флажок.

Пункт Оформление окна (Window Attributes) состоит из пяти подпунктов:

О Цвета синтаксических элементов (Syntax Coloring)

О Настроить текущее (Configure Current)

• Оформление текущего окна по прототипу (Set Current Window to Prototype)

• Оформление всех окон по прототипу (Set All Windows to Prototype)

П Шрифты (Fonts)

Подпункт Цвета синтаксических элементов (Syntax Coloring) доступен тольков том случае, если в активном окне находится текст файла, имеющего рас-ширение, отличное от Isp. Тогда вызывается окно Цветовой стиль (ColorStyle) (на рис. 3.24 показано окно, открытое при работе с DCL-файлом),

Page 248: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 247

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

Подпункт Настроить текущее (Configure Current) открывает окно Оформле-ние окна (Window Attributes) (рис. 3.25), в котором можно подкорректиро-вать действующие цветовые установки разных элементов текста. Оформляе-мые элементы перечислены в раскрывающемся списке.

| щ Оформление окна

Цвета текста

Текст в окне Окрашенный Т еи.ст в окне

ЕГ Прозрачный ПП |:WINDOW-TEXT j j '.

Г Прозрачный З П П7 Выделение лексичеснии единиц

Позиция табуляции ]8

Левая граница |Т0

ОН [ Отмена ~]

Рис. 3.25. Диалоговое окноОформление окна

Подпункт Оформление текущего окна по прототипу (Set Current Window toPrototype) меняет установки активного окна на установки прототипа, а под-пункт Оформление всех окон по прототипу (Set All Windows to Prototype) вы-полняет ту же операцию над всеми окнами.

Подпункт Шрифты (Fonts) вызывает стандартное диалоговое окно Выборшрифта (Select Font) (рис. 3.26) для выбора используемых в окнах шрифтов.

I Выбор шрифта

^Начертание:..; : Еазмер;

1 обычный

курсивполужирныйполужирный курсив

".;•• Образец'-

d .

йаВЬйаОо

'• 1 ,: :•'•'•*'•

Рис. 3.26. Диалоговое окноВыбор шрифта

Page 249: Visual LISP и секреты адаптации AutoCAD

248 Visual LISP и секреты адаптации AutoCAD

Пункт Параметры среды (Environment Options) меню Сервис (Tools) имееттри подпункта:

П Общие параметры (General Options)

• Параметры форматирования Visual LISP (Visual LISP Format Options)

• Параметры разметки страницы (Page Setup Options)

Подпункт Общие параметры (General Options) вызывает диалоговое окноОбщие параметры (General Options), имеющее вкладки Общие (General)(рис. 3.27) и Диагностические (Diagnostic) (рис. 3.28), позволяющие менятьразличные настройки среды Visual LISP.

•Общие параметры

Общие, j Диагностические) . . .

.-ПараметрыРЕДАКТОРА: — — : • — : : ~, - — • - • • •: -

: & Резервное копирование редактируемого файла при первом, сохранении

.•Г" Резервное копирование, не переименование

& Группировать для отмены/возврата ..

г РАБОЧИЙ СТОЛ:—.; ; - :

\ Р" ^охранение настроек.окон редактора".

'••• Р" йвтосохранение при выхсие из приложения

:- SETQ для зарезервированных выражений-—~™; Г* Д р о з р а ч н ы й • • ' •..• • •- - •••"' '••

{ f Печать сообщения .. :

; & Подсказка для входа в цикл останова ••

• ^ Д щ и б к а : \ .-. • : ;• ••' .•• "^ .. '. ' ' " " -':У-'•;••••

ft АвтоактиеизацияIACAD '. •. •

'lrj'"''Sr'"Jl .Отмена

Рис. 3 - 2 7 . Диалоговое окноОбщие параметры, вкладкаОбщие

I Общие параметры

Общие Диагностические

Г* Печать результатов еёркнего уровня при загрузке

Г" Печать уведомляющего сообщения после загрузки

р ixo-BbieaaPRlNK в AutoCAD ;'.

Р^ Подробное изучение объектов рисунка :

р" Вез отладки верхнего уровня

^Задержка анимации: |500

ОХ.J .

Отмена Применять

Рис. 3 . 2 8 . Диалоговое окноОбщие параметры, вкладкаДиагностические

Подпункт Параметры форматирования Visual LISP (Visual LISP Format Op-tions) раскрывает диалоговое окно Опции форматирования (Format options)

Page 250: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 249

(рис. 3.29), управляющее установками форматирования для текстового ре-дактора Visual LISP.

| щ Опции форматирования

72Правая граница текста

Отступы для узкого стиля ]2

Максимальная длина строки при широком стиле J9

Отступ для комментариев с одной точкой с запятой ]40

Стипь закрывающихся скобок

*"* Закрывать на той же строке

*~ Закрывать на ноеой строке с внутренним отступом

(* Закрывать на новой строке с внешним отступом

(*? Вставка символов табуляции

V Сохранение параметров Форматирования в исходном Файле

V Вставлять комментарии после закрывающихся скобок

Префикс комментариев после закрывающих {конецскобок

Приблизительная дпина строки 1

!•? С сохранением перекодов на новую строку

Г" Разбить комментарии

Задание регистра для символов

Защищенные Незащищенные

^ Нет - ^ Нет

f Нижний регистр f Нижний регистр

*"* Верхний регистр ^ Верхний регистр

Стиль Форматирования длинный списков

*~" В одну колонку

С" В 2 колонки

*• В несколько колонок

^ До правой границы

Рис. 3 . 2 9 . Диалоговое окно О п ц и и ф о р м а т и р о в а н и я

Третий подпункт — Параметры разметки страницы (Page Setup Options)пункта Параметры среды (Environment Options) вызывает диалоговое окноПараметры страницы (Page Setup) (рис. 3.30) для операций вывода текстовна печать из среды Visual LISP.

|щПараметры страницы

Колонтитулы

Границы печати страницыНачало

Отмена

Справка |

С1 Дюймы

С" Миллиметры

Влево Вправо

НижняяГ053

Шрич»т

Рис. 3.30. Диалоговое окноПараметры страницы

Пункт Сохранить параметры (Save Settings) меню Сервис (Tools) позволяетсохранять настройки рабочего стола Visual LISP (последние открытые окна,их параметры и т. п.). Можно задать автоматическое сохранение настроек,установив соответствующие флажки в группе РАБОЧИЙ СТОЛ (DESKTOP)вкладки Общие (General) диалогового окна Общие параметры (GeneralOptions) (рис. 3.27).

Page 251: Visual LISP и секреты адаптации AutoCAD

250 Visual LISP и секреты адаптации AutoCAD

Если в среде Visual LISP активно окно с текстом редактируемой программы,то меню Сервис (Tools) (рис. 3.31) имеет следующие дополнительные пункты:

• Загрузить выделенный фрагмент (Load Selection)

• Загрузка текста в редактор (Load Text in Editor)

• Проверить выделенный фрагмент (Check Selection)

• Проверить текст в редакторе (Check Text in Editor)

• Форматировать во фрагменте (Format code in Selection)

• Форматировать код в редакторе (Format code in Editor)

• Инструменты интерфейса (Interface Tools)

Первые шесть из перечисленных пунктов позволяют загружать для выпол-нения, проверять или форматировать как текст программы, так и его выде-ленный фрагмент. Работа этих пунктов рассмотрена в разд. 3.3.2 и 3.4.1.

Пункт Инструменты интерфейса (Interface Tools) имеет два подпункта:

• Просмотр DCL из фрагмента (Preview DCL in Selection)

О Просмотр DCL из редактора (Preview DCL in Editor)

Эти подпункты позволяют загружать для выполнения редактируемый DCL-файл или его выделенный фрагмент.

Сервис Окно Справка . . . .-.'•.

Загрузить выделенный фрагмент :.• ••Qrt-Shift-E

Загрузка текста в редактор .у..1 „Ctrl-AH-E "" •..••

Проверить выделенный Фрагмент Ctrl-Shift-С

: Проверить текст в редакторе Qrl-Alt-C . .

Форматировать во Фрагменте Ctrl-Shift-F .Форматировать кеде редакторе Ctrl-Alt-F': •;..

Инструменты интерфейса ' *

Оформление окна • . • . , •

Параметры £реды • •

Сохранить параметры

Рис. 3 . 3 1 . Меню Сервис[второй вариант)

•Окно С п р а в к а • . • : . - ) _ • : • ^"._•-'••'.. ;•

:•.. : £ о р и э о н г а л ь > н р • :^:"1 :..:."ч..;•>'• • • я : ^ •;; -.1 " . вертикально. V ч..:\ .'••'- 'У:[.\ •••

Кзскадрм .'.•;• '...;, ;_J-y /.'••

' ; умирование-/;';:.;.; :;/;.АМ •'• •

у-.йрганизрвать;'. •^^'•••\\- :-;,"У\

•' Свернуть все ; : ' ; v-y/- .••':"' -:'''' .."•. : ^[поредочитэ значки'.. .;. ; : • .: •;..

.•Закрьгтьок'на,.;' -'У- ;.' " ;•.• ..'>

Активизировать AutoCAD ;

' ~ '• ъ ~"~ •"""'" : : '. ' т ~1 Т р а с с и р о в к а -•."••••' ;; • • •' • '

SKoHcoflbVisualLJSP у

•. aceddd.•••••" ":;;:/'";-.:'•.:: ..': -'•••••,

у" 4rcl.LSP " :

Рис. 3 . 3 2 . Меню О к н о

3.1.7. Меню ОкноМеню Окно (Window) (рис. 3.32) по структуре аналогично одноименномуменю в других приложениях Windows.

Оно позволяет управлять взаимным расположением нескольких одновре-менно открытых окон в среде Visual LISP. Пункт Активизировать AutoCAD

Page 252: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 251

(Activate AutoCAD) данного меню сворачивает окно Visual LISP для AutoCAD(Visual LISP for AutoCAD) и делает временно доступным основное окно сис-темы AutoCAD (например, для выполнения в рисунке каких-нибудь по-строений). В нижней части меню Окно (Window) приводится список откры-тых окон, и флажком помечено активное.

3.1.8. Меню СправкаПоследнее меню Справка (Help) (рис. 3.33) состоит из двух пунктов и вы-полняет справочные функции.

Справка ' "'•'

Справка по Visual LISP F1

Q программе VisualUSP Рис. 3.33. Меню Справка

3.2. Обзор панелейинструментов Visual LISPВ оболочку Visual LISP входят пять панелей инструментов:

• Стандартная (Standard)

• Поиск (Search)

• Сервис (Tools) (в плавающем положении она называется Инструменты(Tools), см. рис. 3.2)

• Отладка (Debug)

• Вид (View)

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

3.2.1. Панель инструментов СтандартнаяВ панель инструментов Стандартная (Standard) (рис. 3.34) входят следующиекнопки (слева направо):

О Новый файл (New file)

П Открыть файл (Open file)

• Сохранить файл (Save file)

П Печать (Print)

• Вырезать (Cut)

О Копировать (Сору)

Page 253: Visual LISP и секреты адаптации AutoCAD

252 Visual LISP и секреты адаптации AutoCAD

П Вставить (Paste)

• Отменить (Undo)

• Повторить (Redo)

П Дописать слово (Complete word)

О< . А*Рис. 3 . 3 4 . Панель инструментовСтандартная

Девять первых кнопок этой панели аналогичны одноименным кнопкам па-нели инструментов Стандартная (Standard) системы AutoCAD. Последняякнопка Дописать слово (Complete word) соответствует пункту Дописать сло-вом из списка (Complete Word by Apropos) из меню Поиск (Search), позво-ляющему закончить начатое слово элементом списка стандартных символов.

3.2.2. Панель инструментов ПоискПанель инструментов Поиск (Search) (рис. 3.35) выполняет функции, ана-логичные функциям меню Поиск (Search).

Jcar -, т , /w „ „ •„ П о и с к

Рис. 3 . 3 5 . Панель инструментов

В нее входят семь следующих кнопок:

• Найти (Find)

П Заменить (Replace)

О Поиск строки на панели инструментов (Find toolbar string)

• Закладка Вкл/Откл (Toggle bookmark)

П Следующая закладка (Next bookmark)

П Предыдущая закладка (Previous bookmark)

• Удаление всех закладок (Clear all bookmarks)

Назначение всех этих кнопок, кроме третьей, аналогично назначению соот-ветствующих пунктов и подпунктов меню Поиск (Search). Кнопка Поискстроки на панели инструментов (Find toolbar string) работает вместе с раскры-вающимся списком, находящимся в панели инструментов Поиск (Search),и выполняет поиск символа, имя которого выбрано в этом списке или вве-дено в список с клавиатуры.

3.2.3. Панель инструментов СервисПанель инструментов Сервис (Tools) (рис. 3.36) \кнопок:

П Загрузка активного окна редактирования (Load active edit window)

Панель инструментов Сервис (Tools) (рис. 3.36) имеет девять следующихкнопок:

Page 254: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 253

• Загрузка выделенного фрагмента (Load selection)

П Проверка содержимого окна редактора (Check edit window)

• Проверка выделенного фрагмента (Check selection)

D Форматирование содержимого окна редактирования (Format edit window)

• Форматирование выделенного фрагмента (Format selection)

• Закомментировать блок (Comment block)

• Раскомментировать блок (Uncomment block)

• Справка (Help)

п . о, П- <), Су ( М ~ *"> Г?!* 4. v v -та .ы — — w Рис. 3 . 3 6 . Панель инструментов Сервис

Первые шесть пунктов панели аналогичны первым шести пунктам менюСервис (Tools), если пользователь с помощью редактора работает с текстомпрограммы или ее фрагментом (см. рис. 3.31).

Кнопки Закомментировать блок (Comment block) и Раскомментировать блок(Uncomment block) позволяют легко вставлять (с помощью точек с запятой)или снимать комментарии в выделенных строках текста программы. КнопкаСправка (Help) служит для получения справочной информации.

3.2.4. Панель инструментов ОтладкаПанель инструментов Отладка (Debug) (рис. 3.37) имеет следующие кнопки:

• Шаг с заходом (Step into)

• Шаг с обходом (Step over)

П Шаг с выходом (Step out)

• Продолжить (Continue)

П Выйти (Quit)

• Сброс (Reset)

П Точка останова Вкл/Откл (Toggle breakpoint)

П Добавить контрольное значение (Add watch)

П Последний останов (Last break)

if it '•&•&& Л бхГ А ОРис. 3 . 3 7 . Панель инструментов Отладка

Кроме того, в процессе выполнения программы в отладочном режиме,с точками остановов, в панели появляется последняя кнопка (на рис. 3.37она показана, но в обычном режиме эта кнопка не отображается). Кнопка

Page 255: Visual LISP и секреты адаптации AutoCAD

254 Visual LISP и секреты адаптации AutoCAD

показывает, где находится курсор во время текущего останова (перед скоб-ками или после).

Режимы отладки программ рассмотрены в разд. 3.4.1.

3.2.5. Панель инструментов ВидВ панель инструментов Вид (View) (рис. 3.38) входят следующие кнопки:

О Активизация AutoCAD (Activate AutoCAD)

• Выбрать окно (Select window)

• Консоль Visual LISP (Visual LISP Console)

• Изучить (Inspect)

• Трассировка (Trace)

• Окно отладки символов (Symbol service)

• Справочный список (Apropos)

О Окно контрольных значений (Watch window)

Рис. 3.38. Панель инструментов Вид

Наименования кнопок говорят о том, что они выполняют операции, закреп-ленные за рассмотренными выше различными пунктами падающих меню:Режим AutoCAD (AutoCAD Mode) меню Сервис (Tools), выбор окна с по-мощью списка окон меню Окно (Window), Консоль LISP (LISP Console) ме-ню Вид (View), Изучить (Inspect) меню Вид (View), Стек трассировки (TraceStack) меню Вид (View), Инспектор символов (Symbol Service) меню Вид(View), Параметры справочного списка (Apropos Window) меню Вид (View),Окно контрольных значений (Watch Window) меню Вид (View).

3.3. Текстовый редактор среды Visual LISPВ среде Visual LISP с помощью пунктов Новый файл (New File) и Открытьфайл (Open File) меню Файл (File) можно создавать, открывать и редактиро-вать в своем окне текстовые файлы следующих типов:

• LISP-программы (с расширением lsp);

О DCL-файлы диалоговых окон (с расширением del);

П SQL-файлы операций с базами данных (с расширением sql);

О программы на языке C++ (с расширениями с, срр).

Включенный в состав среды текстовый редактор оказывает существеннуюпомощь в написании файлов этих типов, поскольку уже в процессе ввода

Page 256: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 255

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

3.3.1. Настройка текстового редактораВыбор настройки цветовой гаммы текстового редактора Visual LISP в соот-ветствии с типом файла можно сделать с помощью пункта Оформление окна(Window Attributes), подпункта Цвета синтаксических элементов (SyntaxColoring) из меню Сервис (Tools) (рис. 3.24). По умолчанию редактор на-строен на работу с текстами LISP-программ.

Цветовая гамма, обычно используемая для синтаксического анализа про-грамм на языке LISP, следующая:

• синий — зарезервированные символы AutoLISP (имена встроенных функ-ций и т. п.);

П фиолетовый — текстовые строки, обрамленные двойными кавычками;

• зеленый — целые и вещественные числа;

• фиолетовый (на сером фоне) — комментарии;

П красный — открывающие и закрывающие скобки;

• черный — прочие символы (переменные пользователя и др.).

На рис. 3.39 показано окно текстового редактора с участком текста LISP-программы, оформленное в стандартной цветовой гамме (темным фономотмечены комментарии).

При желании можно внести изменения в цветовую палитру с помощьюпункта Оформление окна (Window Attributes), подпункта Настроить текущее(Configure Current) меню Сервис (Tools) (см. рис. 3.25).

Пункт Параметры среды (Environment Options) меню Сервис (Tools) (см.разд. 3.1.6) тоже может помочь в организации большого количества удобствдля конкретного пользователя.

3.3.2. Средства текстового редактораВ тексте, редактируемом в среде Visual LISP, можно отмечать участки(блоки) текста. Это выполняется движением мыши по тексту с нажатой ле-вой кнопкой или клавиатурой с использованием прижатой клавиши <Shift>и перемещения курсора с помощью клавиш <Left>, <Right>, <Up>,<Down> — аналогично Microsoft Word.

Незаменимым средством быстрого комментирования выделенного участкатекста и снятия комментариев являются кнопки Закомментировать блок(Comment block) и Раскомментировать блок (Uncomment block) панели ин-струментов Сервис (Tools).

Page 257: Visual LISP и секреты адаптации AutoCAD

256 Visual LISP и секреты адаптации AutoCAD

О 3£айЛ Правке Поиск Йиа Проект Отладка £ее*мс QKHQ Справка

~- - - --- - f '•'• S*? ' ~^ . ,„. . '

*»** 1. Используются Файлы FflRf^UER.DWG, FSRM LEU.DWJ, ***** » к * r o H ^ s i m . & w G , r a R e s t i n . D W e » F O C K S J H I . D W G , r o c S H U . O H G , * * * *

* * * * F O R ^ S H U . D W G , F 0 R _ S H 2 K 0 M G . ~ * * * *

ж*** 2. 1ОЯ1ЙИНЗ жирных линий - в.а пн. **«*

uecho х1 х? хЗ х4 shlan yni setq uecho gpf'j<n* " ' . .'sptu (n •';si?tq aa ->fi-*-d 1 enuacd shlan ' ) ;<s<*tq a l i s t '

(set'tj g 1 d i dp ch > 1 i kr i lang tFanii polzoi i ^рдзработдлFam2 ;проверилfan3 ;нач.грктй|)л

fam5 ;норпоконтролерFan6 ;угаердилo t r tab1 : tab2 t tab3 и tal i4 ;

; заг руэка с тиля Кош: гректорский под Windos (KU?

,1.1 " " • " " "Правка: F:/Pakt15/IVDrfoim.lsp (Visud LISP]

-1в|х|

-

>гL0V001 С 00001

Рис. 3.39. Диалоговое окно текстового редактора

Синтаксическая проверка текста всего открытого файла или выделенногофрагмента может быть выполнена с помощью пунктов Проверить выделен-ный фрагмент (Check Selection) и Проверить текст в редакторе (Check Text inEditor) меню Сервис (Tools) или аналогичных кнопок в панели Сервис(Tools).

Для проверки соответствия закрывающих и открывающих скобок хорошопользоваться пунктом Проверка скобок (Parentheses Matching) из менюПравка (Edit).

При перезаписи файла с расширением lsp Visual LISP создает копию преды-дущего состояния файла (копии присваивается расширение _ls).

3.4. Разработка приложенийС помощью Visual LISP удобно писать не отдельные программы, а целыеприложения. Приложения только из LSP-файлов (FAS-приложения) можносоздавать с помощью механизма проектов, рассмотренного в разд. 3.4.2. Ес-ли в приложение необходимо включить DCL-файлы диалоговых окон иливспомогательные текстовые файлы, то следует пользоваться инструментомразработки сложных приложений (VLX-приложений, см. разд. 3.4.3). Отла-дочные возможности изучаются в разд. 3.4.1.

Page 258: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 257

3.4.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). Нарис. 3.40 показано сообщение, генерируемое Visual LISP о загрузке файла.

Возможно пошаговое выполнение программы, когда пользователь пооче-редно выделяет и загружает фрагменты текста (используется пункт Загрузитьвыделенный фрагмент (Load Selection) меню Сервис (Tools) или соответст-вующая кнопка панели инструментов Сервис (Tools)).

В окне Консоль Visual LISP (Visual LISP Console) в качестве приглашенияпользователя к вводу применяются символы _$. Так, например, если на пре-дыдущем шаге пользователь загрузил файл rcl.lsp с одноименной програм-мой, то он может выполнить ее, введя в окне консоли(rcl)

Visual LISP выполнит программу и, если в ней нет ошибок, выведет резуль-тат на консоль (рис. 3.41).

Прямо с консоли можно читать значения глобальных переменных. Дляэтого нужно в ответ на приглашение ввести с консоли имя переменной.Visual LISP выведет ее текущее значение (на рис. 3.42 показано значениепеременной l i s t r a d ) .

с Замечание

В среде Visual LISP при чтении значения переменной не требуется ввод передименем переменной восклицательного знака, как это необходимо в системеAutoCAD (см. разд. 2.1.2).

Форма загружен из JKeditor "D:/flutoCflD2eoe/r-cl.LSP">

Рис. 3 . 4 0 . Сообщение о загрузке файла в окне Консоль Visual LISP

9 Зак. 155

Page 259: Visual LISP и секреты адаптации AutoCAD

258 Visual LISP и секреты адаптации AutoCAD

ШКонсояь Visual LISP_$; 1 Форма загружен из ( « e d i t o r "D:/flutoCflD20BB/i-cl.LSP">

L $ O'c l )

Нет кругов на слое HOLES.

J

Рис. 3 . 4 1 . Сообщения о выполнении программы в окне Консоль Visual LISP

I S3 Консоль Visual LISP_$; 1 Форма загружен из ( « e d i t o r •1D:/ftutoCHD200e/rcl.LSP">

L $ ( r c l )((323.111 80.71*76 В.в) (223.09 1711.559 в.В))

§_$ l i s t _ r a d(79.3076 29.6181)

_ $ I

Рис. 3 . 4 2 . Чтение значения глобальной переменной в окне Консоль Visual LISP

При отладке программы удобно следить за значениями выбранных пере-менных. Для этого используются пункты Изучить (Inspect), Инспектор сим-волов (Symbol Service), Окно контрольных символов (Watch Window), рас-смотренные при изучении меню Вид (View). Вызов при помощи этих пунк-тов соответствующих окон (см. рис. 3.8, 3.12 и 3.13) показывает текущиезначения выбранных переменных или выражений. Содержимое этих оконможет быть скопировано в окно Трассировка (Trace) для последующегообобщения.

При наличии ошибок следует также пользоваться пунктами Стек трассиров-ки (Trace Stack) и Поиск ошибок (Error Trace), выводящими соответствую-щие одноименные окна (см. рис. 3.9 и 3.10).

Действенным средством отладки является расстановка в программе точек еепрерывания (останова). Это выполняется с помощью пункта Точка остановаВкл/Откл (Toggle Breakpoint) меню Отладка (Debug) или с помощью кнопкиТочка останова Вкл/Откл (Toggle breakpoint) панели инструментов Отладка(Debug). В этом случае при выполнении программа останавливается, дойдядо точки прерывания, и ждет указания от пользователя о возможном вари-анте продолжения работы. Для продолжения есть пункты Шаг с заходом(Step Into), Шаг с обходом (Step Over), Шаг с выходом (Step Out), Продол-жить (Continue), Сброс до верхнего уровня (Reset to Top Level), Выход из те-

Page 260: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 259

кущего уровня (Quit Current Level) в меню Отладка (Debug) или аналогичныеим кнопки на панели инструментов Отладка (Debug).

Особенно эффективно сочетание точек прерывания с открытым окном кон-трольных значений (см. рис. 3.13). Выполняя свою программу по частям, выбудете следить за тем, как при этом изменяются значения контрольных пе-ременных.

Пункт Анимация (Animation) меню Отладка (Debug) дает возможность сле-дить за ходом выполнения программы по исходному тексту, т. к. Visual LISPпоочередно выделяет те выражения программы, которые обрабатываютсяв текущий момент времени.

3.4.2. ПроектыНесколько LISP-программ, выполняемых совместно, можно объединять впроекты. Каждый такой проект является самостоятельным приложением,который может работать в исходных текстах или в компилированных файлахс расширением fas. Кроме того, все файлы проекта можно скомпилировать вединый файл FAS-приложения, что даст преимущества по скорости загруз-ки и выполнения.

Операции с проектами собраны в меню Проект (Project). Для создания но-вого проекта используется пункт Новый проект (New Project), который от-крывает диалоговое окно Новый проект... (New Project) (рис. 3.43).

Новый проект.

Папка | _ j AutoCAD2000 Zl._J Data Links_LlDr,_!E>pie._ll Font;JHelp' 1 migi allot i

_ll Plot Styles_J Plotters

1 SampleL_ll Support

1 Template' 1 Textures

_1] Tulonal*\ icl.pij

Имя Файла Сохранить

Хип файла файлы проектов VL Отмена7

Рис. 3.43. Диалоговое окноНовый проект...

В этом окне нужно ввести имя файла с данными о проекте. Файл образуетсяавтоматически, в него заносится информация о входящих в него программахи режимах компиляции. Расширение у файла проекта prj. После ввода име-ни проекта появляется окно Свойства проекта (Object Properties) (рис. 3.44).

Диалоговое окно имеет две вкладки: Файлы проекта (Project Files) и Пара-метры сборки (Build Options). На первой из них нужно в поле Искать в(Look in) выбрать папку с LSP-файлами и в появившемся списке окна обна-руженных файлов с помощью кнопки > перенести нужные имена в правую

Page 261: Visual LISP и секреты адаптации AutoCAD

260 Visual LISP и секреты адаптации AutoCAD

часть. Если файлы проекта находятся в разных папках, то можно поменятьимя папки и выбрать из нее следующую часть включаемых файлов. Дляфайлов, включенных из разных папок, с помощью щелчка правой кнопкоймыши по имени файла можно вызвать контекстное меню, где выбор пунктаИмена и размеры файлов (Log filenames and size) выводит в нижнюю частьдиалогового окна для каждого выделенного имени его полное имя и размер(рис. 3.45).

I Свойстве проекта

Ф зйлы проекта | Параметры сбор» и |

Начальная палка D /iutoD>D2000

Искать в

I J

Быорать / Очистить есе

_ J

Начало

Вверх

Вниз

Нижняя

Выбрслъ / Очистить все

OK I Отмена I Применить j

Рис. 3 . 4 4 . Диалоговое окноСвойства проекта, вкладкаФайлы проекта

I Свойства проекта

Файль! проеитэ | Параметры сборки |

Начальная папка D УАи1оСАй2000

Искать в

Fadid

Выбрать 1 Очистить все ]

2}

Вь|брать / Очистить все j

OK Отмена j Применить

Рис. 3 . 4 5 . Полныеимена и размеры файлов,включенных в проект

Page 262: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 261

По окончании формирования полного списка компонентов нового проектаможно их упорядочить с помощью кнопок Начало (Тор), Вверх (Up), Вниз(Down), Нижняя (Bottom). Чаще всего такое упорядочение не нужно, ноиногда оно требуется (например, если есть специальные файлы инициали-зации, то их следует вынести наверх, чтобы они загружались первыми).

Вкладка Параметры сборки (Build Options) окна Свойства проекта (ObjectProperties) (рис. 3.46) устанавливает режимы компиляции и связи. В част-ности, поле Режим слияния файлов (Merge files mode)" устанавливает, станутли FAS-файлы создаваться для каждого LSP-файла отдельно или проект бу-дет компилироваться в единый файл (FAS-приложение). Здесь же можнозадать папки для размещения FAS-файлов и временных файлов.

1 Свойства проекта

Файлы проекта Параметры сборки j

Режим компиляции

<** Опхимизироеать

Режим слияния Файлов

*•" Отдельные модули для файлов

*"" £диный модуль для все*

Режим связи

С

Гг

Режим сообщений

*"* фатальные ошибки

(* Ощибки и предупреждения

<"* Полныеотчеты

Папка Fas-файлов

IПапка Tmp-Файлов

I

• J

Редактор Глобальный Объявлений I

(Ж I Отмена 1 Применить I

Рис. 3 . 4 6 . Диалоговое окноСвойства проекта,вкладкаПараметры сборки

Окончание работы в окне завершается щелчком по кнопке Применить(Apply). Кнопка OK (OK) закрывает диалоговое окно, после чего на экранепоявляется окно открытого проекта. На рис. 3.47 показан пример проектаnewp из трех файлов.

Рис. 3 . 4 7 . Окно проекта

Page 263: Visual LISP и секреты адаптации AutoCAD

262 Visual LISP и секреты адаптации AutoCAD

В верхней части этого окна имеются пять кнопок операций с проектом(слева направо):

• Свойства проекта (Project Properties)

П Загрузка FAS-файлов проекта (Load Project FAS)

• Загрузка исходных файлов (Load Source Files)

• Сборка FAS-файла проекта (Build Project FAS)

• Перекомпиляция FAS-файла проекта (Rebuild Project FAS)

Наименования кнопок аналогичны наименованиям пунктов меню Проект(Project). В созданные ранее проекты можно вносить изменения, их можнозагружать как в компилированном виде, так и в виде исходных текстов.

3.4.3. VLX-приложенияДругой вид приложений — это VLX-приложения, в состав которых могутвходить:

• LSP-файлы;

• DCL-файлы диалоговых окон (о проектировании диалоговых окон см.главу 5);

П FAS-файлы (компилированные файлы LISP-программ или проектов);

• DVB-файлы (приложения, созданные в среде Visual Basic for Applications);

• ТХТ-файлы (текстовые файлы).

Все включаемые компоненты собираются в единый файл приложения срасширением vlx. Свойства приложения сохраняются в одноименном файлес расширением prv, который используется для повторной сборки прило-жения.

Для создания нового сложного приложения следует воспользоваться пунк-том Собрать приложение (Make Application) в меню Файл (File). Пункт име-ет следующие подпункты:

• Мастер новых приложений (New Application Wizard)

О Свойства имеющихся приложений (Existing Application Properties)

О Собрать приложение (Make Application)

П Перекомпилировать приложение (Rebuild Application)

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

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

Page 264: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 263

ять только из файлов с LISP-программами (аналогично FAS-приложению),а сложное — может включать DCL-файлы, DVB-файлы и др.

|Щ Режим Мастера

Выберите режим Мастера

Вы можете выбрать простой и писложный режим Мастера приложенийВ простом режиме 6ya<jr запрошенытолько исходные LlSP-Файаыи имя для создаваемого приложенияДля бкпюченич в приложениедополнительных Файлов ресурсов(например. Фай нов del или сЬ/Ыилидпя настройки параметровкомпиляции следует выбратьС 'ЮЖНЫЙ р&ЖИМ

(* Простой

f* Сло «кный

Далее > | Отмена Рис. 3 . 4 8 . Диалоговое окноРежим Мастера

Разберем вариант создания сложного приложения. В случае выбора опцииСложный (Expert) и щелчка по кнопке Далее (Next) открывается диалоговоеокно Папка приложения (Application Directory) (рис. 3.49).

\ЩПапка приложения

г Расположение приложения - ••-•••

; Выберите расположение и имя= вашего приложения. Помимоi компилированного приложения,: которое имеет расширение :vlx,; создается Файл .prv, содержащий; параметры, заданные в Мастере. .] Этот Файл 6\)&&т использован при; дальнейшей перекомпиляции.\ приложения.

Расположение приложения •

Обзор...

Имя приложения

Целевой Файл-

< Назад I Далее > J Отмена Рис. 3 . 4 9 . Диалоговое окноПапка приложения

Здесь нужно заполнить поле Имя приложения (Application Name) (областьЦелевой файл (Target File) при этом сформирует имя нового приложенияс расширением vlx), а в поле Расположение приложения (Application Location)ввести полное имя папки, в которую будут записаны файл приложения срасширением vlx и файл свойств приложения с расширением prv (основнаячасть имени этого файла будет взята из имени приложения). Папку можновыбрать также с помощью кнопки Обзор (Browse). После задания парамет-ров и нажатия на кнопку Далее (Next) осуществляется переход в окно Па-раметры приложения (Application Options) (рис. 3.50).

Page 265: Visual LISP и секреты адаптации AutoCAD

264 Visual LISP и секреты адаптации AutoCAD

| Щ Параметры приложений

; Выберите параметры приложения ;: На данном этапе укаж1?ге, будет '.\ ли использовать ваше приложение;:- именное пространство по. ;; умолчанию (т.е. 6y$ijr ли имена ;; Функций и глобальных =: переменных этого приложенияf являться в каждом рисунке'. частью основной среды LISP). ]

При выборе отдельного • •• именного пространства только : :. некоторые Функции вашего '=i приложения будут доступны в \; основной среде LISP. . . ;

Г"' Отдельное именное пространство

Далее > | Отмена [ Рис. 3.50. Диалоговое окноПараметры приложения

По умолчанию в данном окне флажок Отдельное именное пространство (Sepa-rate Namespace) не установлен. Это означает, что функции и глобальные пе-ременные вашего приложения будут доступны другим приложениям. Есливаше приложение с другими ничем не связано, то при создании VLX-при-ложения следует установить флажок, чтобы снять проблемы совместимости.

С ЗамечаниеДаже если VLX-приложение создано с отдельным именным пространством, со-храняется возможность экспортировать в пространство документа его функциис помощью функции v i-doc-export и его глобальные переменные — с помощьюфункции v l-doc-set. Имеется также возможность импорта функций и переменныхиз документа внутрь именного пространства VLX-приложения (см. разд. 2.17.32).

При наличии флажка в поле Отдельное именное пространство (Separate Name-space) пользователю доступно поле Поддержка ActiveX (ActiveX Support) (noумолчанию поддержка включена, но от нее при необходимости можно отка-заться).

Следующее окно (рис. 3.51) — LISP-файлы для сборки приложения (LISPFiles to Include) — дает возможность перечислить все файлы с расширения-ми lsp (исходные тексты), fas (компилированные файлы) и prv (файлы про-ектов), которые нужно интегрировать в создаваемое приложение.

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

Следующее окно (рис. 3.52) — Файлы ресурсов (Resource Files to Include) —не появится, если вы выбрали режим простого приложения (рис. 3.48).

Page 266: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 265

| m LISP файлы для сборки приложения

•Выберите Файлы

Выберите LISP-файлы длясборки приложения. Можно

: использовать исходные Файлы! AutoUSP (.Up].- компилированные USРфайлы: '(.fas) и Файлы проектов Visual• LISP (prv),в любых. комбинациях.

Добавить...

Удалить

< Назад Далее > Отмена

Рис. 3 . 5 1 . Диалоговое окноLISP-файлы для сборкиприложения

|Щ Файлы ресурсов

: Дополнительные ресурсы ;

; Выберите дополнительные Файлы • ;\ ресурсов, например файлы Visual ;: Basic foi Application {.dvb] или Файлы •; Dialog Control Language [.del]. Эти .;. Файлы ЯВЛЙЮТСЙ вспомогательными ,| для вашего приложения и могут быть!: загружены из полученной; программы. :

;. '•• - '''- Зобавить.г |j|ffiy]jfltrffifl!||l

'• ' Мдалить |

< Назад j | Далее > | Отмена | Рис. 3 . 5 2 . Диалоговое окноФайлы ресурсов

В качестве дополнительных ресурсов к вашему приложению могут быть до-бавлены элементы, перечисленные в раскрывающемся списке (три первыхтипа могли быть выбраны в предыдущем окне):

• Исходные LISP-файлы (LISP source files)

О Скомпилированные LISP-файлы (Compiled LISP files)

• Файлы проектов Visual LISP (Visual LISP project files)

• DCL-файлы (DCL files)

• DVB-файлы (DVB files)

• Текстовые файлы (Text files)

DCL-файлы — это файлы диалоговых окон, структура которых изучается вглаве 5. DVB-файлы — это файлы приложений, написанных на языке VisualBasic for Applications (создание таких приложений является темой для от-дельной книги). Текстовые файлы — это любые текстовые файлы с расши-рением txt, в которых вы храните некоторую дополнительную информациюи которую приложению в определенный момент нужно будет прочитать.

Page 267: Visual LISP и секреты адаптации AutoCAD

266 Visual LISP и секреты адаптации AutoCAD

После задания всех дополнительных ресурсов происходит переход в очеред-ное окно — Параметры компиляции приложения (Application CompilationOptions) (рис. 3.53).

\Щ Параметры компиляции приложения

Параметры компиляции :

• Выберите режим компиляцииI приложения. Для большинства ;•• приложений можно использовать; стандартный режим. . ;

: Оптимизированный режим удаляет .• символы внутренний функций и •: переменные. Режим связывания; позволяет оптимизировать скоростьi работы программы, заменяя ссылки;:I на имена Функций прямыми ••i с с ы л к а м и н а т е л а . \: СКОМПИЛИрОВаННЫХ ФУНКЦИЙ. :

(* Стандартная

Г" Оптимизация и Связывание

< Назад •[! Далее >. | Отмена

Рис. 3.53. Диалоговое окноПараметры компиляцииприложения

В этом окне нужно выбрать режим компиляции Стандартная (Standard) илиОптимизация и Связывание (Optimize and Link). Оптимизация уменьшаетразмер объектного кода и время загрузки приложения, но при неправиль-ном использовании зарезервированных символов может привести к непра-вильной работе приложения и системы AutoCAD.

Последнее окно, в которое можно попасть с помощью мастера создания но-вого приложения, — это диалоговое окно Просмотр параметров/Сборка при-ложения (Review Selections/Build Application) (рис. 3.54).

I Щ Просмотр параметров / Сборка приложения

г Просмотр параметров и сборка - ~ :

I На последнем этапе вы можете j.1 просмотреть заданные параметры и i; завершить сборку приложения. Visual :

• LISP сохраняет настройки в Файле 1; проекта приложения f.PRV). В 'i последствии с помошью.этого Файла ;j можно перекомпилировать или j

изменить приложение с помощью :

: Файла сценария сборки ;|. приложения -

Собрать приложение

.< .Назад |[ Завершить |

Рис. 3,54. Диалоговое окноПросмотр параметров/Сборка приложения

Если в данном окне сохранить флажок Собрать приложение (Build Appli-cation) и щелкнуть по кнопке Завершить (Finish), то Visual LISP создастфайлы приложения (с расширением vlx) и свойств приложения (с расшире-нием prv). Если флажок сбросить и нажать на кнопку Завершить (Finish), тотогда будет создан только PRV-файл, по которому можно в дальнейшем со-

Page 268: Visual LISP и секреты адаптации AutoCAD

Глава 3. Среда Visual LISP 267

брать приложение. Для этого нужно будет воспользоваться подпунктом Со-брать приложение (Make Application) одноименного пункта меню Файл (File).

Подпункт Свойства имеющихся приложений (Existing Application Properties)позволяет просмотреть и изменить свойства или состав приложения, а под-пункт Перекомпилировать приложение (Rebuild Application) — перекомпили-ровать приложение, если изменились какие-то его компоненты (DCL-файлы, LSP-файлы и т. д.).

3.4.4. Загрузка приложенийЗагрузить в среде Visual LISP собранное приложение можно с консоли припомощи функции AutoLISP load или пункта Загрузить файл (Load File) ме-ню Файл (File).

Если приложение нужно загрузить в сеансе AutoCAD без среды Visual LISP,то используются либо функция load, либо пункт AutoLISP, подпункт За-грузить (Load) меню Сервис (Tools) системы AutoCAD, либо пункт Прило-жения (Load Application) того же меню, которые открывают диалоговое окноЗагрузка/выгрузка приложений (Load/Unload Applications) (рис. 3.55).

Загрчзиа/выгрчзка приложений ШлШПапы: | _J Acad2000 Eng

1) Data Link*1)0 ivllEvpiet-,_J Fonts_IHelp

1 migiation_| Plot Styles<1 |

_l Plottersl l Sample_J Support

I Template_ll Textuies

1 Tutonaii Пользовательские Файлы R14

Ёаа«K>a c i

К а к

К, ас;

^acb

Хнп файлоь [прило+^ния AutoCAD (' atx " l;p ' d\ b," db1 j j

Загваженные приложения \ Протокол | ' (7 Добавить в протокол

Файп l Путь"

ACDIM.ARX D:\ACAD2000 ENG\ACEPLOTX.... D:SACAD2000ENG4

Аето загрузка

РИС. 3.55. Диалоговое окно Загрузка/выгрузка приложений

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

Page 269: Visual LISP и секреты адаптации AutoCAD

268 Visual LISP и секреты адаптации AutoCAD

вить соответствующую строку на языке AutoLISP в файлы acad.lsp илиacaddoc.lsp, например:(load "rcl.vlx")

Ваше приложение с именем rcl.vlx будет загружаться при загрузке того фай-ла (acad.lsp или acaddoc.lsp), в который вы добавили эту строку. Файлacaddoc.lsp автоматически загружается при открытии каждого нового рисун-ка (для AutoCAD рисунки являются документами), а файл acad.lsp — толькопри начальной загрузке AutoCAD. Чтобы у системы AutoCAD был доступк вашим файлам acad.lsp и acaddoc.lsp, пути к ним должны быть внесены впути доступа к файлам поддержки (см. разд. 1.3), либо файлы должны раз-мещаться в рабочей папке AutoCAD, которая указана в настройке ярлыкаAutoCAD на рабочем столе операционной системы Windows (см. разд. 1.4).

Если вам нужно, чтобы приложение не только автоматически загружалось,но и автоматически выполнялось, добавьте в файл acad.lsp или acaddoc.lspеще строку обращения к головной функции вашего приложения, например:(rcl)

Другой вариант автоматической загрузки — использовать функцию autoload(см. разд. 2.17).

Самый удобный способ автозагрузки — внести имена приложений в специ-альный портфель. В диалоговом окне Загрузка/выгрузка приложений (Load/Un-load Applications), приведенном на рис. 3.55, в правом нижнем углу есть об-ласть Автозагрузка (Startup Suite), которую можно назвать портфелем авто-загрузки. Если щелкнуть по кнопке Приложения (Contents), то откроетсядиалоговое окно Автозагрузка (Startup Suite), показанное на рис. 3.56.

В этом окне с помощью кнопки Добавить (Add) можно добавлять в списокавтозагрузки имена файлов приложений, которые будут автоматически за-пускаться при загрузке системы AutoCAD. Кнопкой Исключить (Remove)можно удалять отмеченные файлы из списка автозагрузки.

IJV Автозагрузка

Список приложений.

Файл

id-w fas'fw d fa*

ПсЦЪF\PaH15\Fonts\F\Pakt15\Fonls\

Добавить... j jifii nij;:i!ivb j

" l ! § P j | j |

Закрыть I Справка Рис. 3 . 5 6 . Диалоговое окноАвтозагрузка

Page 270: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 4

Меню

Такие элементы пользовательского интерфейса системы AutoCAD, как па-дающие меню, экранные меню, панели инструментов, контекстные менюобразуют единую управляемую совокупность — меню. В данной главе рас-сматриваются вопросы адаптации существующих меню, создания новых ме-ню, изменения функций элементов меню.

4.1. Файлы менюМеню порождается файлами с четырьмя расширениями:

• mnu — файл шаблона меню;

П nine — файл компилированного меню;

П mnr — файл ресурсов меню (содержит пиктограммы кнопок панелей ин-струментов);

• mns — файл текстовой части меню.

Примером таких файлов являются файлы acad.mnu, acad.mnc, acad.mnr иacad.mns, расположенные в папке Support программного обеспечения систе-мы AutoCAD 2000.

Начиная сеанс редактирования, система AutoCAD загружает базовое(основное) меню, используя по умолчанию файл компилированного менюacad.mnc. В той же папке должны находиться и файлы acad.mnr, acad.mns.Наличие файла acad.mnu при этом не требуется.

Если AutoCAD не обнаруживает файлов acad.mnc, acad.mnr и acad.mns, тоон ищет текстовый файл шаблона acad.mnu, по которому генерирует одно-именные файлы с расширениями nine, mnr и mns. В приложении 4 приведе-ны фрагменты стандартного файла acad.mnu русскоязычной версии системыAutoCAD.

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

Page 271: Visual LISP и секреты адаптации AutoCAD

270 Visual LISP и секреты адаптации AutoCAD

Поскольку файлы меню с расширениями mnc, mnr и mns обычно использу-ются только одновременно, то будем называть их тройкой файлов меню(например, тройка меню acad — это файлы acad.mnc, acad.mnr и acad.mns).

Даже если вы работаете только со стандартным меню acad системыAutoCAD, то оно все время меняется. В сеансе редактирования вы модифи-цируете состояние, например, панелей инструментов, их количество и по-ложение. Часть этих изменений после выхода из AutoCAD сохраняется втройке файлов меню acad, а часть (например, координаты положения пане-лей) — в реестре Windows. Система AutoCAD не изменяет файл шаблонаменю, поэтому его можно использовать для загрузки в случае, когда необхо-димо восстановить первоначальное состояние всего меню.

4.1.1. Загрузка базового менюВ качестве базового меню пользователь может загружать не только стан-дартное меню acad, но и свое меню, о структуре и способах создания кото-рого речь пойдет в данной главе ниже. Загружаемое меню должно бытьпредставлено либо тройкой файлов, либо одним файлом шаблона, по кото-рому генерируются другие три. После загрузки нового базового меню удаля-ется не только предыдущее базовое меню, но и все фрагментные меню (см.разд. 4.1.2), которые в этот момент были загружены.

Загрузка базового меню выполняется с помощью команды МЕНЮ (MENU),которая вызывает диалоговое окно Выбор файла меню (Select Menu File),приведенное на рис. 4.1.

По умолчанию окно предлагает имя загруженного в данный момент файлабазового меню с расширением mnc. Если щелкнуть мышью по списку Типфайлов (Files of type), то в нем раскроются две строки:

О Файлы меню (*.mnc, .*mns) (Menu Files (*.mnc, *.mns))

• Шаблоны меню (*.mnu) (Menu Template (*.mnu))

Вы можете выбрать в качестве варианта продолжения работы или загрузкукомпилированного меню, или загрузку шаблона меню и указать в диалого-вом окне имя файла, который будет загружен. Если вы выбираете вариантзагрузки шаблона меню (т. е. файла с расширением mnu), то система вы-полнит компиляцию этого меню и заново создаст тройку файлов. Такойспособ удобен, например, при внесении изменений в используемое меню.

На рис. 4.2 показан внешний вид рабочего окна системы AutoCAD с загру-женным в качестве базового стандартным меню системы, без фрагментныхменю (например, без падающего меню Express). При этом видны экранноеменю, расположенное в правой части, а также панели инструментов и стро-ка падающих меню.

Page 272: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 271

Выбор Файла меню

Папка: | _ j Support Л1ЙГ.J J Batchplt

_| Legacy

acad) acad

я Файла: [acad

Хип файлов: |Файлы меню (".mnc .mns)

Рис. 4 . 1 . Диалоговое окно Выбор файла меню

A AutoCAD 2000 - НЕ ДЛЯ ПЕРЕПРОДАЖИ - IDiawingi]

£Р Файл Правка Внр, Вставка Формат Сервис Риисьоние Размеры Peflat-т Qrno Справка

D Е5 У ? Q? Q, «г В if и ?

sa I J J *• с5и о |ВПиСЛ0Ю J p Послою d l - Поспою

DD

Г О0 П

О ^ '

а г

А с/

Поспою

^ 3 AutoCAD

ФАЙЛПРАВКАВИД!ВИД 2ВСТАВКАФОРМАТСЕРВИС 1СЕРВИС гРИСУЙ 1

I РИСУЙ 2—' РАЗМЕРЫ

РЕДАКТ1РЕДАКТ 2

СПРАВКА

• П СРЕДСТВА

.и/Утилиты пеню AutoCAD загружены

|Комэнда

411.5241.58 0391.00000 ШАГ СЕТКА ОРТО 0ТСЛ0ЛЯР|ПРИВЯЗМк ОТС-ПРИВ ВЕС|МОДЕГ

Рис. 4.2. Рабочее окно системы AutoCAD 2000 без фрагментных меню

4.1.2. Загрузка фрагментного менюВ файлах меню обязательно есть независимые части, называемые группамименю. Так, например, стандартное меню системы AutoCAD имеет однугруппу с именем ACAD, которую можно назвать базовой группой (о том, ка-

Page 273: Visual LISP и секреты адаптации AutoCAD

272 Visual LISP и секреты адаптации AutoCAD

ким образом в файле шаблона меню группы разделяются между собой, ска-зано в разд. 4.2). Таким образом, один файл с расширением mnu (и соответ-ствующая ему тройка файлов меню) могут с помощью групп объединять всебе несколько меню.

Для загрузки файлов фрагментных (partial) меню служат командаМЕНЮЗАГР (MENULOAD) и пункт Адаптация меню (Customize Menus)падающего меню Сервис (Tools), которые вызывают диалоговое окно Адап-тация меню (Menu Customization), приведенное на рис. 4.3.

: Группы меню I Строка меню |

Группы меню:

Г~ Заменить все

Обзор...

Рис. 4.3. Диалоговое окно Адаптация меню, вкладка Группы меню

Диалоговое окно имеет две вкладки:

• Группы меню (Menu Groups)

О Строка меню (Menu Bar)

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

На рис. 4.3 представлен вариант окна, когда в системе AutoCAD загруженотолько стандартное меню acad. Соответствующее ему имя группы (ACAD)видно в области Группы меню (Menu Groups).

Page 274: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 273

Для того чтобы с помощью диалогового окна Адаптация меню (MenuCustomization) загрузить фрагментное меню acetmain, следует щелкнуть покнопке Обзор (Browse) и в открывшемся диалоговом окне Выбор файла ме-ню (Select Menu File) выбрать файл acetmain.mnc, который расположен впапке Express программного обеспечения системы AutoCAD 2000. Нажав впоследнем окне кнопку Открыть (Open), вы снова окажетесь на вкладкеГруппы меню (Menu Groups) диалогового окна Адаптация меню (MenuCustomization), однако в ней будет заполнено поле Имя файла (File Name), вкотором будет указано полное имя файла acetmain.nine.

Воспользовавшись теперь кнопкой Загрузить (Load), вы получите изменениев области Группы меню (Menu Groups), в которой появится имя группыEXPRESS. Это означает, что группа меню EXPRESS загружена в память ри-сунка, и ее элементы можно использовать (например, для добавления заго-ловка Express в строку падающих меню — см. разд.4.2.1).

Если вам нужно выгрузить из графического интерфейса группу меню (и,следовательно, все ее падающие меню и другие элементы), то вы можетевоспользоваться кнопкой Выгрузить (Unload) на вкладке Группы меню(Menu Groups).

Команда МЕНЮВЫГР (MENUUNLOAD), как и команда МЕНЮЗАГР(MENULOAD), тоже открывает диалоговое окно Адаптация меню (MenuCustomization), в котором вы можете выполнять не только выгрузку группменю, но и загрузку файлов меню. Разница между командами возникаеттолько тогда, когда значение системной переменной FILEDIA равно 0(обычное значение — 1). Тогда обе команды работают в режиме команднойстроки (без диалогового окна), задают разные запросы и, соответственно,загружают файлы меню (команда МЕНЮЗАГР (MENULOAD)) или выгру-жают группы меню (команда МЕНЮВЫГР (MENUUNLOAD)).

Установленный флажок Заменить все (Replace All) на вкладке Группы меню(Menu Groups) позволяет загрузить файл с новыми группами меню, удаливпри этом все ранее загруженные (аналогично команде МЕНЮ (MENU)).

4.2. Разделы менюФайл шаблона меню (а, следовательно, и соответствующая ему тройка фай-лов меню) внутри делится на группы, в каждой из которых могут быть сле-дующие разделы:

• BUTTONS — кнопочные меню;

• AUX — дополнительные кнопочные меню;

• POP — контекстные и падающие меню;

П TOOLBARS — панели инструментов;

Page 275: Visual LISP и секреты адаптации AutoCAD

274 Visual LISP и секреты адаптации AutoCAD

П IMAGE — графические меню со слайдами;

• SCREEN — экранные меню;

П TABLET — планшетное меню;

• HELPSTRINGS — строки подсказок;

П ACCELERATORS — горячие клавиши.

Разделы BUTTONS, AUX, POP и TABLET имеют еще в конце названия но-мер (например, BUTTONS2, РОРО, РОР12, AUX1), в то время как осталь-ные разделы номеров не содержат.

Имя группы меню оформляется в файле шаблона меню строкой с префик-сом ***MENUGROUP=, например:***MENUGROUP=EXPRESS

После этой строки могут идти только комментарии (строки, начинающиесяс символов //, являются комментариями) или имя раздела меню.

Имя раздела меню также имеет префикс из трех звездочек и занимает целуюстроку, например:***BUTTONS1

***РОР0

***РОР500

***HELPSTRINGS

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

В приложении 4 приведены выдержки из файла acad.mnu, являющегося шаб-лоном стандартного меню системы AutoCAD (в этом файле одна группа ме-ню - ACAD).

Загружая файл меню и входящие в него группы меню, вы загружаете в па-мять все разделы этого файла (падающие меню, экранные меню, панелиинструментов и т. д.).

Созданные пользователями элементы меню (падающие меню, панели инст-рументов и т. п.) после загрузки содержащих их групп меню могут быть до-бавлены в графический интерфейс системы AutoCAD к базовому меню. Та-кую операцию, например, выполняет команда EXPRESSTOOLS, котораядобавляет падающее меню Express, располагая его между стандартными па-дающими меню Редакт (Modify) и Окно (Window) — рис. 4.4.

Стандартные инструменты пользователя для добавления меню и панелейинструментов рассмотрены и разд. 4.2.1 и 4.2.2.

Page 276: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 275

\&AutoCAD 2000£5 Файл Правка

D &U Л

, ' а

НЕ ДЛЯ ПЕРЕПРОДАЖИ - [Diawnqil

Ё И Й В с т а в к а Ф о р м а т £ е р ь н с Р и с о в а н и е

''&Ш 0 j j ] • Послою J |

Размеры Редак.т Енр

Послою—' '

Справка

о? q,®— Послою

В

А

ННННГГТпТх!

sf U ?

Послою •"

Рис. 4 . 4 . Рабочее окно системы AutoCAD 2000 с загруженным фрагментным

меню Express

4.2.1. Добавление заголовка в строкупадающих менюВ строку падающих меню можно добавлять и удалять элементы (заголовкименю).

Для того чтобы в строку падающих меню добавить заголовок еще одногопадающего меню из числа загруженных в память, но еще не использован-ных, нужно перейти на вкладку Строка меню (Menu Bar) диалогового окнаАдаптация меню (Menu Customization) (рис. 4.5).

Ш Адаптация меню

Группы меню [5^^^менй

£рупла меню:

JACAD

MeHjg:

ПравкаВидВставкаФорматСервисРисованиеРазмерыРедактОкноСправка

Активные меню:

ПравкаВидВставкаФорматСервисРисованиеРазмерыРедактОкноСправка

<< Удались

Справка

Рис. 4 . 5 . Диалоговое окно Адаптация меню, вкладка Строка меню

На вкладке Строка меню (Menu Bar) можно выполнять операции над заго-ловками меню системы. Раскрывающийся список Группа меню (MenuGroup) показывает имя той группы меню, с которой будут выполняться

Page 277: Visual LISP и секреты адаптации AutoCAD

276 Visual LISP и секреты адаптации AutoCAD

операции при помощи расположенных по центру кнопок Добавить (Insert),Удалить (Remove), Удалить все (Remove All). Список Меню (Menus) показы-вает заголовки всех падающих меню группы, а список Активные меню (MenuBar) — заголовки меню, которые отображены (активны) в строке падающихменю экрана системы AutoCAD.

В момент, запечатленный на рис. 4.5, из группы меню ACAD в память за-гружены 11 падающих меню и все они активны. В данном окне вы можетеотметить в области Активные меню (Menu Bar) тот заголовок падающего ме-ню, который вы хотели бы убрать из строки падающих меню графическогоинтерфейса с помощью кнопки Удалить (Remove). Кнопки Добавить (Insert)и Удалить все (Remove All) позволяют, соответственно, добавлять заголовкив строку меню и удалять все заголовки из этой строки. Следует учитывать,что вставка заголовка, отмеченного в области Меню (Menus), в строку па-дающих меню выполняется перед тем заголовком, который отмечен в облас-ти Активные меню (Menu Bar).

Добавим теперь (после загрузки меню acetmain, содержащего группуEXPRESS) падающее меню Express, вставив его заголовок между меню Ре-дакт (Modify) и Окно (Window) группы ACAD. Для этого на вкладке Строкаменю (Menu Bar) в списке Группы меню (Menu Groups) установим имя груп-пы EXPRESS, в области Меню (Menus) отметим заголовок Express, в облас-ти Активные меню (Menu Bar) отметим заголовок Окно (Window) — рис. 4.6.

Jp Адаптация меню

Группы менй Строка меню |

(EXPRESS

WeHjg: j '.::'

Добавить» |

<< Удалить все]

активные меню: .ФайлПравкаВ наВставкаФорматСервисРисованиеРазмерыРедакт

Справка

Рис. 4.6. Добавление падающего меню Express

Page 278: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 277

Если вы щелкните по кнопке Добавить (Insert) и закроете диалоговое окноАдаптация меню (Menu Customization), то получите тот же результат, что ина рис. 4.4.

4.2.2. ВызовЗМ орбита

Web

Вид

Видовые экраны

Вставка

Зумироеание

Листы

Объектная привязка

ПСКПСК-2

П оверхности

Размеры

Раскрашивание

v Редактирование

Редактирование вхождений

Редактирование тел

Редактирование-2

v Рисование

Сведения

• Свойства объектов

Ссылки

V Стандартная

Тела

Тонирование

панели инструментовВ данном разделе мы рассмотрим основные операциинад панелями инструментов, загруженными в памятьвместе с группой меню: вызов на экран, перемеще-ние, изменение формы, удаление с экрана. Вопросысоздания новых панелей, формирования и редактиро-вания кнопок панелей, добавления кнопок в панелибудут рассмотрены в разд. 4.10.

Для выполнения основных операций над панелями ин-струментов в системе AutoCAD 2000 предусмотреныследующие средства: команда ПАНЕЛЬ (TOOLBAR),пункт Панели (Toolbars) падающего меню Вид (View), aтакже пункт Адаптация (Customize) контекстного меню(рис. 4.7), вызываемого щелчком правой кнопки мы-ши при положении указателя на любой из панелейинструментов, находящейся на экране.

Рис. 4.7. Контекстное меню со списком панелейинструментов

Панели:

U Размеры^] РаскрашиваниеXJ РедактированиеГ] Редактирование вхожден jQ Редактирование тел jD Редактироеание-2[X] Рисование

Группа меню:

JACAD

Г* крупные кнопки Г

d

Закрыть

Новая...

Удалить

Адаптация...

Свойства...

Справка

? Доплывающие подсказки

Рис. 4.8. Диалоговое окно Панели

Любое из перечисленных средств вызыва-ет на экран диалоговое окно Панели(Toolbars), приведенное на рис. 4.8.

В списке Панели (Toolbars) этого окнаперечисляются в алфавитном порядке всепанели активной группы меню, имя кото-рой указано в раскрывающемся спискеГруппа меню (Menu Group). Слева от име-ни каждой панели имеется квадрат, нали-чие знака х в котором указывает на то,что данная панель находится уже на экра-не. Щелчком по квадрату можно добавитьна экран или убрать с экрана соответст-вующую панель инструментов.

В правой части диалогового окна Панели (Toolbars) расположены кнопки:

• Закрыть (Close) — закрывает диалоговое окно;

• Новая (New) — создает новую панель;

Page 279: Visual LISP и секреты адаптации AutoCAD

278 Visual LISP и секреты адаптации AutoCAD

О Удалить (Delete) — удаляет из памяти отмеченную панель;

• Адаптация (Customize) — переводит в режим адаптации отмеченной па-нели (добавление и удаление кнопок и т. п.);

П Свойства (Properties) — вызывает окно свойств панели;

О Справка (Help) — вызывает справку с информацией о диалоговом окнеПанели (Toolbars).

Операции, выполняемые кнопками Закрыть (Close), Удалить (Delete) иСправка (Help), не требуют дополнительных пояснений. Работа кнопок Но-вая (New) и Адаптация (Customize) будет рассмотрена в разд. 4.10.

Кнопка Свойства (Properties) вызывает диалоговое окно Свойства панели(Toolbar properties) (рис. 4.9).

Свойства панели

Имя;

Псдсказка: Шанель "Орбита"

Псевдоним:' AC4D.TB_0RBIT

Рис. 4 . 9 . Диалоговое окноСвойства панели

В этом окне пользователю доступны поля:

D Имя (Name) — изменяет имя панели;

• Подсказка (Help) — изменяет содержимое подсказки к панели.

Изменение имени панели отражается в диалоговом окне Панели (Toolbars)(см. рис. 4.8) и контекстном меню операций над панелями (см. рис. 4.7).

Заданная пользователем подсказка к па/нели по-является в строке режимов в тот момент, когдауказатель мыши находится над панелью, но непопадает ни на одну из кнопок (рис. 4.10).

12JА

И < > И \Модель/ Лист

КомандаКоланда.Команда

Панель "Редактирование" Рис. 4 . 1 0 . Отображение подсказки к панели

Изменения, сделанные в диалоговом окне Свойства панели (ToolbarProperties), вступают в силу после щелчка по кнопке Применить (Apply) изакрытия диалогового окна.

Любая из панелей, находящихся в зоне графического экрана, может бытьперемещена в новое место экрана или находиться в плавающем или фикси-рованном положении. Фиксирование (docking) панели может быть выпол-нено к любой из четырех границ графического экрана системы AutoCAD.

Page 280: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 279

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

Объектная привязка

• г / / х х - 9 о / к п,

оЗ

CD Й о

0+ cf* О й? 65 0 Ё? "-S1

Г© '0 0 й3 Ф 0 43

0 Д

Рис. 4 . 1 1 . Различные формы панелей, находящихся в плавающем положении

В нижней части диалогового окна Панели (Toolbars) (см. рис. 4.8) располо-жены флажки:

• Крупные кнопки (Large Buttons) — устанавливает крупные кнопки пане-лей инструментов;

• Всплывающие подсказки (Show ToolTips) — выводит подсказки, когдаустройство указания проходит над кнопками инструментов.

4.3. Функции AutoLlSP,работающие с менюВ языке AutoLlSP имеются две функции, позволяющие выполнять над эле-ментами меню разнообразные операции: отключать, изменять, удалять и т. д.

4.3.1. Функция тепидгоирПроверяет, загружена ли группа меню.

(тепидгоир <группа>)

Аргумент — текстовая строка с именем группы.Возвращаемое значение — строка с именем группы, если она загружена;иначе возвращается nil.

Примеры:

° (тепидгоир "ACAD") ВОЗВращаеТ "ACAD"

° (тепидгоир "EXPRESS") возвращает nil, если группа меню EXPRESS ещене загружена

Page 281: Visual LISP и секреты адаптации AutoCAD

280 Visual LISP и секреты адаптации AutoCAD

4.3.2. Функция menucmdВыполняет операции над элементами меню.(menucmd <строка>)

Аргумент — строка специального вида, в которой указано, какая и с какимэлементом меню выполняется операция (см. ниже).

Возвращаемое значение — nil.

С помощью аргумента <строка> функция menucmd может открыть падающееменю, погасить пункт меню, включить пункт меню и т. п. Значение аргу-мента должно иметь следующий вид:"<зона>=<действие>"

Левая часть аргумента <строка> (параметр <зона>) отделяется от правой(параметра <действие>) знаком равенства. Параметр <зона> должен прини-мать одно из значений, приведенных в табл. 4.1.

Таблица 4.1. Допустимые значения параметра <зона>

Значение Описание

В1—В4 Соответствует разделам BUTTONS1—BUTTONS4 шаблона меню

А1—А4 Соответствует разделам AUX1—AUX4 шаблона меню

РО—Р16 Соответствует разделам РОР0—РОР16 шаблона меню

I Соответствует разделу IMAGE шаблона меню

S Соответствует разделу SCREEN шаблона меню

Т1—Т4 Соответствует разделам TABLET1—TABLET4 шаблона меню

М Вводится выражение на языке DIESEL

Огруппа.имя Соответствует разделу с именем имя группы меню с наименовани-ем группа (например, "GACAD.POP1")

Примеры:

° (menucmd "P7=*") раскрывает меню, находящееся на седьмом месте слевав строке падающих меню (как будто пользователь щелкнул по заголовкуэтого меню) — рис. 4.12

° (menucmd "I=ACAD. image_3D0bjects") активизирует графическое менюimage_3Dobjects группы ACAD, подготавливая его к выводу на экран

n (menucmd "i=*") выводит активизированное графическое меню на экран(рис. 4.13)

Page 282: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 281

1Д# AutoCAD 2Ш0 НЕ ДЛЯ ПЕРЕПРОДАЖИ [Di

.' D 1* И & А& X Ч» (в *? «•>

/ А

<? А

• -ф

о ч

О / '

% -/

• елШ-ГEi fА ,/

/ X

Г "N i • N \ Модель / Лист! j( Лиет2 /

[Команда ' r e d r a w a l 1[Команда ^menucrad " P 7 3 * " )

1

Рисование Размеры РедакТ Ejjpiess JQKHO Crpaejca .-Itg.^xJ

Дрямая

Пояутнния

ЗМ полилиния

Многоугольник.

Дуг* •

Кольцо

Сплайн

Эппипс •

Хочка

Штриховке .

КонтурОбласть

Текст •

Поверадосги •

Tejia •

.; я.®. * . 9 . P.s?: u . ?. -' •• J i — J i • • —.

d

j

r JJJLI _ i d

l i

Рис. 4 . 1 2 . Открытое меню РОР7

ШАГ. СЕТКА ОРТО ОТС-ПОЛЯР' ПРИбЯЗКА; ОТС-ПРИВ ВЕС|МОДЕГ

Рис. 4 . 1 3 . Вывод графического меню image_3DObjects

Page 283: Visual LISP и секреты адаптации AutoCAD

282 Visual LISP и секреты адаптации AutoCAD

В качестве значений параметра <действие> может использоваться либо имяраздела (или пункта) меню, либо символы из табл. 4.2. Кроме того, передименем раздела может идти знак плюс (см. разд. 4.5).

Таблица 4.2. Допустимые значения параметра <действие>

Символы Описание

* Активизация раздела

Удаление раздела

! • Установка флажка около наименования пункта

Гашение пункта

? Справка о состоянии пункта

#? Расширенная справка

I Выполнение макроса пункта меню (см. разд. 4.4)

(пустое значение) Восстановление состояния пункта

Подробнее операции с разными разделами и пунктами меню будут рассмот-рены в данной главе ниже. Язык DIESEL описывается в разд. 4.14.

4.4. Структура заголовкови пунктов менюПосле имени раздела меню в файле шаблона идут описания пунктов меню.В качестве примера рассмотрим раздел РОР11 группы ACAD (другие фраг-менты файла acad.mnu можно найти в приложении 4):

\ Листинг 4.1. Раздел РОР11 стандартного меню системы AutoCAD I

***РОР11

**HELP

ID_MnHelp [Справ&ка]

ID_Help [&Справка по AutoCAD\tFl] '__help

ID_PlotHelp [П&ечать с Инструктором]ЛСЛСЛР(help "acad_plt" +

"Fast_Tr'ack_to_Plotting_Your_First_Drawing") ЛР

[--]

ID_Wnew [&Что нового](help "acad_ug" "whatsnew")

ID_L_acla [&Learning Assistance]АС

ЛС

ЛР(if (findfile "alalink.exe") +

(progn (princ)(startapp "alalink.exe") (princ)) +

(la_support_assistance alert)) ЛР

Page 284: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 283

ID_Support [«.Технический справочник]ЛС

ЛС

ЛР(if (findfile +

"asajnain.hlp") (progn (princ)(help (findfile "asa_main.hlp") +

"contents")(princ)) (ai_support_assistance_alert)) ЛР

ID AcadWeb [~>Auto&desk в сети Интернет]

ID_ACHomePage [&Главная страница AutoCAD]ACACjDrowser +

http://kivw,autodesk.com/products/autocad/index.htm

ID_PlugIn [П&риложения AutoCAD]ACAC_browser +

http://www.cadplugins.com

IDJTechPubs [«[Технические публикации по AutoCAD]ACAC_browser +

http://www.autodesk.com/techpubs/autocad

ID_ADHomePage [Г&лавная страница Autodesk]~CAC__browser +

http://www.autodesk.com

ID_ProdSupp [&Служба поддержки продуктов Autodesk]АС

ЛС browser +

http://www.autodesk.com/support

ID_DevRes [Разработчикам прило&жений Autodesk]ACAC_browser +

http://www.argonline.com

ID AUGI [<-Гру&ппы пользователей Autodesk]АС

ЛС

АР(command +

"_browser" (findfile "augi.htm")) AP

t —]ID_About [SO программе] '__about

Структура раздела Р0Р11 в вашей версии AutoCAD может немного отли-чаться от приведенной (например, вы используете AutoCAD 2000i).

В листинге 4.1 после строки с именем раздела (***РОРИ) идет строка с име-нем меню (**HELP), расположенного в этом разделе. Имя меню предваряетсядвумя звездочками и является синонимом к имени РОРП в различных опе-рациях.

4.4.1. Структура заголовкаСледующая строка в листинге 4.1 описывает заголовок меню и имеет структуру:<тег> [<заголовок>]

Здесь <тег> — это тег (внутреннее имя, tag), используемый для работы про-граммного обеспечения системы с заголовком в оперативной памяти;<заголовок> — это текст, который выводится в качестве заголовка меню (впоследнем примере — текст, попадающий в строку падающих меню). Тегдолжен начинаться с символов ю_. После тега может идти любое количест-во пробелов (например, с целью красивого выравнивания текста в файлешаблона меню). Квадратные скобки здесь не означают необязательное при-сутствие расположенного между ними текста, а указывают на присутствие вописании заголовка символов квадратных скобок.

Page 285: Visual LISP и секреты адаптации AutoCAD

284 Visual LISP и секреты адаптации AutoCAD

Наличие символа & перед буквой к в заголовке Справ&ка означает, что сочета-ние горячих клавиш <Alt>+<K> вызывает падающее меню Справка на экран.В качестве тега у заголовка выбрано ю_МпНе1р. Имя, используемое в теге, недолжно совпадать с тегами других заголовков и тегами пунктов меню.

4.4.2. Структура пункта менюПункт меню имеет следующую структуру:<тег> [<текст>]<макрос>

Здесь <тег> — это тег, начинающийся с символов ю_ и отличающийся оттегов других пунктов и заголовков меню; <текст> — это текст, являющийсянаименованием пункта меню, которое выводится в качестве заголовка меню(в данном примере — это текст, попадающий в строку падающих меню);<макроо — макрос, содержащий операции, которые выполняет пункт меню.

Пункты некоторых разделов не имеют тегов — это разделы BUTTONS, AUXи IMAGE. В разделах SCREEN и TABLET теги могут присутствовать, ноони системой AutoCAD игнорируются.

Наименование пункта меню может меняться. В нем, например, может появ-ляться символ отметки (флажок). Наименование пункта может гаситься, ес-ли пункт отключается пользовательской программой.

В макрос могут входить команды системы AutoCAD и их опции, выраженияAutoLISP, а также специальные комбинации символов, имитирующих, на-пример, нажатие клавиш. Комбинации клавиш рассматриваются в табл. 4.3.

Пункты с пустыми тегами и имеющие в качестве наименования два мину-са — это разделительные строки, которые в падающем меню отображаются ввиде горизонтальных разделительных отрезков (см., например, рис. 4.12).

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

Все, что находится между открывающей и закрывающей круглыми скобка-ми, должно быть корректным выражением языка AutoLISP или языкаDIESEL (о языке DIESEL см. разд. 4.14).

Таблица 4.3. Специальные комбинации символов,используемые в макросах меню

Символы Описание Клавиши

; Конец команды <Enter>

Конец команды <Enter>Л т Имитация клавиши <Tab> <Tab>

Page 286: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню

Символы Описание

285

Таблица 4.3 (окончание)

Клавиши

пробел Имитация пробела (вне выражений AutoLISP и DIESELпробел аналогичен нажатию клавиши <Enter>)

\ Пауза в работе команды (ожидание ввода данныхпользователя)

+ Признак продолжения макроса на следующей стро-ке

=* Вывод на экран падающего, графического или кон-текстного меню

* Л с~с Признак циклического выполнения пункта

$ Признак операции вызова раздела меню (послесимвола $ идет одно- и двухсимвольное обозначе-ние раздела из числа приведенных в первых шестистроках табл. 4.1) или признак начала выраженияязыка DIESEL (после $ идет м)

_ Начало команды или опции AutoCAD в интернацио-нальном исполнении

А в Включение/выключение режима ШАГ (SNAP)

л с Принудительное завершение последней действую-щей команды

л о Включение/выключение счетчика координат

Пробел

Переход к следующей изометрической плоскости

Включение/выключение режима СЕТКА (GRID)

Отменяет последний символ в буфере команднойстроки

Включение/выключение режима ОРТО (ORTHO)

Включение/выключение эхо-вывода

Включение/выключение эхо-вывода всех сообщенийкомандной строки на принтер

Включение/выключение режима планшета

Переключение на следующий видовой экран

Имитация символа с кодом 0, подавляющего автома-тическое добавление пробела в конце пункта меню

<Ctrl>+<B> или<F9>

<Esc>

<Ctrl>+<D> или<F6>

<Ctrl>+<E>

<Ctrl>+<G> или<F7>

<Backspace>

<Ctrl>+<0> или<F8>

<Ctrl>+<T>

<Ctrl>+<R> (CM.разд. 4.13)

Page 287: Visual LISP и секреты адаптации AutoCAD

286 Visual LISP и секреты адаптации AutoCAD

Рассмотрим некоторые пункты приведенного в листинге 4.1 меню и опера-ции, выполняемые ими.

Пункт с тегом mjfeip имеет наименование Справка по AutoCAD. Приведен-ное после символа табуляции (\t) в наименовании обозначение клавиши<F1> означает, что действие данного пункта может быть имитировано нажа-тием функциональной клавиши <F1>. Действие пункта — это вызов коман-ды СПРАВКА (HELP). Знак подчеркивания перед английским именем ко-манды обеспечивает ее выполнение в локализованных версиях. Символ апо-строфа перед знаком подчеркивания сообщает, что команда вызывается впрозрачном режиме (т. е. может быть выполнена до завершения работыдругой команды).

Пункт с тегом iDPiotHeip имеет наименование Печать с Инструктором. Со-ответствующий ему макрос начинается с двукратного употребления симво-лов Лс, что аналогично двукратному нажатию клавиши <Esc> — это позво-ляет прекратить работу любой команды, выполнявшейся, но не законченнойдо щелчка по названию рассматриваемого пункта меню. Для прекращениябольшинства команд достаточно однократного нажатия клавиши <Esc>. Од-нако некоторые команды (например, команда РАЗМЕР (DIM)) требуют дляпрерывания своей работы двукратного нажатия клавиши <Esc>. Если ника-кая команда в этот момент не работала, то лишние нажатия клавиши <Esc>не вызывают никаких сбоев системы AutoCAD.

Вслед за символами Лс в макросе идут символы Лр, которые отключают эхо-вывод текста пункта меню (устанавливают значение 1 системной перемен-ной MENUECHO). Поэтому следующее далее LISP-выражение (help"acad^plt" "Fast_Track_to_Plotting_Your__First__Drawing") будет Выполнено,но не отображено в командной строке AutoCAD. Символ пробела послеLISP-выражения равносилен нажатию клавиши пробела (идентично нажа-тию клавиши <Enter>), что заставляет систему AutoCAD выполнить введен-ное с помощью меню выражение. Завершающая макрос комбинация симво-лов Л Р восстанавливает эхо-вывод.

4.4.3. Пауза в пункте менюИнтересно использование символа \, обозначающего паузу для ввода дан-ных пользователя. В листинге 4.2 приведен фрагмент из раздела РОР7(падающее меню Рисование) стандартного меню системы AutoCAD 2000.

I Листинг 4.2. Фрагмент раздела РОР7 файла acad.mnu \

ID_ArcStCeEn [Начало, центр, &конец]ЛСЛС arc \_cID__ArcStCeAn [Начало, центр, &угол]лСАС_агс \_с \_аID_ArcStCeLe [Начало, центр, &длина]лСлС_агс \_с \_1

Page 288: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 287

ID_ArcStEnAg [Начало, конец, у&гол]АС

лС_агс \_е \_а

ID_ArcStEnDi [Начало, конец, {«направление] АСАС__агс \_е \_d

ID_ArcStEnRa [Начало, конец, ьрадиус] AC

AC^arc \_e \_г

[--]

ID ArcCeStEn [Центр, начал&о, конец]АСАС_агс _с

ID ArcCeStAn [Центр, нача&ло, угол]АС

АС_агс _с \\_а

ID_ArcCeStLe [Центр, начало, дл&ина]АСАС_агс _с \\_1

Все приведенные здесь пункты меню (не считая разделительных линий) яв-ляются вариантами работы одной и той же команды ДУГА (ARC). Эта ко-манда имеет много опций. В падающее меню включены девять вариантовработы команды. Символ \ задает паузу, когда команда должна остановитьсяи ждать от пользователя числа или точки.

Например, пункт с тегом iDj\rcstceAn строит дугу по начальной точке, цен-тру и центральному углу. Поэтому данный пункт вызывает команду ДУГА(ARC), останавливаясь сразу же после начала работы команды (в этот мо-мент пользователь должен ввести начальную точку). После ввода начальнойточки в командную строку выдаются символы _с (соответствуют вводу оп-ции Центр (Center)) и следующая пауза заставляет команду ожидать отпользователя ввода точки центра дуги. После ввода центра выдаются симво-лы _А (соответствуют опции Угол (Angle)), и команда ДУГА (ARC) ждет отпользователя задания угла. Здесь символ паузы в меню уже не требуется,поскольку команда не имеет в данный момент других вариантов работы.

4.5. Падающие менюПадающим меню в файле шаблона отведены разделы от РОР1 до РОР499.Номера используемых в одной группе меню разделов с префиксом POP необязаны идти подряд, но повторяться они не должны. В разных группахмогут быть разделы с одинаковыми именами (например, раздел РОР1 естькак в группе ACAD, так и в группе EXPRESS).

При этом в строке падающих меню одновременно может быть до 16 заголов-ков из числа загруженных в память. В данном разделе книги рассматриваютсявопросы программирования различных операций с падающими меню, а такжеорганизации вложенных падающих меню (каскадные падающие меню).

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

4.5.1. Добавление менюВопрос добавления в строку падающих меню нового заголовка с помощьюсредств системы AutoCAD уже был рассмотрен в разд. 4.2.1. Для добавления

Page 289: Visual LISP и секреты адаптации AutoCAD

288 Visual LISP и секреты адаптации AutoCAD

заголовка программными средствами следует использовать следующее LISP-выражение:(menucmd "P1O+EXPRESS. РОР1")

Это выражение выполняет ту же операцию, что и на рис. 4.4, т. е. добавляетзаголовок Express (имя меню, расположенное в разделе РОР1 группыEXPRESS) к строке падающих меню на десятое место, если группаEXPRESS фрагментного меню acetmain уже загружена в память.

Вместо имени раздела (РОР1) можно было использовать имя меню, котороеследует с префиксом из двух звездочек за строкой с именем раздела (в лис-тинге 4.1, приведенном в разд. 4.4, имя меню, находящегося в разделеРОР11, — HELP). Например:(menucmd "PIO+ACAD. HELP")

Если вам нужно расположить новый заголовок не на конкретном по номеруместе в строке падающих меню, а перед ранее добавленным заголовком сопределенным именем, можно воспользоваться таким выражением:(menucmd "GACAD.POP12-+EXPRESS.РОР1")

В этом случае заголовок из раздела РОР1 группы EXPRESS будет добавлен встроку падающих меню перед заголовком меню, импортированного из раз-дела РОР12 группы меню ACAD, независимо от того, на каком месте нахо-дится последний заголовок (а он может оказаться, например, первым илиседьмым).

4.5.2. Удаление менюУдаление заголовка из строки падающих меню может быть выполнено каксредствами, изложенными в разд. 4.2.1, так и с помощью следующего LISP-выражения:(menucmd "Р10=-")

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

Если нужно удалить меню, импортированное из раздела РОР1 группыEXPRESS, независимо от места его расположения, следует применить такоевыражение:(menucmd "GEXPRESS.РОР1=-")

4.5.3. Вывод меню на графический экранДля того чтобы вывести на экран меню, заголовок которого является вто-рым в строке падающих меню, нужно выполнить следующее выражение:(menucmd "P2=*")

Page 290: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 289

Можно было бы обратиться к меню по имени группы и имени раздела, изкоторого это меню было загружено в память:(menucmd "GACAD.POP5=*")

Возможен вариант обращения к меню не по имени раздела, а по имени меню:(menucmd "GACAD.FORMAT=*")

Эта операция выводит на экран меню Формат (Format), которое находится вразделе РОР5 файла acad.mnu.

4.5.4. Отметка пункта менюВ операциях, выполняемых с помощью функции menucmd, обращение кпункту меню осуществляется с помощью номера, вводимого в параметре<действие> после символов, обозначающих раздел (Р5, Р12, и т. п.), черезточку. Номер 0 соответствует заголовку меню. Разделительные строки в па-дающих меню тоже участвуют в нумерации пунктов.

У наименования пункта падающего меню может стоять отметка в виде флажка(галочки). Обычно это бывает удобно, когда пункт меню отражает настройку,для которой нужно показать, что она включена. Если в файле шаблона на-именование пункта начинается с символов ! . , то эти два символа при выводенаименования пункта на экран преобразуются в знак отметки.

Следующее выражение ставит слева от наименования третьего пункта деся-того меню знак отметки:(menucmd " Р 1 0 . 3 = ! . " )

справка _ На рис. 4.14 приведен пример открытого падающего ме-ню Окно с отмеченным нижним пунктом (отметка в дан-Каск-адом

Слева направоу вниз

ть значки

X Drawing!

ном случае обозначает имя активного документа).

Рис. 4.14. Отметка пункта меню

4.5.5. Отключение пункта менюСимвол ~ перед наименованием пункта меню делает это пункт недоступным(приглушает). Пример:(menucmd "Р10.2=~")

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

Отметка пункта меню (см. разд. 4.5.4) не препятствует его отключению.

Программное обеспечение системы AutoCAD контролирует состояниебольшинства пунктов группы ACAD и не дает возможности отключать ихпользовательским программам.

10 Зак.155

Page 291: Visual LISP и секреты адаптации AutoCAD

290 Visual LISP и секреты адаптации AutoCAD

4.5.6. Восстановление пункта менюДля того чтобы восстановить обычное состояние пункта падающего меню(снять отметку и отключение), нужно выполнить следующую операцию:

(menucmd " P I 0 . 2 = " )

Данное действие восстановит пункт с номером 2 из десятого меню.

4.5.7. Замена менюВозможна замена падающего меню на другое, которое еще не фигурирует впользовательском интерфейсе. Схема замены следующая:

(menucind "P1ORITM. РОР13")

Данная операция заменит десятое падающее меню в пользовательском ин-терфейсе на меню из раздела POP 13 группы RITM.

Можно при замене опускать имя группы, если вместо предыдущего менювставляется меню из группы базового меню, например:

(menucmd "Р10=РОР12")

Если в качестве базового в данный момент выбрано стандартное меню сис-темы AutoCAD, то в этом случае десятое меню заменится на меню из разде-ла РОР12 группы ACAD.

Вместо имени раздела (Р0Р13, РОР12) можно было использовать имена ме-ню, которые следуют с префиксом из двух звездочек за строкой с именемраздела (например, в листинге 4.1, приведенном в разд. 4.4, имя меню, на-ходящегося в разделе РОР11, — HELP).

Примеры:D (menucmd "PIO^RITM.GENHULL")D (menucnd "Piu-HELP")

4.5.8. Справка о состояниипункта менюСправку о состоянии пункта можно получить с помощью функции menucmd,используя знак вопроса в качестве значения параметра <действие>. Пример:

(menucmd "P11.1=?")

Это выражение выводит состояние первого пункта одиннадцатого падаю-щего меню.

Возвращается "~", если пункт 1 одиннадцатого падающего меню отключен;"!", если пункт содержит отметку слева от наименования; "", если пункт

Page 292: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 291

находится в обычном состоянии (включен и без отметки); nil, если нет па-дающего меню с таким номером.

Если пункт и отключен и отмечен, то возвращается "- !" или "! -" в зави-симости от порядка действий, выполненных над пунктом.

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

(memiand " P I I . 1 ~=-#?" )

ЭТО выражение возвращает состояние пункта, но с префиксом, например:"Р1 1 . 1 - - " ИЛИ " Р 1 1 . 1=! ".

4.5.9. Каскадные менюПадающие меню могут быть многоуровневыми, образуя каскадные меню.На рис. 4.15 показано падающее меню с трехуровневым каскадом.

AutoCAD 2000 • HE ДЛЯ ПЕРЕПРОДАЖИ - IDiawingi]

Q Файл П р » . .

D к* U i

gs 5§

/ •

. , ?

C '

f

0

~k

иaA

1

GO

Г I

D-,

7';'

О

r

r

Г -1 ]

ВИД бсгаыа Формат Серен Ft E i i г- Fa c^t

Регенерировать

Регенерировать все

Пока-зан,

Панорамировать

О^шии вна

Вццовые экраны

Hi'i HugaHHbie виды.

ЗМ виды

•ЗМ орбита

J

Нормальное

Гп^ГГ 'hi JiКоманда

Команда

Команд:'

Рис. 4 . 1 5 . Каскадное меню

В листинге 4.3 приведен фрагмент раздела РОРЗ группы ACAD (полныйтекст этого раздела меню можно найти в приложении 4).

Page 293: Visual LISP и секреты адаптации AutoCAD

292 Visual LISP и секреты адаптации AutoCAD

: Листинг 4.3. Фрагмент раздела РОРЗ файла acad.mnu \

ID MnDisplay [->Отобра&жение]

IDJMnuCSicon [->&Пиктограмма ИСК]

ID_UcsiconOn [$(if,$(and,$(getvar,ucsicon),1),!.)&Вкл]+

$M=$(if,$(and,$(getvar,ucsicon),1),"CAC_ucsicon _off,ЛС"С ucsicon on)

ID_UcsiconOr [<-$ (if, $ (and, $ (getvar, ucsicon) , 2) , ! . ) «Начало] -t

$M=$ (if, $ (and, $ (getvar, ucsicon) , 2) , AC"4C_ucsicon no, AC AC__ucsicon or)

ID_MnAttribu [->&Атрибуты]

ID AttdispNo [$(if,$(eq,$(getvar,attmode),1),!.)&Нормальное]+

' _ a t t d i s p _n

[ —]

ID_AttdispOn [$ (if ,$ (eq, $ (getvar, attmode) ,2) , ! .) &BK.nJ '_attdisp _on

ID_AttdispOf [<-$(if,$(eq,$(getvar,attmode),0),!.)&0ткл1+?_attdisp _off [—]

ID Textscr [<-&Текстовое OKHo\tF2]'_textscr

ID__Toolbar [Панел&и...]AC^C_toolbar

Пункты меню, имеющие каскады, отмечены на рис. 4.15 символом • в пра-вой части пункта.

В тексте шаблона меню верхний пункт каскада имеет в начале наименова-ния символы ->. Последний подпункт данного каскада начинается с симво-лов <-. Подпункты тоже могут иметь в начале наименования символы ->,если каскад многоуровневый. Если подпункт завершает сразу два уровнякаскада, то в начале его наименования должны стоять символы <-<-. В со-ответствии с этим принципом пункт с тегом mjrextscr является завершаю-щим для пункта с тегом ID MnDisplay, пункт iD_ucsiconOr — для пунктаID_MnUCSicon, ПУНКТ ID_AttdispOf — ДЛЯ ПуНКТа ID_MnAttribu.

4.5.10. Операции с падающими менюв меню других разделовОперации с пунктами падающих меню могут выполняться не только в LISP-выражениях с использованием функции menucmd, но и в меню любого типа спомощью комбинации символов, начинающейся с $р.

Например, если в макросе пункта меню стоит текст $рю=*, то это равно-сильно LISP-выражению (menucmd " Р Ю = * " ) . Аналогично комбинация сим-волов $РЮ.1=>. равносильна выражению (menucmd " Р Ю = ! . " ) . Каждая из та-ких комбинаций символов должна в файле шаблона меню завершаться про-белом или точкой с запятой.

Page 294: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 293

4.6. Экранные менюРаздел с именем SCREEN шаблона меню содержит экранные меню, кото-рые в ранних версиях AutoCAD были основным видом меню, а в последнейверсии применяется лишь частью пользователей (хотя нельзя сказать, чтотакие меню себя полностью исчерпали).

4.6.1. Активация зоны экранных менюПо умолчанию система AutoCAD работает без экранных меню. Для тогочтобы зона экранных меню появилась в пользовательском интерфейсе, не-обходимо в диалоговом окне Настройка (Options) (см. разд. 1.3) перейти навкладку Экран (Display) и установить флажок Экранное меню (Display screenmenu), как изображено на рис. 4.16.

j j f Настройка

Текущий пропилы «Профиль без имени» [ j p Текущий рисунок Diawingl.dwg

Файлы Экран | Опфытие/Сокрйнение | Печать} Система] Пользовательские) Построения] Выбор} Профили \

-. Элементы окна - • - •• -•• Экранное разрешение - - •••- -

;

; Р Пояоеы.прокрмтки • Ч В f ™ Пдавностьдйг и крагое

i \ [ftp ja"" *~ Число сегментов в догах полилиний

: •• 1ЙР р.5 Плавность тонированных объектов

Цвета... | Шрифты... | ! : g p Числоабразающшвповерхностяи

Количество строк в окне команд:

Л и с т ы •••"' • ""• ;• .; v 1 V ' '

Р Вкладки "Модель" и "Лист"

Р" Полд листа

V/ Подложить заданный Формат

I*? Т§нь вокруг границ

!*** Вывсдить окно параметров для новых листов

£7 Создзвать видовые экраны на н.овых листах

Размер перекрестья • ' • "~"~ •"

- J

Производительность отображения;

Г" ЦайУЗум с растровыми изображениями

(*/ ПодсЁбчивать только границы растра

Г" Бея палитра в изображениях и тонировании

^ р F5" Показывать заливку

^ Г" Только границы текстов

Г Э Г" Громки силуэта

• Затенение при редактировании ссылок

(50- J -

ок Отмена Справка

Рис. 4.16. Диалоговое окно Настройка, вкладка Экран

В результате такой операции появится корневое экранное меню (рис. 4.17).

Каждый пункт в строках (боксах) экранного меню имеет название, щелчокпо которому вызывает либо команду AutoCAD, либо другое экранное меню,которое после загрузки может занять всю зону экранных меню или ее часть(тогда часть названий останется от предыдущего меню).

Page 295: Visual LISP и секреты адаптации AutoCAD

294 Visual LISP и секреты адаптации AutoCAD

JV AutoCAD 2O0U НЕ ДЛЯ ПЕРЕПРОДАЖИ [Dtawingll 1 :"А? S г

D

С

&

_„

-

*0

О

Ф.

и&А

г;

*аи

О

0;.

г"Г^;

^ «

i i J t f o i o

% % t § ^ •rj :"-' ^ t t j =^

j | . Посею ^

ь { Яист1_7 Лнст2 У

Ш^Г СЕТК* UPTU ОТСПиПЛР

SsiS i ,!•• ••',!'••:"•(=•,!•• j\i Л-..- 1"л,'..'й"?' 'ч А':'.*-

V IS S « i * 'Х (5, (ft 3

п ,, л п „,, J

l i) _L

ПРЙВЛЗПОТСПРИВ ВЕС[МЪДЕГ

J

Г1

и ?

ФАЙППРАВКАВИД1вид гВСТАВКАФОРМАТСЕРВИС 1СЕРВИС 2РИСУЙ!РИСУЙ 2РАЗМЕРЫРЕДАГТ1РЕДАКТ 2

СПРАВКА

СРЕДСТВА

Рис. 4 . 1 7 . Корневое экранное меню

д ЕСТ^БКЗ Формат Сервис Рисование Размеры Ре&ак

ФАЯЛПРАВКлВИД 1ВИД 2ВСТАВКАФОРМАТСЕРВИС 1СЕРВИС 2РИСУЙ 1РИСУЙ 2РАЗМЕРЫРЕДАКТ1РЕДАКТ 2

AutoCAD Express Tools Menu loaded

ШАГ СЕТКА ОРТО ОТС-ПОПЧР|Г1РИВЯЗКА ОТС-ПРИВ БЕСПИОДЕ?4Э0.2081, 296.6303. OLOGOO

Рис. 4 . 1 8 . Плавающее положение зоны экранных меню

Page 296: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 295

Количество пунктов, которые видны в экранном меню, зависит, в основ-ном, от размера шрифта, выбранного в настройке системы AutoCAD, одна-ко оно еше ограничивается значением системной переменнойSCREEN BOXES. Обычное значение этой переменной — 27. Если экранныеменю отключены, то значение системной переменной — 0.

Зона экранных меню может находиться в фиксированном положении, какна рис. 4.17, или в плавающем, как на рис. 4.18. В плавающем положениизона экранного меню оформляется в виде панели Экранное меню (ScreenMenu).

Изменшь положение экранного меню можно, передвигая ею мышью заверхнюю часть. Есть возможность при желании зафиксировать зону экран-ных меню в левой части графического экрана (рис. 4.19).

D 2айл

D c=>

AuioCAO

ФАЙЛПРАВКАВИД1ВИД 2ВСТАВКАФОРМА!СЕРВИС 1СЕРВИг J

РИСУЙ 1РИСУЙ 2РАЗМЕРЫРЕ ПАКТ 1РЕДАКТ 2

СПРАВКА

СРЕДСТВ.»

КомандаКомандаКоманда

423 3214

ЩПра

У

\'1

ска Виц Bcia a форм.ат _-рь i £ еян f- Fa e t Рццаьг E f[f- If н Ир t n

S .Д ' ;4 ^ ft И »f ' - «* , f и ^ Щ 6 ] » , С i ^ _J' -.

-irf'OBO -j |ЩП к -J | П ^ П n jrJ 1 П

•^ A

_' >SDO

• •£••

Г 0

© birJ П:.

о /'

г? i• CJ

*4 Г(a r

< - > 4 -

14 Ч • > Г \ М о я е п ь Х f i n a l 7 Пист2_/~ | < |

_options

54 7j71 . 0.0000 ШАГ СЕТКА QPTQ- ОТС-ПОПЯР [ПРИВЯЗКА ОТС-ПРИВ ЕьС[М0ДЕГ

в!1 !, и

' 1

*

л.1 ]

J

.-Jш

ZjJ jj

Рис. 4 . 1 9 . Левостороннее фиксированное положение зоны экранных меню

4.6.2. Уровни менюРассмотрим приведенный в листинге 4.4 фрагмент текста экранного менюверхнего уровня файла acad.mnu (более подробно оно дано в приложении 4).

Page 297: Visual LISP и секреты адаптации AutoCAD

296 Visual LISP и секреты адаптации AutoCAD

\ Листинг 4.4. Фрагмент корневого экранного меню файла acad.mnu I

***SCREEN

**s

[AutoCAD ]ACnCAP(ai_rootmenus)

ЛР

[* * * * ]$S=ACAD.OSNAP

[ФАЙЛ ]$ S=ACAD.01_FILE

[ПРАВКА]$S=ACAD.02_EDIT

[ВИД 1]$S=ACAD.O3_VIEW1

[ВИД 2]$ S=ACAD.0 4_VIEW2

[ВСТАВКА]$S=ACAD.05_INSERT

Сразу после строки с именем раздела SCREEN следует строка с именем эк-ранного меню (s), предваряемым двумя звездочками. Затем следует описа-ние пунктов меню s, которое подчиняется общей структуре пунктов меню(см. разд. 4.4.2), хотя тег не используется и он может отсутствовать.

Обычно длина пункта экранного меню не превышает восьми символов.

В наименованиях пунктов экранных меню традиционно применяется сле-дующий принцип. Если с помощью пункта вызывается другое экранное ме-ню, то наименование пункта не имеет на конце никаких символов. Если спомощью пункта выполняется команда системы AutoCAD или приложения,то наименование пункта завершается двоеточием. Если с помощью пунктавызывается диалоговое окно, то наименование пункта заканчивается много-точием.

В макросе, назначаемом пункту меню, используются средства, описанные вразд. 4.4.2. В верхнем пункте (с наименованием AutoCAD) указано LISP-выражение (ai_rootmenu), которое возвращает корневое экранное меню.Операция, начинающаяся с символов $s=, вызывает экранное меню первогоуровня. Имя экранного меню обычно указывается с именем группы, кото-рое отделяется точкой от имени меню (например, ACAD.OSNAP). ЕСЛИ ИМЯгруппы опущено, то AutoCAD считает, что нужно загрузить экранное менюс таким именем из базовой группы.

Если щелкнуть левой кнопкой мыши по пункту * * * *, то появится экран-ное меню следующего (первого) уровня с функциями объектной привязки.В листинге 4.5 приведено экранное меню OSNAP из группы меню ACAD.

I Листинг 4.5. Экранное меню первого уровня OSNAP из файла acad.mnu i

**OSNAP 3

[Отслеж ]_tt

[Смещение]_from

[Привяз:]' -osnap

Page 298: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 297

[Конточка] endp

[Середина] mid

[Пересеч ] int

[Каж пер l^appint

[Продолж]_ext

[Параллел] par

[Центр ] сеп

[Квадрант]_qua

[Касат] tan

[Нормаль ] per

[Узел ]_nod

[Твставки] ins

[Ближайш ] пеа

[Ничего ]_поп

[Привяз..]' +dsettings 2

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

В строке с именем этого меню присутствует еще число 3. Это означает, чтоданное меню будет загружаться таким образом, что первый пункт (отслеж)займет в зоне экранных меню боксы, начиная с третьего. Поэтому содержи-мое боксов 1 и 2 останется прежним.

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

4.6.3. Средства смены менюСмена экранного меню выполняется либо с помощью комбинации симво-лов, начинающихся в макросе с $s= (см. листинг 4.4), либо с помощьюфункции monucmd. LISP-выражение (menucmd "S=ACAD.OSNAP"i тоже загружаетменю первого уровня OSNAP в зону экранных меню.

Для возврата к предыдущему меню используется либо комбинация $s= (наконце пробел или точка с запятой), либо аналогичная комбинация с именемгруппы (например, $S=ACAD. , что означает возврат к предыдущему менюгруппы ACAD). Такой же принцип работает при загрузке с помощью функ-ции menucmd.

Page 299: Visual LISP и секреты адаптации AutoCAD

298 Visual LISP и секреты адаптации AutoCAD

Системная переменная MFNUCTL, если она имеет значение 1, заставляетпри работе команд системы AutoCAD автоматически менять содержимоеэкранного меню на экранное меню, соответствующее выполняемой команде(в таком меню обычно отображаются опции этой команды). Так, например,при выполнении команды КРУГ (CIRCLE) па экране появляется меню сименем CIRCLE (листинг 4.6).

: Листинг 4.6. Экранное меню CIRCLE из файла acad.mnu :

**CIRCLE 3

[Круг: ] "С4^ circle

ГЦ, Рал ] \\

ГЦ,Диам ]\_d

[2

Г?

[Kf

[ V. t

т

т

СР

ск

очки

очки

L..2P

]..3р

] tt

1 JP

\\\

г

tan \ tan

[Кол рад:]~СлС circierad ' '":a.l '"ad;

Если значение системной переменной равно 0, то автоматическая смена ме-ню не происходит.

4.6.4. Использование комбинации ЛНЭкранное меню может использоваться и для облегчения клавиатурного вво-да некоторых наименовании или отдельных символов. Например, если ввашем рисунке находится модель изделия, в котором имена слоев объектовзадаются исключительно цифрами и несколькими символьными кодами,тогда можно составить отдельное экранное меню, в котором каждая из10 цифр (от 0 до 9) будет занимать отдельную строку, и дополнить это менюнаиболее употребительными сокращениями (например, ДЕТ, УЗЕЛ и т. п.).Тогда в соответствующий момент работы вашего приложения (когда онозапрашивает у вас сложное имя слоя) вы вместо нажатия клавиш сможетещелкать мышью по строкам экранного меню с нужными цифрами, и онибудут выводиться в командную строку. Однако, если не принять специаль-ных мер, то после каждой цифры AutoCAD будет имитировать еше нажатиеклавиши <Enter>, что приведет к досрочному вводу числа.

В качестве такой специальной меры следует после каждой цифры в макро-сах вставлять комбинацию символов ч:. имитирующую работу клавиши

Page 300: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 299_

<Backspace>, что позволит выводить в командную строку нужную вам циф-ру без нажатия клавиши <Enter> (как будто вы отменили его). То же самоеотносится к кодовым сокращениям. Пример фрагмента меню, использую-щего комбинацию Лн, показан в листинге 4.7.

i Листинг 4.7. Пример пользовательского экранного меню для ввода цифр ;

**NUMBERS 3[-]-лн[0]0лН

[2][3][4]

[6][7][8]

2лН

3АН

4ЛН

6ЛН

7ЛН

8ЛН

[ДЕТ]ДЕТЛН

[УЗЕЛ]УЗЕЛ

После набора в командной строке с помощью такого меню имени слоя(например, УЗЕЛ15-2339-012), вам нужно будет самостоятельно нажать кла-вишу <Enter> или правую кнопку мыши для вызова контекстного меню, вкотором найти пункт Enter.

4.7. Графические менюГрафические меню (см. рис. 4.13) используют заранее подготовленные слай-ды и библиотеки слайдов (см. разд. 1.7). Описание графических меню рас-полагается в разделе IMAGE. Имена меню, которых в разделе может бытьмного, записываются в отдельных строках с префиксом из двух звездочек.

4.7.1. Структура пунктаПункты графического меню описывают операции, которые выполнит сис-тема AutoCAD, если пользователь щелкнет по слайду с нужным изображе-нием. Меню раздела IMAGE не имеют тегов, а наименование меню задаетсяв одном из шести вариантов:

• [<слайд>] — отображает слайд из файла с именем <слайд> в областислайдов;

Page 301: Visual LISP и секреты адаптации AutoCAD

300 Visual LISP и секреты адаптации AutoCAD

П [<слайд>,<текст>] — отображает слайд с именем <слайд> в области слай-дов, а <текст> — в области текстовых надписей;

• [<библиотека>(<слайд>) ] — отображает слайд с названием <слайд>, вклю-ченный в библиотеку с именем <библиотека>;

• [<библиотека>(<слайд>,<текст>) ] — отображает слайд из библиотеки вобласти слайдов, а <текст> — в области надписей;

• [<пусто>] — выводит разделительную линию в области надписей и пус-той слайд в области слайдов (<пусто> — текст из одних пробелов);

• [ <текст>] — выводит текст в зону надписей и пустой слайд (обратитевнимание на то, что перед параметром <текст> стоит пробел); использу-ется в сложных меню для надписей типа Выход.

В этих вариантах в параметре <слайд> не надо указывать расширение sld, а впараметре <библиотека> — расширение sib, которые подразумеваются. В тоже время параметр <слайд> в первом и втором вариантах и параметр<библиотека> в третьем и четвертом вариантах могут содержать полные име-на файлов с путями.

Макросы, используемые в графических меню, удовлетворяют тем же требо-ваниям, что и макросы других типов меню. В листинге 4.8 приведен текстграфического меню imagevporti из базовой группы ACAD.

| Листинг 4.8. Графическое меню image_vporti из файла acad.mnu i

**image vporti

[Модель: неперекр ВЭ]

[acad(vport-l,OflHH ВЭ)]ЛСЛС(ai_tiledvp 1 nil)

[acad(vport-3v,Три ВЭ: вертикально)]ЛСАС(ai_tiledvp 3 "_V")

[acad(vport-3h,Три ВЭ: горизонтально)]ЛСЛС(ai_tiledvp 3 "_Н")

Гacad(vport-4,Четыре ВЭ: симметрично)]ЛСАС(ai_tiledvp 4 nil)

[acad (vport-2v, Два ВЭ: вертикально) ]/^C

/vC(ai_tiledvp 2 "_V")

[acad (vport-3r, Три ВЭ: справа) ] ЛС

ЛС (ai_t.iledvp 3 "_R")

[acad(vport-31,Три ВЭ: слева)]ЛСЛС(ai_tiledvp 3 "_L")

[acad(vport-41,Четыре ВЭ: слева)]ЛСЛС(ai_tiledvp 4 "_L")

[acad(vport-2h,Два ВЭ: горизонтально)]ЛСЛС(ai_tiledvp 2 "_Н")

[acad(vport-За,Три ВЭ: сверху)]ЛСЛС(ai^tiledvp 3 "_А")

[acad(vport-3b,Три ВЭ: снизу)]"СС(ai_tiledvp 3 "_В")

[acad(vport-4r.Четыре.ВЭ: справа)]ЛСЛС(ai_tiledvp 4 "_R")

Первая строка, которая располагается сразу же за строкой с именем меню,определяет заголовок, выводимый в верхнюю часть окна, в которое реализу-ется графическое меню при выводе. На рис. 4.20 показано то же графиче-ское меню в раскрытом виде.

Page 302: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 301

Модель: неперекр ВЗОдин.ВЭТри ВЗ: вертикальноТри ВЭ; горизюктальнсЧетыре ВЗ. симметри1

Два ВЭ: вертикальноТри ВЭ'. справаТри ВЗ: слеваЧетыре ВЗ: слеваДва 63: горизсштальнТри БЗ: сверхуТ р и В З : C H H 3 ! J

Ч етыре ВЭ • справа

г =

ш=1—

Рис. 4 . 2 0 . Графическое меню image_vporti

4.7.2. Вызов менюПри вызове графического меню следует иметь в виду особенность: графическоеменю надо сначала активизировать, а затем вывести с помощью звездочки.

Пример вызова меню IMAGEVPORTI из макроса меню:

° $1=IMAGE_VPORTI $I=*

Пример вызова того же меню из программы на языке AutoLISP:

° (menucmd "I=IMAGE_VPORTI")

(menucmd "!=*•)

4.8. Кнопочные менюКнопочные (из разделов BUTTONS с номерами 1—4) и дополнительные кно-почные меню (из разделов AUX с номерами 1—4) идентичны по структуре.Используются только в базовых меню и игнорируются во фрагментных меню.

Обычное устройство указания (мышь) работает с меню из разделов AUX, aдополнительные устройства (дигитайзер) используют BUTTONS для про-граммирования работы кнопок.

В приложении 4 приведены тексты стандартного варианта программированияменю разделов AUX и BUTTONS. Меню AUX работают при следующихкомбинациях кнопок и клавиш:

П AUX1 - <RightButton>;

Page 303: Visual LISP и секреты адаптации AutoCAD

302 Visual LISP и секреты адаптации AutoCAD

• AUX2 — <Shift>+<RightButton>;

• AUX3 — <Cirl>+<RightButton>;

П AUX4 — <Sliift>+<Ctrl>+<RiglitButton>.

4.9. Планшетные менюПланшетные меню находятся в четырех разделах TABLET и имеют номераот 1 до 4. Меню этого типа предназначены для программирования четырех.зон планшета, в каждой из которых может быть до 32 766 пунктов. Реальноерасположение зон и количество пунктов определяется в операции калиб-ровки планшета с помощью команды ПЛАНШЕТ (TABLET).

Каждая из четырех зон планшета делится на строки и столбцы. В приложе-нии 4 приведены фрагменты планшетных меню: в разделе TABLETI нахо-дится шаблон для меню из 9 строк и 15 столбцов, а в разделе TABLET2 —пример меню из 9 строк и 11 столбцов.

Каждый раздел содержит строку с названием меню (например,+ 1TABLET2STD) И конечную строку (например, **-ЕЖТАВ2). В меню сначаларасполагаются пункты первой строки зоны планшета, начиная с первого (А-1, А-2, ), затем — пункты второй строки (В-1, В-2, ) и т. д. Наименованияпунктов не обязательны, т. к. последовательность записи макросов пунктовменю определяется порядком следования пунктов.

Макросы, используемые в планшетных меню, удовлетворяют обычнойструктуре, рассмотренной в разд. 4.4.2.

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

4.10.1. Адаптация панелиПереход в режим адаптации панели инструментов выполняется щелчком покнопке Адаптация (Customize) диалогового окна Панели (Toolbars), приве-денного на рис. 4.8. Это вызывает диалоговое окно Адаптация панелей(Customize Toolbars).

На рис. 4.21 показаны панель инструментов Размеры и открытые диалого-вые окна Панели (Toolbars) и Адаптация панелей (Customize Toolbars). Поль-зователь может добавлять кнопки, перетаскивая мышью пиктограммы, ко-торые имеются в окне Адаптация панелей (Customize Toolbars) (не обяза-тельно только из категории, соответствующей редактируемой панели), вобласть изменяемой панели. Обратная операция (перетаскивание кнопок из

Page 304: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 303

редактируемой панели в окно Адаптация панелей (Customize Toolbars)) уда-ляет кнопки из панели.

DD & ^ | < or. ^ -Лч Ч ''-? ц «t I •>

: ^ | J J & &Ш 0 3 \ш Послою 3 | — Постю _£\ | Пл п.ж

о п

«а у-

В ГА •

Ж: *-* ни

Панели

Ц ЛистыQ Объектная привязкаQ оверхностиПпск• ПСК-2

Нивая

Удалить

Свойства

Г* Крупные кнопки Р" Вспаываюшие подекаден

Адаптация панвяей

Категории;

мм

<*

-VКГ

1.4

-м V/ -^ '• •• d

Ж >-А аа * А Л

Ш Ы ^ « «

J

Описанме

14 4 У У\\Шяеяь [Писг'\ £ Пист2 / "illКоманда[Команда __toolbar[Команда

760977 2Э6.5ЭЭ7,0.0000 ШАГ СЕТКА ОРТО 0ТС-ПОЛЯР|ПРИВЧЗКА ОТС:ПРИВ БЕС|МОДЕГ

Рис. 4 . 2 1 . Диалоговое окно Адаптация панелей

Операция редактирования общих свойств панели и соответствующее ей диа-логовое окно были описаны в разд. 4.2.2.

При необходимости посмотреть свойства конкретной кнопки панели инст-рументов нужно при открытом диалоговом окне Панели (Toolbars) щелкнутьправой кнопкой мыши по этой кнопке в панели. Появится диалоговое окноСвойства кнопки (Button Properties), приведенное на рис. 4.22.

Данное окно дает возможность пользователю с помощью поля Имя (Name)поменять всплывающую подсказку, с помощью поля Подсказка (Help) —текст подсказки, выводимой в строку режимов, а в области Макрос(Macro) — модифицировать текст макроса, назначенного данной кнопке.В области Пиктограмма (Button Icon) диалогового окна Свойства кнопки(Button Properties) видны вертикальная полоса прокрутки пиктограмм кно-пок панели и укрупненное изображение выбранной кнопки. Кнопка Редакт(Edit) позволяет вызвать редактор пиктограмм кнопок, который будет рас-смотрен в разд. 4.10.4.

Page 305: Visual LISP и секреты адаптации AutoCAD

304 Visual LISP и секреты адаптации AutoCAD

OD tS- Q

^ j [ • Послога _»] j Послою

/ A

Г" крупные кнопки Р Всплывающие подсказки

i 4 у И \ Модель X Пист1 £ Лист2 /

)Н внесение пинеймого размера РЗМ Справка

Пиктограмма

ИJ

iiJКоманда(Команда ^.t oolbar|Комэнда

Нанесение линейного размера- РЗМЛИНЕЙНЫЙ

Рис. 4.22. Диалоговое окно Свойства кнопки

Если вы щелкнете правой кнопкой мыши по групповой кнопке, котораяимеет черный треугольник в правом нижнем углу пиктограммы, то раскро-ется диалоговое окно Свойства подменю (Flyout Properties) (рис. 4.23).

Свойстве подменю

Имя:

Подсказка: |Панель "Объектная привязка" Справка

Связать с панельюПиктограмма

AD43. ВставкаАСАО.ЗумированибACAD. Листы

Д Г й П П Л Р ^ П У М П

I выводить указанную пиктограмму

Редакт.

Рис. 4.23. Диалоговое окно Свойства подменю

Структура этого окна похожа на структуру диалогового окна, приведенногона рис. 4.22. Отличия будут понятны, когда вы познакомитесь со структуройпункта меню, соответствующего групповой кнопке панели инструментов(см. разд. 4.10.3).

Page 306: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 305

4.10.2. Создание новой панелиДля создания новой панели инструментов нужно воспользоваться кнопкойНовая (New) в диалоговом окне Адаптация панелей (Customize Toolbars).

Щелчок по этой кнопке вызывает диалого-вое окно Новая панель (New Toolbar), при-Новая панель

ОК

ОтменйГруппа меню: "

JAIIAD 3 СпРУка

веденное на рис. 4.24.

Рис. 4 . 2 4 . Диалоговое окно Новая панель

В этом окне нужно выбрать имя группы, к которой вы добавляете панель, иввести имя новой панели (например, "Новая I"). После щелчка по кнопкеОК на экране появится новая пустая панель (рис. 4.25), в которой нет ниодной кнопки.

Далее следует, используя методы, изложенные в разд. 4.10.1, добавить в этупанель нужные кнопки, отредактировать свойства панелей и кнопок. Двой-ной щелчок по кнопке в зоне панели добавляет перед кнопкой вертикаль-ную разделительную линию. Возможный вид панели Новая 1 показан нарис. 4.26.

ШРис. 4 . 2 5 . Новая пустая [SM 2? ! <§> >5> Рис- 4 . 2 6 . Новая панельпанель инструментов ] инструментов с кнопками

Если перетаскивать кнопку из окна Адаптация панелей (Customize Toolbars)не в существующую панель, а на свободное место экрана, то системаAutoCAD сразу создаст новую панель с одной кнопкой.

4.10.3. Структура данных о панелиРазберем структуру данных в разделе TOOLBARS на примере фрагментафайла шаблона стандартного меню системы AutoCAD, приведенного в лис-тинге 4.9.

; Листинг 4.9. Фрагмент раздела TOOLBARS файла acad.mnu i

**ТВ_OBJECT^PROPERTIES

IDJTbObjectP [JToolbar("Свойства объектов", __Тор, _Show, 0, 1, 1)]

ID Ai_molc [_Button("Сделать слой объекта текущим", ICON_16_MOLC,ICON_16_MOLC) ]

AC'

4C_ai_molc

ID_Layer [_Button("Слои", IC0N_16_LAYERS, ICON_16 LAYERS)]'_layer

[ — ]ID_CtrlLayer [^Contro l(_Layer)]

Page 307: Visual LISP и секреты адаптации AutoCAD

306 Visual LISP и секреты адаптации AutoCAD

[ — ]

ID_CtrlColor [_Control(_Color)]

[ - - ]ID_CtrlLinet [Control(_Linetype)]

[ — ]

ID_CtrlLineW [_Control (__Lineweight) ]

[ — ]

lD_CtrlPStyl [^Control(_PlotStyle)]

Строка, начинающаяся с двух звездочек, определяет имя меню, связываемогов файле шаблона с панелью. В имени не допускаются другие символы, кромебукв, цифр, и знаков _. Традиционно имена начинаются с символов тв_.

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

[ Toolbar(<3аголовок>, <ориентация>, <видимость>, <х>, <у>, <ряды>)]

Параметр <заголовок> — это текстовая строка с двойными кавычками, кото-рая выводится в заголовке окна панели, когда она находится в плавающемположении.

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

• Floating — панель находится в плавающем положении;

П тор — панель фиксирована в верхнем горизонтальном положении;

П Bottom — панель фиксирована в нижнем горизонтальном положении;

О Left — панель фиксирована в левом вертикальном положении;

• Right — панель фиксирована в правом вертикальном положении.

Параметр <видимость> может принимать только такие значения (регистр не-важен):

• Hide — панель убрана с экрана;

• show — панель находится на экране.

Параметры <х> и <у> задают, соответственно, положение, в пикселах, левойи верхней кромок панели. Положение левой кромки указывается от левойграницы, а верхней кромки — от верхней границы окна системы AutoCAD.

Параметр <ряды> указывает количество рядов, которые занимает панель вплавающем положении.

В примере, приведенном в листинге 4.9, панель Свойства объектов видима изафиксирована в верхнем горизонтальном положении.

Page 308: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 307

Далее вслед за строкой со свойствами панели идет строка, описывающаякнопку. Наименование пункта меню, соответствующего описанию кнопки,имеет такую структуру:

[_Button(<подсказка>, <пиктограмма-16>, <пиктограмма-24>)]

Здесь параметр <подсказка> — это текстовая строка с подсказкой к даннойкнопке.

Параметры <пиктограмма-1б>, <пиктограмма-24> определяют имена растровыхфайлов в BMP-формате, которые содержат пиктограммы кнопки в малом ибольшом форматах (величина кнопок управляется состоянием флажка Круп-ные кнопки (Large Buttons) в диалоговом окне Панели (Toolbars)). Пикто-граммы малого формата имеют размер 16x15 пикселов, а большого — 24x22пиксела. Имена BMP-файлов, указанных в определении кнопок, должныбыть доступны системе AutoCAD с помощью путей поиска файлов под-держки (см. разд. 1.3). Если указанные BMP-файлы имеют размер большетребуемого, то AutoCAD их усекает.

В примере, приведенном в листинге 4.9, первая кнопка имеет подсказку"Сделать слой объекта текущим", а в качестве имен BMP-файлов указаноимя одного и того же файла icon_16_molc.bmp.

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

Между кнопками могут быть разделительные линии. Они программируютсяс помощью пунктов, имеющих наименование из двух минусов.

В примере, приведенном в листинге 4.9, есть еще один тип пункта — этосписок, наименование которого имеет следующую структуру:[^Control(<тип>)]

Параметр <тип> определяет тип выводимого списка и может приниматьтолько одно из значений:

• color — цвета;

П Dimstyle — размерные стили;

• _Layer — СЛОИ",

• _Linetype — ТИПЫ ЛИНИЙ;

• _Lineweight — веса ЛИНИЙ;

• _piotstyie — именованные стили печати;

• Refbikname — внешние ссылки;

П _ исзмападег — системы координат;

• _view —.виды;

• viewportscaie — масштабы видовых экранов.

Page 309: Visual LISP и секреты адаптации AutoCAD

308 Visual LISP и секреты адаптации AutoCAD

В панели Свойства объектов используются сразу пять списков: слоев, цве-тов, типов линий, весов линий и стилей печати.

Списки не отображаются на экране, когда панель инструментов находится ввертикальном положении.

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

В листинге 4.10 приведен фрагмент стандартного меню системы AutoCAD,содержащий описания групповых кнопок (он входит в менюTB_STANDARD, соответствующее панели инструментов Стандартная).

\ Листинг 4.10. Фрагмент раздела TOOLBARS файла acad.mnu :

IDJTbOsnap [__Flyout ("Объектная привязка", ICON_16_OSNAP, ICON_16_OSNAP,__0therlcon, ACAD.TB_OBJECT_SNAP)]

IDJTbUcs [_Flyout("ПСК", ICON_16_UCS, ICON_16_UCS, _OtherIcon,ACAD.TBJJCS)]

IDJTblnquiry [_Flyout("Сведения", ICON_16_LIST, ICON_16_LIST, Otherlcon,ACAD.TB_INQUIRY)]

Наименование пункта, соответствующего групповой кнопке, имеет такуюструктуру:

[_Flyout(<подсказка>, <пиктограмма-16>, <пиктограмма-24>, <какая>,<панель>)]

Параметры <подсказка>, <пиктограмма-16> И <пиктограмма-24> ИМСЮТ ТОТ жесмысл, что аналогичные параметры обычной кнопки. Параметр <какая> мо-жет принимать одно из значений:

• Ownicon — показать собственную пиктограмму групповой кнопки;

П othericon — показать пиктограмму последней нажатой кнопки группы.

Параметр <панель> является ссылкой на имя меню, которое содержит кноп-ки, входящие в данную группу (таким образом, группа должна оформлятьсяв файле шаблона меню как обычная панель). Групповые кнопки, описаниекоторых приведено в листинге 4.10, ссылаются на панели инструментов сименами меню TB_OBJECT_SNAP, ACAD.TB UCS, ACAD.TBJNQUIRY.

4.10.4. Операции с пиктограммами кнопокСоздавать свои пиктограммы для кнопок панелей инструментов можно лю-бым растровым редактором (например, редактором Paint, входящим в составоперационной системы Windows). Можно пользоваться редактором пикто-

Page 310: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 309

грамм, который входит в состав системы AutoCAD 2000, и вызывается пощелчку кнопки Редакт (Edit) диалогового окна Свойства кнопки (ButtonProperties) (см. рис. 4.22). Окно этого редактора приведено на рис. 4.27.

Редактор кнопок

v О V

Г Сетка

• •Ш

Сохранить как j Дохранить j j Закрыи | Спрэскз 1 Рис. 4.27. Диалоговое окноРедактор кнопок

Диалоговое окно Редактор кнопок (Buttons Editor) позволяет выполнять лю-бые операции с пиктограммами кнопок. В верхней части окна горизонталь-ный ряд из четырех кнопок задает операцию (раскрашивание пикселов, ри-сование линии, рисование окружности, стирание пикселов). Справа распо-ложена цветовая палитра, позволяющая назначить цвет для операцийрисования и раскрашивания.

Для облегчения операций редактирования изображения в центре диалого-вого окна Редактор кнопок (Buttons Editor) приводится укрупненное изобра-жение кнопки. Флажок Сетка (Grid) выводит вспомогательную сетку пиксе-лов. Кнопка Убрать (Clear) позволяет очистить изображение, если вы хотитенарисовать новую пиктограмму. Кнопка Открыть (Open) дает возможностьоткрыть другой файл в ВМР-формате.

Назначение кнопок Отменить (Undo), Сохранить как (Save As), Сохранить(Save), Закрыть (Close), Справка (Help) понятно из их наименований.

Отредактировав изображение, вы можете сохранить его под старым именемили записать в новый файл.

4.11. Контекстные менюКонтекстные меню — это меню, которые вызываются по нажатии правойкнопки мыши и пункты которых зависят от контекста (например, от именивыполняемой команды).

Page 311: Visual LISP и секреты адаптации AutoCAD

310 Visual LISP и секреты адаптации AutoCAD

4.11.1. Разделы с контекстными менюКонтекстным меню в файле шаблона соответствуют разделы РОРО, РОР500,РОР501 и другие разделы с именами типа РОРя, где п принимает значения от500 до 999. Меню РОРО вызывается щелчком правой кнопки мыши при нажа-той клавише <Shift> (фактически оно вызывается через меню AUX2 — см.разд. 4.8), остальные — щелчком правой кнопки мыши без клавиши <Shift>.

Структура разделов контекстных меню аналогична структуре разделов па-дающих меню. После строки с именем раздела должна идти строка с име-нем контекстного меню (строка начинается двумя звездочками). Некоторыеимена зарезервированы для нужд системы AutoCAD.

В приложении 4 приведен текст разделов РОР500 (имя меню — GRIPS),РОР501 (CMDEFAULT), POP502 (CMEDIT), POP503 (CMCOMMAND),РОР504 (OBJECTS_DIMENSION), POP505 (OBJECT_VIEWPORT), POP508(OBJECT_TEXT).

4.11.2. Схема работыконтекстных менюМеню GRIPS вызывается по щелчку правой кнопки мыши, если в рисункевысвечены ручки объектов, и одна из ручек выбрана (т. е. имеет красныйцвет).

Меню CM DEFAULT работает в тот момент, когда нет высвеченных ручек, ине выполняется никакая команда системы AutoCAD.

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

выбран только один объект, то меню должноиметь префикс OBJECT_. ЕСЛИ выбрано несколь-ко объектов, то меню должно иметь префиксOBJECTS. Далее к имени нужно добавить типвыбранного объекта или объектов (если выбранонесколько объектов, то они должны быть одноготипа). Поэтому к зарезервированным относятсятакие имена меню, как OBJECT__TEXT,OBJECT_LINE, OBJECTS_DIMENSION и т. п.На рис. 4.28 приведено контекстное меню, вы-зываемое при выделении с помощью ручек объ-екта типа LWPOLYLINE.

Повторить Полилиния

Редактирование полилинии

.Вырезать

КопироватьКопировать с базовой точкойВставить

Стереть

Перенести

Копировать выбранные

Масштаб

Повернуть

Отменить выбор

.Быстрый выборНайти,

СвойстваР и с . 4 . 2 8 . Контекстное меню редактированиялегкой полилинии

Page 312: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 311

Содержимое этого меню сложилось из содержимого меню CM EDIT и менюOBJECTLWPOLYLINE. Из последнего меню был взят пункт Редактироватьполи линию.

В стандартном меню системы AutoCAD есть следующие меню с префиксамиОШЕСТ_ или OBJECTS,:

• OBJECTS_DIMENSION

• OBJECT_VIEWPORT

• OBJECTS_XREF

П OBJECT_MTEXT

• OBJECT TEXT

• OBJECT_HATCH

• OBJECT_LWPOLYLINE

• OBJECTSPLINE

• В системе AutoCAD 2000i к этим меню еще добавлено OBJECT POLYLINE.

AutoCAD 2000 • НС ДЛЯ ПЕРЕПРОДАЖИ • IDiawmsl]Райо Правка Дца Вставка Формат £ервнс £исоьание Размеры Редакт EKptess Окно Справка ~ j f l I x|

D & H 3 J . . У Чэ 85, *i ^ °-' w , tt, г=з < Щ S3 ч& J 5 Ci* Q, ®f I? «f и ?

/> К

• D

a 4 <

Г 0© h:

о /ffi +

4> -i• t j

а гIS rA /'

I- --* J t -

/ \/ \/ \/ \\

XX11"11Inz3>

j I —J IEnterПрервать

Дсбабкть

'J] ир'инаВершина

СГпадить

СПлайн

Убрать сглаживание

Отиенк^ть

Панорамирование

Зумирование

I J

2Л 1 —

—з

J

Команде: полред

е в реальном времени- ПОКАЗАТЬ

,1]

Рис. 4 . 2 9 . Связь контекстного меню с опциями выполняемой команды

Контекстное меню с именем CMCOMMAND работает, когда нет выделенныхобъектов, и выполняется команда системы AutoCAD или команда, определен-

Page 313: Visual LISP и секреты адаптации AutoCAD

312 Visual LISP и секреты адаптации AutoCAD

ная пользовательским приложением. К пунктам этого меню в качестве строкдобавляются опции, которые выведены в командную строку в квадратныхскобках и разделены символами /. На рис. 4.29 приведен пример контекст-ного меню, появляющегося во время работы команды ПОЛРЕД (PEDIT).

К пунктам контекстного меню CMCOMMAND при выводе добавляютсяеще пункты тех контекстных меню, которые имеют имя, начинающееся спрефикса COMMAND_, а далее присоединено имя выполняемой команды.Так, например, при выполнении команды ABCD будет проверено наличиеменю с именем COMMAND_ABCD и, если такое контекстное меню суще-ствует, то его пункты будут добавлены к другим выводимым пунктам.

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

4.12. Раздел HELPSTRINGSТексты всех подсказок, выводимых в строку режимов при выделении пунк-тов меню или при прохождении мыши над кнопкой панели, собираются вразделе HELPSTRINGS. Структура записей этого раздела такова:<тег>[<подсказка>]

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

В приложении '/представлен фрагмент раздела HELPSTRINGS стандартногоменю системы AutoCAD. В листинге 4.И приведены еще несколько фраг-ментов из этого меню (длинные строки показаны в листинге в две строки).

I Листинг 4.11. Фрагмент раздела HELPSTRINGS файла acad.mnu \

ID_Line [Создание прямолинейных сегментов: ОТРЕЗОК]ID_Linetype [Создание, загрузка и установка типов линий: ТИПЛИН]ID Linewt [Установка текущего веса линий, режима и единиц отображениялиний с разными весами: ВЕСНИН]ID_Links [Обновление, изменение и отмена OLE-связей: ВНЕДРСВЯЗИ]ID_List [Выдача информации о выбранных объектах из базы данных ри-сунка: СПИСОК]ID__TbLayouts [Панель "Листы"]ID_LayNew [Создание нового листа с учетом заданных параметров листа ипечати: -РЛИСТ Н]ID_TbVpCreat [Панель "Создание видовых экранов"]ID^VpDialog [Вывод диалогового окна видовых экранов: ВЭКРАН]

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

Page 314: Visual LISP и секреты адаптации AutoCAD

Глава 4. Маню 313

4.13. Раздел ACCELERATORSВ разделе ACCELERATORS собираются описания всех комбинаций клавиш,выполняющих операции системы AutoCAD, кроме горячих клавиш, рабо-тающих по принципу <Ак>+<буква> (о горячих клавишах см. разд. 4.4.1).

Комбинации клавиш и выполняемые ими действия могут быть записаны вменю строками в двух вариантах. Первый вариант:

<тег>[<комбинация>]

Здесь <тег> — это имя тега любого из пунктов любого загруженного меню, а<ком&инация> — описание используемой комбинации клавиш (обычные ифункциональные клавиши указываются в двойных кавычках, а для специ-альных клавиш используются обозначения CONTROL, ALT, SHIFT, INSERT,

DELETE, ESCAPE, UP, DOWN, LEFT, RIGHT).

Примеры:D ID_Copyclip [CONTROL+"C"]

° ID__Save [CONTROL+"S"]

° IJJPasteclip [CONTROLVV"]

° IDJ/BAIDE [ALT+"F11"]

Другой вариант описания комбинаций клавиш:

[<комбинация>]<макрос>

Здесь не применяется ссылка на теги других пунктов, зато имеется явное опи-сание макроса, выполняемого по нажатии комбинации клавиш. Примеры:

° [CONTROL+"L"jЛ0

и fCOMTROL+"R"]AV

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

Назначая комбинации клавиш, пользователь должен помнить, что одиноч-ные нажатия функциональных клавиш <F3>—<F11> используются систе-мой AutoCAD для переключения режимов. Кроме того, традиционно кла-виша <F1> служит для вызова помощи, клавиша <F2> — для переключениямежду текстовым и графическим экранами, а некоторые комбинации заре-зервированы операционной системой Windows (ALT+<F4>, <Ctrl>+<Esc>,<Ctrl>+<Shift>+<Esc> и др.).

Цифровые клавиши на правой (цифровой) клавиатуре обозначаются"NUMPADO", "NUMPADl", . . . , "NUMPAD9".

Page 315: Visual LISP и секреты адаптации AutoCAD

314 Visual LISP и секреты адаптации AutoCAD

4.14. Язык DIESELЯзык DIESEL (Direct Inteipretively Evaluated String Expression Language) —язык оперирования строками с небольшим количеством функций. Он по-зволяет формировать строки, которые должны иметь переменный текст, за-висящий от условий (например, от имени открытого рисунка или от теку-щего значения некоторой системной переменной). С помощью языкаDIESEL можно задавать изменяемое значение системной переменнойMODEMACRO и изменяемые наименования пунктов меню.

4.14.1. ВыраженияВыражения языка DIESEL имеют следующую структуру (квадратные скобкиуказывают на необязательность элемента):$(<фун>[,<арг1>[,<арг2> ... [,<арг9>] ... ]])

Здесь <фун> — имя функции, <арП>, <арг2>, ..., <арг9> — аргументы. Коли-чество аргументов не должно быть больше девяти (конкретные функциимогут допускать и меньшее количество).

Все элементы, с которыми работает язык DIESEL, — строки. Даже число-вые аргументы на самом деле являются строковыми представлениями длячисел. Пробелы в выражении DIESEL обычно имеют свой смысл, поэтомуиспользование лишних пробелов без необходимости не рекомендуется. Ка-вычки, ограничивающие строки, применяются только в особых случаях.

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

Выражения языка DIESEL возвращают значения, которые являются строко-выми, поэтому могут применяться при программировании меню и в качест-ве аргументов функций AutoLISP, работающих со строками.

4.14.2. ФункцииВ языке DIESEL 28 функций: +, -, *, /, =, <, >, !=, <=, >=, and, angtos, edtime,eq, eval, fix, getenv, getvar, if, index, linelen, nth, or, rtos, strlen, substr,upper, xor.

Даже по наименованиям видно, что функции языка DIESEL близки кфункциям языка AutoLISP, хотя некоторые функции немного отличаются (восновном, количеством аргументов). Подробнее назначение функций языкаDIESEL описано в приложении 16.

Рассмотрим пример использования выражения DIESEL для задания сис-темной переменной MODEMACRO, которое записывается в строку режи-мов, сдвигая вправо ее содержимое.(setvar "MODEMACRO" (strcat "Текущий цвет: " "$(getvar,cecolor)"))

Page 316: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 315

Выражение "$ (getvar,cecolor)" представляет собой строку, содержимое ко-торой является переменным и формируется интерпретатором языка DIESEL(обратите внимание, что имя системной переменной CECOLOR указываетсябез кавычек). Внутри двойных кавычек находится выражение, аналогичноепо результату выражению (getvar "CECOLOR") языка AutoLISP.

Казалось бы, можно было то же действие описать, используя только AutoLISP:

(setvar "MODEMACRO" (strcat "Текущий цвет: " (getvar "CECOLOR")))

Однако разница заключается в том, что второе выражение (без языкаDIESEL) имеет одноразовое действие, а первое будет давать результат прикаждом изменении текущего цвета рисунка (проверьте!).

Аналогичным образом ваше приложение может помочь отслеживанию встроке режимов некоторых важных сведений (например, номера проекта,номера чертежа и т. д.). Для передачи информации могут быть использова-ны системные переменные USERS1, USERS2, USERS3, USERS4, USERS5,значения которых сохраняются в рисунке (в отличие от значения системнойпеременной MODEMACRO, которая очищается при закрытии рисунка).

4.14.3. Сообщения об ошибкахИнтерпретатор языка DIESEL может выдавать сообщения об ошибках, ко-торые сведены в табл. 4.4.

Таблица 4.4. Сообщения об ошибках интерпретатора языка DIESEL

Сообщение Описание

$? Синтаксическая ошибка (например, нарушен баланс скобок)

$ (<фун>, ??) Неверно количество аргументов функции <фун>

$(<фун>)?? Неверно имя функции

$ (-*-+) Длина результирующей строки превысила допустимое значение

4.14.4. Использование в менюЯзык DIESEL полезен для формирования переменных наименований пунк-тов меню, а также для изменения состояния пункта меню (отметки или га-шения).

В листинге 4.3 уже были даны примеры выражений DIESEL в наименова-ниях пунктов падающего меню раздела РОРЗ. С помощью DIESEL переднаименованиями пунктов вставлялись или не вставлялись символы !., на-личие которых является признаком отметки пункта (об отметке сказано вразд. 4.5.4). '

Page 317: Visual LISP и секреты адаптации AutoCAD

316 Visual LISP и секреты адаптации AutoCAD

В листинге 4.12 приведен пример использования DIESEL в макросах меню(заодно исправим ошибку в стандартном меню).

Листинг 4.12. Фрагмент раздела TOOLBARS (меню TB_REFERENCE)файла acad.mnu

ID Xclipfram [ Button("Контур подрезки внешней ссылки",

ICON_16_XCLIPFRAME,ICON_16 XCLTPFRAME)]$М=$(if,$(eq,$(getvar,xclipframe),

f ra:ne 1)

Здесь текст макроса, описывающего действие кнопки панели инструментовСсылки (Reference), состоит из одного выражения, которое начинается с ком-бинации символов $м, что означает использование выражения на языке DIESEL(описание комбинаций символов в меню было приведено в разд. 4.4.2).

В в ы р а ж е н и и $ (if, $ (eq, $ ( g e t v a r , xc l ipframe) ,1) , Л С Л С_xcl ip f rame _0, ЛСАС__xclipframe i) анализируется значение системной переменнойXCLIPFRAME, которая управляет видимостью контуров подрезки внешнихссылок и блоков. Если значение переменной равно 1, то возвращается стро-ка __xciipframe _о, а если равно 0 — то строка xdipfгагае 1 (используемаяздесь команда _XCLIPFRAME изменяет значение системной переменнойXCLIPFRAME). Поэтому с помощью выражения система AutoCAD пытает-ся изменить значение системной переменной XCLIPFRAME на _0 или _1.

Ошибка заключалась в том, что перед цифрами 0 и 1 символ подчеркиванияне требуется (вы можете в своей версии ее исправить).

4.14.5. DIESEL и AutoLISPВыражения языка DIESEL иногда могут быть полезными и р программах,написанных на языке AutoLISP. Один вариант этого (с системной перемен-ной MODEMACRO) уже рассмотрен в разд. 4.14.2. Другие варианты возни-кают при программировании операций с меню или макросов меню.

Во-первых, в языке DIESEL есть функции, отсутствующие в AutoLISP(edtime, linelen). Во-вторых, функция menucmd может использовать выраже-ния DIESEL.

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

4.15. MNL-файлыОдновременно с загрузкой файла шаблона меню или тройки файлов менюсистема AutoCAD пытается загрузить также MNL-файл с таким же именем,что и у файлов меню. Например, при загрузке файла acad.mnu (или файлов

Page 318: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 317

acad.mnc, acad.mns, acad.mnr) загружается файл acad.mnl, который являетсяфайлом на языке AutoLISP. В листинге 4.13 приведен фрагмент файлаacad.mnl русской версии системы AutoCAD 2000.

i Листинг 4.13. Фрагмент файла acad.mnl :

;;; AutoLISP routines used by the AutoCAD Standard Menu.

; ; ; This file is loaded automatically following the menu ACAD.

(princ "NnAutoCAD menu utilities ")

... _,= j

c o n иепи Functions ===

;;; Уlew -> Layout -> Tiled Viewports...

(defun ai tiledvp_chk (new)

(setq m:err 'error* 'error* *merrmsg*)

(if (= (getvar "TILEMODE") 0)

(progn

(princ "\n** Command not allowed in a Layout **")

{princ)

(progn

(if new

(menucmd "I=ACAD.IMAGE VPORTI")

(menucmd "I=IMAGE_VPORTI")

)

(menucmd "I—*")

(setq *error* m:err m:err nil)

(princ)

(defun ai_tiledvp (num ori / ai_tiles_g ai_tiles_cmde)

(setq m:err "error* *error* *merrrasg*

ai_tiles_cmde (getvar "CMDECHO")

ai_tiles_g (getvar "GRIDMODE")

)

(ai. undo_push)

(setvar "CMDECHO" 0)

(setvar "GRIDMODE" 0)

fcond ((= num 1)

(command " .VPORTS" " SI")

Page 319: Visual LISP и секреты адаптации AutoCAD

318 Visual LISP и секреты адаптации AutoCAD

(setvar "GRIDMODE" ai_tiles_g)

)

((< num 4)

(command " .VPORTS" " SI")

(command. "_.VPORTS" num ori)

(setvar "GRIDMODE" ai_tiles_g)

)

( (•=-- ori nil)

(command "_.VPORTS" "_SI")

(command "_.VPORTS" num)

fsetvar "GRIDMODE" ai_tiles_g)

(command "_.VPORTS" "_SI")

(command " .VPORTS" "2" "")

(setvar "CVPORT" (car (cadr (vports))))

{command " .VPORTS" "2" "")

(command "_.VPORTS" "_J" "" (car (cadr (vports))))

(setvar "CVPORT" (car (cadr (vports))))

(command " .VPORTS" "3" " H")

(setvar "GRIDMODE" ai_tiles g)

(setvar "CVPORT" (car (cadddr (vports))))

(setvar "GRJDMODE" ai_tiles_g)

(setvar "CVPORT" (car (cadddr (vports))))

(setvar "GRIDMODE" ai_tiles_g)

(setvar "CVPORT" (car (cadddr (vports))))

(setvar "GRIDMODE" ai_tiles_g)

)

(T

(command "_.VPORTS" "_SI")

(command "_.VPORTS" "2" "")

(command "_.VPORTS" "2" "")

(setvar "CVPORT" (car (caddr (vports))))

(command "_.VPORTS" " J" "" (car (caddr (vports))))

(setvar "CVPORT" (car (cadr (vports))))

(command "_.VPORTS" "3" "__H")

(setvar "GRIDMODE" ai tiles_g)

(setvar "CVPORT" (car (cadddr (vports))))

(setvar "GRIDMODE" ai_tiles_g)

(setvar "CVPORT" (car (cadddr (vports))))

(setvar "GRIDMODE" ai tiles_g)

(setvar "CVPORT" (car (cadddr (vports))))

(setvar "GRIDMODE" ai tiles jg)

Page 320: Visual LISP и секреты адаптации AutoCAD

Глава 4. Меню 319

(a i_undo_pop)(setq *error* m:err m:err nil)

(setvar "CMDECHO" ai_tiles_cmde)

(princ)

Из листинга видно, что это обычный файл, который может загружать необ-ходимые описания функций или выполнять некоторые выражения на языкеAutoLISP (просматривается аналогия с файлом acaddoc.lsp, который загру-жается при открытии нового рисунка).

Поэтому пользователь, создавая свой файл меню (например, mynew.mnu),может написать файл mynew.mnl, в который включить необходимые LISP-программы или LISP-выражения. Такой файл следует поместить в ту жепапку, что и файл меню, и они будут загружаться один за другим.

Page 321: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 5

Диалоговые окна

Важным компонентом приложений в среде AutoCAD являются диалоговыеокна, в которых в нужной форме отображается полезная для пользователяинформация и в которых удобно вводить дополнительные данные или ука-зывать настройки, необходимые для правильной и управляемой работы при-ложения. Приложения, написанные на языках AutoLISP или C++, хранятсвои диалоговые окна в текстовых DCL-файлах (файлах с расширением del).При разработке VLX-приложений есть возможность не держать DCL-файлыотдельно, а включить в состав VLX-файлов (см. разд. 3.4.3).

Примерами таких файлов являются файлы acad.dcl, ase.dcl, base.del,ddptype.dcl, ddvpoint.dd, doshelp.dcl, filter.dcl, rendcomm.dcl, render.dcl,viewslid.dcl, расположенные в папке Support программного обеспечения сис-темы AutoCAD 2000. Они описывают все диалоговые окна, используемыесистемой.

Особую роль играет файл base.del, который содержит определения полейс базовыми элементами управления (кнопками, списками, переключателямии др., вместе с окружающим их пространством).

5.1. Язык DCLДля диалоговых окон разработан специальный язык DCL (Dialog ControlLanguage), который имеет много общего с языком С.

5.1.1. ДирективыФайл, написанный на языке DCL, состоит из логических единиц — дирек-тив, которые записываются в свободном формате.

Директивы располагаются в файле последовательно. Каждая директива опи-сывает поле или способ группировки полей при выравнивании внутри диа-

Page 322: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 321

лотового окна. Есть также директива для описания диалога в целом. В од-ном файле могут быть заданы один или несколько диалогов. Для того чтобыпрограмма могла обратиться к диалогу, нужно выполнить загрузку DCL-файла, содержащего описание этого диалога, с помощью специальнойфункции load_dialog (см. разд. 5.2.1).

Не обязательно начинать директивы с новой строки (хотя опыт показывает,что, размещая каждую директиву с новой строки, вы облегчаете себе после-дующее чтение файла). Признаком конца директивы (и, соответственно, раз-делителем между директивами) является точка с запятой или закрывающаяфигурная скобка. Скобки должны быть сбалансированы (количество откры-вающих скобок должно быть равно количеству закрывающих). Между клю-чевыми словами языка, разделительными символами (к которым относятсядвоеточие, точка с запятой, знак равенства, фигурные скобки), метками,числовыми и строковыми значениями может быть любое количество пробе-лов. Текстовые строки должны заключаться в двойные кавычки.

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

Директивы могут записываться в одном из двух видов. Первый вид дирек-тивы:

[<метка>]:<оператор>{<атрибуты>}

Здесь квадратные скобки обозначают необязательность стоящего внутри нихэлемента. Фигурные скобки и двоеточие являются обычными символами.

Пример:

Uzel:edit_box{1аЬе1="Имя узла:";edit_width=40;value="";key="um";}

Второй вид директивы:

<метка>;

Пример такой директивы:

ok_cgmcel_help_info;

Параметр <метка> — это метка директивы (по этой метке можно ссылатьсяна данную директиву в других местах текста описания диалогового окна).Метка — это идентификатор директивы, который должен быть уникальнымв файле. В примере директивы первого типа метка директивы — uzel.В примере директивы второго типа метка ok_cancei_heip_info является ссы-лочной меткой на область (группу кнопок), описанную в базовом файлеbase.dcl.

1 1 Зак. 155

Page 323: Visual LISP и секреты адаптации AutoCAD

322 Visual LISP и секреты адаптации AutoCAD

Параметр <оператор> — это либо ключевое слово определения диалога, либоключевое слово с типом поля, либо метка другой директивы с типом поля,либо ключевое слово группирования полей.

( Замечание ^В параметре <оператор> может быть указано сразу несколько меток, разде-ляемых двоеточиями. В этом случае AutoCAD берет значения атрибутов из поляс первой меткой, дополняет их значениями других атрибутов из поля со второйметкой и т.д. Пример такой директивы: im:oper l :oper2{ label="Double"; } .Здесь ran — это метка новой директивы, a oper l и орег2 — метки ранее соз-данных директив. Если имена атрибутов, использованных в директивах oper lи орег2, повторяются, то приоритет имеет первая директива.

В приведенном выше примере директивы первого типа в качестве параметра<оператор> используется ключевое слово edit_box, применяемое для редак-тируемых полей.

Если директива описывает поле диалогового окна, то параметр <атрибуты> —это описание атрибутов поля и их значений (записываются только те атри-буты, значения которых отличны от значений по умолчанию).

Параметр <атрибуты> — это последовательность разделяемых точкой с запя-той операций задания атрибутам значений, которая имеет вид:

<атрибут1>=<значение1>;[<атрибут2>=<значение2>;

[ ... <атрибутЫ>=<значениеЫ>]...]

Наименования атрибутов должны быть зарезервированными ключевымисловами. Значения атрибутов могут быть числами или строками (тип значе-ния зависит от атрибута).

Если директива является директивой группировки полей, то она содержитвнутри фигурных скобок директивы определения группируемых полей.

На рис. 5.1 приведен пример диалогового окна, появляющегося при входев подсистему ПАКТ (Подсистема Автоматизации Конструкторского Труда),разработанную в конструкторском бюро "Восток" и вошедшую после адап-тации в систему "РИТМ-Судно" ФГУП ЦНИИТС.

В листинге 5.1 приведен текст файла paktinfo.dcl, соответствующего диало-говому окну, изображенному на рис. 5.1.

; Листинг 5.1. Файл paktinfo.dcl I

pakt: dialog{1аЬе1="Подсистема ПАКТ, 1994-2000 г.г.";key="pin";width=50;

children_alignment=centered;

:text{label="KB \"Восток\" (ФГУП ЦНИИТС)";key="tl";}

Page 324: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 323

:image{key="dl";width=23;height=7;fixed_width=true;

color=graphics_background;}

:text{label="Pa3pa6oT4HKH: ";key="t2"; }

:text{label="IIonemyK H.H., Савельева В.А., Свиридова Л.Р.";key="t3";}

:text{label="Ten. (812) 186-16-60";key="t4";}

:textflabel="E-mail: poleshchukSpeterlink.ru";key="t5";}

:ok_button{label="Продолжить";fixed_width=true;is_cancel=true;}

Подсистема ПАКТ. 1994-2000 r.r.

КБ "Восток" [ФГУПЦНИЙТС!

•••'•.'•: ' Разработчики-' :.:::'•••;•:::"::::'.:.•'

Полещук Н.Н.. Савельева В.А., СвириАбваЛ.Р*

Тел. 1812) 166-16-60 ; ; : : ^ : ;

Рис. 5 . 1 . Начальное окноподсистемы ПАКТ

В этом листинге 11 строк. В целом они образуют директиву описания диа-лога, которому присвоено имя pakt (это имя записано в метке в начале пер-вой строки). Открывающая фигурная скобка этой директивы находится напервой строке, закрывающая — на последней. Подробнее о директиве опи-сания диалога см. разд. 5.1.2.

Директивы, расположенные в строках со второй по девятую, не только яв-ляются элементами директивы описания диалога (поскольку находятсявнутри фигурных скобок), но также являются директивами, описывающимиполя стандартных типов text и image (в строках 3, 4, 6, 7, 8, 9). Каждая ди-ректива начинается с новой строки. Одна директива занимает две строки(строки 4—5), а остальные директивы занимают по одной строке (строки 3,6, 7, 8, 9).

В строке 10 расположена ссылка на метку ok_button, под которой в файлеbase.dcl описывается поле с кнопкой выхода из диалога (кнопка ОК). За счетзадания значения атрибуту label надпись на кнопке изменена со стандарт-ной ОК на Продолжить.

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

Подробнее директивы описания полей будут рассматриваться в разд. 5.3.

Page 325: Visual LISP и секреты адаптации AutoCAD

324 Visual LISP и секреты адаптации AutoCAD

В начале DCL-файла могут быть строки с инструкциями копирования вданный файл содержимого других DCL-файлов, например:

@include "fourth-b.dcl"

Приведенная инструкция при загрузке основного DCL-файла копирует воперативную память содержимого файла fourth-b.dcl (если имя файла ука-зано без пути, то нужно, чтобы система AutoCAD могла обнаружить этотфайл с помощью путей поиска файлов поддержки — о настройке путей см.разд. 1.3).

Не допускается с помощью инструкции @include загружать файл acad.dcl состандартными диалогами системы AutoCAD.

После инструкций @include в файле могут располагаться директивы описа-ния полей, которые в явном виде не входят ни в какой диалог, но с помощьюметок ссылки на них могут быть добавлены в следующие ниже диалоги.

Если в тексте файла встречаются символы //, то для системы AutoCAD этоозначает, что далее до конца строки идет комментарий.

Написание и отладка DCL-файлов значительно облегчаются при использо-вании текстового редактора среды Visual LISP (см. разд. 3.3).

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

Директива описания диалога использует ключевое слово dialog и имеет сле-дующую форму:

<имя>:dialog{<атрибуты_окна> <поля>}

В качестве параметра <имя> может использоваться любой идентификатор(метка), который и задает имя, диалога. Имена диалогов в одном сеансеAutoCAD не должны повторяться, иначе может произойти замена одногодиалога другим.

Параметр <атрибуты_окна> представляет собой последовательность атрибутови их значений следующего вида:

<атрибут> = <значение>;

Параметр <поля> является набором директив описания полей (т. е. кнопок,списков, слайдов, надписей и других элементов).

Атрибуты диалогового окна — это различные характеристики окна в целомили его элементов. В табл. 5.1 приведены ключевые слова, которые могутиспользоваться в качестве атрибутов в директиве описания диалога.

Page 326: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 325

Таблица 5.1. Атрибуты директивы описания диалога

Атрибут ОписаниеДопустимыезначения

Значениепо умол-чанию

label

value

key

width

height

i n i t i a l focus

chi ldren alignment

chi ldren f ixed width

chi ldren f i x e d hight

Начальный заголовокдиалоговогоокна

Заголовок диалогово-го окна

Код поля для диалогав целом

Ширина окна

Высота окна

Код подсвеченногополя в диалоговомокне

Способ выравниванияподчиненных полейпо умолчанию

Фиксация шириныподчиненных полейпо умолчанию

Фиксация высотыподчиненных полейпо умолчанию

Строка

Строка

Строка

Число

Число

Строка

l e f t , r ight ,c e n t e r e d (дляколонок); top,bottom, c e n t e r e d(для рядов)

true, fa lse

true, fa lse

(пробел)

Нет

Нет

Нет

Нет

Нет

l e f t (дляколонок);centered(для рядов)

false

false

Если в описании диалога использованы лишние атрибуты, то они игнори-руются.

Атрибуты label и value близки по смыслу и в какой-то степени дублируютдруг друга. Различие между ними заключается в следующем.

Прочитав при загрузке описание диалога и входящих в него полей, системаAutoCAD по своим правилам определяет форму и размер выводимого диа-логового окна. Вычисляются минимальные размеры каждого поля, учитыва-ется последовательность расположения полей. Каждое поле дополняетсяокружающим его свободным пространством и в результате определяетсяразмер прямоугольника, в который выводится диалоговое окно. Строковоезначение, которое задано в атрибуте label, участвует в определении размера

Page 327: Visual LISP и секреты адаптации AutoCAD

326 Visual LISP и секреты адаптации AutoCAD

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

Если задано значение атрибута value, то в заголовок выводится оно, а незначение атрибута label. При этом если значение атрибута value короче,чем значение атрибута label, то в конец заголовка добавляются пробелы.Если значение атрибута value оказалось длиннее, чем значение атрибутаlabel, и не хватает места для его вывода, тогда размеры диалогового окна неувеличиваются, а текст, выводимый в заголовок, обрывается с помощьюмноготочия.

Можно программно изменять заголовок выводимого диалогового окна, ис-пользуя функцию set_tiie (см. разд. 5.4.3). Для этой цели служит атрибутkey, называемый кодом диалога (диалог — это уже не поле, но атрибут keyдля него сохранен, как для полей). В качестве значения кода диалога могутиспользоваться только строки (по поводу ограничений на коды диалога см.ограничения на коды полей, приведенные в разд. 5.1.1).

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

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

Атрибут initiai_focus указывает код поля, которое подсвечивается по умол-чанию и выполняет действие при нажатии пользователем клавиши <Enter>.

Три атрибута с префиксом chiidren_ задают свойства не самого диалога, аподчиненных (входящих в него) полей.

Атрибут chiidrenaiignment определяет способ, которым система AutoCADвыравнивает поля, входящие в диалоговое окно. Если поля диалога распо-ложены в колонку (вертикально), как это, например, сделано в диалого-вом окне, изображенном на рис. 5.1, то в качестве значения атрибутаchiidren_aiignment могут использоваться такие значения:

О left — выравнивание влево (справа добавляется свободное пространство);

П right — выравнивание вправо (слева добавляется свободное пространство);

• centered — выравнивание по центру (слева и справа добавляется свобод-ное пространство).

Page 328: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 327

В качестве значения, действующего по умолчанию (т. е. когда атрибутchildren_alignment не задан), используется left.

Если поля диалога расположены в ряд (горизонтально), то могут использо-ваться следующие значения атрибута:

• top — выравнивание вверх (снизу добавляется свободное пространство);

• bottom — выравнивание вниз (сверху добавляется свободное пространство);

• centered — выравнивание посередине (снизу и сверху добавляется сво-бодное пространство).

По умолчанию в этом случае действует значение centered.

На поля, в которых задан свой атрибут выравнивания (alignment), значениеатрибута chiidren_aiignment диалога не влияет.

Атрибуты children__fixed_width И children_fixed_height задают, если ОНИ

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

Если вы при написании диалоговых окон пользуетесь средой Visual LISP, тов вашем распоряжении есть способ проверки внешнего вида диалоговогоокна без загрузки DCL-файла в память. Для этого вы можете воспользовать-ся пунктом Инструменты интерфейса (Interface Tools) меню Сервис (Tools)среды Visual LISP (см. разд. 3.1.6).

Пункт Инструменты интерфейса (Interface Tools) имеет два подпункта:

П Просмотр DCL из фрагмента (Preview DCL in Selection)

• Просмотр DCL из редактора (Preview DCL in Editor)

Первый подпункт используется, когда вы выдели в редактируемом DCL-файле фрагмент, содержащий полное описание одного или нескольких диа-логов, а второй — когда выделенного фрагмента нет, и проверке подвергает-ся весь текст файла.

После выбора одного из этих подпунктов система AutoCAD выводит окноВведите имя диалогового окна (Enter the dialog name), приведенное на рис. 5.2.

В центральной части окна нужно ввести или выбрать из списка имя прове-ряемого диалога. После этого система AutoCAD отобразит проверяемое диа-логовое окно или выведет сообщение об ошибке.

1Ш, В ведите имя диалогового окна

«шивQK J Отмене |

Рис. 5.2. Окно Введите имядиалогового окна

Page 329: Visual LISP и секреты адаптации AutoCAD

328 Visual LISP и секреты адаптации AutoCAD

5.2. Открытие и закрытиедиалоговых окон

Для того чтобы вызвать на экран диалоговое окно, необходимо сначала за-грузить DCL-файл, содержащий нужный диалог, а затем уже открыть диа-логовое окно.

В следующих разделах рассматриваются функции, которые позволяют за-гружать И выгружать DCL-фаЙЛЫ (load_dialog, unload_dialog), открывать Изакрывать окна загруженных диалогов.

5.2.1. Функция loadjdlalogЗагружает DCL-файл в память.

(load_dialog <файл>)

Аргумент <файл> — текстовая строка с именем загружаемого DCL-файла.

Возвращаемое значение — целое число (отрицательное, если загрузка невыполнилась; положительное — внутренний номер загруженного файла впамяти).

Если имя файла в аргументе указано без полного пути, то система AutoCADпытается найти файл по стандартному алгоритму поиска файлов поддержки(см. разд. 1.3).

Пример:

° (ioad_diaiog "paktinfo.dcl") может вернуть -1 в случае ошибки (файлне обнаружен) или 5 (порядковый номер загруженного DCL-файла вданном сеансе работы с системой AutoCAD)

Для выгрузки DCL-файла из памяти следует использовать функциюunload_dialog.

5.2.2. Функция unload_dialogВыгружает DCL-файл из памяти.

(unload_dialog <номер>)

Аргумент <номер> — положительное целое число с номером загруженногоDCL-файла (номер был возвращен предшествующим вызовом функцииload__dialog).

Возвращаемое значение — nil .

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

Page 330: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 329

Пример (продолжение примера из разд. 5.2.1):D (unload_dialog 5) возвращает ni l

5.2.3. Функция new_dialogОткрывает на экране диалоговое окно, если его диалог уже загружен в па-мять в составе DCL-файла.

(new__dialog <диалог> <номер> [<действие> [<положение>]])

Аргументы: <диалог> — текстовая строка с именем диалога; <номер> — поло-жительное целое число с номером загруженного DCL-файла данного диа-лога; <действие> — строка с LISP-выражением, выполняемым по умолчанию(если никакого LISP-выражения выполнять не надо, то следует в качествезначения задать пустую строку — " " ) ; <положение> — список из двух чисел,задающий в пикселах положение левого верхнего угла диалогового окна(левый верхний угол экрана имеет координаты (0,0); если задать значение1 (-1 -1), то окно располагается в центре экрана, что является положениемокна по умолчанию).

Возвращается т, если диалоговое окно открылось, и ni l — если возниклаошибка открытия.

Если по условиям работы приложения аргумент <положение> должен бытьзадан, тогда обязательно должен быть задан и аргумент <действие>. СистемаAutoCAD выполняет LISP-выражение, заданное в аргументе <действие>,если пользователь выбрал в диалоговом окне поле, для которого не заданодействие (с помощью функции action__tiie в LISP-программе или с помощьюатрибута action в DCL-файле). О функции action_tiie см. разд. 5.4.1, обатрибуте action — разд. 5.3.1.

Пример:а (new_dialog "pakt" dcl_id "" ( l is t 222 114)) открывает диалоговое ОК-

НО с диалогом pakt, располагая его верхний угол в точке с координатами(222,114), и возвращает т

5.2.4. Функция start_dialogАктивизирует диалоговое окно и готовит систему AutoCAD к приему дейст-вий пользователя в этом окне.

(start_dialog)

Возвращает целое число, которое передано в качестве аргумента функцииdone_diaiog (эта функция закрывает диалоговое окно — см. разд. 5.2.5). Еслиприложение закрывает диалоговое окно, а функции donedialog при этом неПередано никакого аргумента, то функция s tar td ia iog возвратит: 1, еслипользователь выйдет из диалогового окна с помощью кнопки ОК; о, если

Page 331: Visual LISP и секреты адаптации AutoCAD

330 Visual LISP и секреты адаптации AutoCAD

пользователь выйдет из окна с помощью кнопки Отмена (Cancel). Крометого, функция start_diaiog возвратит -1, если работа всех диалоговых оконбудет Прервана С ПОМОЩЬЮ фуНКЦИИ term_dialog.

5.2.5. Функция done_dialogЗакрывает диалоговое окно и передает значение, которое будет возвращае-мым значением функции start_diaiog.

(done_dialog <число>)

Аргумент <число> — это положительное целое число, которое станет воз-вращаемым значением функции start'_diaiog (см. разд. 5.2.4).

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

Пример:

° (done_diaiog 92) может, например, вернуть список (229 160), а функцияs tar t_dia log При ЭТОМ вернет 92

(" Замечание }Функция donedialog используется только внутри LISP-выражений в функцииaction__ti le ИЛИ атрибуте action.

5.2.6. Функция term_dialogЗакрывает все открытые диалоговые окна, как будто пользователь вышел изкаждого из них с помощью кнопки Отмена (Cancel).

(term_dialog)

Возвращаемое значение — nil.

Если работа приложения прерывается по какой-то причине, а некоторыедиалоговые окна остались не закрытыми, то система AutoCAD сама обеспе-чивает ВЫЗОВ функции term_dialog.

5.2.7. Пример вызова диалогового окнаРассмотрим простой пример пользовательской функции, которая открываетдиалоговое окно, изображенное на рис. 5.1, и закрывает его, когда пользовательнажимает кнопку Продолжить. Текст программы приведен в листинге 5.2.

| Листинг 5.2. Пример функции p a k t i n f o , работающей с диалоговым окном !

(defun paktinfo ( / dcl_id)

(if (< (setq dcl_id (load_dialog "paktinfo.del")) 0)(exit))

Page 332: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 331

(if (not (new_dialog "pakt" dcl__id) ) (exit) )(start_dialog)(unload_dialog dcl_id)

(princ)

Эта функция, работает с диалогом из DCL-файла paktinfo.dcl, текст которогоприведен в листинге 5.1.

Функция имеет одну локальную переменную d c l i d , в которой сохраняетсявнутренний номер открываемого диалогового окна.

Во второй строке программы выполняется загрузка файла paktinfo.dcl и еслизагрузка не выполнилась (т. е. переменная dci_id получила отрицательноезначение, возвращенное функцией load_diaiog), то выполняется функцияexit, прерывающая работу нашего приложения.

В третьей строке проверяется, имеется ли в загруженном DCL-файле диалогс именем pakt. Если нет, то работа программы снова завершается с помощьюфункции exit.

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

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

В конце программы функция unioad_diaiog выгружает DCL-файл из памя-ти, а функция princ обеспечивает тихий выход (т. е. без возвращаемого зна-чения).

5.3. ПоляВнутри директивы описания диалога находятся директивы описания полей.Каждое поле содержит либо элемент оформления (надпись, слайд и т. п.),либо элемент управления (кнопку, список и т. п., к которым пользовательимеет доступ с помощью клавиатуры или устройства позиционирования).Поэтому под типом поля можно понимать тип расположенного в нем эле-мента.

Система AutoCAD 2000 работает с большим количеством полей. Разделимэти поля на следующие категории:

• основные поля;

• поля, получаемые в результате операций группировки;

Page 333: Visual LISP и секреты адаптации AutoCAD

332 Visual LISP и секреты адаптации AutoCAD

• поля операций с надписями;

• специальные поля выхода из диалогового окна;

О поля промежутков.

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

5.3.1. Атрибуты полейВ табл. 5.2 приводится алфавитный перечень всех атрибутов, встречающихсяв директивах описания и группировки полей.

Таблица 5.2. Атрибуты директив описания и группировки полей

Атрибут ОписаниеДопустимыезначения

Областьприме-нения

Значениепо умол-чанию

action

alignment

allow accept

aspect rat io

bigincrement

childrenalignment

Действия, вы-полняемые привыборе данногополя

Способ вырав-нивания

Признак акти-визации поляпри нажатииклавиши<Enter>

Коэффициентотношенияширины поляк высоте

Большой шагскользящейшкалы

Задание черезродительскоеполе способавыравниваниясгруппиро-ванных полей

Строка, содержащаятекст выражений язы-ка AutoLISP

l e f t , r i g h t ,centered;

top, bottom,centered

true, f a l s e

Вещественное число(если 0.0, то коэффи-циент принимаетсяравным коэффициен-ту пропорционально-сти слайда)

Целое число

l e f t , r i g h t ,centered (колонка);

top, bottom,centered (ряд)

Поляс элементамиуправления

Все поля

Поляс элементамиуправления

image

s l i d e r

row, column,boxed row,boxed column

"" (пустаястрока)

l e f t ,centered

f a l s e

Нет

0.1 от раз-ности междуmax valueи min value

l e f t(колонка);centered(ряд)

Page 334: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 333

Таблица 5.2 (продолжение)

Атрибут ОписаниеДопустимыезначения

Областьприме-нения

Значениепо умол-чанию

children_fixed_height

children_fixed width

color

Задание черезродительскоеполе фиксациивысоты сгруп-пированныхполей

Задание черезродительскоеполе фиксацииширины сгруп-пированныхполей

Цвет

true, false

true, false

Числа 0-256или dialog_line,dialog_foreground,dialog_background,graphics_background,black, red, yellow,green, cyan, blue,magenta,whitegraphics_foreground

row, column,boxed_row,boxed column

row, column,boxed_row,boxed column

image

false

false

edit limit

edit width

fixed height

fixed width

fixed widthfont

height

Предельныйразмер редак-тируемого поля(количествосимволов)

Размер види-мой части ре-дактируемогополя (коли-чество симво-лов)

Фиксациявысоты поля

Фиксацияширины поля

Фиксация ши-рины символовшрифта

Минимальнаявысота поля

Целое число(не более 256)

Целое число

true, false

true, false

true, false

Число

edit box

edit box

Поляс элементамиуправления

Поляс элементамиуправления

list box,popup list

Все поля

132

Максимальновозможноев данномокне

false

false

false

Нет

Page 335: Visual LISP и секреты адаптации AutoCAD

334

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

Visual LISP и секреты адаптации AutoCAD

Таблица 5.2 (продолжение)

Допустимые 0 6 л а с т ь Значениезначения п Р и м в " поумол-

нения чанию

i n i t i a lfocus

is bold

is cancel

is default

is enabled

is tab stop

key

label

layout

l i s t

max value

Код поля, вы-бранного поумолчанию

Признак выбо-ра полужирногошрифта

Признак сраба-тывания принажатии кла-виши <Esc>

Признак сраба-тывания принажатии кла-виши <Enter>

Признак того,что полене погашенов начальномсостоянии окна

Признак воз-можности вы-бора поляс помощьюклавиши <ТаЬ>

Код поля

Начальныйзаголовок диа-логового окна

Ориентацияскользящейшкалы

Начальноесостояние спи-ска

Верхнее значе-ние шкалы

Строка

true, fa lse

true, f a l s e

true, f a l s e

true, fa lse

true, fa lse

Строка

Строка

h o r i z o n t a l , v e r t i c a l

Строка с элемен-тами списка(разделителем эле-ментов является \п)

Целое число(не более 32 767)

Поля с эле-ментамиуправления

Все поля

button (толькоодно поле вдиалоге можетиметь значе-ние true)

button (толькоодно поле вдиалоге можетиметь значе-ние true)

Поля с эле-ментамиуправления

Поля с эле-ментамиуправления

Все поля

Все поля

s l i d e r

l i s t box,popup l i s t

s l i d e r

Нет

f a l s e

f a l s e

f a l s e

t r u e

true

Нет

"" (пустаястрока)

h o r i z o n t a l

Нет

10000

Page 336: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 335

Таблица 5.2 (окончание)

Атрибут ОписаниеДопустимыезначения

Областьприме-нения

Значениепо умол-чанию

mm value

mnemonic

multipleselect

passwordchar

smallincrement

tabs

tab truncate

value

width

Нижнее значе-ние шкалы

Символ быст-рого выбораПОЛЯ

Признак раз-решения мно-жественноговыбора

Символ, закры-вающий текствводимого па-роля

Малый шагскользящейшкалы

Задание номе-ров позицийдля табуляции

Признак обрез-ки длинныхзначений припереходе затабуляцию

Начальноезначение

Минимальнаяширина поля

Целое число(не менее -32 768 ине более max value)

Буква

true, fa lse

Символ

Целое число

Строкас числами (например,"8 16 24 32")

t rue, f a l s e

Строка

Число

s l i d e r

Поляс элементамиуправления

l i s t box

e d i t box

s l i d e r

l i s t box,popup l i s t

l i s t box,popup l i s t

Все поля

Все поля

Нет

false

Нет

0.01 от раз-ности междуmax_valueи min_value

Нет

false

Нет

Нет

Из таблицы видно, что большая часть атрибутов (например, label, value,key, width, height и др.) применяется во всех полях. Однако нужно учиты-вать, что смысл атрибута от поля к полю может несколько меняться.

Есть специальные атрибуты, употребляемые только в одном или двух типахПолей (например, layout, multiple_select, password_char, big__increment,

small_increment, tabs, tab_truncate И ДР-)-

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

Page 337: Visual LISP и секреты адаптации AutoCAD

336 Visual LISP и секреты адаптации AutoCAD

В примере, приведенном в листинге 5.1, в диалоге pakt использовано 7 ди-ректив описания полей. Пять из них описывают поля типа text, которыеявляются элементами оформления, одна директива описывает поле типаimage, которое тоже относится к элементам оформления, и одна директиваиспользует предопределенное поле okbutton, описывающее элемент управ-ления — кнопку выхода из диалогового окна.

5.3.2. Основные поляК основным относятся поля следующих типов:

• button — кнопка;

• editjDox — редактируемое текстовое поле;

• er r t i i e — поле для отображения сообщений об ошибках;

• image — поле с изображением;

• image__button — кнопка с изображением;

• iist_box — список;

П popup_iist — раскрывающийся список;

• radio_button — радиокнопка (элемент радиоряда или радиоколонки);

0 radio_coiumn — радиоколонка;

• radio^row — радиоряд;

П boxed_radio_coiumn — радиоколонка в рамке;

• boxed_radio_row — радиоряд в рамке;

• slider — скользящая шкала;

• toggle — переключатель.

Поле button является самым распространенным в диалоговых окнах. Оноимитирует кнопку (клавишу), которую нужно нажать пользователю для вы-полнения определенного действия. В листинге 5.3 приведен пример исполь-зования полей типа button.

1 Листинг 5.3. Пример диалога с полем but ton I

sample: dialog {label="Пример диалога с кнопками";

:button{1аЬе1="Кнопка 1"; key="bl"; action="(setq bstyle 1);}

:button{1аЬе1="Кнопка 2"; fixed_width=true; alignment=right; key="b2";

action="(setq bstyle 2);}

ok_button;

Page 338: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 337

Рис. 5.3. Примериспользования поля b u t t o n

• Пример диалога с редактируемым полем

Введите название:

. • •'•'.•' : С В Е Й '

Сюда можно вьйёсти текст сообщения об ошибке

Рис. 5.4. Пример использования полейedit box и errtile

На рис. 5.3 представлено соответствующее диалоговое окно. Обратите вни-мание, что горизонтальный размер первой кнопки выбран системойAutoCAD на полную ширину окна, а у второй кнопки, для которой заданозначение true атрибута fixedwidth, размер сформирован минимальным(таким, чтобы только разместилась надпись). Кроме того, с помощью значе-ния right атрибута alignment вторая кнопка прижата вправо.

Ссылка ok_button размещает в диалоговом окне стандартную кнопку выхода.

Атрибут action задает похожие LISP-выражения, которые выполняются принажатии обеих кнопок (при нажатии первой кнопки переменной bstyleприсваивается значение 1, при нажатии второй кнопки — значение 2). Дей-ствия, выполняемое системой AutoCAD при нажатии кнопок, можно былобы вместо атрибута action задать с помощью функции a c t i o n t i l e (см.разд. 5.4.1) в программе, которая открывает данное диалоговое окно.

В листинге 5.4 приведен пример использования полей типа editbox иerrtile.

\ Листинг 5.4. Пример диалога с полями edit_box и e r r t i l e :

sample: dialog {1аЬе1="Пример диалога с редактируемым полем";

:edit_box{label="BBen.MTe название:"; кеу="Ы";

edit_width=12; edit_limit=24;}

ok_button;

:errtile{1аЬе1="Сюда можно вывести текст сообщения об ошибке";}

На рис. 5.4 показано формируемое диалоговое окно. Длина видимой частиредактируемого поля, в котором пользователь может вводить текст, с по-мощью атрибута edit__width задана равной 12 символам. Предельная длинавводимого текста (см. задание атрибута e d i t i i m i t ) — 24 символа. Избавить-ся от слишком широкого промежутка между заголовком поля editbox иобластью ввода текста можно либо с помощью значения true атрибутаf ixedwidth, либо путем уменьшения длины текста в заголовке диалоговогоокна (тогда система добавит меньше пустого места).

Page 339: Visual LISP и секреты адаптации AutoCAD

338 Visual LISP и секреты адаптации AutoCAD

Код поля сообщений об ошибке — "error". В это поле с помощью функцииset j r i ie (см. разд. 5.4.3) можно из программы вывести необходимые сооб-щения для пользователя, работающего с диалоговым окном.

Еще одну иллюстрацию использования поля editbox можно найти в при-ложении 11.

В ЛИСТИНГе 5.5 Приведен Пример ИСПОЛЬЗОВаНИЯ ПОЛеЙ image И image b u t t o n .Первое поле из них является чисто оформительским, а второе — кнопкой сграфическим изображением.

j ЛИСТИНГ 5.5. Пример диалога С ПОЛЯМИ image И image_button \

sample: dialog {label="Пример диалога с графическими полями";

:image{key="bl";width=20; height=8;color=2;}

:image_button{key="b2"; action^"(setq col 5)";color=5;

width=6;height=3;fixed_width=true;}

ok button;

На рис. 5.5 показано формируемое диалоговое окно.

Оба поля имели бы одинаковую ширину, если бы во втором не был приме-нен атрибут fixed_width. Цвет изображений задан атрибутом color.

С ПОМОЩЬЮ функций s t a r t i m a g e , endimage МОЖНО В вызывающей Про-грамме менять изображения или размещать на них слайды (см. разд. 5.6).

Листинг 5.6 демонстрирует способ применения поля l i s t box, которое по-зволяет размещать в диалоговом окне данные в форме списка.

: Листинг 5.6. Пример диалога с полем list_box

sample: dialog {1аЬе1="Пример диалога со списком";

:list_box{label="QracoK данных";key="bl";Jist="fl"aHHoe 1\пДанное 2\пДанное ЗХпДанное 4";fixed_width_font=true;}

okjoutton;

I Пример диалог-а с графическими палями

Рис. 5.5. Пример использованияполей image и image_button

Page 340: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 339

На рис. 5.6 показано диалоговое окно со списком. Значение true атрибутаmuitipie_seiect предоставляет возможность пользователю с помощью кла-виш <Shift> или <Ctrl> отметить в списке сразу несколько строк с данными.Значение true атрибута f ixed_width_f ont заставляет систему AutoCAD выво-дить список, применяя тот шрифт, у которого ширина символов одинакова.

1Ц.-.11ЯЧ.Ц-.1И.1Г.М-

Список данный

Панное 1Данное 2Данное 3Данное *i

Рис. 5 . 6 . Пример 1использования поля l i s t box

Пример диалога со спискам

Список данныхДанное 1Данное 2Данное 3

Рис. 5.7. Пример 2 использованияполя l i s t box

Если добавить к атрибутам поля iist_box задание атрибута height(height=4,-), то список будет изображен только в три строки, что вызоветпоявление вертикальной полосы прокрутки (рис. 5.7).

С помощью функций s t a r t i i s t и end_iist можно программно менять со-держимое списка (см. разд. 5.5).

Листинг 5.7 демонстрирует способ применения поля popup_iist, котороепозволяет выводить в диалоговое окно данные в форме компактного рас-крывающегося списка.

I Листинг 5.7. Пример диалога с полем p o p u p _ l i s t I\ isample: dialog {1аЬе1="Пример диалога с раскрывающимся списком";

:popup_list{label="CnncoK данных";key="bl";

list="flaHHoe 1\пДанное 2\пДанное ЗХпДанное 4";fixed_width_font=true;}

ok button;

На рис. 5.8 показано сформированное в листинге 5.7 диалоговое окно.Пользователю, для того чтобы раскрыть список, нужно щелкнуть мышью потреугольному изображению в правой части списка.

Пример диалога с раскрывающимся списком

Список данных (данное 1

Рис. 5 . 8 . Пример использованияполя popup l i s t

Page 341: Visual LISP и секреты адаптации AutoCAD

340 Visual LISP и секреты адаптации AutoCAD

Для изменения из программы содержимого раскрывающегося списка при-меняются функции start_l i s t И end_list.

Приложение 11 демонстрирует еще один пример использования поляpopup_list.

Радиокнопки, сгруппированные в радиоряды и радиоколонки, дают воз-можность пользователю выбирать в диалоговом окне ровно одно значениеиз перечисленных около изображения радиокнопок. Радиокнопке соответ-ствует поле radiobutton, а радиоряду и радиоколонке — поля radio_row иradiocoiumn соответственно. В листинге 5.8 приведен пример диалога совсеми этими полями.

| Листинг 5.8. Пример диалога с полями radiojfcrutton, radio_row и radio_column j

sample: dialog {1аЬе1="Пример диалога с радиорядом и радирколонкой";:radio_column{label="IfoJioHKa выбора";key="bl";

:radio_button{label="Hcncmb30BaTb свойство 1"; key="bll";value="l";}:radio_button{label="Hcnonb3OBaTb свойство 2"; key="bl2";value="0";\:га31о_Ьи«оп{1аЬе1="Использовать свойство 3"; key="bl3";value="0";}

}:radio_row{label="PHfl выбора";key="b2";

:radio_button{label="3anafl"; key="b21";value="0";}:radio_button{label="CeBep"; key="b22";value="0";}:radio_button{label="BocTOK"; key="b23";value="l";}:radio_j3utton{label="f0r"; key="b24";value="0"; }

}ok_button;

Из листинга видно, что директивы описания полей radiobutton входятвнутрь директив описания полей radio_row и radio_coiumn. На рис. 5.9 по-казано сформированное в листинге 5.8 диалоговое окно.

I Пример диалога с радиорядом и радиоколонкой- Колонка выбора "-"-•j t* Использовать свойство 1j С Использовать сврйстео;2| Г Использовать свойЙГЙо'З

| Г Запад Г Сейр '•'<&'Восток1

Рис.5.9. Пример 1использования полей radio_rowи radio column

В поле radiobutton значение атрибута value, равное " 1 " , соответствуетвключенной радиокнопке, а "О" — выключенной. В радиоряду и радиоко-

Page 342: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 341

лонке только одна радиокнопка может быть включена. Поэтому точки(символ выбора) на рис. 5.9 стоят только у первой кнопки в радиоколонке иу третьей кнопки в радиоряду.

На рис. 5.9 поля radio_row и radio__column выглядят практически так же,как изображенные Вместо НИХ ПОЛЯ boxed_radio_row И radio^column(радиоряд в рамке и радиоколонка в рамке).

Отличия возникают, когда у полей не задан атрибут label, значение кото-рого становится заголовком поля. В этом случае у полей radio_row иradio_coiuim рамка не выводится (рис. 5.10).

Пример диалога с радиорядом и радиою тонкой

(• Использовать свойство 1

Г* Использовать свойство 2 :

Г* Использовать свойство 3

С Запад С Север (• Восток. Г Юг Рис. 5 . 1 0 . Пример 2использования полей r a d i o rowи radio column

Поле со скользящей шкалой (slider) используется в тех случаях, когда диа-пазон выбираемых значений достаточно велик. В листинге 5.9 приводитсяпример диалога с горизонтальным положением такого поля.

i Листинг 5.9. Пример диалога с полем s l i d e r !

sample: dialog {1аЬе1="Пример диалога со скользящей шкалой";:slider(key="bl";min_value=50;max_value=450;layout=horizontal;small_increment=10;big_increment=50;}ok button;

На рис. 5.11 показано сформированное в листинге 5.9 диалоговое окно.

Положение шкалы (горизонтальное или вертикальное управляется значени-ем атрибута layout. Значения атрибутов min_vaiue и max_vaiue задают мини-мальное и максимальное значение из диапазона. Значения атрибутовsmaii_increment и big_increment задают шаги изменения значений в различ-ных ситуациях.

Переключатели, у которых может быть установлен или снят флажок, опи-сываются с помощью поля toggle. В листинге 5.10 приведен пример диалогас этим полем.

Рис. 5 . 1 1 . Пример использованияполя s l i d e r

Page 343: Visual LISP и секреты адаптации AutoCAD

342

1 Листинг 5.10. Пример диалога с полем

Visual LISP и секреты адаптации AutoCAD

toggle j

sample: dialog {1аЬе1="Пример диалога с переключателями";

:toggle{1аЬе1="Сохранять контур";key="bl";value="l";}

:toggle(label="Разрешить изменение";key="b2";value="0";}

:toggle{label="Порождать вырезы";key="b3";value="l"; }

ok_button;

На рис. 5.12 видно окно, сформированное в листинге 5.10. Значение атрибу-та value задает исходное положение переключателя: при " 1 " флажок уста-новлен (у первого и третьего переключателей), при "0" — сброшен (у вто-рого переключателя).

Еще один пример использования поля toggle можно найти в приложении 11.

Пример диалога с переключателямиf? Сохранять контур .

Г" Разрешить изменение

is? Порождать вырезы

f r w Рис. 5 . 1 2 . Пример использованияполя t o g g l e

5.3.3. Группировка полейИз приведенных выше примеров видно, что по умолчанию системаAutoCAD располагает поля вертикально, одно над другим. Такое располо-жение соответствует специальному типу поля — column (колонка). Горизон-тальному способу группировки полей соответствует поле row (ряд).

Пример, приведенный в листинге 5.1, мог бы быть записан в следующемвиде (см. листинг 5.11).

\ Листинг 5.11. Пример диалога с полем column |

pakt: dialog{1аЬе1="Подсистема ПАКТ, 1994-2000 г.г.";key="pin";width=50;

:column{1аЬе1="Начало работы";children_alignment=centered;

:text{label="KB \"Восток\" (ФГУП ЦНИИТС)";key="tl";}

:image{key="dl";width=23;height=7;fixed_width=true;

color=graphics_background;}

:text{1аЬе1="Разработчики:";key="t2";}

:text(1аЬе1="Полещук Н.Н., Савельева В.А., Свиридова Л.Р.";key="t3";}

.^ехи1аЬе1="Тел. (812) 186-16-60";key="t4"; }

:text{label="E-mail: poleshchukSpeterlink.ru";key="t5";}

}//column

:ок_Ьи^оп{1аЬе1="Продолжить";fixed width=true;is cancel=true;}

Page 344: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 343

Ключевое слово column означает, что поля, директивы которых следуютвнутри поля column, рассматриваются при выводе диалогового окна на эк-ран как единое целое (в одну колонку). Значения таких атрибутов, какchildren_alignment, children_fixed_width И children_fixed_height, ДеЙСТВу-

ют по умолчанию на все подчиненные поля (элементы колонки), у которыхне заданы СВОИ атрибуты alignment, f ixed_width И f ixed_height.

Поле column может иметь свой заголовок (его текст задается значением ат-рибута label), как это приведено в листинге 5.11. Тогда колонка беретсясистемой AutoCAD в рамку (в этом случае результат получается тот же, чтоИ ДЛЯ ПОЛЯ boxed_column).

Соответствующее листингу 5.11 диалоговое окно показано на рис. 5.13.

Подсистема ПАКТ, 1994-2000 г.г.Начало работы

(ФГЫП ЦНИИТС)

Разработчики: :

Полешак Н.Н.. Савельева В А., Свиридова ЯР.

Тел. [Ш2)166-16-60

Рис. 5 . 1 3 . Пример использованияполя column

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

Другое поле, которое группирует входящие в него элементы, — поле row.Внутри него все подчиненные поля располагаются по горизонтали. Соответ-ствующий пример приведен в листинге 5.12.

i Листинг 5.12. Пример диалога с полем row I

sample: dialog {1аЬе1="Пример диалога с рядом кнопок";:row{1аЬе1="Ряд";:button{1аЬе1="Кнопка 1"; key="bl"; action="(setq bstyle 1)";}

:button{label="Кнопка 2"; fixed_width=true; alignment=right; key="b2";

action="(setq bstyle 2)";}

}okbutton;

На рис. 5.14 приведено формируемое диалоговое окно.

Page 345: Visual LISP и секреты адаптации AutoCAD

344 Visual LISP и секреты адаптации AutoCAD

I Пример многочровнего диалога

Пример диалога с рядом кнопокРэд

Кнопка 1 Кнопка 2

- P m i - — -Колонка 1

Кнопка!

Колонка 2

Кнопке 3

Кнопка ?• Кнопка'4

Рис. 5.14. Пример использованияполя row

Рис. 5.15. Пример диалогас многоуровневой группировкой полей

Поля column и row не обводятся рамкой, если значение их атрибута label незадано или задано равным пустой строке.

А н а л о г и ч н ы е фуНКЦИИ ВЫПОЛНЯЮТ ПОЛЯ boxed_column И boxed_row, НО ОНИ

обводятся рамкой даже при отсутствии заголовка.

Уровней группировки может быть несколько, т. е. колонки и ряды самимогут быть элементами других колонок или рядов. Поэтому у разработчикаприложений есть возможность формировать диалоговые окна сложнойструктуры. В листинге 5.13 и на рис. 5.15 приведен пример многоуровневойгруппировки.

j Листинг 5.13. Пример многоуровневой группировки полей \

sample: dialog {1аЬе1="Пример многоуровнего диалога";

:row{label="PHfl 1";

:column{1аЬе1="Колонка 1";

:button{1аЬе1="Кнопка l";key="bl";}

:button{label="Кнопка 2";key="b2";}

}//column

:column{1аЬе1="Колонка 2";

:button{1аЬе1="Кнопка 3";key="b3";}

:button(1аЬе1="Кнопка 4";key="b4";}

}//column

}//row

ok_button;

5.3.4. Поля надписейСамое употребительное поле, которое позволяет размещать в диалоговомокне надпись, — это поле text. Оно относится к оформительским полям.Примером его использования служит листинг 5.1 в разд. 5.1.1. Текст, выве-денный в поле text, может быть изменен программно с помощью функцииset_tile (см. разд. 5.4.3).

Page 346: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 345

Иногда возникает необходимость формирования надписи из частей, кото-рые располагаются в одном ряду друг с другом или в одной колонке. В этомслучае можно пользоваться следующими полями:

П textjoart — Часть текста, Включаемая В ПОЛЯ concatenation И paragraph;

• concatenation — горизонтальное соединение полей text_part;

• paragraph — вертикальное соединение полей text_part И concatenation.

Части надписей, создаваемые полем t e x t p a r t , могут изменяться програм-мным Путем С ПОМОЩЬЮ фуНКЦИИ set_tile.

В листинге 5.14 приведен пример сложной надписи, формируемой из полейтрех перечисленных типов.

I Листинг 5.14. Пример диалога с полями text_part, concatenation и paragraph i

sample: dialog {1аЬе1="Пример сложного текста";

:paragraph{key="pl";

:concatenation{key="cl";

:text_part{1аЬе1="Три девицы";key="tl";}

:text_part{1аЬе1="под окном";key="t2";}

}//concatenat i on

:concatenation!key="c2";

:text_part{1аЬе1="Пряли";key="t3"; }

:text_part{1аЬе1="поздно вечерком.";key="t4";}

}//concatenation

}//paragraph

ok_button;

Результирующее диалоговое окно показано на рис. 5.16.

• Пример сложного текста

ТридёвиЦы подокном

Пряли поздно вечерком.

Рис. 5.16. Пример диалога с полями text_part,concatenation и paragraph

5.3.5. Поля с кнопкой выходаВ файле base.dcl определены следующие поля, ссылки на которые оченьчасто применяются в пользовательских диалоговых окнах:

• ok_button — поле с одной кнопкой ОК;

• ok_oniy — поле в виде колонки из одного поля с кнопкой ОК;

Page 347: Visual LISP и секреты адаптации AutoCAD

346 Visual LISP и секреты адаптации AutoCAD

П okcancei — ряд из кнопок ОК и Отмена (Cancel);

• ok_cancei_heip — ряд из кнопок ОК, Отмена (Cancel) и Помощь (Help);

О okjcanceierr — ряд из кнопок ОК и Отмена (Cancel) и расположенноестрокой ниже поле сообщений об ошибках;

О ok_cancei_heip_errtiie — ряд из кнопок ОК, Отмена (Cancel) и Помощь(Help) и расположенное строкой ниже поле сообщений об ошибках;

• ok_cancei_heip_info — ряд из кнопок ОК, Отмена (Cancel), Помощь(Help) и Инфо (Info).

Все эти поля объединены общим свойством — содержат кнопку выхода издиалогового окна (ее нажатие закрывает окно). Все примеры из разд. 5.3.1используют поле okjoutton. В листинге 5.1 показано, как с помощью атри-бута label изменить текст на кнопке выхода.

Использование остальных полей аналогично применению поля ok_button.

При добавлении этих полей в диалоги важно знать, какие коды имеют поля.В табл. 5.3 приведены коды полей, используемые в рассматриваемых в дан-ном разделе полях с кнопкой выхода.

Таблица 5.3. Коды полей в полях с кнопкой выхода

Кнопка(поле) Код поля

ОК

Отмена (Cancel)

Помощь (Help)

Инфо (Info)

Поле сообщений об ошибках

accept

"cancel

"help"

" i n f o "

" e r r o r "

5.3.6. Поля промежутковДля управления процессом выравнивания полей в диалоговом окне можнопользоваться следующими полями (полями промежутков), которые не со-держат отображаемых элементов оформления или элементов управления:

• spacer — поле произвольной ширины и высоты (нужно обязательно за-дать атрибуты width И height);

• spacer_0 — ПОЛе spacer С нулевыми Значениями атрибутов width Иheight;

• spacer_i — поле spacer с единичными значениями атрибутов width иheight.

Page 348: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 347

Пример диалога с промежутком

Р И С . 5 . 1 7 . Пример диалогас полем spacer

Два последних поля являются частными случаями первого, но для удобствавыделены в отдельные поля.

Эти поля резервируют для себя место в рядах или колонках, задавая тем са-мым дополнительный сдвиг остальных полей. Вернемся к примеру из лис-тинга 5.13 и изменим его, добавив поле spacer с двойным промежуткомв вертикальную колонку между основными кнопками и кнопкой выхода иполе spacer с единичным промежутком — в горизонтальный ряд между ко-лонками (см. листинг 5.15 и рис. 5.17).

\ Листинг 5.15. Пример диалога с полем spacer ;

sample: dialog {1аЬе1="Пример диалога с промежутком";

:row(label="PHfl 1";

:column!1аЬе1="Колонка 1";

:button{1аЬе1="Кнопка l";key="bl";}

:button{label="KHonKa 2";key="b2";}

}//column

spacer_l;

:column{1аЬе1="Колонка 2";

:button(1аЬе1="Кнопка 3";key="b3";}

:button{1аЬе1="Кнопка 4";key="b4";}

}//column

}//row

:spacer{width=0;height=2;}

ok_button;

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

5.4. Функции, работающие с полямиНесколько функций языка AutoLISP позволяют:

• задавать LISP-выражение, выполняемое при выборе поля и нажатии кла-виши <Enter> или щелчке левой кнопкой мыши (функция action_tiie);

Page 349: Visual LISP и секреты адаптации AutoCAD

348 Visual LISP и секреты адаптации AutoCAD

П отключать (гасить) поле и включать его обратно (функция

П читать текущее содержимое полей (функция get_tile);

• менять текущее содержимое полей (функция set_tiie);

П читать исходное содержимое полей, заданное в DCL-файле (функцияget_attr);

• связывать с полем данные пользователя (функция ciient_data_tile).

5.4.1. Функция action_tileЗадает при помощи LISP-выражения действие, которое нужно выполнитьсистеме AutoCAD при выборе поля или редактировании его содержимого.

(action__tile <код> <выражение>)

Аргументы: <код> — строка с кодом поля, <выражение> — строка с LISP-вы-ражением.

Возвращаемое значение — т.

Для большей части полей диалогового окна, являющихся элементами управ-ления, должны быть описаны действия, выполняемые системой AutoCADпри выборе поля. Под выбором поля подразумевается нажатие клавиши<Enter> или щелчок мышью для поля button, редактирование содержимогополя editjoox, выбор элемента (элементов) поля listjoox или popup_iist,движение шкалы для поля slider и т. п. Действия выполняются, когда по-сле операции с полем (редактирования, выбора элемента списка и т. п.) уст-ройство позиционирования перейдет к другому полю или пользователь вый-дет из диалогового окна с помощью кнопки выхода.

Такое действие для каждого поля может быть задано с помощью атрибутаaction DCL-файла. Значением атрибута может быть строка с LISP-выражением (выражение может быть длинным, но не должно использоватьфункцию command). Другой вариант задания действия — указание LISP-вы-ражения в строке, передаваемой в качестве аргумента <выражение> функцииa c t i o n t i l e , обращение к которой в программе должно быть записано меж-ду вызовами функций new_dialog И start_dialog.

Действие, заданное с помощью аргумента <выражение>, замещает (аннули-рует) действие, заданное выражением (значением) атрибута action этого по-ля в DCL-файле.

Действие всегда задается через код поля, к которому оно относится. Кодполя — это значение атрибута key этого поля. Именно этот код и передаетсяфункции actionjrile в качестве аргумента <код>.

LISP-выражение в функции a c t i o n t i l e может использовать значения заре-зервированных глобальных переменных со следующими именами:

О $vaiue — текущее значение рассматриваемого поля;

Page 350: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 349

• $кеу — код рассматриваемого поля;

• $reason — тип действия, выполненного над полем;

• $data — данные поля, заданные функцией ciient_data_tiie в приложе-нии пользователя;

• $х и $у — координаты указанной пользователем точки внутри изображе-ния (только для полей с изображениями).

Об этих переменных см. разд. 5.4.7.

Примеры:

° ( a c t i o n _ t i l e " a c c e p t " " (done_dialog) ") — Пример действия КНОПКИ ВЫХОДа

° ( a c t i o n _ t i l e " D r t l " ( s t r c a t " ( i f (<= ( a t o i $value) 0 ) "

" ( a l e r t \"Отрицательные числа не допускаются !\" ) " ) ) — п р и м е р провер-ки значения поля на отрицательные числа или нуль

В последнем примере длинное LISP-выражение, задаваемое в качестве дей-ствия для поля с кодом "Drtl", получено с помощью сцепления двух строк.Обратите внимание на то, что/внутренние кавычки, необходимые в выра-жении для вызова функции alert, применяются с предшествующим сим-волом \.

См. также пример использования функции a c t i o n t i l e , приведенный в при-ложении 11.

Переменные, фигурирующие внутри строки <выражение>, могут быть толькоглобальными.

5.4.2. Функция mode_tileИзменяет состояние поля.

(mode_tile <код> <состояние>)

Аргументы: <код> — код поля; <состояние> — целое число от 0 до 4 (см.табл. 5.4).

Возвращаемое значение — nil.

Таблица 5.4. Значения аргумента <состояние> функции mode_tiie

Значение Действие

0 Включить поле

1 Выключить (сделать недоступным) поле

2 Выбрать поле

3 Подсветить содержимое поля

4 Включить/выключить подсветку изображения

Page 351: Visual LISP и секреты адаптации AutoCAD

350 Visual LISP и секреты адаптации AutoCAD

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

Примеры:

° (mode_tiie "ki" l) выключает поле с кодом "ki" (оно становится недос-тупным)

n (modetiie "ki" 0) включает поле с кодом "ki" (оно снова становитсядоступным)

См. также пример использования функции mode_tiie, приведенный в при-ложении 11.

5.4.3. Функция set_tileПозволяет менять содержимое поля, заданное атрибутом value.

(set tile <код> <значение>)

Аргументы: <код> — код поля; <значение> — строка с новым значением,присваиваемым атрибуту value указанного поля.

Возвращаемое значение — значение второго аргумента, переданного функ-ции.

Для диалогов и текстовых полей значения атрибута value заменяют заго-ловки (значения атрибута label). Рассмотрим диалог, приведенный в лис-тинге 5.16.

I Листинг 5.16. Пример диалога ввода фамилии пользователя j

// © Н.Н.Полещук, 2001.

user:dialog{label = "Ввод фамилии пользователя";

:column)

:edit_box{1аЬе1="Фамилия:";edit_width=4 0;alignment=centered;

value=""; key="usfam";

}// конец edit__box

:spacer{height=l;}

:text{1аЬе1="Выбор из списков подразделений";alignment=centered; }

: row {

.^ех^1аЬе1="Подразделение 0001"; key="sl"; }

:popup_list{key="pl";is_enabled=true;label="";list="";width=20;}

}// конец row

: row {

:text{1аЬе1="Подразделение 0002"; key="s2";}

:popup_list{key="p2";is_enabled=true;label="";list="";width=2 0;}

}// конец row

Page 352: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 351

: row {^ех1;{1аЬе1="Подразделение 0003"; key="s3";}:popup_list{key="p3";is_enabled=true;label="";list="";width=20;}

}// конец row

: row{

:text{label="noflpa3fleneHHe 0004"; key="s4";}

:popup_list(key="p4";is_enabled=true;label="";list="";width=20;}

}// конец row

:spacer {height=l;}

ok cancel help_info;

Внешний вид диалогового окна, соответствующего программе в листинге5.16, приведен на рис. 5.18.

шшшшшшшшшитЯ амйлия: [

Подразделение 0001 ; • . . ; : :; ,|

'Подразделение 0002 I

Подразделение 0003 .'• , . J

: Подразделение OQCR j

" . ' • • • . • . • : • . • " ' : . • : ' ' • " ' • ' . • •• • • : : . ' . ' 1 1 ; . • ' • • • • . • . • • : '••:

If"'W~% Отмена j Справка | :• • - - . . . - • • • • • • • :

1

3

3 :

3

3

•ИнФо-. | : Рис. 5 . 1 8 . Диалоговое окноВвод фамилии пользователя

Это диалоговое окно предназначено для ввода фамилии пользователя при-кладной системы через поле editjbox или для выбора фамилии из списковсотрудников подразделений, причем наименования подразделений могутменяться. Максимальное количество подразделений — 4 (диалог легко мо-жет быть расширен на любое количество). Если число подразделенийв данный момент меньше четырех, то лишние строки в окне нужно вы-ключить.

В начальном состоянии диалогового окна, приведенного на рис. 5.18, спискисотрудников пусты, а в качестве наименований подразделений даны услов-ные наименования Подразделение 0001, ..., Подразделение 0004. Наимено-вания подразделений должны быть достаточно длинными, поскольку приопределении размеров выводимых полей система AutoCAD ориентируетсяна значения атрибутов, заданных в DCL-файле. Замена наименований нафактические будет произведена программно с помощью функции set_tiie.Если заменяемые наименования окажутся длиннее замененных, то они бу-дут урезаться системой AutoCAD.

Page 353: Visual LISP и секреты адаптации AutoCAD

352 Visual LISP и секреты адаптации AutoCAD

Кроме того, программа (см. ниже) должна читать текстовые файлы со спи-сками подразделений, расположенные в специальной папке, и по количест-ву файлов обязана определять количество подразделений. Текстовый файлсо списком сотрудников будет выглядеть примерно так, как это приведенов листинге 5.17.

j Листинг 5.17. Текст файла polz01.txt ;

Группа 2111

Кобозева

Мичурина

Полещук

Савельева

Свиридова

Юшкова

В этом файле первая строка задает наименование подразделения, а следую-щие строки — фамилии сотрудников в алфавитном порядке.

В листинге 5.18 приведен текст файла с программой (функцией usn).

! Листинг 5.18. Функция usn j

; © Полещук Н.Н., 2001 г.

(defun usn ( / dcl_id fpolz i plist nlist spi str nsubd)

(if (not pv)(setq pv ""))

(if (< (setq dcl_id (load__dialog "user.del")) 0) (exit) )

(if (not (newjdialog "user" dcl_id)) (exit) )

(setq plist nil nlist nil i 0)

; Чтение файлов polz01.txt, polz02.txt, polz03.txt, polz04.txt

(repeat 4; количество подразделений — 4

(setq spi nil)

(setq i (1+ i) fpolz (strcat "polzO" (itoa i) ".txt"))

(if (findfile fpolz)

(progn

(setq fd (open (findfile fpolz) "r"))

(setq str (read-line fd))

(setq nlist (append nlist (list str)))

(if str

(while (setq str (read-line fd))

(setq spi (append spi (list str)))

);while

);if str

(close fd)(setq fd nil)

);progn

(setq nlist (append nlist (list nil)))

);if findfile

Page 354: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 353

(setq plist (append plist (list spi)))

);repeat

; Заполнение списков диалогового окна(setq i -1)(repeat 4(setq i (1+ i) )

(if (setq nsubd (nth i nlist))(progn(set_tile (strcat "s" (itoa (1+ i))) nsubd)(if (setq spi- (nth i plist))(progn(start_list (strcat "p" (itoa (1+ i))))(raapcar 'add_list spi)(end_list));progn);if);progn; Гашение списка, если файл с фамилиями не найден(progn(mode_tile (strcat "s" (itoa (1+ i))) 1)(mode_tile (strcat "p" (itoa (1+ i))) 1)

);repeat;== Нужно добавить действия кнопок Инфо и Помощь(action_tile "accept"(strcat"(if(= (setq pv(get_tile \"usfam\"))\"\")"" (а1еЛ\"Фамилия не задана\")""(done_dialog))"

);strcat);action-tile accept

(action_tile "cancel" "(done_dialog)")

(action_tile "pi"

"(set_tile \"usfam\" (nth (atoi $value) (nth 0 plist)))")

(action_tile "p2"

"(set_tile \"usfam\" (nth (atoi $value) (nth 1 plist)))")

(action_tile "p3"

"(set_tile \"usfam\" (nth (atoi $value) (nth 2 plist)))")

(action_tile "p4"

"(set_tile \"usfam\" (nth (atoi $value) (nth 3 plist)))")

(start_dialog)

(unload__dialog dcl_id)

(princ)

);defun usn

12 Зак. 155

Page 355: Visual LISP и секреты адаптации AutoCAD

354 Visual LISP и секреты адаптации AutoCAD

Эта программа достаточно длинная, хотя и не очень сложная, с помощьюфункции s e t t i l e , входящей внутрь LISP-выражений, записанных как дей-ствие для полей с кодами "pi", "р2", "рЗ" и "р4", заменяет содержимое спи-сков указанных полей на списки, прочитанные из файлов polz01.txt,polz02.txt, polz03.txt, polz04.txt с фамилиями сотрудников подразделений(использованные В ЭТОЙ операции функции start_list, add_list И end_list

будут рассмотрены в разд. 5.5). Фамилии сотрудников накапливаются всписке pi is t , наименования подразделений — в списке niist .

Переменная $value, используемая функцией a c t i o n t i l e , для поляpopupiist имеет значение с номером выбранного пользователем элементасписка.

С помощью той же функции s e t t i l e стандартные наименования подразде-лений (Подразделение 0001 и т. д.) меняются на элементы списка niist . Ес-ли количество подразделений оказалось меньше четырех (например, три), тополя лишних подразделений отключаются с помощью функции mode_tiie.

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

На рис. 5.19 приведено диалоговое окно Ввод фамилии пользователя в томвиде, каком оно появляется при использовании рассмотренной функ-ции usn.

• Ввод Фамилии пользователя

Фамилия:

Группа 2111

Сектор 2112

Сектор 2113

Кобозева

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

]Андрюшкина

1Вронский

•изdd

Отмена Справка ИнФо...

Рис. 5.19. Диалоговое окноВвод фамилии пользователя,выведенное функцией usn

5.4.4. Функция get_tileЧитает содержимое поля (текущее значение атрибута value).

(get_tile <код>)

Аргумент <код> — строка с кодом поля.

Возвращаемое значение — строка с текущим значением атрибута value.

Page 356: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 355

Пример:

° ( g e t t i l e "usfam") для диалога, приведенного в предыдущем разделе,возвратит текущее имя пользователя, установленное в редактируемом по-ле (например, ДЛЯ рис. 5.19 ЭТО будет "Кобозева")

5.4.5. Функция get_attrЧитает начальное содержимое поля (значение атрибута value в DCL-файле).

(get_attr <код>)

Аргумент <код> — строка с кодом поля.

Возвращаемое значение — строка с начальным значением атрибута value.

Пример:

° ( g e t t i l e "usfam") для диалога, приведенного в листинге 5.16 предыду-щего раздела, возвратит ""

5.4.6. Функция client_data_tileСвязывает с полем диалогового окна строку с пользовательскими данными.

(client_data_tile <код> <данные>)

Аргументы: <код> — строка с кодом поля; <данные> — строка с пользователь-скими данными.

Возвращаемое значение — nil.

Обратиться к данным, присоединенным к полю диалогового окна, можно,прочитав значение переменной $data в функции action_tile. Таким обра-зом, можно изменять действие, присвоенное полю, в зависимости от поль-зовательских данных.

Пример:0 (client__data_tile "usfam" "2110") СВЯЗЫВаеТ Строку "2110" С ПОЛем

"usfam"

5.4.7. Переменные действияВо время работы диалогового окна система AutoCAD формирует значенияглобальных переменных $key, $vaiue, $reason, $data, $x, $y (они называютсяпеременными действия), сохраняя в них некоторые дополнительные данные осостоянии этого окна и выполненных в нем действиях пользователя. Пере-менные используются в LISP-выражениях, задаваемых в качестве второгоаргумента функции action__tiie (вне функции action_tiie значения пере-менных не определены).

12*

Page 357: Visual LISP и секреты адаптации AutoCAD

356 Visual LISP и секреты адаптации AutoCAD

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

Таблица 5.5. Переменные действия и варианты их значений

Переменная Значение

$кеу Код поля (во всех полях)

$value Значение атрибута value (во всех полях). Для поля e d i t Joox — этовведенная строка; для t o g g l e — " l " (включен) или "О" (выключен);для l i s t _ b o x и popup l i s t — строка с номером выбранного эле-мента списка ( n i l , если ни один элемент не выбран)

$data Строка с пользовательскими данными, привязанными к полю(см. разд. 5.4.6)

$reason Для полей edit_box, l i s t _ b o x , image_button И s l i d e r — число Скодом причины прерывания работы с полем (подробнее см.табл. 5.6)

$х, $у Координаты (в пикселах) указанной пользователем точки внутриизображения для поля imagejoutton

Примеры:п (action_tile "usfam" "(setq nam (strcat \"Пользователь: \" $value))")n (action_tile "cldat" "(setq tyg (read $data))")

См. также примеры в листинге 5.18 и приложении 11.

В табл. 5.6 приведена дополнительная информация о значениях переменной$reason.

Таблица 5.6. Значения переменной $reason

Значение Описание

1 Обычный вариант действия с полем, в том числе: пользователь выбралполе; нажата клавиша <Enter>, а поле имеет значение t r u e атрибутаi s _ d e f a u l t

2 Для поля e d i t b o x : пользователь вышел из поля, но не завершил ре-дактирование (нажал клавишу <ТаЬ> или выбрал другое поле)

3 Для поля s l i d e r : пользователь изменил значение поля с помощьюуказателя шкалы, но не завершил ввода

4 Для полей l i s t _ b o x и image_button: пользователь выполнил двойнойщелчок (если m u l t i p l e _ s e l e c t i o n = f a l s e , то это должно означатьокончательный выбор, если m u l t i p l e _ s e l e c t i o n = t r u e , то это должнообрабатываться как обычный выбор — см. значение 1)

Page 358: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 357

5.5. Функции, работающие со спискамиДля формирования списков, элементы которых отображаются в поляхiist_box и popup_box, применяются специальные функции start_i ist ,add_list И end_list.

5.5.1. Функция startjistНачинает операцию редактирования списка в поле iist_box или popupiist.

(start_list <код> [<операция> [<номер>]])

Аргументы: <код> — код поля, список которого редактируется; <операция> —целое число, обозначающее тип операции (1 — изменить выбранные эле-менты; 2 — добавить новые элементы; 3 — удалить старый список и создатьновый); <номер> — номер элемента, начиная с которого вносятся изменения(используется, если значение аргумента <операция> равно 1). По умолчаниюдля второго аргумента действует значение 3, для третьего — 0. Элементыв списке нумеруются, начиная с нуля.

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

Вызов функции s t a r t i i s t является отметкой начала операций формирова-ния или редактирования списка, вызов функции end_iist — отметкой окон-чания. Изменения вносятся с помощью функции add_iist и других функ-ций, располагающихся между s tart_l i s t и end_iist. He допускается междуstar t_l i s t И end_list Использовать функцию set_tile.

Примеры:

° (start_iist "kp2") указывает начало операции формирования зановосписка для поля с кодом "кр2"

° ( s t a r t i i s t "kp2" 2) указывает начало операции добавления новых эле-ментов СПИСКа ДЛЯ ПОЛЯ С КОДОМ "кр2"

° ( s t a r t i i s t "kp2" 1 14) указывает начало операции замены элементовсписка, начиная с указанного, для поля с кодом "кр2"

См. также примеры в листинге 5.18 и приложении 11.

5.5.2. Функция addjistВыполняет операцию редактирования списка в поле l i s t b o x или

popup_list.

(add_list <строка>)

Аргументы: <код> — код поля, список которого редактируется; <строка> —строка, которая добавляется к списку или заменяет элемент списка.

Page 359: Visual LISP и секреты адаптации AutoCAD

358 Visual LISP и секреты адаптации AutoCAD

Возвращаемое значение — значение аргумента <строка>, если операция вы-полнена успешно. При сбое возвращается nil.

Тип операции, выполняемой функцией add_list, определяется предшест-вующим вызовом функции start_l ist .

Пример:

° (addj.ist "kp2" "Деталь 3217-06")

См. также примеры в листинге 5.18 и приложении 11.

5.5.3. Функция endjistЗавершает операцию редактирования списка в поле iist__box или popup_iist.

(end_list)

Возвращаемое значение — nil.

См. примеры в листинге 5.18 и приложении 11.

5.6. Функции, работающиес графическими полямиПОЛЯ image И i m a g e b u t t o n ЯВЛЯЮТСЯ фафиЧеСКИМИ ПОЛЯМИ С ПРЯМОУГОЛЬНОЙ

зоной, которая может быть заполнена как одним цветом, так и слайдом, иотрезками разных цветов. Этой цели служат рассматриваемые ниже функ-ции startimage (открывает процесс заполнения), end_image (завершает про-цесс заполнения), а также функции fill_image, slide_image, vector_image.

5.6.1. Функция start imageОткрывает процесс заполнения фафического поля.

(start_image <код>)

Аргумент <код> — код фафического поля (значение атрибута key).

Возвращаемое значение — строка со значением аргумента. При сбое воз-вращается nil.

Вызов функции startimage является отметкой начала операций формиро-вания изображения в графическом поле, вызов функции endimage — отмет-кой окончания. Формирование изображения выполняется с помощьюфункций slide^image, fill_image, vector_image И других функций, распола-гающихся между start_image И end_image. He допускается между start_imageИ end__image ИСПОЛЬЗОвать функцию set t i l e .

Page 360: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 359

Пример:р (start_image "igp4")

5.6.2. Функция endjmageЗавершает процесс формирования изображения графического поля.

(end_image)

Возвращаемое значение — nil.

Вызову функции endimage должен обязательно предшествовать вызовфункции start_image.

5.6.3. Функция filljmageЗаполняет прямоугольник внутри графического поля одним цветом.

(fill_image <xl> <yl> <ширина> <высота> <цвет>)

Аргументы: <xi>, <yl> — координаты (в пикселах) левого верхнего угла за-полняемого прямоугольника; <ширина>, <высота> — ширина и высота (в пик-селах) заполняемого прямоугольника; <цвет> — целое число с номером цве-та, выбранного для заполнения. В качестве номера цвета можно использо-вать стандартные номера системы AutoCAD от 0 до 256, а также некоторыеотрицательные значения, приведенные в табл. 5.7.

Возвращаемое значение — целое число (значение аргумента <цвет>).

Координаты графического поля определяются следующим образом. Левыйверхний угол имеет координаты (0,0), а координаты правого нижнего углаМОГУТ быть ПОЛучеНЫ С ПОМОЩЬЮ фуНКЦИЙ d i m x _ t i l e И d i m y _ t i l e (см.

разд. 5.6.6 и 5.6.7). Функция fi l i image может заполнить одним цветом каквсе графическое поле, так и любой прямоугольник внутри него.

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

Таблица 5.7. Номера специальных цветов, используемые

функцией fill__image

Номер Описание

—2 Цвет фона графического экрана системы AutoCAD

-15 Цвет фона диалогового окна

-16 Цвет текста диалогового окна

-18 Цвет контура диалогового окна

Page 361: Visual LISP и секреты адаптации AutoCAD

360 Visual LISP и секреты адаптации AutoCAD

Пример:

° (fiii_image "igp4" 5 б 15 25 1) заполняет красным цветом (номер 1)прямоугольник с левым верхним углом в точке (5,6) и нижним правымуглом (20,31)

5.6.4. Функция slidejmageЗаполняет графическое поле слайдом из отдельного файла слайда или избиблиотеки слайдов.

(slide_image <xl> <yl> <ширина> <высота> <слайд>)

Аргументы <xi>, <yi>, <ширина> и <высота> имеют тот же смысл, что и дляфункции fi i i image. Аргумент <слайд> — имя файла слайда (расширение sldне указывается) или имя библиотеки слайдов (имя слайда из библиотекиуказывается в круглых скобках).

Возвращаемое значение — строка (значение аргумента <слайд>).

Примеры:

° (slide_image "igp4" "r ingl") заполняет Поле С КОДОМ "igp4" СЛЭЙДОМ ИЗфайла ringl.sld

п (slide_image "igp5" "Iib23 (nut8) ") заполняет поле С КОДОМ "igp5" слай-дом nut8 из библиотеки слайдов Iib23

В диалоговых окнах, приведенных на рис. 5.1 и .5.13, в верхнем поле с по-мощью функции siide_image изображена эмблема КБ "Восток", которая бы-ла подготовлена заранее в виде файла слайда.

5.6.5. Функция vectorjmageРисует отрезок заданного цвета внутри графического поля диалогового окна.

(vector_image <xl> <yl> <х2> <у2> <цвет>)

Аргументы: <xi>, <yi> — координаты (в пикселах) начала рисуемого отрезка;<х2>, <у2> — координаты (в пикселах) конца отрезка; <цвет> — целое числос номером цвета от 0 до 256, или с отрицательным номером из табл. 5.7.

Возвращаемое значение — целое число (значение аргумента <цвет>).

Координаты, используемые функцией vectorimage, вычисляются так же,как В ОПИСаНИИ ФУНКЦИИ fill_image.

Пример:

° (vector_image "igp2" 5 11 зз l i 2) рисует отрезок желтого цвета (но-мер 2) из точки (5,11) в точку (33,11)

Page 362: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 361

5.6.6. Функция dimx_tileВычисляет горизонтальный размер графического поля с данным кодом(точнее, размер поля минус 1).

(dimx_tile <код>)

Аргумент <код> — строка с кодом графического поля.

Возвращаемое значение — целое число с номером крайнего правого пикселаполя (левый крайний пиксел имеет номер 0).

Пример:

° (dimx_tiie "igp2") может вернуть 50 (всего в таком поле по горизонталибудет 51 пиксел)

5.6.7. Функция dimyjileВычисляет вертикальный размер графического поля с данным кодом(точнее, размер поля минус 1).

(dimyjtile <код>)

Аргумент <код> — строка с кодом графического поля.

Возвращаемое значение — целое число с номером крайнего нижнего пиксе-ла поля (верхний крайний пиксел имеет номер 0).

Пример:

° (dimy_tiie "igp2") может вернуть 32 (всего в таком поле по вертикалибудет 33 пиксела)

5.7. Дополнительные приемыпрограммирования диалоговых окон

5.7.1. Временный выход из диалогового окнаИногда по условиям работы приложения требуется временно покинуть диа-логовое окно, чтобы указать точки или объекты, а затем снова вернуться воткрытое окно. Как правило, кнопка, с помощью которой достигается вре-менный выход, имеет на конце наименования символ <. В листинге 5.19приведен пример DCL-файла tempexit.dcl с диалогом, в котором от пользо-вателя требуется задание точки либо вводом трех координат на клавиатурев соответствующих полях edit_box, либо указание мышью.

Page 363: Visual LISP и секреты адаптации AutoCAD

362

! Листинг 5.19. Пример диалога с

Visual LISP и секреты адаптации AutoCAD

возможностью временного выхода i

tempexit: dialog {1аЬе1="Задание точки";

: row{

:column)

:edit_box{label="X:";value="O";key="xp";}

:edit_box{label="Y:";value="0";key="yp";}

:editJoox{label="Z:";value="0";key="zp";}

}//конец column

:button{1аЬе1="Указать <";key="mousep";height=6;}

}//конец row

spacer_l;

ok_button;

Формируемое этим DCL-файлом диалоговое окно приведено на рис. 5.20.

Рис. 5.20. Диалоговое окно Задание точкис возможностью временного выхода

В листинге 5.20 приведен пример функции tempe, которая работает с DCL-файлом tempexit.dcl.

Листинг 5.20. Функция tempe

; © Полещук Н.Н., 2001 г.

(defun tempe (/ dcl_id s tep pt)

(setq dcl_ld (load_dialog "tempexit .dcl"))

(setq s tep 2)

(if (null p t ) ( s e t q pt ( l i s t 0.0 0.0 0.0)))

(while (>= s tep 2)

(if (null (new_dialog "tempexit" dcl_id)) (exit),

( s e t _ t i l e "xp" (rtos (car pt) 2 5))

( s e t _ t i l e "yp" (rtos (cadr pt) 2 5))

( s e t _ t i l e "zp" (rtos (caddr pt) 2 5))

(ac t ion_t i le "accept"

( s t r c a t

" ( s e t q x (atof (get_t i le \ " x p \ " ) ) ) "

" ( s e t q у (atof (get_t i le \ " y p \ " ) ) ) "

" ( s e t q z (atof (get__tile \ " z p \ " ) ) ) "

Page 364: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 363

"(setq pt (list х у z))"

"(done_dialog 1)"

);strcat

);action_tile

(action_tile "mousep" "(done_dialog 3)")

(setq step (start__dialog))

(cond

((= step 3)(setq pt (getpoint "ХпУкажите точку: ")))

((= step 1)

(princ "ХпТочка: (")

(princ (rtos x 2 5))(princ " ")

(princ (rtos у 2 5))(princ " ")

(princ (rtos z 2 5) ) (princ ")")

);= step 1

) ; cond

) ;while

(unload_dialog dcl_id)

(princ)

Функция tempe использует переменную step, которая принимает значение 3,если диалоговое окно закрыто временно (для указания точки), и 1, еслипользователь нажал кнопку ОК. Значение переменной step формируетсяфункцией start_diaiog, возвращаемое значение которой зависит от значе-ния аргумента предшествующего вызова функции done_diaiog (1 или 3).Считываемые при временном выходе координаты указываемой пользовате-лем точки помещаются с помощью трехкратного обращения к функцииset_tile в поля editjaox при повторном входе в диалоговое окно.

5.7.2. Вложенные диалоговые окнаВозможна ситуация, когда по нажатию какой-то кнопки текущего диалого-вого окна нужно открыть следующее окно, из которого потом необходимовернуться в предыдущее. Поэтому возникает необходимость работать с вло-женными друг в друга диалоговыми окнами.

Система AutoCAD рассчитана на поддержку восьми уровней вложенностидиалоговых окон, но реально рекомендуется использовать не более четырехуровней (кроме того, много одновременно открытых окон неудобно дляпользователя).

Программирование вложенных окон достаточно просто — можно в LISP-выражение, используемое в качестве второго аргумента функции a c t i o n t i i e ,ввести обращение к функциям new_diaiog и start_diaiog. Можно посовето-вать в таких случаях в одном DCL-файле разместить описания всех диалогов

Page 365: Visual LISP и секреты адаптации AutoCAD

364 Visual LISP и секреты адаптации AutoCAD

(основного и вложенных), чтобы обращение к функции loaddiaiog вы-полнить только один раз и не перегружать LISP-выражения в функцииaction_tile.

В листинге 5.21 приведен текст файла twodia.dcl, содержащего описаниедвух простых диалогов (dial и dia2). Диалог dia2 вызывается из диалогаdial нажатием кнопки Вызвать следующее окно.

\ Листинг 5.21. Пример вложенных диалоговых окон (файл twodia.dcl) ;i j

dial: dialog{1аЬе1="Диалоговое окно первого уровня";

:edit_box{label="BBOfl названия:";key="tl";}

:button{1аЬе1="Вызвать следующее окно";кеу="Ь1";}

ok_button;

}

dia2: dialog{1аЬе1="Диалоговое окно второго уровня";

:text{1аЬе1="Это вложенное OKHo";key="t2";}

:ok_button{1аЬе1="Вернуться";}

В листинге 5.22 приведено содержимое файла twodia.lsp, в котором находит-ся текст двух функций. Функция twodia открывает первое диалоговое окнои при нажатии кнопки Вызвать следующее окно обращается к функцииopendia2, открывающей вложенное диалоговое окно.

! Листинг 5.22. Файл twodia.lsp \

(defun twodia ( / dcl_id)

(if (< (setq dcl_id (load_dialog "twodia.dcl")) 0)(exit))

(if (not (new_dialog "dial" dcl_id)) (exit))

(action_tile "tl" "(setq mytxt $value)")

(action_tile "Ы" " (opendia2 dcl_id) ")

(start_dialog)

(unload_dialog dcl_id)

(princ)

);defun dial

(defun opendia2 (dc /)

(if (not (new_dialog "dia2" dc)) (exit))

(start_dialog)

);defun dia2

На рис. 5.21 представлен вид диалоговых окон, открытых с помощью функ-ций twodia и opendia2 (для удобства первое окно смещено, чтобы вложенноев него окно не закрыло первое полностью).

Page 366: Visual LISP и секреты адаптации AutoCAD

Глава 5. Диалоговые окна 365

Ввод, названия [ _

1 ^ В ы з в а т ь следующее окно

Диалоговое окно второго уровня

Это вложенное окно

_ Вернуься

Рис. 5.21. Вложенные диалоговые окна

5.7.3. ПаролиПри работе с полем edit box бывает необходимость зашифровать текст, вво-димый пользователем, чтобы он не был виден (например, если вводится па-роль). Для обеспечения нужного эффекта следует использовать атрибутpassword_char. Символ, заданный в качестве значения этого атрибута, заме-няет в диалоговом окне символы вводимого пользователем текста. Програм-ма же, которая читает значение этого поля, получит текст в незашифрован-ном виде (например, для проверки правильности введенного пароля).

В листинге 5.23 приведен пример простого диалога, в котором поле editboxдолжно быть зашифровано.

I Листинг 5.23. Пример диалога с шифрованным полем :

pass: dialog(1аЬе1="Диалоговое окно с паролем";

:edit_box{label="Введите пароль:";key="el";password_char="0";}

ok button;

На рис. 5.22 приведено диалоговое окно, рассмотренное в листинге 5.23.В этом окне текст, вводимый в поле edit_box, отображается нулями.

Диалоговое окно с паролем

Введите пароль:

Рис. 5.22. Ввод пароля

Page 367: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 6

Создание справочной системы

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

AutoCAD 2000 позволяет включать в приложения справочные файлы сле-дующих типов:

• HELP-файлы Windows;

• HTML-файлы;

• справочные файлы предыдущих версий AutoCAD (устаревшие).

В данной главе рассматриваются вопросы работы с этими файлами, а такжедругие вопросы вывода справочной информации.

6.1. HELP-файлы WindowsСамые удобные и самые привычные справочные файлы сегодня — это фай-лы типа WinHelp, которыми сопровождается сама система AutoCAD 2000,популярный пакет Microsoft Office, а также большинство современных про-дуктов, разработанных для среды Windows. Такая документация может про-сматриваться пользователем как при работе в системе AutoCAD, так и внесистемы. Файлы типа WinHelp могут помимо текста содержать графическиеиллюстрации, макросы, мультимедийные элементы, что позволяет сделатьсправочное руководство удобным и привлекательным. Для создания этихфайлов требуются специальные пакеты (Microsoft Help Workshop, MicrosoftHelp Designer и т. п.).

Page 368: Visual LISP и секреты адаптации AutoCAD

Глава 6. Создание справочной системы 367

6.1.1. Структура HELP-файловВ состав HELP-файлов Windows входят файлы со следующими расшире-ниями:

П rtf (текстовые файлы, получаемые, например, с помощью программыMS Word из пакета Microsoft Office);

• hpj (файл проекта справочной системы);

• Ыр (компилированный HELP-файл);

• cnt (файл разделов справки);

• gid (файл конфигурации справочной системы);

• fts (файл полного поиска, образуется при первом обращении к базе спра-вочных терминов);

• ftg (файл полного поиска групп).

Замечание

В системе AutoCAD 2000i, которая является модификацией AutoCAD 2000,в справочной системе появились файлы с расширениями awa, chm, lim.

Основными файлами, которые передаются пользователю при установкепрограммного продукта, являются файлы с расширениями Ыр и cnt. Напри-мер, в папке Help программного обеспечения системы AutoCAD 2000 нахо-дятся 36 файлов с расширением hip (acad.hlp, acadag.hlp, acad_ala.hlp,acad_asi.hlp, acad_car.hlp и т. д.) и 21 файл с расширением cnt (acad.cnt,acad_ag.cnt, acad_asi.cnt, acad_car.cnt и т. д.).

Файлы с расширением Ыр получаются путем компиляции проектов в специ-альных пакетах (Microsoft Help Designer и др.). Файлы с расширением cntявляются текстовыми. Они тоже могут быть сформированы с помощью спе-циального пакета, но могут быть написаны или отредактированы и обыч-ным текстовым редактором.

На рис. 6.1 приведено диалоговое окно справочной системы AutoCAD 2000,которая организована по всем правилам Windows.

Данное диалоговое окно имеет три вкладки. Вкладка Содержание (Contents)показывает все разделы верхнего уровня справочной системы, вкладка Ука-затель (Index) является предметным указателем, а вкладка Поиск (Find) ис-пользуется для более глубокого поиска по базе терминов.

Справочные разделы, приведенные на рис. 6.1, сформированы из разныхсправочных файлов, однако выглядят как единая система. Управление ито-говой формой справочного диалогового окна осуществляется через файлы срасширением cnt, которые содержат наименования разделов справочнойинформации и имена файлов с расширением Ыр, где эти разделы размеще-ны. Основной файл, с которого система AutoCAD 2000 начинает собирать

Page 369: Visual LISP и секреты адаптации AutoCAD

368 Visual LISP и секреты адаптации AutoCAD

разделы справки, называется acad.cnt. В листинге 6.1 приведен текст этогофайла в том виде, в каком он входит в русскоязычную версию AutoCAD(в англоязычной версии особых отличий нет). На рис. 6.1 видно, что частьразделов осталась на английском языке, поскольку не были переведены прилокализации системы.

Справочная системе: AutoCAD 200D

. Содержанш j

Что нового в AutoCAD 2000

^ Using AutoCAD Help

ф Как...

ф Справочник команд

ф Руководство пользователя

^ Руководство по установке

^ Customization Guide

^ Печать в AutoCAD

^ V i s u a l LISP and AutoLISP

^ VBA and ActiveX Automation

^ DXF Reference

^ AutoCAD Express Tools

Доказать j Печать- [ Отмена [Рис. 6 . 1 . Диалоговое окносправочной системыAutoCAD 2000

Листинг 6.1. Файл acad.cnt

;;; ACAD.CNT- [v.ul5.0.01]

:Base acad.hlp

:Title AutoCAD 2000

:Index AutoCAD Command Reference=acad.hlp

:Index AutoCAD Customization Guide=acad_cg.hlp

:Index AutoCAD Installation Guide=acad_ig.hip

:Index AutoCAD User's Guide=acad_ug.hlp

.•Index 3d Graphics System Configuration=gsconfig.hlp

:Index AutoCAD Readme=readme.hip

:Index AutoCAD Technical Publications=doccheck.hlp

:Index AutoCAD Learning Assistance=acad_ala.hlp

:Link doccheck.hlp

.-Link acad.hlp

:Link acad_cg.hlp

:Link acad_ig.hlp

:Link acad_ug.hlp

:Link acad_vlr.hlp

Page 370: Visual LISP и секреты адаптации AutoCAD

Глава 6. Создание справочной системы 369

:Link acad_vlg.hlp:Link acad_vlt.hlp:Link acad_ag.hlp:Link acad_asi.hlp•.Link acadauto.hlp:Link dxf_2000.hlp:Link batchplt.hlp:Link drv_dwf.hip:Link drv_hpg2.hip:Link drv_hpgl.hip:Link drv_ps.hip•.Link drv_rast.hlp:Link gsconfig.hip:Link nsyshnts.hlp:Link pltedt.hlp:Link syshnts.hlp:Link webbrw.hlp:Link acad_plt.hlp

1 AutoCAD 2000 [email protected]>main1 Что нового в AutoCAD 2000=What39s_New_in_AutoCAD_2000_aug_01@

acad_ug.hlp>main

Include doccheck.cnt

Include acad_how.cnt

Include acad_cr.cnt

Include acadjjg. cnt

Include acad_ig.cnt

Include acad_cg.cnt

Include acad_plt.cnt

;; The RunHelp macro lives in achlp.dll

1 Visual LISP and AutoLISP

2 Shortcut link to the AutoCAD Visual LISP Help=!RunHelp("acad_vlr.hip")

; 2 Shortcut link to the AutoCAD Visual LISP Help=!EF("acad_vlr.hip","",4, "")

1 VBA and ActiveX Automation

2 Shortcut link to the AutoCAD VBA and ActiveX Help=!RunHelp("acad_ag.hip")

; 2 Shortcut link to the AutoCAD VBA and ActiveX Help=; !EF("acad_ag.hlp","",4,"")

1 DXF Reference

2 Shortcut link to the DXF Reference=!RunHelp("acad_vlr.hip")

; 2 Shortcut link to the DXF Reference EF=!EF("acad_ylr.hlp","",4,"")

:Include acetmain.cnt

:Include include.cnt

Page 371: Visual LISP и секреты адаптации AutoCAD

370 Visual LISP и секреты адаптации AutoCAD

6.1.2. CNT-файлыПоследняя строка файла acad.cnt (см. листинг 6.1) зарезервирована для под-ключения к справочной системе AutoCAD информации конкретного поль-зователя. Если пользователь хочет добавить свои разделы, для этого емупредоставляется возможность написать собственный файл include.cnt и ука-зать в нем подключаемые CNT-файлы (файлы с расширением cnt) своихразделов HELP-файлов. Файл include.cnt должен располагаться в той жепапке Help, что и справочные файлы AutoCAD. Файл include.cnt долженсостоять только из операторов : include и иметь вид, приведенный в лис-тинге 6.2.

: Листинг 6.2. Файл include.cnt !

:Include spravkal.cnt

:Include spravka2.cnt

:Include spravka3.cnt

Упоминаемые в листинге 6.2 файлы spravkal.cnt, spravka2.cnt и spravka3.cntдолжны быть расположены в папках, указанных в настройке путей файловподдержки (см. разд. 1.3). После внесения изменений в файл include.cnt (илив любые другие файлы справочной системы) нужно удалить файл acad.gid.Тогда справочная система сама настроится на новую структуру.

В CNT-файле пустые строки и строки, начинающиеся с точки с запятой,являются комментариями. Внутренним операторам предшествует символдвоеточия. Основные типы внутренних операторов следующие:

П .-Base — имя основного файла с расширением Ыр (с этим файлом связы-ваются другие аналогичные файлы);

0 : Title — заголовок, выносимый в диалоговое окно;

• : index — добавление элементов указателя;

• : Link — связывание с другим HELP-файлом;

• : include — добавление элементов к содержанию.

Если строка CNT-файла начинается с числа, то это число определяет уро-вень заголовка в содержании. Уровень 1 является самым верхним, уровень2 — на один уровень ниже уровня 1 и т. д. Заголовки уровня 2 должны сле-довать сразу за заголовком уровня 1, которому они подчиняются. Аналогич-ное требование предъявляется к заголовкам уровня 3 относительно уровня 2и т. д. В листинге 6.3 приведен файл acad_cr.cnt, который иллюстрирует ис-пользование уровней.

1 Листинг 6.3. Файл acad_cr.cnt I

:Base acad.hlp

1 Справочник команд

Page 372: Visual LISP и секреты адаптации AutoCAD

Глава 6: Создание справочной системы 371

2 [email protected]>main

2 [email protected]>main

2 Псевдоимена [email protected]>main

2 Системные [email protected]>main

2 Краткий справочник по размерным переменным=

[email protected]>main

2 [email protected]>main

2 Стандартные [email protected]>main

2 Графические объекты [email protected]>main

2 Шрифты [email protected]>main

2 [email protected]>main2 Пaнeли=toolbars [email protected]>main

На рис. 6.1 виден заголовок Справочник команд, который является заголов-ком уровня 1 и включен в справочную систему AutoCAD 2000 из файлаacad_cr.cnt. Если в диалоговом окне, приведенном на рис. 6.1, выделить этотзаголовок и щелкнуть по кнопке Показать (Show), то появятся все заголов-ки уровня 2, перечисленные в листинге 6.3 (рис. 6.2).

I Справочная система: AutoCAD 200U

Содержание | Указатель) Поиск}

;• Выберите кн^гу и нажмйТе'киопкц "Цтв к л а д к а . н а п р и м е р ' П М й й ^ &

гсь'Ц либо выберите другУкй:

^ Using AutoCAD Helpф Как...

ШВведение

Щ Команды

i2] Псевдоимена команд

i?3 Системные переменные

[23 Краткий справочник по размерным переменным

j j Утилиты

[V] Стандартные библиотеки

L 2 Графические объекты AutoCAD

i?l Шрифть| Unicode

Н?] МенюШ Панели

t Руководство пользователя zli

Дакрьп-ь^| ": Печать... ] Отмена

Рис. 6.2. Диалоговое окносправочной системыс открытыми заголовкамиуровня 2

6.1.3. Функция helpОсновным средством вызова HELP-файла из AutoLISP является функцияhelp:

(help [<файл> [<раздел> [<начало>]]])

Page 373: Visual LISP и секреты адаптации AutoCAD

372 Visual LISP и секреты адаптации AutoCAD

Аргументы функции help: <файл> — имя справочного файла, <раздел> — на-именование раздела справки, <начало> — страница, открываемая при загруз-ке справочного окна.

Если аргумент опущен или в качестве его значения <файл> указана пустаястрока (""), то система AutoCAD вызывает справочный файл, указанный внастройке как файл справки по умолчанию (см. разд. 1.3). Если в аргументе<файл> опущено расширение, то AutoCAD 2000 ищет файл с расширениемhip (a AutoCAD 2000i — сначала chm, а затем — hip).

В качестве аргумента <раздел> задается имя раздела (из CNT-файла), кото-рый нужно сразу же показать при вызове справки. Так, например, если вос-пользоваться файлом acad.cnt, приведенном в листинге 6.3, то в качествеИмени раздела МОЖет фигурировать "introduction", "cmd_toc", "command^aliases" и т. п. Если аргумент <раздел> опущен или задан равным пустойстроке, то выводится первый раздел справочного файла. На рис. 6.3 показанраздел справки, вызываемый с помощью выражения (help "" "cmdjtoc").

ф Справочник команд AutoCAD

Команды

3-ОР.БИТА ШШЕЗ

3-ПДН i

Построение трехмерных граней

Зеркальное отображение объектов относительноплоскости

Построение трехмерных объектов в виде многоугольныхсетей

Построение трехмерных массивов

Интерактивный просмотр объектов в ЗМ пространстве

Установка режима интерактивного ЗМ просмотра свозможностью перемещения вида по экрану

Создание ЗМ полилиний из линейных сегментов с типом

Рис. 6.3. Справочная информация из раздела cmd_toc

Аргумент <начало> может принимать одно из трех значений:

П "HELP_CONTENTS" — показывает первый раздел справки в файле;

О "HELP_HELPONHELP" — вызывает справку Windows о пользовании справоч-ной системой;

• "HELP_PARTIALKEY" — активизирует вкладку Указатель (Index) с отметкойна параметре, заданном в функции help в качестве аргумента <раздел>;если такого раздела нет, то подбирается ближайший по наименованию.

Page 374: Visual LISP и секреты адаптации AutoCAD

Глава 6. Создание справочной системы 373

Функция help возвращает значение аргумента <файл> при успешном выпол-нении операции и ni l — при неуспешном. Если функция вызывалась безпараметров, то возвращается "" или nil.

6.1.4. Вызов WIN-справкис помощью внешней командыДля вызова справочной информации из HELP-файла Windows следует соз-дать внешнюю команду и записать ее в файл acad.pgp (см. разд. 1.2).

Предположим, что имя новой команды будет HELPRU, а вызываемый файлназывается our_rules.hlp и находится в папке d:\AppAutoCAD. Тогда в файлacad.pgp нужно добавить такую строку.

HELPRU,start d:\AppAutoCAD\our_rules.hip,0

После загрузки AutoCAD или перезагрузки файла acad.pgp с помощьюкоманды ПЕРЕИН (REINIT) пользователю будет доступна команда HELPRU,вызывающая дополнительную справку.

6.1.5. Вызов WIN-справкис помощью функции startappДля вызова в среде AutoCAD другого приложения Windows можно пользо-ваться функцией AutoLISP startapp. Синтаксис функции следующий:

(startapp <приложение> [<параметр>])

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

Возвращаемое значение — целое число (положительное при успешном за-пуске приложения и о — при неудачном).

Функция startapp может быть полезной при вызове справки, для чегонужно запустить специальную справочную программу Windows с именемwinhlp32, а в качестве второго аргумента передать полное имя справочногофайла. Изменим пример из разд. 6.1.4 следующим образом:

(startapp "winhlp32" "d:\AppAutoCAD\our__rules.hlp")

ЕСЛИ ИМЯ файла СОДерЖИТ пробелы (например, "d:\AppAutoCAD\our rules .hip"),то его нужно обрамлять двойными кавычками:

(startapp "winhlp32" "\"d:\AppAutoCAD\our rules.hlp\"")

Когда аргумент <приложение> не содержит полного пути к исполняемомуфайлу, тогда файл ищется в путях, заданных переменной окружения PATH.

Page 375: Visual LISP и секреты адаптации AutoCAD

374 Visual LISP и секреты адаптации AutoCAD

6.2. HTML-справкиЕсли необходимо оформить разделы справочной информации в виде Web-страниц, то следует использовать файлы в формате HTML (расширенияфайлов — htm, html). Для просмотра таких страниц на компьютере должнабыть установлена соответствующая программа (например, Microsoft InternetExplorer). Сформировать HTML-файл можно либо с помощью специальныхHTML-редакторов, либо, например, с помощью программы Microsoft Word,которая имеет возможность сохранять текстовый файл в формате HTML.

6.2.1. Вызов HTML-справкис помощью CNT-файлаПредположим, вам надо включить в справочную систему файл rules.htm. Дляэтого добавьте, например, в нужный CNT-файл строку:

1 Правила=!ЕР("rules.htm","",4)

При вызове справочной системы в соответствующем месте появится пунктсодержания Правила. Щелчок по кнопке Показать (Show) для этого пунктаоткрывает окно в форме Web-страницы с содержимым файла rules.htm.

В качестве имени открываемого HTML-файла можно использовать имяфайла, расположенного в сети Интернет, например: "http://www.our.rules.ru/rules.html".

6.2.2. Вызов HTML-справкис помощью внешней командыКак и для HELP-файлов Windows, для HTML-файлов имеется возможностьвызова с помощью внешней команды, которую следует занести в файлacad.pgp (см. разд. 1.2).

Примером такой новой команды может служить представленная ниже коман-да HTMLRU. Если вызываемый файл называется rules.htm и находитсяв папке d:\AppAutoCAD, то в файл acad.pgp нужно добавить такую строку:

HTMLRU,start d:\AppAutoCAD\rules.htm, 0

Команда HTMLRU инициирует вызов программы, которая в операционнойсистеме по умолчанию открывает HTML-файлы (например, InternetExplorer).

6.2.3. Вызов HTML-справкис помощью функции startappДля вызова в среде AutoCAD справочного HTML-файла можно с помощьюфункции startapp открыть приложение, читающее эти файлы.

Page 376: Visual LISP и секреты адаптации AutoCAD

Глава 6, Создание справочной системы 375

Пример:

(setq webrdr "\"C: WProgram FilesWlnternet Explorer\\IEXPLORE.EXE\"")

(startapp webrdr "d:\AppAutoCAD\rules.htm")

В первой строке этого примера функция setq запоминает в переменнойwebrdr полное имя программы (Internet Explorer), причем, как и в разд. 6.1.5,нужно использовать дважды двойные кавычки. Затем функция startapp вы-зывает приложение и с его помощью открывает HTML-файл.

6.3. Устаревшиесправочные файлы AutoCADК устаревшим справочным файлам системы AutoCAD относятся файлы срасширением ahp, которые использовались в предыдущих версиях.

6.3.1. Функция acad_helpdlgДля временной поддержки старых справочных файлов в перечне функцийязыка AutoLISP сохранена следующая функция:

(acad_helpdlg <файл> <раздел>)

Оба аргумента являются текстовыми строками (задают имя справочногофайла с расширением ahp и имя раздела справки). По своему действиюфункция аналогична функции help (см. разд. 6.1.3).

6.4. Контекстно-зависимая справкак командам пользователяПри написании команд пользователя удобно по клавише <F1> получатьконтекстно-зависимую справку, отражающую во время работы командыописание ее действия и опций. Стандартные команды системы AutoCADтакому условию отвечают. Например, если после начала работы командыОТРЕЗОК (LINE) вы в ответ на запрос ввода первой или второй точек на-жмете клавишу <F1>, то откроется справочный раздел, посвященный по-строению отрезков с помощью этой команды.

6.4.1. Функция setfunhelpФункция setfunhelp дает возможность сгенерировать контекстно-зависимуюсправку для команд, созданных пользователем. Синтаксис функции:

(setfunhelp <функция-команда> [<файл> [<раздел> [<начало>]]])

Page 377: Visual LISP и секреты адаптации AutoCAD

376 Visual LISP и секреты адаптации AutoCAD

Аргументы: <функция-команда> — имя функции, начинающееся с префиксаС: или с: и определяющее новую команду AutoCAD; <файл> — имя справоч-ного файла; <раздел> — наименование раздела справочного файла; <начало> —начальная страница справки. Все аргументы — текстовые строки.

В качестве имени функции, вводимой вместо первого аргумента, должнобыть имя с префиксом С: или с: (оба начинаются с латинской буквы С).Если, например, функция называется с:crown, то она определяет новуюкоманду CROWN.

Второй, третий и четвертый аргументы аналогичны аргументам функцииhelp (см. разд. 6.1.3). Если в аргументе <файл> опущено расширение, тоAutoCAD сначала ищет файл с расширением Ыр, затем — с расширениемahp и только потом — файл без расширения.

При успешном завершении функция setfunhelp возвращает значение пер-вого аргумента, при неудачном — nil.

6.4.2. Особенности примененияфункции setfunhelpКак было сказано в разд. 2.16.2, пользовательские функции создаются, на-пример, при помощи функции defun. Описание любой пользовательскойфункции должно обязательно предшествовать в программном файле ука-занию имени этой функции в качестве первого аргумента в функцииsetfunhelp. В противном случае результат работы программы не предсказуем.

Page 378: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 7

Технология ActiveX

В данной главе рассматриваются функции AutoLISP, входящие в расшире-ние языка и реализующие в системе AutoCAD 2000 технологию ActiveX,разработанную фирмой Microsoft.

Технология ActiveX (точнее, ActiveX Automation, а ранее она называлась OLEAutomation) реализует идеологию объектно-ориентированного программиро-вания и позволяет оперировать не байтами, числами, а объектами приклад-ной среды и работать с ними на языке, подобном языку обычных манипу-ляций. Такая идеология внедрена в самые распространенные прикладныепакеты — например, Microsoft Word, Microsoft Excel и др. Она значительнооблегчает обмен данными между файлами, созданными разными системами.

Среда Visual LISP и язык AutoLISP не поддерживают технологию ActiveXв полном объеме (например, многодокументный режим используется с ог-раничениями), но большая часть технологии уже внедрена, а реализацияостального — дело времени. В полном объеме ActiveX поддерживается сре-дами разработки приложений ObjectARX и VBA.

7.1. Расширение языка AutoLISPВ технологии ActiveX объектная модель работающего приложения представ-ляется как совокупность объектов, свойств, методов и событий. Для каждогоиз элементов этой модели имеется своя реализация в виде данных новыхтипов (структур) и функций, обеспечивающих взаимодействие с пользова-телем.

7.1.1. ОбъектыОбъекты (objects) ActiveX в системе AutoCAD рассматриваются как иерар-хия, содержащая не только примитивы, но и прочие элементы (таблицы,словари и т. д.). Однотипные объекты объединяются в семейства (collec-

Page 379: Visual LISP и секреты адаптации AutoCAD

378 Visual LISP и секреты адаптации AutoCAD

tions). Корневым элементом этой иерархии является объект Application,остальные находятся на более низких уровнях.

Корневой объект Application связан с семействами:

• Preferences (Настройки)

• Documents (Документы)

• MenuBar (Строка меню)

П MenuGroups (Группы меню)

В семейство Preferences в качестве объектов входят различные настройки(файловые, чертежные и т. п.). Семейство Documents включает объекты типаDocument — ОТКрЫТЫе Документы (рисунки). В СемеЙСТВО MenuGroups ВХОДЯТобъекты типа MenuGroup (Группы меню), а в семейство MenuBar — объектытипа PopupMenu (Падающие меню).

Эта Иерархия раскрывается Дальше. В MenuGroups ВХОДЯТ объекты MenuGroup,каждый из которых содержит семейства PopupMenus и Toolbars. Далее следу-ют цепочки:

П PopupMenus — PopupMenu — PopupMenuItem

П Toolbars — Toolbar — Toolbarltem

Полное иерархическое дерево системы AutoCAD приведено в документациипо VBA. Подробнее остановимся только на объекте Document.

Объект Document содержит семейства:

• Blocks (Блоки)

• ModelSpace (Пространство модели)

О Paperspace (Пространство листа)

• Dictionaries (Словари)

• Dimstyles (Размерные стили)

• Groups (Группы)

D Layers (Слои)

Л Layouts (Листы)

• Linetypes (ТИПЫ ЛИНИЙ)

И Т. Д.

В первые три семейства входят основные объекты, которыми оперирует сис-тема AutoCAD (имена объектов аналогичны типам примитивов):

• 3DFace П Arc

• 3DPoly • Attribute

• 3DSolid • AttributeRef

Page 380: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 379

П BlockRef • MLine

• Circle O MText

О Dim3PointAngular О Point

О DimAligned О PolyfaceMesh

CJ DimAngular ГЭ Polyline

П DimDiametric • PolygonMesh

• DimOrdinate C\ Raster

• DiroRadial П Ray

• DimRotated G Region

• Ellipse • Shape

П ExternalReference • Solid

• Hatch D Spline

• Leader, • Text

О LightweightPolyline • Tolerance

• Line • Trace

• MinsertBlock П XLine

Кроме того, может входить семейство Hyperlinks с объектами типаHyperlink.

Работа с каждым из таких объектов в технологии ActiveX ведется на уровнеуказателей (адресов). Для поддержки объектов разработаны функции, вхо-дящие в расширение языка AutoLISP. Все эти функции имеют префиксыvia-, vlax- или vir- (минус тоже входит в префиксы) — см. приложение 5.

Однако, в отличие от обычных функций, функции ActiveX не доступны сра-зу же после начала сеанса системы AutoCAD. Для их загрузки следует вы-полнить функцию vl-ioad-com, рассмотренную в разд. 7.1.2.

7.1.2. Функция vHoad-comДанная функция загружает большое количество функций, входящих в рас-ширение AutoLISP, позволяющее работать с объектами, свойствами, мето-дами и событиями ActiveX.

(vl-load-com)

Возвращаемого значения у функции нет.

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

Page 381: Visual LISP и секреты адаптации AutoCAD

380 Visual LISP и секреты адаптации AutoCAD

Для получения доступа к такому объекту нужно сначала пройти по иерархиимодели объектов AutoCAD и прочитать указатели всех объектов более высо-ких уровней (объекта Application, документа, пространства модели). Четырефункции, позволяющие прочитать эти указатели, чтобы сохранить их в вы-деленных пользователем переменных, рассматриваются в разд. 7.1.4—7.1.7.

Имена всех функций могут вводиться в нижнем или верхнем регистрах, по-скольку AutoLISP безразличен к регистру (в этом его большое отличие отVBA и ObjectARX).

Свойства объектов иерархической модели индивидуальны. Помимо тради-ционных характеристик (color, layer), к свойствам объектов относятся и та-кие, как radius, area, length, perimeter И Т. Д. Для ИХ чтения имена СООТвет-СТВуЮЩИХ функций будут vla-get-color, vla-get-radius, vla-get-area И Т. Д.

Перечень всех свойств приведен в документации по VBA, а имена нужныхфункций могут быть получены добавлением префикса via-get-. Другиефункции, имеющие префикс via-put- (например, via-put-coior, via-put-layer), позволяют изменять свойства объектов.

Работа с функциями с префиксами via-get- и via-put- будет рассмотренав разд. 7.1.13.

7.1.4. Функция vlax-get-acad-objectЧитает указатель корневого объекта иерархии AutoCAD (имя объекта — Ap-plication).

(vlax-get-acad-object)

Возвращаемое значение — VLA-объект (указатель объекта Application).

Пример возвращаемого значения:° #<VLA-OBJECT IAcadApplication 00adc088>

О VLA-объектах см. разд. 7.1.10.

7.1.5. Функция vla-get-activedocumentЧитает указатель открытого документа (активного рисунка).

(vla-get-activedocument <корень>)

Аргумент <корень> — указатель корневого объекта, возвращенный функциейvlax-get-acad-object.

Возвращаемое значение — VLA-объект (указатель открытого документа).

Пример возвращаемого значения:D #<VLA-OBJECT IAcadDocument 00f6d534>

Page 382: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 381

7.1.6. Функция vla-get-modelspaceЧитает указатель пространства модели рисунка.

(vla-get-modelspace <документ>)

Аргумент <документ> — указатель документа, возвращенный функцией viax-get-activedocument.

Возвращаемое значение — VLA-объект (указатель пространства модели).

Пример возвращаемого значения:° #<VLA-OBJECT IAcadModelSpace 01923224>

7.1.7. Функция vla-get-paperspaceЧитает указатель пространства листа документа.

(vla-get-paperspace <документ>)

Аргумент <документ> — указатель документа, возвращенный функцией viax-get-activedocument.

Возвращаемое значение — VLA-объект (указатель пространства листа).

Пример возвращаемого значения:0 #<VLA-OBJECT IAcadPaperSpace 01920344>

7.1.8. Подготовка к работе с ActiveXVLA-объекты, полученные функциями, рассмотренными в разд. 7.1.4—7.1.7,очень важны. Их желательно сохранить в глобальных переменных, чтобы необращаться к этим функциям повторно. В листинге 7.1 приведен текстфункции begin_activex, к которой желательно обращаться перед работойприложений, использующих технологию ActiveX.

1 Листинг 7.1. Функция begin_activax j• , .J

(defun begin_activex ( /)

(vl-load-com)

(setq acad_application (vlax-get-acad-object))

(setq active_document (vla-get-activedocument acad_application))

(setq model_space (vla-get-modelspace active_document))

(setq paper_space (vla-get-paperspace active_document))

); defun

Последняя строка в вашем варианте функции begin_activex может бытьопущена, если вам не потребуются объекты из пространства листа.

Page 383: Visual LISP и секреты адаптации AutoCAD

382 Visual LISP и секреты адаптации AutoCAD

7.1.9. МетодыПо идеологии ActiveX каждому объекту соответствует перечень методов(операций), которые могут применяться к объекту. Например, активный до-кумент можно закрыть.

Для объектов каждого типа из входящих в семейство Modeispace обязательносуществует метод, позволяющий создавать новые объекты. Имя соответст-вующей функции AutoLISP, создающей объекты этого типа, образуется потакому правилу: к префиксу via-add добавляется наименование типа объектаиз перечисленных в разд. 7.1.1, например:

О vla-add3DFace

• vla-add3DPoly

• vla-add3DSolid

• vla-addArc

О vla-addftttribute

О vla-addAttributeRef

• vla-addBlockRef

О vla-addCircle

• vla-addDim3PointAngular

И Т. Д.

Все символы наименований функций могут быть в нижнем или в верхнемрегистре. Количество передаваемых функциям аргументов индивидуальнодля каждой из них. Оно определяется описанием метода (имена методов —Add3DFace, Add3DPoly, AddCircle И Т. Д.).

Существует много других методов (и реализующих их в языке AutoLISPфункций), применяемых к объектам. Каждой команде системы AutoCADсопоставляются методы с теми же именами. Например, командам КОПИ-РОВАТЬ (COPY) и ЗЕРКАЛО (MIRROR) сопоставлены методы Сору иMirror. ЭТИМ методам соответствуют фуНКЦИИ vla-copy И vla-mirror(получаются добавлением префикса via-).

Могут быть и отличия. Так, команде МАССИВ (ARRAY) сопоставляютсядва метода (ArrayRectangular И ArrayPolar), ПОЭТОМУ указанной команде СО-ОТВетствуЮТ две функции: vla-arrayrectangular И vla-arraypolar.

7.1.10. VLA-объектыОбъекты иерархии ActiveX называются также VLA-объектами. Функцииvlax-get-acad-object, vla-get-active-document, vla-get-modelspace, vla-get-paperspace, а также все функции с префиксами via-add возвращаютVLA-объекты. Фактически VLA-объекты — это указатели (адреса) в форми-

Page 384: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 383

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

Возможно преобразование обычных объектов в VLA-объекты и обратно. Та-кие Преобразования осуществляют фуНКЦИИ vlax-ename->vla-object И vlax-via-object->ename, рассматриваемые в разд. 7.1.11 и 7.1.12.

7.1.11. Функция vlax-ename->vla-objectПреобразует обычные примитивы в VLA-объекты.

(vlax-ename->vla-object <примитив>)

Аргумент функции — имя примитива в том виде, в каком оно возвращаетсяфункцией entlast.

Возвращаемое значение — VLA-объект.

В качестве примера построим, например, в рисунке отрезок и преобразуемего в VLA-объект:

° (setq viol (vlax-ename->vla-object (entlast))) возвратит #<VLA-OBJECT

IAcadLine 01925274> (ИЛИ ЧТО-ТО Похожее)

7.1.12. Функция vlax-vla-object->enameПреобразует VLA-объект в обычный примитив.(vlax -vla-object->ename <объект>)

Аргумент <объект> — VLA-объект (указатель) в том виде, в каком он воз-вращается функцией vlax-ename->vla-object.

Возвращаемое значение — имя примитива.

Пример (обратный к примеру из разд. 7.1.11):а (setq el (vlax-vla-object->ename viol)) возвратит <Имя объекта:

4002ed88> (или нечто аналогичное)

7.1.13. Работа со свойствамиДля VLA-объектов применимы функции чтения свойств (с префиксомvia-get-) и редактирования свойств (с префиксом via-put-). Например, дляобъекта v i o l , СОЗДаННОГО В разд. 7.1.11 С ПОМОЩЬЮ фуНКЦИИ vlax-ename-

>via-object, можно прочитать его основные свойства:

• (via-get-coior viol) вернет i;

О (vla-get-layer viol) вернет "0";

• (vla-get-linetype viol) вернет "ByLayer".

Page 385: Visual LISP и секреты адаптации AutoCAD

384 Visual LISP и секреты адаптации AutoCAD

Зная, что свойства startPoint и EndPoint отрезка хранят координаты егопервой и второй точек, можно получить их с помощью функций ActiveX:D (setq val (v la-get-s tar tpoint viol)) вернет #<variant 8197 ..:>

° (setq va2 (vla-get-endpoint v io l)) вернет #<variant 8197 ...>

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

Функции, имеющие вместо символов get символы put, выполняют редакти-рование VLA-объектов, например:

° (via-put-coior viol 3) изменяет цвет объекта viol на зеленый

7.1.14. ВариантыПри создании VLA-объектов с помощью функций с префиксом via-add(например, via-addcircie) в качестве аргументов могут фигурировать дан-ные ранее не известных в языке AutoLISP типов.

Метод Addcircie в VBA используется с двумя,аргументами: центром и ра-диусом, причем центр должен быть так называемым вариантом, а радиус —вещественным числом с двойной точностью. Такие же аргументы должныпередаваться и соответствующей этому методу функции via-addcircle.См. также уточнение в разд. 7.1.24.

Вариант — это структура, которая может хранить объекты разных типов.Создание варианта выполняется функцией vlax-make-variant (см. разд. 7.1.15).

Три функции, работающие С вариантами (vlax-variant-type, vlax-variant-value, vlax-variant-change-type) рассматриваются В разд. 7.1.16—7.1.18.

Для создания вариантов с координатами трехмерных точек используетсяфункция viax-3d-point (см. разд. 7.1.19). Такие варианты могут передаватьсяфункциям, требующим для создания объектов точки (например, точка цен-тра для окружности).

7.1.15. Функция vlax-make-variantСоздает вариант.

(vlax-make-variant [<значение> [<тип>]])

Аргументы: <значение> — значение, присваиваемое варианту; <тип> — целаяконстанта, указывающая тип варианта. Если второй аргумент опущен, то<тип> система пытается определить по первому аргументу. Если оба аргу-мента опущены, то создается вариант типа viax-vbEmpty (см. табл. 7.1).

Возвращаемое значение — вариант (указатель).

Page 386: Visual LISP и секреты адаптации AutoCAD

vlax-vbEmpty

vlax-vbNull

vlax-vblnteger

vlax-vbLoiig

viax-vbSingle •

viax-vbDouble

vlax-vbString

vlax-vbObject

vlax-vbBoolean

vlax-vbArray

0

1

2

3

4

5

8

9

11

8192

Глава 7. Технология ActiveX 385

Зарезервированные константы, которые могут использоваться в качествеаргумента <™п>, приведены в табл. 7.1.

Таблица 7.1. Константы, используемые в качестве типов вариантов

Константа Значение Описание

Неинициализированный (значение по умолчанию)

Пустой (без данных)

Короткое целое число

Длинное целое число

Вещественное число

Вещественное число с двойной точностью

Строка

Объект

Булево значение

Массив

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

Примеры использования функции vlax-make-variant:п (vlax-make-variant nil) возвращает #<variant 0>

° (setq vr (vlax-make-variant 17.25 vlax-vbDouble)) возвращает #<variant5 П,25>

° (setq vs (vlax-make-variant "tools")) возвращает #<variant 8 tools>

Если возникает необходимость создать вариант типа viax-vbArray, то в ка-честве первого аргумента нужно передать данные нового типа — массива,который в AutoCAD называется безопасный массив (safeanay). О безопасныхмассивах см. рази. 7.1.20.

Если sf — безопасный массив, то следующее выражение создает вариантт и п а v l a x - v b A r r a y :а ( s e t q v a s ( v l a x - m a k e - v a r i a n t s f ) ) В о з в р а щ а е т # < v a r i a n t 8197 . . . >

7.1.16. Функция vlax-variant-typeСоздает вариант.

(vlax-variant-type <вариант>)

13 Чак. 1J5

Page 387: Visual LISP и секреты адаптации AutoCAD

386 Visual LISP и секреты адаптации AutoCAD

Аргумент <вариант> — вариант.

Возвращаемое значение — целое число, соответствующее значениям из вто-рой колонки табл. 7.1. Если вариант имеет тип viax-vbArray, то возвращаетсячисло вида 8192 + N, где N — число, обозначающее тип элементов массива.

Примеры (продолжение примеров из разд. 7.1.15):

° (vlax-variant-type vr) возвращает 5D (vlax-variant-type vs) возвращает 8D (vlax-variant-type vas) возвращает 8197

7.1.17. Функция vlax-variant-valueВычисляет значение варианта.(vlax-variant-value <вариант>)

Аргумент <вариант> — вариант.

Возвращаемое значение — значение, присвоенное варианту.

Примеры (продолжение примеров из разд. 7.1.15):

° (vlax-variant-value vr) возвращает 17. 25п (vlax-variant-value vs) возвращает "tools"D (vlax-variant-value vas) возвращает #<safearray...>

7.1.18. Функция vlax-vahant-change-typeИзменяет тип варианта, конвертируя значение.

(vlax-variant-change-type <вариант> <тип>)

Аргументы: <вариант> — изменяемый вариант, <тип> — целочисленная кон-станта из первого столбца табл. 7.1.

Возвращаемое значение — вариант нового типа. Если конвертация невоз-можна, то возвращается nil.D (vlax-variant-change-type vr vlax-vblnteger) Возвращает #<variant 2

17> (вещественное число 17.25 округлено до целого 17)D (vlax-variant-change-type vr viax-vbstring) возвращает #<variant 8

17,25> (вещественное число 17.25 преобразовано в строку "17,25")

7.1.19. Функция vlax-3D-pointСоздает вариант из трех вещественных чисел двойной точности (может ис-пользоваться в качестве трехмерной точки). Обращение к функции можетбыть в двух видах:(vlax-3D-point <список>) или (vlax-3D-point <x> <y> [<z>])

Page 388: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 387

Аргументы: <список> — список из двух или трех вещественных чисел; <х>,<у>, <z> — вещественные числа.

Возвращаемое значение — вариант из трех вещественных чисел двойнойточности (если координата Z не была задана, то она считается равной 0.0).

Примеры:

° (setq vptl (vlax-3d-point 4 0 13.2)) возвращает #<variant 8197 ...>

(вариант из трех вещественных чисел двойной точности)D ( s e t q v p t l ( v l a x - 3 d - p o i n t ' ( - 1 2 . 4 6 . 0 ) ) ) в о з в р а щ а е т # < v a r i a n t 8197

.. .> (тоже вариант из трех чисел с нулевой третьей координатой)

7.1.20. Безопасные массивыФункции ActiveX имеют возможность работать с массивами (это тип дан-ных, который в обычных функциях AutoLISP недоступен). Такие массивыназываются безопасными (safearrays), поскольку система постоянно контро-лирует тип и количество сохраняемых в них числовых значений.

Для работы с безопасными массивами используются функции \0ax-make-safearray, viax-sareatray-put -element, -/lax-oa' .'array -til 1, рассматривае-мые в разд. 7.1.21—7.1.23. Эти функции позволяют создавать, заполнять иизменять безопасные массивы.

7.1.21. Функция vlax-make-safearrayСоздает безопасный массив размерности от 1 до 16 и инициализирует его.

(vlax-make-safearray <тип> '(<от1> . <до1>) ['(<от2> . <до2>) ...

[' (<от16> . <до16>) ]...] )

Первый аргумент <тип> — это целочисленная константа. Все последующиеаргументы имеют форму точечной пары, количество которых может быть отодного до шестнадцати — по величине размерности создаваемого массива.Все элементы точечных пар — целые числа (первый элемент — начальноезначение индекса размерности массива, второй элемент — конечное значе-ние индекса). Значения индексов могут быть как положительными, так иотрицательными, но значение конечного индекса не может быть меньшезначения начального индекса.

В первом аргументе в качестве целочисленных констант могут использовать-ся КОНСТанты vlax-vblnteger, vlax-vbLong, vlax-vbSingle, vlax-vbDouble,vlax-vbString, vlax-vbObject, vlax-vbBoolean ИЗ первого столбца табл. 7.1, а

также viax-vbvariant, имеющая значение 12 и применяемая в качестве типадля вариантов.

Возвращаемое значение — безопасный массив (точнее, его указатель).

13*

Page 389: Visual LISP и секреты адаптации AutoCAD

388 Visual LISP и секреты адаптации AutoCAD

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

Таблица 7.2. Начальные значения элементов безопасных массивов

Тип элемента Начальное значение

vlax-vblnteger О

vlax-vbLong О

vlax-vbSingle 0. О

vlax-vbDouble 0. О

vlax-vbString "" (пустая строка)

vlax-vbObject n i l

vlax-vbBoolean .-vlax-false (булева константа, используемая как "ложь")

vlax-vbVariant Неинициализированный вариант(vlax-vbEmpty)

Пример:0 (setq sf (vlax-make-safearray vlax-vbBoolean '(-2 . 2) ) ) создает ОДНО-

мерный массив из пяти булевых элементов и возвращает #<safearray... >

Элементы созданного в примере массива будут иметь такую нумерацию:-2, - 1 , 0, 1, 2.

7.1.22. Функция vlax-safearray-put-elementПрисваивает значение элементу безопасного массива.

(viax-safearray-put-element <бм> <индексы> <значение>.)

Аргументы: <бм> — безопасный массив; <индексы> — целые числа (их коли-чество равно размерности массива), указывающие номер элемента;<значение> — заносимое значение.

Возвращаемое значение — значение последнего аргумента.

Примеры (заполнение массива, созданного в разд. 7.1.21, булевыми констан-тами):

0 (vlax-safearray-put-element sf -2 :vlax-false) возвращает :vlax-falseD (vlax-safearray-put-element sf -1 :vlax-false) возвращает :vlax-falseD (vlax-safearray-put-element sf 0 :vlax-true) Возвращает :vlax-trueD (vlax-safearray-put-element sf 1 :vlax-false) возвращает :vlax-falseD (vlax-safearray-put-element sf 2 :vlax-true) возвращает :v.lax-true

Page 390: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 389

7.1.23. Функция vlax-safearray-fillПрисваивает значения всем элементам безопасного массива.(vlax-safearray-fill <бм> <список>)

Аргументы: <бм> — безопасный массив; <список> — список значений, при-сваиваемых элементам массива. Количество элементов и размерность аргу-мента <список> должны соответствовать размерам массива <бм>.

Возвращаемое значение — значение аргумента <бм>.

Пример (заполнение массива, созданного в разд. 7.1.21):а (vlax-safearray-fill sf ' (:vlax-false :vlax-false :vlax-true :vlax-

false :vlax-true) ) Возвращает Ksafearray. . . >

7.1.24. Пример создания VLA-объектаПопробуем в пространстве модели создать VLA-объект не преобразованиемего из обычного примитива, а с помощью функции, соответствующей одно-му из методов с префиксом add (префикс соответствующей функции будетvla-add).

В разд. 7.1.14 было сделано замечание, что с помощью функции via-addcircie можно создать окружность, передавая в качестве аргументов вари-ант с координатами трехмерной точки и вещественное число двойной точ-ности (они должны стать центром и радиусом будущего круга). Сделаемуточнение: у функции есть еще один аргумент и он является первым — этоVLA-объект, указывающий на пространство модели. Такой объект долженбыть получен уже на стадии подготовки к работе с технологией ActiveX (см.объект modei_space в листинге 7.1 разд. 7.1.8).

В качестве данных для построения окружности возьмем координаты центра(124.4, 25.9, 40.7) и радиус 100 мм (листинг 7.2).

I Листинг 7.2. Построение окружности методом ActiveX \

( s e t q c e n t e r ( v l a x - 3 d - p o i n t ' ( 1 2 4 . 4 2 5 . 9 4 0 . 7 ) ) )(setq ax_circle (vla-addcircle model__space center 100.0))

Первое выражение создает вариант с тремя координатами центра будущейокружности. Последнее выражение возвращает VLA-объект (#<VLA-OBJECTiAcadCircie 0192сс04>). Чтобы убедиться в его правильности, попробуемвоспользоваться функцией viax-dump-object (см. следующий раздел).

7.1.25. Функция vlax-dump-objectВыводит дамп объекта — полную распечатку свойств и, по запросу, перечняприменимых к объекту методов.(vlax-dump-object <объект> [<признак>])

Page 391: Visual LISP и секреты адаптации AutoCAD

390 Visual LISP и секреты адаптации AutoCAD

Аргументы: <объект> — VLA-объект, <признак> — если задается и отличен отnil, то является указанием добавить в распечатку перечень методов, рабо-тающих с данным VLA-объектом.

Возвращаемое значение — т, если указано имя действительного VLA-объекта. В противном случае ничего не возвращается и может быть отобра-жено сообщение об ошибке.

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

В листинге 7.3 приведена распечатка свойств и методов объекта ax_circie,построенного в примере разд. 7.1.24.

; Листинг 7.3. Дамп свойств построенной окружности i

lAcadCircle: Интерфейс AutoCAD для работы с кругами.

Значения свойств:

Application (R0) - #<VLA-OBJECT JAcadApplication 00adcO88>

Area - 31415.9

Center - (124.4 i. 5. 9 40.7)

Cixcumierence - 628.319

Color - 256

Diameter - 200.0

Document (RO) = #<VLA-OBJECT IAcadDocument 00f6d534>

Handle (RO) = "33"

HasKxtensionDict.i onary (RO) = 0

Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0192fc94>

Layer = "0"

Linetype = "ByLayer"

LinetypeScale =1.0

Lineweight = -1

Normal =- (0.0 0.0 1.0)

ObjectID (RO) - 1073933720

ObjectName (RO) = "AcDbCircle"

OwnerID (RO) - 1073933560

PlotStyleName = "ByLayer"

Radius -^ 100.0

Thickness = 0.0

Visible = -1

Поддерживаемые методы:

ArrayPolar (3)

ArrayRectangular (6)

Copy ()

Delete ()

GetBoundingBox (2)

GetExtensionDictionary ()

Page 392: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 391

GetXData (3)H i g h l i g h t (1)I n t e r s e c t w i t h (2)Mirror (2)Mirror3D (3)Move (2)Offset (1)R o t a t e (2)Rotate3D (3)S c a i e E n t i t y (2)SetXData (2)TransfonnBy (1)Update ()

7.1.26. Другие функции ActiveXВ расширение языка AutoLISP входит еще много полезных функций техно-логии ActiveX. Их можно было бы разделить на такие условные группы:

П функции команд и методов;

• функции операций с объектами;

• функции операций со словарями;

• функции преобразований;

• функции операций со свойствами;

• функции операций с кривыми.

Эти функции коротко рассматриваются в разд. 7.2—7.7. Кроме того, вразд. 7.8 рассказывается о реакторах и работающих с ними функциях.

Примеры программ, использующих технологию ActiveX, можно найти впапке Sample программного обеспечения системы AutoCAD 2000.

7.2. Функции команд и методовВ следующих разделах рассматриваются четыре функции: viax-add-ond,vlax-remove-cmd, vlax-invoke-method и vlax-product-key.

7.2.1. Функция vlax-add-cmdПозволяет создать команду AutoCAD через функцию, не имеющую префик-са с:. Возможно даже создание прозрачных команд (такой возможности нету функций с префиксом с:).

(vlax-add-cmd <глоб> <функция> [<лок> <флаги>])

Page 393: Visual LISP и секреты адаптации AutoCAD

392 Visual LISP и секреты адаптации AutoCAD

Аргументы: <глоб> — строка с глобальным именем команды; <функция> —символ с именем функции, которая вызывается при обращении к команде(функция не должна иметь аргументов); <лок> — строка с локальным име-нем команды; <флаги> — сумма установленных битовых флагов (см. ниже).Если локальное имя команды не задано, то используется значение парамет-ра <глоб>.

Возвращаемое значение — значение аргумента <глоб>. При сбое возвращает-ся nil.

Данная функция предоставляет доступ к макросу ObjectARX acedRegCmdsсреды ObjectARX, который формирует указатель объекта AcEdcommandstack.

Команды, создаваемые функцией viax-add-cmd, заносятся в соответствую-щую группу команд (команды документа или команды VLX-приложения сотдельным именным пространством).

Не разрешается в качестве второго аргумента указывать символы функций,использующих реакторы или являющихся исполняемыми функциями реак-торов (см. разд. 7.8).

Аргумент <флаги> формируется как сумма битовых флагов, представленных втабл. 7.3. Если какой-то флаг не установлен, то его значение считается рав-ным нулю. По умолчанию для аргумента <флаги> принимается значение 4.

Таблица 7.3. Битовые флаги, используемые функцией viax-add-cmd

Битовый Условное Описаниефлаг обозначение

1 ACRX_CMD_TRANSPARENT Команда может выполняться в прозрач-ном режиме, т. е. до окончания преды-дущей команды AutoCAD

2 ACRX_CMD_USEPICKSET Команда может использовать наборпредварительно выбранных объектов

4 ACRX_CMD_REDRAW Команда может использовать как наборпредварительно выбранных объектов,так и набор объектов, выбранных послеввода имени команды

7.2.2. Функция vlax-remove-cmdУдаляет команду или группу команд из списка команд в данном сеансе ра-боты AutoCAD.

(vlax-remove-cmd <глоб>)

Page 394: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 393

Аргумент — строка или т. Если значение аргумента — строка, то удаляетсякоманда с данным именем. Если в качестве значения аргумента задано т, тоудаляются команды, созданные данным приложением.

Возвращаемое значение — т (при успешном завершении) или nil (при не-возможности выполнить удаление).

7.2.3. Функция vlax-invoke-methodПрименяет метод с указанным именем.

( v l a x - i n v o k e - r a e t ' n o d < о б ъ е к т > < м е т о д > < а р г 1 > [ < а р г 2 > . . . [ < a p r N > ] . . . ] ] )

Аргументы: <объект> -— VLA-объект; <метод> — символ или строка с именемметода; <apri>, <арг2>, ... <аргы> — значения аргументов, передаваемых ме-тоду (их количество определяется методом).

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

Функция не проверяет значения, передаваемые в качестве значений аргу-ментов <арг1>, <арг2>, ... <аргЫ>.

Г Замечание ЛВ предыдущих версиях системы AutoCAD эта функция называлась v l a x -invoke.

7.2.4. Функция vlax-product-keyВычисляет путь к системе AutoCAD в системном реестре Windows.

(vlax-product-key)

Возвращаемое значение -- строка с путем.

7.3. Функции операций с объектамиВ следующих разделах изучаются функции, выполняющие различные опе-рации с VLA-объектами. Некоторые аналогичные функции уже были рас-смотрены в разд. 7.1.4—7.1.7, 7.1.25.

7.3.1. Функция vlax-erased-pПроверяет, удален ли объект.

(vlax-erased-p <объект>)

Аргумент <объект> — VLA-объект.

Возвращаемое значение — т, если объект удален, и nil, если не удален.

Page 395: Visual LISP и секреты адаптации AutoCAD

394 Visual LISP и секреты адаптации AutoCAD

7.3.2. Функция vlax-method-applicable-pПроверяет, применим ли метод к данному объекту.

(vlax-method-applicable-p <объект> <метод>)

Аргументы: <объект> — VLA-объект; <метод> — символ (с апострофом) илистрока с именем метода.

Возвращаемое значение — т, если метод применим к объекту <объект>, иnil, если не применим.

7.3.3. Функция vlax-typeinfo-available-pПроверяет, присутствует ли информация библиотеки типов для данного ти-па объектов.

(vlax-typeinfo-available-p <объект>)

Аргумент <объект> — VLA-объект.

Возвращаемое значение — т (присутствует) или nil (не присутствует).

Прежде чем применить к объекту свойство или метод, система AutoCADдолжна проверить библиотеку типов.

7.3.4. Функция vlax-object-released-pПроверяет, освобожден ли объект (т. е. удален ли он физически).

(vlax-object-released-p <объект>)

Аргумент <объект> — VLA-объект.

Удаленные объекты AutoCAD в течение некоторого времени не освобожда-ются, т. е. остаются доступными для восстановления. Восстановление ока-зывается невозможным либо в результате операции сборки мусора (см.разд. 2.17.5), ЛИбО В результате Применения ФУНКЦИИ vlax-release-object(см. разд. 7.3.5), либо в результате закрытия сеанса AutoCAD.

Возвращаемое значение — т, если объект освобожден, и ni l — в противномслучае.

7.3.5. Функция vlax-release-objectОсвобождает объект (об освобождении см. разд. 7.3.4).

(vlax-release-object <объект>)

Аргумент <объект> — VLA-объект.

Возвращаемого значения нет.

Page 396: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 395

7.3.6. Функция vlax-read-enabled-pПроверяет, может ли объект быть прочитан.

(vlax-read-enabled-p <объект>)

Аргумент <объект> — VLA-объект.Возвращаемое значение — т (может быть прочитан) или :-,:! (не может бытьпрочитан).

7.3.7. Функция vlax-write-enabled-pОпределяет, может ли объект быть модифицирован.(vlax-write-enabled-p <объект>)

Аргумент <объект> — VLA-объект или имя примитива.

Возвращаемое значение — т (может быть модифицирован) или i-.ii (не мо-жет быть модифицирован).

7.3.8. Функция vlax-create-objectСоздает указатель на объект приложения или на само приложение перед егозапуском.(vlax-create-object <имя>)

Аргумент <имя> — строка, определяющая тип объекта. Может быть одного изСледующих ВИДОВ; "<приложение>.<тип>.<версия>" ИЛИ "<приложение>. <тип>".Например: "AutoCAD.Drawing.15", "Excel.Application".

Возвращаемое значение — VLA-объект.

Если требуемый указатель (VLA-объект) ранее уже был создан и зарегистри-рован как единичный объект, то повторно он не создается.

7.3.9. Функция vlax-get-objectВычисляет указатель (VLA-объект) для объекта приложения или самогоприложения (объекта Application),(vlax-get-object <имя>)

Аргумент <имя> — строка, определяющая тип объекта (см. описание аргу-мента функции vlax-create-object).

Возвращаемое значение — VLA-объект. При ошибке возвращается nil.

7.3.10. Функция vlax-get-or-create-objectВычисляет указатель объекта приложения или создает его, если такого ука-зателя не было.(vlax-get-or-create-object <имя>)

Page 397: Visual LISP и секреты адаптации AutoCAD

396 Visual LISP и секреты адаптации AutoCAD

Аргумент <имя> — строка, определяющая тип объекта (см. описание аргу-мента функции vlax-create-object).

Возвращаемое значение — VLA-объект.

7.3.11. Функция vlax-import-type-libraryИмпортирует информацию из библиотеки типов.

(vlax-import-type-library :tlb-filename <файл> [:methods-prefix<мпрефикс> :properties-prefix <свпрефикс> :constants-prefix<конпрефикс>])

Аргумент <файл> может быть строкой с именем файла одного из следующихтипов:

О библиотека типов (файл с расширением tlb);

• библиотека объектов (файл с расширением olb);

• исполняемый файл (с расширением ехе);

• библиотека с ресурсом библиотеки типов (файл с расширением dll);

П сложный документ, содержащий библиотеку типов;

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

Если в аргументе <файл> путь не приведен, то файл разыскивается по стан-дартному алгоритму поиска файлов поддержки.

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

Аргумент <свпрефико — строка, которая будет добавляться при импорте кформируемым именам функций чтения и модификации свойств (например,ДЛЯ префикса ххх- И свойства Marvel генерируются имена xxx-get-marvelи xxx-put-marvel). По умолчанию имеет значение пустой строки.

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

Возвращаемое значение — т при успешном завершении, ni l — при ошибке.

7.3.12. Функция vlax-map-collectionПрименяет функцию сразу ко всем объектам семейства.

(vlax-map-collection <объект> '<функция>)

Page 398: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 397

Аргументы: <объект> — VLA-объект, соответствующий семейству; <функция> —символ с именем функции или LISP-выражение, описывающее непоимено-ванную функцию (см. описание функции lambda, разд. 2.16.1).

Возвращаемое значение — значение аргумента <объект>.

7.3.13. Функция vlax-forВычисляет выражения со всеми объектами семейства.

(vlax-for <символ> <семейство> [<выражение1> [<выражение2> ...

[<выражениеМ> ]...]])

Аргументы: <символ> — символ, вместо которого в выражения нужно пооче-редно подставлять объекты семейства; <семейство> — VLA-объект, соответ-ствующий семейству, к объектам которого применяются выражения;<выражение1>, <выражение2>, ... <выраженмеЫ> — LISP-ВЫражения, Которыенужно вычислить.

Возвращаемое значение — значение последнего выражения, вычисленноес последним объектом семейства.

7.4. Функции операций со словарямиПять приведенных в следующих разделах функций выполняют операциис пользовательскими данными, сохраняемыми в словарях.

7.4.1. Функция vlax-ldata-putЗаписывает LlSP-данные в словарь рисунка или в объект.

(vlax-ldata-put <словарь> <код> <данные> [<приложение>))

Аргументы: <словарь> — VLA-объект, соответствующий графическому объ-екту рисунка, или строка с именем словаря; <код> — код словаря;<данные> — данное любого типа, используемого в языке AutoLISP (число,список, строка и т. п.); <приложение> — если не опущен и не nil, то указы-вает на необходимость сохранения данных в отдельном именном простран-стве выполняемого приложения.

Возвращаемое значение — значение аргумента <данные>.

Приложение может сохранять часть своих данных в рисунке, а часть —в своем пространстве.

7.4.2. Функция vlax-ldata-getИзвлекает LISP-данные из словаря рисунка или из объекта.(vlax-ldata-get <словарь> <код> [<умолчание> [<приложение>]])

Page 399: Visual LISP и секреты адаптации AutoCAD

398 Visual LISP и секреты адаптации AutoCAD

Аргументы: <словарь> — VLA-объект, соответствующий графическому объ-екту рисунка, или строка с именем словаря; <код> — код словаря;<умолчание> — значение любого типа, возвращаемое в том случае, если нуж-ного кода в словаре нет (можно в качестве значения этого аргумента зада-вать nil); <приложение> — если не опущен и не nil, то указывает на необхо-димость извлечения данных из отдельного именного пространства выпол-няемого приложения.

Возвращаемое значение — прочитанное данное.

7.4.3. Функция vlax-ldata-listВыводит список из точечных пар с кодами и значениями LISP-данных сло-варя или объекта.

(vlax-ldata-list <словарь> [<приложение>])

Аргументы: <словарь> — VLA-объект, соответствующий графическому объ-екту рисунка, или строка с именем словаря; <приложение> — если не опущени не nil, то указывает на необходимость извлечения данных из отдельногоименного пространства выполняемого приложения.

Возвращаемое значение — список из точечных пар (первый элемент пары —код, а второй элемент — данное), например: (("tank" . "т-34") ("bank" .'(57))).

7.4.4. Функция vlax-ldata-deleteУдаляет LISP-данные из словаря или объекта.

(vlax-ldata-delete <словарь> <код> [<приложение>])

Аргументы: <словарь> — VLA-объект, соответствующий графическому объ-екту рисунка, или строка с именем словаря; <код> — код словаря;<приложение> — если не опущен и не nil, то указывает на необходимостьудаления данных из пространства выполняемого приложения.

Возвращаемое значение — т при успешном выполнении удаления или nil —при невозможности удаления.

7.4.5. Функция vlax-ldata-testПроверяет, могут ли данные быть сохранены по окончании сеанса работыAutoCAD.(vlax-ldata-test <данные>)

Аргумент <данные> — LISP-данное, которое проверяется на возможность со-хранения.

Возвращаемое значение — т (данные могут быть сохранены) или nil (дан-ные не могут быть сохранены).

Page 400: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 399

7.5. Функции преобразованийНесколько функций, оперирующих безопасными массивами, уже рассмот-рены в разд. 7.1. В следующих разделах приводятся еще шесть функций, атакже фуНКЦИЯ vlax-tmatrix.

7.5.1. Функция vlax-safearray-get-dimВычисляет размерность безопасного массива.

(vlax-safearray-get-dim <бм>)

Аргумент <бм> — безопасный массив.

Возвращаемое значение — целое число (размерность массива). Если аргу-мент <бм> — не безопасный массив, то выдается сообщение об ошибке.

7.5.2. Функция vlax-safearray-get-1-boundВычисляет начальное (нижнее) значение индекса безопасного массива.

(vlax-safearray-get-1-bound <бм> <номер>)

Аргументы: <бм> — безопасный массив; <номер> — номер индекса, для кото-рого вычисляется начальное значение (индекс первого измерения массиваимеет номер 1, второго — 2 и т. д.).

Возвращаемое значение — целое число с начальным значением индекса.Если переданы неверные данные в первом или втором аргументах, то выда-ется сообщение об ошибке.

7.5.3. Функция vlax-safearray-get-u-boundВычисляет конечное (верхнее) значение индекса безопасного массива.(vlax-safearray-get-u-bound <бм> <номер>)

Аргументы: <бм> — безопасный массив; <номер> — номер индекса, для кото-рого вычисляется конечное значение (индекс первого измерения массиваимеет номер 1, второго — 2 и т. д.).

Возвращаемое значение — целое число с конечным значением индекса. Еслипереданы неверные данные в первом или втором аргументах, то выдаетсясообщение об ошибке.

7.5.4. Функция vlax-safearray-get-elementВычисляет значение элемента безопасного массива по индексам.

(vlax-safearray-get-element <бм> <инд1> [<инд2> ... [<индМ>] ..])

Page 401: Visual LISP и секреты адаптации AutoCAD

400 Visual LISP и секреты адаптации AutoCAD

Аргументы: <бм> — безопасный массив; <инд1>, <инд2>, ... <инды> — целыечисла (значения индексов, для которых вычисляется значение элемента).Количество аргументов с индексами должно совпадать с размерностью мас-сива (для одномерного массива это одно число).

Возвращаемое значение — значение элемента массива.

7.5.5. Функция vlax-safearray-typeВычисляет тип безопасного массива.

(vlax-safearray-type <бм>)

Аргумент <бм> — безопасный массив.

Возвращаемое значение — целое число (2, 3, 4, 5, 8, 9 или 11), определяю-щее тип массива в соответствии с табл. 7.1. Для массива из вариантов воз-вращается 12. Если в качестве аргумента передан не безопасный массив, товыдается сообщение об ошибке.

7.5.6. Функция vlax-safearray->listПреобразует элементы массива в список.

(vlax-safearray->list <бм>)

Аргумент <бм> — безопасный массив.

Возвращаемое значение — список, составленный из элементов массива.

7.5.7. Функция vlax-tmatrixВычисляет вариант типа массива (viax-vbArray) для методов, выполняющихоперации, аналогичные преобразованию с матрицей 4x4.(vlax-tmatrix <список>)

Аргумент <список> — список, элементами которого являются четыре спискаиз четырех вещественных чисел. Этот список представляет собой матрицуразмером 4x4.

Возвращаемое значение — вариант, представляющий переданную матрицупреобразования.

7.6. Функции операций со свойствамиПомимо работающих со свойствами функций, рассмотренных в разд. 7.1,в расширение языка Auto LISP входят следующие: vlax-get-property, viax-put-property, vlax-property-available-p.

Page 402: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 401

7.6.1. Функция vlax-get-propertyВычисляет свойство объекта.(vlax-get-property <объект> <свойство>)

Аргументы: <объект> — VLA-объект, <свойство> — символ (с апострофом)или строка с наименованием свойства.

Возвращаемое значение — значение свойства (тип значения зависит отсвойства).

ЗамечаниеВ предыдущих версиях системы AutoCAD эта функция фигурировала под име-нем v lax-get.

7.6.2. Функция vlax-put-propertyПрисваивает новое значение свойству объекта.

(vlax-put-property <объект> <свойство> <значение>)

Аргументы: <объект> — VLA-объект, <свойство> — символ (с апострофом)или строка с наименованием свойства; значение — новое значение свойства.

Возвращаемое значение — nil. При сбое выводится сообщение об ошибке.

ЗамечаниеВ предыдущих версиях системы AutoCAD эта функция имела имя v lax-put.

7.6.3. Функция vlax-property-available-pПроверяет, имеет ли объект данное свойство.

(vlax-property-available-p <объект> <свойство> [<модификация>])

Аргументы: <объект> — VLA-объект; <свойство> — символ (с апострофом)или строка с именем свойства; <модификация> — признак проверки возмож-ности модификации свойства (если т, то такая проверка выполняется).

Возвращаемое значение — т или nil, зависит от значения третьего аргумента:

1. Аргумент <модификация> не задан или имеет значение nil, то возвращает-ся т, если данное свойство у объекта есть, nil — если данного свойстванет.

2. Аргумент <модификация> - задан и имеет значение т, то возвращается т,если данное свойство у объекта есть и возможно его изменение, ni l —если данного свойства нет или его нельзя модифицировать.

Page 403: Visual LISP и секреты адаптации AutoCAD

402 Visual LISP и секреты адаптации AutoCAD

7.7. Функции операций с кривымиРасширение AutoLISP предоставляет пользователю большое количествофункций для дополнительных операций с кривыми (в том числе операцийдоступа к параметрическому заданию кривых).

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

7.7.1. Функция vlax-curve-get AreaВычисляет площадь внутри кривой.

(vlax-curve-getArea <кривая>)

Аргумент <кривая> — VLA-объект, соответствующий кривой.

Возвращаемое значение — вещественное число. В случае сбоя возвращаетсяnil.

7.7.2. Функция vlax-curve-getStartPointВычисляет начальную точку кривой в МСК.

(vlax-curve-getStartPoint <кривая>)

Аргумент <кривая> — VLA-объект.

Возвращаемое значение — список из трех вещественных чисел (координат).В случае сбоя возвращается nil.

7.7.3. Функция vlax-curve-getEndPointВычисляет конечную точку кривой в МСК.

(vlax-curve-getEndPoint <кривая>)

Аргумент <кривая> — VLA-объект.

Возвращаемое значение — список из трех вещественных чисел (координат).В случае сбоя возвращается nil.

7.7.4. Функция vlax-curve-getPointAtDistВычисляет точку (в МСК), которая лежит на кривой и отстоит по длинеэтой кривой от начальной точки на заданное расстояние.

(vlax-curve-getPointAtDist <кривая> <расстояние>)

Page 404: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 403

Аргументы: <кривая> — VLA-объект, соответствующий кривой; <расстояние> —вещественное число, задающее расстояние от начальной точки кривой.

Возвращаемое значение — список из трех вещественных чисел (координат).В случае сбоя возвращается nil.

7.7.5. Функция vlax-curve-getDistAtPointВычисляет длину кривой между начальной точкой и заданной точкой накривой.

(vlax-curve-getDistAtPoint <кривая> <точка>)

Аргументы: <кривая> — VLA-объект; <точка> — список из трех веществен-ных чисел с координатами точки в МСК.

Возвращаемое значение — вещественное число. В случае ошибки возвраща-ется nil.

7.7.6. Функция vlax-curve-getStartParamВычисляет значение параметра в начальной точке кривой.

(vlax-curve-getStartParam <кривая>)

Аргумент <кривая> — VLA-объект.

Возвращаемое значение — вещественное число. В случае сбоя возвращаетсяnil.

7.7.7. Функция vlax-curve-getEndParamВычисляет значение параметра в конечной точке кривой.

(vlax-curve-getEndParam <кривая>)

Аргумент <кривая> — VLA-объект.

Возвращаемое значение — вещественное число. В случае сбоя возвращаетсяnil.

7.7.8. Функция vlax-curve-getParamAtPointВычисляет значение параметра в заданной точке кривой.

(vlax-curve-getParamAtPoint <кривая> <точка>)

Аргументы: <кривая> — VLA-объект; <точка> — список из трех веществен-ных чисел с координатами точки в МСК.

Возвращаемое значение — вещественное число. В случае ошибки возвраща-ется nil.

Page 405: Visual LISP и секреты адаптации AutoCAD

404 Visual LISP и секреты адаптации AutoCAD

7.7.9. Функция vlax-curve-getPointAtParamВычисляет точку, лежащую на кривой и имеющую заданное значение пара-метра.

(vlax-curve-getPointAtParam <кривая> <параметр>)

Аргументы: <кривая> — VLA-объект; <параметр> — вещественное число(значение параметра).

Возвращаемое значение — список из трех вещественных чисел с координа-тами точки (в МСК). В случае ошибки возвращается nil.

7.7.10. Функция vlax-curve-getParamAtDistВычисляет значение параметра для точки, лежащей на кривой и отстоящейпо длине этой кривой от начальной точки на заданное расстояние.

(vlax-curve-getParamAtDist <кривая> <расстояние>)

Аргументы: <кривая> — VLA-объект; <расстояние> — вещественное число.

Возвращаемое значение — вещественное число. В случае ошибки возвраща-ется nil.

7.7.11. Функция vlax-curve-getDistAtParamВычисляет длину сегмента кривой от начальной точки до точки с заданнымзначением параметра.

(vlax-curve-getDistAtParam <кривая> <параметр>)

Аргументы: <кривая> — VLA-объект; <параметр> — вещественное число.

Возвращаемое значение — вещественное число. В случае ошибки возвраща-ется nil.

7.7.12. Функция vlax-curve-isClosedПроверяет, является ли кривая замкнутой (т. е. совпадает ли конечная точкас начальной).

(vlax-curve-isClosed <кривая>)

Аргумент <кривая> — VLA-объект.

Возвращаемое значение — т (да) или nil (нет).

7.7.13. Функция vlax-curve-isPehodicПроверяет, является ли кривая периодической, т. е. параметр ее уравненияимеет бесконечный диапазон значений в обе стороны и точки на кривой,

Page 406: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 405

отличающиеся значениями параметра на некоторую величину dT (период),совпадают.

(vlax-curve-isPeriodic <кривая>)

Аргумент <кривая> — VLA-объект.

Возвращаемое значение — т (да) или nil (нет).

7.7.14. Функция vlax-curve-isPlanarПроверяет, что кривая целиком лежит в некоторой плоскости.

(vlax-curve-isPlanar <кривая>)

Аргумент <кризая> — VLA-объект.

Возвращаемое значение — т (да) или nil (нет).

7.7.15. Функция vlax-curve-getClosestPointTo

Вычисляет точку (в МСК), которая лежит на кривой и является ближайшейк заданной точке.

(vlax-curve-getClosestPointTo <кривая> <тсчка> [<продолжение>])

Аргументы: <кривая> — VLA-объект; <точка> — список из трех веществен-ных чисел с координатами точки в МСК; <продолжение> — признак (еслизадан и не nil, то точка ищется на продолжении кривой).

Возвращаемое значение — список из трех вещественных чисел с координа-тами точки (в МСК), ближайшей к заданной. В случае ошибки возвращает-ся nil.

7.7.16. Функцияvlax-curve-getClosestPointToProjectionВычисляет точку (в МСК), которая лежит на кривой и при проектированиина указанную плоскость является ближайшей к заданной точке.

(vlax-curve-getClosestPointToProjection <кривая> <точка> <нормаль>[<продолжение>])

Аргументы: <кривая> — VLA-объект; <точка> — список из трех веществен-ных чисел с координатами точки в МСК (через эту точку строится плос-кость, на которую будет выполняться проектирование); <нормаль> — списокиз трех вещественных чисел с координатами точки (в МСК), определяющи-ми положение нормали к плоскости проекции; <продолжение> — признак(если задан и не nil, то точка ищется на продолжении кривой).

Page 407: Visual LISP и секреты адаптации AutoCAD

406 Visual LISP и секреты адаптации AutoCAD

Возвращаемое значение — список из трех вещественных чисел с координа-тами точки (в МСК), ближайшей к заданной точке при проектировании наплоскость. В случае ошибки возвращается nil.

7.7.17. Функция vlax-curve-getFirstDerivВычисляет первую производную (в МСК) к кривой в заданной точке.

(vlax-curve-getFirstDeriv <кривая> <параметр>)

Аргументы: <кривая> — VLA-объект, соответствующий кривой; <параметр> —значение параметра, определяющее положение точки на кривой.

Возвращаемое значение — список из трех вещественных чисел (координатывектора первой производной). В случае ошибки возвращается nil.

7.7.18. Функция vlax-curve-getSecondDerivВычисляет первую производную (в МСК) к кривой в заданной точке.

(vlax-curve-getSecondDeriv <кривая> <параметр>)

Аргументы: <кривая> — VLA-объект, соответствующий кривой; <параметр> —значение параметра, определяющее положение точки на кривой.

Возвращаемое значение — список из трех вещественных чисел (координатывектора второй производной). В случае ошибки возвращается nil.

7.8. РеакторыПомимо объектов, свойств и методов, объектная модель оперирует еще исобытиями. События — это любые действия пользователя с объектами сис-темы (графическими примитивами, падающими меню, панелями инстру-ментов и т. д.).

Технология ActiveX позволяет создавать особые объекты, называемые реак-торами, которые дают возможность спроектировать реакцию системы напроисходящие события. Реакторы еще называются VLR-объектами.

7.8.1. Классификация реакторовКаждый реактор знает имена своих событий и действия, которые он долженвыполнить. Действия (реакции) являются ничем иным, как функциями наязыке AutoLISP (примерно такими же, какие программировались с помощьюфункции action t i l e в диалоговых окнах).

Функции, имеющие префикс vir-, работают с реакторами: создают реакто-ры, активизируют, отключают и т. п. Для того чтобы эти функции были

Page 408: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 407

доступны, следует выполнить функцию vi-ioad-com, которая загружает рас-ширение языка AutoLISP. Для совместимости с предыдущими версиямиМОЖНО вместо имени vl-load-com ИСПОЛЬЗОВать ИМЯ vl- load-reactors .

Основные типы реакторов и переменные, зарезервированные для их обозна-чения, приведены в табл. 7.4.

Таблица 7.4. Основные типы реакторов

Обозначение Описание

:VLR-AcDb-Reactor

:VLR-DocManager-Reactor

:VLR-Linker-Reactor

:VLR-Object-Reactor

:VLR-Editor-Reactor

Реакторы базы

Реакторы документа

Реакторы связи

Реакторы объекта

Реакторы редактирования (сохранены только для со-вместимости с предыдущими версиями)

Реакторы базы отслеживают события изменения базы объектов рисунка. Ре-акторы документа учитывают действия, связанные с документами (откры-тие, активизация, блокирование и т. п.). Реакторы связи предназначены дляопераций загрузки и выгрузки ARX-приложений. Реакторы объектов следятза состоянием конкретных объектов рисунка.

Реакторы редактирования сохранены в системе AutoCAD 2000 только длясовместимости с предыдущими версиями. Они могут быть заменены реакто-рами, типы которых перечислены в табл. 7.5.

Таблица 7.5. Основные типы реакторов редактирования

Обозначение Описание

:VLR-Command-Reactor

:VLR-DeepClone-Reactor

:VLR-DWG-Reactor

:VLR-DXF-Reactor

:VLR-Insert-Reactor

:VLR-Lisp-Reactor

:VLR-Miscellaneous-Reactor

:VLR-Mouse-Reactor

Реакторы команд

Реакторы клонирования

DWG-реакторы

DXF-реакторы

Реакторы команды ВСТАВИТЬ (INSERT)

Реакторы LISP-событай

Реакторы других событий редактирования

Реакторы действий мышью

Page 409: Visual LISP и секреты адаптации AutoCAD

408 Visual LISP и секреты адаптации AutoCAD

Таблица 7.5 (окончание)

Обозначение Описание

:VLR-SysVar-Reactor Реакторы изменения системных переменных

:VLR~Toolbar-Reactor Реакторы изменения размера кнопок панелей ин-

струментов

:VLR-Undo-Reactor Реакторы команды ОТМЕНИТЬ (UNDO)

:VLR-wbiock-Recator Реакторы команды ПБЛОК (WBLOCK)

:VLR-window-Reactor Реакторы изменения формы и размеров окна сис-темы AutoCAD

:VLR-XREF-Reactor Реакторы событий вставки и редактированиявнешних ссылок

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

7.8.2. Функция vIMypesВыводит список всех типов реакторов.

(vlr-types)

Возвращаемое значение — список с зарезервированными символами, обо-значающими типы реакторов (символы приведены в табл. 7.4 и 7.5).

7.8.3. Функция vlr-reactorsВыводит список всех реакторов или реакторов заданного типа.

(vlr-reactors [<тип1> [<тип2> ... [<типЫ>]...]])

Аргументы — символы из табл. 7.4 и 7.5 с зарезервированными именамитипов реакторов. Если аргументы опущены, то выводится список реактороввсех типов.

Возвращаемое значение — список, элементами которого являются списки.Внутренние списки имеют следующий вид: (<тип> <реактор> <реактор> . . .),например:

(:VLR-Object-Reactor #<VLR-Object-Reactor> #<VLR-Object-Reactor>)

Первый элемент этого списка — зарезервированный символ, остальные —VLR-объекты (указатели). Из списка можно извлечь нужные реакторы(VLR-объекты).

Если реакторов нужного типа в рисунке нет, то возвращается nil.

Page 410: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 409

7.8.4. Функция vlr-typeВычисляет тип реактора.

{vlr-type <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращаемое значение — зарезервированный символ с обозначением типареактора.

7.8.5. Действия реакторовКаждый реактор отвечает только на те события (callback events), на которыеон спроектирован. Перечень событий, требующих реакции, зависит от типареактора И МОЖеТ быть Получен С ПОМОЩЬЮ фунКЦИИ vlr-reaction-names(см. разд. 7.8.6).

Функции действия (callback function) реакторов создаются как обычныефункции (с помощью функции defun), но с некоторыми ограничениями:

• Нельзя Применять фуНКЦИЮ command;

• при работе с объектами рисунка следует использовать не функции entmodи entget, а соответствующие им функции ActiveX.

Функции действия должны иметь два аргумента (исключение для реакторовобъектов):

• VLR-объект (указатель на реактор, который' вызвал функцию действия);

• список параметров, формируемый системой AutoCAD.

Функции действия реакторов объектов должны иметь три аргумента. Пер-вым идет VLA-объект (владелец), а затем VLR-объект и список параметров.

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

Функция действия должна быть вместе с именем события при создании ре-актора включена в точечную пару (см. разд. 7.8.9).

В данной версии системы AutoCAD предусмотрены две функции (vir-beep-reaction И vl::-trace-reaction), которые могут быть ИСПОЛЬЗОВаны В качест-ве функций действия при написании и отладке реакторов.

7.8.6. Функция vlr-reaction-namesВыводит список событий, отслеживаемых реакторами данного типа.(vlr-reaction-names <тип>)

Аргумент <тил> — символ из числа зарезервированных для обозначения ти-пов реакторов (см. табл. 7.4 и 7.5).

Page 411: Visual LISP и секреты адаптации AutoCAD

410 Visual LISP и секреты адаптации AutoCAD

Возвращаемое значение — список с символами, зарезервированными длясобытий.

Пример:

° ( v l r - r e a c t i o n :VLR-Undo-Reactor) возвращает(:VLR-undoSubcommandAuto :VLR-undoSubcommandControl

:VLR-undoSubcommandBegin :VLR-undoSubcoiranandEnd:VLR-undoSubcommandMark :VLR-undoSubcommandBack:VLR-undoSubcommandNumber)

7.8.7. Функция vlr-beep-reactionВыдает звуковой сигнал.

(vlr-beep-reaction [<аргументы>])

Может использоваться как функция действия при отладке реакторов. Коли-чество передаваемых ей аргументов может быть любым (их тип зависит отреактора).

Возвращаемое значение — nil.

7.8.8. Функция vlr-trace-reactionВыводит значения аргументов, переданных реактору, в окно Трассировка(Trace) среды Visual LISP.

(vlr-trace-reaction [<аргументы>])

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

Возвращаемое значение — nil.

См. пример функции vir-reaction-set (разд. 7.8.29).

7.8.9. Создание реакторовДля того чтобы создать реактор (VLR-объект), необходимо связать событиес некоторыми данными и прикладной функцией, которая будет выполнять-ся с этими данными при наступлении указанного события (этот принцип нераспространяется только на реакторы типа :VLR-object-Reactor, т. е. реакто-ры объектов). Создание реактора нужного типа выполняется с помощьюфункции, которая имеет имя, совпадающее с обозначением типа реактора,приведенным в табл. 7.4 или 7.5, например: реактор типа :VLR-Linker-Reactor (реактор ARX-приложений) создается функцией vir-iinker-reactor.Функции создания реакторов всех типов рассмотрены ниже.

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

Page 412: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 411

Иначе организованы реакторы объектов. Реактор объектов связывается впервую очередь с VLA-объектами рисунка, которые называются владельцами(owners) этого реактора. Он соединяет объекты и события с данными и при-кладной функцией. Реакторы объектов создаются функцией vir-object-reactor.

Для замены компонент реактора может применяться функция vir-reaction-set (см. ниже).

7.8.10. Функция vlr-acdb-reactorСоздает реактор типа :VLR-AcDb-Reactor (событий изменения базы рисун-ка — добавления, модификации и удаления примитивов).

(vlr-acdb-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа (число, список, строка ит. д.), применяемого в AutoLISP (nil, если данных нет); <реакции> — списокиз точечных пар с именами событий и функций действия.

Возвращаемое значение — VLR-объект (реактор).

Точечные пары в аргументе <реакции> состоят из двух символов и имеют вид:

(<событие> . <функция>)

Пример:D (:vlr-objectAppended . myrfun)

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

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

Таблица 7.6. События, используемые реакторами типа :VLR-AcDb-Reactor

Обозначение Описание

:vir-objectAppended Примитив добавлен

:vlr-objectunAppended Примитив стерт (например, с помощью командыОТМЕНИТЬ (UNDO))

:vlr-objectReAppended Примитив восстановлен (например, с помощьюкоманды ПОВТОРИТЬ (REDO))

:vir-objectOpenedForModify Примитив будет модифицироваться

Page 413: Visual LISP и секреты адаптации AutoCAD

412 Visual LISP и секреты адаптации AutoCAD

Таблица 7.6 (окончание)

Обозначение Описание

:vir-objectModified Примитив изменен

:vir-objectErased Примитив помечен как удаленный

:vir-objectunErased у примитива снята пометка удаления

7.8.11. Функция vlr-docmanager-reactorСоздает реактор типа :VLR-DocManager-Reactor (событий изменения ри-сунка, как документа).

(vlr-docmanager-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.7.

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

Возвращаемое значение — VLR-объект (реактор).

Таблица 7.7. События, используемые реакторамиТИПа :VLR-DocManager~Reactor

Обозначение Описание

:vlr-documentcreated Создан новый документ (открыт новыйрисунок или существующий)

: vi r-documentToBeDest royed Документ будет уничтожен

: vir-documentLockModeWiilcharige Команда должна начать или закончитьмодификацию элементов документа,собирается блокировать документ илиснять блокировку

:vlr-documentLockModeChangeVetoed Реактор наложил вето на себяиз функции действия события:vlr-documentLockModeChanged

:vir-documentLockModeChanged Устанавливается блокировка документаили снимается

:vir-documentBecameCurrent Документ изменен (не означает, что доку-мент стал активным)

Page 414: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

Обозначение Описание

413

Таблица 7.7 (окончание)

:vlr-documentToBeActivated

:vlr-documentToBeDeactivated

Документ, который был неактивным, акти-визирован

Активизирован другой документ (можетбыть, даже вне AutoCAD)

В табл. 7.8 описаны аргументы, которые передаются функции действия ре-актора документов для разных событий в списке параметров, формируемомсистемой AutoCAD.

Таблица 7.8. Параметры, передаваемые в списке функции действияреактора типа :VLR-DocManager-Reactor

СобытияКол-вопара-метров

Параметры

vlr-documentCreated, 1vlr-documentToBeDestroyed,vlr-documentBecameCurrent,vlr-documentToBeActivated,vlr-documentToBeDeactivated

vlr-documentLockModeCbangeVetoed 2

:vlr-documentLockModeWillChange,:vlr-documentLockModeChanged

VLA-объект (документ)

1 — VLA-объект документа; 2 —командная строка, передаваемаяпри запросе на блокировку (еслипроизводится запрос на разбло-кировку, то строка начинаетсяс символа #)

1 — VLA-объект документа;2 — целое число, указывающеекод текущего состояния блоки-ровки; 3 — целое число, указы-вающее код состояния блокиров-ки после события; 4 — наивысшийкод блокировки других происхо-дящих событий; 5 — команднаястрока, передаваемая при запро-се на блокировку (если произво-дится запрос на разблокировку,то строка начинается с символа#). Код состояния блокировкиможет принимать следующиезначения: 1 — автоматическаязапись; 2 — нет блокировки;

4 — разделенная запись; 8 — чте-ние; 10 — исключительная запись

Page 415: Visual LISP и секреты адаптации AutoCAD

414 Visual LISP и секреты адаптации AutoCAD

7.8.12. Функция vlr-Hnker-reactorСоздает реактор типа :VLR-Linker-Reactor (событий загрузки и выгрузкиARX-приложений).

(vlr-linker-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.9.В списке параметров, формируемом системой AutoCAD и передаваемомфункции действия реакторов рассматриваемого типа, должен быть толькоодин аргумент — строка с именем приложения.

Возвращаемое значение — VLR-объект (реактор).

Таблица 7.9. Событий, используемые реакторами

ТИПа :VLR-L±nker-Reactor

Обозначение Описание:vir-rxAppLoaded Загружено новое приложение ObjectARX, которое за-

кончило инициализацию

:vir-rxAppUnLoaded Динамический загрузчик выгрузил ARX-приложение, ипамять освобождена

7.8.13. Функция vlr-object-reactorСоздает реактор типа :VLR-object-Reactor (реактор объектов). Реактор до-бавляется к рисунку, но не становится постоянным.

(vlr-object-reactor <владельцы> <данные> <реакции>)

Аргументы: <владелылы> — список VLA-объектов, за которыми наблюдаетреактор; <данные> — значение любого типа, применяемого в AutoLISP (nil,если данных нет); <реакции> — список из точечных пар с именами событийи функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.10.

Возвращаемое значение — VLR-объект (реактор), вызвавший функцию дей-ствия.

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

Page 416: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

Обозначение

Таблица

Описание

7.10.События,

415

используемые реакторамиТИПа :VLR-Object-Reactor

:vlr-cancelled

:vlr-copied

:vlr-erased

:vlr-unerased

:vlr-goodbye

:vlr-openedForModify

:vlr-modified

:vlr-subObjModified

:vlr-modifyUndone

:vlr-modifiedXData

:vlr-unappended

:vlr-reappended

:vlr-obj ectClosed

Модификация объекта отменена

Объект скопирован

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

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

Объект будет удален из памяти

Объект выбран для модификации

Объект изменен. Если модификация отменена,ТО ПРОИЗОЙДУТ еще СОбыТИЯ : v l r - c a n c e l l e dИ :vlr-modifyUndone

Изменен подпримитив объекта (например, вершинаполилинии или сети или атрибут вхождения блока)

Отменена модификация объекта

Изменены расширенные данные объекта

Объект отсоединен от базы рисунка

Объект снова присоединен к базе рисунка

Модификация объекта закончена

Таблица 7.11. Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-Object-Reactov

СобытияКол-вопара-метров

Параметры

:vlr-cancelled, :vlr-erased,: vlr-unerased, :vlr-goodbye,:vlr-openedForModify,: vlr-modif ied, : vlr-modif yUndone,: vlr-modif iedXData, : vlr-unappended,:vlr-reappended, :vlr-objectClosed

:vlr-copied

0

Объект, созданный командойкопирования примитивов

:vlr-subObjModified Измененный подпримитив

Page 417: Visual LISP и секреты адаптации AutoCAD

416 Visual LISP и секреты адаптации AutoCAD

Пример:D (setq myVLR (vlr-objeet-reactor (list linel) "Реактор отрезка"

1((:vir-modified . showien)))) создает реактор объекта linel (отрезка,являющегося VLA-объектом); реактор отслеживает события измененияотрезка и выполняет функцию showien (например, она выводит новуюдлину)

7.8.14. Функция vlr-editor-reactorСоздает реактор типа :VLR-Editor-Reactor (реактор редактирования). Функ-ция и данный тип реактора сохранены для совместимости с предыдущимиверсиями.

(vlr-editor-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.12.

Возвращаемое значение —- VLR-объект (реактор).

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

Таблица 7.12. События, используемые реакторами

ТИПа :VLR-Editor-Reactor

Обозначение Описание

:vlr-beginciose База рисунка будет закрыта:vlr-beginDxfin Содержимое DXF-файла будет добавлено к базе

рисунка:vlr-abortDxfin Операция импорта DXF-файла завершилась ава-

рийно

: vir-dxf incomplete Импорт DXF-файла завершен успешно

:vir-beginDxtOut Начинается экспорт рисунка в DXF-файл

:vir-abortDxfOut Операция экспорта в DXF-файл завершиласьаварийно

:vir-dxfoutcompiete Операция экспорта в DXF-файл завершена ус-пешно

:vir-databaseToBeDestroyed Содержимое базы рисунка будет удалено из па-мяти

Page 418: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

Обозначение Описание

417

Таблица 7.12 (окончание)

:vlr-unknownCommand

:vlr-commandWillStart

:vlr-commandEnded

:vlr-commandCancelled

:vlr-commandFailed

:vlr-lispWillStart

:vlr-lispEnded

:vlr-lispCancelled

:vlr-beginDwgOpen

:vlr-endDwgOpen

:vlr-dwgFileOpened

:vlr-beginSave

:vlr-saveComplete

:vlr-sysVarWillChange

:vlr-sysVarChanged

Введена команда, не известная системе AutoCAD

Вызвана команда системы AutoCAD

Команда закончена

Команда прервана

Команда не смогла завершить работу

Начинается вычисление LISP-выражения

Закончилось вычисление LISP-выражения

Вычисление LISP-выражения было прервано

Будет открыт рисунок

Операция открытия рисунка закончена

Новый рисунок загружен

Начинается операция сохранения рисунка

Завершена операция сохранения рисунка на диск

Начинается операция изменения значения сис-темной переменной

Изменено значение системной переменной

Таблица 7.13. Параметры, передаваемые в списке функции действияреактора типа :VLR-Editor-Reactor

СобытияКол-вопара-метров

Параметры

:vlr-lispEnded,:vlr-lispCancelled,:vlr-beginClose,:vlr-beginDxfIn,:vlr-abortDxfIn,:vlr-dxfIncomplete,:vlr-beginDxfOut,:vlr-abortDxfOut,:vlr-dxfOutComplete,:vlr-databaseToBeDestroyed

14 Зак 155

Page 419: Visual LISP и секреты адаптации AutoCAD

418

СобытияКол-вопара-метров

Visual LISP и секреты адаптации AutoCAD

Таблица 7.13 (окончание)

Параметры

:vlr-unknownCoinmand,

:vlr-commandWillStart,

:vlr-commandEnded,

:vlr-commandCancelled,

:vlr-comnandFailed

:vlr-lispWillStart

:vlr-beginDwgOpen,:vlr-endDwgOpen,:vlr-dwgFileOpened

:vlr-beginSave

:vir-saveComplete

:vlr-sysVarWillChange

:vlr-sysVarChanged

Строка с именем команды

Первая строка(начало LISP-выражения)

Строка с именем открываемого файла

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

Строка с именем файла, в которыйвыполнено сохранение

Строка с именем системнойпеременной

1 — строка с именем системной пере-менной, 2 — целое число с признакомзавершения операции (1 — изменениевыполнено успешно, 0 — изменениезавершилось аварийно)

7.8.15. Функция vlr-command-reactorСоздает реактор типа :VLR-command-Reactor (реактор команд).

(vlr-connnand-reactor <даныые> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.14.В списке параметров, формируемом системой AutoCAD и передаваемомфункции действия реакторов рассматриваемого типа, должен быть толькоодин аргумент — строка с именем приложения.

Возвращаемое значение — VLR-объект (реактор).

Page 420: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 419

Таблица 7.14. События, используемые реакторамитипа :VLR-Command-Reactor

Обозначение Описание

:vlr-unknownCommand

:vlr-commandWillStart

: vlr-coimandEnded

:vlr-commandCancelled

:vlr-cornmandFailed

Введена команда, не известная системе AutoCAD

Вызвана команда системы AutoCAD

Команда закончена

Команда прервана

Команда не смогла завершить работу

7.8.16. Функция vlr-deepclone-reactorСоздает реактор типа :VLR-DeepCione-Reactor (реактор событий клонирова-ния объектов, т. е. переноса в другой файл).

(vlr-deepclone-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.15.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.15. События, используемые реакторамитипа :VLR-DeepClone-Reactor

Обозначение Описание

:vlr-beginDeepClone

•:vlr-beginDeepCloneXlation

:vlr-abortDeepClone

:vlr-endDeepClone

Начало операции клонирования

Событие, происходящее между стадиями копиро-вания объектов и создания их указателей в базе

Операция клонирования прервана

Операция клонирования завершена

14*

Page 421: Visual LISP и секреты адаптации AutoCAD

420

События

Таблица

Visual LISP и секреты адаптации AutoCAD

7.16. Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-DeepClone~Reactor

Кол-вопара-метров

Параметры

:vlr-beginDeepClone,: vlr-abortDeepClone,:vlr-endDeepClone

:vlr-beginDeepCloneXlation Целое число с кодом возврата(если это число соответствует кодуошибки, то операция клонированияпрекращается)

7.8.17. Функция vlr-dwg-reactorСоздает реактор типа :VLR-DWG-Reactor (реактор событий, связанных с опе-рациями над DWG-файлами).

(vlr-dwg-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.17.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.17. События, используемые реакторами типа :VLR-DWG-Reactor

Обозначение Описание

:vlr-beginClose

:vlr-databaseConstructed

:vlr-databaseToBeDestroyed

:vlr-beginDwgOpen

:vlr-endDwgOpen

:vlr-dwgFileOpened

Файл рисунка будет закрыт

Создана база рисунка

Содержимое базы рисунка будет удалено из па-мяти

Будет открыт DWG-файл

Операция открытия DWG-файла закончена

Новый рисунок загружен в окно системы AutoCAD

Page 422: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

Обозначение

:vlr-beginSave

:vlr-saveComplete

Описание

Файл будет сохранен

Файл сохранен

421

Таблица 7.17 (окончание)

Таблица 7.18. Параметры, передаваемые в списке функции действияреактора типа -.VLR-DWG-Reactor

СобытияКол-вопара-метров

Параметры

:vlr-beginClose,: vlr-databaseConstructed,:vlr-databaseToBeDestroyed

:vlr-beginDwgOpen,

:vlr-endDwgOpen,:vlr-dwgFileOpened

:vlr-beginSave

:vlr-saveComplete

0

Строка с именем файла

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

Строка с действительным именемфайла, в который выполнено сохра-нение

7.8.18. Функция vlr-dxf-reactorСоздает реактор типа :VLR-DXF-Reactэг (реактор событий, связанных с опе-рациями над DXF-файлами).

(vlr-dxf-reactor <данные> <реакции>!

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> т- список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.19.

Возвращаемое значение — VLR-объеет (реактор).

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

Page 423: Visual LISP и секреты адаптации AutoCAD

422 Visual LISP и секреты адаптации AutoCAD

Таблица 7.19. События, используемые реакторами типа -.VLR-DXF-Reactor

Обозначение Описание

vlr-beginDxf i n Содержимое DXF-файла будет добавлено к базе рисунка

vir-abortDxf i n Операция импорта DXF-файла завершилась аварийно

v i r - d x f incomplete Импорт DXF-файла завершен успешно

vir-beginDxfOut Начинается экспорт рисунка в DXF-файл

vlr-abortDxfOut Операция экспорта в DXF-файл завершилась аварийно

v i r - d x f Outcomplete Операция экспорта в DXF-файл завершена успешно

7.8.19. Функция vlr-insert-reactorСоздает реактор типа .-VLR-insert-Reactor (реактор событий, связанных совставкой блоков).

(vlr-insert-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.20.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.20. События, используемые реакторамитипа :VLR-Insert-Reactor

Обозначение Описание

:v i r-begin insert Начало операции вставки блока

:vir-begininsertM к базе рисунка будет добавлена матрица трехмерныхпреобразований

: v i r - o t h e r i n s e r t Блок или матрица добавлены в рисунок, но указателиновых объектов вхождений блоков еще не созданы

:vir-endinsert Объекты уже добавлены к базе, но пока не могут ис-пользоваться в наборах выбора (будут доступны послесобытия :vlr-commandEnded)

.-vir-abortinsert Операция вставки блока прервана (база рисунка нахо-дится в нестабильном состоянии)

Page 424: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 423

Таблица 7.21. Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-Insert-Reactor

СобытияКол-вопара-метров

Параметры

:vlr-beginlnsert

:vlr-beginlnsertM

:vlr-otherlnsert

:vlr-endlnsert,:vlr-abortInsert

1 — VLA-объект (указатель базы, в которуювставляется блок); 2 — строка с именем блока;3 — VLA-объект (указатель на базу, из которойвставляется блок)

1 — VLA-объект (указатель базы, в которуювставляется матрица преобразования); 2 —матрица; 3 — VLA-объект (указатель базы, изкоторой вставляется матрица)

1 — VLA-объект (указатель базы, в которуювставляется блок); 2 — VLA-объект (указательна базу, из которой вставляется блок)

VLA-объект (указатель базы, в которую встав-ляется блок)

7.8.20. Функция vlr-lisp-reactorСоздает реактор типа :VLR-Lisp-Reactor (реактор событий, связанных с вво-дом и вычислением LISP-выражений).

(vlr-lisp-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.22.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.22. События, используемые реакторами типа -. VLR-Lisp-Reactor

Обозначение Описание

•:vlr-lispWillStart

:vlr-lispEnded

:vlr-lispCancelled

Начинается ввод LlSP-выражения

Ввод и вычисление LlSP-выражения закончено

Ввод LlSP-выражения прерван

Page 425: Visual LISP и секреты адаптации AutoCAD

424 Visual LISP и секреты адаптации AutoCAD

Таблица 7.23. Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-Lisp-Reactor

События Кол-во Параметрыпараметров

:vlr-lispEnded, 0 —:vlr-lispCancelled

:vir-lispwiiistart 1 Первая строка LISP-выражения

7.8.21. Функция vlr-miscellaneous-reactorСоздает реактор типа :VLR-Misceiianeous-Reactor (реактор прочих событий,работу которого не прерывают другие реакторы редактирования).

(vlr-miscellaneous-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.24.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.24. События, используемые реакторами

Типа :VLR-Miscellaneous-Reactor

Обозначение Описание

:vlr-pickfirstModified Набор предварительного выбора изменен

: vlr-layoutswitched Выполнен переход на вкладку другого листа

Таблица 7.25. Параметры, передаваемые в списке функции действияреактора типа :VLR-Miscellaneous-Reactor

События Кол-во Параметрыпараметров

:vlr-pickfirstModified 0 —

:vlr-layoutswitched 1 Строка с именем вкладки листа

Page 426: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 425

7.8.22. Функция vlr-mouse-reactorСоздает реактор типа :VLR-Mouse-Reactor (реактор событий, связанных смышью).(vlr-mouse-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакиии> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.26.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.26. События, используемые реакторами

типа :VLR-Mouse-Reactor

Обозначение Описание:vlr-beginDoubleClick Выполнен двойной щелчок

:v l r-beginRightci ick Выполнен щелчок правой кнопкой

7.8.23. Функция vlr-sysvar-reactorСоздает реактор типа :VLR-SysVar-Reactor (реактор событий, связанных сизменением значения системной переменной).(vlr-sysvar-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.27.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.27. События, используемые реакторамиТИПа -.VLR-SysVar-Reactor

Обозначение Описание

-.vlr-sysVarWillchange Началась операция изменения значения системной пе-ременной

Page 427: Visual LISP и секреты адаптации AutoCAD

426

Обозначение

:vlr-sysVarChanged

Visual LISP и секреты адаптации AutoCAD

Таблица 7.27 (окончание)

Описание

Значение системной переменной изменено

Таблица 7.28. Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-SysVar~Reactor

СобытияКол-вопара-метров

Параметры

:vlr-sysVarWillChange 1

:vlr-sysVarChanged 2

Строка с именем системной переменной

1 — строка с именем системной переменной;2 — признак завершения операции изменениясистемной переменной (т при успешном за-вершении, n i l — при неуспешном)

7.8.24. Функция vir-toolbar-reactorСоздает реактор типа :VLR-Tooibar-Reactor (реактор событий, связанныхс изменением размера кнопок панелей инструментов).

(vir-toolbar-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.29.

Возвращаемое значение — VLR-объект (реактор).

Таблица 7.29. События, используемые реакторамиТИПа :VLR-Toolbar-Reactor

Обозначение Описание

:vlr-toolbarBitmapSizeWillChange

:vlr-toolbarBitmapSizeChanged

Размер кнопки панели будет изменен

Размер кнопки изменен

Функции действия в качестве списка параметров, формируемого системойAutoCAD, будет передаваться список из одного значения: т, если выбранбольшой размер кнопок, и ni l — если выбран маленький размер.

Page 428: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 427

7.8.25. Функция vlr-undo-reactorСоздает реактор типа :VLR-undo-Reactor (реактор событий, связанных скомандой ОТМЕНИТЬ (UNDO)).

(vlr-undo-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.30.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.30. События, используемые реакторамиТипа :VLR-Undo-Reactor

Обозначение Описание

:vlr-undoSubcommandAuto

:vlr-undoSubcommandControl

:vlr-undoSubcommandBegin

:vlr-undoSubcommandEnd

:vlr-undoSubcommandMark

:vlr-undoSubcommandBack

:vlr-undoSubcommandNumber

Команда ОТМЕНИТЬ (UNDO) выполняется с опци-ей Авто (Auto)

Команда ОТМЕНИТЬ (UNDO) выполняется с опци-ей Управление (Control)

Команда ОТМЕНИТЬ (UNDO) выполняется с оп-циями Начало (Begin) или Группа (Group)(установка начального маркера команд, которыемогут быть отменены как единое целое)

Команда ОТМЕНИТЬ (UNDO) выполняется с опци-ей Конец (End) (установка конечного маркера ко-манд, которые могут быть отменены как единоецелое)

Команда ОТМЕНИТЬ (UNDO) выполняется с опци-ей Метка (Mark) (установка маркера для отменыкоманд с помощью опции Назад (Back) командыОТМЕНИТЬ (UNDO))

Команда ОТМЕНИТЬ (UNDO) выполняется с опци-ей Назад (Back) (отменяет все последние командывплоть до маркера, установленного опцией Метка(Mark))

Команда ОТМЕНИТЬ (UNDO) выполняется с опци-ей, задающей количество отменяемых команд

Page 429: Visual LISP и секреты адаптации AutoCAD

428

События

Таблица 7.31.

Visual LISP и секреты адаптации AutoCAD

Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-Undo-Reactor

Кол-вопара-метров

Параметры

:vlr-undoSubcommandAuto

:vlr-undoSubcommandControl

: vlr-undoSubcommndBegin,:vlr-undoSubcommandEnd,:vlr-undoSubcommandMark,:vlr-undoSubcommandBack

: vlr-undoSubcommandNuinber

1 — целое число с кодом активности(всегда 4, т. к. данное событие про-исходит по окончании операции); 2 —символ, указывающий состояние ре-жима Авто (Auto) (т — режим вклю-чен, n i l — выключен)

1 — целое число с кодом активности(всегда 4, т. к. данное событие про-исходит по окончании операции); 2 —целое число, указывающее состоя-ние режима Управление (Control)(О — выбрана опция Ничего (None),1 — выбрана опция Одну (One), 2 —выбрана опция Все (АН))

О (код активности — событие проис-ходит до выполнения действий коман-ды ОТМЕНИТЬ (UNDO))

1 — всегда 0 (код активности); 2 —целое число, указывающее коли-чество отмененных команд

7.8.26. Функция vlr-wblock-reactorСоздает реактор типа :VLR-wbiock-Reactor (реактор событий, связанных скомандой ПБЛОК (WBLOCK)).

(vlr-wblock-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.32.

Возвращаемое значение — VLR-объект (реактор).

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

Page 430: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

Обозначение

Таблица

Описание

7.32. События,

429

используемые реакторамиТипа :VLR-Wblock-Reactor

:vlr-wblockNotice

:vlr-beginWblockPt

:vlr-beginWblockId

:vlr-beginWblock

:vlr-otherWblock

:vlr-abortWblock

:vlr-endWblock

:vlr-beginWblockObjects

Начинается команда ПБЛОК (WBLOCK)

Операция выполняется с набором объектов

Операция выполняется с блоком

Операция выполняется со всем рисунком (событиезавершается, только когда все объекты пространствамодели исходного рисунка будут скопированы в но-вый файл)

Операция выполняется с базой рисунка (объекты ско-пированы, но их метки еще не пересчитаны). В этотмомент можно клонировать дополнительные объекты(такие, как словари и элементы словарей) — иначеони не будут скопированы — аналогично событиюbeginDeepCloneXlation

Операция была прервана до полного завершения

Операция завершена успешно

Началась операция пересчета меток объектов

Таблица 7.33. Параметры, передаваемые в списке функции действияреактора Типа :VLR-Wblock-Reactor

СобытияКол-вопара-метров

Параметры

:vlr-wblockNotice

:vlr-beginWblockPt

:vlr-beginWblockld

:vlr-beginWblock:,vlr-otherWblock

1 VLA-объект, содержащий копируемые объек-ты

3 1 — VLA-объект базы рисунка, в который вы-полняется копирование; 2 — VLA-объект скопируемыми объектами; 3 — трехмернаяточка, используемая в новом рисунке какбаза копирования

3 1 — VLA-объект базы рисунка, в который вы-полняется копирование; 2 — VLA-объект скопируемыми объектами; 3 — указатель вхо-да в таблицу блоков для копируемого блока

2 1 — VLA-объект базы рисунка, в который вы-полняется копирование; 2 — VLA-объект скопируемыми объектами

Page 431: Visual LISP и секреты адаптации AutoCAD

430

СобытияКол-вопара-метров

Visual LISP и секреты адаптации AutoCAD

Таблица 7.33 (окончание)

Параметры

:vlr-abortWblock, 1:vlr-endWblock

:vlr-beginWblockObjects 2

VLA-объект базы рисунка, в который вы-полняется копирование

1 — VLA-объект базы рисунка, в который вы-полняется копирование; 2 — таблица меток

7.8.27. Функция vlr-window-reactorСоздает реактор типа :VLR-window-Reactor (реактор событий, связанных сизменениями окна, в котором работает система AutoCAD).

(vlr-window-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.34.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.34. События, используемые реакторамитипа :VLR-Window-Reactor

Обозначение Описание

:vlr-docFrameMovedOrResized

:vlr-mainFrameMovedOrRes i zed

Изменено окно с неактивным документом

Изменено окно с активным документом

Таблица 7.35. Параметры, передаваемые в списке функции действияреактора ТИПа :VLR-Window-Reactor

События Кол-вопараметров

Параметры

:vlr-docFrameMovedOrResized,:vlr-mainFrameMovedOrResized

1 — целое число с координата-ми окна; 2 — символ (т — еслиокно было перемещено, n i l —если изменились размеры окна)

Page 432: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 431

7.8.28. Функция vlr-xref-reactorСоздает реактор типа :VLR-XREF-Reactor (реактор событий, связанных с опе-рациями над внешними ссылками).

(vlr-xref-reactor <данные> <реакции>)

Аргументы: <данные> — значение любого типа, применяемого в AutoLISP(nil, если данных нет); <реакции> — список из точечных пар с именами со-бытий и функций действия.

Имена событий для реакторов этого типа должны выбираться из табл. 7.36.

Возвращаемое значение — VLR-объект (реактор).

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

Таблица 7.36. События, используемые реакторамиТИПа :VLR-XREF-Reactor

Обозначение Описание

:vlr-beginAttach

:vlr-otherAttach

:vlr-abortAttach

:vlr-endAttach

:vlr-redirected

:vlr-comandeered

:vlr-beginRestore

:vlr-abortRestore

:vlr-endRestore

Начало операции вставки внешней ссылки

Объекты внешней ссылки уже добавлены, аметки объектов еще не сформированы.Данное событие следует сразу за событиемbeginDeepCloneXlation

Операция вставки внешней ссылки прервана

Операция вставки внешней ссылки успешнозавершена

Указатель объекта из внешней ссылки ме-няется на указатель объекта в файле, накоторый сделана ссылка

Указатель объекта добавлен к таблице сим-волов рисунка, на который сделана ссылка

Существующая внешняя ссылка будет раз-решаться (при загрузке рисунка с внешни-ми ссылками)

Операция выгрузки или обновления внеш-ней ссылки прервана до ее полного завер-шения

Существующая внешняя ссылка была раз-решена (например, когда рисунок загрузил-ся полностью)

Page 433: Visual LISP и секреты адаптации AutoCAD

432

Обозначение

Visual LISP и

Описание

секреты адаптации AutoCAD

Таблица 7.36 (окончание)

: vlr-xref SubcornmandBindltem

:vlr-xrefSubcommandAttachltem

:vlr-xrefSubcommandOverlayltem

:vlr-xrefSubcommandDetachltem

:vlr-xrefSubcommandPathltem

:vlr-xrefSubcommandReloadltem

:vlr-xrefSubcommandUnloadltem

Активизирована опция Внедрить (Bind) коман-ды ССЫЛКА (XREF) или внедряется ранеесуществовавшая внешняя ссылка. Эта оп-ция работает в интерактивном режиме ивызывает несколько событий

Активизирована опция Вставить (Attach)команды ССЫЛКА (XREF) или разрешаетсяранее существовавшая внешняя ссылка.Эта опция работает в интерактивном режи-ме и вызывает несколько событий

Активизирована опция Наложить (Overlay)команды ССЫЛКА (XREF) или разрешаетсяранее существовавшая внешняя ссылка.Эта опция работает в интерактивном режи-ме и вызывает несколько событий

Активизирована опция Удалить (Detach)команды ССЫЛКА (XREF). Эта опция рабо-тает в интерактивном режиме и вызываетнесколько событий

Активизирована опция Путь (Path) командыССЫЛКА (XREF). Эта опция работает в ин-терактивном режиме и вызывает несколькособытий

Активизирована опция Обновить (Reload)команды ССЫЛКА (XREF) или обновляетсяранее существовавшая внешняя ссылка.Эта опция работает в интерактивном режи-ме и вызывает несколько событий

Активизирована опция Выгрузить (Unload)команды ССЫЛКА (XREF) или выгружаетсяранее существовавшая внешняя ссылка

Таблица 7.37. Параметры, передаваемые в списке функции действияреактора ТИПа : VLR-XREF-Reactor

СобытияКол-вопара-метров

Параметры

:vlr-beginAttach 1 — VLA-объект (указатель на базурисунка, в который вставляетсяссылка); 2 — строка с именем фай-ла внешней ссылки; 3 — VLA-объект(указатель на базу того рисунка,который вставляется как ссылка)

Page 434: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

СобытияКол-вопара-метров

Таблица

Параметры

433

7.37 (продолжение)

:vlr-otherAttach

:vlr-abortAttach

:vlr-endAttach

:vlr-redirected

:vlr-comandeered

:vlr-beginRestore

:vlr-abortRestore,:vlr-endRestore

:vlr-xrefSubcommandBindltem

1 — VLA-объект (указатель на базурисунка, в который вставляетсяссылка); 2 — VLA-объект (указательна базу того рисунка, которыйвставляется как ссылка)

VLA-объект (указатель на базу тогорисунка, который вставляется какссылка)

VLA-объект (указатель на базу ри-сунка, в который вставляется ссыл-ка)

1 — целое число с меткой объектадля перенаправления записи изтаблицы символов из файла ссыл-ки; 2 — целое число с меткой объ-екта в основном рисунке

1 — VLA-объект (указатель на базурисунка, в который вставляетсяссылка); 2 — целое число с при-сваиваемой меткой объекта; 3 —VLA-объект (указатель на базу ри-сунка, который вставляется каквнешняя ссылка)

1 — VLA-объект (указатель на базурисунка, в который вставляетсяссылка); 2 — строка с именемзаписи в таблице блоков и ссылок;3 — VLA-объект (указатель на базурисунка, который вставляется каквнешняя ссылка)

VLA-объект (указатель на базу ри-сунка, в который вставляется ссылка)

1 — целое число, как показательхода выполнения подкоманды (оп-ции) Внедрить (Bind) (0 — вызванаподкоманда Внедрить (Bind); 2 —ссылка с данной меткой внедряет-ся; 3 — ссылка с данной меткойвнедрена; 4— подкоманда Внед-рить (Bind) завершена; 5 — под-команда Внедрить (Bind) будет

Page 435: Visual LISP и секреты адаптации AutoCAD

434 Visual LISP и секреты адаптации AutoCAD

Таблица 7.37 (продолжение)

СобытияКол-вопара-метров

Параметры

(прод.)

: vlr-xrefSubcontmandAttachltem

:vlr-xrefSubcommandOverlayItem 2

:vlr-xrefSubcommandDetachltem

прервана; 6 — подкоманда Вне-дрить (Bind) завершена аварийно;7 — передается для блока XDep вкоманде ВНЕДРИТЬ (XBIND); 8-передается для всех других симво-лов: слоев, типов линий, текстовыхстилей, размерных стилей);2 — целое число с меткой объектавнешней ссылки или О

1 — целое число, как показательхода выполнения подкоманды(опции) Вставить (Attach) (0 — вы-звана подкоманда Внедрить(Bind); 2 — ссылка с данной меткойвнедряется; 3 — ссылка с даннойметкой внедрена; 4 — подкомандаВнедрить (Bind) завершена; 5 —подкоманда Внедрить (Bind) будетпрервана; 6 — подкоманда Вне-дрить (Bind) завершена аварийно);

2 — строка с именем вставляемогофайла или n i l

1 — целое число, как показательхода выполнения подкоманды (оп-ции) Наложить (Overlay) (0 — вы-звана подкоманда Внедрить (Bind);2 — ссылка с данной меткой вне-дряется; 3 — ссылка с данной мет-кой внедрена; 4 — подкомандаВнедрить (Bind) завершена; 5 —подкоманда Внедрить (Bind) будетпрервана; 6 — подкоманда Вне-дрить (Bind) завершена аварийно);2 — строка с именем вставляемогофайла или n i l

1 — целое число, как показательхода выполнения подкоманды (оп-ции) Удалить (Detach) (0 — вызванаподкоманда Внедрить (Bind); 2 —ссылка с данной меткой внедряет-ся; 3 — ссылка с данной меткой

Page 436: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX

СобытияКол-вопара-метров

435

Таблица 7.37 (продолжение)

Параметры

(прод.)

:vlr-xrefSubcoim\andPathItem

:vlr-xrefSubcommandReloadItem

:vlr-xrefSubcommandUnloadltem

внедрена; 4 — подкоманда Внед-рить (Bind) завершена; 5 — под-команда Внедрить (Bind) будетпрервана; 6— подкоманда Вне-дрить (Bind) завершена аварийно);2 — целое число с меткой объектавнешней ссылки или О

1 — целое число, как показательхода выполнения подкоманды (оп-ции) Путь (Path) (0 — вызвана под-команда Внедрить (Bind); 2 —ссылка с данной меткой внедряет-ся; 3 — ссылка с данной меткойвнедрена; 4 — подкоманда Внед-рить (Bind) завершена; 5 — под-команда Внедрить (Bind) будетпрервана; 6 — подкоманда Вне-дрить (Bind) завершена аварийно);2 — целое число с меткой объектавнешней ссылки или 0;3 — строка с новым путем внешнейссылки или n i l

1 — целое число, как показательхода выполнения подкоманды(опции) Обновить (Reload) (0 — вы-звана подкоманда Внедрить (Bind);2 — ссылка с данной меткой вне-дряется; 3 — ссылка с данной мет-кой внедрена; 4— подкомандаВнедрить (Bind) завершена; 5 —подкоманда Внедрить (Bind) будетпрервана; 6 — подкоманда Вне-дрить (Bind) завершена аварийно);2 — целое число с меткой объектавнешней ссылки или 0

1 — целое число, как показательхода выполнения подкоманды (оп-ции) Выгрузить (Unload) (0 — вы-звана подкоманда Внедрить (Bind);2 — ссылка с данной меткой вне-дряется; 3 — ссылка с данной мет-кой внедрена; 4 — подкоманда

Page 437: Visual LISP и секреты адаптации AutoCAD

436 Visual LISP и секреты адаптации AutoCAD

Таблица 7.37 (окончание)

Кол-воСобытия пара- Параметры

метров

(прод.) Внедрить (Bind) завершена; 5 —подкоманда Внедрить (Bind) будетпрервана; 6— подкоманда Вне-дрить (Bind) завершена аварийно);2 — целое число с меткой объектавнешней ссылки или О

7.8.29. Функция vlr-reaction-setДобавляет или заменяет функцию действия в реакторе.

(vlr-reaction-set <реактор> <событие> '<функция>)

Аргументы: <реактор> — VLR-объект; <событие> — символ из числа зарезер-вированных для обозначения событий, обрабатываемых реакторами данноготипа; <функция> — символ (с апострофом) с именем функции.

Возвращаемого значения нет.

Пример:

° (vlr-reaction-set vrl2 :vlr-commandWillStart 'vlr-trace-reaction) за-меняет в реакторе vri2 старую функцию, действовавшую при событии:vlr-commandWillStart, на vlr-trace-reaction

7.8.30. Операции с реакторамиРасширение языка AutoLISP позволяет выполнять различные операции надреакторами. Можно получать списки реакторов, запрашивать данные, вла-дельцев, имена функций действия. Допускается удаление, распространение,выключение, включение, модификация реакторов.

Осуществляющие все эти операции функции рассматриваются в разд. 7.8.31—7.8.48.

7.8.31. Функция vlr-reactionsВыводит список из точечных пар событий и функций действий.

(vlr-reactions <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращаемое значение — список из точечных пар (<событие> . <функция>).

Page 438: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 437

7.8.32. Функция vlr-removeОтключает реактор, не удаляя его из рисунка (такой реактор можно активи-зировать).

(vlr-remove <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращается значение аргумента <реактор>. В случае сбоя возвращается nil.

7.8.33. Функция vlr-remove-allОтключает реакторы всех типов или реакторы определенного типа.

(vlr-remove-all [<тип>])

Аргумент <тип> может принимать значение одного из символов, зарезерви-рованных для обозначений типов реакторов (см. табл. 7.4 и 7.5). Если аргу-мент опущен, то отключаются все реакторы.

Возвращаемое значение — список из списков с реакторами. Внутренниесписки имеют вид: (<тип> <уьи-объект> ...), где первый элемент — это заре-зервированный СИМВОЛ ДЛЯ обозначения типа (например, :VLR-Command-Reactor), а остальные элементы — VLR-объекты (реакторы). Если функцияне отключила ни одного реактора, то возвращается nil.

7.8.34. Функция vlr-addВключает (активизирует) отключенный реактор.

(vlr-add <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращается значение аргумента <реактор>.

7.8.35. Функция vlr-added-pПроверяет, включен ли реактор.

(vlr-added-p <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращаемое значение — т (если реактор включен), ni l (если реактор вы-ключен).

7.8.36. Функция vlr-current-reaction-nameОпределяет имя события, вызвавшего функцию действия реактора.

(vlr-current-reaction-name)

Page 439: Visual LISP и секреты адаптации AutoCAD

438 Visual LISP и секреты адаптации AutoCAD

Возвращает зарезервированный символ с именем события, вызвавшего ре-актор.

7.8.37. Функция vlr-dataИзвлекает данные, связанные с реактором (о данных, передаваемых функ-ции действия, см. разд. 7.8.9).

(vlr-data <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращаемое значение — данные, сохраненные вместе с реактором.

7.8.38. Функция vlr-data-setЗаменяет ранее записанные данные, связанные с реактором.(vlr-data-set <реактор> <данные>)

Аргументы: <реактор> — VLR-объект; <данные> — значение любого типа, ко-торое нужно сохранить с реактором вместо старых данных.

Возвращаемое значение — значение аргумента <данные>.

7.8.39. Функция vlr-owner-addДобавляет объект к списку владельцев реактора типа :VLR-object-Reactor(о владельцах реактора см. разд. 7.8.9 и 7.8.13).

(vlr-owner-add <реактор> <владелец>)

Аргументы: <реактор> — VLR-объект (реактор); <владелец> — VLA-объект,вносимый в список владельцев (объектов, которые могут активизироватьфункцию действия реактора).

Возвращаемое значение — значение аргумента <владелец>.

7.8.40. Функция vlr-owner-removeУдаляет объект из списка владельцев реактора типа :VLR-object-Reactor.

(vlr-owner-remove <реактор> <владелец>)

Аргументы: <реактор> — VLR-объект (реактор); <владелец> — VLA-объект,который удаляется из списка владельцев.

Возвращаемое значение — значение аргумента <владелец>.

7.8.41. Функция vlr-ownersПолучает список владельцев реактора типа : VLR-ОЬj ect-Reactor.(vlr-owners <реактор>)

Page 440: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 439

Аргумент <реактор> — VLR-объект (реактор объектов).

Возвращаемое значение — список, элементами которого являются VLA-объ-екты.

7.8.42. Функция vlr-notificationВыводит информацию об активности реактора в зависимости от пространст-ва имен.

(vlr-notification <реактор>)

Аргумент <реактор> — VLR-объект.

Возвращаемое значение — один из двух зарезервированных символов:

• ail-documents — реактор работает во всех документах;

П active-document-only — реактор работает только в активном документе.

7.8.43. Функция vlr-set-noiificationЗадает режим работы реактора, в зависимости от активности нужного доку-мента.

(vlr-set-notification <реактор> \<документы>)

Аргументы: <реактор> — VLR-объект (реактор); <документы> — один из двухзарезервированных символов (all-documents — реактор работает во всех до-кументах, active-document-only — реактор работает только в активном до-кументе). Перед вторым аргументом должен присутствовать апостроф.

Возвращаемое значение — значение аргумента <реактор>.

7.8.44. Временные и постоянные реакторыПо умолчанию создаваемые реакторы являются временными (transient), т. е.не сохраняются в рисунке после его закрытия. Однако в технологии ActiveXсистемы AutoCAD 2000 предусмотрена операция смены режима работы ре-акторов с временного на постоянный.

Постоянные (persistent) реакторы сохраняются прямо в рисунке и возобнов-ляют свое функционирование после открытия рисунка в следующем сеансесистемы AutoCAD (при условии загрузки тех функций, которые фигурируютв реакторах в качестве функций действия). Перевод реактора в постоянныйрежим может быть осуществлен с помощью функции vir-pers, возврат вовременный — С ПОМОЩЬЮ функции vlr-pers-release.

Для удобства пользователей добавлены также функция vir-pers-p, прове-ряющая режим работы реактора на постоянность, и vir-pers-iist, котораявыводит список постоянных реакторов.

Перечисленные функции рассматриваются, в разд. 7.8.45—7.8.48.

Page 441: Visual LISP и секреты адаптации AutoCAD

440 Visual LISP и секреты адаптации AutoCAD

7.8.45. Функция vlr-persПереводит реактор в постоянный режим.

(vlr-pers <реактор>)

Аргумент <реактор> — VLR-объект (реактор).

При нормальном завершении функция vlr-pers возвращает значение аргу-мента <реактор>. Если операция перевода не выполнилась, то функция воз-вращает nil.

7.8.46. Функция vlr-pers-releaseПереводит реактор во временный режим.

(vlr-pers-release <реактор>)

Аргумент <реактор> — VLR-объект.

Функция vlr-pers-release в случае успешного завершения возвращает зна-чение аргумента <реактор>. В противном случае возвращается nil.

7.8.47. Функция vlr-pers-pПроверяет реактор на постоянность.

(vlr-pers-p <реактор>)

Аргумент <реактор> — VLR-объект (реактор).

Данная функция возвращает значение аргумента <реактор>, если проверяе-мый реактор является постоянным. Если реактор является временным, товозвращается nil.

7.8.48. Функция vlr-pers-listПолучает список постоянных реакторов в текущем документе.

(vlr-pers-list [<тип>])

Аргумент <тип> — зарезервированный символ, обозначающий тип реактора(см. табл. 7.4 и 7.5).

Возвращаемое значение — список с VLR-объектами (постоянными реакто-рами указанного типа). Если аргумент <тип> не передан, то возвращаетсясписок постоянных реакторов всех типов.

7.8.49. Правила работы с реакторамиРеакторы являются мощными элементами управления, создаваемыми с по-мощью современной технологии ActiveX. Но такой сильный аппарат должениспользоваться достаточно аккуратно, ибо неправильное его применение

Page 442: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 441

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

При проектировании реакторов фирма Autodesk рекомендует учитывать сле-дующие соображения.

1. Естественная последовательность событий иногда может нарушаться.Например, команда ОТКРЫТЬ (OPEN) вызывает события :vir-commandWillStart, :vlr-beginDwgOpen, :vlr-endDwgOpen, :vlr-commandEnded.Однако эти четыре события не обязательно произойдут именно в указан-ном порядке. Достоверно можно утверждать только, что событие -.vir-commandwilistart предшествует событию :vir-commandEnded, а событие:vlr-beginDwgOpen — событию :vlr-endDwgOpen.

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

3. В функциях действия нельзя использовать такие интерактивные функ-ции, как getkword, getpoint, entsei и т. д. Кроме того, запрещается вФУНКЦИЯХ ДеЙСТВИЯ Применять фуНКЦИЮ command.

4. Нельзя вызывать диалоговые окна во время обработки событий. Функ-ции, работающие с диалоговыми окнами, относятся к интерактивнымфункциям и поэтому будут конфликтовать с работой реакторов.

5. Объект, который стал источником события, не может быть модифициро-ван из функции действия, реагирующей на это событие.

6. Нельзя из функции действия, обрабатывающей событие, выполнять опе-рации, которые могли бы привести к отмене данного события (это можетвызвать зацикливание).

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

8. Во время диалоговых запросов системы AutoCAD никакие события непроисходят.

7.8.50. Пример построения реактораСоздадим реактор, который является реактором типа :VLR-object-Reactorдля отрезков и при модификации этих отрезков выводит их новую длину.Обрабатываемое событие имеет обозначение :vir-modified.

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

• VLA-объект;

• VLR-объект (реактор);

П список параметров (для рассматриваемого события он пуст, согласнотабл. 7.11).

Page 443: Visual LISP и секреты адаптации AutoCAD

442 Visual LISP и секреты адаптации AutoCAD

В листинге 7.4 приведен текст файла, содержащего тела двух функций. Пер-вая функция (star) предназначена для загрузки расширения AutoLISP, вы-бора отрезков и создания реактора. Вторая функция (showien) являетсяфункцией действия для реактора.

! Листинг 7.4. Пример программы с реактором объектов I

; Н.Н.Полещук, 2001 г.

(defun star ( / ww i wl ae)

(princ "\пВыберите отрезки: ")

(setq ww (ssget))

(if ww

(progn

(princ (strcat "\пВыбрано " (itoa (sslength ww)) " объектов. "))

(vl-load-com)

(setq axl nil)

; Формирование списка владельцев реактора

(setq i -1 wl (sslength ww))

(repeat wl

; Преобразование элементов набора ww в VLA-объекты

(setq i (1+ i) ae (vlax-ename->vla-object (ssname ww i)))

(setq axl (append axl (list ae)))

); repeat

(setq liner

(vlr-object-reactor axl "Реактор отрезков; новая длина "

(list '(:vlr-modified . showien))

)

);setq

(defun showien (vlao reac args /)

(princ (strcat "\n" (vlr-data reac) (rtos (vla-get-length vlao) 2 2)))

);defun

В графическом документе, приведенном на рис. 7.1, построено девять от-резков. Два отрезка этого документа имеют общую верхнюю точку. Послевыполнения загруженной в документ функции star в нем образовался набориз всех выбранных пользователем девяти отрезков, которым был назначенреактор типа :VLR-object-Reactor (он сохранен в переменной liner).

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

Page 444: Visual LISP и секреты адаптации AutoCAD

Глава 7. Технология ActiveX 443

бытие :vir-modified, а наблюдавший за этим реактор liner выдал сооб-щения:

Реактор отрезков; новая длина 172.42Реактор отрезков; новая длина 261.51

Для вычисления новой длины отрезков была использована функция via-get-iength, которая извлекает из VLA-объекта его текущую длину.

В случае необходимости сохранения реактора вместе с документом в функ-цию star следует добавить строку:

(vlr-pers liner)

Но даже после сохранения реактора вместе с рисунком нужно позаботитьсяо загрузке в следующем сеансе AutoCAD функции showien, без которой ре-актор будет выдавать сообщение об ошибке.

\St AutoCAD 2000 - НЕ ДЛЯ ПЕРЕПРОДАЖИ [Diawingi]Щ| $айл Правке 2ив Вставке Фориаг Сервис Ёигаяание Р^меры Редаит 2кно ПАКТ Справка

D В* И | # '£ <* i * «to ft rfI "> « '• » ! "S йа ss, JS,! Щ «И; * Г< QJ

-|Д|х|

|Реактор отрезков; новая длина 172.42Реактор оюрезкоб; нобая длина 261.51{ ~^LJ"JJ"ijii'sfe^&ШЖ^1"~^У1~1:1. i!iii!tft 5едо1^дщдаЙпРивйз№',отеедв: act;

Рис. 7 . 1 . Пример работы реактора объектов

Page 445: Visual LISP и секреты адаптации AutoCAD

ГЛАВА 8

Особенности AutoCAD 2000i

AutoCAD 2000i — это версия системы, вышедшая после AutoCAD 2000 иимеющая ряд отличий от предыдущей версии. Большая часть измененийулучшает сервис для работы в Интернете, но есть и другие особенности, ко-торые нужно учитывать в процессе адаптации системы к рабочему меступользователя.

В начале сеанса работы с AutoCAD 2000i по умолчанию высвечивается недиалоговое окно Начало работы (Startup), рассмотренное в разд. 1.1, а окноAutoCAD Today (AutoCAD сегодня) (рис. 8.1).

Окно разделено на три области:

О My Drawings (Мои чертежи);

• Bulletin Board (Бюллетень);

О Autodesk Point A.

Нижнюю часть занимает область Autodesk Point А, которая значительнорасширяет возможности пользователя для работы в глобальной сети, пре-доставляя средства удобного соединения со своими сайтами, а также с сай-тами фирмы Autodesk, на которых можно получить техническую поддержку.Кроме того, сайты Autodesk облегчают доступ своим пользователям к биб-лиотекам стандартов и графических символов для ускорения и унификациипроцесса проектирования.

Левая верхняя область окна AutoCAD Today (AutoCAD сегодня)» называетсяMy Drawings (Мои чертежи) и она заменяет привычное окно Начало работы(Startup) системы AutoCAD 2000. Область имеет три вкладки:

О Open Drawings (Открытие чертежей);

• Create Drawings (Создание чертежей);

П Symbol Libraries (Библиотеки символов).

Page 446: Visual LISP и секреты адаптации AutoCAD

Глава 8. Особенности AutoCAD 2000\ 445

"AutoCAD Today

Ш

Щ-

open Drawings \ »Select how to beginNo recent files

|Histoiy(byDate) jJ or ptpvyge,,,*-

*,

You can include a bulletin board to postyour own Web page. CAO managerscan use this feature to communicatewith their design team, providing links toblock libranes, CAD standards, or otherfiles and folders available on thecompany intranet

Edit this default view by clicking the editbutton above.

Рис. 8 . 1 . Диалоговое окно AutoCAD Today

Вкладка Open Drawings (Открытие чертежей) используется для открытиясуществующих файлов рисунков и имеет возможность сохранения часто ис-пользуемых путей. Вкладка Create Drawings (Создание чертежей) позволяетсоздавать новый рисунок с применением шаблонов фирмы Autodesk илишаблонов пользователя.

В точки зрения автоматизации процесса проектирования большую ценностьпредставляет вкладка Symbol Libraries (Библиотеки символов) (рис. 8.2).

'<:'•.. • • " К-. "". ".'!*. "21 sVmWLibraries \

DesignCenter Symbol Libraries orEdJi^

1 House Designer.

2 Kitchens

3 Fasteners - US

4 Hydraulic - Pneumafc

5 Basic Eledronict

6 Home - Space Planner

7 Landscaping« HVAC - Healing Ventilation Air Conditioning

9 Plant Process

ft:

4

Рис. 8.2. ВкладкаSymbol Libraries

Эта вкладка расширяет возможности Центра управления AutoCAD (см.разд. 1.6), разрешая пользователю подключать свои библиотеки символов.Если щелкнуть по пункту Edit (Редактировать), то открывается диалоговоеокно Edit DesignCenter Symbol Libraries (Редактирование библиотек симво-лов Центра управления) (рис. 8.3).

Page 447: Visual LISP и секреты адаптации AutoCAD

446 Visual LISP и секреты адаптации AutoCAD

' Edit DesignCenter Symbol Libiaiies

. Symbol libraries; J:

KitchensFasteners - USHydraulic • PneumaticBasic ElectronicsHome - Space PlannerLandscapingHVAC - Heating Ventilation Air СPlant Process ;Fasteners • Metric "*WeldingPipe Fittings

il PniAiiar ^

•;: Library name!jHouse Designef

Library drawing file' • Brpwie--v

p:WTOMD20O0l\Sarnple\DesignCenter\Hoased

._ flemove link

Рис. 8.3. Диалоговое окно Edit DesignCenter Symbol Libraries

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

Область Bulletin Board (Бюллетень) является средством общения группыразработчиков одного или смежных проектов. Щелкнув по расположенной вверхнем правом углу кнопке Edit (Редактировать), вы можете перейти в ок-но настройки (рис. 8.4) и указать имя и расположение директивного доку-мента, содержимое которого будет отображаться в начале сеанса AutoCAD.Такой способ позволяет руководителю проекта с помощью локальной сетикоординировать усилия разработчиков.

I 3|D:\AutoCAD2000i\e(lilcaclmgi.htm - Microsoft Internet Explorer

CAD managers can connrnunicate directly -with their local user basethroughout the day with messages, reminders; calendars, and links to thingslike standards and content libraries stored locally.

Enter Path to the Local Server:. Browse...

Рис. 8.4. Окно настройки бюллетеня группы разработчиков

На рис. 8.5 отображена область Bulletin Board (Бюллетень) с текущим со-держимым директивного документа для группы участников одного проекта.

Page 448: Visual LISP и секреты адаптации AutoCAD

Глава 8. Особенности AutoCAD 2000i 447

Группа 2111КобозеваМичуринаПо лещу кСавельеваСвиридоваЮшкова

Рис. 8.5. Использование бюллетенядля координации группы разработчиков

Пользователи, привыкшие к диалоговому окну Начало работы (Startup) сис-темы AutoCAD 2000, могут вернуть его вместо окна AutoCAD Today (AutoCADсегодня). Для этого нужно с помощью пункта Options (Настройки) падаю-щего меню Tools (Сервис) открыть вкладку System (Система) диалоговогоокна Options (Настройки) (рис. 8.6).

' '-W^"*.j.P$^i^ij^O(M^d;§/^j.::^cJ^g;'l-.'iSi'^eif| ] User Preferences | Oiaffing| Selection) Profiles!

• ^ ^ - " — - - 5 : ; r.general Optkin» u.---;--—^—-.—- -~~~

JGSHEIDI10

Current Pointing Device >:'•-'

.''i'.'.;''~P':' Displaiji'ltE pibperties dialog

у / Г" fl&ep;on error in» user input

:..'Г" t,obdaoad.ispwith e^erydrawing

Show TODAY startup dialog r [

Show traditional startup dialogi^-rf•:;;p Live Enabler fj Do not show a startup dialog

: i CHWik. Autodesk Point A for Live E hablers:

: ;| Л-.?*' When Autodesk Point A is available in Today

j J / я Й Д > : I 15 Minimum number of unsuccessful checks

Рис. 8.6. Вкладка System диалогового окна Options

Page 449: Visual LISP и секреты адаптации AutoCAD

448 Visual LISP и секреты адаптации AutoCAD

На этой вкладке есть раскрывающийся список Startup (Начало), в которомразмещены три элемента:

• Show TODAY startup dialog (Показывать окно AutoCAD сегодня);

• Show traditional startup dialog (Показывать традиционное окно начала ра-боты);

• Do not show a startup dialog (He показывать окно начала работы).

Выбор второго элемента этого списка возвращает к традиционной схеме на-чала сеанса системы AutoCAD, рассмотренной в разд. 1.1.

Page 450: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1

Основные файлы поддержки,участвующие в адаптации

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

Таблица П1.1. Типы текстовых файлов поддержки

Расширение Описание

ahp

del

hdx

ini

I'm

Isp

mln

mnl

mns

mnu

pat

pgp

ps

Файл помощи

Файл описания диалоговых окон

Индексный файл к одноименному файлу помощи

Файл настройки компонентов программного обеспечения

Файл типов линий

Файл программ на языке AutoLISP

Файл стилей мультилиний

Файл программ на языке AutoLISP, загружаемых одновременнос загрузкой файла одноименного меню (с расширением mnu)

Файл текстовой части меню, генерируемого по исходному файлуменю (с расширением mnu)

Исходный файл меню

Файл штриховок

Файл параметров внешних программ и псевдоимен (см. acad.pgpв табл. П1.2)

Файл поддержки работы команды ИМПОРТПС (PSIN) (см. font-map.ps в табл. П1.2)

15 Зах. 155

Page 451: Visual LISP и секреты адаптации AutoCAD

450

Расширение Описание

Visual LISP и секреты адаптации AutoCAD

Таблица П1.1 (окончание)

psf Файл поддержки команд ЭКСПОРТПС (PSOUT) и ПСЗАКР (PSFILL)

(см. acad.psf в табл. П1.2)

гх Файл перечня приложений ObjectARX (см. acad.rx в табл. П1.2)

scr Файл сценария, выполняющий команды AutoCAD и выраженияAutoLISP (как пакетный файл)

shp Файл исходного текста шрифта или формы (после компиляциифайл получит расширение shx)

unt Файл единиц (см. acad.unt в табл. П1.2)

Замечание JФайлы помощи с расширением ahp, по-видимому, не будут поддерживаться вбудущем. AutoCAD 2000, помимо ahp, поддерживает файлы помощи с расши-рением hip, которые создаются с использованием специального пакета Micro-soft Help Workshop.

В табл. П1.2 приведены наименования и размещения текстовых файловподдержки, упомянутых в предыдущей таблице. Файлы расположены в ал-фавитном порядке их расширений.

Таблица П1.2. Основные текстовые файлы поддержки

Файл Папка Описание

Основной файл диалоговых окон AutoCAD

Файл прототипов элементов диалоговых окон

Файл стандартных типов линий AutoCAD

Файл типов линий, адаптированных под стандартISO

acad.lsp User Файл с пользовательскими программами на языкеAutoLISP (загружается только в начале сеансаAutoCAD)

acaddoc.lsp User Файл с пользовательскими программами на языкеAutoLISP (загружается при открытии каждого ри-сунка)

acad2000.lsp Support Файл со стандартными программами на языкеAutoLISP (загружается только в начале сеансаAutoCAD)

acad.dcl

base.del

acad.lin

acadiso.lin

Support

Support

Support

Support

Page 452: Visual LISP и секреты адаптации AutoCAD

Приложение

Файл

1.Основные файлы поддержки,

Папка Описание

участвующие в адаптации

Таблица П1.2

451

(окончание)

acad2000doc.lsp Support

acad.mln

acad.mnl

acad.mns

acad.mnu

acad.pat

acadiso.pat

Support

Support

Support

Support

Support

Support

acad.pgp User

fontmap.ps

acad.psf

acad.rx

Itypeshp.shp

acad.unt

Fonts

Support

User

Support

Support

Файл со стандартными программами на языкеAutoLISP (загружается при открытии каждого ри-сунка)

Файл стандартных типов мультилиний AutoCAD

Файл с программами на языке AutoLISP (загру-жается при загрузке файлов acad.mnu, acad.mns)

Файл текстовой части меню, генерируемого пофайлу меню acad.mnu

Исходный файл стандартного меню AutoCAD

Файл стандартных штриховок AutoCAD

Файл штриховок AutoCAD, адаптированных подстандарт ISO

Файл параметров внешних команд и псевдоименкоманд (стандартный вариант файла находится впапке Support)

Файл с каталогом шрифтов PostScript (использу-ется командой ИМПОРТПС (PSIN))

Файл поддержки шрифтов PostScript (использу-ется командами ЭКСПОРТПС (PSOUT) и ПСЗАКР(PSFILL))

Файл со списком приложений ObjectARX, загру-жаемых в начале сеанса AutoCAD

Вспомогательный файл для сложных типов линий,примененных в файле acad.lin

Файл с данными для преобразования единиц из-мерения

Папки Support и Fonts находятся внутри папки с программным обеспечени-ем (по умолчанию d:\AutoCAD 2000). Условное наименование User исполь-зовано в таблице для указания папки, выбираемой пользователем с учетомпутей поиска файлов поддержки.

15*

Page 453: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 2

Стандартный вариант файлаacad.pgp

Данное приложение содержит листинги файла acad.pgp русскоязычной ианглоязычной версии AutoCAD.

I Листинг П2.1. Файл acad.pgp русскоязычной версии AutoCAD |: 1

; Файл параметров для AutoCAD 2000

Определение псевдоимен команд и внешних команд

Copyright (С) 1997-1999 by Autodesk, Inc.

Всякий раз при открытии нового или существующего рисунка

AutoCAD достает из каталога поддержки (Support) файл acad.pgp

и читает его.

— Внешние команды —

Во время работы AutoCAD можно вызывать другие программы и

утилиты, например, системные команды или приложения Windows.

Внешняя команда может быть определена путем задания имени

команды (которая вводится в строке команд AutoCAD) и исполняемого

выражения (которое передается операционной системе).

— Псевдокоманды —

Часто используемые команды можно заменить их аббревиатурами'

(псевдоименами), которые тоже описываются в файле acad.pgp.

Псевдоимя можно присвоить любой команде AutoCAD, команде

драйвера устройства или внешней команде.

Совет: сделайте резервную копию этого файла перед тем, как

редактировать его.

Формат внешних команд:

<Имя команды>,[<Подсказка DOS>],<Битовый флаг>,[*]<Подсказка>,

Page 454: Visual LISP и секреты адаптации AutoCAD

Приложение 2. Стандартный вариант файла acad.pgp 453

Далее идет описание битов флага:

Бит 1: если установлен, не ждать завершения приложения

Бит 2: если установлен, выполнять приложение в свернутом виде

Бит 4: если установлен, выполнять приложение "скрытым"

Бит 8: если установлен, взять строку аргумента в кавычки

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

Биты 2 и 4 взаимно исключают друг друга; если заданы оба, используется

2 бита. Наиболее часто употребляются значения 0 (запустить приложение

и ждать его завершения), 1 (запустить приложение и не ждать

завершения), 3 (свернуть и не ждать) и 5 (скрыть и не ждать). Обычно

значения 2 и 4 не используются, поскольку они делают AutoCAD

недоступным до окончания работы приложения.

Бит 8 позволяет таким командам, как DEL правильно работать с именами

файлов, включающими пробелы (например, "long filename.dwg"). Заметим,

что установка этого флага может препятствовать использованию

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

В этом случае бит 8 не следует устанавливать.; Примеры вызова внешних

команд

8,Спецификация файлов: ,

8,Удалить файл(ы): ,

• 8,Спецификация файлов: ,

9,Редактировать файл: ,

1,*Команда ОС: ,

1,*Команда ОС: ,

1,*Команда ОС: ,

1, *Выполнить приложение: ,

8,Распечатать файл: ,

; Примеры внешних команд для Windows

; См. также AutoLISP-функцию (STARTAPP) как альтернативный метод.

EXPLORER, START EXPLORER, 1,,

NOTEPAD, START NOTEPAD, 1,*Редактировать файл: ,

PBRUSH, START PBRUSH, 1, ,

Формат псевдоимен команд:

<Псевдоимя>,*<Полное имя команды>

Далее даются указания по созданию новых псевдоимен команд.

1. Псевдоимя должно сокращать имя команды по крайней мере на две

буквы. Для команд, имеющих аналог в виде управляющей,

функциональной клавиши или кнопки статусной строки, псевдоимя не

требуется. Например: следует пользоваться Ctrl-N, -О, -Р и -S для

команд Новый, Открыть, Печать и Сохранить.

2. Сначала используйте первый символ команды, затем первые два, затем

первые три.

КАТАЛОГ,DEL,

DIR,

РЕД,

ДОС1,

ДОС,

SH,

START,

TYPE,

DIR /W,DEL,

DIR,

START EDIT,

r

r

t

START,

TYPE,

Page 455: Visual LISP и секреты адаптации AutoCAD

454 Visual LISP и секреты адаптации AutoCAD

3. После определения одной псевдокоманды добавляйте суффиксы для

сходных команд. Например: КП для КОПИРОВАТЬ, КПС для КОПИРОВАТЬСВ.

4. Применяйте знак переноса для отличия команд командной строки и

диалоговых окон. Например: Б для Блок, -Б для -Блок.

— Примеры псевдоимен команд Автокада —

В данных примерах показаны наиболее популярные команды.

зг,змс,30,зп,тн,TI,AT,-AT,ATP,-ATP,Б,

-Б,

БВЫ,

БДС,

В,

-в,ВЗА,

ВЛИ,

внд,-внд,во,вое,ВР,

ВРГ,

вел,вщ,выд,выход,выч,г,-г,д,ДВ,

да,доп.ДТ,

ЕД,

-ЕД,

з,

*3-ГРАНЬ*3-МАССИВ

*3-0РБИТА

*з-поли*THICKNESS*TILEMODE*АТОПР

*-АТОПР

*АТРЕД

*-АТРЕД

• *БЛОК

*-БЛОК

*БВЫНОСКА

*БДСВЯЗЬ

*ВСТАВИТЬ

*-ВСТАВИТЬ

*ВЗАИМ0Д

*ВЕСЛИН

*ВНЕДРИТЬ

*-ВНЕДРИТЬ

*ВСТОБЪЕКТ

*ВСЕОСВЕЖ

*ВЫРОВНЯТЬ

*ВСЕРЕГЕН

*ВСТСПЕЦ

*ВРАШДТЬ

*ВЫДАВИТЬ

*ПОКИНУТЬ

*ВЫЧИТАНИЕ

*ГРУППА

*-ГРУППА

*ДУГА

*ДВИД

*дист*ДОПУСК

*ДТЕКСТ

*ЕДИНИЦЫ

*-ЕДИНИЦЫ

*ЗЕРКАЛ0

Page 456: Visual LISP и секреты адаптации AutoCAD

Приложение 2. Стандартный вариант файла acad.pgp 455

ЗАГ,

и,-и,ИВ,

из,-из,им,имя,-имя,ио,ИР,

к,кл,ко,-ко,кп,кпс,кц,кш,л,лм,м,мл,мн,мс,мт,-мт,мш,НА,

ОБ,

ОБЛ,

ОБР,

ОР,

ОРБИТА,

ОС,

осз,от,ОТКРЧАСТЬ,

оч,п,ПА,

•-ПА,

ПАК,

ПБ,

-ПБ,

пд,

*ЗАГПРИЛ*И30Б

*-И30Б

*И30БВСТАВИТЬ

*ОКНОСВ

^ИЗМЕНИТЬ

*ИМПОРТ

*НОВОЕИМЯ

*-НОВОЕИМЯ

*И30БРЕЗ

*И30БРЕГУЛ

*КРУГ

*КЛИН

*КОНТУР

*-КОНТУР

*КОПИРОВАТЬ

*КОПИРОВАТЬСВ

*кольцо*КШТРИХ

*лист*ЛМАСШТАБ

*МОДЕЛЬ

*млиния*МН-УГОЛ

*МАССИВ

*МТЕКСТ

*-МТЕКСТ

*МАСШТАБ

*НАСТРОЙКА

*ОБЪЕДИНЕНИЕ

*ОБЛАСТЬ

*ОБРЕЗАТЬ

*ОРФО

*3-ОРБИТА

*ОСВЕЖИТЬ

*0КН0СВЗАКР

*0ТРЕ30К

*-ОТКРЧАСТЬ

*ОЧИСТИТЬ

*ПЕРЕНЕСТИ

*ПАН

*-ПАН

*ПАКЕТ

*ПБЛОК

*-ПБЛОК

*ПОДЕЛИТЬ

Page 457: Visual LISP и секреты адаптации AutoCAD

456 Visual LISP и секреты адаптации AutoCAD

ПЕР,ГШ,

ПН,

ПО,

пов,под,ПОР,

ПР,

ПРВ,

ПРД,

ПРИ,

-ПРИ,

ПРЯ,

пш,пщ,РА,

РАЗ,

РАС,

PACK,

РАСЧ,

РВА,

РГ,

рди,РЕД,

РЖР,

РЛ,

РЛИ,

РМ,

POP,

РПА,

РПО,

РРА,

РРЕ,

РСП,

РСТ,

РТ,

РУГ,

РЦЕ,

РЦП,

РШ,

с,св,СЕЧ,

СК,

СЛ,

-сл,

^ПЕРЕСЕЧЕНИЕ*ПЛИНИЯ

*ПАНЕЛЬ

*П0КАЗАТЬ

*ПОВЕРНУТЬ

*ПОДОБИЕ

*ПОРЯДОК

*ПРЯМАЯ

*ПРЕДВАР

*ПОЛРЕД

*ПРИВЯЗКА

*-ПРИВЯЗКА

*ПРЯМОУГ

*ПЛАНШЕТ

*ПЛОЩАДЬ

*РАЗОРВАТЬ

*РАЗРЕЗ

* РАСТЯНУТЬ

*РАСКРАСИТЬ

*РАСЧЛЕНИТЬ

*РЗМБА30ВЫЙ

*РЕГЕН

*РЗМДИАМЕТР

*ДИАЛРЕД

*РЕЖИМРИС

*-РЛИСТ

*РЗМЛИНЕЙНЫЙ

*РАЗМЕТИТЬ

*РЗМОРДИНАТА

*РЗМПАРАЛ

*РЗМП0ДАВИТЬ

*РЗМРАДИУС

*РЗМРЕД

*РЕДСПЛАЙН

*РЗМСТИЛЬ

*РЕЖИМТОН

*РЗМУГЛ0В0Й

*РЗМЦЕНТР

*РЗМЦЕПЬ

*РЕДШТРИХ

^СТЕРЕТЬ

*СВИД

*СЕЧЕНИЕ

*СКРЫТЬ

*СЛОЙ

*-СЛОЙ

Page 458: Visual LISP и секреты адаптации AutoCAD

Приложение 2. Стандартный вариант файла acad.pgp 457

con,СП,

спл,ее,-се,сев.ссп,ст,ТЕНЬ,

тз,-тз,тл,-тл,то,тон,у,

УВ,

УДАЛИ,

УП,

ф,

ФАС,

ФИ,

Цв,ЦУ,

ч,-ш,э,эк.

*СОПРЯЖЕНИЕ

*список'* СПЛАЙН

*ССЫЛКА

*-ССЫЛКА

•ССВСТАВИТЬ

•ССПОДРЕЗАТЬ

*стиль•РАСКРАСИТЬ

•ДИАЛТЗРЕН

•ТЗРЕНИЯ

•ТИПЛИН

•-типлин*ТОЧКА

•ТОНИРОВАТЬ

•УДЛИНИТЬ

•УВЕЛИЧИТЬ

. •очистить•УСТПЕРЕМ

•ФИЛЬТР

•ФАСКА

•ФИГУРА

•ЦВЕТ

•ЦУВКЛ

•ПЕЧАТЬ

•ШТРИХ

•ЭЛЛИПС

•ЭКСПОРТ

; Псевдоимена для совместимости с Release 14

УРЛСОХРАНИ,•СОХРАНИТЬ

УРЛОТКРОЙ, *ОТКРЫТЬ

УРЛВСТАВЬ, *ВСТАВИТЬ

; Псевдоимена устаревших команд в AutoCAD 2000:

AAD,АЕХ,

ALI,

ASQ,

ARO,

ASE,

ДИАЛАТОП,

ДИАЛАТЭК,

ДИАЛСВОЙ,

ДИАЛЦВЕТ,

ДИАЛСЛОЙ,

•DBCONNECT•DBCONNECT

•DBCONNECT

•DBCONNECT

•DBCONNECT

•DBCONNECT

•АТОПР

•АТЭКСП

•ОКНОСВ

•ЦВЕТ

•СЛОЙ

Page 459: Visual LISP и секреты адаптации AutoCAD

458 Visual LISP и секреты адаптации AutoCAD

ДИАЛТИПЛИН, *ТИПЛИН

ДИАЛИЗМ,

ДИАЛПРИВ,

ДИАЛПСК,

ДИАЛСРЕД,

ДИАЛРУЧ,

ЭКСПОРТВ,

*окносв"ПРИВЯЗКА

*пск*DDRMODES*DDGRIPS"DWFOUT

Дополнительные псевдоимена

-ССЫЛРЕД,

ССЫЛРЕД,

ССЕШЗАКР,

ССЬШНАБ,

*-REFEDIT

*REFEDIT

*REFCLOSE

*REFSET

j Листинг П2.2. Файл acad.pgp англоязычной версии AutoCAD

AutoCAD Program Parameters File For AutoCAD 2000External Command and Command Alias DefinitionsCopyright (C) 1997-1999 by Autodesk, Inc.Each time you open a new or existing drawing, AutoCAD searchesthe support path and reads the first acad.pgp file that it finds.

— External Commands —While AutoCAD is running, you can invoke other programs or utilitiessuch Windows system commands, utilities, and applications.You define external commands by specifying a command name to be usedfrom the AutoCAD command prompt and an executable command stringthat is passed to the operating system.

-- Command Aliases —You can abbreviate frequently used AutoCAD commands by definingaliases for them in the command alias section of acad.pgp.You can create a command alias for any AutoCAD command,device driver command, or external command.

Recommendation: back up this file before editing it.

External command format:<Command name>,[<DOS request>],<Bit flag>,[*]<Prompt>,

The bits of the bit flag have the following meanings:Bit 1: if set, don't wait for the application to finishBit 2: if set, run the application minimizedBit 4: if set, run the application "hidden"Bit 8: if set, put the argument string in quotes

Fill the "bit flag" field with the sum of the desired bits.Bits 2 and 4 are mutually exclusive; if both are specified, onlythe 2 bit is used. The most useful values are likely to be 0(start the application and wait for it to finish), 1 (start theapplication and don't wait), 3 (minimize and don't wait), and 5

Page 460: Visual LISP и секреты адаптации AutoCAD

Приложение 2. Стандартный вариант файла acad.pgp 459

(hide and don't wait). Values of 2 and 4 should normally be avoided,as they make AutoCAD unavailable until the application has completed.

Bit 8 allows commands like DEL to work properly with filenames thathave spaces such as "long filename.dwg". Note that this willinterfere with passing space delimited lists of file names to thesesame commands. If you prefer multiplefile support to using long filenames, turn off the "8" bit in those commands.

Examples of external commands for command.windows

CATALOG,DEL,DIR,EDIT,SH,SHELL,START,

DIR /W,DEL,DIR,START EDIT,

1fSTART,

8,File specification: ,8,File to delete: ,8,File specification: ,9,File to edit: ,1,*OS Command: ,1,*OS Command: ,1,*Application to start:

TYPE, TYPE, 8,File to list: ,

; Examples of external commands for Windows; See also the (STARTAPP) AutoLISP function for an alternative method.

EXPLORER, START EXPLORER, 1,,NOTEPAD, START NOTEPAD, l,*File to edit: ,PBRUSH, START PBRUSH, 1, ,

Command alias format:<Alias>,*<Full command name>

The following are guidelines for creating new command aliases.1. An alias should reduce a command by at least two characters.

Commands with a control key equivalent, status bar button,or function key do not require a command alias.Examples: Control N, 0, P, and S for New, Open, Print, Save.

2. Try the first character of the command, then try the first two,then the first three.

3. Once an alias is defined, add suffixes for related aliases:Examples: R for Redraw, RA for Redrawall, L for Line, LT forLinetype.

4. Use a hyphen to differentiate between command line and dialogbox commands.Example: В for Block, -B for -Block.

Exceptions to the rules include AA for Area, T for Mtext,X for Explode.

— Sample aliases for AutoCAD commands —

These examples include most frequently used commands.

ЗА,3D0,3F,ЗР,A,

*3DARRAY*3D0RBIT*3DFACE*3DP0LY*ARC

Page 461: Visual LISP и секреты адаптации AutoCAD

460 Visual LISP и секреты адаптации AutoCAD

ADC,AA,AL,AP,AR,ATT,-ATT,ATE,-ATE,ATTE,B,

-в,BH,BO,-BO,BR,c,CH,-CH,СНА,COL,COLOUR,CO,D,DAL, 'DAN,DBA,DBC,DCE,DCO,DDI,DED,DI,DIV,DLI,DO,DOR,DOV,DR,DRA,DS,DST,DT,DV,E,ED,EL,EX,EXIT,EXP,EXT,F,FI,G,-G,

*ADCENTER*AREA*ALIGN*APPLOAD*ARRAY*ATTDEF*-ATTDEF*ATTEDIT*-ATTEDIT*-ATTEDIT*BLOCK*-BLOCK*BHATCH^BOUNDARY*-BOUNDARY*BREAK*CIRCLE*PROPERTIES*CHANGE*CHAMFER*COLOR*COLOR*COPY*DIMSTYLE*DIMALIGNED*DIMANGULAR*DIMBASELINE*DBCONNECT*DIMCENTER*DIMCONTINUE*DIMDIAMETER*DIMEDIT*DIST*DIVIDE*DIMLINEAR*DONUT*DIMORDINATE*DIMOVERRIDE*DRAWORDER•*DIMRADIUS*DSETTINGS*DIMSTYLE*DTEXT*DVIEW*ERASE*DDEDIT*ELLIPSE*EXTEND*QUIT*EXPORT*EXTRUDE*FILLET*FILTER*GROUP"-GROUP

Page 462: Visual LISP и секреты адаптации AutoCAD

Приложение 2. Стандартный вариант файла acad.pgp 461_

GR,н,-н,НЕ,HI,I,-I,IAD,IAT,ICL,IM,-IM,IMP,IN,INF,10,L,LA,-LA,LE,LEN,LI,LINEWEIGHT,L0,LS,LT,-LT,LTYPE,-LTYPE,LTS,LW,M,MA,ME,MI,ML,MO,MS,MT,MV,0,OP,ORBIT,OS,-OS,p,-p,PA,

•DDGRIPS•BHATCH*HATCH*HATCHEDIT•HIDE•INSERT•-INSERT•IMAGEADJUST*IMAGEATTACH•IMAGECLIP•IMAGE•-IMAGE•IMPORT•INTERSECT•INTERFERE•INSERTOBJ•LINE•LAYER•-LAYER•QLEADER•LENGTHEN•LIST, •LWEIGHT•-LAYOUT•LIST•LINETYPE•-LINETYPE•LINETYPE•-LINETYPE•LTSCALE•LWEIGHT•MOVE•MATCHPROP•MEASURE•MIRROR•MLINE•PROPERTIES•MSPACE•MTEXT•MVIEW•OFFSET•OPTIONS•3D0RBIT•OSNAP•-OSNAP•PAN•-PAN•PASTESPEC

PARTIALOPEN, *-PARTIALOPENPE,PL,PO,POL,PR,PRCLOSE,

•PEDIT•PLINE•POINT•POLYGON•OPTIONS•PROPERTIESCLOSE

Page 463: Visual LISP и секреты адаптации AutoCAD

462 Visual LISP и секреты адаптации AutoCAD

PROPS,PRE,PRINT,PS,PU,

R,RA,RE,REA,REC,REG,REN,-REN,REV,RM,RO,RPR,RR,s,SC,SCR,SE,SEC,SET,SHA,SL,SN,SO,SP,SPL,SPE,ST,su,T,-T,ТА,TH,TI,TO,TOL,TOR,TR,UC,UCP,UN,-UN,UNI,V,-v,VP,-VP,w,-w,WE,x,

*PROPERTIES*PREVIEW*PLOT*PSPACE*PURGE*REDRAW*REDRAWALL*REGEN*REGENALL*RECTANGLE*REGION*RENAME*-RENAME*REVOLVE*DDRMODES*ROTATE*RPREF*RENDER*STRETCH*SCALE*SCRIPT*DSETTINGS*SECTION*SETVAR*SHADE*SLICE*SNAP*SOLID*SPELL*SPLINE*SPLINEDIT*STYLE*SUBTRACT*MTEXT*-MTEXT*TABLET*THICKNESS*TILEMODE*TOOLBAR*TOLERANCE*TORUS*TRIM*DDUCS*DDUCSP*UNITS*-UNITS*UNION*VIEW*-VIEW*DDVPOINT• VPOINT*WBLOCK*-WBLOCK*WEDGE*EXPLODE

Page 464: Visual LISP и секреты адаптации AutoCAD

Приложение 2. Стандартный вариант файла acad.pgp 463

ХА,ХВ,-ХВ,ХС,XL,XR,-XR,

z,

*XATTACH*XBIND*-XBIND*XCLIP*XLINE*XREF*-XREF*ZOOM

The following are alternative aliases and aliases as suppliedin AutoCAD Release 13.

AV,CP,DIMALI,DIMANG,DIMBASE,DIMCONT,DIMDIA,DIMED,DIMTED,DIMLIN,DIMORD,DIMRAD,DIMSTY,DIMOVER,LEAD,TM,

*DSVIEWER*COPY*DIMALIGNED*DIMANGULAR*DIMBASELINE*DIMCONTINUE*DIMDIAMETER•DIMEDIT*DIMTEDIT*DIMLINEAR*DIMORDINATE*DIMRADIUS*DIMSTYLE*DIMOVERRIDE*LEADER*TILEMODE

; Aliases for Hyperlink/URL Release 14 compatibilitySAVEURL, *SAVEOPENURL, *OPENINSERTURL, *INSERT

; Aliases for commands discontinued in AutoCAD 2000:

AAD,AEX,ALI,ASQ,ARO,ASE,DDATTDEF,DDATTEXT,DDCHPROP,DDCOLOR,DDLMODES,DDLTYPE,DDMODIFY,DDOSNAP,DDUCS,

*DBCONNECT*DBCONNECT*DBCONNECT*DBCONNECT*DBCONNECT*DBCONNECT*ATTDEF*ATTEXT•PROPERTIES*COLOR*LAYER*LINETYPE•PROPERTIES*OSNAP*UCS

Page 465: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 3

Стандартный вариант файлаacad.unt

Функция cvunit (см. разд. 2.7.11) использует наименования единиц измере-ния и способы их преобразования, описанные в файле acad.unt, располо-женном в папке Support программного обеспечения системы AutoCAD 2000.В листинге П3.1 приводятся фрагменты текста стандартного варианта этогофайла русскоязычной версии AutoCAD.

| Листинг П3.1. Фрагменты файла acad.unt русскоязычной версии \

; Файл определения единиц измерения — ACAD.UNT

; Основные единицы системы СИ

*meter(s) ,metre(s),m,метр,метр(а.ов),м

-1,0,1,0,-1,4.1214856408ell,0

*kilogram(s),kg,килограмм,килограмм(а.ов),кг

0,0,0,0,1,1.0977481015е30,0

*second(s),sec,секунд(а),сек

-2,0,1,0,-1,1.235590484е20,0

*ampere(s),amp(s),ампер(а),А

2,1,-1, 0,1,0.050513907838,0

*kelvin, k,кельвин,кельвин(а.ов),К

2,0,0,-1,1,1.6863043358е-10,0

*candela,cd,кандел(а),кд

4,0,-1,0,2,9.88522621бе-8,0

; Производные единицы СИ

*celsius,centigrade,с,градус,градус(а.ов),град

2,0,0,-1,1,1.6863043358е-10,4.6061402932е-8

*rankine

2,0,0,-1,1,9.3683574212е-11, 0

*fahrenheit,Фаренгейт

2,0,0,-1,1,9.3683574212е-11,4.30635285578е-8

Page 466: Visual LISP и секреты адаптации AutoCAD

Приложение 3. Стандартный вариант файла acad.unt 465

*gram(s) ,gm,g,грамм,грамм(а.ов) , г

=кг 0.001

*newton(s),n,ньютон,H

=метр килограмм / секундаЛ2

*pascal,pa,паскаль,Па

=Ньютон/метр/ч2

*joule (s) , Джоул (ь . я)

=Ныотон метр

; Синонимы степеней

*square,sq,квадрат,кв

А2

*cubic,cu,куб

; Единицы измерения времени

*centur(у.ies),век(ов)

=100 лет

*day(s),день,д(ень.ней)

=86400 секунд

*пятилетка

=5 лет

*decade(s)

=10 year

*fortnight(s)

=14 days

*hour(s),пг,час,час(ов.а),ч

=3600 секунд

*milleni(um.a),тысячелети(е.й)

=1000 лет

*minute(s),min,минут(а),мин

=60 секунд

*sidereal_year(s),сидерический_год

=365.25636 дней

*tropical_year(s),тропический_год

=365.24220 дней

*week(s),wk,нeдeл(ь.я)

=604800 секунд

*year(s),уг,год,лет

=365 дней

; Единицы измерения длины

*Angstrom(s),Ангстрем,Ангстрем(а.ы)

=метр IE-10

*astronomical_unit(s),аи,астрономическая_единица, а.е.

=метр 149597870000

Page 467: Visual LISP и секреты адаптации AutoCAD

466 Visual LISP и секреты адаптации AutoCAD

*bolt(s)

=метр 36.576

*cable(s),кабельтов,кабельтов(а.ых) ; кабельтов США

=метр 219.456

*caliber,калибр

=метр 0.000254

*centimeter(s),centimetre(s),cm(s),сантиметр,сантиметр(а.ов),см

=метр 0.01

; Безразмерные префиксы

; Умножение

*дека

0,0,0,0,0,10,0

*гекто

0,0,0,0,0,100,0

*кило

0,0,0,0,0,1000,0

*мега

0,0,0,0,0,10е6,0

*гига

0,0,0,0,0,10е9,0

*тера

0,0,0,0,0,10е12,0

*пета

0,0,0,0,0,10е15,0

*экса

0,0,0,0,0,10е18,0

*deca

0,0,0,0,0,10,0

*hecto

0,0,0,0,0,100,0

*kilo

0,0,0,0,0,1000,0

*mega

0,0,0,0,0,10еб,0

*giga

0,0,0,0,0,10e9,0

*tera

0,0,0,0,0,10el2,0

*peta

0,0,0,0,0,10el5,0

*exa

0,0,0,0,0,10el8,0

Page 468: Visual LISP и секреты адаптации AutoCAD

Приложение 3. Стандартный вариант файла acad.unt 467

; Деление

*деци

0,0,0,0,0,0.1,0

*санти

0,0,0,0,0,0,0.01,0

*милли

0,0,0,0,0,0.001,0

*микро

0,0,0,0,0,1е-6,0

*нано

0,0,0,0,0,1е-9,0

*пико

0,0,0,0,0,1е-12,0

*фемто

0,О,0,0,0,1е-15,0

*атто

0,0,0,0,0,1е-18,0

*deci

0,0,0,0,0,0.1,0

*centi

0,0,0,0,0,0,0.01,0

0,0,0,0,0,0.001,0

*micro

0,0,0,0,0,le-6,0

*nano

0,0,0,0,0,le-9,0

*pico

0,0,0,0,0,le-12,0

* femto

0,0,0,0,0,le-15,0

*atto

0,0,0,0,0,le-18,0

Ссьшка: CRC Handbook, 68th edition C87-'88).

Размерности общих единиц в терминах фундаментальных констант

Измерение С Е Н К М Примечания

Длина -1 1 -1

Масса 1

Время -2 1 -1 time / С

Электрич. 2 1 - 1 1 Е / time

Температура 2 - 1 1 Н / (К time)

Интенсивность излуч. 4 - 1 2 Units o f power over

solid angle, a

dimensionless value.

Page 469: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 4

Файл acad.mnu

В данном приложении приводятся фрагменты стандартного варианта файлаacad.mnu. Ввиду большого размера указанного файла нет возможности при-вести его целиком. Читателям, желающим познакомиться со всеми деталямиэтого файла, рекомендую сделать его распечатку из папки Support про-граммного обеспечения системы AutoCAD 2000.

В листинге П4.1 приводится начало файла acad.mnu — разделыMENUGROUP и BUTTONS. В листингах П4.2—П4.19 показаны фрагмен-ты, содержащие, соответственно, разделы AUX, POP0, РОР1, РОРЗ,РОР500, РОР501, РОР502, РОР503, РОР504, РОР505, РОР508, TOOLBARS,IMAGE, SCREEN, TABLET, HELPSTRINGS, ACCELERATORS.

| Листинг П4.1. Разделы MENUGROUP и BUTTONS j

* **MENUGROUP=ACAD

/ /

// Begin AutoCAD Digitizer Button Menus

//

***BUTTONS1

// Simple + button

// If a grip is hot bring up the Grips Cursor Menu (POP 500),

// else send a carriage return

// If the SHORTCUTMENU sysvar is not 0

// the first item (for button 1) is NOT USED.

$M=$(if, $(eq,$(substr,$(getvar,cmdnames) ,1,5) ,GRIP_) ,+

$P0=ACAD.GRIPS $P0=*);

$P0=SNAP $p0=*ЛС

ЛС

ЛВ

ЛО

Page 470: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 469

***BUTT0NS2

// Shift + button

$P0=SNAP $pO=*

***BUTTONS3

// Control + button

***BUTTONS4

// Control + shift + button

Листинг П4.2. Разделы AUX

***AUX1

// Simple button

// if a grip is hot bring up the Grips Cursor Menu (POP 500),

// else send a carriage return

// If the SHORTCUTMENU sysvar is not 0 the first item

// (for button 1, the "right button") is NOT USED.

$M=$(if,$(eq,$(substr,$(getvar,cmdnames),1,5),GRIP_),+

$P0=ACAD.GRIPS $P0=*);

$P0=SNAP $p0=*ЛС

ЛС

ЛВ

AO

***AUX2

// Shift + button

$P0=SNAP $p0=*

$P0=SNAP $p0=*

***AUX3

//Control + button

$P0=SNAP $p0=*

***AUX4

// Control + shift + button

$P0=SNAP $p0=*

j Листинг П4.3. Раздел РОРО

***POP0**SNAP

Page 471: Visual LISP и секреты адаптации AutoCAD

470 Visual LISP и секреты адаптации AutoCAD

// Shift-right-click if using the default AUX2 and/or BUTTONS2

// menus.

[^Контекстное меню привязки]

ID_Tracking [Т&очка отслеживания]_tt

ID_From [& Смещение]_fгот

ID_MnPointFi [-Жоординатные &фильтры]

ID_PointFilx [.Х].Х

ID_PointFily [.Y].Y

ID_PointFilz [.Z].Z

[ — ]

ID_PointFixy [.XY].XY

ID_PointFixz [.XZ].XZ

ID_PointFiyz [<-.YZ].YZ

[ — ]

ID_OsnapEndp [&KoHTO4Ka]_endp

ID_OsnapMidp [C&epe№tHa]_mid

ID_OsnapInte [&nepece4eHne]_int

ID_OsnapAppa [Ка&жущееся пересечение]_appint

ID_OsnapExte [Про &должение]_ext

ID_OsnapCent

ID_OsnapQuad

ID_OsnapTang

[&Центр]_сеп

[K&BaflpaHT]_qua

ID_OsnapPerp [&Нормаль]_рег

ID_OsnapPara [Пара&ллельно]_par

ID_OsnapNode [&Узел]_пой

ID_OsnapInse [&Твставки]_1пз

ID_OsnapNear [&Ближайшая]_пеа

ID_OsnapNone [Ни &чего]_non

[ — ]

ID_Osnap [&Режимы привязки...]'_+dsettings 2

Листинг П4.4. Раздел РОР1

***POP1**FILEID_MnFile [&Файл]

ID_New [&Новый...\tCtrl+N]лС

л_

ID_Open [&Открыть...\tCtrl+O]лСлС_ореп

ID_FILE_CLOSE [«Закрыть]

ID_PartialOp [$ (if, $ (eq, $ (getvar, fullopen), 0),,

&Частичная загрузка] /4CC_partiaload

IDSave [SCoxpaHHTb\tCtrl+S]ACAC_qsave

Page 472: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 471

ID_Saveas [Сохранить &как...]ACAC_saveas

ID_Export [&Экспорт...]ACAC_export

ID_PlotSetup [Параметры &листа...]ACAC_pagesetup

ID_PlotMgr [&Диспетчер плоттеров.,.]ACAC_plottermanager

ID_PlotStyMgr [Д&испетчер стилей печати...]ACAC_stylesmanager

ID_Preview [Пред&варительный просмотр]ACAC_preview

ID_Print [&Печать...\tCtrl+P]ACAC_jplot

[ — ]

ID_MnDrawing [->&Утилиты]

ID_Audit [&Проверить]ACAC_audit

ID_Recover [&Восстановить...]ACAC_recover

ID_MnPurge [->&Очистить]

ID_PurgeAll [&Bce]ACAC_purge _a

[—]

ID_PurgeLay [&Слои]ACAC_purge _la

ID_PurgeLin [&Типы линий]AC

AC_purge _lt

ID_PurgeTxt [Т&екстовые стили]ACAC_purge _st

ID_PurgeDim [&Размерные стили]ACAC_purge _d

ID_PurgeMln [Стили &мультилиний]ACAC_purge _m

ID_PurgeBlk [&Блоки]ACAC_purge _b

ID_PurgePlt [Стили &печати]ACAC_purge _p

ID__PurgeShp [<-<-&Формы] AC

AC_purge _sh

ID_SendMail [Пересла&ть...]

ID_Props [Сво&йства рисунка...]ACAC_dwgprops

ID_MRU [Последние файлы]

t--]

ID APP EXIT [В&ыход]

'I Листинг П4.5. Раздел РОРЗ

***РОРЗ

**VIEW

ID_MnView [&Вид]

ID_Redrawall [&Освежить]'_redrawall

ID_Regen [&Регенерировать]ACAC_regen

ID_Regenall [Ре&генерировать все]ACAC_regenall

ID_MnZoom [->&Показать]

ID ZoomRealt [В реал&ьном времени]' zoom ;

ID_ZoomPrevi

ID ZoomWindo

[&Предыдущий] '_zooni _p

[&Рамка]' zoom w

Page 473: Visual LISP и секреты адаптации AutoCAD

472 Visual LISP и секреты адаптации AutoCAD

ID_ZoomDynam

ID_ZoomScale

IDZoomCente

[«Динамика]'_zoom _d

[&Масштаб]'_zoom _s

[&Центр]'_zoom _c

ID_ZoomIn [У&величение]'_zoom 2x

ID_ZoomOut [Ум&еньшение]'_zoom .5x

t — ]

ID_ZoomAll [B&ce]'_zoom _all

ID_ZoomExten [<-&Границы]'_zoom _e

ID_MnPan [->П&анорамировать]

ID_Pan [В реал&ьном времени]'_рап

ID_PanPick [«Точка]'_-pan

ID_PanLeft

(trans (list

ID_PanRight

(trans (list

ID_PanUp

(trans (list

ID_PanDown

(trans (list

IDDsviewer

[В&лево]AP'_-pan +

-0.2 (getvar "viewsize")) 0) 0 1)

[В&право]AP'_-pan +

0.2 (getvar "viewsize")) 0) 0 1)

[В&верх]AP'_-pan +

(* 0.2 (getvar "viewsize"))) 0 1)

[<~В«низ]AP'_-pan +

(* -0.2 (getvar "viewsize"))) 0 1)

[О&бщий вид]'_dsviewer

ID_MnTiledVi [->Ви«довые экраны]

ID_Ai_tiledv [«Именованные ВЭ...]ACAC_+vports 1

ID_VportsSav [«Новые ВЭ...]ACAC_+vports 0

ID_VportsSin [&1 ВЭкран]АСАС$М=$(if,$(eq,$(getvar, tilemode) ,1),+

AC

AC_-vports _si,

AC

AC_-vports)

ID_Vports2 [&2 ВЭкрана]ACAC_-vports _2ID_Vports3 [&3

ВЭкрана]ACAC_-vports _3

ID_Vports4 [&4 ВЭкрана]ACAC_-vports _4

ID_VportsRes [$(if,$(eq,$(getvar,tilemode) , 1) , ~) +

«Многоугольный ВЭ]AC

AC_-vports _p

ID_VportsDel [$(if,$(eq,$(getvar,tilemode),1),~)«Объект]+AC

AC_-vports _o

ID_VportsJoi [<-$(if,$(eq,$(getvar,tilemode),0),~)«Соединить]+AC

AC_-vports _j

ID_Ddview [Имено«ванные виды. . . ] /vCAC_view

ID_MnViewpoi [->$(if,$(and,$(eq,$(getvar,tilemode),0) ,+

$ (eq, $ (getvar, cvport) , 1) ) , ~,) &3M виды]

ID_Ddvpoint [Стан&дартные точки зрения...]ACAC_ddvpoint

ID_VpointTri [«Точка зрения]ACAC_vpoint ;

ID_MnPlanView [->В«ид в плане]

ID_PlanCurre [«Текущая ПСК]AC

AC_plan ;

Page 474: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 473

ID_PlanWorld [&МСК]ACAC_plan _w

ID_PlanUCS [<~&По имени]AC

AC_plan _u

t —1

ID_VpointTop [С&верху]ACAC_-view _top

IDJVpointBot [С&низу] ACAC__-view _bottom

ID_VpointLef [С&лева]ACAC_-view _left

ID_VpointRig [С&права]ACAC_-view _right

ID_VpointFro [Спе&реди] AC

AC_-view _f ront

ID_VpointBac [С&зади ]AC

AC_-view _back

[ — ]ID VpointSW [&ЮЗ изометрия]

ACAC_-view _swiso

ID_VpointSE [KB изо&метрия]ACAC_-view _seisoID_VpointNE [&CB изо-

метрия] AC

AC_-view _neiso

ID VpointNW [<-C3 изометри&я]ACAC_-view _nwiso

ID_3dorbit [$(if,$(and,$(eq,$(getvar,tilemode), 0) ,+

$(eq,$(getvar,cvport),1)),~,)З&М орбита]ACAC_3dorbit

[ — ]

ID_Hide [&Скрыть]ACAC_hide

ID_MnPersShad [->$(if,$(and,$(eq,$(getvar,tilemode) , 0) , +

$(eq,$(getvar,cvport),1)),~,)Раскра&шивание]

ID_2doptim [&2M каркас]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),+

$(eq,$(getvar,cvport),1)),ACAC_shademode,

ACAC_shademode _2)

ID_Wireframe [&3M каркас]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),+

$(eq,$(getvar,cvport),1)),ACAC_shademode,

ACAC_shademode _3)

ID Hidden [&Скрытие линий]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),+

$ (eq, $ (getvar, cvport) , 1) ) , ACAC__shademode,

ACAC_shademode _h)

ID_Flat. [&Плоское]$М=$(if,$(and,$(eq,$(getvar,tilemode),0),+

$(eq,$(getvar,cvport),1)),ACAC_shademode,

ACAC_shaderuode _f)

ID_Gouraud [По &Гуро]$M=$(if,$(and,$(eq,$(getvar,tilemode),0),+

$(eq,$(getvar,cvport),1)),ACAC_shademode,

ACAC_shademode _g)

ID_FlatEdges [Пл&оское, с кромками]$M=$(if,$(and,+

$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)),+AC

AC_shademode,

AC

AC_shademode _1)

ID_GourEdges [<-По Г&уро, с кромками]$M=$(if,$(and,+

$(eq,$(getvar,tilemode),0),$(eq,$(getvar,cvport),1)) ,+AC

AC_shademode,

AC

AC_shademode _o)

ID_MnRender [->$(if,$(and,$(eq,$(getvar,tilemode),0),+

$(eq,$(getvar,cvport),1)),~,)&Тонирование]

ID_Render [^Тонировать...]ACAC_render

ID_Scene [С&цены...]ACAC_scene

ID_Light [&Свет...]ACAC_light

ID__Rmat [&Материалы. . . ] AC

AC_rmat

ID Matlib [&Библиотека материалов...]ACAC_matlib

ID_Setuv [Нало&жить текстуру...]ACAC_setuv

Page 475: Visual LISP и секреты адаптации AutoCAD

474 Visual LISP и секреты адаптации AutoCAD

ID_Backgroun [&Фон...]ACAC_background

ID_Fog [Т&уман...]ACAC_fog

ID_Lsnew [Нов&ый ландшафт...]ACAC_lsnew

ID_Lsedit [&Редактировать ландшафт...]ACAC_lsedit

ID_Lslib [Биб&лиотека ландшафтов...]ACAC_lslib

ID__Rpref [Настро&йка. . . ] ACAC_rpref

ID_Stats [<-Стат&истика...]ACAC_stats

ID_MnDisplay [->Отобра&жение]

ID_MnUCSicon [->&Пиктограмма ПСК]

ID_UcsiconOn [$(if,$(and,$(getvar,ucsicon), 1), !.)&Вкл] +

$M=$(if,$(and,$(getvar,ucsicon),1),ACAC_ucsicon _off,

ACAC_ucsicon _on)

ID_UcsiconOr [<-$(if,$(and,$(getvar,ucsicon),2),!.)&Начало]+

$M=$(if,$(and,$(getvar,ucsicon),2),ACAC_ucsicon _no,

ACAC__ucsicon _or)

ID_MnAttribu [->&Атрибуты]

ID_AttdispNo [$(if,$(eq,$(getvar,attmode),1),!.)&Нормальное]+

'_attdisp _n

ID_AttdispOn [$(if,$(eq,$(getvar,attmode),2),!.)&Вкл]'_attdisp _on

ID_AttdispOf [<-$(if,$(eq,$(getvar,attmode),0),!.)&0ткл]+

'_attdisp _off [—]

ID__Textscr [<-&Текстовое OKHo\tF2]'_textscrID Toolbar [Панел&и...]ACAC toolbar

I Листинг П4.6. Раздел РОР500

***POP500

**GRIPS

// When a grip is hot, then display the following shortcut menu

// for grips. See also AUX1 menu.

[К&онтекстное меню ручек]

ID Enter [fiEnter];

ID_GripMove [&IIepeHecTM]_move

ID_GripMirro [&3еркало]_т1ггог

ID_GripRotat [IIo&BepHyTb]_rotate

ID_GripScale t&MacmTa6]_scale

ID_GripStret [PacT&HHyTb]_stretch

[ — ]

ID_GripBase [ Базовая точка]_base

ID_GripCopy [&Копировать]_сору

ID_GripRefer [$(if,$(or,$(eq,$(getvar,cmdnames),GRIP_SCALE) ,+

$(eq, $(getvar,cmdnames),GRIP_ROTATE)),,~)&CcbmKa]_reference

ID GripUndo [&Отменить] u

Page 476: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 475

ID_Modify [Сво&йства]ACAC_properties

ID_GotoURL [Сое&диниться с URL...]ACAC_gotourl

[ —]

ID GripExit [B&bKOfl]_exit

; Листинг П4.7. Раздел РОР501: ,***РОР501

**CMDEFAULT

[Контекстное меню по умолчанию]

ID_CMNonLast [&Повторить %s]ACAC;

ID_Cutclip [&Вырезать]ACAC_cutclip

ID_Copyclip [&Копировать]ACAC_copyclip

ID_Copybase [Копировать с базовой то&чкой]ACAC_copybase

ID_Pasteclip [Вст&авить]ACAC_pasteclip

ID_Pastebloc [Вставит&ь как блок]ACAC_pasteblock

ID_Pasteorig [Вставить с исходн&ыми координатами]ACAC_pasteorig

ID_U [&Отменить]ACAC_u

ID_Redo [Пов&торить]ACAC_redo

ID_Pan [Панора&мирование]'_рап

ID_ZoomRealt [&3умирование]'_zoom ; •

ID_Filter [&Быстрый выбор...]ACAC_qselect

IDJTextFind [&Найти...]ACAC_find

ID_Preferenc [Настро&йка...]ACAC_options

i Листинг П4.8. Раздел РОР502

***POP502**CMEDIT

[Контекстное меню режима редактирования]

ID_CMSelLast [&Повторить %s]ACAC;

ID_Cutclip [&Вырезать]ACAC_cutclip

ID_Copyclip [&Копировать]ACAC_copyclip

ID_Copybase [Копировать с базовой то&чкой]ACAC_copybase

ID_Pasteclip [Вст&авить]ACAC_pasteclip

ID_Pastebloc [Вставит&ь как блок]ACAC_pasteblock

ID_Pasteorig [Вставить с исходн&ыми координатами]ACAC_pasteorig

ID Erase [&Стереть]АСАС erase

Page 477: Visual LISP и секреты адаптации AutoCAD

476 Visual LISP и секреты адаптации AutoCAD

ID_Move [П&еренести]$M=$(if,$(eq,+$(substr,$(getvar,cmdnames),1,4),GRIP),_move,ACAC_move)ID_Copy [К&опировать выбранные]$M=$(if,$(eq,+$(substr,$(getvar,cmdnames),1,4),GRIP),_copy,ACAC_copy)ID_Scale [Шасштаб] $M=$ (if, $ (eq, +$(substr,$(getvar,cmdnames),1,4),GRIP),_scale,

ACAC_scale)

ID_Rotate [Пове&рнуть]$M=$(if,$(eq,+

$(substr,$(getvar,cmdnames),1,4),GRIP),_rotate,ACAC_rotate)

[ —]ID_Deselectall [Отм&енить выбор]

ACACAP(ai_deselect)

AP

ID_Filter [&Быстрый выбор...]ACAC_qselect

ID_TextFind [&Найти...]ACAC_find

ID_Ai_propch [Сво&йства]ACAC_properties

; Листинг П4.9. Раздел РОР503

***POP503

**CMCOMMAND

[Контекстное меню командного режима]

ID_Enter [SEnter];

ID_Cancel [Перервать]АС

[—]

ID_Pan [$(if, $(eq,$(substr,+

$(getvar, cmdnames),1,4),ZOOM),~,)Па&норамирование]'_pan

ID_ZoomRealt [$(if,$(eq,$(substr,+

$(getvar,cmdnames),1,4),ZOOM),~,)&3умирование]'_zoom ;

j Листинг П4.10. Раздел РОР504

***POP504* *OBJECTS_DIMENSION

[Контекстное меню размеров]

ID_DimText [->Поло&жение размерного текста]

IDJDimAbove [&Над размерной линией]ACAC_ai_dim_textabove

ID_DimTxtCen [По &центру]ACAC_ai_dim_textcenter

ID_DimHome [ «Стандартное]ACAC_ai_dim_texthome

ID_DimTxtMove2 [&Перенести только текст]ACAC_aidimtextmove _2

ID_DimTxtMovel [Перенести с &выноской]ACAC_aidimtextmove _1

ID_DimTxtMoveO [<-Перенести с &размерной линией]ACAC_aidimtextmove _0

ID_DimPrec [->&Точность]

ID_DimPrecO [0]ACAC_aidimprec _0

ID_DimPrecl [0.0]ACAC_aidimprec _1

ID_DimPrec2 [0.00]ACAC_aidimprec _2

Page 478: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 477

ID_DimPrec3

ID_DimPrec4

ID_DimPrec5

ID_DimPrec6

ID_DimStyl

ID_DimSty2

ID_DimSty3

ID_DimSty4

ID_DimSty5

ID_DimSty6

ID_DimSty7

ID_DimSty8

ID_DimSty9

[0.000]ACAC_aidimprec _3

[0.0000]ACAC_aidimprec _4

[0.00000]ACAC_aidimprec _5

[<-0.000000]ACAC_aidimprec _6

[->Ра&змерный стиль]

[&Сохранить как новый стиль...'

'4CAC_aidimstyle

'4CAC_aidimstyle

'4CAC_aidimstyle

^CAC_aidimstyle

'4CAC_aidimstyle

ЛС

АС aidimstyle

A C A C_aid imsty le

[Стиль MRU1]'

[Стиль MRU2]'

[Стиль MRU3]'

[Стиль MRU4]'

[Стиль MRU5]'

[Стиль MRU6]'

[<-&Другие...]АСАС aidimstyle О

Листинг П4.11. Раздел РОР505

***РОР505* *ОВJECTJVIEWPORT

ID_VpClip

ID_Vport_disp

ID_Vport_dispon

ID_Vport_dispoff

ID_Vport_lock

ID_Vport_lockon

ID_Vport_lockoff

ID_Vport_hide

ID_Vport_hideon

ID_Vport_hideoff

[Контекстное меню видовых экранов][По&дрезать видовой экран]ACAC_vpclip[->В&идимость объектов на ВЭкранах][&Да]лСАС_-уроЛз _оп _ р ; ;[<-&Нет]ACAC_-vports _off _ p ; ;[->Пока&зать блокированные][&Да]ACAC_-vports _lock _on _ p ; ;[<-&Нет]ACAC_-vports _lock _off _ p ; ;[->Скрыть &линии][&Да]ACAC_-vports _hide _on _ p ; ;[<-&Нет]ACAC_-vports _hide _off _ p ; ;

I Листинг П4.12. Раздел РОР508

***POP508

**OBJECT_TEXT

ID Ddedit

[Контекстное меню однострочного текста]

[Ре&дактирование текста...]ACAC_ddedit

Листинг П4.13. Раздел TOOLBARS

***TOOLBARS

**ТВ DIMENSION

ID TbDimensi [ Toolbar("Размеры", Floating, Hide, 100, 130, 1)]

Page 479: Visual LISP и секреты адаптации AutoCAD

478 Visual LISP и секреты адаптации AutoCAD

ID_Dimlinear [_Button("Линейный размер", IC0N_16_DIMLIN, +IC0N_16_DIMLIN)]ACAC_dimlinear

ID_Dimaligne [_Button("Параллельный размер", IC0N_16_DIMALI, +IC0N_16_DIMALI)]~CAC_dimalignedID_Dimordina [_Button("Ординатный размер", ICON_16_DIMORD, +ICON_16_DIMORD) ] A C A C_dimordinate

[ — ]ID_Dimradius [_Button("Радиус", ICON_16_DIMRAD, ICON_16_DIMRAD)]+AC

AC_dimradius

ID_Dimdiamet [^Button("Диаметр", ICON_16_DIMDIA, ICON_16_DIMDIA)]+ACAC_dimdiameter

ID_Dimangula [_Button("Угловой размер", ICON_16_DIMANG, ICON_16_DIMANG)]+AC

AC_dimangular

[--]ID_QDim [_Button("Быстрый размер", ICON_16_QDIM,

ICON_16_QDIM)]+AC

AC_qdim

ID_Dimbaseli [_But.ton("Базовый размер", ICON_16_DIMBAS, ICON_16_DIMBAS)]+

'sC'

4C_dimbaseline

ID_Dimcontin [_Button("Размерная цепь", ICON_16_DIMCON, ICON_16_DIMCON)]+AC/4C_dimcontinue

ID_Leader [_Button("Быстрая выноска", ICON_16_QLEADER, +

ICON_16_QLEADER)]ACAC_qleader

ID_Tolerance [_Button("Допуск", ICON_16_TOLERA, ICON_16_TOLERA)]+ACAC_tolerance

ID_Dimcenter [_Button("Маркер центра", ICON_16_DIMCEN, ICON_16_DIMCEN)]+AC

AC_dimcenter

ID_Dimedit [_Button("Редактировать размер", ICON_16_DIMNEW, +

ICON_16_DIMNEW) ] /4C/4C_dimedit

ID_Dimtedit [_Button("Редактировать текст", ICON_16_DIMHOM, +

ICON_16_DIMHOM)]ACAC_dimtedit

ID_DimUpdate [_Button("Обновить размер", ICON_16_DIMUPD, +

ICON_16_DIMUPD)]ACAC_-dimstyle _apply

[ — ]

ID_DimStyle [_Control(_dimstyle)]

ID_Ddim [_Button("Размерный стиль", ICON_16_DIMSTY, +

ICON_16_DIMSTY)]'_dimstyle

**TB_DRAW

ID_TbDraw [_Toolbar("Рисование", _Left, _Show, 0, 0, 1)]

ID_Line [_Button("Отрезок", ICON_16_LINE, ICON_16_LINE)]ACAC_line

ID_Xline [_Button("Прямая", ICON_16_XLINE, ICON_16_XLINE)]ACAC_xline

ID_Mline [_Ви^оп("Мультилиния", ICON_16_MLINE, ICON_16_MLINE)]+AC

AC mline

Page 480: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 479

ID_Pline t„Button("Полилиния", ICON_16J?LINE, ICON_16_PLINE)]+ЛСЛС_рНпеID_Polygon [_Button("Многоугольник", ICON__16_POLYGO, ICON_16_POLYGO)]+ACAC_polygon

ID_Rectang [_Button("Прямоугольник", ICON_16_RECTAN, ICON_16_RECTAN)]+ACAC_rectang

ID_Arc [_Button("flyra", ICON_16_ARC3PT, ICON_16_ARC3PT)]ACAC_arc

ID_Circle [_Button("Kpyr", ICON_16_CIRRAD, ICON_16_CIRRAD)]ACAC_circle

ID_Spline [_Button("Сплайн", ICON_16_SPLINE, ICON_16_SPLINE)]+ACAC_spline

ID_Ellipse [_Button("Эллипс", ICON_16_ELLAE, ICON_16_ELLAE)]+

*C*C_ellipseID_TbInser t [ _ F l y o u t ( " ^ O K " , ICON_16_BLOCK, ICON_16_BLOCK, _OtherIcon, +ACAD.TB_INSERT)]ID_Bmake [_Button("Создать блок", ICON_16_BLOCK, ICON_16_BLOCK)]+ЛСЛС_ЫоскID_Point [_Button("Точка", ICON_16_POINT, ICON_16_POINT)]*

лCлC_point

ID_Bhatch [_Button("Штриховка", ICON_16_BHATCH, ICON_16_BHATCH)]+ACAC_bhatch

ID_Region [_Button("Область", ICON_16_REGION, ICON_16_REGION)]+ЛСЛС_гед1оп

ID_Mtext [_Button("Многострочный текст", ICON_16_MTEXT, +

ICON 16 МТЕХТ)]ЛСЛС mtext

Листинг П4.14. Раздел IMAGE

***IMAGE**image_3DObjects[ЗМ объекты][acad(Box3d,ЗМ ящик)]

лСАС_а1_Ьох

[acad(Pyramid,Пирамида)]ACAC_ai_pyramid

[acad(Wedge,Клин)]ACAC_ai_wedge

[acad(Dome,Купол)]ACAC_ai_dome

[acad(Sphere,Сфера)]ACAC_ai_sphere

[acad(Cone,Конус)]ACAC_ai_cone

[acad(Torus,Top)]ACAC_ai_torus

[acad(Dish,Чаша)]ACAC_ai_dish

[acad(Mesh,Сеть)]ACAC_ai_mesh

* * image_poly[Режимы построения сплайнов][acad(pm-quad,Квадратичная сеть)]'_surftype 5[acad(pm-cubic,Кубическая сеть)]'_surftype 6[acad(pm-bezr,Сеть Безье)]'_surftype 8[acad(pl-quad,Квадратичная полилиния)]'_splinetype 5

[acad(pl-cubic,Кубическая полилиния)]'_splinetype 6

Page 481: Visual LISP и секреты адаптации AutoCAD

480 Visual LISP и секреты адаптации AutoCAD

\ Листинг П4.15. Раздел SCREEN (корневое экранное меню) |

// AutoCAD Screen Menus//// There are two types of screen menus: command menus and options menus

// Command menus provide access to the lists of AutoCAD commands.

// Options menus provides access to the options available

// for individual commands.

//

// There are 22 lines between menu titles.

// This is one method for assuring that each time

// that a menu is called that it overwrites the previous menu.

/ / •

/ / T h e o r g a n i z a t i o n o f t h e c o m m a n d m e n u s g e n e r a l l y f o l l o w s

/ / t h e o r g a n i z a t i o n o f t h e p u l l - d o w n m e n u s .

/ / A c o m m a n d h a s a s c r e e n m e n u i t e m o n l y i f i t h a s

/ / a p u l l - d o w n m e n u i t e m .

/ / C o m m a n d m e n u s h a v e , a s m u c h a s p o s s i b l e , t h e s a m e n a m e

/ / a s t h e e q u i v a l e n t p u l l - d o w n m e n u .

/ / C o m m a n d m e n u s h a v e , a s m u c h a s p o s s i b l e , t h e s a m e i t e m s

/ / i n t h e s a m e o r d e r a s t h e p u l l - d o w n m e n u s .

/ /

/ / C o m m a n d m e n u s g e n e r a l l y u s e t h e c o m m a n d n a m e w h i l e

/ / p u l l - d o w n m e n u s o f f e r a m o r e d e s c r i p t i v e t i t l e .

/ / I t e m s i n c o m m a n d m e n u s t h a t c a l l o t h e r c o m m a n d m e n u s a r e

/ / i n u p p e r c a s e .

/ /

/ / C o m m a n d m e n u n a m e s s t a r t w i t h a n u m b e r a n d a r e l o c a t e d

/ / a f t e r t h e s p e c i a l m e n u s .

***SCREEN

**S

[AutoCAD ] л С л С л Р ( а 1 _ г о о Ш е п и з )

[* * * * ]$s=ACAD.OSNAP

[ФАЙЛ ]$S=ACAD.01_FILE

[ПРАВКА]$S=ACAD.02_EDIT

[ВИД 1]$S=ACAD.O3_VIEW1

[ВИД 2]$S=ACAD.04_VIEW2

[ВСТАВКА]$S=ACAD.05_INSERT

[ФОРМАТ]$ S=ACAD.0 6_FORMAT

[СЕРВИС 1]$S=ACAD.07JTOOLS1

[СЕРВИС 2]$S=ACAD.08JTOOLS2

[РИСУЙ 1]$S=ACAD.O9_DRAW1

[РИСУЙ 2]$S=ACAD.10_DRAW2

[РАЗМЕРЫ]$S=ACAD.11 DIMENSION

Page 482: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu 481

[РЕДАКТ 1]$ S=ACAD.12_MODIFY1

[РЕДАКТ 2]$ S=ACAD.i 3_M0DIFY2

[СПРАВКА]$S=ACAD.14_HELP

[СРЕДСТВА]$S=ACAD.ASSIST

[ПРЕДМЕНЮ]$ S=ACAD.

! Листинг П4.16. Раздел SCREEN (экранные меню первого уровня)

**01_FILE 3[Новый]ACAC_new[Открыть]АСАС_ореп

[Сохран]ACAC_qsave[Сохран в] A C A C_saveas[Экспорт] A C A C_export

[Настрой]ACAC_config[Печать ] ACAC__plot

[Провер] A C A C_audit[Восстан] A C A C_recover[Очистить]ACAC_purge

[Покинуть]ACAC_quit

**02_EDIT 3[Отменить]ACAC_u[Повтор]ACAC_redo

[Вырезать] A C A C_cutcl ip[Копиров] A C A C_copyclip[КопирБаз]АСАС copybase[Копирвид]ACAC_copylink

[Вставить] A C A C_pastec l ip[ВстБлок] A C A C_pasteblock[ВстИсход] A C A C_pasteorig[Спец в с т ] A C A C _ p a s t e s p e c

[Связи]АСАС d e l i n k s

16 Зак. 155

Page 483: Visual LISP и секреты адаптации AutoCAD

482 Visual LISP и секреты адаптации AutoCAD

\ Листинг П4.17. Разделы TABLET I

***TABLET1**TABLET1STD

[A-2]\

[A-3]\[A-4]\

[A-5]\[A-6]\[A-7]\

[A-8]\[A-9]\

[A-10]

[A-12][A-13]

[A-14][A-15][A-16][A-17]

[A-18][A-19]

[A-20][A-21][A-22][A-23][A-24]

[A-25]

[1-20]

[1-21][1-22][1-23][1-24][1-25]

\\\

\\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

\

**ENDTAB1

/ /

/ /

/ /

TABLET2 menu.

Rows: J to R (9)

C o l u m n s : 1 1

*TABLET2

Page 484: Visual LISP и секреты адаптации AutoCAD

Приложение 4. Файл acad.mnu

**TABLET2STD// Row J ViewACAC_regen

'_zoom _e' zoom a'_zoom _w'_zoom _p[Draw]\ACAC_box

ACAC_mtext

ACAC__circle

ACAC_line

ACAC

// Row К ViewAC

AC_regenall

1 dsviewer1 zoom _c

'_zoom .5x

'_zoom 2x

[Draw]\AC

AC sphere

•ACAC_dtext

/sCAC_donut

лС

АС_гау

'_zoom ;

// Row L View

' attdispАС

ЛС ucsicon

ЛС

ЛС tilemode 1

лС

лС

лР_тзрасе

АР

AC

AC

AP_pspace

AP

[Draw]\AC

AC cylinder

AC

AC solid

AC

AC_spline

AC

AC_xline

'_zoom ;

// Row M ViewAC

AC render

AC

AC_hide

ACAC__vports

ACAC__vports

AC

AC_view

[Draw]\AC

AC_cone

AC

AC_3dface

16*

Page 485: Visual LISP и секреты адаптации AutoCAD

484 Visual LISP и секреты адаптации AutoCAD

AC

AC_ellipse

A CX_ral ine

' zoom ;

// Row N ViewACTC_sceneA C A C_shadeA C A C_planAC

AC_vpoint

AC

AC_ddvpoint

[Draw]\AC

AC_wedge

$I=ACAD. image__3dob j ects $I=ACAD. *л С А С_ЫоскA C A C_pl ine

'_pan

// Row О ViewA C A C_l ightAC

AC_shademode

//

'_-view _nwiso

'__-view _back

' -view neiso

[Draw]\AC

ACJ;orus

AC

AC__revsurf

*AC

AC_point

AC

AC_3dpoly

' _pan

// Row P ViewAC

AC_rmat

AC

AC_fog

/ / ' •

' _ - v i e w _ l e f t

' _ - v i e w _ t o p

' - v i e w r i g h t

[ D r a w ] \

AC

AC _ e x t r u d e

AC

AC _ t a b s u r f

AC

AC _ b h a t c h

AC

AC _ p o l y g o n

// Row Q ViewACAC_matlib

ACAC_background

//

' -view swiso

Page 486: Visual LISP и секреты адаптации AutoCAD

Приложение 4, Файл acad.mnu 485

'_-view _front'_-view _seiso[Draw]\ACAC_revolve

ACAC_rulesurf

ACAC_boundary

ACAC__rectang

'_redrawall// Row R ViewACAC_setuv

ACAC_rpref

//ACAC_toolbar

'_-view _bottomACAC_3dorbit

[Draw]\ACAC_qleader

ACAC_edgesurf

ACAC_region

ACAC_arc

'_redrawall**ENDTAB2

I Листинг П4.18. Раздел HELPSTRINGS

* "HELPSTRINGS

ID_2doptim [Показ содержимого видового экрана в виде 2М каркаса: +

РЕЖИМРАСКР 2]

ID_3darray [Создание трехмерного массива: 3-МАССИВ]

ID 3dclip [Вызов команды 3-ОРБИТА и открытие окна установки +

секущих плоскостей: 3-СЕКПЛ]

ID 3dclipbk [Включение и отключение задней секущей плоскости +

в режиме ЗМ орбиты: ДВИД ВСЕ СЕ 3]

ID 3dclipfr [Включение и отключение передней секущей плоскости +

в режиме ЗМ орбиты: ДВИД ВСЕ СЕ П]

ID_3dcorbit [Вызов команды 3-ОРБИТА с непрерывным вращением +

ЗМ вида по орбите: 3-ПОРБИТА]

ID 3ddistanc [Вызов команды 3-ОРБИТА и регулировка кажущегося +

расстояния до объектов: 3-РАССТ]

ID_3dface [Создание трехмерной грани: 3-ГРАНЬ]

ID 3dmesh [Создание многоугольной сети произвольной формы: 3-СЕТЬ]

ID 3dorbit [Интерактивная визуализация объектов в ЗМ пространстве: +

3-ОРБИТА]

Page 487: Visual LISP и секреты адаптации AutoCAD

486 Visual LISP и секреты адаптации AutoCAD

ID_3dpan [Вызов команды 3-ОРБИТА с возможностью перетаскивания +

вида по горизонтали и вертикали: 3-ПАН]

ID_3dpoly [Создание трехмерной полилинии, состоящей из линейных +

сегментов непрерывного типа: 3-ПОЛИ]

ID_3dsin [Импорт файла в формате 3D Studio: ИМПОРТЗДС]

ID_3dsurface [Создание'трехмерных поверхностей с помощью диалогового +

окна ]

ID_3dswivel [Вызов команды 3-ОРБИТА с имитацией шарнирного вращения +

камеры: 3-ШАРНИР]

ID_3dviews [Установка стандартного или именованного вида]

ID_3dzoom [Вызов команды 3-ОРБИТА с возможностью увеличения и +

уменьшения вида: 3-ПОКАЗАТЬ]

ID_About [Вывод сведений о программе, ее версии и авторских правах:+

ИНФО]

ID_Acisin [Импорт файла в формате ACIS: ИМПОРТТЕЛ]

ID_AddPlotter [Добавление и настройка плоттеров: +

(STARTAPP "ADDPLWIZ.EXE")]

ID_AddPlStyle [Создание таблицы стилей печати: +

(STARTAPP "STYSHWIZ.EXE")]

ID_Ai_box [Создание трехмерной многоугольной сети в форме +

параллелепипеда: А1_ВОХ]

ID_Ai_cone [Создание трехмерной многоугольной сети в форме конуса: +

AI_CONE]

ID_Ai_dish [Создание нижней половины сферической многоугольной сети: +

AI_DISH]

ID_Ai_dome [Создание верхней половины сферической многоугольной сети:+

AI_DOME]ID_Ai_fms [Переключение в пространство модели с плавающими

видовыми +

экранами: AI_FMS]

ID_Ai_molc [Установка текущим слоя, соответствующего выбранному +

объекту: AI_MOLC]

ID_Ai_propch [Управление свойствами существующих объектов: ОКНОСВ]

; Листинг П4.19. Раздел ACCELERATORS

***ACCELERATORS// Bring up hyperlink dialogID_Hyperlink [CONTROL+"K"]// Toggle Orthomode[CONTROL+"L"]"O// Next Viewport[CONTROL+"R";rv

ID_Copyclip [CONTROL+-C"]

Page 488: Visual LISP и секреты адаптации AutoCAD

487Приложение 4. Файл acad.mnu

ID_New

ID_Open

ID_Print

ID_Save

ID_Pasteclip

ID_Cutclip

ID_Redo

ID_U

ID_Modify

ID_Content

ID_dbConnect

ID_VBARun

ID VBAIDE

[CONTROL+"N"]

[CONTROL+"O"]

[CONTROL+"P"]

[CONTROL+"S"]

[CONTROL+"VM]

[CONTROL+"X"]

[CONTROL+"Y"]

[CONTROL+"Z"]

[CONTROL+"1M]

[C0NTR0L+"2"]

[C0NTR0L+"6"]

[ALT+"F8"]

[ALT+"F11"]

Page 489: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 5

Алфавитный переченьфункций языка AutoLISP

В табл. П5.1 приведен перечень всех функций языка AutoLISP, их назначе-ние и номера разделов глав 2—7, в которых эти функции рассмотрены.

Таблица П5.1. Список функций и соответствующих разделов с описанием

Функция

+

-

*

/

=

/

<

<=

>

1+

1-

abs

acad c o l o r d l g

Назначение

Сложение

Вычитание

Умножение

Деление

Равенство

Неравенство

Меньше

Меньше или равно

Больше

Больше или равно

Дополнение до -1

Увеличение на 1

Уменьшение на 1

Абсолютная величина

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

Номерраздела

2.4.1

2.4.2

2.4.3

2.4.4

2.5.1

2.5.2

2.5.3

2.5.4

2.5.5

2.5.6

2.4.7

2.4.5

2.4.6

2.4.8

2.10.19

Page 490: Visual LISP и секреты адаптации AutoCAD

Приложение 5. Алфавитный перечень функций языка AutoLISP 489

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

acad_helpdlg

acad_strlsort

action_tile

add_list

alert

alloc

and

angle

angtof

angtos

append

apply

arx

arxload

arxunload

ascii

assoc

atan

atof

atoi

atom

atoms-family

autoarxload

Вызов справки

Сортировка списка строк

Действие кнопки DCL-файла

Добавление в раскрывающийсясписок диалогового окна

Вызов окна с сообщением

Размер сегмента памяти

Логическое И

Вычисление угла

Пеоевоя угла в вещественное

6.3.1

2.9.18

5.4.1

5.5.2

2.11.12

2.17.3

2.5.7

2.6.6

2.7.7число

Перевод угла в символьное 2.7.8представление

Добавление к списку 2.9.2

Применение операции к элементам 2.9.12списка

Список загруженных 2.17.10ARX-приложений

Загрузка ARX-приложения 2.17.11

Выгрузка ARX-приложений 2.17.12

Вычисление кода буквенно- 2.8.2цифрового символа

Выбор по ключевому элементу 2.9.11

списка

Арктангенс 2.6.11

Перевод из символьного 2.7.6представления в вещественноеПеревод из символьного 2.7.5

представления в целое

Проверка символа 2.5.19

Перечень символов 2.16.16Автозагрузка ARX-приложения 2.17.14

Page 491: Visual LISP и секреты адаптации AutoCAD

490 Visual LISP и секреты адаптации AutoCAD

Функция

autoload

Boole

boundp

caaar, caddr...

caar, cadr

car

cdr

chr

c l i e n t data t i l e

close

command

cond

cons

cos

c v u n i t

defun

defun-q

d e f u n - q - l i s t - r e f

d e f u n - q - l i s t - s e t

d ictadd

d i c t n e x t

dietremove

dictrename

Таблица П5.1

Назначение

Автозагрузка

Булева операция

Проверка значения символа

(car (car (car . . . ) ) ) ,(car (cdr (cdr ...) ) )

(car (car . . . ) ) , (car (cdr ...) )

Извлечение первого элементасписка

Получение остатка спискабез первого элемента

Получение буквенно-цифровогосимвола по его коду

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

Закрытие файла

Передача команд и параметровв командную строку AutoCAD

Проверка условий

Создание списка или точечнойпары

Косинус

Перевод в другие единицыизмерения

Определение новой функции

Определение функциичерез список

Получение списка тела функции

Передача списка в тело функции

Добавление к словарю

Переход на следующую записьсловаря

Удаление из словаря

Переименование в словаре

(продолжение)

Номерраздела

2.17.13

2.6.18

2.5.21

2.9.7

2.9.7

2.9,5

2.9.6

2.8.1

5.4.6

2.11.3

2.3.1

2.5.13

2.9.8

2.6.10

2.7.11

2.16.2

2.16.4

2.16.5

2.16.6

2.15.5

2.15.4

2.15.6

2.15.7

Page 492: Visual LISP и секреты адаптации AutoCAD

Приложение 5. Алфавитный перечень функций языка AutoLISP 491

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

dictsearch

dimx_tile

dimy_tile

distance

distof

done_dialog

end_image

end_list

entdel

entget

entlast

entmake

entmakex

entmod

entnext

entsel

entupd

eq

equal

*error*

eval

exit

exp

expand

Поиск в словаре

Горизонтальный размер поля

Вертикальный размер поля

Расстояние

Перевод строки в вещественноепредставление

Закрытие диалогового окна

Конец операции над графическойкнопкой

Конец операции над раскрываю-щимся списком

Удаление (восстановление)примитива

Получение списка примитива

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

Создание примитива

Создание примитива илинеграфического объекта

Изменение примитива

Переход к следующему примитиву(подпримитиву)

Выбор объекта с указываемой точкой

Перерисовка измененногопримитива

Равенство объектов

Равенство с допуском

Обработка ошибок

Вычисление списка как функции

Выход

Вычисление е в степени х

Расширение памяти

2.15.3

5.6.6

5.6.7

2.6.7

2.7.9

5.2.5

5.6.2

5.5.3

2.12.4

2.12.5

2.12.1

2.12.6

2.12.7

2.12.8

2.12.2

2.12.3

2.12.9

2.5.22

2.5.23

2.16.11

2.9.16

2.16.9

2.6.12

2.17.4

Page 493: Visual LISP и секреты адаптации AutoCAD

492 Visual LISP и секреты адаптации AutoCAD

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

expt

fill_image

findfile

fix

float

foreach

function

gc

gcd

get_attr

get_tile

getangle

getcfg

getcname

getcorner

getdist

getenv

getfiled

getint

getkword

getorient

getpoint

getreal

getstring

Возведение в степень 2.6.13

Заполнение графической кнопки 5.6.3

Поиск файла 2.11.1

Усечение вещественного числа 2.6.1до целого

Преобразование числа в вещест- 2.7.2венное

Применение операции к элементамсписка

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

Сборка мусора

Наибольший общий делитель

Значение атрибута, заданное полюдиалогового окна в DCL-файле

Текущее значение атрибутадиалогового окна

Ввод угла

Извлечение параметровприложения

Получение синонимов имен команд

Ввод точки с рамкой

Ввод расстояния

Значение переменной окружения

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

Ввод целого числа

Ввод опции из списка

Ввод угла

Ввод точки

Ввод вещественного числа

Ввод строки

2.9.15

2.16.7

2.17.5

2.6.5

5.4.5

5.4.4

2.10.6

2.10.15

2.10.17

2.10.9

2.10.5

2.10.13

2.10.18

2.10.3

2.10.2

2.10.7

2.10.8

2.10.4

2.10.10

Page 494: Visual LISP и секреты адаптации AutoCAD

Приложение 5. Алфавитный перечень функций языка AutoLISP 493

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

getvar

graphscr

grclear

grdraw

grread

grtext

grvecs

handent

help

if

initdia

initget

inters

itoa

lambda

last

layoutlist

length

list

listp

load

load_dialog

log

logand

logior

Значение системной переменной 2.10.11

Переход в графический экран 2.18.3

Очистка видового экрана 2.18.9

Рисование вектора 2.18.7

Чтение данных через произвольное 2.18.10устройство ввода

Запись в пункт меню или зону гра- 2.18.6фического экрана

Рисование множества векторов

Имя примитива, соответствующееметке

Вызов раздела справки

Условный оператор

Управление диалоговым окномследующей команды

Установка опций функций ввода

Пересечение отрезков

Преобразование целого числав символьное представление

Описание локальной функции

Извлечение последнего элементасписка

Перечень листов файла рисунка

Длина списка

Формирование списка

Проверка на список

Загрузка файла с функциями

Загрузка DCL-файла

Натуральный логарифм

Побитовое логическое И

Побитовое логическое ИЛИ

2.18.8

2.12.10

6.1.3

2.5.11

2.18.11

2.10.1

2.6.19

2.7.3

2.16.1

2.9.19

2.15.8

2.9.20

2.9.1

2.5.17

2.2.4

5.2.1

2.6.14

2.6.15

2.6.16

Page 495: Visual LISP и секреты адаптации AutoCAD

494 Visual LISP и секреты адаптации AutoCAD

Таблица П5.1 (продолжение)

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

Побитовый сдвиг

Применение функции к каждомуэлементу списка

Максимум

Параметры памяти

Проверка на вхождение в список

Операция с пунктом меню

Операция с группой меню

Минимум

Проверка на отрицательность

Переключение режима полядиалогового окна

Имя основного словаря неграфиче-ских данных

Доступ к данным сложного объектас запросом

Доступ к данным сложного объектабез запроса

Вызов диалогового окна

Логическое отрицание

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

Проверка на n i l

Проверка на число

Открытие файла

Логическое ИЛИ

Изменение режима объектнойпривязки

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

Вывод

Вывод

Номерраздела

2.6.17

2.9.13

2.6.3

2.17.2

2.9.10

4.3.2

4.3.1

2.6.4

2.5.14

5.4.2

2.15.2

2.12.11

2.12.12

5.2.3

2.5.9

2.9.3

2.5.10

2.5.16

2.11.2

2.5.8

2.18.1

2.6.20

2.11.7

2.11.6

lsh

mapcar

max

mem

member

menucmd

menugroup

min

minusp

mode_tile

namedobjdict

nentsel

nentselp

new_dialog

not

nth

nul l

numberp

open

or

osnap

polar

p r i n l

princ

Page 496: Visual LISP и секреты адаптации AutoCAD

Приложение

Функция

5. Алфавитныйперечень функции языка AutoLISP

Таблица

Назначение

П5.1

495

(продолжение)

Номерраздела

print

progn

prompt

quit

quote

read

read-char

read-line

redraw

regapp

rem

repeat

reverse

rtos

set

set_tile

setcfg

setenv

setfunhelp

setq

setvar

setview

sin

Вывод

Программная скобкадля функции if

Сообщение

Выход

Цитирование (обращение к спискуне как к функции)

Чтение из строки

Чтение символа с клавиатуры

Чтение строки из файла

Перерисовка примитивов

Регистрация приложения

Остаток от деления

Цикл с заданным количествомповторений

Переворот списка

Преобразование вещественногочисла в символьное представление

Присвоение значения через адрессимвола

Задание значения переменнойдиалогового окна

Запись данных приложения

Задание переменной окружения

Регистрация справочной команды

Поисвоение значения СИМВОЛУ

2.11.8

2.5.12

2.11.11

2.16.10

2.9.17

2.8.3

2.11.9

2.11.4

2.18.2

2.14.2

2.6.2

2.5.25

2.9.4

2.7.4

2.6.24

5.4.3

2.10.16

2.10.14

6.4.1

2.1.2AutoLISP

Присвоение значения системной 2.10.12переменной AutoCAD

Установка вида в видовом экране 2.13.6

Синус 2.6.9

Page 497: Visual LISP и секреты адаптации AutoCAD

496 Visual LISP и секреты адаптации AutoCAD

Таблица /75.7 (продолжение)

Функция Назначение Номерраздела

slide_image

snvalid

sqrt

ssadd

ssdel

ssget

ssgetfirst

sslength

ssmemb

ssname

ssnamex

sssetfirst

startapp

start_dialog

start_image

start_list

strcase

strcat

strlen

subst

substr

tablet

tblnext

Заполнение графической кнопкислайдом

Проверка имени таблицы символов

Квадратный корень

Добавление объекта в набор выбора

Удаление объекта из набора

Формирование набора по запросуили признаку

Определение выбранных объектов

Количество элементов в наборе

Проверка на принадлежность объ-екта к набору

Извлечение объекта из набора

Информация о способе созданиянабора

Включение ручек у объектов

Запуск приложения

Запуск диалогового окна загружен-ного DCL-файла

Начало операции с графическойкнопкой

Начало операции над оасксываю-

5.6.4

2.13.7

2.6.8

2.12.15

2.12.16

2.12.14

2.12.22

2.12.17

2.12.18

2.12.19

2.12.20

2.12.21

6.1.5

5.2.4

5.6.1

5.5.1щимся списком

Преобразование регистра в строке 2.8.4символов

Конкатенация (сцепление) строк 2.8.5

Длина строки 2.8.6

Замена элемента в списке 2.9.18

Извлечение подстроки 2.8.7

Работа с планшетом 2.18.12

Переход к следующему символу 2.13.3в таблице

Page 498: Visual LISP и секреты адаптации AutoCAD

Приложение 5.

Функция

Алфавитныйперечень функций языка AutoLISP

Таблица П5.1

Назначение

497

(продолжение)

Номерраздела

tblobjname

tblsearch

term_dialog

terpri

textbox

textpage

textscr

trace

trans

type

unload_dialog

untrace

vector_image

ver

vl-acad-defun

vl-acad-undefun

vl-arx-import

vl-bb-ref

vl-bb-set

vl-catch-all-apply

Поиск объекта в таблице символов 2.13.4

Поиск символа в таблице 2.13.2

Принудительное завершение 5.2.6

(закрытие) диалогового окна

Перевод курсора на новую строку 2.11.13

Вычисление ограничивающего 2.6.21

прямоугольника для надписи

Переключение в текстовый экран 2.18.5

Переход в текстовое окно 2.18.4

Начало трассировки 2.16.17Преобразование точки в другую 2.7.10систему координат

Определение типа символа 2.7.1

Выгрузка DCL-файла 5.2.2

Окончание трассировки 2.16.18

Рисование отрезка внутри 5.6.5

графического поля

Определение версии AutoLISP 2.17.1

Переопределение функции 2.16.12как внешнего приложенияОтмена переопределения функции 2.16.13как внешнего приложения

Импорт приложения в именное 2.17.15пространство VLX-приложения

Возврат значения переменной 2.17.26из внедокументного именногопространства

Задание значения переменной 2.17.25из внедокументного именногопространства

Выполнение функции с каждым 2.9.32элементом списка

vl-catch-all-error-message Возврат сообщения об ошибке 2.9.33

Page 499: Visual LISP и секреты адаптации AutoCAD

498 Visual LISP и секреты адаптации AutoCAD

Функция

v l - c a t c h - a l l - e r r o r - p

vl-cmdf

vl-consp

v l - d i r e c t o r y - f i l e s

Таблица П5.1

Назначение

Проверка, является ли аргументошибочным

Передача команды или опциив командную строку

Проверка списка на n i l

Получение списка имен файлов

(продолжение)

Номерраздела

2.9.34

2.3.2

2.5.18

2.11.14

vl-doc-export

vl-doc-import

vl-doc-ref

vl-doc-set

vl-every

vl-exit-with-error

vl-exit-with-value

vl-file-copy

vl-file-delete

vl-file-directory-p

vl-file-rename

vl-file-size

vl-file-systime

папки

Экспорт функции из пространства 2.17.16имен VLX-приложения в текущийдокумент

Импорт экспортированной 2.17.17функции в именное пространствоVLX-приложения

Передача значения переменной 2.17.28из именного пространства текущегодокумента

Задание значения переменной 2.17.27из именного пространства текущегодокумента

Проверка истинности условия 2.9.14с первым, вторым и т. д. элемента-ми каждого из списков-аргументов

Передача управления функции 2.16.14*error*

Возврат значения функции, которая 2.16.15вызвана из другого пространстваимен

Копирование или присоединение 2.11.15содержимого одного файлак другому

Удаление файла 2.11.16

Проверка, содержит ли имя файла 2.11.17путь

Переименование файла 2.11.18

Размер файла в байтах 2.11.19

Дата последнего изменения файла 2.11.20

Page 500: Visual LISP и секреты адаптации AutoCAD

Приложение 5. Алфавитный перечень функций языка AutoLISP 499

Функция

vl-f i lename-base

v l - f i l e n a m e - d i r e c t o r y

v l- f i lename-extension

vl-filename-mktemp

vl-get-resource

v l - l i s t *

v l - l i s t - > s t r i n g

v l - l i s t - e x p o r t e d - f u n c t i o n s

v l - l i s t - l e n g t h

v l - l i s t - l o a d e d - v l x

Таблица /75.1 (продолжение)

Назначение

Выделение имени файла без путии расширения

Выделение пути, если он входитв имя файла

Выделение расширения из именифайла

Уникальное имя для временногофайла

Извлечение содержимоготекстового файла, включенногов VLX-приложение

Построение списка

Построение строки по кодамвходящих в нее буквенно-цифровыхзнаков

Список экспортированных функций

Длина списка

Список всех связанных с данным

Номерраздела

2.11.21

2.11.22

2.11.23

2.11.24

2.17.22

2,9.9

2.8.10

2.17.18

2.9.22

2.17.19

vl-load-all

vl-load-com

vl-load-reactors

vl-member-if

vl-member-if-not

vl-position

vl-prinl-to-string

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

Загрузка файла во все ранее 2.17.29открытые документы и во вседокументы, которые будут открытыв данном сеансе AutoCAD

Загрузка дополнительных функций 7.1.2Visual LISP в AutoLISP

Загрузка функций, 7.8.1поддерживающих реакторы

Проверка истинности условия хотя 2.9.23бы с одним элементом списка

Проверка на n i l условия хотя бы 2.9.24с одним элементом списка

Номер символа как элемента 2.9.25поданного списка

Вывод данных в строку аналогично 2.11.26функции p r i n l

Page 501: Visual LISP и секреты адаптации AutoCAD

500 Visual LISP и секреты адаптации AutoCAD

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

vl-princ-to-string

vl-propagate

vl-registry-delete

vl-registry-descendents

vl-registry-read

vl-registry-write

vl-remove

vl-remove-if

vl-remove-if-not

vl-some

vl-sort

vl-sort-i

vl-string->list

vl-string-elt

vl-string-left-trim

Вывод данных в строку аналогично 2.11.25функции p r i n c

Передача значения переменной 2.17.30во все ранее открытые документыи во все документы, которые будутоткрыты в данном сеансе AutoCAD

Удаление значения из реестра 2.17.8Windows

Список подразделов или парамет- 2.17.9ров из указанного раздела реестраWindows

Чтение данных из раздела реестра 2.17.6Windows

Создание раздела в реестре 2.17.7Windows

Удаление элемента из списка 2.9.26

Выделение элементов списка, не 2.9.27удовлетворяющих проверяемомуусловию

Выделение элементов списка, 2.9.28удовлетворяющих проверяемомуусловию

Проверка выполнения условия, 2.9.29применяемого к последовательнопередаваемым элементамисписков-аргументов

Сортировка элементов списка 2.9.30

Сортировка элементов списка 2.9.31с возвратом номеров в новом списке

Преобразование строки 2.8.9буквенно-цифровых знаковв список с кодами знаков

Получение кода по действующей 2.8.11таблице для символа с номеромв строке

Удаление символов из начала 2.8.12строки

Page 502: Visual LISP и секреты адаптации AutoCAD

Приложение 5.

Функция

Алфавитныйперечень функций языка

Назначение

AutoUSP

Таблица П5.1

501

(продолжение)

Номерраздела

vl-st r ing-mismatch

vl-string-position

vl-string-right-trim

vl-string-search

vl-string-subst

vl-string-translate

vi-string-trim

vl-symbol-name

vl-symbol-value

vl-symbolp

vl-unload-vlx

Вычисление длины общего 2.8.15префикса для двух строк, начинаяс некоторой позиции

Поиск символа с заданным кодом 2.8.16в строке

Удаление символов из конца строки 2.8.13

Поиск заданного образца внутри 2.8.17строки

Замена внутри строки одного 2.8.18шаблона на другой

Замена символов в строке 2.8.19по закону

Удаление символов из начала 2.8.14

и конца строки

Возврат имени символа как строки 2.8.20

Возврат значения символа 2.6.23

Проверка, является ли объект 2.5.20символомВыгрузка VLX-приложения, 2.17.21загруженного в свое пространство

vl-vbaload

vl-vbarun

vl-vlx-loaded-p

vla-get-activedocument

vla-get-modelspace

vla-get-paperspace

vlax-3D-point

vlax-add-cmd

vlax-create-object

vlax-curve-getArea

vlax-curve-getClosestPointTo

Загрузка проекта VBA

Выполнение VBA-макроса

Проверка, загружено лиVLX-приложение

Указатель активного документа

Указатель пространства модели

Указатель пространства листа

Создание точки-варианта

Добавление команды AutoCAD

Создание VLA-объекта

Площадь VLA-объекта

Вычисление точки, лежащейна кривой и ближайшей к заданнойточке

2.17.23

2.17.24

2.17.20'

7.1.5

7.1.6

7.1.7

7.1.19

7.2.1

7.3.8

7.7.1

7.7.15

Page 503: Visual LISP и секреты адаптации AutoCAD

502 Visual LISP и секреты адаптации AutoCAD

Таблица /75.1 (продолжение)

Функция Назначение Номерраздела

vlax-curve-getClosestPointToProjection

Вычисление ближайшей точкина кривой после проектированиякривой на плоскость

7.7.16

vlax-curve-getDistAtParam

vlax-curve-getDistAtPoint

vlax-curve-getEndParam

vlax-curve-getEndPoint

v l a x - c u r v e - g e t F i r s t D e r i v

v l ax-curve-get ParainAtDist

vlax-curve-getParamAtPoint

v lax-curve-getPointAtDist

vlax-curve-getPointAtParam

vlax-curve-getSecondDeriv

vlax-curve-getStartParam

vlax-curve-getStartPoint

vlax-curve-isClosed

v l a x - c u r v e - i s P e r i o d i c

v lax-curve- isPlanar

vlax-dump-object

Длина кривой от начальной точкидо точки, заданной параметром

Длина кривой от начальнойдо указанной точки

Значение параметра конечнойточки кривой

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

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

Значение параметра на заданномрасстоянии от начальной точкикривой

Значение параметра в точкекривой

Вычисление точки, находящейсяна заданном расстоянииот начальной точки кривой

Вычисление точки, лежащейна кривой, с заданным значениемпараметра

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

Начальное значение параметрана кривой

Вычисление начальной точкикривой

Проверка замкнутости кривой

Проверка периодичности кривойкак функции параметра

Проверка планарности кривой

Вывод свойств объекта, а такжеметодов, применяемых к нему

7.7.11

7.7.5

7.7.7

7.7.3

7.7.17

7.7.10

7.7.8

7.7.4

7.7.9

7.7.18

7.7.6

7.7.2

7.7.12

7.7.13

7.7.14

7.1.25

Page 504: Visual LISP и секреты адаптации AutoCAD

Приложение 5. Алфавитный перечень функций языка AutoLISP 503

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

vlax-ename->vla-object

vlax-erased-p

vlax-for

vlax-get-acad-object

vlax-get-obj ect

vlax-get-or-create-object

vlax-get-property

vlax-import-type-library

vlax-invoke-method

vlax-ldata-delete

vlax-ldata-get

vlax-ldata-list

vlax-ldata-put

vlax-ldata-test

vlax-make-safearray

vlax-make-variant

vlax-map-collection

vlax-method-applicable-p

vlax-object-released-p

vlax-product-key

Преобразование примитива 7.1.11в VLA-объект

Проверка, удален ли VLA-объект 7.3.1

Вычисление выражения с каждым 7.3.13объектом из семейства

Вычисление указателя на корневой 7.1.4объект A p p l i c a t i o n

Вычисление текущего вхождения 7.3.9объекта

Вычисление текущего вхождения 7.3.10объекта приложения или созданиенового

Извлечение свойства VLA-объекта 7.6.1

Импорт информации из библиотеки 7.3.11типов

Вызов метода ActiveX 7.2.3

Удаление LlSP-данных из словаря 7.4.4

Извлечение LlSP-данных из слова- 7.4.2ря или объекта

Вывод LlSP-данных словаря 7.4.3

Запись LlSP-данных в словарь или 7.4.1объект

Проверка возможности сохранения 7.4.5LlSP-данных

Создание безопасного массива 7.1.21

Создание варианта 7.1.15

Применение функции ко всем 7.3.12объектам семейства

Проверка поддержки объектом 7.3.2метода

Проверка, освобожден ли объект 7.3.4в графической базе

Путь к разделу AutoCAD 7.2.4в системном реестре Windows

Page 505: Visual LISP и секреты адаптации AutoCAD

504 Visual LISP и секреты адаптации AutoCAD

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

vlax-property-available-p

vlax-put-property

vlax-read-enabled-p

vlax-release-6bject

vlax-remove-cmd

vlax-safearray-fill

vlax-safearray-get-dim

vlax-safearray-get-element

vlax-safearray-get-1-bound

vlax-safearray-get-u-bound

vlax-safearray-put-element

vlax-safearray-type

vlax-safearray->list

vlax-tmatrix

vlax-typeinfo-available-p

vlax-variant-change-type

vlax-variant-type

vlax-variant-value

vlax-vla-obj ect->ename

vlax-write-enabled-p

vlisp-compile

vlr-acdb-reactor

Проверка наличия у объекта 7.6.3требуемого свойства

Присвоение свойства VLA-объекту 7.6.2

Проверка читаемости объекта 7.3.6

Освобождение объекта 7.3.5

Удаление команды или группы 7.2.2команд

Сохранение данных в массиве 7.1.23

Получение размерности массива 7.5.2

Чтение элемента массива 7.5.4

Нижняя граница массива 7.5.2

Верхняя граница массива 7.5.3

Присвоение значений элементам 7.1.22массива

Определение типа данных массива 7.5.5

Вывод массива в список 7.5.6

Представление матрицы преобра- 7.5.7зования типа 4x4, используемойв операциях ActiveX

Проверка наличия информации 7.3.3из библиотеки типов

Значение варианта после смены 7.1.18типа данных

Тип данных варианта 7.1.16

Значение варианта 7.1.17

Преобразование VLA-объекта 7.1.12в примитив AutoCAD

Проверка возможности изменения 7.3.7объекта

Компиляция LSP-файла 2.16.8в FAS-файл

Создание реактора операций 7.8.10с базой рисунка

Page 506: Visual LISP и секреты адаптации AutoCAD

Приложение

Функция

5. Алфавитныйперечень функций языка AutoLISP

Таблица

Назначение

П5.1

505

(продолжение)

Номерраздела

vlr-add

vlr-added-p

vlr-beep-reaction

vlr-command-reactor

vlr-current-reaction-name

vlr-data

vlr-data-set

vlr-deepclone-reactor

vlr-docmanager-reactor

vlr-dwg-reactor

vlr-dxf-reactor

vlr-editor-reactor

vlr-insert-reactor

vlr-linker-reactor

vlr-lisp-reactor

vlr-miscellaneous-reactor

vlr-mouse-reactor

vlr-notification

vlr-object-reactor

vlr-owner-add

Восстановление отключенного 7.8.34

реактора

Проверка включения реактора 7.8.35

Выдача звукового сигнала 7.8.7

Создание реактора команд 7.8.15

Имя события, вызвавшего реактор 7.8.36Получение данных приложения, 7.8.37связанных с реактором

Перезапись данных приложения, 7.8.38связанных с реактором

Создание реактора для операций 7.8.16клонирования объектов

Создание реактора рисунков 7.8.11как документов

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

Создание реактора, связанного 7.8.18с чтением или записью DXF-файлов

Создание реактора редактирования 7.8.14

Создание реактора операций 7.8.19вставки блоков

Создание реактора операций за- 7.8.12грузки/выгрузки ARX-приложений

Создание реактора ввода 7.8.20

LISP-выражений

Создание реактора прочих событий 7.8.21

Создание реактора операций 7.8.22с мышьюПроверка активности реактора 7.8.42в зависимости от пространства имен

Создание реактора объектов 7.8.13

Добавление объекта к списку 7.8.39владельцев реактора объектов

Page 507: Visual LISP и секреты адаптации AutoCAD

506 Visual LISP и секреты адаптации AutoCAD

Таблица П5.1 (продолжение)

Функция Назначение Номерраздела

vir-owner-remove

vlr-owners

vlr-pers

vlr-pers-list

vlr-pers-p

vlr-pers-release

vlr-reaction-names

vlr-reaction-set

vlr-reactions

vlr-reactors

vlr-remove

vlr-remove-all

vlr-set-notification

vlr-sysvar-reactor

vlr-toolbar-reactor

vlr-trace-reaction

vlr-type

vlr-types

Удаление объекта из списка 7.8.40владельцев реактора объектов

Получение списка владельцев 7.8.41реактора объектов

Перевод реактора в постоянный 7.8.45режим

Получение списка постоянных 7.8.48реакторов

Проверка постоянности режима 7.8.47реактора

Перевод реактора во временный 7.8.46режим

Список всех возможных событий 7.8.6для данного типа реакторов

Добавление функций к реактору 7.8.29

Список точечных пар событий 7.8.31

и действий

Список существующих реакторов 7.8.3

Отключение реактора 7.8.32Отключение реакторов 7.8.33определенного типа

Задание режима работы реактора, 7.8.43если его именное пространствоне активно

Создание реактора, связанного 7.8.23с изменением значения системнойпеременной

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

Вывод аргументов реактора в окно 7.8.8Трассировка (Trace)

Тип реактора 7.8.4

Список всех типов реакторов 7.8.2

Page 508: Visual LISP и секреты адаптации AutoCAD

Приложение 5.

Функция

Алфавитныйперечень функций языка AutoLISP

Таблица П5.1

Назначение

507

(окончание)

Номерраздела

vlr-undo-reactor

vlr-wblock-reactor

vlr-window-reactor

vlr-xref-reactor

vports

wcmatch

while

write-char

write-line

xdroom

xdsize

zerop

Создание реактора, связанного 7.8.25с отменой действий

Создание реактора, связанного 7.8.26с командой ПБЛОК (WBLOCK)

Создание реактора, связанного 7.8.27с операциями изменения размеровокна AutoCAD

Создание реактора, связанного 7.8.28с операциями над внешнимиссылками

Параметры текущей конфигурации 2.6.22видовых экранов

Сравнение с образцом 2.8.8

Цикл по условию 2.5.24

Вывод символа 2.11.10

Вывод строки 2.11.5

Определение размера свободной 2.14.5памяти зоны расширенных данных

Определение размера памяти, 2.14.4необходимого для добавлениярасширенных данных

Проверка на нуль 2.5.15

В табл. П5.1 не включены функции с префиксами via-, via-get- и via-put-:

• функции вызова методов ActiveX (например, функция via-addLine вызы-вает метод AddLine);

О функции извлечения свойства объекта (например, via-get-Layer извлека-ет имя слоя);

П функции изменения свойства объекта (например, via-put-Layer изменяетимя слоя).

Эти функции работают с VLA-объектами.

Page 509: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 6

Функция ending

Полезная сама по себе функция ending является также примером использо-вания стандартных функций rem, if, and, or.

! Листинг П6.1. Функция ending

1

**** Согласование окончания слова с числительным. ****

**** © Н.Н.Полещук, 1999 г. ****

**** Глобальных переменных нет. ****

**** Аргументы: ****

**** rnm - числительное; ****

**** si - строка-окончание для mm=l,21,31, ...; ****

**** s2 - строка-окончание для mm=2, 3,4,22, 23,24, 32, 33,34, ...; ****

**** s3 - строка-окончание для других mm. ****

**** Локальные переменные: ****

**** nunm - остаток от (abs mm)/100; ****

**** ml - остаток от mmm/10; ****

**** let - согласованное окончание. ****

**** Возвращаемое значение: ****

**** согласованное окончание (let). ****

(defun ending (mm si s2 s3 / mmm ml let)

(setq

let s3

mmm (rem (abs mm) 100)

ml (rem mmm 10)

) ;• setq

(if

(and

(= ml 1)

Page 510: Visual LISP и секреты адаптации AutoCAD

Приложение 6. Функция ending 509

( o r (= mmm 1) (>= mmm 2 1 ) )

) ; a n d

(setq let si)); конец if(if(and

(>= ml 2)(<= ml 4)

(or (<= mmm 4)(>= mmm 22))) ; and

(setq let s2)) ; if

; возврат let

let); defun

Алгоритм программы основан на следующем наблюдении. Во-первых, тыся-чи и более старшие разряды не оказывают влияния на окончание — поэтомуможно вместо mm анализировать mmm, остаток от деления mm на 100 (т. е. (remmm 100)). Во-вторых, окончания слов (существительных, прилагательных,глаголов), согласуемых с числительным, можно разделить на три группы:

• mmm= 1, 21, 31, 41, ..., 91 (на конце 1, но И исключается);

• mmm = 2, 3, 4, 22, 23, 24, 32, 33, 34, ..., 92, 93, 94 (на конце 2, 3 или 4, ноисключаются 12, 13 и 14);

П mmm = 0, 5, 6, 7, 8, 9, 10, 25, 26, ..., 95, 96, 97, 98, 99 (на конце 0, 5, 6, 7, 8,9), а также mmm = 11, 12, 13.

Например, пусть в предложении "Летят 3 красных кленовых листочка" нуж-но заменять числительное 3 на другое, значение которого будет вычислено изанесено в переменную пп. Соответствующую фразу можно сформировать спомощью функции ending таким образом:(s t rcat "Лет" (ending nn "ит" "ят" "ят") " " ( itoa nn) " краен"

(ending nn "ый" "ых" "ых") " кленов" (ending nn "ый" "ых" "ых")" листом" (ending nn "ек" "ка" "ков")

)

При пп=1 получим: "Летит 1 красный кленовый листочек", при пп=14 —"Летят 14 красных кленовых листочков", При пп—1002 — "Летят 1002 красныхкленовых листочка".

Page 511: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 7

Функция divpts

Функция divpts демонстрирует вызов команды AutoCAD ПОДЕЛИТЬ(DIVIDE) с помощью функции command, а также работу функций entsei,entlast, entnext, entget, assoc, trans, entdel, alert.

i Листинг П7.1. Функция divpts I

**** Деление указываемого примитива на частике помощью команды ****

**** ПОДЕЛИТЬ (DIVIDE) и чтение полученных точек, с переводом их ****

**** в МСК. ****

**** ©Л.Р.Свиридова, 1999 г. ****

**** Глобальных переменных нет. ****

**** Аргументы: ****

**** kols - количество сегментов для команды ПОДЕЛИТЬ. ****

**** Локальные переменные: ****

**** spit - список с трехмерными точками деления примитива; ****

**** sp - список, получаемый функцией entsei для подачи команде ****

**** ПОДЕЛИТЬ; ****

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

**** до вьшолнения команды ПОДЕЛИТЬ; , ****

**** els - имя текущего примитива (подпримитива) в цикле; ****

**** list els - список с данными примитива els; ****

**** koor - читаемая точка типа "POINT". ****

**** Возвращаемое значение: ****

**** список с трехмерными координатами точек (spit). ****

(defun divpts (kols / spit sp elast els list_els koor)

(setq spit ' О ) ; список, в котором будут накапливаться точки

Page 512: Visual LISP и секреты адаптации AutoCAD

Приложение 7. Функция divpts 511

; Проверка на входе правильности количества сегментов

(if (< kols 2)

(progn

(alert "Количество сегментов не должно быть меньше 2")

(princ); тихий выход

); progn

(progn

(setq sp nil)

; Выбор примитива в цикле (повтор, пока примитив не будет указан)

(while (null sp)

(setq sp (entsel

(strcat

"ЧпУкажите примитив, который нужно разделить на "

(itoa kols)

" частей: "

); strcat

)); entsel, setq

); while

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

(setq elast (entlast))

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

; могут быть подпримитивы (например, "VERTEX")

; Найти последний подпримитив

(while (setq els (entnext elast))

(setq elast els)

); while

; Деление примитива точками командой ПОДЕЛИТЬ (DIVIDE)

(command "_DIVIDE" sp (itoa kols))

; Выбор новых примитивов (типа "POINT"),

; образовавшихся после выполнения команды ПОДЕЛИТЬ (DIVIDE)

(setq els elast)

(while (setq els (entnext els))

(setq list_els (entget els))

(setq koor (cdr (assoc 10 list_els))); список из З координат

; Преобразование координат точки koor в мировую систему координат

(setq koor (trans koor els 0))

; Добавление координат точки в список spit

(setq spit (append spit (list koor)))

; Удаление примитива "POINT"

(entdel els)

); while

Page 513: Visual LISP и секреты адаптации AutoCAD

512 Visual LISP и секреты адаптации AutoCAD

; Возвращаемое значение - spit

spit

); progn

);if

);defun divpts

Функция divpts сначала запрашивает объект, который нужно разделить точ-ками типа "POINT" на заданное количество сегментов. Затем по командеПОДЕЛИТЬ (DIVIDE) строятся точки с теми установками системных пере-менных PDSIZE и PDMODE, которые действуют в текущем рисунке, и чи-таются координаты точек. Координаты пересчитываются в мировую систе-му. По окончании построенные точки удаляются из рисунка, и возвращает-ся список с элементами в виде списков из трех координат точек, которымиобъект был разделен.

Например, если в рисунке построена дуга по трем точкам: (150 27.88),(233.5 Ю5.8) и (64.03 71.519), то для нее выражение (divpts 5) вернет

СПИСОК ( { 2 2 5 . 2 5 4 7 9 . 3 2 0 8 0 . 0 ) ( 2 1 9 . 3 3 8 1 7 0 . 2 8 4 0 . 0 ) ( 1 3 8 . 0 5 5 2 1 1 . 5 4 4 0 . 0 )

( 6 1 . 1 3 5 4 1 6 2 . 6 2 9 0 . 0 ) ) .

Page 514: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 8

Функция strcaser

Функция strcaser показывает, как работать с буквенно-цифровыми симво-лами И Строками (ИСПОЛЬЗУЮТСЯ функции ascii, chr, substr, strlen, strcase,strcat). Кроме того, функция полезна, если аналогичная функция strcaseнеправильно работает с русскими буквами.

| Листинг П8.1. Функция strcaser |

. * * -к к

.кккк

.кккк

. ****

. ***к

. -kic-kk

. к-ккк

. кккк

. + к к-к

.к-ккк

. к-ккк

.к-ккк

. кккк

. кккк

.кккк

.кккк

Преобразование строки, содержащей русские буквы, в верхний

или нижний регистр.© Н.Н.Полещук, 2000 г.

Глобальных переменных нет.

Аргументы:

str - преобразуемая строка;

рг - признак преобразования (nil - в верхний регистр,Т - в нижний регистр).

Локальные переменные:strn - преобразованная строка;lens - длина строки str;i - счетчик цикла по количеству букв str;sy - текущий символ строки;

as - код символа sy.Возвращаемое значение:преобразованная строка (strn).

•к-к-к-к

* * * * •

•к-к-к -к

к-к-к-к

•к-к-к-к

•к-к -к*

•к-к-к-к

Че-к-к *

•к -к -к-к

•к-к-к-к

-к -к-к к

•к-к-к-к

к к-к-к

• * • * • * • *

* * • * • +

* * * *

(defun strcaser (str pr / strn lens i sy as)(setq strn "" lens (strlen str))(if (> lens 0)

(progn(setq i 0)

17 Зак 155

Page 515: Visual LISP и секреты адаптации AutoCAD

514 Visual LISP и секреты адаптации AutoCAD

(while (< i lens)

(setq i (1+ i) sy (substr str i 1) as (ascii sy))

; Преобразование символа sy (дополнительная проверка русских букв)(setq sy(if pr

; Перевод в нижний регистр(if (and (>= as 192) (<= as 223)); А-Я(chr (+ as 32))(strcase sy pr)

); if 192-223; Перевод в верхний регистр

(if (and (>= as 224) (<= as 255)); а-я(chr (- as 32)) . •

(strcase sy pr)); if 224-255

); if pr); setq sy(setq strn (strcat strn sy))

); while); progn

); if lens; возврат strnstrn

); defun

Программа перебирает строку s t r по одному символу (sy). Если символ syявляется русской буквой (имеет код 192—223 или 224—255), то, в зависимо-сти от признака pr, sy заменяется на соответствующий русский символверхнего или нижнего регистра. Результат посимвольно накапливается в пе-ременной strn.

Page 516: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 9

Функция тарко

Функция mapko показывает, как создавать наборы с помощью функцииssget (на примере выбора объектов секущей рамкой с фильтром), а такжеработу функций command, ssnarae, sslength, while, getvar И команд ОТМЕНИ(UNDO), СЛОЙ (LAYER), СТЕРЕТЬ (ERASE), РАСЧЛЕНИТЬ(EXPLODE), ПЛОЩАДЬ (AREA).

i Листинг П9.1. Функция mapko j

**** На плоскости внутри прямоугольника расставлены блоки плоских ****

**** деталей (вхождения блоков находятся на слое DET). Каждая из ****

**** деталей имеет замкнутый внешний контур, являющийся примити- ****

**** вом типа POLYLINE на слое CONTOUR, и может иметь замкнутые ****

**** внутренние вырезы, являющиеся примитивами типа POLYLINE на ****

**** слое HOLE. Оси прямоугольника параллельны осям X и Y текущей ****

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

**** координаты (0,0). Координаты верхнего правого угла прямо- ****

**** угольника (т. е. его длина и ширина) находятся в системных - ****

**** переменных USERR2 и USERR3. ****

**** Нужно включить слои CONTOUR и HOLE (они могут оказаться вы- ****

**** ключенными), удалить из этих слоев все ранее находившиеся ****

**** Там примитивы типа POLYLINE, затем расчленить блоки всех де- ****

**** талей на слое DET и подсчитать коэффицент полезного исполь- ****

**** эования площади прямоугольника. Предполагается, что детали ****

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

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

**** После вычислений следует восстановить текущий рисунок в пер- ****

**** воначальном виде. ****

**** © Н.Г.Карпушкина, 2000 г. ****

**** Глобальных переменных нет. +***

**** Аргументов нет. ****

п*

Page 517: Visual LISP и секреты адаптации AutoCAD

516 Visual LISP и секреты адаптации AutoCAD

**** Локальные переменные: ****

**** pll,pl2 - размеры прямоугольника; • ****

**** sscon - набор из примитивов типа POLYLINE на слое CONTOUR; ****

**** sshol - набор из примитивов типа POLYLINE на слое HOLE; ****

**** ssins - набор из примитивов типа INSERT (вхождения блоков);****

**** lss - количество элементов в наборах sscon и sshol; ****

**** j_ _ счетчик цикла при переборе элементов набора; ****

**** агсоп - общая площадь внешних контуров; ****

**** arhol - общая площадь внутренних вырезов; ****

**** artot - площадь деталей без вырезов. ****

**** Возвращаемое значение: ****

**** коэффициент использования площади прямоугольника.' ****

(defun mapko ( / pll pl2 sscon sshol ssins lss i arcon arhol artot)

Читаем размеры прямоугольника из системных переменных USERR2, USERR3

(setq pll (getvar "USERR2") р12 (getvar "USERR3"))

Устанавливаем метку команды ОТМЕНИТЬ (UNDO) для того, чтобы

восстановить текущий рисунок

(command "JJNDO" "_M")

Включаем слои CONTOUR и HOLE

(command "_LAYER" "_0N" "CONTOUR,HOLE" "")

Выбираем в зоне прямоугольника вое примитивы типа POLYLINE

на слоях CONTOUR и HOLE и удаляем их командой СТЕРЕТЬ (ERASE)

(if

(setq sscon

(ssget "_C"1(0.0 0.0) (list pll pl2)

'((0 . "POLYLINE") (8 . "CONTOUR"))

); ssget

)

(command "_ERASE" sscon "")

);if

(if

(setq sshol

(ssget "_C"1 (0,0 0.0) (list pll pl2)

'((0 . "POLYLINE") (8 . "HOLE"))

); ssget

)

(command "_ERASE" sshol "")

);if

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

и раскладываем их командой РАСЧЛЕНИТЬ (EXPLODE)

Page 518: Visual LISP и секреты адаптации AutoCAD

Приложение 9. Функция mapko 517

(if(setq ssins

(ssget "_C"1 (0..0 0.0) (list pll pl2)1((0 . "INSERT") (8 . "DET"))

); ssget

)

(command "_EXPLODE" ssins)

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

на слое CONTOUR (внешние контуры деталей)

(setq sscon

(ssget "_C"

'(0.0 0.0) (list pll pl2)

'((0 . "POLYLINE") (8 . "CONTOUR"))

); ssget

)

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

на слое HOLE (вырезы деталей)

(setq sshol

(ssget "_C"1 (0.0 0.0) (list pll pl2)

'((0 . "POLYLINE") (8 . "HOLE"))

); ssget

Вычисляем суммарную площадь внешних контуров деталей

(setq arcon 0.0)

(if sscon

(progn

(setq i 0 lss (sslength sscon))

(while (< i lss)

(command "_AREA" "_E" (ssname sscon i))

; Последнюю вычисленную площадь читаем

; из системной переменной AREA и добавляем к сумме

(setq arcon (+ arcon (getvar "AREA")))

(setq i (1+ i))

)/while

);progn

);if

Вычисляем суммарную площадь внутренних вырезов деталей

(setq arhol 0.0)

(if sshol

(progn

Page 519: Visual LISP и секреты адаптации AutoCAD

518 Visual LISP и секреты адаптации AutoCAD

(setq i 0 lss (sslength sshol))(while (< i lss)

(command "_AREA" "_E" (ssname sshol i))(setq arhol (+ arhol (getvar "AREA")))(setq i (1+ i))

);while);progn

);if; Общая площадь деталей за вычетом площади вырезов

(setq artot (- arcon arhol)); Отменяем в рисунке все изменения и возвращаем его; к первоначальному состоянию(command "JJNDO" "_В")

; Возвращаемое значение - коэффициент использования; площади прямоугольника; если artot <= 0, то возвращается О(if (> artot 0.0)

(/ artot (* pll pl2))0.0

Функция mapko сначала с помощью команды ОТМЕНИТЬ (UNDO), вызы-ваемой с опцией Метка (Mark), устанавливает метку, которая используется вконце программы той же командой, выполняемой с опцией Обратно (Back),для отмены всех сделанных программой изменений в рисунке.

Затем команда СЛОЙ (LAYER) включает слои CONTOUR и HOLE (именаслоев задаются текстовой константой, в которой они перечислены через запя-тую). Далее с помощью функции ssget, вызываемой с аргументом "с"(напомним, что для совместимости с локализованными версиями пишется" С " ) , создаются наборы sscon, sshol и ssins. Во всех трех вызовах точки,определяющие углы секущей рамки, требуемые методом "С", одни и те же(это углы прямоугольной зоны, в которой размещаются детали). В качестведополнительных фильтров при создании наборов используются типы вклю-чаемых в наборы примитивов (POLYLINE и INSERT) и имена слоев(CONTOUR, HOLE и DET). Сразу же после создания наборов sscon и ssholвсе объекты этих наборов подаются команде СТЕРЕТЬ (ERASE), которая уда-ляет их из рисунка. Аналогично все объекты набора ssins разбиваются ко-мандой РАСЧЛЕНИТЬ (EXPLODE) (следует обратить внимание на то, чтопри использовании этой команды в приведенном варианте не требуется с по-мощью константы "•• имитация нажатия пользователем клавиши <Enter>).После разъединения на слое CONTOUR образуются полилинии внешнихконтуров деталей, а на слое HOLE — полилинии внутренних вырезов.

Далее программа снова создает наборы sscon и sshol из полилиний разъе-диненных блоков деталей. Вычисляются площади каждого объекта набора

Page 520: Visual LISP и секреты адаптации AutoCAD

Приложение 9. Функция mapko 519

sscon и суммируются в локальной переменной' агсоп. Аналогично вычисля-ется сумма площадей внутренних вырезов из набора sshol и запоминается впеременной arhoi. Для вычисления площади объекта используется командаПЛОЩАДЬ (AREA) с опцией Объект (Entity). Результат вычисленной пло-щади берется из системной переменной AREA.

Общая полезная площадь деталей, являющаяся разностью агсоп и arhoi,сохраняется в локальной переменной artot.

Последняя функция программы (if) формирует возвращаемое значение. Ес-ли artot равно нулю или отрицательно, то возвращается о (соответствуетслучаю, когда нет деталей). Иначе в качестве возвращаемого значения будетсформировано частное от деления artot на площадь прямоугольника, кото-рая равна произведению длины и ширины (т. е. значений системных пере-менных USERR2 и USERR3).

Алгоритм программы mapko используется при вычислении коэффициентараскроя листового металла (отношение площади листа, занятой деталями, кобщей площади прямоугольного заказного листа). На рис. П9.1 приведенпример карты раскроя листового металла.

ДГAutoCAD 2000 - НЕ ДЛЯ ПЕРЕПРОДАЖИЕр $айя' Драена Вив Вставке Форыат Сдаеис £ии>мние Р«ам*ры Рецаст Es»JB* 0ы*> . Igl х||

Ы ы~3||Н белый - Посясмо

/ А

•J Utwrt / • 1ft[Команда[Команда(Команда

. соооо

Рис. П9.1. Карта раскроя листового металла

Page 521: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 0

Функция xdapp

На примере функции xdapp виден механизм добавления расширенных дан-ных К ПрИМИТИВу. ИсПОЛЬЗОваНЫ Стандартные фуНКЦИИ entget, cons, append,entmod.

: Листинг П10.1. Функция xdapp j

**** Зарегистрировать приложение апаше и добавить для него к при- ****

**** митиву entrb дополнительные данные, оформив их в виде списка ****

**** внутри расширенных данных: ****

**** - габариты изделия (два вещественных числа), ****

**** - марка материала (текстовая строка). ****

**** ©А.И.Руднев, 2000 г. ****

**** Глобальных переменных нет. ****

**** Аргументы: ****

**** entrb - имя примитива, к которому добавляются расширенные ****

**** данные; * * * *

**** апаше - имя приложения, с которым связываются данные; ****

**** gabl - первый габарит (вещественное число); ****

**** даЬ2 - второй габарит (вещественное число); ****

**** mat - марка материала (текстовая строка). ****

**** Локальные переменные: ****

**** elist - список, получаемый функцией entget для примитива ****

**** entrb; ***•*

**** xd_list - список с расширенными данными. ****

**** Возвращаемого значения нет (тихий выход). ****

(defun xdapp (entrb aname gabl gab2 mat / elist xd list)

Чтение списка с данными примитива перед добавлением расширенных данных

Page 522: Visual LISP и секреты адаптации AutoCAD

Приложение 10. Функция xdapp 521

(setq e l i s t (entget entrb)); Регистрация приложения aname

(regapp aname)

; Формирование списка внутри расширенных данных,; начиная с конца этого списка

; Закрывающая скобка списка (DXF-код 1002)

(setq xd^list ( l i s t '(1002 . "}"))); Марка материала (DXF-код 1000) '

(setq xd_list (cons (cons 1000 mat) xd_list)); Габарит 2 (DXF-код 1040)

(setq xd_list (cons (cons 1040 gab2) xd_list)); Габарит 1 (DXF-код 1040)

(setq xd_list (cons (cons 1040 gabl) xd_list)); Открывающая скобка списка (DXF-код 1002)

(setq xd_list (cons '(1002 . "{") xd_list)); Добавляем DXF-код -3 и имя приложения

(setq xd_list ( l i s t -3 (cons aname xd_list))); Дополняем список e l i s t данных примитива расширенными данными

(setq e l i s t (append e l i s t ( l i s t xd_list))); Обновляем примитив entrb в базе данных рисунка

(entmod e l i s t ); Тихий выход из функции (без возвращаемого значения)

(prinl)

Функция xdapp сначала читает список данных примитива entrb с помощьюфункции entget. Далее регистрируется приложение aname (без регистрацииприложения связанные с ним расширенные данные игнорируются) и начи-нается формирование расширенных данных.

Этот пример интересен тем, что внутри расширенных данных образуетсясвой список, ограничиваемый точечными парами с DXF-кодами 1002 (чащерасширенные данные внутри себя списков не имеют). Накопление расши-ренных данных идет в списке xd_iist, начиная с конца. По окончании спи-сок xd_iist объединяется со списком el ist . Функция entmod обновляет втекущем рисунке примитив entrb с помощью нового списка el ist .

Page 523: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 1

Функция setiout

Функция setiout демонстрирует работу с вкладками пространства листа.

Использованы Стандартные ФУНКЦИИ initget, getvar, getkword, layoutlist,load_dialog, unload_dialog, new_dialog, start_dialog, done_dialog, exit,mapcar, start_list, add__list, end_list, action_tile, mode_tile.

В листинге П11.1 приведен текст функции setiout.

j Листинг П11.1. Функция eetlout !

.****************************J*****************************************

**** Переход из пространства модели в пространство листа, ****

**** с возможностью создания вкладки листа с новым именем. ****

**** © Н.Н.Полещук, 2000 г. ****

**** Глобальные переменные: ****

**** loname - имя листа, к которому нужно перейти (начальное ****

**** значение - имя первого листа из существующих); ****

**** kl_new - признак создания нового листа (1 - да, 0 - нет). •****

**** Аргумент: ****

**** fdcl - имя DCL-файла, загружаемого для вызова диалогового ****

**** окна. ****

**** Локальные переменные: ****

**** уп - текстовая константа (ответ на запрос, "Y" или "N"); ****

**** all_loutn - список с именами листов, существующих в текущем****

**** рисунке; ****

**** dcl_id - внутренний номер диалогового окна. ****

**** Возвращаемого значения нет (тихий выход). ****

(defun setiout (fdcl / yn all_loutn dcl_id)

Запрос: перейти в пространство листа?

(if (/= (getvar "TILEMODE") 0)

(progn

Page 524: Visual LISP и секреты адаптации AutoCAD

Приложение 11. Функция setlout 523

(initget "Y N")

(setq yn (getkword "ХпПерейти в пространство листа [Y/N]? <Y> "))

(if (or (null yn) (= yn "Y"))

(progn

; Чтение списка наименований существующих листов рисунка

; и выбор первого из них

(setq all_loutn (layoutlist) loname (car all_loutn) kl_new 0)

; Проверка загрузки DCL-файла

(if (< (setq dcl_id (load_dialog fdcl)) 0)

(progn

(alert "He найден DCL-файл")

(exit)

);progn

);if

; Проверка корректности файла диалогового окна

(if (not (new_dialog "lout" dcl_id))

(progn

(alert "He загружается диалог")

(exit)

);progn

);if

; Формирование раскрывающегося списка из наименований листов

(start_list "louts_old")

(mapcar 'add_list all_loutn)

(end_list)

i

; Операции с кнопками диалогового окна

; Раскрывающийся список - выбор имени листа из существующих

(action_tile "louts_old"

"(setq loname (nth (atoi $value) all_loutn))"

);action_tile

; Текстовое поле имени нового листа

(action_tile "lout_new" "(setq loname $value)")

; Флажок создания нового листа

(action_tile "kl_new"

(strcat

"(mode_tile \"lout_new\" (- 1 (setq kl_new (atoi $value))))"

"(mode_tile \"louts_old\" kl_new)"

);strcat

);action_tile

; Кнопка "Да" (закрытие диалогового окна)

(action_tile "accept" "(done_dialog)")

; Кнопка "Отмена" (закрытие диалогового окна)

(action_tile "cancel" "(setq kl_new -1)(done_dialog)")

Page 525: Visual LISP и секреты адаптации AutoCAD

524 Visual LISP и секреты адаптации AutoCAD

; Старт диалога

(start_dialog); Выгрузка DCL-файла

(unload_dialog dcl_id); Переход в пространство.листа

(command "TILEMODE" 0); Вызов команды РЛИСТ (LAYOUT) в режиме без диалогового окна

(if (= kl_new 1)(command "_-LAYOUT" "_N" loname)); Установить вкладку листа с именем loname,; если не нажата кнопка "Отмена"

(if (>= kl_new 0)(command "СТАВ" loname)));progn

);if);progn

) ; if(princ)

В листинге П11.2 приведен текст файла setlout.dcl, загружаемого функциейsetlout.

; Листинг П11.2. Файл setlout.dcl I

// Диалоговое окно "Выбор текущего листа".// Выбор существующего листа рисунка или создание нового листа.// © Н.Н.Полещук, 2000 г./ft********************************************************************

lout: dialog

{label = "Выбор текущего листа";: column

{

: row

{: toggle {label = "Создать новый^HCT";key="kl_new";value="0";}: edit_box

{is_enabled=false;label = "";edit_width = 4 0;alignment = centered;value = "";key = "lout_new";

}// edit box

Page 526: Visual LISP и секреты адаптации AutoCAD

Приложение 11. Функция setiout 525

}11 row

: spacer {height=l;}

: popup_list

{

key = "louts_old";

is_enabled = true;

label = "Выбрать существующий лист";list = "";edit_width = 20;value = "0";fixed_height = true;alignment = left;

}// popup_list: spacer {height=l;}ok_cancel;

}// column}// dialog

Функция setiout начинает работу с проверки значения системной перемен-ной TILEMODE. Если это значение равно 0 (это соответствует пространствулиста), то программа сразу завершает свою работу. Если значение перемен-ной TILEMODE не равно 0 (это означает, что в рисунке активно простран-ство модели), то функция сначала готовит с помощью функции initget ва-рианты ответа на последующий запрос о переходе в пространство листа изатем выдает этот запрос с помощью функции getkword. При положитель-ном ответе пользователя программа с помощью функции loaddialog загру-жает DCL-файл (его полное имя должно быть передано в качестве значенияаргумента fdci). При неуспешной загрузке выдается сообщение "Не найденDCL-файл" и работа прекращается (для выхода из программы применяетсяфункция exit). При успешной загрузке файла проверяется наличие в немтребуемого диалога lout и при его отсутствии выводится сообщение обошибке с одновременным прекращением работы.

Если удалось загрузить нужный диалог, то на экран выводится диалоговоеокно Выбор текущего листа (рис. П11.1).

Выбор текущего листа

Г" Создать новый лист 1

Выбраггь существующий лист• • ' • . ' • " . . . . • • • . ' • • , : - " " . ' : • : • ' •' ' : '

" - . • • . . ' ' • ' : : • , " . ' • : • : . . - ' " • "

. • • : • " • ; • / . • • . . . .

. • - - , " ' , " • • • • ' - ; : "

:; Отмена

B I

•-.: •• •• •-•: -.1

|яист1 •rj:

'•[•': •'••'••• •'•'•:'•''• г " ". . : " . " - • • . • •

Рис. П11.1. Диалоговое окно Выбор текущего листа

Page 527: Visual LISP и секреты адаптации AutoCAD

526 Visual LISP и секреты адаптации AutoCAD

По умолчанию в качестве активного листа в раскрывающемся списке уста-навливается имя первого из листов, имеющихся в рисунке (на рис. ПИЛэто Лист1). Для получения полного списка наименований имеющихся в ри-сунке листов использована функция layoutiist. Передача списка наимено-ваний в раскрывающийся список выполняется с помощью функцийstart_list, add_list, end_list И mapcar.

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

Если пользователь хочет, чтобы в рисунке текущим стал лист, которого ещенет, то нужно установить флажок Создать новый лист. Установка этогофлажка гасит раскрывающийся список Выбрать существующий лист и делаетдоступным справа от флажка текстовое поле, в котором следует ввести имясоздаваемого листа. Для включения и гашения полей использована функцияmode_tile.

Если имя листа выбрано, то нажатие кнопки ОК выполняет переход в про-странство листа и установку текущего листа. При этом для создания в ри-сунке нового листа применяется команда РЛИСТ (LAYOUT), вызываемаяв режиме без диалогового окна (это достигается с помощью знака минус вкоманде _-LAYOUT).

Нажатие кнопки Отмена тоже переводит рисунок в пространство листа, ноимя текущего листа выбирается по умолчанию.

Поскольку в программе не предусмотрена проверка ошибок при созданиинового листа (например, повторение имени существующего листа или зада-ние имени из одних пробелов), то обработка таких ошибок осуществляетсякомандой РЛИСТ (LAYOUT) по своему внутреннему алгоритму.

Page 528: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 2

Функция al_vps

Функция ai_vps показывает, как выполнять операции над видовыми экра-нами в пространстве листа. Команда ФОРМАТЛ (MVSETUP) не являетсявстроенной командой системы AutoCAD и работает только благодаря за-грузке LSP-файла mvsetup.lsp. Эту команду нельзя выполнить с помощьюфункции command. Для преодоления возникшего препятствия в программеиспользуются вспомогательный файл сценария и команда ПАКЕТ(SCRIPT). В программе применяются стандартные функции getvar, initget,getkword, while, entget, command, assoc, entsel, open, close, write-line, rtos,

strcat, car, cdr, caddr.

LSP-файлы, входящие в поставку русско- и англоязычной версий системыAutoCAD, отличаются, поэтому в листинге П12.1 приведен текст функцииai_vps для русскоязычной версии системы, а в листинге П12.2 — для анг-лоязычной версии.

; Листинг П12.1. Функция al_vps (русскоязычная версия) !

**** Выравнивание видов (вертикальное или горизонтальное) видовых ******** экранов пространства листа. Требуется указать два видовых ******** экрана и точки модели в этих экранах, которые будут выравни- ******** ваться (за счет изменения вида во втором экране). ******** © А.И.Руднев, 2000 г. ****

**** Глобальных переменных нет. ******** Аргументов нет. ******** Локальные переменные: ******** vh - способ выравнивания (вертикальное, горизонтальное); ******** svl - список, получаемый при указании 1-го экрана с помощью******** функции entsel; ******** lcvpl - список данных примитива 1-го экрана; ******** nl - внутренний номер 1-го видового экрана; ******** sv2 - список, получаемый при указании 2-го экрана; ****

Page 529: Visual LISP и секреты адаптации AutoCAD

528 Visual LISP и секреты адаптации AutoCAD

**** Icvp2 - список данных примитива 2-го экрана; ****

**** п2 - внутренний номер 2-го видового экрана; ****

**** fscr - указатель файла сценария для работы команды ФОРМАТЛ ****

**** (MVSETUP). ****

**** Возвращаемого значения нет (тихий выход). . ****

(defun al_vps ( / vh svl lcvpl nl sv2 Icvp2 n2 fscr)

Переход в пространство листа

(if (= (getvar "TILEMODE") 0)

(progn

Запрос способа выравнивания видов

(princ "\пВыравнивание видов в видовых экранах листа.")

(initget "Вертикальное Горизонтальное")

(setq vh

(getkword

"ХпВыберите выравнивание [Вертикальное/Горизонтальное] <В>: "

);getkword

) ; set'q

(if (not vh) (setq vh "B") )

Переход в режим листа

(command "_PSPACE")

Выбор 1-го видового экрана

(setq svl nil)

(while (null svl)

(setq svl (entsel "ХпУкажите кромку первого видового экрана: "))

(if svl

(progn

(setq lcvpl (entget (car svl)))

(if (/= "VIEWPORT" (cdr (assoc 0 lcvpl)))

(progn

(setq svl nil)

(princ "Это не видовой экран. ")

);progn

);if

);progn

);if

);while

Номер 1-го видового экрана

(setq nl (cdr (assoc 69 lcvpl)))

Переход в режим модели в 1-м видовом экране

(command "_MSPACE" "CVPORT" nl)

Запрос точки, используемой для выравнивания в 1-м экране

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

(initget 1)

Page 530: Visual LISP и секреты адаптации AutoCAD

Приложение 12. Функция al_vps 529

(setq pi (getpoint "ХпУкажите точку в первом экране: "))

; Выбор 2-го видового экрана

(command "_PSPACE")

(setq sv2 nil)

(while (null sv2)

(setq sv2 (entsel "\пУкажите кромку второго видового экрана: "))

(if sv2

(progn

(setq Icvp2 (entget (car sv2)))

(if (/= "VIEWPORT" (cdr (assoc 0 Icvp2)))

(progn

(setq sv2 nil)

(princ "Это не видовой экран. ")

);progn

; Проверка номера 2-го экрана

; (должен отличаться от номера первого экрана)

(if (= (setq n2 (cdr (assoc 69 Icvp2))) nl)

(progn

(setq sv2 nil)

(princ "Выберите другой видовой экран.")

);progn

);if =

);if /=

);progn

);if sv2

);while

; Переход в режим модели во 2-м видовом экране

(command "_MSPACE" "CVPORT" n2)

; Запрос точки, используемой для выравнивания в 1-м экране

; (запрет пустого ввода)

(initget 1)

(setq p2 (getpoint "ХпУкажите точку во втором экране: "))

; Формирование файла сценария для работы с командой ФОРМАТЛ (MVSETUP)

; Открытие файла

(setq fscr (open "al-vps.scr" "w"))

; Переход в режим листа

(write-line "_PSPACE" fscr)

; Вызов команды ФОРМАТЛ с опцией Выровнять

(write-line "ФОРМАТЛ В" fscr)

; Опция способа выравнивания (Вертикальное или Горизонтальное)

(write-line vh fscr)

; Указание 1-го видового экрана

Page 531: Visual LISP и секреты адаптации AutoCAD

530 Visual LISP и секреты адаптации AutoCAD

(write-line (strcat "'CVPORT " (itoa nl)) fscr); Указание точки в 1-м видовом экране

(write-line(strcat(rtos (car pi) 2 6)

(rtos (cadr pi) 2 6)IT TlI

(rtos (caddr pi) 2 6))/strcatfscr .

);write-line; Указание 2-го видового экрана

(write-line (strcat "'CVPORT " (itoa n2)) fscr); Указание точки во 2-м видовом экране

(write-line(strcat(rtos (car p2) 2 6)II I»I(rtos (cadr p2) 2 6)II M/

(rtos (caddr p2) 2 6));strcatfscr)

Завершение команды ФОРМАТЛ (MVSETUP)(write-line " " fscr)

; Закрытие файла сценария(close fscr)

; Выполнение сценария(command "_SCRIPT" "al-vps.scr")

);progn(alert "Программа работает только в пространстве листа")

);if(princ)В листинге П12.2 полужирным шрифтом выделены строки, отличающиеся

от текста функции в листинге П12.1.

I Листинг П12.2. Функция al_vps (англоязычная версия) \

(defun al_vps ( / vh svl lcvpl nl sv2 Icvp2 n2 fscr); Переход в пространство листа(if (= (getvar "TILEMODE") 0)(progn

Page 532: Visual LISP и секреты адаптации AutoCAD

Приложение 12. Функция al_vps 531

; Запрос способа выравнивания видов

(princ "ХпВыравнивание видов в видовых экранах листа.")

(initget "Vertical Horizontal")

(setq vh

(getkword

"\пВыберите выравнивание [Vertical/Horizontal] <V>: "

);getkword

);setq

(if (not vh) (setq vh "V"))

; Переход в режим листа

(command "_PSPACE")

; Выбор 1-го видового экрана

(setq svl nil)

(while (null svl)

(setq svl (entsel "ХпУкажите кромку первого видового экрана: "))

(if svl

(progn

(setq lcvpl (entget (car svl)))

(if (/= "VIEWPORT" (cdr (assoc 0 lcvpl)))

(progn

(setq svl nil)

(princ "Это не видовой экран. ")

);progn

) ; if

);progn

) ; if

);while

; Номер 1-го видового экрана

(setq nl (cdr (assoc 69 lcvpl)))

; Переход в режим модели в 1-м видовом экране

• (command "_MSPACE" "CVPORT" nl)

; Запрос точки, используемой для выравнивания в 1-м экране

; (запрет пустого ввода)

(initget 1)

(setq pi (getpoint "ХпУкажите точку в первом экране: "))

; Выбор 2-го видового экрана

(command "__PSPACE")

(setq sv2 nil)

(while (null sv2)

(setq sv2 (entsel "ХпУкажите кромку второго видового экрана: "))

(if sv2

(progn

(setq Icvp2 (entget (car sv2)))

(if (/= "VIEWPORT" (cdr (assoc 0 Icvp2)))

Page 533: Visual LISP и секреты адаптации AutoCAD

532 Visual LISP и секреты адаптации AutoCAD

(progn

(setq sv2 nil)

(princ "Это не видовой экран. "));progn

Проверка номера 2-го экрана; (должен отличаться от номера первого экрана)

(if (= (setq n2 (cdr (assoc 69 Icvp2))) nl)(progn(setq sv2 nil)(princ "Выберите другой видовой экран.")

);progn);if =

);if /=);progn

);if sv2);while

; Переход в режим модели во 2-м видовом экране(command "_MSPACE" "CVPORT" n2)

; Запрос точки, используемой для выравнивания в 1-м экране; (запрет пустого ввода)

(initget 1)(setq p2 (getpoint "ХпУкажите точку во втором экране: "))

; Формирование файла сценария для работы с командой ФОРМАТЛ (MVSETUP)

; Открытие файла

(setq fscr (open "al-vps.scr" "w"))

; Переход в режим листа

(write-line "_PSPACE" fscr)

; Вызов команды MVSETUP с опцией Align

(write-line "MVSETUP A" fscr)

; Опция способа выравнивания (Vertical или Horizontal)

(write-line vh fscr)

; Указание 1-го видового экрана

(write-line (strcat "'CVPORT " (itoa nl)) fscr)

; Указание точки в 1-м видовом экране

(write-line

(strcat

(rtos (car pi) 2 6)(I IIf(rtos (cadr pi) 2 6)II I?I(rtos (caddr pi) 2 6)

);strcatfscr

Page 534: Visual LISP и секреты адаптации AutoCAD

Приложение 12. Функция al_vps 533

);write-line

; Указание 2-го видового экрана

(write-line (strcat "'CVPORT " (itoa n2)) fscr)

; Указание точки во 2-м видовом экране

(write-line

(strcat

(rtos (car p2) 2 6)H II/(rtos (cadr p2) 2 6)(I IIt

(rtos (caddr p2) 2 6)

);strcat

. fscr)

; Завершение команды ФОРМАТЛ (MVSETUP)

(write-line "' " fscr)

; Закрытие файла сценария

(close fscr)

; Выполнение сценария

(command "_SCRIPT" "al-vps . scr")

);progn

(alert "Программа работает только в пространстве листа")

);if

(princ)

Для операции выравнивания видов в разных видовых экранах пространствалиста в данной программе используется команда ФОРМАТЛ (MVSETUP).Поскольку ее нельзя выполнить с помощью функции command, то необходи-мо сформировать файл сценария al_vps.scr, который затем можно выполнитькомандой ПАКЕТ (SCRIPT) (а эта команда уже может быть вызвана с по-мощью функции command).

( Замечание ЛКоманда ПАКЕТ (SCRIPT) должна быть в программе последней командойAutoCAD, которая выполняется с помощью функции command.

В листинге П12.3 приведен пример файла al_vsp.scr для англоязычной вер-сии системы.

\ Листинг П12.3. Пример файла al_vps.scr для англоязычной версии системы

_PSPACE

MVSETUP А

V

'CVPORT 3

Page 535: Visual LISP и секреты адаптации AutoCAD

534 Visual LISP и секреты адаптации AutoCAD

116.359383,0,-262.203237'CVPORT 2116.359383,0,-262.203237

После седьмой строки в файле присутствует еще одна, в которой находитсятолько знак пробела и символ конца текстовой строки. Они имитируютдвойное нажатие клавиши <Enter> (завершение команды ФОРМАТЛ(MVSETUP)).

Для тех, кто хотел бы использовать программу alvsp, обращаю вниманиена следующее: нужно следить за путем к файлу al_vsp.scr и для аккуратностив конце работы программы этот файл удалять.

Page 536: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 3

Функция vl_fs

Функция v i f s иллюстрирует операции выделения из полного имени файласоставных частей (имени, расширения, пути), а также операцию удаленияфайла. ИсПОЛЬЗОВаНЫ стандартные фуНКЦИИ getfiled, vl-filename-base,vl-filename-directory, vl-filename-extension, vl-file-delete, substr, strlen,strcat, rtos, getvar, write-line, alert, open, close.

j Листинг П13.-1. Функция vl_f s I

**** Запрашивается имя анализируемого (основного) файла. В той же ****

**** папке открывается дополнительный файл с именем: *+**

**** <имя>$<расширение>.txt, в который записываются дата, имя, ****

**** расширение и путь основного файла. Если файл, одноименный с ****

**** с дополнительным, существует, то он предварительно удаляется.****

**** © Н.Г.Карпушкина, 2000 г. ****

**** Глобальных переменных нет. ****

**** Аргументов нет. • ****

**** Локальные переменные: ****

**** fname - полное имя анализируемого файла; - ****

**** fbase - главная часть имени из fname; ****

**** fdir - путь, выделенный из fname; ****

**** fdirl - путь fdir, но с отброшенным конечным "\"; ****

**** fext - расширение (с точкой); ****

**** ffnam - полное имя вспомогательного файла; ****

**** fa - указатель вспомогательного файла; ****

**** strd - вспомогательная строка. ****

**** Возвращаемое значение: ****

**** nil. ****

(defun vl fs ( / fname fbase fdir fdirl fext ffnam fa strd)

Page 537: Visual LISP и секреты адаптации AutoCAD

536 Visual LISP и секреты адаптации AutoCAD

; Интерактивный запрос имени анализируемого файла

; (открывается рабочая папка, заданная в настройке ярлыка AutoCAD)

(setq fname (getfiled "Выберите анализируемый файл" "" "*" 16))

(if fname

(progn

; Выделение имени файла

(setq fbase (vl-filename-base fname))

; Выделение пути

(setq fdir (vl-filename-directory fname))

; Анализ случаев корневого каталога ("с:\"),

; чтобы отбросить концевой "\"

(setq fdirl

(if (= (substr fdir (strlen fdir)) "\\")

(substr fdir 1 (1- (strlen fdir)))

fdir

);if

);setq

; Выделение расширения

(setq fext (vl-filename-extension fname))

; Проверка пустого расширения

(if (not fext) (setq fext ""))

; Предварительное удаление файла, одноименного с дополнительным

(vl-file-delete

(setq ffnam

(strcat fdirl "\\" fbase "$" (substr fext 2) ".txt")

) ; setq

);vl-file-delete

; Открытие дополнительного файла

(setq fa (open ffnam "w"))

; Выделение части значения системной переменной CDATE с датой

(setq strd (rtos (getvar "CDATE") 2 0))

; Вывод строки с датой

(write-line

(strcat

"Дата: " (substr strd 7 2)

(substr strd 5 2)

(substr strd 1 4)

);strcat

fa

);write-line

; Вывод строк с именем, расширением и путем

(write-line (strcat "Имя файла: " fbase) fa)(write-line (strcat "Расширение: " fext) fa)

Page 538: Visual LISP и секреты адаптации AutoCAD

Приложение 13. Функция vl_fs 537

\

(write-line (strcat "Путь: " fdir) fa)

; Закрытие файла и вывод финального сообщения

(close fa) (alert (strcat "Результаты - см. файл " ffnam)));progn (alert "Файл не выбран")

В начале работы функции vi_fs вызывается диалоговое окно выбора файла,ДЛЯ чего ИСПОЛЬЗуеТСЯ ФУНКЦИЯ getf i led. Второй аргумент функции get f i ledимеет значение пустой строки, поэтому в качестве открываемой папкипредлагается папка с именем по умолчанию (рабочая папка, указанная внастройке ярлыка системы AutoCAD). Третий аргумент имеет значение "*",поэтому в диалоговое окно выводятся имена файлов с любыми расшире-ниями. В результате работы функции getfiled формируется значение ло-кальной переменной fname (например, "d:\Archive\Drawl.dwg").

Затем вычисляются значения переменных fbase ("Drawl"), fdir("d-. Wrchive"), fext (".dwg"). Поскольку в случае корневого каталога ("d:\")fdir может получить значение с символом \ на конце, то оно переносится вдругую переменную fdirl, но уже без возможного конечного символа \.

В переменную ffnam заносится полное имя дополнительного файла("d:\Archive\Drawi$dwg.txt"). Если файл с таким именем уже существует, тоОН удаляется функцией vl-f ile-delete.

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

Системная переменная CDATE принимает вещественные значения и вклю-чает в себя текущие дату и время в виде: 20010327.09123045. Целая частьэтого числа содержит дату (четыре цифры — год, еще две — месяц, ещедве — день). Дробная часть числа содержит время (первые две цифры — ча-сы, затем две цифры — минуты, еще две цифры — секунды, остальные —дробные части секунды). Поэтому в приведенном примере значение сис-темной переменной CDATE соответствует Дате 27 марта 2001 года и времени9 часов 12 минут 30 секунд.

Результаты анализа заносятся в дополнительный файл в виде четырех строк(одна строка с датой и три строки с параметрами основного файла).

Окончание программы оформлено с вызовом информационного окна функ-ции alert.

Page 539: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 4

Функции ffp и flp

Приложение 14 иллюстрирует операции доступа к данным примитивов неко-торых типов (LINE, POLYLINE, LWPOLYLINE, ARC, SPLINE). Использо-ваны стандартные функции entsel, entget, assoc, cond, append, list, princ,trans, entnext.

В листинге П14.1 приведен текст функции ffp, вычисляющей первую точкуобъекта в текущей системе координат рисунка.

j Листинг П14.1. Функция ffp i

**** Вычисление в текущей системе координат первой точки для при- ****

**** митивов типа LINE, POLYLINE, LWPOLYLINE, ARC, SPLINE. ****

**** © Савельева В.А., 2000 г. ****

**** Глобальных переменных нет. ****

**** Аргументов нет. ****

* * * * Локаль ные переменные: * * * *

**** w - список, возвращаемый функцией entsel; ****

**** е

_ указанный примитив; ****

**** 1е - список примитива е; ****

**** ten - тип примитива е; ****

**** саЮ - значение точечной пары с DXF-кодом 10; ****

**** pt - вычисляемая точка. ****

**** Возвращаемое значение: ****

**** список из трех координат точки или nil (если указан объект ****

**** другого типа). *+**

(defun ffp ( / w le e ten calO pt)

Запрос указания объекта

(setq w

(entsel

Page 540: Visual LISP и секреты адаптации AutoCAD

Приложение 14. Функции ftp и flp 539

"ХпУкажите объект типа LINE, ARC, POLYLINE, LWPOLYLINE, SPLINE: "

);entsel

);setq; Проверка, указан ли объект

(while (null w) (setq w (entsel "ХпОбъект не выбран, повторите: ")))

; Чтение данных примитива, выделение значений DXF-кодов 0 и 10

(setq

le (entget (setq e (car w) ) )

ten (cdr (assoc 0 le))

calO (cdr (assoc 10 le))

);setq

; Вывод на экран типа примитива

(princ (strcat "\n" ten " "))

; Вычисление первой точки объекта в собственной системе координат

(setq pt

(cond

; LINE и SPLINE

((or (= ten "LINE")(= ten "SPLINE")) calO)

; LWPOLYLINE (добавление к calO третьей координаты)

((= ten "LWPOLYLINE") (append calO (list (cdr (assoc 38 le)))))

; ARC (вычисление точки по центру, радиусу и углу)

((= ten "ARC")

(list

(+

(car calO)

(* (cdr (assoc 40 le)) (cos (cdr (assoc 50 le))))

(cadr calO)

(* (cdr (assoc 40 le)) (sin (cdr (assoc 50 le))))

); +

(caddr calO)

);list

)

; POLYLINE (чтение первой вершины полилинии)

((= ten "POLYLINE")(cdr (assoc 10 (entget (entnext e)))))

; Для всех остальных типов выводится сообщение и возвращается nil

(princ "\пНедопустимый тип объекта. ")

nil

);Т

);cond

);setq pt

; Перевод в текущую ПСК

(if pt (trans pt e 1))

);defun ffp

Page 541: Visual LISP и секреты адаптации AutoCAD

540 Visual LISP и секреты адаптации AutoCAD

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

Для примитивов типа LINE и SPLINE все три координаты первой точкинаходятся в точечной паре с DXF-кодом 10.

Для примитива типа ARC в точечной паре с кодом 10 находится центр дуги,поэтому для получения первой точки нужны еще радиус (число в точечнойпаре с кодом 40) и начальный угол в радианах (число в точечной паре с ко-дом 50).

Легкая полилиния (примитив типа LWPOLYLINE) в первой точечной паре сDXF-кодом 10 содержит только две координаты первой точки линии. Тре-тья координата извлекается из точечной пары с кодом 38.

В случае примитива типа POLYLINE координаты первой точки оформленыв базе данных рисунка в виде подпримитива VERTEX, поэтому для их полу-чения нужно с помощью функции entnext перейти к подпримитиву, еле- •дующему непосредственно за POLYLINE.

Для перевода полученных координат точки в текущую систему координатиспользуется функция trans со значением последнего аргумента 1.

Текст функции fip, позволяющей получать координаты последней точкиобъекта, приведен в листинге П14.2.

| Листинг П14.2. Функция f l p |

**** Вычисление в текущей системе координат последней точки для ******** примитивов типа LINE, POLYLINE, LWPOLYLINE, ARC, SPLINE. ******** © Савельева В.А., 2000 г. ****

**** Глобальных переменных нет. ******** Аргументов нет. ******** Локальные переменные: ******** w _ список, возвращаемый функцией e n t s e l ; ******** е - указанный примитив; ******** 1е - список примитива е; ******** ten - тип примитива е; ******** саЮ - значение точечной пары с DXF-кодом 10; ******** el - следующий примитив (перебираются в цикле); ******** pt - вычисляемая точка. ******** Возвращаемое значение: , ******** список из трех координат точки или n i l (если указан объект ******** другого типа). ****

Page 542: Visual LISP и секреты адаптации AutoCAD

Приложение 14. Функции ffp и flp 541

(defun flp ( / w le e ten calO el pt)

; Запрос

(setq w

(entsel

"ХпУкажите объект типа LINE, ARC, POLYLINE, LWPOLYLINE, SPLINE: "

);entsel

);setq (while (null w) (setq w (entsel "\пОбъект не выбран, повторите:")))

; Чтение данных примитива

(setq

le (entget (setq e (car w)))

ten (cdr (assoc 0 le))

calO (cdr (assoc 10 le))

);setq

; Вывод на экран типа примитива

(princ (strcat "\n" ten " "))

; Вычисление последней точки объекта в собственной системе координат

(setq pt

(cond

; LINE

( (= ten "LINE") (cdr (assoc 11 le)))

; SPLINE

((= ten "SPLINE") (cdr (assoc 10 (reverse le))))

; LWPOLYLINE (добавление третьей координаты)

( (= ten "LWPOLYLINE")

(append

(if (= 1 (cdr (assoc 70 le))) ; замкнутая?calO; последняя = первая

(cdr (assoc 10 (reverse le))));if(list (cdr (assoc 38 le)))

);append

);LWPOLYLINE

; ARC (вычисление точки по центру, радиусу и углу)

((= ten "ARC")

(list

( +

(car calO)

(* (cdr (assoc 40 le)) (cos (cdr (assoc 51 le))))

(cadr calO)

(* (cdr (assoc 40 le)) (sin (cdr (assoc 51 le))))

Page 543: Visual LISP и секреты адаптации AutoCAD

542 . Visual LISP и секреты адаптации AutoCAD

(caddr calO)

) /ARC

; POLYLINE (чтение вершин полилинии, до примитива SEQEND)

((= ten "POLYLINE")

(if (= 1 (cdr (assoc 70 le))); замкнутая?

(cdr (assoc 10 (entget (entnext e)))); последняя = первая

(progn

(setq el (entnext e))

(while (= "VERTEX" (cdr (assoc 0 (entget (entnext el)))))

(setq el (entnext el))

);while

(cdr (assoc 10 (entget el)))

);progn

);if

) ; POLYLINE

; Для всех остальных типов выводится сообщение и возвращается nil

(princ "\пНедопустимый тип объекта. ")

nil

);Т

);cond

);setq pt

Перевод в текущую ПСК

(if pt (trans pt e 1))

);defun flp

Функция f lp работает примерно так же, как и функция f fp.

У примитива LINE координаты конечной точки располагаются в точечнойпаре с DXF-кодом 11. Для примитива SPLINE ищется последняя точечнаяпара с кодом 10.

Для примитива типа ARC помимо точечной пары с кодом 10, в которой на-ходится центр дуги, и точечной пары с кодом 40 (радиус) читается конеч-ный угол в радианах (число в точечной паре с кодом 51).

Все точки легкой полилинии (примитива типа LWPOLYLINE) находятся вточечных парах с DXF-кодом 10, среди которых ищется последняя. Третьякоордината, как и в программе ffp, извлекается из точечной пары с кодом38. Если легкая полилиния замкнута (т. е. значение в точечной паре с кодом70 равно 1), то в качестве последней точки нужно прочитать первую точку,поскольку в этом случае последняя точка в списке данных примитиваLWPOLYLINE в явном виде не фигурирует.

Page 544: Visual LISP и секреты адаптации AutoCAD

Приложение 14. Функции ffp и flp 543

В случае примитива типа POLYLINE читаются все следующие за ним при-митивы вершин, имеющие тип VERTEX, пока они не закончатся (при-знаком конца является примитив типа SEQEND), и обрабатывается послед-няя из вершин. Как и для примитива типа LWPOLYLINE, анализируетсязначение в точечной паре с кодом 70, поскольку в случае значения 1 у рас-сматриваемой полилинии в базе данных рисунка последней вершины в яв-ном виде нет и нужно в качестве последней точки взять первую.

Перевод полученных координат точки в текущую систему координат черте-жа выполнен с помощью функции trans.

Page 545: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 5

DXF-коды объектов AutoCAD

Структура данных основных объектов системы AutoCAD (графических при-митивов и неграфических элементов) изложена в настоящем приложении всоответствии с их DXF-кодами. В табл. П15.1 и П15.2 приведены типы зна-чений и расшифровка данных для кодов, общих для всех объектов.

В разд. 2.12 рассмотрены функции, работающие с объектами AutoCAD и ихDXF-кодами, используемыми в точечных парах спискового представления.

Имеются небольшие отличия данных кодов, получаемых с помощью функ-ций языка AutoLISP и среды программирования ObjectARX, от данных,фигурирующих в файлах формата DXF (сохранить рисунок в формате DXFможно с помощью команды СОХРАНИТЬКАК (SAVEAS)). Поэтому описа-ния, характерные только для формата DXF, помечены в таблицах признаком"DXF". Описания, действующие только при работе с приложениямиAutoLISP и ObjectARX, помечены признаком "АРР".

Таблица П15.1. Типы значений данных общих для всех объектов DXF-кодов

Код Типы значений данных

0—9 Строковое (зависит от реализации, обычно до 2000 символов длиной)

10—59 Трехмерная точка (вещественные координаты с двойной точностью)

60—79 16-битовое целое

90—99 32-битовое целое

100 Строковое (до 255 символов длиной; уменьшается при использованиисимволов Unicode)

102 Строковое (до 255 символов длиной; уменьшается при использовании

символов Unicode)

105 Строковое представление для шестнадцатеричной метки (handle)

140—147 Вещественное с двойной точностью

170—175 16-битовое целое

Page 546: Visual LISP и секреты адаптации AutoCAD

Приложение 15. DXF-коды объектов AutoCAD 545

Код

280-289

300-309

310-319

320-329

330-369

370-389

390-399

400-409

410-419

999

1000-1009

1010-1059

1060-1070

1071

Код

-5

-4

-3

-2

-1

0

1

2

3-4

5

Таблица П15.1 (окончание)

Типы значений данных

8-битовое целое

Произвольная строка

Строковая форма для шестнадцатеричного представления двоичныхобъектов

Строковое представление для шестнадцатеричной метки

Строковое представление для идентификаторов шестнадцатеричныхобъектов

8-битовое целое

Строковое представление для шестнадцатеричной метки

16-битовое целое

Строковое

Строковый комментарий

Строковое (ограничения как для DXF-кодов 0—9)

Вещественное

16-битовое целое

32-битовое целое

Таблица П15.2. Расшифровка данных для общих кодов

Описание

АРР: цепочка реакторов

АРР: условный оператор (используется функцией ssget)

АРР: признак расширенных данных (фиксирован)

АРР: ссылочное имя примитива (фиксировано)

АРР: имя примитива. Постоянно только в текущем сеансе AutoCAD(в следующем сеансе изменится). Не сохраняется (фиксировано)

Тип примитива (фиксирован)

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

Имя (атрибута, блока и т. п.)

Вторичное текстовое значение или имя

Метка примитива (строка до 16 символов длиной, недоступна для из-менения)

1 8 Зак. 155

Page 547: Visual LISP и секреты адаптации AutoCAD

546

Код Описание

Visual LISP и секреты адаптации AutoCAD

Таблица П15.2 (продолжение)

6 Имя типа линии (фиксировано)

7 Имя текстового стиля (фиксировано)

8 Имя слоя (фиксировано)

9 DXF: имя системной переменной (используется только в секцииHEADER DXF-файла)

10 Данные первой точки примитива (начало отрезка, центр окружности и т. п.).

DXF: Х-координата первой точки (координаты Y и Z идут под кодами 20 и 30)

АРР: трехмерная точка (список из трех вещественных чисел)

11—18 Данные других точек.

DXF: Х-координаты других точек (координаты Y идут под кодами 21-28,координаты Z — под кодами 31-38);

АРР: трехмерные точки (списки из трех вещественных чисел)

20, 30 DXF: координаты Y и Z для первой точки (см. код 10)

21—28 DXF: координаты Y для других точек (см. коды 11—18)

31—37 DXF: координаты Z для других точек (см. коды 11—18)

38 DXF: уровень примитива (если он отличен от нуля)

39 Высота (thickness) объекта, если она ненулевая (фиксирована)

40—47 Вещественные числа (высота текста, масштабные множители и т. п.)

48 Собственный масштаб типа линии (вещественное число)

49 Повторяющиеся вещественные значения (количество значений с кодом49 задается в двузначном коде, начинающемся с цифры 7). Повторяю-щиеся коды группы 49 используются в таблицах переменной длины(например, длины штрихов в таблице LTYPE)

50—58 Углы (в градусах в DXF-файлах; в радианах при чтении с помощью при-ложений AutoLISP и ObjectARX)

60 Состояние видимости примитива, целое число (1 — примитив невидим; 0

или отсутствие группы 60 означают видимость)

62 Номер цвета (фиксирован)

66 Флаг следования примитивов (фиксирован)

67 Тип пространства объекта (модели или листа, фиксирован)68 АРР: указание, 'включен ли видовой экран, но целиком вне текущего

окна графического экрана; неактивен или выключен

69 АРР: номер видового экрана

Page 548: Visual LISP и секреты адаптации AutoCAD

Приложение 15. DXF-коды объектов AutoCAD 547

Таблица П15.2 (продолжение)

Код Описание

70—78 Целые значения, используемые как счетчики повторений, битовые фла-ги, режимы

90—99 32-битовые целые числа

100 Маркер данных подкласса (со строковым именем порождающего клас-са). Требуются для всех классов примитивов и неграфических объектов,производных от других классов. Используется для разделения данных,когда объект наследует данные от разных классов в ObjectARX

102 Контрольная строка, "{<имя>" или "}". Аналогична коду группы 1002расширенных данных. После символа { может следовать любое имя,интерпретация которого зависит от приложения. Группа данных, предва-ряемая открывающей фигурной скобкой, должна затем обязательнозакончиться контрольной строкой }. Сама система AutoCAD непосред-ственно такие данные не использует (кроме операций проверки с помо-щью команды ПРОВЕРИТЬ (AUDIT)), их обработка возлагается на поро-ждающее приложение пользователя

105 Метка объекта для входа в таблицу DIMVAR

210 Направление выдавливания (фиксировано).

DXF: координата X вектора направления выдавливания;

АРР: координаты трехмерного вектора направления выдавливания

220 DXF: координата Y вектора направления выдавливания

230 DXF: координата Z вектора направления выдавливания

280—289 8-битовые целые

290—299 Флаги (булевы значения)

300—309 Произвольные строковые

310—319 Произвольные двоичные объекты с представлением и ограничениями,аналогичными группе 1004: шестнадцатеричными строками длиной до 254символов представляются группы двоичных данных длиной до 127 байтов

320—329 Метки произвольных объектов, "как есть". Не изменяются в результатеработы команд ВСТАВИТЬ (INSERT) и ССЫЛКА (XREF)

330—339 Метка мягкого указателя. Мягкие указатели должны действовать внутритого же рисунка или DXF-файла. Преобразуются командами ВСТАВИТЬ(INSERT) и ССЫЛКА (XREF)

340—349 Метка жесткого указателя. Жесткие указатели должны действоватьвнутри того же рисунка или DXF-файла. Преобразуются командамиВСТАВИТЬ (INSERT) и ССЫЛКА (XREF)

350—359 Метка мягкого указателя порождающего объекта. Указатели мягких роди-тельских ссылок должны действовать внутри того же рисунка или DXF-файла. Преобразуются командами ВСТАВИТЬ (INSERT) и ССЫЛКА (XREF)

18*

Page 549: Visual LISP и секреты адаптации AutoCAD

548

Код Описание

visual LISP и секреты адаптации AutoCAD

Таблица П15.2 (продолжение)

360—369 Метка жесткого указателя порождающего объекта. Указатели жестких роди-тельских ссылок должны действовать внутри того же рисунка или DXF-файла. Преобразуются командами ВСТАВИТЬ (INSERT) и ССЫЛКА (XREF)

370 Значение типа "перечисление" (enum). В графических примитивах — вес

линии (AcDb::LineWeight)

371—379 Значения типа "перечисление"

380 Значение типа "перечисление". В графических примитивах — имя стиляпечати (AcDb::PlotStyleNameType)

381—389 Значения типа "перечисление"

390 Строковое представление метки (в графических объектах — метки стиляпечати как объекта рисунка; метка является, как правило, жестким ука-зателем)

391—399 Строковое представление метки

400—409 16-битовые целые

410—419 Строки

999 DXF: строка комментария. Команда СОХРАНИТЬКАК (SAVEAS) не вклю-чает DXF-код 999 в выходной файл, но пользователь может добавить этоткод с данными при редактировании DXF-файла как простого текста

1000 Строка до 255 буквенно-цифровых знаков длиной (используется в рас-ширенных данных примитива)

1001 Имя приложения (строка до 31 символа длиной), для расширенных данных

1002 Контрольная строка расширенных данных ({ или })

1003 Имя слоя, для расширенных данных

1004 Двоичные данные (до 127 байтов длиной), для расширенных данных

1005 Строковое представление для метки, длиной до 16 шестнадцатеричныхцифр (для расширенных данных)

1010 Точка, для расширенных данных.

DXF: координата X (Y и Z располагаются в DXF-кодах 1020 и 1030);

АРР: трехмерная точка

1011 Трехмерная точка, интерпретируемая как положение в МСК (расширен-ные данные).

DXF: координата X (Y и Z располагаются в DXF-кодах 1021 и 1031);

* АРР: трехмерная точка

Page 550: Visual LISP и секреты адаптации AutoCAD

Приложение

Код

15. DXF-коды объектов AutoCAD

Описание

549

Таблица П15.2 (окончание)

1012 Трехмерная точка, интерпретируемая как перемещение в МСК (расши-ренные данные).

DXF: координата X (Y и Z располагаются в DXF-кодах 1022 и 1032);

АРР:трехмерная точка

1013 Трехмерная точка, интерпретируемая как направление в МСК (расши-ренные данные).

DXF: координата X (Y и Z располагаются в DXF-кодах 1023 и 1033);

АРР:трехмерная точка

1020 DXF: координата Y точки, начинающейся в DXF-коде 1010 (для расши-ренных данных)

1021 DXF: координата Y точки, начинающейся в DXF-коде 1011 (для расши-ренных данных)

1022 DXF: координата Y точки, начинающейся в DXF-коде 1012 (для расши-ренных данных)

1023 DXF: координата Y точки, начинающейся в DXF-коде 1013 (для расши-ренных данных)

1030 DXF: координата Z точки, начинающейся в DXF-коде 1010 (для расши-ренных данных)

1031 DXF: координата Z точки, начинающейся в DXF-коде 1011 (для расши-ренных данных)

1032 DXF: координата Z точки, начинающейся в DXF-коде 1012 (для расши-ренных данных)

1033 DXF: координата Z точки, начинающейся в DXF-коде 1013 (для расши-ренных данных)

1040 Вещественные числа, для расширенных данных

1041 Расстояние, для расширенных данных

1042 Масштабный множитель, для расширенных данных

1070 16-битовое целое со знаком, для расширенных данных

1071 32-битовое длинное целое со знаком, для расширенных данных

Файлы формата DXF делятся на секции со следующими именами:

• HEADER — содержит общую информацию о рисунке (номер версии изначения системных переменных);

Page 551: Visual LISP и секреты адаптации AutoCAD

550 Visual LISP и секреты адаптации AutoCAD

П CLASSES — содержит информацию о классах, порожденных приложе-ниями, и ссылки на которые встречаются в секциях BLOCKS, ENTITIESи OBJECTS;

О TABLES — содержит информацию о символьных таблицах (APPID,BLOCK_RECORD, DIMSTYLE, LAYER, LTYPE, STYLE, UCS, VIEW,VPORT — сравните с именами таблиц рисунка в разд. 2.13.1);

П BLOCKS — содержит информацию об описаниях блоков и элементахблоков;

П ENTITIES — содержит информацию о графических примитивах;

О OBJECTS — содержит информацию о неграфических объектах, не отно-сящихся к таблицам;

• THUMBNAILIMAGE — содержит растровый образец для быстрого про-смотра рисунка (данная секция может отсутствовать).

Наибольший интерес для нас представляют данные, хранящиеся в секцииENTITIES. В табл. П15.3 приводятся типы данных с DXF-кодами, которыеявляются общими для всех видов графических примитивов. Они не будутприведены в следующих таблицах (П15.4—Ш5.10), описывающих структуруобъектов рисунка примитивов некоторых типов.

Если ваша программа будет создавать в рисунке новые примитивы, то, фор-мируя список с данными этих объектов, заполняйте только те DXF-коды,значения которых отличны от значений по умолчанию, поскольку значенияпо умолчанию система AutoCAD за вас добавит сама.

Таблица П15.3. Данные общих DXF-кодов, используемых в секции ENTITIES

Код Значение По умолчанию

-1 АРР: имя примитива (изменяется в каждом сеансе Нетредактирования рисунка)

О Тип примитива Нет

5 Метка Нет

6 Имя типа линии ПОСЛОЮ

(BYLAYER)

8 Имя слоя Нет

48 Собственный масштаб типа линии 1.0

60 Видимость объекта (0 — видим, 1 — невидим) 062 Номер цвета; 0 соответствует значению ПОБЛОКУ ПОСЛОЮ

(BYBLOCK) (BYLAYER)

67 1 — пространство листа, 0 — пространство модели 0

Page 552: Visual LISP и секреты адаптации AutoCAD

Приложение 15. DXF-коды объектов AutoCAD

Код Значение

551

Таблица П15.3 (окончание)

По умолчанию

92

100

102

310

330

360

410

Размер растрового образца в байтах

АРР: имя вкладки

Нет

Маркер подкласса (имеет вид: "AcDb" + тип прими- Неттива)

Начало группы данных приложения (имеет вид Нет{<имя>, причем <имя> может быть опущено) или ко-нец группы данных приложения (имеет вид }). Строка{ACAD_REACTORS означает начало данных постоянно-го реактора. Строка {ACAD_XDICTIONARY указываетначало расширения словаря (только для постоянногореактора)

Данные растрового образца (количество строк, не Нетболее 256 символов в строке)

Мягкий указатель или метка словаря, к которому Нетпринадлежит объект

Жесткий указатель или метка словаря, к которому Нетпринадлежит объект

Нет

В рисунке встречаются примитивы следующих типов:

3DFACE

3DSOLID

ACAD_PROXY_ENTITY

ARC

ARCALIGNEDTEXT

ATTDEF

ATTRIB

BODY

CIRCLE

DIMENSION

ELLIPSE

HATCH

IMAGE

INSERT

LEADER

LINE

LWPOLYLINE

MLINE

MTEXT

OLEFRAME

OLE2FRAME

POINT

POLYLINE

RAY

REGION

RTEXT

SEQEND

SHAPE

SOLID

SPLINE

TEXT

TOLERANCE

TRACE

VERTEX

VIEWPORT

WIPEOUT

XLINE

В табл. П15.4—П15.10 приведены описаний DXF-кодов для основных прими-тивов: LINE, CIRCLE, LWPOLYLINE, POLYLINE, VERTEX, SEQEND,INSERT. Общие для этих примитивов DXF-коды рассмотрены в табл. П15.3.

Page 553: Visual LISP и секреты адаптации AutoCAD

552

Код Значения данных

Visual LISP и секреты адаптации AutoCAD

Таблица П15.4. Данные DXF-кодов, используемыев секции ENTITIES примитива LINE

По умолчанию

100 Маркер подкласса ("AcDbLine") Нет

39 Высота (величина выдавливания) 0

10 Начальная точка (в МСК). Нет

DXF: координата X начальной точки (координаты Y и Zидут под кодами 20 и 30);

АРР: трехмерная точка

20 DXF: координата Y начальной точки Нет

30 DXF: координата Z начальной точки Нет

11 Конечная точка (в МСК). Нет

DXF: координата X конечной точки (координаты Y и Z идутпод кодами 20 и 30);

АРР: трехмерная точка

21 DXF: координата Y конечной точки Нет

31 DXF: координата Z конечной точки Нет

210 Вектор направления выдавливания (начинается в точке DXF: 0(0,0,0)).

DXF: координата X вектора выдавливания (координаты Y АРР: (0, 0, 1)и Z идут под кодами 220 и 230);

АРР: трехмерная точка

220 DXF: координата Y вектора выдавливания 0

230 DXF: координата Z вектора выдавливания 1

Таблица П15.5. Данные DXF-кодов, используемыев секции ENTITIES примитива CIRCLE

Код Значения данных По умолчанию

100 Маркер подкласса ("AcDbCircle") Нет

39 Высота (величина выдавливания) 0

10 Точка центра (в СК объекта). Нет

DXF: координата X точки центра (координаты Y и Z идутпод кодами 20 и 30);

АРР: трехмерная точка

Page 554: Visual LISP и секреты адаптации AutoCAD

Приложение 15. DXF-коды объектов AutoCAD 553

Таблица П15.5 (окончание)

Код Значения данных По умолчанию

20 DXF: координата Y точки центра Нет

30 DXF: координата Z точки центра Нет

40 Радиус Нет

210 Вектор направления выдавливания (начинается в точке DXF: 0( 0 Д 0 ) ) - АРР: (0,0,1)DXF: координата X вектора выдавливания (координаты Yи Z идут под кодами 220 и 230);

АРР:трехмерная точка

220 DXF: координата Y вектора выдавливания 0

230 DXF: координата Z вектора выдавливания 1

Таблица 15.6. Данные DXF-кодов, используемыев секции ENTITIES примитива LWPOLYLINE

Код Значения данных По умолчанию

100 Маркер подкласса ("AcDbPolyline") Нет

90 Количество вершин Нет

70 Флаг, как сумма включенных битовых флагов (1 — замк- 0нутая полилиния; 128— режим применения типа линии ковсему объекту в целом, а не к отдельным участкам)

43 Постоянная ширина. Не используется при переменной 0ширине (см. DXF-коды 40 и 41)

38 Уровень 0

39 Высота (величина выдавливания) 0

10 Вершина (в СК объекта). Повторяется столько раз, каково Нетколичество вершин в полилинии.

DXF: координата X вершины (координата Y идет под ко-дом 20);

АРР: двумерная точка

20 DXF: координата Y вершины Нет

40 Начальная ширина участка. Повторяется столько раз, ка- 0ково количество вершин в полилинии. Не используетсяпри постоянной ширине (см. DXF-код 43)

41 Конечная ширина участка. Повторяется столько раз, ка- 0ково количество вершин в полилинии. Не используетсяпри постоянной ширине (см. DXF-код 43)

Page 555: Visual LISP и секреты адаптации AutoCAD

554

Код Значения данных

Visual LISP и секреты адаптации AutoCAD

Таблица 15.6 (окончание)

По умолчанию

42 Кривизна (buldge) — тангенс четверти угла, стянутого ду- Оговым сегментом. О — для прямолинейного сегмента, 1 —для полуокружности. К кривизне добавляется знак минус,если она идет по часовой стрелке. Повторяется столькораз, каково количество вершин в полилинии

210 Вектор направления выдавливания (начинается в точке DXF: 0( 0 Д 0 ) ) - АРР: (0,0,1)DXF: координата X вектора выдавливания (координаты Yи Z идут под кодами 220 и 230);

АРР: трехмерная точка

220 DXF: координата Y вектора выдавливания 0

230 DXF: координата Z вектора выдавливания 1

В табл. П15.7 рассматривается структура данных примитива типа POLYLINE.Используется сокращение: СКО — система координат объекта.

В базе рисунка вслед за основным примитивом POLYLINE должны обяза-тельно идти подпримитивы (это примитивы типа VERTEX с данными овершинах и примитив типа SEQEND, являющийся признаком конца поли-линии). Структура примитивов типа VERTEX и SEQEND рассматривается втабл. П15.8 и Ш5.9.

Под одним именем POLYLINE фактически сохраняются три типа объектов:двумерная полилиния, трехмерная полилиния и сеть.

Таблица П15.7. Данные DXF-кодов, используемыев секции ENTITIES примитива POLYLINE

Код Значения данных По умолчанию

100 Маркер подкласса ("AcDb2dPolyline" или "AcDb3dPolyline") Нет

10 DXF: 0 Нет

АРР: фиктивная трехмерная точка, у которой координатыX и Y равны 0, а координата Z равна уровню объекта (вСКО — для двумерной полилиниии, в МСК — для трех-мерной полилинии)

20 DXF: 0 Нет

30 DXF: для двумерной полилинии — уровень объекта в СКО, Нетдля трехмерной — уровень в МСК

39 Высота (величина выдавливания) 0

Page 556: Visual LISP и секреты адаптации AutoCAD

Приложение 15. DXF-коды объектов AutoCAD 555

Таблица П15.7 (окончание)

Код Значения данных По умолчанию

70 Флаг, как сумма включенных битовых флагов (1 — замк- 0нутая полилиния или сеть, замкнутая в направлении М;2 — опцией СГладить (Fit) при редактировании добавленывспомогательные вершины; 4 — опцией СПлайн (Spline)при редактировании добавлены вспомогательные верши-ны; 8— признак трехмерной полилинии; 16— признакмногоугольной сети из четырехугольных ячеек; 32 — сетьзамкнута в направлении N; 64— признак многограннойсети; 128— режим применения типа линии ко всей поли-линии в целом, а не к отдельным участкам)

40 Начальная ширина полилинии 0

41 Конечная ширина полилинии 0

71 Количество вершин сети в направлении М 0

72 Количество вершин сети в направлении N 0

73 Плотность сглаживания сети в направлении М 0

74 Плотность сглаживания сети в направлении N 0

75 Тип сглаживания полилинии или сети. Одно из целочис- 0ленных значений: 0 — без сглаживания; 5 — квадратичныйВ-сплайн; 6 — кубический В-сплайн; 8 — поверхность Безье

210 Вектор направления выдавливания (начинается в точке DXF: 0(0,0,0)).

DXF; координата X вектора выдавливания (координаты Y АРР; (0, 0, 1)и Z идут под кодами 220 и 230);

АРР:трехмерная точка

220 DXF: координата Y вектора выдавливания 0

230 DXF: координата Z вектора выдавливания 1

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

( Замечание ^

Многогранная сеть тоже является разновидностью примитива POLYLINE. Ее при-знаком служит наличие битового флага 64 в DXF-коде 70. В этом случае DXF-код71 задает количество вершин в сети, а DXF-код 72 — количество полиграней.

Грани многогранной сети (полиграни) могут иметь произвольное количествовершин. Многогранные сети создаются командой ПГРАНЬ (PFACE). В базе ри-

Page 557: Visual LISP и секреты адаптации AutoCAD

556 Visual LISP и секреты адаптации AutoCAD

сунка вслед за основным примитивом POLYLINE идут примитивы VERTEX, ко-торые сначала описывают положение вершин, а затем — полиграней.

Таблица П15.8. Данные DXF-кодов, используемыев секции ENTITIES примитива VERTEX

Код Значения данных По умолчанию

100 Маркер подкласса ("AcDbVertex", "AcDb2dVertex" или Нет"AcDb3dPolylineVertex")

10 Вершина (для двумерной полилинии — в СКО, для Неттрехмерной полилинии или сети — в МСК).

DXF: координата X вершины (координаты Y и Z идут подкодами 20 и 30);

АРР: двумерная или трехмерная точка

20 DXF: координата Y вершины Нет

30 DXF: координата 2 вершины Нет

40 Начальная ширина полилинии 0

41 Конечная ширина полилинии 0

42 Кривизна (buldge) — тангенс четверти угла, стянутого 0дуговым сегментом. 0— для прямолинейного сегмента,1 — для полуокружности. К кривизне добавляется знакминус, если она идет по часовой стрелке

70 Флаг, как сумма включенных битовых флагов (1 — 0вспомогательная вершина, добавленная опцией СГла-дить (Fit) при редактировании; 2 — в вершине заданонаправление касательной для опции СГладить (Fit); 8 —вспомогательная вершина, добавленная опциейСПлайн (Spline) при редактировании; 16— управляю-щая точка каркаса сплайна; 32 — точка трехмерной по-лилинии; 64— точка многоугольной сети; 128— точкамногогранной сети). Бит 4 не используется

50 Направление касательной для опции СГладить (Fit) Нетоперации редактирования полилинии

71 Номер вершины полиграни 0

72 Номер вершины полиграни 0

73 Номер вершины полиграни 0

74 Номер вершины полиграни 0

Если примитив VERTEX определяет вершину полиграни, то для нее вклю-чены битовые флаги 64 и 128, а DXF-коды 10, 20 и 30 задают координатывершины.

Page 558: Visual LISP и секреты адаптации AutoCAD

Приложение 15. DXF-коды объектов AutoCAD 557

Если примитив VERTEX определяет саму полигрань, то для нее включенбитовый флаг 128 и выключен битовый флаг 64. DXF-коды 10, 20 и 30 незадают никаких координат и обычно равны нулю. Данные DXF-кодов 71—74 определяют вершины полиграни. Если в полиграни меньше четырехвершин, то лишние заполняются нулями. Знак минус перед номером вер-шины означает, что кромка, начинающаяся в данной вершине, имеет при-знак невидимости.

Если полиграни, создаваемые командой ПГРАНЪ (PFACE), имеют болеечетырех вершин, то AutoCAD самостоятельно разбивает полиграни на болеемелкие.

Таблица П15.9. Данные DXF-кодов, используемыев секции ENTITIES примитива SEQEND

Код Значения данных По умолчанию

-2 АРР: имя порождающего примитива (типа POLYLINE или НетINSERT)

Примитив SEQEND может завершать данные не только по вершинам поли-линии, но и данные по атрибутам вхождения блока.

Примитивы INSERT,, структура которых рассматривается в табл. П15.10,соответствуют вхождениям блока (т. е. объектам рисунка, полученным ко-мандой ВСТАВИТЬ (INSERT) для блоков).

Таблица П15.10. Данные DXF-кодов, используемыев секции ENTITIES примитивов INSERT

Код Значения данных По умолчанию

100 Маркер подкласса ("AcDbBlockReference") Нет

66 Признак наличия атрибутов, следующих за примитивом 0INSERT (1 - есть, 0 - нет)

2 Имя блока Нет

10 Точка вставки блока (в СКО). Нет

DXF: координата X точки вставки (координаты Y и Z идутпод кодами 20 и 30);

АРР:трехмерная точка

20 DXF: координата Y точки вставки Нет

30 DXF: координата Z точки вставки Нет

41 Масштабный множитель по оси X 1

42 Масштабный множитель по оси Y 1

Page 559: Visual LISP и секреты адаптации AutoCAD

558

Код Значения данных

visual LISP и секреты адаптации AutoCAD

Таблица П15.10 (окончание)

По умолчанию

43 Масштабный множитель по оси Z . 1

50 Угол поворота 0

70 Количество столбцов 1

71 Количество рядов 1

44 Расстояние между столбцами 0

45 Расстояние между рядами 0

210 Вектор направления выдавливания (начинается в точке DXF: 0(0'°-0))- АРР: (0,0,1)DXF: координата X вектора выдавливания (координаты Yи Z идут под кодами 220 и 230);

АРР: трехмерная точка

220 DXF: координата Y вектора выдавливания 0

230 DXF: координата 2 вектора выдавливания 1

Если примитив INSERT является вхождением блока с атрибутами (см. DXF-код 66), то тогда после самого INSERT в базе рисунка следуют примитивыATTRIBUTE. Признаком конца атрибутов является примитив SEQEND.

Page 560: Visual LISP и секреты адаптации AutoCAD

ПРИЛОЖЕНИЕ 1 6

Перечень функцийязыка DIESEL

В табл. П16.1 приведены наименования функций языка DIESEL (Direct In-terpretively Evaluated String Expression Language), назначение и количествоаргументов. Вопросы использования языка рассмотрены в разд. 4.14.

Таблица П16.1. Перечень функций языка DIESEL

Функция

${-,ч1[,ч2[,

${*,ч1[,ч2[,

9U.4ll.42l,

${=гч1,ч2)

$(<,ч2,ч2)

$(>,ч1,чг2)

$(<=,ч1,ч2)

$«=,ч1,ч2)

${>=гч1,ч2)

..:tv*]...m

... [ч9]...]])

... [ч9]...]])

... [чЗ]...]])

Назначение

Вычисляет сумму чиселч1, ч2, ..., ч9

Вычисляет разность чисел

Вычисляет произведение чисел

Вычисляет частное от делениячисел

Проверяет числа ч1 и ч2 на ра-венство

Проверяет, меньше ли число ч1числа ч2

Проверяет, больше ли число ч1числа ч2

Проверяет числа ч1 и ч2 на нера-венство

Проверяет, меньше число ч1 чис-ла ч2 или числа равны

Проверяет, больше число ч1 чис-ла ч2 или числа равны

Кол-воаргумен-тов

1-9

1-9 .

1-9

1-9

2

2

2

2

2

2

Page 561: Visual LISP и секреты адаптации AutoCAD

560 Visual LISP и секреты адаптации AutoCAD

Таблица П16.1 (продолжение)

Функция НазначениеКол-воаргумен-тов

$(and, ч1[,ч2[,

$ (angtos,yt, Ф

$(edtime,дата,ф)

$(eq,cl,c2)

$ (eval, с)

$(fix, w)

$ (getenv, л)

$ (getvar, л)

$ ( i f , у е л , то[,иначе])

$ (index, и, с)

$(linelen)

Выполняет побитовую логическую 1—9операцию И над числами

Преобразует угол у в формат ф 1—3и с точностью т\ если фи топу-щены, то в качестве их значенийберутся текущие установкикоманды ЕДИНИЦЫ (UNITS).Значения формата ф и точности таналогичны значениям аргумен-тов <представление> И<точность> функции AutoLISPangtos (см. разд. 2.7.8)

Возвращает время и дату в за- 2данном формате (см. ниже)

Проверяет равенство строк с1\л 2с2 (1 — равны, 0 — не равны)

Вычисляет выражение, записан- 1ное в символьном виде в строку с

Усекает вещественное число ч 1до целого

Возвращает значение перемен- 1ной окружения л (если перемен-ной с именем л нет, то возвраща-ет пустую строку)

Возвращает значение системной 1переменной л

Выполняет условную операцию 2—3типа "если-то-иначе"

Выделяет из строки с элемент 2с номером н (строка с разделенана элементы с помощью запятых)

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

Page 562: Visual LISP и секреты адаптации AutoCAD

Приложение

Функция

16. Перечень функций языка DIESEL

Назначение

Таблица П16.1

561

(окончание)

Кол-воаргумен-тов

$ (nth, H , a O [ , a l [ , ... , [a?].. .]] !

$ ( o r , ч1[,ч2[, ...

$ ( r t o s , 4 t , * [ , T ] ] )

$ (strlen, с)

$ (substr, с, н[,д] )

$ (upper, с)

Вычисляет аргумент, находящийся 2—9на месте с номером я (от 0 до 7)

Выполняет побитовую логическую 1—9операцию ИЛИ над числами

Преобразует вещественное 1—3число ч в строку с форматом фи точностью г; если ф и г опуще-ны, то берутся текущие установкикоманды ЕДИНИЦЫ (UNITS)

Вычисляет длину строки с 1(количество символов)

Выделяет из строки с подстроку 2—3длины л, начиная с символаномером н; если длина не задана,то возвращает остаток строки,начиная с указанного места

Преобразует строку с в верхний 1регистр с учетом национальногоалфавита

Выполняет побитовую логическую 1—9операцию ИСКЛЮЧАЮЩЕЕ ИЛИ(XOR) над числами

Функция edtime позволяет вывести значение системной переменной DATEв заданном формате. Формат представляется строкой, использующей специ-альные символы (табл. П16.2). Все прочие встретившиеся в строке форматанеспециальные символы (запятые, минусы и т. п.) просто копируются в вы-ходную строку.

Таблица П16.2. Символы формата, используемые функцией edtime

Символы Значение Пример

YY Год (две последние цифры)

YYYY Год (четыре цифры)

м Месяц (одна цифра)

МО М е с я ц (две ц и ф р ы )

61

1961

1

01

Page 563: Visual LISP и секреты адаптации AutoCAD

562 Visual LISP и секреты адаптации AutoCAD

Таблица П16.2 (окончание)

Символы

MON

MONTH

D

DD

DDD

DDDD

Н

НН

ММ

SS

MSEC

АМ/РМ

am/pm

А / Р

а / р

Значение

Месяц (три буквы)

Месяц (полный текст)

Число месяца (одна цифра)

Число месяца (две цифры)

День недели (в русской вереи!/в английской — три)

День недели (полный текст)

Часы (одна цифра)

Часы (две цифры)

Минуты (две цифры)

Секунды (две цифры)

Миллисекунды (три цифры)

До полудня или после полудня

До полудня или после полудня

До полудня или после полудня

До полудня или после полудня

Пример

Фев

Февраль

8

08

Чт

Четверг

4

04

37.

24

827

РМ

рт

Р

Р

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

Пример:п $ (edtime,$ (getvar,date) , DDD", " DD MON YYYY) МОЖет вернуть Ср,

28 Фев 2001

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

(setvar "MODEMACRO" "$(edtime,$(getvar,date),DDD\",\" DD MON YYYY)")

Page 564: Visual LISP и секреты адаптации AutoCAD

Предметный указатель

АARX-приложение 204

DDCL-файлы 320DVB-приложение 211DXF-код 90, 112, 156, 172, 544

FFAS-приложение 244, 256, 259, 261

нHELP-файлы Windows 367

м

оObjectARX 51

VVisual Basic 51VLA-объекты 382VLR-объекты 406VLX-приложение 198, 256, 262

wwild-card-characters 105

XХ-запись 184, 185

MNL-файл 316

Page 565: Visual LISP и секреты адаптации AutoCAD

564 Предметный указатель

Автоматическая загрузка приложения 267Анимация программы 259Аргументы 56О функции 189, 215Атом 78, 116Атрибут:О action 337, 348О alignment 326, 327, 337, 343О big_increment 341О children_alignment 326, 343О childrenJlxedjieight 327, 343О childrcn_fixed_width 327, 343О color 338О editjimit 337О edit_width 337О fixedjieight 343О fixed_width 337, 338, 343О fixed_width_font 339О height 326, 339О initial_focus 326О key 326О label 325, 341, 343, 346О layout 341О max_value 341О min_value 341О multiple_select 339О smalMncrement 341О value 326, 340, 342, 350О width 326

Баланс скобок 55Безопасные массивы 387Библиотеки слайдов 48Битовый флаг 26, 29Буфер обмена Windows 46

ВВариант 384Вектор выдавливания 99Вершины полилинии 154Возвращаемое значение 55Восстановление:О начального диалогового окна 200 примитива 155Временный реактор 439

Вывод:0 текста в бокс экранного меню 2210 , текста в строку режимов 221Выполнение файла сценария 50Выражение:0 AutoLISP54.0 языка DIESEL 314Высота примитива 546

Глобальные переменные 216Горячие клавиши 284Графическая библиотека 44, 45, 48Группа 160Групповые кнопки 308Группы меню 271

дДиалоговое окно 2650 LISP-файлы для сборки приложения

(LISP Files to Include) 2640 Выбор шрифта (Select Font) 2470 Изучение (Inspect) 2380 Инспектор символов (Symbol Service)

2390 Консоль Visual LISP (Visual LISP

Console) 2570 Контрольное значение (Watch) 2400 Начало работы (Startup) 200 Новый проект (New Project) 2590 Общие параметры (General Options) 2480 Опции форматирования (Format

options) 2480 Оформление окна (Window Attributes)

2470 Панели инструментов (Toolbars) Visual

LISP 2430 Папка приложения (Application

Directory) 2630 Параметры приложения (Application

Options) 2630 Параметры справочного списка

(Apropos) 2410 Параметры страницы (Page Setup) 2490 Просмотр параметров/Сборка

приложения (Review Selections/BuildApplication) 266

О Режим Мастера (Wizard Mode) 262

Page 566: Visual LISP и секреты адаптации AutoCAD

Предметный указатель 565

О Свойства проекта (Object Properties) 259О Точки останова (Breakpoints) 242О Файлы ресурсов (Resource Files to

Include) 264О Цветовой стиль (Color Style) 246Ф вложенное 363Дигитайзер 229Директива 3200 описания диалога 3240 описания поля 331

Загрузка:0 - LISP-файла в рисунки 610 приложения 169, 2670 функции 191Знаки специальные групповые 105

ИИменное пространство 2170 внедокументное 60, 212, 219О документа 2150 отдельное 207, 2090 собственное 209, 217Имитация нажатия клавиши <Enter> 63Имя:О набора 1620 примитива 98, 1530 слоя 1560 таблицы 170О типа линии 156Инструкция ©include 324Интерпретатор AutoLISP 53

ККлючевое слово dialog 324Код возврата внешней команды 26Количество наборов выбора 160Команда:0 ЗМ (3D) 2090 EXIT 290 EXPRESSTOOLS 209, 2740 SH280 START 270 VBASTMT2180 VLIDE2330 VLISP233

0 АТОПР (ATTDEF) 2280 АТЭКСП (АТТЕХТ) 2280 БЛОК (BLOCK) 2280 БРАУЗЕР (BROWSER) 350 БТКОПИРОВАТЬ (COPYBASE) 460 ВБУФЕР (CUTCLIP) 460 ВИД (VIEW) 2280 ВПАКЕТ (RSCRIPT) 500 ВСТАВИТЬ (INSERT) 30, 33, 44, 229,

547, 5570 ВСТБЛОК (PASTEBLOCK) 460 ВСТБУФЕР (PASTECLIP) 460 ВСТИСХОД (PASTEORIG) 460 ГРАФЭКР (GRAPHSCR) 2210 ГРУППА (GROUP) 1600 ДОС1 280 ДСЛАЙД (MSLIDE) 480 ДУГА (ARC) 2870 ЗАДЕРЖКА (DELAY) 500 ИЗОБ (IMAGE) 229О ИЗОБВСТАВИТЬ (IMAGEATTACH) 480 ИЗОБРЕГУЛ (IMAGEADJUST) 2290 ИМПОРТД (DXBIN) 30О ИМПОРТПС (PSIN) 4510 КБУФЕР (COPYCLIP) 460 КШТРИХ (ВНАТСН) 2290 МЕНЮ (MENU) 35, 270, 2730 МЕНЮВЫГР (MENUUNLOAD) 2730 МЕНЮЗАГР (MENULOAD) 2720 МТЕКСТ (МТЕХТ) 2290 НАСТРОЙКА (OPTIONS) 20, 310 НОВОЕИМЯ (RENAME) 2290 ОСВЕЖИТЬ (REDRAW) 220, 2240 ОТКРЫТЬ (OPEN) 2180 ОТМЕНИ (UNDO) 5150 ОТМЕНИТЬ (UNDO) 427, 5180 ОТРЕЗОК (LINE) 620 ПАКЕТ (SCRIPT) 50, 527, 533О ПАНЕЛЬ (TOOLBAR) 229, 2770 ПБЛОК (WBLOCK) 4280 ПГРАНЬ (PFACE) 555, 5570 ПЕРЕИН (REIN1T) 31, 3730 ПЕЧАТЬ (PLOT) 2290 ПЛАНШЕТ (TABLET) 3020 ПЛОЩАДЬ (AREA) 515, 5190 ПОДЕЛИТЬ (DIVIDE) 510, 5120 ПОКАЗАТЬ (ZOOM) 630 ПОМОЩЬ (HELP) 520 ПРОВЕРИТЬ (AUDIT) 5470 ПСЗАКР (PSF1LL) 451Продолжение рубрики см. на с. 566

Page 567: Visual LISP и секреты адаптации AutoCAD

566 Предметный указатель

Команда (окончание):О РАЗМЕР (DIM) 286О РАСТЯНУТЬ (STRETCH) 176О РАСЧЛЕНИТЬ (EXPLODE) 515О РЕГЕН (REGEN) 221, 224О РЛИСТ (LAYOUT) 526О СЛАЙД (VSLIDE) 49О СЛОЙ (LAYER) 229, 515, 518О СОХРАНИТЬКАК (SAVEAS) 24, 544,

548О СПИСОК (LIST) 157О СПРАВКА (HELP) 286О ССЫЛКА (XREF) 547О СТЕРЕТЬ (ERASE) 515О СТИЛЬ (STYLE) 229О ТЕКСТЭКР (TEXTSCR) 221О ТИПЛИН (LINETYPE) 229О УСТПЕРЕМ (SETVAR) 52О ФОРМАТЛ (MVSETUP) 209, 527О ЦВЕТ (COLOR) 63, 229О ЦУВКЛ (ADCENTER) 47О ЦУОТКЛ (ADCCLOSE) 47О ЭКСПОРТПС (PSOUT) 36, 451О внешняя 26

О вызова внешних приложений 25Командный файл 42, 44Комментарий 56, 324Компиляция программы 195Константы:0 списковые 580 строковые 58Координаты:0 видовых экранов 900 начальной точки 156Копия предыдущего состояния

LSP-файла 256

мМакрос пункта меню 284Масштаб типа линии 156, 546Меню 2690 Вид (View) Visual LISP 2370 Окно (Window) Visual LISP 2500 Отладка (Debug) Visual LISP 2450 Поиск (Search) Visual LISP 2360 Правка (Edit) Visual LISP 2350 Проект (Project) Visual LISP 244, 2590 Сервис (Tools) Visual LISP 246, 2500 Файл (File) Visual LISP 2340 заголовок 283

О каскадные 2910 контекстные 3090 разделы 2730 фрагментное 272Метка примитива 545Многогранная сеть 555Многодокументный режим 450 запрет 2180 разрешение 219

нНабор 1600 закрытие 160Номер цвета 156

Объект типаVL-CATCH-ALL-APPLY-ERROR 126

Окно:0 <Сообщения сборки> (<Builder Ouput>)

2420 AutoCAD Shell Active 280 Консоль Visual LISP (Visual LISP

Console) 2430 обзора базы данных рисунка 2430 Поиск ошибок (Error Trace) 2390 Справочный список найденных

символов (Apropos results) 2410 Стек трассировки (Trace Stack) 239Описание:0 многоугольника 165О способа выбора примитива 1640 точки 165

пПанели инструментов Visual LISP 2340 Вид (View) Visual LISP 2540 Отладка (Debug) 2530 Поиск (Search) 2520 Сервис (Tools) 2520 Стандартная (Standard) 2510 форма 279Пауза в меню 287Переинициализация файла acad.pgp 31Переключатель:0 /Ь430 /с 42

Page 568: Visual LISP и секреты адаптации AutoCAD

Предметный указатель 567

О /nologo 44О /р44О /г 43О /s43О Д 43О /v44О командной строки 42Переменная 56О действия 355О локальная 189, 215О окружения PATH 373О окружения TEMP 149О окружения ТМР 149О рабочая 189,215О среды ACAD 25, 43Планшет 229Поле:О boxed_radio_vow 341О button 336О column 342Ф - concatenation 345О edit_box 337О entile 338О image 338О image_button 338О listjrax 338, 357О ok_button 345О ok_cancel 346О ok_cancel_err 346О ok_cancel_help 346О ok_cancel_help_entile 346О ok_cance1_help_jnfo 346О ok_oniy 345О paragraph 345О popupbox 357О popupjist 339О radio_button 340О radio_column 340, 341О radiorow 340О row 342, 343О slider 341О spacer 346О spacerj) 346О spacer_l 346О text 344О text_part 345О toggle 341Полигрань 555Портфель автозагрузки 268Постоянный реактор 439

Примитивы:О LWPOLYL1NE 154О POLYLINE 154О SEQEND 154О VERTEX 154О неосновные 160О основные 160Проверка скобок в Visual LISP 236Проект 259О Visual LISP 244Прототип рисунка 43Профили 38О добавление 39О импорт 39Псевдоимена стандартных команд 25, 30Пустой ввод 128Пути доступа к файлам поддержки 33, 34

Рабочая папка 25Рабочий каталог 41, 42Растровый образец 45Расширенные данные 175, 185Регистрация приложения 177Ручки 166

Сборка мусора 202Символ:0 AutoLISP 56, 570 nil 59, 600 pause 590 pi 590 Т590 зарезервированный 590 предопределенный 59Система координат:0 мировая 990 объекта 990 текущая 990 экранная 990 экранная листа 99Системная переменная:0 ACADLSPASDOC 2320 ANGBASE97, 1330 ANGDIR 1330 APERTURE 220Продолжение рубрики см. на с. 568

Page 569: Visual LISP и секреты адаптации AutoCAD

568 Предметный указатель

Системная переменная (окончание):О AREA 519О AUNITS 96, 97О AUPREC97О CDATE537О CECOLOR 135О CLAYER 135О CURSORSIZE 135О CVPORTS 173О DCTMAIN36О DIMZIN 95О ELEVATION 100О EXTNAMES 174О F1LEDIA273О FONTALT36О FONTMAP36О INETLOCATION 35О LIMCHECK 128О LOGFILEPATH 37О LUNITS 95, 98О LUPREC95О MENUCTL298О MENUECHO 286О MODEMACRO 222, 314О MTEXTED36О PDMODE 135, 512О PDSIZE512О POPUPS 128О PROJECTNAME 35О PSPROLOG 36О RE-INIT31О SCREENBOXES 223, 295О SDI 218О TABMODE 229О TEMPPREFIX 37О TILEMODE90О UNITMODE 95, 97О XCLIPFRAME 316О XLOADPATH38Слайд 48Словари 179О типы 181Совместимость приложений 217Создание:О нового рисунка по шаблону 21О новой команды AutoCAD 192О простейшего нового рисунка 20О слайда 48О функций пользователя 188Список 54Справочная система 366

Строка:О падающих меню 275О режимов 312Структура:О пункта меню 284О файлов формата DXF 549Схема обработки ввода с клавиатуры 52

Текстовый стиль 546Тело функции 189Технология ActiveX 45Тип:О линии 546О примитива 152, 156, 545Тихий выход 141, 142Точечная пара 112, 116Точечный список 117Трассировка функции 199Тройка файлов меню 270

Установка вида в видовом экране 172Утилита slidelib.exe 51

ФФайл:0 acad.dcl 4500 acad.lin41,4500 acad.lsp 41, 230, 4500 aead.mln 4510 acad.mnl 4510 acad.mns 4510 acad.mnu 4510 acad.pat 4510 acad.pgp 25, 41, 52, 451О acad.psf4510 acad.rx 4510 acad.unt 4510 acad2000.1sp 230, 4500 acad2000doc.lsp 231, 4510 acaddoc.lsp 41, 231,4500 acadiso.lin 4500 acadiso.pat 4510 base.dcl 450О fontmap.ps 4510 Itypeshp.shp 451

Page 570: Visual LISP и секреты адаптации AutoCAD

Предметный указатель 569

О компилированного меню 269О ресурсов меню 269О сценария 43О текстовой части меню 269О шаблона меню 269Файлы WinHelp 366Фиксирование панели 278Формат DXF 544Функции:О AutoLISP488О арифметические 64О безымянные 188О булевы 88О вычислительные 81О преобразования данных 93О экспортированные 208Функция:0 - 6 50 *650 *еггог* 1960 / 6 60 / = 6 80 ~ 670 + 6 40 <690 <=690 = 6 80 > 700 >=700 1-670 1+ 660 abs670 acadcolordlg 1380 acad_helpdlg 3750 acad_strlsort 1210 actionjile 329, 337, 348, 5220 add_list3570 add_list5220 alert 143, 349, 510, 535О alloc201,202О and 71, 508О angle 83О angtof 96, 97О angtos 96, 97О append 113, 520, 538О apply 118, 126, 188О агх204О arxload 205О arxunload 205О ascii 101, 143, 513О assoc 118, 156, 510, 527, 538

О atan 85О atof96О atoi 59, 96О atoms-family 187, 199О autoarxload 206О autoload 206О Boole 88О boundp 78О сааг 115О caddr527О cadr l l5О саг 114, 168,527О cdr 114, 156, 527О chr 101, 513О client_data_tile 349О close 140, 152, 527, 535О command 59, 61, 64, 231, 348, 510,

515, 527О cond 74, 538О cons 116, 520О cos 85О cvunit 100О defun 60, 188, 376О defun-q 192О defun-q-list-ref 194О dictadd 183О dictnext 181О dictremove 184О dictrename 184О dictsearch 180О dimxjile 361О dimy_tile 361О distance 84О' distof 98О donejiialog 329, 330, 522О end_image 338, 359О endjist 339, 340, 358, 522О ending 111О entdel 155, 510О entget 155, 161, 168, 172, 175, 510, 520,

521, 527, 538О entlast 98, 153, 510О entmake 99, 157, 177О entmakex 157О entmod 158, 177, 520, 521О entnext98, 153,510,538О entsel 98, 130, 154, 168, 510, 527, 538О entupd 158О eq 68, 79О equal 68, 79Продолжение рубрики см. на с. 570

Page 571: Visual LISP и секреты адаптации AutoCAD

570 Предметный указатель

Функция (продолжение):О eval 1200 exit 196, J97, 5220 ехр 85О expand 201О expt 86О ffll_image 359О findfile 139, 148О fix 59, 81О float 59, 94О foreach 120О function 119, 122—126, 195О gc 201, 202, 217О gcd83О get_attr 355О getjile 354О getangle 132О getcfg 136<> getcname 136О getcorner 134О getdist 132О getenv 135О getfiled 137, 152, 535О gctint 58, 131О getkword 130, 522, 527О getorient 133О getpoint 133О getreal 132О getstring 130, 134О getvar 134,515, 522, 527, 535О graphscr221О grclear 225О grdraw 224О grread 225О grtext221О grvecs 224О handent 158О help 371О if 73, 508О initdia 228О initget 128, 522, 527О inters 89О itoa 94О lambda 119, 122—126, 188О last 121О layoutlist 185, 522О length 121О list 112, 538О listp 77О load 54, 60, 196, 257, 267О load_dialog 321, 328, 522

О log 86О logand 86, 88О logior 87, 88О Ish 87О mapcar 119, 188, 522О max 82О mem 201О member 117О menucmd 280О menugroup 279О min 83О minusp 76О modejile 349, 522О namedobjdict 180О nentsel 98, 130, 158О nentselp 130, 159, 224О new_dialog 329, 348, 522О not 72О nth ИЗ, 168О null 72О numberp 76О open 140, 151, 152, 527, 535О or 71, 508О osnap219О polar 89О prinl 142, 150О princ 141, 150, 152, 538О print 142О progn 73О prompt 143О quit 196О quote 120О read 102О read-char 142, 152О read-line 141О redraw 220, 224О regapp 177О пет 82, 508О repeat 80О reverse 114О rtos 59, 95, 98, 527, 535О s::startup 232О set 213О setjile 326, 344, 350О set_tile 338О setcfg 136О setenv 136О setfunhelp 375О setq 56, 59О setvar 135О setview 172

Page 572: Visual LISP и секреты адаптации AutoCAD

Предметный указатель 571

О sin 84О slide_image 360О snvalid 174О sqrt 84О ssadd 162О ssdel 163О ssget 160, 168, 515, 518О ssgetfirst 167О sslength 163, 168, 515О ssmemb 163О ssname 98, 164, 168, 515О ssnamex 161, 164О sssetfirst 166О stait_dialog 329, 330, 348, 522О start_image 338, 358О startjist 339, 340, 357, 522О startapp 373, 374О strcase 103, 513О strcaser 111О strcat 103, 513, 527, 535О strlen 104, 513, 535О subst 121О substr 104, 513, 535О tablet 229О tblnext 170, 171О tblobjname 171О tblsearch 170О term_dialog .330О terpri 144О textpage 221О textscr221О trace 199, 200О trans 98, 510, 538О type 57, 93О unload_dialog 328, 522О untrace 199О vector_image 360О ver201О vla-add3DPoly 382О vla-addcircle 384О vla-arraypolar 382О vla-arrayrectangular 382О vl-acad-defun 197О vl-acad-undefun 198О vla-copy 382О vla-get-activedocument 380О vla-get-area 380О vla-get-color 380, 383О vla-get-endpoint 384О vla-get-layer 383О vla-get-linetype 383

О vla-get-modelspace 381О vla-get-paperspace 381О vla-get-radius 380О vla-get-startpoint 384О vla-mirror 382О vla-put-color 380, 384О vl-arx-import 207О vlax-3d-porat 386О vlax-add-cmd 391О vlax-create-object 395О vlax-curve-getarea 402О vlax-curve-getclosestpointto 405О vlax-curve-getclosestpointtoprojection 405О vlax-curve-getdistatparam 404О vlax-curve-getdistatpoint 403О vlax-cui-ve-getendparam 403О vlax-curve-getendpoint 402О vlax-curve-getfirstderiv 406О vlax-cui-ve-getparamatdist 404О vlax-curve-getparamatpoint 403О vlax-curve-getpointatdist 402О vlax-curve-getpointatparam 404О vlax-curve-getsecondderiv 406О vlax-curve-getstartparam 403О vlax-curve-getstartpoint 402О vlax-curve-isclosed 404О vlax-curve-isperiodic 404О vlax-curve-isplanar 405О vlax-dump-object 389О vlax-ename->vla-object 383О vlax-erased-p 393О vlax-for 397'О vlax-get-acad-object 380О vlax-get-object 395О vlax-get-or-create-object 395О vlax-get-property 401О vlax-import-type-library 396О vlax-invoke 393О vlax-invoke-method 393О vlax-ldata-delete 398О vlax-ldata-get 397О vlax-ldata-list 398О vlax-ldata-put 397О vlax-ldata-test 398О vlax-make-safearray 387О vlax-make-variant 384О vlax-map-collection 396О vlax-method-applicable-p 394О vlax-product-key 393О vlax-property-available-p 401Продолжение рубрики см. на с. 572

Page 573: Visual LISP и секреты адаптации AutoCAD

572 Предметный указатель

Функция (продолжение):О vlax-put-property 4010 vlax-read-enabled-p 3950 vlax-release-object 3940 vlax-remove-cmd 3920 vlax-safearray->list 4000 vlax-safearray-fill 389О vlax-safearray-get-dim 399О vlax-safearray-get-element 399О vlax-safearray-get-1-bound 399О vlax-safearray-get-u-bound 399О vlax-safearray-put-element 388О vlax-safearray-type 400О vlax-tmatrix 400О vlax-typeinfo-available-p 3940. vlax-variant-change-type 386О vlax-variant-type 385О vlax-variant-value 386О vlax-vla-object->ename 383О vlax-write-enabled-p 395О vl-bb-ref 212О vl-bb-set 211О vl-catch-all-apply 126, 197О vl-catch-all-apply-error-message 126О vl-catch-all-error-message 127, 197О vl-catch-all-error-p 197О vl-cmdf 64, 231О vl-directory-files 144О vl-doc-export 207, 218О vl-doc-imporf 207, 218О vl-doc-ref213, 218О vl-doc-set213, 218О vl-every 119О vl-exit-with-error 197, 198О vl-exit-with-value 197, 198О vl-file-copy 145О vl-file-delete 146, 152, 535О vl-file-directoiy-p 146О vl-filename-base 148, 152, 535О vl-filename-directory 148, 152, 535О vl-filename-extension 148, 152, 535О vl-filename-mktemp 149О vl-file-rename 146О vl-file-size 147О vl-file-systime 147О vl-get-resource 210О vlisp-compile 195О vl-list* 116О vl-list->string 106О vl-list-exported-functions 192, 208О vl-list-length 122

О vl-list-loaded-vlx 2090 vl-Ioad-all 61, 214, 2190 vl-load-com 3790 vl-load-reactors 4070 vl-member-if 1220 vl-member-if-not 1230 vl-position 1230 vl-prinl-to-string 1500 vl-princ-to-striiig 1500 vl-propagate 214, 2190 vlr-acdb-reactor 4110 vlr-add4370 vlr-added-p 4370 vlr-beep-reaction 4100 vlr-command-reactor 4180 vlr-current-reaction-name 4370 vlr-data 4380 vlr-data-set 4380 vlr-deepclone-reactor 4190 vlr-docmanager-reactor 4120 vlr-dwg-reactor 4200 vlr-dxf- reactor 4210 vlr-editor-reactor 4160 vl-registry-delete 2030 vl-registry-descendents 2040 vl-registry-read 2020 vl-registry-write 2030 vl-remove 1230 vl-remove-if 1240 vl-remove-if-not 1240 vlr-insert-reactor 4220 vlr-linker-reactor 4140 vlr-Hsp-reactor 4230 vlr-miscellaneous-reactor 4240 vlr-mouse-reactor 4250 vlr-notification 4390 vlr-object-reactor 4140 vlr-owner-add 4380 vlr-owner-remove 4380 vlr-owners 4380 vlr-pers 4400 vlr-pers-Iist 4400 vlr-pers-p 4400 vlr-pers-release 4400 vlr-reaction-names 4090 vlr-reaction-set 4360 vlr-reactors 4080 vlr-remove 4370 vlr-remove-all 4370 vlr-set-notification 439

Page 574: Visual LISP и секреты адаптации AutoCAD

Предметный указатель 573

О vlr-sysvar-reactor 425О vlr-toolbar-reactor 426О vlr-trace - reaction 410О vlr-type 409О vlr-types 408О vlr-undo-reactor 427О vlr-wblock-reactov 428О vlr-window- reactor 4300 vlr-xref-reactor 4310 vl-some 1250 vl-sort 1250 vl-sort-i 1260 vl-string->list 1060 vl-string-elt 107О vl-string-left-trim 107О vl-string-mismatch 108О vl-string-position 1080 vl-string-right-trim 107О vl-string-search 109О vl-string-subst 109О vl-string-translate 110О vl-string-trim 108О vl-symbol-name 110О vl-symbol-value 92О vl-unload-vlx210О vl-vbarun 211О vl-vlx-loaded-p 209

00000000

vports 90wcmatch 105,while 79, 515,write-char 143write-line 141,xdroom 179xdsize 178zerop 76 «

241527, 152151, 152, 527, 535

Числа:0 вещественные 580 научная форма представления 580 целые 58Чтение значения глобальной переменной

в Visual LISP 257

шШаблон рисунка 43

Язык:0 DCL320О DIESEL 314

Page 575: Visual LISP и секреты адаптации AutoCAD

gm Ш_ш_ Ш « d i r e c t

S o f t l m eКАТАЛОГ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

S o f t L i n eЕсли Вы хотите бытьв курсе всех последнихсобытий на рынкепрограммного обеспе-чения,

-»Если Вы хотите полу-чать наиболее полнуюинформацию о програм-мных продуктах изпервых рук - от самихпроизводителей,

}Если Вы ведете честныйбизнес и покупаете ли-цензионное /70,

117036 г. Москваул. Шверника, д. 4(095) 232-0023www.softline.ruE-mail: [email protected]

ЗНАЧИТ ВАША ЖИЗНЬ МОЖЕТ СТАТЬ Щ Е ПРОЩЕ!Подпишитесь на новый полноцветный каталог, издаваемый одним из круп-нейших поставщиков программного обеспечения в России, и Вы будетерегулярно получать его по почте БЕСПЛАТНО! Кроме того, по Вашему жела-нию на Ваш электронный адрес будут регулярно приходить еженедельныеновости рынка программного обеспечения от компании «СофтЛайн»

Page 576: Visual LISP и секреты адаптации AutoCAD

ВЕСЬ МИРкомпьютерных книг

Адрес: Россия, 199397, Санкт-Петербург, а/я 194; Web-сайт: www.bhv.ru

Уважаемые господа!Издательство "БХВ-Петербург" приглашает специалистов в областикомпьютерных систем и информационных технологий для сотруд-ничества в качестве авторов книг по компьютерной тематике.

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

напишите книгувместе с "БХВ-Петербург"

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

С предложениями обращайтесь кглавному редактору Екатерине Кондуковой

тел.: (812) 251 4244, 251 6501e-mail: [email protected]

факс: (812) 2511295

Page 577: Visual LISP и секреты адаптации AutoCAD

ВЕСЬ i МИРКОМПЬЮТЕРНЫХ книг

1 0 0 0КНИГ ПО КОМПЬЮТЕРНОЙ ТЕХНИКЕ,

ПРОГРАММНОМУ ОБЕСПЕЧЕНИЮИ ЭЛЕКТРОНИКЕ ВСЕХ РУССКОЯЗЫЧНЫХ

ИЗДАТЕЛЬСТВ

УВАЖАЕМЫЕ ЧИТАТЕЛИ!

ДЛЯ ВАС ОТКРЫЛСЯ ОТДЕЛ "КНИГА - ПОЧТОЙ"

Заказы принимаются:

==> По телефону: (812) 541-85-51 (отдел "Книга — почтой")

=» По факсу: (812) 541-84-61 (отдел "Книга - почтой")

=> По почте: 199397, Санкт-Петербург, а/я 194

=» Через Internet: http://www.bhv.ru

=> По E-mail: [email protected]

Если у Вас отсутствует Internet — по почте, БЕСПЛАТНО,высылается дискета с прайс-листом(цены указаны с учетом доставки),

аннотациями и оглавлениями к книгами, конечно, условиями заказа.

МЫ ЖДЕМ ВАШИХ ЗАЯВОК

С уважением, издательство "БХВ-Петербург"