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

Создание объекта из классификатора

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Создание объекта из классификатора
 
Добрый вечер.
Подскажите пожалуйста, после того как я выбрал объект из классификатора и нажал на кнопку "Выбор", мне необходимо сделать так, чтобы выбранный мной объект двигался за курсором мыши пока я не выберу место на карте?

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

Мой код
private void CreateObj_ItemClick(object sender, ItemClickEventArgs e)
       {
           if (!MapSelectObjectRsc.ExecuteForMapObj(MapObj.C_CONTAINER, true)) return;
           MapEditMetric.MoveWhenDown = false;
           MapEditMetric.EditViewStyle = TxEditViewStyle.vsRealView;
           MapEditMetric.MetEditMode = TxEditMode.emCreate;
           MapEditMetric.StartAction();
       }

private void MapEditMetric_OnExecute(object sender, EventArgs e)
       {
           MapObj.SetObjectByExcode((int)TxMetricType.IDFLOAT2, ObjExCode, (int)TxObjectLocal.OL_VECTOR);
           MapObj.Commit();
           MapAPI.mapUpdateObjectUp((IntPtr)MapObj.ObjHandle);
       }

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

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

Так реализован алгоритм создания точечных объектов. Он повторяет режим создания точечных объектов в ГИС Панорама и ГИС Оператор.

Объект появляется при нажатии левой кнопки мыши на карте.
Пока кнопка мыши нажата, объект можно перемещать вместе с курсором.
Отжатие кнопки - завершение редактирования.

Щелчок мыши - это нажатие и сразу же отжатие. То есть объект будет создан в месте клика на карте.
 
И еще один вопрос.
При редактировании объекта (перемещении или копировании) объект двигается за курсором ровно на таком удалении где была нажата кнопка "Переместить" или "Копировать".
А я пытаюсь сделать так, чтобы объект в момент редактирования двигался около курсора, но что-то не получается((

Мой код:
private void barButtonItem33_ItemClick(object sender, ItemClickEventArgs e)
       {
           MapEditMetric.MoveWhenDown = false;
           MapEditMetric.EditViewStyle = TxEditViewStyle.vsRealView;
           ObjStyle = 6;
           MapEditMetric.MetEditMode = TxEditMode.emMove;
           MapEditMetric.StartAction();
       }

private void MapEditMetric_OnExecute(object sender, EventArgs e)
       {
              if (ObjStyle == 6) //Перемещение объекта
             {
                MapObj.Commit();
             }

private void MapEditMetric_OnStopAction(object sender, EventArgs e)
       {
           MapObj.St yle = TxObjectStyle.OS_NORMAL;
           MapObj.ObjHandle = 0;
       }
 
При включении любого режима редактирования методом StartAction (кроме режимов создания объекта или подобъекта), вычисляется разница между курсором и ближайшей точкой объекта.
При включенной опции MoveWhenDown это выполняется каждый раз при новом нажатии левой кнопки мыши.

Далее с этой "дельтой" координат относительно курсора и выполняются все операции перемещения точки или объекта целиком.

Попробуйте непосредственно перед вызовом StartAction (при MoveWhenDown = false) программно установить курсор в нужную Вам позицию.
Если это будет точка объекта, то "дельта" в момент StartAction будет равна нулю.
 
Цитата
Денис Вицко написал:
Попробуйте непосредственно перед вызовом StartAction (при MoveWhenDown = false) программно установить курсор в нужную Вам позицию. Если это будет точка объекта, то "дельта" в момент StartAction будет равна нулю.
А какой функцией воспользоваться для выполнения этого действия??
Может быть так?

MapPoint.SetPoint(x, y);
MapObj.Metric.Append(0, MapPoint.C_CONTAINER);
 
Цитата
Александр Махин написал:
Может быть так?

MapPoint.SetPoint(x, y);
MapObj.Metric.Append(0, MapPoint.C_CONTAINER);

Вы новый объект создаете? Или перемещаете существующий?
В MapEditMetric это два разных режима.
Раз у Вас возник вопрос относительно того, что курсор не на объекте, я делаю вывод, что всё-таки  перемещаете существующий объект.
И тут встает задача установить курсор на объект, а Ваш код добавит новую точку объекту. Зачем она Вам в объекте?

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

порядок действий (непосредственно перед StartAction):
1. взять координаты в пикселах в окне карты (если это должна быть точка объекта, то запросить ее координаты - aiMapMetric.Point, запросить можно сразу в пикселах, но это будут координаты относительно левого верхнего угла карты, поэтому из них надо вычесть значения свойств MapView - MapLeft и MapTop для X и Y соответственно);
2. преобразовать оконные координаты компонента MapView в экранные координаты - штатный метод в С# для любого оконного элемента: PointToScreen.
3. установить позицию курсора по экранным координатам:
Код
[DllImport("user32.dll")]
public static extern void SetCursorPos(int x, int y);
 
SetCursorPos(X, Y);

или
Код
System::Windows::Forms::Cursor::Position = Point(X, Y);


На правильность кода не претендую, специалистом в C# не являюсь. Но порядок действий такой.
Страницы: 1
Читают тему (гостей: 1)



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

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