Инструменты пользователя

Инструменты сайта


developers:tutorial:drawing

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
developers:tutorial:drawing [2019/02/03 12:04]
vasya
developers:tutorial:drawing [2022/03/15 19:17] (текущий)
proxor
Строка 1: Строка 1:
-====== ​Добавление ​примитивов ======+====== ​Работа с примитивами чертежа ​======
  
-Модель чертежа описана ​в пространстве имен [[developers:​references:topomatic.dwg|Topomatic.Dwg]]. Она представляет собой реализацию хранилища объектов, каждый из которых является примитивом чертежа. Обеспечивает работу с слоями чертежа, типами линии и прочими элементами. ​+Большинство моделей ​программного комплекса ​[[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|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]].  
 +<​note>​[[developers:​references:​topomatic.dwg.dwgblock|Блок]] чертежа может содержать внутри себя вставку других блоков ​чертежа, через специальный примитив [[developers:​references:​topomatic.dwg.entities.dwginsert|вставка блока]]</​note>​ 
 + 
 +Каждый примитив чертежа лежит на отдельном [[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]]. 
 +<​note>​Если ​необходимо ​нарисовать примитив на видовом экране,​ не помещая его в модель чертежа,​ то необходимо использовать методы класса [[developers:​references:​topomatic.dwg.paintentityeventargs|PaintEntityEventArgs]],​ например статический метод [[developers:​references:​topomatic.dwg.paintentityeventargs.paintentity_topomatic.dwg.entities.dwgentity_topomatic.cad.foundation.cadpen|PaintEntityeventArgs.Paint]]</​note>​
  
 Создайте и настройте новый [[developers:​tutorial:​module|модуль]] для подключения к программному комплексу [[http://​www.topomatic.ru|Топоматик Робур]]. ​ Создайте и настройте новый [[developers:​tutorial:​module|модуль]] для подключения к программному комплексу [[http://​www.topomatic.ru|Топоматик Робур]]. ​
Строка 13: Строка 26:
  
   * [[developers:​references:​topomatic.cad.foundation|Topomatic.Cad.Foundation.dll]] - базовые математические типы и операции   * [[developers:​references:​topomatic.cad.foundation|Topomatic.Cad.Foundation.dll]] - базовые математические типы и операции
-  * [[developers:​references:​topomatic.dwg|Topomatic.Dwg.dll]] - модель чертежа 
-  * [[developers:​references:​topomatic.dwg.layer|Topomatic.Dwg.Layer.dll]] - слой для отображения модели 
   * [[developers:​references:​topomatic.cad.view|Topomatic.Cad.View.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]] - слой чертежа для видового экрана
  
-<​note>​Не забудьте поставить флаг «Копировать локально» в «False». Кроме того, необходимо добавить нужные пространства ​имен в секцию using. Visual Studio позволяет легко сделать это, нажав правой клавишей ​на имени класса и выбрав ​добавление директивы using.</​note>​ +В теле программного модуля ​объявите ​две команды, и декорируйте их атрибутом «cmd». Команда "​draw_test_block" ​будет размещать ​на чертеже вставку блока, и создавать блок при его отсутствииКоманда "​draw_test_linetype" ​разместит на чертеже ​полилинию, ​с заданным ​типом линии и создаст тип линии ​если это необходимо.
- +
-Алгоритм получения модели ​чертежа ​для текущего ​окна следующий:​ +
-  * Получаем текущий активный элемент управления [[developers:​references:​topomatic.cad.view.cadview|CadView]] +
-  * Находим слой отображения модели чертежа [[developers:​references:​topomatic.dwg.layer.drawinglayer|DrawingLayer]] через ​статическую функцию [[developers:​references:​topomatic.dwg.layer.getdrawinglayer|GetDrawingLayer]]  +
-  * Получаем модель ​чертежа через свойство слоя [[developers:​references:​topomatic.dwg.layer.drawinglayer.drawing|Drawing]] +
- +
-Для удобства использования - оформим этот алгоритм как свойство нашего модуля:+
 <code csharp> <code csharp>
 partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator
-{ +    ​
-        ... +        //функция ​создает экземпляр редактора ​модели ​и возвращает его 
-        //свойство для получения модели ​чертежа +        [cmd("​draw_test_block"​)] 
-        ​public Drawing Drawing+        ​private void DrawBlock()
         {         {
-            ​get+            ​//​находим текущий слой чертежа 
 +            var cadView = CadView; 
 +            var layer = DrawingLayer.GetDrawingLayer(cadView);​ 
 +            if (layer != null)
             {             {
-                //получаем текущий активный CadView +                //определяем имя нашего блока 
-                var cadView ​this.CadView+                const string BLOCK_NAME = "​test_block";​ 
-                ​if (cadView != null)+                var drawing ​layer.Drawing
 +                ​//​начинаем групповое изменение чертежа 
 +                drawing.BeginUpdate()
 +                try
                 {                 {
-                    //получаем текущий ​слой модели чертежа +                    //находим блок с нужным именем 
-                    var layer DrawingLayer.GetDrawingLayer(cadView); +                    var block = drawing.Blocks[BLOCK_NAME];​ 
-                    ​if ​(layer !null+                    if (block == null) 
-                        //возвращаем ​модель чертежа +                    { 
-                        ​return layer.Drawing;+                        //если такого блока нет, создаем его 
 +                        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();
                 }                 }
-                return null; 
             }             }
 +        }
  
 +        [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();​
 +                }
 +            }
         }         }
 +    }
 +</​code>​
 +
 +Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом.
 +<code javascript>​
 +{
 +  "​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"​
 +      ]
 +    }
 +  }
 } }
 </​code>​ </​code>​
  
 +Результатом запуска проекта будет появления в главном меню пункта «Примеры»,​ с подпунктами,​ которые будут показаны и работать в соответствии с описанным выше алгоритмом.
 +
 +{{ :​developers:​tutorial:​drawing:​drawing_result.png?​direct&​600 |}}
 +
 +<​note>​[[developers:​tutorial:​tutorialcode|Исходный код]] примера расположен в проекте **"​tutorial11"​**.</​note>​
developers/tutorial/drawing.1549195490.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)