На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Нанесение объекта на карту с заполнением семантики

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Нанесение объекта на карту с заполнением семантики, C# + GIS ToolKit Active 11
 
Здравствуйте господа разработчики!
Подскажите пожалуйста у меня следующая проблема.
Открываю классификатор выбираю площадной объект и начинаю кликать на карте при этом линии тянутся как надо, но при завершении редактирования (двойной клик мыши),
у меня остаются лишь черные линии на карте, т.е. получается что нет совподения первой координаты с последней и это очень сложно сделать мышкой)))
Вопрос как мне сделать это программно, чтобы даже в случае недорисовки или при пересечении линий система автоматом выполняла соединение первой и последней координаты.
Потому что площадной объект должен быть замкнут. Мой код (я пишу на C#  с использованием GIS ToolKit 11)

if (MapObj.Local == TxObjectLocal.OL_SQUARE) // Добавление площадного объекта
               {
                   using (var f = new F_TextEdit_Points())
                   {
                       if (f.ShowDialog() != DialogResult.OK) return;
                       MapPoint.PlaceInp = TxPPLACE.PP_PICTURE;
                       MapEditMetric.cMapObj = MapObj.C_CONTAINER;
                       MapEditMetric.StartAction();
                       MapObj.Text_set(0, f.ObjText);
                       MapObj.Metric.Append(0, MapPoint.C_CONTAINER)
                       MapObj.Commit();
                       MapView.Refresh();
                       f.Dispose();
                   }
 
Цитата
Александр Махин написал:
Здравствуйте господа разработчики!
Подскажите пожалуйста у меня следующая проблема.
Открываю классификатор выбираю площадной объект и начинаю кликать на карте при этом линии тянутся как надо, но при завершении редактирования (двойной клик мыши),
у меня остаются лишь черные линии на карте, т.е. получается что нет совподения первой координаты с последней и это очень сложно сделать мышкой)))
Вопрос как мне сделать это программно, чтобы даже в случае недорисовки или при пересечении линий система автоматом выполняла соединение первой и последней координаты.
Потому что площадной объект должен быть замкнут. Мой код (я пишу на C#  с использованием GIS ToolKit 11)

if (MapObj.Local == TxObjectLocal.OL_SQUARE) // Добавление площадного объекта
               {
                   using (var f = new F_TextEdit_Points())
                   {
                       if (f.ShowDialog() != DialogResult.OK) return;
                       MapPoint.PlaceInp = TxPPLACE.PP_PICTURE;
                       MapEditMetric.cMapObj = MapObj.C_CONTAINER;
                       MapEditMetric.StartAction();
                       MapObj.Text_set(0, f.ObjText);
                       MapObj.Metric.Append(0, MapPoint.C_CONTAINER)
                       MapObj.Commit();
                       MapView.Refresh();
                       f.Dispose();
                   }
Информирую Вас, что у меня получилось замыкать площадной объект, но семантика объекту не передается, хотя макет площадного объекта я выбираю из классификатора.
Как мне передать нанесенному объекту семантику???
 
Цитата
Александр Махин написал:
Цитата
Александр Махин написал:
Здравствуйте господа разработчики!
Подскажите пожалуйста у меня следующая проблема.
Открываю классификатор выбираю площадной объект и начинаю кликать на карте при этом линии тянутся как надо, но при завершении редактирования (двойной клик мыши),
у меня остаются лишь черные линии на карте, т.е. получается что нет совподения первой координаты с последней и это очень сложно сделать мышкой)))
Вопрос как мне сделать это программно, чтобы даже в случае недорисовки или при пересечении линий система автоматом выполняла соединение первой и последней координаты.
Потому что площадной объект должен быть замкнут. Мой код (я пишу на C#  с использованием GIS ToolKit 11)

if (MapObj.Local == TxObjectLocal.OL_SQUARE) // Добавление площадного объекта
               {
                   using (var f = new F_TextEdit_Points())
                   {
                       if (f.ShowDialog() != DialogResult.OK) return;
                       MapPoint.PlaceInp = TxPPLACE.PP_PICTURE;
                       MapEditMetric.cMapObj = MapObj.C_CONTAINER;
                       MapEditMetric.StartAction();
                       MapObj.Text_set(0, f.ObjText);
                       MapObj.Metric.Append(0, MapPoint.C_CONTAINER)
                       MapObj.Commit();
                       MapView.Refresh();
                       f.Dispose();
                   }
Информирую Вас, что у меня получилось замыкать площадной объект, но семантика объекту не передается, хотя макет площадного объекта я выбираю из классификатора.
Как мне передать нанесенному объекту семантику???
Вот полный код как я делаю

if (AddObj.Checked) //Добавление объекта на карту
           {
               if (!MapSelectObjectRsc.ExecuteForMapObj(MapObj.C_CONTAINER, true)) return;
               MapSelectObjectRsc.RestoreEnabled = true;
               MapEditMetric.MetEditMode = TxEditMode.emCreate;
               MapSelectObjectRsc.Show();
if (MapObj.Local == TxObjectLocal.OL_SQUARE) // Добавление площадного объекта
               {
                   using (var f = new F_TextEdit_Points())
                   {
                       if (f.ShowDialog() != DialogResult.OK) return;
                       MapEditMetric.StartAction();
                       MapObj.Text_set(0, f.ObjText);
                       MapObj.Metric.Append(0, MapPoint.C_CONTAINER);
                       MapObj.Commit();
                       MapView.Refresh();
                       f.Dispose();
                   }
               }
 
Александр, повторно:
Просьба задавать вопросы строго в тематических форумах.
Ваши вопросы были выделены в отдельную тему и перенесены в форум по GIS ToolKit.
К разработке в Linux вопросы по GIS ToolKit Active не имеют никакого отношения.
 
Цитата
Александр Махин написал:
MapEditMetric.StartAction();
MapObj.Text_set(0, f.ObjText);
MapObj.Metric.Append(0, MapPoint.C_CONTAINER);
MapObj.Commit();
MapView.Refresh();

После того, как Вы вызвали StartAction(), заполнением метрики объекта (или ее редактированием) занимается компонент MapEditMetric.
Поэтому эти строчки лишние:
Цитата
Александр Махин написал:
MapObj.Metric.Append(0, MapPoint.C_CONTAINER);
MapObj.Commit();
MapView.Refresh();

Этот метод выполняет установку текста подписи. Он имеет смысл только для объектов типа "Подпись".
Цитата
Александр Махин написал:
MapObj.Text_set(0, f.ObjText);
Тоже лишний.


Цитата
Александр Махин написал:
Как мне передать нанесенному объекту семантику???
Это можно сделать либо до редактирования метрики, либо после.
Главное - до MapObj.Commit().

Как объекту добавить семантику мы с Вами проходили в соседней теме.

MapObj.Commit() следует вызывать после того, как режим редактирования метрики отработал. Об этом можно узнать с помощью события axMapEditMetric.OnStopAction.

Посмотрите, как это реализовано в примере ...\GIS ToolKit Active\Example\Visual Studio 2012 С#\Mapedit\
 
Я подкорректировал как понял согласно Вашим рекомендациям. Вот код, который получился:

if (AddObj.Checked) //Добавление объекта на карту
           {
               if (!MapSelectObjectRsc.ExecuteForMapObj(MapObj.C_CONTAINER, true)) return;
               MapSelectObjectRsc.RestoreEnabled = true;
               MapEditMetric.MetEditMode = TxEditMode.emCreate;
               MapSelectObjectRsc.Show();
if (MapObj.Local == TxObjectLocal.OL_SQUARE) // Добавление площадного объекта
               {
                   using (var f = new F_TextEdit_Points())
                   {
                       if (f.ShowDialog() != DialogResult.OK) return;
                       MapEditMetric.StartAction();
                   }
               }

private void MapEditMetric_OnExecute(object sender, EventArgs e)
       {
           
           MapObj.AbrigeObject(100); // Автоматически замкнуть площадной объект
           MapObj.St yle = TxObjectStyle.OS_NORMAL;
           if (MoveObj.Checked) MapObj.CommitAsNew();
           else MapObj.Commit();
           MapObj.Repaint();
           MoveObj.Checked = false;
       }

private void MapEditMetric_OnStopAction(object sender, EventArgs e)
       {
           MapObj.St yle = TxObjectStyle.OS_NORMAL;
           MapObj.ObjHandle = 0;
       }

Согласно данного кода я получаю площадной объект, но он имеет лишь черные линии по периметру, хотя я выбираю из классификатора заштрихованный площадной объект синего цвета. (на скрине).
А еще мне необходимо при завершении, чтобы внутри созданного площадного объекта была надпись (название), т.е. я на карте выделяю площадной объект допустим стадион и внутри добавляю его название.
 
 
Я понял, что происходит когда я создаю площадной объект)))
Получается, что я вырезаю кусок, а остальное удаляется)))
Но мне нужно нанести площадной объект поверх карты.
 
Проверьте, с каким кодом фактически регистрируется объект (надо посмотреть непосредственно у сохраненного на карте объекта).

Если код тот, который нужен, то тут два варианта, почему Вы видите не то изображение объекта.
1. Этот объект в классификаторе является серией объектов - специальный набор условных знаков в классификаторе, конкретный значок зависит от значения определенной семантики объекта карты.
2. Для данного объекта заданы разные уловные знаки для векторного режима отображения карты и принтерного. У Вас карта, судя по всему, отображается в векторном виде.


Что касается подписи.
Цитата
Александр Махин написал:
А еще мне необходимо при завершении, чтобы внутри созданного площадного объекта была надпись (название), т.е. я на карте выделяю площадной объект допустим стадион и внутри добавляю его название.

Подпись у нас может быть как отдельный объект типа "Подпись". Этому объекту устанавливается своя метрика и задается значение Text. То есть наносить надо отдельно два объекта - полигон и подпись.

Второй вариант - сделать в классификаторе  условный знак полигона с подписью по семантике. В этом случае объект будет один, значение подписи будет браться из его семантики.
Но, в штатном исполнении такую подпись можно привязать только к начальной (или конечной) точке метрики контура объекта.

Для того, чтобы подпись автоматически отображалась в центре объекта, необходимо применять библиотеку пользовательских условных знаков (*.iml).
Это вариант для опытных пользователей.

Начните пока с простого варианта - объект-площадь + объект-подпись.
 
Цитата
Александр Махин написал:
Получается, что я вырезаю кусок, а остальное удаляется)))
Но мне нужно нанести площадной объект поверх карты.

Нет. Это что-то из области фантастики.
MapEditMetric умеет делать подобъекты, которые "вырезаются" из основной площади объекта, но это не тот случай.
Во-первых, невозможно что-то вырезать без того, из чего, собственно, вырезать.
Во-вторых, режим у MapEditMetric установлен для создания объекта.
В-третьих, контур подобъекта ("дырки") будет все равно такой же как и у основного контура.
 
Я посмотрел информацию об объекте, который я создал результат на скрине.
И у меня возникает сразу вопрос как программно передавать код выбранного объекта для создаваемого мною и записать его.
Какой финкцией воспользоваться??
Суть такова, что необходимо выделять площадные объекты на карте площадными шаблонами из классификатора.
Страницы: 1 2 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности