====== Работа с примитивами чертежа ====== Большинство моделей программного комплекса [[http://www.topomatic.ru|Топоматик Робур]] содержат в своем составе модель чертежа. Чертёж позволяет пользователю оперировать базовыми графическими объектами, наносить размеры, подписывать и оформлять другие модели программного комплекса. Более подробно можно ознакомится [[road:work_with_cmm:work_with_elements_drawing:start|здесь]]. Программно чертёж представляет из себя экземпляр класса [[developers:references:topomatic.dwg.drawing|Drawing]]. Этот класс содержит в себе все элементы чертежа, такие как слои, блоки, стили и позволяет осуществлять управление ими. Основные элементы класса [[developers:references:topomatic.dwg.drawing|Drawing]] это: * [[developers:references:topomatic.dwg.drawing.activespace|ActiveSpace]] - это основной [[developers:references:topomatic.dwg.dwgblock|блок]] чертежа, содержит примитивы чертежа и ссылки на другие блоки * [[developers:references:topomatic.dwg.drawing.blocks|Blocks]] - таблица [[developers:references:topomatic.dwg.dwgblock|блоков]] чертежа, содержит основной блок и дополнительные блоки чертежа * [[developers:references:topomatic.dwg.drawing.layers|Layers]] - таблица [[developers:references:topomatic.dwg.dwglayer|слоев]] чертежа, содержит список слоев чертежа * [[developers:references:topomatic.dwg.drawing.linetypes|Linetypes]] - таблица [[developers:references:topomatic.dwg.dwglinetype|типов линий]], содержит описание типов линий, используемых на чертеже Чертеж состоит из [[road:work_with_cmm:work_with_elements_drawing:types_primitives_drawing:start|примитивов]] чертежа. Это примитивные графические объекты, наследники от базового класса [[developers:references:topomatic.dwg.entities.dwgentity|DwgEntity]], такие как [[developers:references:topomatic.dwg.entities.dwgline|линия]], [[developers:references:topomatic.dwg.entities.dwgcircle|окружность]], [[developers:references:topomatic.dwg.entities.dwgarc|арка]], [[developers:references:topomatic.dwg.entities.dwgtext|текст]] и т.п. Примитивы чертежа располагаются внутри [[developers:references:topomatic.dwg.dwgblock|блоков]] чертежа. Для добавления примитивов внутрь [[[[developers:references:topomatic.dwg.dwgblock|блока]] можно использовать методы интерфейса [[developers:references:topomatic.dwg.ientityfactory|IEntityFactory]]. [[developers:references:topomatic.dwg.dwgblock|Блок]] чертежа может содержать внутри себя вставку других блоков чертежа, через специальный примитив [[developers:references:topomatic.dwg.entities.dwginsert|вставка блока]] Каждый примитив чертежа лежит на отдельном [[developers:references:topomatic.dwg.dwglayer|слое]] чертежа. Слой чертежа позволяет управлять видимостью и рядом других свойств своих примитивов. Таблицу слоёв чертежа можно получить используя свойство [[developers:references:topomatic.dwg.drawing.layers|Layers]] экземпляра [[developers:references:topomatic.dwg.drawing|Drawing]]. Для отображения модели чертежа на видовом экране используется класс [[developers:references:topomatic.dwg.layer.drawinglayer|DrawingLayer]]. Получить текущий активный экземпляр слоя возможно через статический метод [[developers:references:topomatic.dwg.layer.drawinglayer.getdrawinglayer_cadview|DrawingLayer.GetDrawingLayer]]. Если необходимо нарисовать примитив на видовом экране, не помещая его в модель чертежа, то необходимо использовать методы класса [[developers:references:topomatic.dwg.paintentityeventargs|PaintEntityEventArgs]], например статический метод [[developers:references:topomatic.dwg.paintentityeventargs.paintentity_topomatic.dwg.entities.dwgentity_topomatic.cad.foundation.cadpen|PaintEntityeventArgs.Paint]] Создайте и настройте новый [[developers:tutorial:module|модуль]] для подключения к программному комплексу [[http://www.topomatic.ru|Топоматик Робур]]. С помощью диалогового окна Менеджер ссылок добавьте ссылки на следующие библиотеки: * [[developers:references:topomatic.cad.foundation|Topomatic.Cad.Foundation.dll]] - базовые математические типы и операции * [[developers:references:topomatic.cad.view|Topomatic.Cad.View.dll]] - элемент управления для отображения слоёв моделей * [[developers:references:topomatic.dwg|Topomatic.Dwg.dll]] - примитивы и модель чертежа * [[developers:references:topomatic.dwg.layer|Topomatic.Dwg.Layer.dll]] - слой чертежа для видового экрана В теле программного модуля объявите две команды, и декорируйте их атрибутом «cmd». Команда "draw_test_block" будет размещать на чертеже вставку блока, и создавать блок при его отсутствии. Команда "draw_test_linetype" разместит на чертеже полилинию, с заданным типом линии и создаст тип линии если это необходимо. partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator { //функция создает экземпляр редактора модели и возвращает его [cmd("draw_test_block")] private void DrawBlock() { //находим текущий слой чертежа var cadView = CadView; var layer = DrawingLayer.GetDrawingLayer(cadView); if (layer != null) { //определяем имя нашего блока const string BLOCK_NAME = "test_block"; var drawing = layer.Drawing; //начинаем групповое изменение чертежа drawing.BeginUpdate(); try { //находим блок с нужным именем var block = drawing.Blocks[BLOCK_NAME]; if (block == null) { //если такого блока нет, создаем его block = drawing.Blocks.Add(BLOCK_NAME); //рисуем внутри блока круг var circle = block.AddCircle(new Vector3D(0, 0, 0), 1.0); circle.Color = CadColor.ByBlock; //и квадрат var line = block.AddPolyline(new Vector2D[] { new Vector2D(-1.0, -1.0), new Vector2D(-1.0, 1.0), new Vector2D(1.0, 1.0), new Vector2D(1.0, -1.0) }); line.Color = CadColor.ByBlock; line.Closed = true; } Vector3D block_pos; while (CadCursors.GetPoint(cadView, out block_pos, "Выберите положение блока")) { //вставляем блок в указанных точках чертежа drawing.ActiveSpace.AddInsert(block_pos, new Vector3D(1.0), 0.0, BLOCK_NAME); cadView.Unlock(); cadView.Invalidate(); } } finally { //заканчиваем групповое изменение чертежа drawing.EndUpdate(); } } } [cmd("draw_test_linetype")] private void DrawLineType() { var cadView = CadView; //находим текущий слой чертежа var layer = DrawingLayer.GetDrawingLayer(cadView); if (layer != null) { //определяем имя типа линии const string LINETYPE_NAME = "test_linetype"; var drawing = layer.Drawing; //начинаем групповое изменение чертежа drawing.BeginUpdate(); try { //находим тип линии с нужным именем var linetype = drawing.Linetypes[LINETYPE_NAME]; if (linetype == null) { //если такого типа линии нет, создаем его шаблон и добавляем в таблицу типов линий var pattern = new LinetypePattern(); //шаблон линии состоит из штриха в 1 еденицу чертежа pattern.Add().DashDotLength = 1; //и промежутка в 0.5 едениц чертежа pattern.Add().DashDotLength = -0.5; //добавляем линию в таблицу линий linetype = drawing.Linetypes.Add(LINETYPE_NAME, "Тестовый шаблон линии", pattern); } //создаем объект полилинии var polyline = new DwgPolyline(); //вызываем функцию подготовки примитива polyline.Prepare(drawing); //назначаем тип линии polyline.Linetype = linetype; //создаем процедуру динамической отрисовки, для удобства ввода DrawCursorEvent dynamic_draw = delegate (CadPen pen, Vector3D vertex) { if (polyline.Count > 0) { //отрисовываем примитив PaintEntityEventArgs.PaintEntity(polyline, pen); //рисуем линию от последней точки полилинии до текущей позиции курсорва pen.DrawLine(polyline[polyline.Count - 1].Vertex, vertex.Pos); } }; //назначаем процедуру динамической отрисовки cadView.DynamicDraw += dynamic_draw; try { Vector3D pos; while (CadCursors.GetPoint(cadView, out pos, "Укажите точку в линии")) { //добавлеям точку в полилинию polyline.Add(new BugleVector2D(pos.Pos)); } //добавляем полилинию на чертёж, если в ней есть точки if (polyline.Count > 0) drawing.ActiveSpace.Add(polyline); } finally { //убираем процедуру динамической отрисовки cadView.DynamicDraw -= dynamic_draw; } } finally { //заканчиваем групповое изменение чертежа drawing.EndUpdate(); } } } } Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом. { "assemblies": { "tutorial11": { "assembly": "tutorial11.dll, tutorial11.ModulePluginHost" } }, "actions": { "id_draw_test_block": { "cmd": "draw_test_block", "title": "Нарисовать блок на чертеже" }, "id_draw_test_linetype": { "cmd": "draw_test_linetype", "title": "Нарисовать линию на чертеже" } }, "menubars": { "rbproj": { "items": [ { "id": "test_menu", "title": "Примеры" } ] }, "rbproj.test_menu": { "items": [ "id_draw_test_block", "id_draw_test_linetype" ] } } } Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом. {{ :developers:tutorial:drawing:drawing_result.png?direct&600 |}} [[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial11"**.