Опубликован: 21.02.2012 | Уровень: специалист | Доступ: свободно
Лекция 9:

Работа с элементами ActiveX

< Лекция 8 || Лекция 9: 12 || Лекция 10 >
Аннотация: Объектная модель AutoCAD основана на концепции COM (Component Object Model) . Это спецификация метода создания компонентов, из которых строятся приложения. Система AutoCAD поддерживает технологию ActiveX Automation, которая реализует принципы объектно-ориентированного программирования. В этой технологии модель работающего приложения представляется совокупностью объектов, свойств, методов и событий. Для каждого из этих элементов имеется свой алгоритм реализации в виде операций и данных, которые обеспечивают взаимодействие с пользователем.

Цель лекции: приобрести простейшие навыки работы с элементами 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.

 Список объектов AutoCAD

увеличить изображение
Рис. 9.1. Список объектов AutoCAD

В семейства 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

Рис. 9.2. Окно инспектора объекта VLA

Для получения начальной точки объекта используется функция 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

Получение и модификация свойств объектов

  1. На новом чертеже постройте отрезок (5,5,0)-(15,5,0).
  2. В окне CONSOLE редактора AutoLISP введите команду загрузки функции ActiveX (vl-load-com)
  3. Для преобразования имени сущности в объект vla введите: (setq vla-line (vlax-ename->vla-object (entlast)))
  4. Чтобы просмотреть свойства объекта введите (vlax-dump-object vla-line)
  5. Для получения начальной точки отрезка введите: (setq Starting (vla-get-startpoint vla-line))
  6. Для преобразования координат начальной точки из типа данных variant к формату отображения координат введите: (safearray-value (vlax-variant-value Starting))
  7. Чтобы изменить координаты начальной точки отрезка на 0,0,0, введите: (vla-put-startpoint vla-line (vlax-3d-point '(0 0 0)))
  8. Проверьте отрезок - его начальная точка находится в начале координат.
< Лекция 8 || Лекция 9: 12 || Лекция 10 >
Алексей Тимонин
Алексей Тимонин
Что возвращает функция chr() в таком примере (chr (- 65 1))?
Алексей Потапкин
Алексей Потапкин
как передать параметры в макрос
Александр Яковлев
Александр Яковлев
Россия, г. Москва
Александр Захаров
Александр Захаров
Россия, Рязань