Разработка .NET-приложений для AutoCAD в рамках архитектуры MVCИсточник: habrahabr t13s
Не секрет, что на сегодняшний день AutoCAD - наиболее популярная САПР, которая используется во многих отраслях человеческой деятельности. В базовой поставке она позволяет выполнять чертежные работы любого назначения с использованием только штатных средств. Однако чистый AutoCAD - как графическое ядро в базовой комплектации - постепенно теряет свою актуальность. Происходит это потому, что сегодня пользователю важно проектировать взаимосвязанные объекты предметной области (стены, профили железной дороги, колеса…), а не графические примитивы на чертеже (точки, линии, окружности…); причем проектировать быстро, качественно и в соответствие со стандартами, действующими в той или иной стране и отрасли. Естественно, все, что требуется конечным пользователям во всех странах, фирма Autodesk включить в состав системы AutoCAD, не могла, поэтому в AutoCAD были внедрены средства программирования, позволяющие пользователям самостоятельно адаптировать его к собственным нуждам [1]. Последняя технология является наиболее мощной, так как она базируется не на частной разработке Autodesk, а на прогрессивной общепризнанной платформе программирования Microsoft .NET Framework. При этом отметим ни одно из перечисленных решений в своем исходном виде не способно связывать чертеж с теми объектами, которые он отображает, то есть с моделью предметной области. В свою очередь, наиболее общей и удачной программной архитектурой, реализующей подобное поведение, является шаблон проектирования (pattern) MVC (Model-View-Controller). Model-View-Controller ("Модель-представление-контроллер"). Это архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты (Рис. 1).
Рис. 1 - Архитектура MVC Важно отметить, что как представление, так и поведение зависят от модели. Однако модель не зависит ни от представления, ни от поведения. Это одно из ключевых достоинств подобного разделения. Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели [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 при изменении элементов чертежа: Подписываясь на данные события, мы получаем возможность отслеживать любые изменения чертежа и реагировать на них, соответственно изменяя компоненты модели. Пользуясь терминологией архитектуры MVC можно сказать, что функции компонента Controller в данной реализации на себя берет как AutoCAD, выступая генератором события об изменении примитива, так и .NET код, вносящий на основе этого события изменения в модель. Таким образом, можно представить архитектуру MVC применительно к AutoCAD в следующем виде (Рис. 3):
Рис. 3 - Реализация архитектуры MVC Сериализация. Следующий вопрос, который необходимо рассмотреть - каким образом обеспечить хранение данных модели между сеансами работы. Наиболее общим подходом к решению этой задачи в среде .NET Framework является сериализация. Отметим два очевидных факта: Обратившись к рис. 2, видим, что указанные действия можно реализовать, подписавшись на следующие события от AutoCAD: Транзакционность. Как было сказано выше, любые изменения документа AutoCAD выполняются в рамках транзакций, что обеспечивает как целостность информации, так и возможность выполнять пользовательские функции отмены и повтора команд. Под термином "транзакция" здесь понимается последовательность операций, выполняющихся при переходе базы данных документа из одного непротиворечивого состояния в другое [5]. Но поскольку в рассматриваемом случае AutoCAD выполняет функции представления и контроллера, а основная информация хранится в модели предметной области, реализованной в .NET, требуется: Данные требования, с одной стороны, гарантируют целостность и непротиворечивость связки модели и базы данных документа; с другой стороны, дают возможность использовать стандартные функции пользовательского интерфейса AutoCAD для отмены и повтора команд. Реализация модели данных предметной области с поддержкой транзакций выходит за рамки данной статьи, достаточно указать лишь направление, в котором может производиться разработка подобного решения - это использование шаблона проектирования "Команда" (Command) [6]. Обеспечение же синхронизации транзакций обоих типов может быть поделено между объектами промежуточного слоя (рис. 3). Controller инициирует одновременный запуск обеих транзакций в ответ на произведенные действия, вносит необходимые изменения в модель, а так же отслеживает вызов команд отмены и повтора. При этом Drawer, отображая чертеж в документе AutoCAD, изменяет записи базы данных документа в уже открытой контроллером транзакции. Результаты. На базе описанных в статье принципов были разработаны: Таким образом, для построения САПР на базе AutoCAD с применением данной разработки необходимо: Полученный подход характеризуется: |