====== Динамическая отрисовка при вводе ======
При [[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"**.