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

Динамическая отрисовка при вводе

При вводе данных на видовом экране обычно необходимо реализовать графическое оформление для удобного ввода данных пользователем. Программный комплекс Топоматик Робур предоставляет возможность выполнения динамической отрисовки на видовом экране. Для этого у видового экрана CadView предусмотрено событие DynamicDraw.

Это делегат вида DrawCursorEvent в который приходит два параметра - CadPen pen и Vector3D vertex.

  • CadPen pen - это экземпляр класса CadPen, который предоставляет базовые графические операции, такие как нарисовать точку, нарисовать линию и т.д.
  • Vector3D vertex - это структура, содержащая в себе текущее положение курсора, в координатах чертежа

Алгоритм работы в данном случае следующий перед выполнением ввода данных выполняем подписку на событие DynamicDraw, а после завершения ввода - удаляем подписку.

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

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

Не забудьте поставить флаг «Копировать локально» в «False». Кроме того, необходимо добавить нужные пространства имен в секцию using. Visual Studio позволяет легко сделать это, нажав правой клавишей на имени класса и выбрав добавление директивы using.

В теле программного модуля объявите команду «test_dynamic_render», и декорируйте её атрибутом «cmd».

    partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator
    {
        [cmd("test_dynamic_render")]
        public void TestDynamicRender()
        {
            var cadView = CadView;
            if (cadView != null)
            {
                //список выбранных точек
                var positions = new List<Vector2D>();
                //делегат для динамической отрисовки
                DrawCursorEvent dynamic_draw = delegate (CadPen pen, Vector3D vertex)
                {
                    //если есть точки в списке, нужно их нарисовать и нарисовать линию
                    //от последней выбранной точки, до текущего положения курсора
                    if (positions.Count > 0)
                    {
                        pen.Color = Color.Lime;
                        pen.BeginDraw();
                        try
                        {
                            for (int i = 1; i < positions.Count; i++)
                            {
                                pen.DrawLine(positions[i - 1], positions[i]);
                            }
                            pen.DrawLine(positions[positions.Count - 1], vertex.Pos);
                        }
                        finally
                        {
                            pen.EndDraw();
                        }
                    }
                };
                //подписываемся на событие отрисовки
                cadView.DynamicDraw += dynamic_draw;
                try
                {
                    Vector3D pos;
                    //просим пользователя указать несколько точек
                    while (CadCursors.GetPoint(cadView, out pos, "Укажите точку"))
                    {
                        positions.Add(pos.Pos);
                    }
                    if (positions.Count > 0)
                    {
                        //считаем площадь многоугольника
                        MessageDlg.Show(String.Format("Площадь: {0}", CadLibrary.PolygonArea(positions)));
                    }
                }
                finally
                {
                    //отписываемся от события отрисовки
                    cadView.DynamicDraw -= dynamic_draw;
                }
            }
        }
    }

Задача команды «test_dynamic_render» запрашивать у пользователя точки и рисовать на экране полученный многоугольник. После завершения ввода при помощи MessageDlg выводим площадь полученного многоугольника.

Для подсчета площади используется метод статического класса CadLibrary. В этом классе собрано большое количество разных методов, реализующих основные геометрические операции и расчеты.

Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом.

{
  "assemblies": {
    "tutorial4": {
      "assembly": "tutorial4.dll, tutorial4.ModulePluginHost"
    }
  },
  "actions": {
    "id_test_dynamic_render": {
      "cmd": "test_dynamic_render",
      "title": "Динамическая отрисовка"
    }
  },
  "menubars": {
    "rbproj": {
      "items": [
        {
          "id": "test_menu",
          "title": "Примеры"
        }
      ]
    },
    "rbproj.test_menu": {
      "items": [
        "id_test_dynamic_render"
      ]
    }
  }
}

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

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