Разработка .NET-приложений для AutoCAD в рамках архитектуры MVC

Источник: habrahabr
t13s

Не секрет, что на сегодняшний день 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).

image

Рис. 1 - Архитектура MVC
Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние.
Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
Контроллер (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.

Важно отметить, что как представление, так и поведение зависят от модели. Однако модель не зависит ни от представления, ни от поведения. Это одно из ключевых достоинств подобного разделения. Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели [2].

Определим возможность применения архтектуры MVC, рассматривая средства, предоставляемые AutoCAD при программировании с использованием .NET. Ниже (Рис. 2) представлена упрощенная диаграмма классов AutoCAD, через которую реализуется взаимодействие пользовательского кода с САПР.

Структура классов AutoCAD.

image

Рис. 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):

image

Рис. 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 для программиста.
Относительной простотой разработки.
Удобством эксплуатации.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=33875