Не секрет, что на сегодняшний день AutoCAD — наиболее популярная САПР, которая используется во многих отраслях человеческой деятельности. В базовой поставке она позволяет выполнять чертежные работы любого назначения с использованием только штатных средств.
Однако чистый AutoCAD – как графическое ядро в базовой комплектации – постепенно теряет свою актуальность. Происходит это потому, что сегодня пользователю важно проектировать взаимосвязанные объекты предметной области (стены, профили железной дороги, колеса…), а не графические примитивы на чертеже (точки, линии, окружности…); причем проектировать быстро, качественно и в соответствие со стандартами, действующими в той или иной стране и отрасли.
Естественно, все, что требуется конечным пользователям во всех странах, фирма Autodesk включить в состав системы AutoCAD, не могла, поэтому в AutoCAD были внедрены средства программирования, позволяющие пользователям самостоятельно адаптировать его к собственным нуждам [1].
Средства разработки AutoCAD. Данные средства можно условно разбить на следующие группы:
Языки LISP и Visual Basic for Applications для автоматизации неких рутинных действий над чертежами.
Технология ObjectARX, базирующаяся на языке программирования C++ и дающая возможность создания собственных команд и примитивов.
Поддержка технологии Microsoft .NET, которая позволяет загружать в Autocad и исполнять в нем произвольный программный код, написанный на любом из .NET-совместимых языков программирования.
Последняя технология является наиболее мощной, так как она базируется не на частной разработке Autodesk, а на прогрессивной общепризнанной платформе программирования Microsoft .NET Framework.
При этом отметим ни одно из перечисленных решений в своем исходном виде не способно связывать чертеж с теми объектами, которые он отображает, то есть с моделью предметной области. В свою очередь, наиболее общей и удачной программной архитектурой, реализующей подобное поведение, является шаблон проектирования (pattern) MVC (Model-View-Controller).
Model-View-Controller («Модель-представление-контроллер»). Это архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты (Рис. 1).
Рис. 1 — Архитектура MVC
Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние.
Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
Контроллер (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.
Важно отметить, что как представление, так и поведение зависят от модели. Однако модель не зависит ни от представления, ни от поведения. Это одно из ключевых достоинств подобного разделения. Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели [2].
Определим возможность применения архтектуры MVC, рассматривая средства, предоставляемые AutoCAD при программировании с использованием .NET. Ниже (Рис. 2) представлена упрощенная диаграмма классов AutoCAD, через которую реализуется взаимодействие пользовательского кода с САПР.
Структура классов AutoCAD.
Рис. 2 — Упрощенная диаграмма классов AutoCAD
Основным является класс Application, представляющий собой обертку (Wrapper) непосредственно над приложением AutoCAD. В приложении может быть открыто множество документов, каждый из которых представим как объект класса Document. С каждым документом в свою очередь связана база данных (Database), хранящая в себе всю информацию по чертежу (стили, примитивы, блоки…) в виде объектов DBObject с уникальными идентификаторами (Handle). Наибольший интерес для нас представляют именно примитивы (Entity), с помощью которых строится чертеж. Примитивами в AutoCAD являются объекты: точка (Point3d), линия (Line), полилиния (Polyline), окружность (Circle), текст (MText) и т.д. – унаследованные от абстрактного класса Entity.
Любые изменения документа AutoCAD производятся в рамках транзакций, открываемых для его базы данных. Кроме обеспечения целостности информации, данный транзакционный подход применяется и для реализации функций пользовательского интерфейса «Отмена» (Undo) и «Повтор» (Redo), в которых происходит либо откат, либо применение последней в стеке транзакции соответственно. Данную особенность необходимо учитывать при проектировании модели данных предметной области.
Используя транзакции AutoCAD в собственном управляемом .Net-коде, мы имеем возможность строить чертежи, создавая в базе данных документа записи о соответствующих примитивах. Следовательно, мы можем использовать документ AutoCAD в качестве компонента View архитектуры MVC.
Теперь нам требуется определить возможность корректного поведения системы при изменении чертежа пользователем с целью соответствующего изменения компонента Model. Одно из возможных решений — реакция на события, генерируемые AutoCAD при изменении элементов чертежа:
Database.ObjectModified – генерируется при изменении любого объекта DBObject в базе данных документа.
Database.ObjectErased – генерируется при удалении любого объекта из базы данных документа.
Подписываясь на данные события, мы получаем возможность отслеживать любые изменения чертежа и реагировать на них, соответственно изменяя компоненты модели. Пользуясь терминологией архитектуры MVC можно сказать, что функции компонента Controller в данной реализации на себя берет как AutoCAD, выступая генератором события об изменении примитива, так и .NET код, вносящий на основе этого события изменения в модель.
Таким образом, можно представить архитектуру MVC применительно к AutoCAD в следующем виде (Рис. 3):
Рис. 3 — Реализация архитектуры MVC
Сериализация. Следующий вопрос, который необходимо рассмотреть – каким образом обеспечить хранение данных модели между сеансами работы. Наиболее общим подходом к решению этой задачи в среде .NET Framework является сериализация.
Отметим два очевидных факта:
Сохранение данных в базе (сериализацию) необходимо выполнять непосредственно перед сохранением самого документа.
Восстановление данных из базы (десериализацию) следует производить сразу после загрузки документа, связанного с моделью предметной области.
Обратившись к рис. 2, видим, что указанные действия можно реализовать, подписавшись на следующие события от AutoCAD:
Document.BeforeSave, которое генерируется перед сохранением документа AutoCAD на носитель.
Application.DocumentCreated, которое генерируется после открытия или создания документа.
Транзакционность. Как было сказано выше, любые изменения документа AutoCAD выполняются в рамках транзакций, что обеспечивает как целостность информации, так и возможность выполнять пользовательские функции отмены и повтора команд. Под термином «транзакция» здесь понимается последовательность операций, выполняющихся при переходе базы данных документа из одного непротиворечивого состояния в другое [5].
Но поскольку в рассматриваемом случае AutoCAD выполняет функции представления и контроллера, а основная информация хранится в модели предметной области, реализованной в .NET, требуется:
Обеспечить транзакционность указанной модели.
Обеспечить синхронность создания, открытия, записи и отката транзакций для модели данных и базы AutoCAD.
Данные требования, с одной стороны, гарантируют целостность и непротиворечивость связки модели и базы данных документа; с другой стороны, дают возможность использовать стандартные функции пользовательского интерфейса AutoCAD для отмены и повтора команд.
Реализация модели данных предметной области с поддержкой транзакций выходит за рамки данной статьи, достаточно указать лишь направление, в котором может производиться разработка подобного решения – это использование шаблона проектирования «Команда» (Command) [6].
Обеспечение же синхронизации транзакций обоих типов может быть поделено между объектами промежуточного слоя (рис. 3). Controller инициирует одновременный запуск обеих транзакций в ответ на произведенные действия, вносит необходимые изменения в модель, а так же отслеживает вызов команд отмены и повтора. При этом Drawer, отображая чертеж в документе AutoCAD, изменяет записи базы данных документа в уже открытой контроллером транзакции.
Результаты. На базе описанных в статье принципов были разработаны:
Базовая модель, на основе которой можно строить модели различных предметных областей. Она включает в себя: компоненты предметной области, связи между ними, ограничения, накладываемые на компоненты и связи; так же реализует транзакционный подход.
Базовые классы промежуточного слоя между моделью предметной области и чертежом Autocad, которые, с одной стороны, всякий раз при изменении модели обновляют чертеж и, с другой стороны, отправляет в модель все изменения чертежа, сделанные пользователем.
Основные компоненты дополнительного пользовательского интерфейса, позволяющего редактировать данные модели непосредственно, минуя чертеж.
Таким образом, для построения САПР на базе AutoCAD с применением данной разработки необходимо:
Определить (запрограммировать) конкретную модель предметной области в терминах базовой модели.
Определить (запрограммировать) графический вид компонентов модели на чертеже и описать их поведение при изменении чертежа.
Описать поведение дополнительного пользовательского интерфейса, если таковой нужен.
Полученный подход характеризуется:
Высокой степенью интеграции AutoCAD, промежуточного слоя и модели.
Сокрытием особенностей функционирования AutoCAD для программиста.
Относительной простотой разработки.
Удобством эксплуатации.
ЛИТЕРАТУРА
1. Зуев, С. А. и Полещук, Н. Н. САПР на базе AutoCAD — как это делается. СПб: БХВ-Петербург, 2004.
2. Model-View-Controller. Wikipedia. [В Интернете] ru.wikipedia.org/wiki/Model-View-Controller
3. Сериализация. Wikipedia. [В Интернете] ru.wikipedia.org/wiki/Сериализация
4. Основы сериализации в .Net Framework. Microsoft Developer Network. [В Интернете] msdn.microsoft.com/ru-ru/library/ms233836.aspx
5. Хорафас, Д. и Легг, С. Конструкторские базы данных. [перев.] Д. Ф. Миронова. М.: Машиностроение, 1990.
6. Command. Wikipedia. [В Интернете] ru.wikipedia.org/wiki/Command
Однако чистый AutoCAD – как графическое ядро в базовой комплектации – постепенно теряет свою актуальность. Происходит это потому, что сегодня пользователю важно проектировать взаимосвязанные объекты предметной области (стены, профили железной дороги, колеса…), а не графические примитивы на чертеже (точки, линии, окружности…); причем проектировать быстро, качественно и в соответствие со стандартами, действующими в той или иной стране и отрасли.
Естественно, все, что требуется конечным пользователям во всех странах, фирма Autodesk включить в состав системы AutoCAD, не могла, поэтому в AutoCAD были внедрены средства программирования, позволяющие пользователям самостоятельно адаптировать его к собственным нуждам [1].
Средства разработки AutoCAD. Данные средства можно условно разбить на следующие группы:
Языки LISP и Visual Basic for Applications для автоматизации неких рутинных действий над чертежами.
Технология ObjectARX, базирующаяся на языке программирования C++ и дающая возможность создания собственных команд и примитивов.
Поддержка технологии Microsoft .NET, которая позволяет загружать в Autocad и исполнять в нем произвольный программный код, написанный на любом из .NET-совместимых языков программирования.
Последняя технология является наиболее мощной, так как она базируется не на частной разработке Autodesk, а на прогрессивной общепризнанной платформе программирования Microsoft .NET Framework.
При этом отметим ни одно из перечисленных решений в своем исходном виде не способно связывать чертеж с теми объектами, которые он отображает, то есть с моделью предметной области. В свою очередь, наиболее общей и удачной программной архитектурой, реализующей подобное поведение, является шаблон проектирования (pattern) MVC (Model-View-Controller).
Model-View-Controller («Модель-представление-контроллер»). Это архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты (Рис. 1).
Рис. 1 — Архитектура MVC
Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние.
Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
Контроллер (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.
Важно отметить, что как представление, так и поведение зависят от модели. Однако модель не зависит ни от представления, ни от поведения. Это одно из ключевых достоинств подобного разделения. Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели [2].
Определим возможность применения архтектуры MVC, рассматривая средства, предоставляемые AutoCAD при программировании с использованием .NET. Ниже (Рис. 2) представлена упрощенная диаграмма классов AutoCAD, через которую реализуется взаимодействие пользовательского кода с САПР.
Структура классов AutoCAD.
Рис. 2 — Упрощенная диаграмма классов AutoCAD
Основным является класс Application, представляющий собой обертку (Wrapper) непосредственно над приложением AutoCAD. В приложении может быть открыто множество документов, каждый из которых представим как объект класса Document. С каждым документом в свою очередь связана база данных (Database), хранящая в себе всю информацию по чертежу (стили, примитивы, блоки…) в виде объектов DBObject с уникальными идентификаторами (Handle). Наибольший интерес для нас представляют именно примитивы (Entity), с помощью которых строится чертеж. Примитивами в AutoCAD являются объекты: точка (Point3d), линия (Line), полилиния (Polyline), окружность (Circle), текст (MText) и т.д. – унаследованные от абстрактного класса Entity.
Любые изменения документа AutoCAD производятся в рамках транзакций, открываемых для его базы данных. Кроме обеспечения целостности информации, данный транзакционный подход применяется и для реализации функций пользовательского интерфейса «Отмена» (Undo) и «Повтор» (Redo), в которых происходит либо откат, либо применение последней в стеке транзакции соответственно. Данную особенность необходимо учитывать при проектировании модели данных предметной области.
Используя транзакции AutoCAD в собственном управляемом .Net-коде, мы имеем возможность строить чертежи, создавая в базе данных документа записи о соответствующих примитивах. Следовательно, мы можем использовать документ AutoCAD в качестве компонента View архитектуры MVC.
Теперь нам требуется определить возможность корректного поведения системы при изменении чертежа пользователем с целью соответствующего изменения компонента Model. Одно из возможных решений — реакция на события, генерируемые AutoCAD при изменении элементов чертежа:
Database.ObjectModified – генерируется при изменении любого объекта DBObject в базе данных документа.
Database.ObjectErased – генерируется при удалении любого объекта из базы данных документа.
Подписываясь на данные события, мы получаем возможность отслеживать любые изменения чертежа и реагировать на них, соответственно изменяя компоненты модели. Пользуясь терминологией архитектуры MVC можно сказать, что функции компонента Controller в данной реализации на себя берет как AutoCAD, выступая генератором события об изменении примитива, так и .NET код, вносящий на основе этого события изменения в модель.
Таким образом, можно представить архитектуру MVC применительно к AutoCAD в следующем виде (Рис. 3):
Рис. 3 — Реализация архитектуры MVC
Сериализация. Следующий вопрос, который необходимо рассмотреть – каким образом обеспечить хранение данных модели между сеансами работы. Наиболее общим подходом к решению этой задачи в среде .NET Framework является сериализация.
Отметим два очевидных факта:
Сохранение данных в базе (сериализацию) необходимо выполнять непосредственно перед сохранением самого документа.
Восстановление данных из базы (десериализацию) следует производить сразу после загрузки документа, связанного с моделью предметной области.
Обратившись к рис. 2, видим, что указанные действия можно реализовать, подписавшись на следующие события от AutoCAD:
Document.BeforeSave, которое генерируется перед сохранением документа AutoCAD на носитель.
Application.DocumentCreated, которое генерируется после открытия или создания документа.
Транзакционность. Как было сказано выше, любые изменения документа AutoCAD выполняются в рамках транзакций, что обеспечивает как целостность информации, так и возможность выполнять пользовательские функции отмены и повтора команд. Под термином «транзакция» здесь понимается последовательность операций, выполняющихся при переходе базы данных документа из одного непротиворечивого состояния в другое [5].
Но поскольку в рассматриваемом случае AutoCAD выполняет функции представления и контроллера, а основная информация хранится в модели предметной области, реализованной в .NET, требуется:
Обеспечить транзакционность указанной модели.
Обеспечить синхронность создания, открытия, записи и отката транзакций для модели данных и базы AutoCAD.
Данные требования, с одной стороны, гарантируют целостность и непротиворечивость связки модели и базы данных документа; с другой стороны, дают возможность использовать стандартные функции пользовательского интерфейса AutoCAD для отмены и повтора команд.
Реализация модели данных предметной области с поддержкой транзакций выходит за рамки данной статьи, достаточно указать лишь направление, в котором может производиться разработка подобного решения – это использование шаблона проектирования «Команда» (Command) [6].
Обеспечение же синхронизации транзакций обоих типов может быть поделено между объектами промежуточного слоя (рис. 3). Controller инициирует одновременный запуск обеих транзакций в ответ на произведенные действия, вносит необходимые изменения в модель, а так же отслеживает вызов команд отмены и повтора. При этом Drawer, отображая чертеж в документе AutoCAD, изменяет записи базы данных документа в уже открытой контроллером транзакции.
Результаты. На базе описанных в статье принципов были разработаны:
Базовая модель, на основе которой можно строить модели различных предметных областей. Она включает в себя: компоненты предметной области, связи между ними, ограничения, накладываемые на компоненты и связи; так же реализует транзакционный подход.
Базовые классы промежуточного слоя между моделью предметной области и чертежом Autocad, которые, с одной стороны, всякий раз при изменении модели обновляют чертеж и, с другой стороны, отправляет в модель все изменения чертежа, сделанные пользователем.
Основные компоненты дополнительного пользовательского интерфейса, позволяющего редактировать данные модели непосредственно, минуя чертеж.
Таким образом, для построения САПР на базе AutoCAD с применением данной разработки необходимо:
Определить (запрограммировать) конкретную модель предметной области в терминах базовой модели.
Определить (запрограммировать) графический вид компонентов модели на чертеже и описать их поведение при изменении чертежа.
Описать поведение дополнительного пользовательского интерфейса, если таковой нужен.
Полученный подход характеризуется:
Высокой степенью интеграции AutoCAD, промежуточного слоя и модели.
Сокрытием особенностей функционирования AutoCAD для программиста.
Относительной простотой разработки.
Удобством эксплуатации.
ЛИТЕРАТУРА
1. Зуев, С. А. и Полещук, Н. Н. САПР на базе AutoCAD — как это делается. СПб: БХВ-Петербург, 2004.
2. Model-View-Controller. Wikipedia. [В Интернете] ru.wikipedia.org/wiki/Model-View-Controller
3. Сериализация. Wikipedia. [В Интернете] ru.wikipedia.org/wiki/Сериализация
4. Основы сериализации в .Net Framework. Microsoft Developer Network. [В Интернете] msdn.microsoft.com/ru-ru/library/ms233836.aspx
5. Хорафас, Д. и Легг, С. Конструкторские базы данных. [перев.] Д. Ф. Миронова. М.: Машиностроение, 1990.
6. Command. Wikipedia. [В Интернете] ru.wikipedia.org/wiki/Command