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

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


developers:tutorial:cadcursors

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
developers:tutorial:cadcursors [2019/02/09 17:00]
vasya
developers:tutorial:cadcursors [2022/03/15 19:12] (текущий)
proxor
Строка 28: Строка 28:
 Создайте и настройте новый [[developers:​tutorial:​module|модуль]] для подключения к программному комплексу [[http://​www.topomatic.ru|Топоматик Робур]]. ​ Создайте и настройте новый [[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.1549731619.txt.gz · Последние изменения: 2021/07/22 14:28 (внешнее изменение)