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

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


developers:tutorial:drawing

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
developers:tutorial:drawing [2019/03/31 09:48]
vasya
developers:tutorial:drawing [2022/03/15 19:17] (текущий)
proxor
Строка 11: Строка 11:
   * [[developers:​references:​topomatic.dwg.drawing.linetypes|Linetypes]] - таблица [[developers:​references:​topomatic.dwg.dwglinetype|типов линий]],​ содержит описание типов линий, используемых на чертеже   * [[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:​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"​ разместит на чертеже полилинию,​ с заданным типом линии и создаст тип линии если это необходимо.
 +<code csharp>
 +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();​
 +                }
 +            }
 +        }
 +    }
 +</​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>​
 +
 +Результатом запуска проекта будет появления в главном меню пункта «Примеры»,​ с подпунктами,​ которые будут показаны и работать в соответствии с описанным выше алгоритмом.
 +
 +{{ :​developers:​tutorial:​drawing:​drawing_result.png?​direct&​600 |}}
 +
 +<​note>​[[developers:​tutorial:​tutorialcode|Исходный код]] примера расположен в проекте **"​tutorial11"​**.</​note>​
developers/tutorial/drawing.1554025703.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)