Открыть сервис

AcDbObject

AcDbObject — это базовый абстрактный класс, являющийся фундаментальным элементом объектной модели базы данных AutoCAD (AutoCAD Database). Все объекты, хранящиеся в файле чертежа формата DWG (Drawing) и DXF (Drawing Exchange Format), являются наследниками этого класса. AcDbObject обеспечивает единый механизм для управления жизненным циклом объектов, включая их создание, хранение, модификацию, сериализацию (чтение/запись) и удаление из базы данных.

История и место в архитектуре

Объектная модель AcDb (AutoCAD Database) была разработана компанией Autodesk для внутреннего представления данных чертежа. Класс AcDbObject был введён как корень иерархии классов, чтобы обеспечить полиморфизм и единый интерфейс для всех объектов чертежа. Он является частью библиотеки ObjectARX (AutoCAD Runtime eXtension) — набора C++-классов для разработки приложений, расширяющих функциональность AutoCAD.

До появления AcDbObject в ранних версиях AutoCAD (до 13-й) данные хранились в менее структурированном виде. Внедрение объектной модели позволило:

  • Унифицировать доступ к данным.
  • Реализовать механизмы транзакций (откат/повтор изменений).
  • Обеспечить поддержку пользовательских объектов (Custom Objects) через наследование от AcDbObject.

Ключевые характеристики и функциональность

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

Основные возможности, предоставляемые AcDbObject:

Управление состоянием и жизненным циклом

  • Открытие и закрытие: Для работы с объектом в базе данных его необходимо «открыть» (получить указатель) с определённым режимом доступа (чтение, запись, уведомление). После завершения работы объект «закрывается». Это обеспечивает контроль над блокировками и целостностью данных.
  • Идентификация: Каждый объект в базе данных имеет уникальный идентификаторAcDbObjectId. Этот идентификатор является «лёгкой» ссылкой на объект, не требующей его открытия.
  • Ручка (Handle): Каждый объект также имеет уникальный 64-битный идентификатор — handle, который остаётся неизменным на протяжении всего существования файла чертежа (в отличие от ObjectId, который может меняться при открытии/сохранении).
  • Флаги состояния: Объект может иметь различные флаги, например:
  • kErased — объект удалён (но может быть восстановлен).
  • kPersistentReactor — объект является постоянным реактором (подписан на события другого объекта).
  • kWasNotified — объект был уведомлён о событии.

Сериализация (DWG/DXF)

Методы dwgOut() и dwgIn() отвечают за запись и чтение объекта в двоичном формате DWG. Методы dxfOut() и dxfIn() — за запись и чтение в текстовом формате DXF. Разработчики пользовательских объектов обязаны переопределять эти методы, чтобы корректно сохранять и загружать свои данные.

Реакторы и уведомления

AcDbObject поддерживает механизм реакторов (Reactor) — объектов, которые «подписываются» на события, происходящие с данным объектом (например, изменение, удаление, копирование). Это позволяет реализовывать сложные взаимосвязи между объектами чертежа.

Расширенные данные (XData)

Любой объект, производный от AcDbObject, может хранить произвольные расширенные данные (XData) — наборы пар «код-значение», которые не интерпретируются самим AutoCAD, но могут использоваться сторонними приложениями для хранения дополнительной информации.

Иерархия наследования

AcDbObject является корнем для большинства классов в объектной модели. Основные ветви наследования:

  • AcDbEntity (от AcDbObject) — базовый класс для всех графических объектов (примитивов), которые отображаются на чертеже (линии, окружности, текст, полилинии, блоки и т.д.). AcDbEntity добавляет методы для отрисовки, выбора, заливки, работы с цветом, слоем, типом линии и т.п.
  • AcDbSymbolTable (от AcDbObject) — базовый класс для таблиц символов, которые хранят неграфические объекты (слои, типы линий, текстовые стили, блоки и т.д.).
  • AcDbDictionary (от AcDbObject) — базовый класс для словарей — контейнеров, хранящих именованные объекты (например, словари групп, словари пользовательских данных).
  • AcDbXrecord (от AcDbObject) — объект для хранения произвольных данных в виде списка пар «код-значение» (аналог XData, но более гибкий).
  • AcDbObjectId (не является объектом, а идентификатором) — используется для ссылок на объекты.

Применение

AcDbObject используется в следующих контекстах:

  1. Разработка приложений на ObjectARX: Программисты создают пользовательские классы, наследуя их от AcDbObject (или AcDbEntity), чтобы добавлять в AutoCAD новые типы объектов с собственными данными и поведением.
  2. Работа с чертежами через API: Чтение и запись данных чертежа (например, извлечение информации о слоях, блоках, примитивах) осуществляется через методы, унаследованные от AcDbObject.
  3. Плагины и утилиты: Любое расширение, которое добавляет или изменяет данные в чертеже, так или иначе взаимодействует с объектами, производными от AcDbObject.
  4. Конвертеры форматов: Программы, читающие или пишущие файлы DWG/DXF, должны понимать структуру AcDbObject для корректной сериализации.

Критика и ограничения

  • Сложность: Иерархия классов и механизмы открытия/закрытия могут быть сложны для начинающих разработчиков.
  • Производительность: Чрезмерное использование расширенных данных (XData) или реакторов может снижать производительность при работе с большими чертежами.
  • Закрытость формата: Формат DWG является проприетарным, и полная документация по внутреннему устройству AcDbObject доступна только лицензированным разработчикам через SDK Autodesk. Это ограничивает создание полностью совместимых сторонних реализаций.
  • Наследование и версионность: При создании пользовательских объектов необходимо тщательно управлять версиями данных, чтобы старые чертежи корректно открывались в новых версиях AutoCAD.

Интересные факты

  • Все объекты в базе данных AutoCAD, включая системные (например, словарь именованных объектов), являются наследниками AcDbObject.
  • Механизм реакторов позволяет реализовать, например, автоматическое обновление размеров при изменении геометрии.
  • Пользовательские объекты, созданные на основе AcDbObject, могут быть «лёгкими» (не отображаемыми) или «тяжёлыми» (отображаемыми, если наследуются от AcDbEntity).

Источники

  • ObjectARX Developer’s Guide, Autodesk, Inc.
  • «AutoCAD 2000 ObjectARX Programming», Joe Sutphin, 1999.
  • Документация Autodesk Developer Network (ADN) по классу AcDbObject.
  • «The AutoCAD Database: A Programmer’s Reference», Autodesk, 2002.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →