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

Перемещение группы объектов (emMoveGroup)

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 4 5 След.
RSS
Перемещение группы объектов (emMoveGroup)
 
Здравствуйте, господа разработчики.

Пишу на С# с применением GisToolKitActiveFree 14.0.0.1

Я пытаюсь реализовать функционал на "горячих клавишах", а именно при зажатой клавиши CTRL по клику мыши выполнить выделение необходимых мне объектов на карте.
Далее при нажатой клавише ALT выполнить групповое перемещение выделенных объектов.

НО ПОСЛЕ ОТЖАТИЯ КЛАВИШЫ ALT ОБЪЕКТЫ СТОЯТ НА МЕСТЕ И ПОЯВЛЯЕТСЯ ПОЛОСА КОТОРУЮ НЕ УДАЛИТЬ.
КАК БЫТЬ?????

Вот мой код выделения объектов:

if ((ModifierKeys & Keys.Control) == Keys.Control) //Групповое выделение объектов на карте при нажатии CTRL
           {
               int countObj = 0;
               TxColorRef aColor = new TxColorRef();
               aColor.Red = 255;
               var listName = MapView.MapName;
               mfGroup.cMapSelect.SiteNumber = 0;       // основная карта
               MapView.ViewSelect.MapSites[1] = false;
               MapView.ViewSelect.MapSites[2] = false;
               MapView.ViewSelect.MapSites[3] = false;
               MapView.ViewSelect.MapSites[4] = false;
               mfGroup.cMapSelect.Layers[47] = false;
               mfGroup.cMapSelect.MapSites[1] = false;
               mfGroup.cMapSelect.MapSites[2] = false;
               mfGroup.cMapSelect.MapSites[3] = false;
               mfGroup.cMapSelect.MapSites[4] = false;
               MouseXY.PlaceInp = TxPPLACE.PP_PICTURE;
               MouseXY.SetPoint(e.x, e.y);
               mfGroup.PlaceInp = TxPPLACE.PP_PICTURE;
               mfGroup.Active = false;
               mfGroup.FindPoint = true;
               mfGroup.X = e.x;
               mfGroup.Y = e.y;
               mfGroup.Radius = 5;
               mfGroup.Active = true;
               if (MapView.ViewSelect.SelectSample(true, listName, mfGroup.cMapObj.Key) > 0)
               {
                   MapView.SetObjSelected(MapView.ViewSelect, aColor, true);
                   countObj++;
               }
               MapEditMetric.MapFindGroup = mfGroup.C_CONTAINER;
           }

Вот код группового перемещения выделенных объектов:

if ((ModifierKeys & Keys.Alt) == Keys.Alt) // Перемещение объекта посредствам нажатой кнопки Alt
                   {
                       if (countObj > 0)
                       {
                           int type1 = MapAPI.mapLogReadActionForUndo((IntPtr)MapView.MapHandle, (IntPtr)0, 1); //выполняет запрос на получение номера последней транзакции
                           MapAPI.mapLogCreateAction((IntPtr)MapView.MapHandle, (IntPtr)0, type1++); // открывает журнал транзакций на запись
                           MapEditMetric.MoveWhenDown = false;
                           MapEditMetric.EditViewStyle = MapObj.Local == TxObjectLocal.OL_SQUARE ? TxEditViewStyle.vsContourWithNodes : TxEditViewStyle.vsRealView;
                           MapEditMetric.MetEditMode = axGisToolKit.TxEditMode.emMoveGroup;
                           MapEditMetric.StartAction();
                       }

private void MapEditMetric_OnExecute(object sender, EventArgs e)
       {
             MapObj.St yle = TxObjectStyle.OS_NORMAL;
             MapObj.CommitObjectAsNew();
             MapObj.Repaint();
             MapView.Refresh();
       }
 
По фрагментам кода трудно судить о том, как он функционирует.

MapEditMetric.StartAction(); - это старт операции перемещения объектов, которые Вы заполнили в MapEditMetric.MapFindGroup.

Не понятны многие моменты.

1. В обработчике какого события вызывается StartAction?
2. Почему список объектов с помощью SelectSample заполняется в MapView.ViewSelect, а компоненту MapEditMetric устанавливается mfGroup?
3. Что должен сохранить на карту MapObj.CommitObjectAsNew()?
4. Зачем открывается транзакция MapAPI.mapLogCreateAction (также не ясно в каком обработчике) и потом нигде не закрывается?
 
Я подготовил файл (во вложении) с функционалом касаемо только перемещения группы объектов.
Для более наглядной демонстрации моего функционала.
 
Какова разрядность Вашего приложения?
В комплект поставки входит пример d:\Gtmy\ActiveX14\Example\MS2012\C#\Mapedit\. Проверили его работу на карте из поставки. Пример работает.

По Вашему тексту визуальное выделение объектов не должно работать, так как:

               MapFind.X = e.x; // это может сработать только если начало карты совпадает с начало окна отображения.
               MapFind.Y = e.y;


               if (MapView.ViewSelect.SelectSample(true, listName, MapFind.cMapObj.Key) > 0) countObj++; для перемещения установили только один объект.

               MapView.SetObjSelected(MapView.ViewSelect, aColor, true); на карте выделили не то что нашли в MapFind
 
Цитата
Александр Махин написал:
Для более наглядной демонстрации моего функционала.

При этом ответов на вопросы, которые я задал выше практически не появилось.

Цитата
Денис Вицко написал:
2. Почему список объектов с помощью SelectSample заполняется в MapView.ViewSelect, а компоненту MapEditMetric устанавливается mfGroup?
3. Что должен сохранить на карту MapObj.CommitObjectAsNew()?
4. Зачем открывается транзакция MapAPI.mapLogCreateAction и потом нигде не закрывается?

Компоненту MapEditMetric в свойство MapFindGroup передается MapFind, где должна быть заполнена группа перемещаемых объектов.
Группу с помощью SelectSample Вы заполняете в другой MapSelect - MapView.ViewSelect.
А в MapFind.MapSelect в лучшем случае будет только один объект - последний выбранный по клику на карте. С этим и будет работать MapEditMetric.

Еще замечания по коду.
Насколько я понял, предполагалось кликая по карте с Ctrl набрать группу объектов, а кликом с Alt приступить к ее перемещению.
Зачем на каждый клик с Ctrl заново перенастраивать условия в MapFind и заново его устанавливать в MapEditMetric?
Это достаточно сделать один раз.

В режиме перемещения группы при завершении перемещения все объекты и так сохраняются на карту.
Вы зачем-то дополнительно вызываете MapObj.CommitObjectAsNew - это сохранит еще одну копию объекта, заполненного в MapObj, на карту.
 
Цитата
Денис Вицко написал:
2. Почему список объектов с помощью SelectSample заполняется в MapView.ViewSelect, а компоненту MapEditMetric устанавливается mfGroup?
Если я пропишу как  MapView.SetObjSelected(MapFind.cMapSelect, aColor, true), то в этом случае выделяется один объект на карте и последующие выборы не срабатывают.
Цитата
Денис Вицко написал:
3. Что должен сохранить на карту MapObj.CommitObjectAsNew()?
Исправил на MapObj.Commit().
Цитата
Денис Вицко написал:
4. Зачем открывается транзакция MapAPI.mapLogCreateAction и потом нигде не закрывается?
Для возможности отменять последние действие пользователя (CTRL+Z).
Цитата
Денис Вицко написал:
Компоненту MapEditMetric в свойство MapFindGroup передается MapFind, где должна быть заполнена группа перемещаемых объектов.
Как правильно выполнить заполнение группы перемещаемых объектов?
Цитата
Денис Вицко написал:
Зачем на каждый клик с Ctrl заново перенастраивать условия в MapFind и заново его устанавливать в MapEditMetric?
Где его тогда объявить? Если я не использую CheckButton?


Поправил код с учетом Ваших замечаний:

С использованием этого варианта объекты выделяются, но перемещается лишь один объект который был выбран последним.

private void MapView_OnMapMouseUp(object sender, AxaxGisToolKit.IaxMapViewEvents_OnMapMouseUpEvent e)
       {
            if ((ModifierKeys & Keys.Control) == Keys.Control)
           {
               TxColorRef aColor = new TxColorRef();
               aColor.Blue = 128;

               MapFind.cMapView.ViewSelect.MapSites[1] = false;
               MapFind.cMapView.ViewSelect.MapSites[2] = false;
               MapFind.cMapView.ViewSelect.MapSites[3] = false;
               MapFind.cMapView.ViewSelect.MapSites[4] = false;
               MapFind.cMapView.ViewSelect.Layers[47] = false;
               
               MouseXY.PlaceInp = TxPPLACE.PP_PICTURE;
               MouseXY.SetPoint(e.x, e.y);
               
               MapFind.Active = false;
               MapFind.FindPoint = true;
               MapFind.X = e.x;
               MapFind.Y = e.y;
               MapFind.Radius = 5;
               MapFind.Active = true;

               int _count = MapFind.cMapView.ViewSelect.SelectSample(true, MapView.MapName, MapFind.cMapObj.Key);
               if (_count > 0) countObj++;
               

               for (int i = 0; i <= countObj; i++)
               {
                   MapView.SetObjSelected(MapFind.cMapView.ViewSelect, aColor, true);
                   MapEditMetric.MapFindGroup = MapFind.C_CONTAINER;
                   MapObj.Commit();
               }
           }
        }


С использованием этого варианта выделяется один первый выбранный объект и все.

if ((ModifierKeys & Keys.Control) == Keys.Control)
           {
               TxColorRef aColor = new TxColorRef();
               aColor.Blue = 128;

               MapFind.cMapSelect.MapSites[1] = false;
               MapFind.cMapSelect.MapSites[2] = false;
               MapFind.cMapSelect.MapSites[3] = false;
               MapFind.cMapSelect.MapSites[4] = false;
               MapFind.cMapSelect.Layers[47] = false;
               
               MouseXY.PlaceInp = TxPPLACE.PP_PICTURE;
               MouseXY.SetPoint(e.x, e.y);
               
               MapFind.Active = false;
               MapFind.FindPoint = true;
               MapFind.X = e.x;
               MapFind.Y = e.y;
               MapFind.Radius = 5;
               MapFind.Active = true;

               int _count = MapFind.cMapSelect.SelectSample(true, MapView.MapName, MapFind.cMapObj.Key);
               if (_count > 0) countObj++;
               

               for (int i = 0; i <= countObj; i++)
               {
                   MapView.SetObjSelected(MapFind.cMapSelect, aColor, true);
                   MapEditMetric.MapFindGroup = MapFind.C_CONTAINER;
                   MapObj.Commit();
               }
           }


 
 
Вот несколько строк из примера (о котором написал выше), где mfGroup - это MapFind
            if (mfGroup.cMapSelect.SelectSample(true, listname, 18395) > 0)
                issamp++;
           if (mfGroup.cMapSelect.SelectSample(true, listname, 18280) > 0)
                  issamp++;
              if (mfGroup.cMapSelect.SelectSample(true, listname, 209381) > 0)
                  issamp++;

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

MapFind.cMapView.ViewSelect.SelectSample(true, MapView.MapName, MapFind.cMapObj.Key);

В MapFind надо указать несколько объектов, как, например, показано выше.
 
Цитата
Александр Махин написал:
Где его тогда объявить? Если я не использую CheckButton?

Тут зависит от логики Вашего приложения.
Режим, в котором Вы начинаете набирать набор объектов, должен же как-то включаться?
Если включение - это клик+Ctrl, то как тогда происходит сброс, чтобы начать набирать новую группу?
В любом случае - где режим включается, там устанавливаются и условия.

У Вас сейчас на каждый клик+Ctrl условия поиска в MapFind сбрасываются и устанавливаются заново. В нем будет только один объект, а нужно реализовать накопление.

1. Чтобы не путаться в MapSelect-ах, добавьте еще один MapFind.
   Первым MapFind выполняйте поиск в точке, во второй MapFind2 складывайте выбранные объекты:
   MapFind2.cMapSelect.SelectSample(true, MapFind.cMapObj.ListName, MapFind.cMapObj.Key).
2. MapEditMetric должен быть настроен на MapFind2.
3. Для визуального выделения используйте MapSelect-ы компонента MapView -
   MapView.SetObjSelected(MapFind2.cMapSelect, aColor, true);
   - перебор объектов в цикле тут не нужен!
4. MapObj.Commit(); - это лишнее.
 
Понял. Буду пробовать👍
 
Цитата
Денис Вицко написал:
2. MapEditMetric должен быть настроен на MapFind2
Как правильно это сделать?
Страницы: 1 2 3 4 5 След.
Читают тему (гостей: 1)



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

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