AcRx
AcRx — это программная библиотека (набор классов и функций), предназначенная для разработки приложений в среде AutoCAD и других продуктов на платформе ObjectARX (AutoCAD Runtime eXtension). Библиотека AcRx является фундаментальным компонентом архитектуры ObjectARX, обеспечивающим механизмы регистрации классов, управления объектами, обработки сообщений и взаимодействия с ядром системы автоматизированного проектирования (САПР). Она предоставляет разработчикам на языках C++ и .NET (через обёртки) доступ к низкоуровневым API для создания расширений, которые работают непосредственно в адресном пространстве AutoCAD, обеспечивая максимальную производительность и функциональность.
История и развитие
Происхождение ObjectARX
ObjectARX (ранее известный как ARX — AutoCAD Runtime eXtension) был представлен компанией Autodesk в начале 1990-х годов как эволюция предыдущей технологии разработки — ADS (AutoCAD Development System). ADS базировался на языке C и использовал механизмы внешних процессов, что ограничивало производительность и возможности интеграции. ObjectARX перешёл на C++ и модель объектно-ориентированного программирования, позволяя разработчикам создавать динамически загружаемые библиотеки (DLL), которые выполняются в том же процессе, что и AutoCAD.
Роль AcRx в архитектуре
Библиотека AcRx была заложена как ядро этой архитектуры. Она обеспечивает:
- Регистрацию пользовательских классов в глобальной системе типов AutoCAD.
- Управление временем жизни объектов (создание, копирование, удаление).
- Обработку событий и сообщений от ядра AutoCAD (например, открытие/закрытие чертежа, изменение объектов).
- Поддержку механизма «протоколов» (protocols) — способов расширения поведения стандартных объектов AutoCAD.
С выходом AutoCAD 2000 и переходом на платформу .NET компания Autodesk добавила управляемые обёртки (Managed .NET API), которые, однако, в своей основе используют те же принципы AcRx, реализованные на неуправляемом C++.
Архитектура и ключевые компоненты
Основные классы AcRx
Библиотека AcRx включает несколько фундаментальных классов, от которых наследуются все остальные объекты ObjectARX:
- AcRxObject — базовый класс для всех объектов, управляемых через AcRx. Он предоставляет методы для работы с типом объекта (динамическое определение класса), клонирования, сравнения и сериализации. Все пользовательские классы, создаваемые разработчиком, должны быть производными от AcRxObject.
- AcRxClass — класс, представляющий метаинформацию о типе (классе). Каждый зарегистрированный класс имеет уникальный идентификатор (GUID) и иерархию наследования. AcRxClass используется для динамического создания экземпляров, проверки совместимости типов и отложенной загрузки DLL.
- AcRxDynamicLinker — менеджер загрузки и выгрузки модулей (DLL). Он отвечает за разрешение зависимостей, регистрацию классов при загрузке и их деинициализацию при выгрузке.
- AcRxService — базовый класс для сервисов (служб), которые предоставляют функциональность другим модулям. Например, сервис работы с базами данных чертежа (AcDbDatabase) или сервис графического отображения (AcGi).
Механизм регистрации классов
Для того чтобы пользовательский класс был распознан ядром AutoCAD, разработчик должен:
- Объявить класс, унаследовав его от AcRxObject (или одного из его производных, например, AcDbEntity для графических объектов).
- Использовать макросы
ACRX_DECLARE_MEMBERSиACRX_DEFINE_MEMBERSдля автоматической генерации кода регистрации. - В функции
AcRx::initApp()вызвать методacrxRegisterClass()для регистрации класса в глобальной таблице типов.
После регистрации класс становится доступным для использования в командах AutoCAD, механизмах отмены/повтора (Undo/Redo) и при чтении/записи чертежей (DWG/DXF).
Протоколы и расширение стандартных объектов
AcRx поддерживает концепцию протоколов (protocols) — интерфейсов, которые могут быть реализованы для любого объекта, включая стандартные (например, отрезок, окружность, текст). Протоколы позволяют добавлять новое поведение без изменения исходного кода AutoCAD. Например, можно реализовать протокол AcDbEntityProtocol для объекта «Отрезок», чтобы изменить его реакцию на команду «Стереть» или «Переместить».
Применение в разработке
Создание пользовательских объектов
Наиболее распространённое применение AcRx — создание собственных графических примитивов (пользовательских объектов), которые ведут себя как стандартные: могут быть выбраны, отредактированы, сохранены в чертеже и отображены на экране. Для этого класс наследуется от AcDbEntity, который, в свою очередь, наследуется от AcRxObject. Разработчик переопределяет виртуальные методы, такие как worldDraw() (отрисовка), subGetOsnapPoints() (привязка к объекту) и subTransformBy() (преобразование).
Реакторы и обработка событий
AcRx предоставляет механизм реакторов (reactors) — объектов, которые подписываются на события, происходящие в AutoCAD. Например:
AcRxEventReactor— реагирует на события загрузки/выгрузки приложений, изменения состояния системы.AcDbDatabaseReactor— отслеживает изменения в базе данных чертежа (добавление/удаление объектов, изменение свойств).AcEditorReactor— реагирует на действия пользователя (ввод команд, выбор объектов, изменение видового экрана).
Реакторы реализуются путём наследования от соответствующего класса AcRx и переопределения методов-обработчиков.
Взаимодействие с командами AutoCAD
Разработчик может добавлять новые команды в AutoCAD, используя макрос ACRX_CMD и функцию acedRegCmds->addCommand(). Команды, созданные таким образом, работают в контексте текущего чертежа и имеют доступ ко всем объектам через AcRx и другие библиотеки ObjectARX.
Преимущества и ограничения
Преимущества
- Высокая производительность: код выполняется в том же процессе, что и AutoCAD, без накладных расходов на межпроцессное взаимодействие.
- Глубокая интеграция: доступ ко всем внутренним структурам данных и событиям AutoCAD.
- Объектно-ориентированный подход: возможность создания иерархий классов, полиморфизма и повторного использования кода.
- Поддержка многопоточности: AcRx предоставляет механизмы для безопасной работы в многопоточных сценариях (например, при фоновой обработке чертежей).
Ограничения
- Сложность разработки: требуется глубокое знание C++, архитектуры ObjectARX и внутреннего устройства AutoCAD.
- Зависимость от версии: библиотека AcRx привязана к конкретной версии AutoCAD; DLL, скомпилированная для одной версии, не будет работать в другой без перекомпиляции.
- Отсутствие кроссплатформенности: ObjectARX и AcRx доступны только для Windows (за исключением AutoCAD для Mac, где используется другая технология — ObjectARX for Mac, основанная на Cocoa и Core Foundation).
Примеры использования
Пример 1: Простой пользовательский объект
Разработчик может создать класс MyCircle, наследующий от AcDbEntity, который отображает окружность с дополнительными атрибутами (например, текстовой меткой). При регистрации класса через AcRx этот объект будет корректно сохраняться в DWG-файле и отображаться на экране.
Пример 2: Реактор на изменение чертежа
С помощью AcDbDatabaseReactor можно создать расширение, которое автоматически обновляет аннотации (например, номера позиций) при добавлении или удалении объектов из чертежа.
Пример 3: Сервис для пакетной обработки
Используя AcRxService, можно реализовать фоновый сервис, который обрабатывает все открытые чертежи по расписанию, выполняя, например, экспорт в PDF или проверку на соответствие стандартам.
Влияние на экосистему САПР
AcRx и ObjectARX в целом стали стандартом для разработки коммерческих и внутренних расширений для AutoCAD. На их основе созданы тысячи приложений, включая:
- Специализированные САПР для машиностроения (например, AutoCAD Mechanical).
- Инструменты для архитектурного проектирования (например, AutoCAD Architecture).
- Плагины для автоматизации документооборота и расчётов.
Библиотека также используется в образовательных целях: многие университеты включают ObjectARX в курсы по программированию в САПР.
Источники
- Autodesk Developer Network. ObjectARX Developer’s Guide. Autodesk, Inc., 2023.
- Chandler, J. Mastering AutoCAD ObjectARX. John Wiley & Sons, 2005.
- Документация Autodesk по ObjectARX (онлайн-справочник классов AcRx).
- Статьи и примеры из сообщества Autodesk Forums и GitHub-репозиториев с открытым кодом (например, проекты на базе ObjectARX SDK).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →