Выбор элемента и ввод через курсор

Одним из основных способов ввода данных в САПР системах - является графический способ. Пользователь указывает положение или интересующее его действие непосредственно на видовом экране. Методы, которые предоставляет для этого программный комплекс Топоматик Робур можно условно разделить на две части:

Выбор одного или нескольких объектов на экране и работа с ними

Запрос положения, или другой информации на экране и её обработка

Текущий видовой экран можно получить, используя свойство модуля CadView. Это свойство возвращает текущий активный видовой экран. За выбранные объекты на экране отвечает свойство видового экрана SelectionSet - оно возвращает все выделенные объекты на видовом экране. Для того чтобы попросить пользователя явно указать объект, который ему необходим - можно воспользоваться методом PickOneObjectAtScreen у класса SelectionSet. Если необходимо выбрать несколько объектов, то можно использовать метод SelectObjectsAtScreen.

Методы PickOneObjectAtScreen и SelectObjectsAtScreen имеют перегруженную версию, которая позволяет показать меню дополнительных команд

Для того чтобы попросить пользователя указать положение или выполнить ввод какой-либо информации на экране используются методы статического класса CadCursors, например:

GetAngle - ввести угол, возвращает значение введенного угла в радианах

GetBoolean - ввести подтверждение

GetDouble - ввести дробное число, возвращает значение введенного числа в радианах

GetFrame - ввести рамку, возвращает прямоугольник рамки

GetInteger - ввести целое число, возвращает значение целого числа

GetLength - ввести длину, возвращает длину линии введённой пользователем

GetLine - ввести линию, возвращает вторую точку для линии введённой пользователем

GetPoint - ввести точку, возвращает координаты точки, введённой пользователем

GetString - ввести строку, возвращает значение строки введённой пользователем

GetUserSelect - предлагает пользователю выбор из нескольких значений и возвращает выбранное значение

Многие методы класса CadCursors имеют версии, позволяющие указывать значение по умолчанию, например GetDoubleWithDefault или GetIntegerWithDefault

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

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

Topomatic.Cad.Foundation.dll - базовые математические типы и операции

Topomatic.Cad.View.dll - элемент управления для отображения слоёв моделей

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

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

partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator { [cmd("test_select_objects")] public void TestPickObject() { var cadView = CadView; if (cadView != null) { var selection = cadView.SelectionSet; //Предлагаем способ выбора string select = "Выбрать по очереди"; if (CadCursors.GetUserSelect(cadView, ref select, null, "Укажите способ выбора", "Выбрать по очереди", "Выбрать несколько")) { //При выборе объектов, можно указать какие именно объекты на экране будут доступны для выбора //Для нашего случая доступны все объекты Predicate<object> match = delegate (object obj) { return true; }; switch (select) { case "Выбрать по очереди": { //Функция возвращает выбраный элемент, не помещая его в SelectionSet var obj = selection.PickOneObjectAtScreen(match, "Укажите элемент"); while (obj != null) { MessageDlg.Show(obj.ToString()); obj = selection.PickOneObjectAtScreen(match, "Укажите элемент"); } } break; case "Выбрать несколько": { //При вызове функции все выбранные элементы будут помещены в SelectionSet if (selection.SelectObjectsAtScreen(match, "Выберите элементы")) { var builder = new StringBuilder(); foreach (var obj in selection) { builder.AppendLine(obj.ToString()); } MessageDlg.Show(builder.ToString()); } } break; default: break; } } } } [cmd("test_select_points")] public void TestPickPoint() { var cadView = CadView; if (cadView != null) { Vector3D pos; while (CadCursors.GetPoint(cadView, out pos, "Укажите точку")) { //для вывода значений можно использовать методы класса ValueConverter MessageDlg.Show(String.Format("X:{0}, Y:{1}", ValueConverter.CoordinateToStr(pos.X), ValueConverter.CoordinateToStr(pos.Y))); bool show_length = true; if (CadCursors.GetBoolean(cadView, ref show_length, null, "Измерить длину")) { if (show_length) { double length = 0.0; if (CadCursors.GetLength(cadView, pos, ref length, "Укажите вторую точку") == Topomatic.Cad.View.GetPointResult.Accept) { MessageDlg.Show(ValueConverter.LengthToStr(length)); } } } } } } }

Задача команды «test_select_objects» позволить пользователю выбирать объекты на экране, и для каждого выбранного объекта вызывать MessageDlg в котором будет написан тип объекта. Команда «test_select_points» просит пользователя ввести координаты точки, показывает их с помощью MessageDlg и предлагает ему измерить длину до следующей точки.

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

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

{ "assemblies": { "tutorial3": { "assembly": "tutorial3.dll, tutorial3.ModulePluginHost" } }, "actions": { "id_test_select_objects": { "cmd": "test_select_objects", "title": "Выбор объектов" }, "id_test_select_points": { "cmd": "test_select_points", "title": "Выбор точек" } }, "menubars": { "rbproj": { "items": [ { "id": "test_menu", "title": "Примеры" } ] }, "rbproj.test_menu": { "items": [ "id_test_select_objects", "id_test_select_points" ] } }

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

Исходный код примера расположен в проекте «tutorial3».