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

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

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

  • Выбор одного или нескольких объектов на экране и работа с ними
  • Запрос положения, или другой информации на экране и её обработка

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

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

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

  • GetAngle - ввести угол, возвращает значение введенного угла в радианах
  • GetBoolean - ввести подтверждение
  • GetDouble - ввести дробное число, возвращает значение введенного числа в радианах
  • GetFrame - ввести рамку, возвращает прямоугольник рамки
  • GetInteger - ввести целое число, возвращает значение целого числа
  • GetLength - ввести длину, возвращает длину линии введённой пользователем
  • GetLine - ввести линию, возвращает вторую точку для линии введённой пользователем
  • GetPoint - ввести точку, возвращает координаты точки, введённой пользователем
  • GetString - ввести строку, возвращает значение строки введённой пользователем
  • GetUserSelect - предлагает пользователю выбор из нескольких значений и возвращает выбранное значение
Многие методы класса CadCursors имеют версии, позволяющие указывать значение по умолчанию, например GetDoubleWithDefault или GetIntegerWithDefault

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

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

Не забудьте поставить флаг «Копировать локально» в «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».
developers/tutorial/cadcursors.txt · Последние изменения: 2022/03/15 19:12 — proxor