Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
developers:tutorial:cadcursors [2019/02/03 12:12] vasya создано |
developers:tutorial:cadcursors [2022/03/15 19:12] (текущий) proxor |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Работа с курсором ====== | + | ====== Выбор элемента и ввод через курсор ====== |
Одним из основных способов ввода данных в САПР системах - является графический способ. Пользователь указывает положение или интересующее его действие непосредственно на видовом экране. Методы, которые предоставляет для этого программный комплекс [[http://www.topomatic.ru|Топоматик Робур]] можно условно разделить на две части: | Одним из основных способов ввода данных в САПР системах - является графический способ. Пользователь указывает положение или интересующее его действие непосредственно на видовом экране. Методы, которые предоставляет для этого программный комплекс [[http://www.topomatic.ru|Топоматик Робур]] можно условно разделить на две части: | ||
Строка 5: | Строка 5: | ||
* Запрос положения, или другой информации на экране и её обработка | * Запрос положения, или другой информации на экране и её обработка | ||
- | За выбранные объекты на экране отвечает свойство [[developers:references:topomatic.cad.view.selectionset|SelectionSet] | + | Текущий видовой экран можно получить, используя свойство модуля [[developers:references:topomatic.cad.view.cadview|CadView]]. Это свойство возвращает текущий активный видовой экран. |
+ | За выбранные объекты на экране отвечает свойство видового экрана [[developers:references:topomatic.cad.view.cadview.selectionset|SelectionSet]] - оно возвращает все выделенные объекты на видовом экране. | ||
+ | Для того чтобы попросить пользователя явно указать объект, который ему необходим - можно воспользоваться методом [[developers:references:topomatic.cad.view.selectionset.pickoneobjectatscreen_system.predicate_1_system.string|PickOneObjectAtScreen]] у класса [[developers:references:topomatic.cad.view.cadview.selectionset|SelectionSet]]. | ||
+ | Если необходимо выбрать несколько объектов, то можно использовать метод [[developers:references:topomatic.cad.view.selectionset.selectobjectsatscreen_system.predicate_1_system.string|SelectObjectsAtScreen]]. | ||
+ | <note>Методы [[developers:references:topomatic.cad.view.selectionset.pickoneobjectatscreen_system.predicate_1_ref_system.object_system.string_arr_system.string|PickOneObjectAtScreen]] и [[developers:references:topomatic.cad.view.selectionset.selectobjectsatscreen_system.predicate_1_system.string_arr_system.string|SelectObjectsAtScreen]] имеют перегруженную версию, которая позволяет показать меню дополнительных команд </note> | ||
+ | |||
+ | Для того чтобы попросить пользователя указать положение или выполнить ввод какой-либо информации на экране используются методы статического класса [[developers:references:topomatic.cad.view.hints.cadcursors|CadCursors]], например: | ||
+ | |||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getangle_topomatic.cad.view.cadview_system.nullable_1_ref_system.double_system.string_arr_system.string|GetAngle]] - ввести угол, возвращает значение введенного угла в радианах | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getboolean_topomatic.cad.view.cadview_ref_system.boolean_system.nullable_1_system.string|GetBoolean]] - ввести подтверждение | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getdouble_topomatic.cad.view.cadview_ref_system.double_system.string_arr_system.string|GetDouble]] - ввести дробное число, возвращает значение введенного числа в радианах | ||
+ | * [[developers:references:c558291625f2a11ea83cfbdc854b9f87|GetFrame]] - ввести рамку, возвращает прямоугольник рамки | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getinteger_topomatic.cad.view.cadview_ref_system.int32_system.string_arr_system.string|GetInteger]] - ввести целое число, возвращает значение целого числа | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getlength_topomatic.cad.view.cadview_system.nullable_1_ref_system.double_system.string_arr_system.string|GetLength]] - ввести длину, возвращает длину линии введённой пользователем | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getlength_topomatic.cad.view.cadview_system.nullable_1_ref_system.double_system.string_arr_system.string|GetLine]] - ввести линию, возвращает вторую точку для линии введённой пользователем | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getpoint_topomatic.cad.view.cadview_ref_topomatic.cad.foundation.vector3d_system.string|GetPoint]] - ввести точку, возвращает координаты точки, введённой пользователем | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getstring_topomatic.cad.view.cadview_ref_system.string_system.string_arr_system.string|GetString]] - ввести строку, возвращает значение строки введённой пользователем | ||
+ | * [[developers:references:topomatic.cad.view.hints.cadcursors.getuserselect_topomatic.cad.view.cadview_ref_system.string_system.nullable_1_system.string_arr_system.string|GetUserSelect]] - предлагает пользователю выбор из нескольких значений и возвращает выбранное значение | ||
+ | |||
+ | <note>Многие методы класса [[developers:references:topomatic.cad.view.hints.cadcursors|CadCursors]] имеют версии, позволяющие указывать значение по умолчанию, например [[developers:references:topomatic.cad.view.hints.cadcursors.getdoublewithdefault_topomatic.cad.view.cadview_ref_system.double_system.string_arr_system.string|GetDoubleWithDefault]] или [[developers:references:topomatic.cad.view.hints.cadcursors.getintegerwithdefault_topomatic.cad.view.cadview_ref_system.int32_system.string_arr_system.string|GetIntegerWithDefault]]</note> | ||
+ | |||
+ | Создайте и настройте новый [[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]] - элемент управления для отображения слоёв моделей | ||
+ | |||
+ | <note>Не забудьте поставить флаг «Копировать локально» в «False». Кроме того, необходимо добавить нужные пространства имен в секцию using. Visual Studio позволяет легко сделать это, нажав правой клавишей на имени класса и выбрав добавление директивы using.</note> | ||
+ | |||
+ | В теле программного модуля объявите две команды, и декорируйте их атрибутом "cmd". | ||
+ | <code csharp> | ||
+ | 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)); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Задача команды «test_select_objects» позволить пользователю выбирать объекты на экране, и для каждого выбранного объекта вызывать [[developers:references:topomatic.controls.dialogs.messagedlg|MessageDlg]] в котором будет написан тип объекта. Команда "test_select_points" просит пользователя ввести координаты точки, показывает их с помощью [[developers:references:topomatic.controls.dialogs.messagedlg|MessageDlg]] и предлагает ему измерить длину до следующей точки. | ||
+ | <note>Для вывода значений в примере используются статические методы класса [[developers:references:topomatic.cad.foundation.valueconverter|ValueConverter]]. Он позволяет производить вывод числовых значений с заданной точностью, в том числе с точностью - указанной в настройках проекта. А также выполнять сравнение значений с необходимой погрешностью.</note> | ||
+ | |||
+ | Теперь необходимо сформировать наш файл .plugin. Заполните его следующим образом. | ||
+ | <code javascript> | ||
+ | { | ||
+ | "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" | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Здесь мы описываем[[developers:references:core.plugin:actions|actions]] для наших команд, и добавляем пункты в меню. | ||
+ | Результатом запуска проекта будет появления в главном меню пункта «Примеры», с подпунктами, которые будут показаны и работать в соответствии с описанным выше алгоритмом. Например, если выделить с помощью команды "Выбор объектов" отрезок - то мы увидим следующий результат: | ||
+ | |||
+ | {{ :developers:tutorial:cadcursors:select_segment.png?direct&600 |}} | ||
+ | |||
+ | <note>[[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial3"**.</note> |