Инструменты пользователя

Инструменты сайта


developers:tutorial:cadcursors

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
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>​
developers/tutorial/cadcursors.1549195952.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)