Работа с элементами ActiveX
Цель лекции: приобрести простейшие навыки работы с элементами ActiveX.
Объектная модель AutoCAD
Объекты ActiveX в системе AutoCAD рассматриваются как иерархия, содержащая примитивы, символьные таблицы, словари и пр. Однотипные объекты объединяются в семейства (collections).
Высшим элементом в иерархии является объект Application (AcadApplication) . Этот объект является родительским для следующих объектов:
- Preferences (Настройки);
- VBE (объект интегрированной среды VBA-приложений);
- Documents (Документы);
- MenuBar (Строка меню);
- MenuGroups (Группы меню).
Эти объекты, в свою очередь, являются родительскими для объектов более низких уровней. Семейство Documents включает в себя объекты Document - открытые документы или рисунки. В семейство MenuGroups входят объекты типа MenuGroup (Группа меню или Группа адаптации). В семейство MenuBar входят объекты типа PopupMenu (Падающие меню, загруженные в строку меню).
Наиболее важным для практики является объект Document. Он включает в себя, в частности, такие семейства:
- Blocks (Блоки);
- ModelSpase (Пространство модели);
- PaperSpace (Пространство листа);
- Dictionaries (Словари);
- DimStyles (Размерные стили);
- Groups (Группы);
- Layers (Слои);
- Layouts (Листы);
- Linetypes (Типы линий);
- Plot (Печать);
- PlotConfigurations (Конфигурации печати);
- Preferences (Настройки чертежа);
- RegisteredApplications (Зарегистрированные приложения);
- SummaryInfo (Свойства чертежа);
- SelectionSets (Выделенные наборы);
- TextStyles (Текстовые стили);
- UCSs (Пользовательские системы координат);
- Utility (Утилита);
- Viewports (Видовые экраны);
- Views (Виды).
Полностью список объектов показан на рис. 9.1.
В семейства Blocks, ModelSpase и PaperSpace входят объекты, которые соответствуют графическим примитивам. Pис. 9.1 взят из справочной службы AutoCAD: ActiveX and VBA Reference - Object Model.
Для реализации базовых инструментов объектной технологии в модели предусмотрены компоненты, называемые интерфейсами. В базовом интерфейсе описываются все типичные свойства и методы. Например, базовым интерфейсом всех графических примитивов является IAcadEntity. Он является родительским для интерфейса IAcadLine. С помощью этого интерфейса создаются объекты семейства AcDLine, представителем которого является объект Line.
Каждый объект в технологии ObjectX имеет свои свойства и методы. Свойства можно читать или изменять с помощью соответствующих функций. Функции, соответствующие методам, реализуются в командах с соответствующими параметрами. Элементами объектной модели являются также события. Они возникают в результате действий пользователя (Click) или при изменениях в программе (onLoad). Программа может отслеживать события и реализовать сценарий отклика на события.
С полным перечнем объектов, свойств, методов и событий можно познакомиться в справочной службе AutoCAD.
Функции и типы данных
Функции, реализующие технологию ActiveX в Visual LISP, имеют префиксы vla-, vlax-, vlr. Доступ к этим функциям можно получить только после выполнения в данном сеансе AutoCAD функции vl-load-com.
Работа с каждым из объектов в технологии ActiveX ведется на уровне указателей. Они носят название VLA-объекты. VLA-объектами являются указатели не только графических примитивов, но и документов, пространства модели и приложений.
Практически обязательной для всех приложений, использующих ActiveX, является следующая структура функций:
(defun begin_activex ( / ) (vl-load-com) (setq acad_app (vlax-get-acad-object)) (setq active_doc (vla-get-activedocument acad_app)) (setq model_space (vla-get-modelspace active_doc)) (setq paper_space (vla-get-paperspace active_doc)) ); defun
В результате выполнения функции begin_activex будут получены следующие VLA-объекты:
- acad_app приложение AutoCAD;
- active_doc активный документ;
- model_space пространство модели;
- paper_space пространство листа.
После получения основных VLA-объектов можно через них обращаться к другим элементам иерархии системы AutoCAD (примитивам, таблицам и пр.) для получения или модификации их свойств и методов. Основным средством получения VLA-объекта для примитива является функция vlax-ename->vla-object. Обратная функция vlax-vla-object->ename.
Кроме VLA-объектов, в ActiveX используют новые типы данных: безопасные массивы и варианты.
Безопасные массивы являются массивами однотипных объектов. Они создаются с помощью функций
- vlax-make-safearray;
- vlax-safearray-put-element;
- vlax-safearray-fill.
Для извлечения данных из безопасных массивов с целью использования обычных LISP-функций применяются функции:
vlax-safearray-get-dim; vlax-safearray-get-l-bound; vlax-safearray-get-u-bound; vlax-safearray-get-element; vlax-safearray-type.
Для преобразования массива в список используют функцию
vlax-safearray->list.
Варианты - это структуры, которые могут хранить однотипные данные. Тип данных является типом варианта. Создание варианта выполняется с помощью функции (vlax-make-variant [<данное> [<целое>]]).
В качестве второго аргумента передается целое число, задающее тип варианта. Если оно опущено, то тип варианта определяется по типу первого аргумента. В качестве значения аргумента <целое> используются зарезервированные константы.
Константа | Значение | Описание |
---|---|---|
Vlax-vbEmpty | 0 | Неинициализированный (значение по умолчанию) |
Vlax-vbNull | 1 | Пустой (без данных) |
Vlax-vbInteger | 2 | Короткое целое число |
Vlax-vbLong | 3 | Длинное целое число |
Vlax-vbSingle | 4 | Вещественное число |
Vlax-vbDouble | 5 | Вещественное число с двойной точностью |
Vlax-vbString | 8 | Строка |
Vlax-vbObject | 9 | Объект |
Vlax-vbBoolean | 11 | Булево значение |
Vlax-vbArray | 8192 | Массив |
Примеры функций, выполняющих операции с вариантами:
- vlax-variant-type - получение типа варианта;
- vlax-variant-value - получение значения варианта;
- vlax-variant-change-type - изменение типа варианта;
- vlax-variant-type - оформление трехмерной точки как варианта.
Использование элементов ActiveX в Visual LISP
Элементы ActiveX - это программный интерфейс, который используется в поддерживающих его языках программирования. Элементы ActiveX обеспечивают взаимодействие между объектами, с одной стороны, и пользователем или приложением, с другой стороны. Технология ActiveX позволяет получать информацию об объектах чертежа с помощью функций доступа (get functions) и модифицировать объекты с помощью функций модификации (put functions).
Выше было рассмотрено, как извлекать и модифицировать информацию об объектах с помощью функций-интерфейсов на языке AutoLISP. Элементы ActiveX обеспечивают аналогичный способ получения и модификации информации. Однако для этого необходима определенная подготовка.
AutoCAD предоставляет все свои объекты, включая функции доступа и модификации, в распоряжение элементов ActiveX. Вначале в Visual LISP необходимо перед началом сеанса работы загрузить все функции ActiveX с помощью функции (vl-load-com) ↵
При этом все функции-интерфейсы ActiveX станут доступными. Загрузив интерфейс ActiveX, можно выполнить необходимые действия над созданным ранее отрезком. Но вначале нужно преобразовать имя сущности в объект vla. Этот объект ActiveX практически ничем не отличается от имени сущности, но содержит ряд свойств, которые отсутствуют в его аналоге в языке AutoLISP. Для преобразования используется функция vlax-ename->vla-object. Пример обращения к этой фунции:
(setq vla-line (vlax-ename->vla-object (entlast)))↵ Среда Visual LISP возвратит следующее выражение: #<VLA-OBJECT IAcadLine 03612b14>
Протокол операций будет выглядеть следующим образом:
Command: _line Specify first point: 5,5,0 Specify next point or [Undo]: 15,-5,0 Specify next point or [Undo]: *Cancel* Command: '_.zoom _e Command: (vl-load-com) Command: (setq vla-line (vlax-ename->vla-object (entlast))) #<VLA-OBJECT IAcadLine 01f1bb4c>
Возвращаемое значение переменной есть объект vla. Теперь можно визуально отслеживать значения этой переменной, выделив ее и выбрав команду VIEW - INSPECT. То же самое можно сделать в окне CONSOLE, запустив функцию (vlax-dump-object vla-line) ↵
Возникающее окно инспектора показано на рис. 9.2.
Для получения начальной точки объекта используется функция VLA-GET-STARTPOINT. В рассматриваемом примере отрезок был преобразован в объект vla, свойства которого содержит переменная vla-line. Для получения начальной точки можно ввести следующее выражение:
(setq Starting (vla-get-startpoint vla-line))↵
В ответ будет выдано сообщение:
#<variant 8197 …>
Чтобы преобразовать координаты начальной точки из типа данных variant к координатному формату, введите следующую строку кода:
(safe-array-value (vlax-variant-value Starting))↵
Теперь Visual LISP возвратит координаты начальной точки отрезка: (5.0 5.0 0)
Чтобы изменить значение свойства StartPoint на (0,0,0), напишите выражение:
(vla-put-startpoint vla-line (vlax-3d-point '(0 0 0)))↵
Проверьте отрезок в окне AutoCAD. Для проверки значения свойства StartPoint можно также воспользоваться функцией VLA-GET-STARTPOINT.
(safe-array-value (vlax-variant-value (vla-get-startpoint vla-line)))↵
Теперь Visual LISP возвратит такое значение: 1. 0.0 0.0
Задание 9.1
Получение и модификация свойств объектов
- На новом чертеже постройте отрезок (5,5,0)-(15,5,0).
- В окне CONSOLE редактора AutoLISP введите команду загрузки функции ActiveX (vl-load-com) ↵
- Для преобразования имени сущности в объект vla введите: (setq vla-line (vlax-ename->vla-object (entlast))) ↵
- Чтобы просмотреть свойства объекта введите (vlax-dump-object vla-line)
- Для получения начальной точки отрезка введите: (setq Starting (vla-get-startpoint vla-line)) ↵
- Для преобразования координат начальной точки из типа данных variant к формату отображения координат введите: (safearray-value (vlax-variant-value Starting)) ↵
- Чтобы изменить координаты начальной точки отрезка на 0,0,0, введите: (vla-put-startpoint vla-line (vlax-3d-point '(0 0 0))) ↵
- Проверьте отрезок - его начальная точка находится в начале координат.