При вводе данных на видовом экране обычно необходимо реализовать графическое оформление для удобного ввода данных пользователем. Программный комплекс Топоматик Робур предоставляет возможность выполнения динамической отрисовки на видовом экране. Для этого у видового экрана CadView предусмотрено событие DynamicDraw.
Это делегат вида DrawCursorEvent в который приходит два параметра - CadPen pen и Vector3D vertex.
Алгоритм работы в данном случае следующий перед выполнением ввода данных выполняем подписку на событие DynamicDraw, а после завершения ввода - удаляем подписку.
Создайте и настройте новый модуль для подключения к программному комплексу Топоматик Робур.
С помощью диалогового окна Менеджер ссылок добавьте ссылки на следующие библиотеки:
В теле программного модуля объявите команду «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 выводим площадь полученного многоугольника.
Теперь необходимо сформировать наш файл .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 для нашей команды, и добавляем пункт в меню. Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктом «Динамическая отрисовка», который будет работать в соответствии с описанным выше алгоритмом. После запуска и выполнения мы увидим следующий результат: