Боковая панель

Работа с примитивами чертежа

Большинство моделей программного комплекса Топоматик Робур содержат в своем составе модель чертежа. Чертёж позволяет пользователю оперировать базовыми графическими объектами, наносить размеры, подписывать и оформлять другие модели программного комплекса. Более подробно можно ознакомится здесь.

Программно чертёж представляет из себя экземпляр класса Drawing. Этот класс содержит в себе все элементы чертежа, такие как слои, блоки, стили и позволяет осуществлять управление ими.

Основные элементы класса Drawing это:

  • ActiveSpace - это основной блок чертежа, содержит примитивы чертежа и ссылки на другие блоки
  • Blocks - таблица блоков чертежа, содержит основной блок и дополнительные блоки чертежа
  • Layers - таблица слоев чертежа, содержит список слоев чертежа
  • Linetypes - таблица типов линий, содержит описание типов линий, используемых на чертеже

Чертеж состоит из примитивов чертежа. Это примитивные графические объекты, наследники от базового класса DwgEntity, такие как линия, окружность, арка, текст и т.п. Примитивы чертежа располагаются внутри блоков чертежа. Для добавления примитивов внутрь блока можно использовать методы интерфейса IEntityFactory.

Блок чертежа может содержать внутри себя вставку других блоков чертежа, через специальный примитив вставка блока

Каждый примитив чертежа лежит на отдельном слое чертежа. Слой чертежа позволяет управлять видимостью и рядом других свойств своих примитивов. Таблицу слоёв чертежа можно получить используя свойство Layers экземпляра Drawing.

Для отображения модели чертежа на видовом экране используется класс DrawingLayer. Получить текущий активный экземпляр слоя возможно через статический метод DrawingLayer.GetDrawingLayer.

Если необходимо нарисовать примитив на видовом экране, не помещая его в модель чертежа, то необходимо использовать методы класса PaintEntityEventArgs, например статический метод PaintEntityeventArgs.Paint

Создайте и настройте новый модуль для подключения к программному комплексу Топоматик Робур.

С помощью диалогового окна Менеджер ссылок добавьте ссылки на следующие библиотеки:

В теле программного модуля объявите две команды, и декорируйте их атрибутом «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"
      ]
    }
  }
}

Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом.

Исходный код примера расположен в проекте «tutorial11».
developers/tutorial/drawing.txt · Последние изменения: 2022/03/15 19:17 — proxor