====== Динамическая отрисовка при вводе ====== При [[developers:tutorial:cadcursors|вводе данных]] на видовом экране обычно необходимо реализовать графическое оформление для удобного ввода данных пользователем. Программный комплекс [[http://www.topomatic.ru|Топоматик Робур]] предоставляет возможность выполнения динамической отрисовки на видовом экране. Для этого у видового экрана [[developers:references:topomatic.cad.view.cadview|CadView]] предусмотрено событие [[developers:references:topomatic.cad.view.cadview.dynamicdraw|DynamicDraw]]. Это делегат вида [[developers:references:topomatic.cad.view.drawcursorevent|DrawCursorEvent]] в который приходит два параметра - [[developers:references:topomatic.cad.foundation.cadpen|CadPen]] pen и [[developers:references:topomatic.cad.foundation.vector3d|Vector3D]] vertex. * [[developers:references:topomatic.cad.foundation.cadpen|CadPen]] pen - это экземпляр класса [[developers:references:topomatic.cad.foundation.cadpen|CadPen]], который предоставляет базовые графические операции, такие как нарисовать точку, нарисовать линию и т.д. * [[developers:references:topomatic.cad.foundation.vector3d|Vector3D]] vertex - это структура, содержащая в себе текущее положение курсора, в координатах чертежа Алгоритм работы в данном случае следующий перед выполнением [[developers:tutorial:cadcursors|ввода данных]] выполняем подписку на событие [[developers:references:topomatic.cad.view.cadview.dynamicdraw|DynamicDraw]], а после завершения ввода - удаляем подписку. Создайте и настройте новый [[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]] - элемент управления для отображения слоёв моделей Не забудьте поставить флаг «Копировать локально» в «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(); //делегат для динамической отрисовки 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" запрашивать у пользователя точки и рисовать на экране полученный многоугольник. После завершения ввода при помощи [[developers:references:topomatic.controls.dialogs.messagedlg|MessageDlg]] выводим площадь полученного многоугольника. Для подсчета площади используется метод статического класса [[developers:references:topomatic.cad.foundation.cadlibrary|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" ] } } } Здесь мы описываем [[developers:references:core.plugin:actions|actions]] для нашей команды, и добавляем пункт в меню. Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктом "Динамическая отрисовка", который будет работать в соответствии с описанным выше алгоритмом. После запуска и выполнения мы увидим следующий результат: {{ :developers:tutorial:dynamicrender:area.png?direct&600 |}} [[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial4"**.