CAD-страница НП | Статьи | English | Download
Танцы панелей
(из книги "AutoLISP и Visual LISP в среде AutoCAD")
Функционирование панелей инструментов похоже на функционирование меню (например, падающих),
однако работать из LISP-программы с панелями труднее, потому что приходится в обязательном порядке
применять технологию ActiveX.
В данной статье приводится пример решения в системе AutoCAD 2006/2007 следующих задач:
Листинг 1. Файл cr_tb.lsp
Функция cr_tb имеет следующие аргументы:
Первое, что делает функция cr_tb - проверяет правильность имени группы, в которой необходимо
создать панель. Имя группы передается через первый аргумент. Программа проверяет его тип на
строковый, а затем проверяет, что группа с таким именем существует в текущем рисунке (она
должна быть членом семейства MenuGroups). При проверке используется важная функция
vl-catch-all-apply. В случае возникновения прерывания из-за ошибки, связанной с тем, что
указанная группа не существует, эта функция возвращает не VLA-объект группы, а объект типа
VL-CATCH-ALL-APPLY-ERROR.
Для проверки применяется такая конструкция:
После выполнения этого выражения можно спокойно проанализировать тип результата, не прерывая работу программы.
Аналогичная проверка осуществляется для аргумента t_name, который должен быть строкой. Но здесь
функция vl-catch-all-apply применяется в обратном режиме: если ошибки нет, то это означает,
что в семействе Toolbars уже есть панель с именем t_name, что для нас недопустимо!
После проверки правильности имени группы и имени панели инструментов программа переходит
к созданию панели. Вначале с помощью метода Add создается VLA-объект пустой панели:
Затем с помощью метода AddToolbarButton в панель добавляются кнопки, количество которых
равно длине списка l_names (обращаем внимание, что для сокращения места в программе отсутствует
проверка длин списков l_helps, l_macros и l_icons - если эти списки короче, то программа
не сработает; кроме того, надо контролировать, что все элементы списков действительно являются строками).
Далее с помощью метода SetBitmaps к кнопкам привязываются изображения. В примере использованы
пиктограммы кнопок панели инструментов Standard (Стандартная). В качестве имен малых и больших
кнопок указаны одни и те же имена (это системой допускается). В результате на экране должна
появиться панель (на рис.1 показан пример панели Dancing Queen (Танцующая королева) с пятью кнопками).
Рис.1. Панель Dancing Queen
VLA-объект построенной панели запоминаем в глобальной переменной g_tb для передачи в другие функции.
Остальные VLA-объекты удаляются с помощью функции vlax-release-object и тем самым освобождается занятая ими память.
Следующая функция move_tb должна перемещать панель из одной точки экрана в другую в заданное
количество шагов (слишком быстрое движение неинтересно). Текст функции приведен в листинге 2.
Листинг 2. Файл move_tb.lsp
; Приложение 5\move_tb.lsp
; Н.Н.Полещук, 2006 г.
; В книге: Н.Н.Полещук, П.В.Лоскутов
;"AutoLISP и Visual LISP в среде AutoCAD"
; (издательство "БХВ-Петербург", 2006)
; http://poleshchuk.spb.ru/cad/
(defun move_tb (tb x1 y1 x2 y2 ntime / i x y)
(vla-Float tb x1 y1 1)
(setq i 0 x x1 y y1)
(repeat ntime
);repeat
(vlr-beep-reaction)
);defun move_tb
Функция move_tb в цикле преобразует панель в один ряд кнопок и пересчитывает положение панели на
экране. Аргумент ntime управляет временем, за которое панель пройдет путь между крайними точками.
В конце маршрута с помощью функции vlr-beep-reaction выдается звуковой сигнал. Поскольку фоновое
окно не успевает перерисовываться, то при движении панели на экране остается шлейф.
Следующая функция dance_tb (листинг 3) двигает панель на экране по маршруту, который задается
списком из нескольких точек.
Листинг 3. Файл dance_tb.lsp
; Приложение 5\dance_tb.lsp
; Н.Н.Полещук, 2006 г.
; В книге: Н.Н.Полещук, П.В.Лоскутов
;"AutoLISP и Visual LISP в среде AutoCAD"
; (издательство "БХВ-Петербург", 2006)
; http://poleshchuk.spb.ru/cad/
(defun dance_tb (tb plist ntime / wbOK p x0 y0 x1 y1)
(if (and (listp plist)(> (vl-list-length plist) 0))
);if
);defun dance_tb
; Проверяем список на 2 элемента и оба числа (numberp)
; Вспомогательная функция
(defun test (p / wbOK)
);defun test (T только для правильного списка)
В функции dance_tb сначала проверяется правильность списка plist и из него удаляются
неправильные элементы (не представляющие двумерные точки). После этого многократно
применяется функция перемещения move_tb.
Для получения полной картины осталось только привести программный код, который выполняет
танец от начала и до конца (листинг 4).
Листинг 4. Файл show.lsp
; Приложение 5\show.lsp
; Параметры новой панели
(setq gn "ACAD" tn "Dancing Queen")
(setq ln (list "Dance1" "Dance2" "Dance3" "Dance4" "Dance5"))
(setq lh (list "Подсказка 1" "Подсказка 2" "Подсказка 3" "Подсказка 4" "Подсказка 5"))
(setq lm (list "(alert\"New\") " "(alert\"Open\") " "(alert\"Save\") " "(alert\"SaveAs\") " "(alert\"Print\") "))
(setq li (list "RCDATA_16_NEW" "RCDATA_16_OPEN" "RCDATA_16_SAVE" "RCDATA_16_SAVE" "RCDATA_16_PRINT"))
(setq k1 200 k2 150 kr 1)
(cr_tb gn tn ln lh lm li k1 k2 kr)
;;; Пример танца
(dance_tb g_tb (list '(100 100) '(500 200) '(0 400)) 10000)
;;; Удаление танцовщицы
(vla-Delete g_tb)
(vlax-release-object g_tb)
(setq g_tb nil)
(princ "\nПанель удалена. Концерт окончен. ")
(princ)
Рис.2. Танцующая панель
Созданную панель можно и не удалять: она удалится при выходе из сеанса работы с системой AutoCAD.
Панель существует только в оперативной памяти компьютера (почти что в нашем воображении ...).
Но свои задачи она исправно выполнит.
Панели, которые необходимы пользователю постоянно, рекомендуется не создавать динамически,
как в рассмотренном нами примере, а загружать в версии 2006/2007 через CUI-файл (в более ранних
версиях - через MNU-файл).
CAD-страница НП | Статьи | English | Download