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

Как найти ближайшей к указателю мыши объект

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

Если такой стандартной функции нет,
то просьба подсказать, как написать такую функцию.
Изменено: Сергей Викторович - 30.09.2020 15:18:44
 
Цитата
Сергей Викторович написал:
Если такой стандартной функции нет,то просьба подсказать, как написать такую функцию.

На вкус и цвет... Поскольку всем не угодишь, то специальную функцию "выделить точку" мы не делали.
Но есть все возможности визуально выделить точку разными способами - как Вам больше понравится.
Например, в качестве примера можно воспользоваться реализацией выделения узлов объекта при редактировании в компоненте TMapEditMetric:
Код
  // Надо дорисовать узлы?
  if FShowNodes
    then begin
      FNodeCircle.Radius := 1000;
      FNodeCircle.Color  := RGB(0,0,0);
      mapViewMapObject(mapwin1.MapHandle, mapwin1.Handle, dp1, FNodeParm, FObjTemp, cPP_PLANE);
      FNodeCircle.Radius := 800;
      FNodeCircle.Color  := RGB(255,255,255);
      mapViewMapObject(mapwin1.MapHandle, mapwin1.Handle, dp1, FNodeParm, FObjTemp, cPP_PLANE);
    end;

Только в качестве FObjTemp надо создать объект объект в памяти с одной единственной точкой.
 
Сделал так:

Image.Color := $00F0F0F0; // black
Image.Thick := 250;       // mkm
Image.Dash  := 1250;      // stroke length
Image.Blank := 500;       // gap length

// Для рисования пунктира
Form.Image := IMG_DOT;  // пунктир
Form.Parm  := @Image;
Form.Mode  := R2_NOT;

Var
MapTopLeft : TDOUBLEPOINT;
Form       : TPAINTPARM;
QFrame     : array[1..5] of TDOUBLEPOINT;

procedure PaintQuadrate;
begin
MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
QFrame[1].X := Point3.X+10;
QFrame[1].Y := Point3.Y-10;
QFrame[2].X := Point3.X+10;
QFrame[2].Y := Point3.Y+10;
QFrame[3].X := Point3.X-10;
QFrame[3].X := Point3.X+10;
QFrame[4].X := Point3.X-10;
QFrame[4].X := Point3.X-10;
QFrame[5].X := Point3.X+10;
QFrame[5].X := Point3.X-10;
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle,@MapTopLeft,@Form,@QFrame,integer(PP_MAP)); // Компилятор ругается на @MapTopLeft и пишет: Type actual and formal var parametrs must be identical
end;
Изменено: Сергей Викторович - 01.10.2020 10:30:57
 
Параметры, передаваемые по указателю, в прототипах функций на Delphi могут быть описаны по-разному - непосредственное как указатель или как var-переменная.
Во втором случае брать указатель от переменной не требуется.
Проще говоря, где параметр описан как var, добавлять @ не надо.

Вот описание mapViewUserObject на Dephi:
Код
 // Отобразить произвольный объект в пределах фрагмента окна (карты)
 // hmap   - идентификатор открытых данных
 // hwnd  - идентификатор окна;
 // point - координаты верхнего левого угла окна на карте
 // в соответсвующей параметру place системе координат
 // image - описание вида объекта (см. MAPGDI.H);
 // data  - координаты объекта.
 // Координаты объекта заданы в соответствии с параметром place

function  mapViewUserObject(Map : HMap;Wnd : HWnd; [B]var [/B]Point : TDoublePoint;
                                    [B]var[/B] image : TPAINTPARM; [B]var [/B]data : TPLACEDATA;
                                    place : integer=cPP_MAP) : integer; 



Предполагаю, что тут опечатки:
Код
QFrame[1].X := Point3.X+10;
QFrame[1].Y := Point3.Y-10;
QFrame[2].X := Point3.X+10;
QFrame[2].Y := Point3.Y+10;
QFrame[3].X := Point3.X-10;
QFrame[3].X := Point3.X+10;
QFrame[4].X := Point3.X-10;
QFrame[4].X := Point3.X-10;
QFrame[5].X := Point3.X+10;
QFrame[5].X := Point3.X-10;


Слишком много X и мало Y...
 
Да, вроде все работает. Спасибо.
Ниже привожу код, может кому понадобиться.

Var
MapTopLeft : TDOUBLEPOINT;
QFrame     : array[1..5] of TDOUBLEPOINT;
QData      : TPLACEDATA;
PointCount : Integer;

procedure PaintQuadrate;
begin
MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
QFrame[1].X := Point3.X+10;
QFrame[1].Y := Point3.Y-10;
QFrame[2].X := Point3.X+10;
QFrame[2].Y := Point3.Y+10;
QFrame[3].X := Point3.X-10;
QFrame[3].Y := Point3.Y+10;
QFrame[4].X := Point3.X-10;
QFrame[4].Y := Point3.Y-10;
QFrame[5].X := Point3.X+10;
QFrame[5].Y := Point3.Y-10;
PointCount := 5;
QData.Points      := @QFrame[1];
QData.PolyCounts  := @PointCount;  // адрес количества точек
QData.Count       := 1; // счетчик контуров

mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle,MapTopLeft,Form,QData,integer(PP_MAP));
end;
 
В процессе нанесения нового объекта с помощью объекта TMapEditMetric
очередная точка фиксируется нажатием левой клавиши мыши.
Как получить это событие, чтобы изменить координату зафиксированной точки.

Можно конечно обработать событие по клику мыши на карте

procedure Tform_main.mvMapClick(Sender: TObject);
begin
If EditMode = true then
begin
// Но тогда как прочитать координату последней нанесенной точки? чтобы ее изменить и как изменить?
end;
end;
Изменено: Сергей Викторович - 01.10.2020 16:41:09
 
Такого события в режиме нанесения/редактирования не предусмотрено.
Вы можете отредактировать метрику объекта по завершению процесса редактирования - по событию TMapEditMetric.OnExecute в связанном TMapEditMetric с экземпляре компонента TMapObj будет заполнена метрика.

Событие получения точки OnGetPoint есть только в режиме выбора точки на контуре существующего объекта и то, в обработчике этого события изменить координаты нельзя.
 
Понял так.
Вначале нанес объект на карту, как получиться.
Затем выбрал нужную точку на объекте и изменил ее.
Правильно я понял?

Если понял правильно,
вопрос: можно ли автоматически переместить указатель мыши во время нанесения очередного отрезка площадного объекта,
в точку на карте, соответствующую другим заданным координатам в метрах без автоматической фиксации?
Фиксация будет затем выполнена как обычно по нажатию левой клавиши мыши.
Изменено: Сергей Викторович - 01.10.2020 17:07:59
 
Цитата
Сергей Викторович написал:
Вначале нанес объект на карту, как получиться.Затем выбрал нужную точку на объекте и изменил ее. Правильно я понял?

Да. Пока без вариантов.

Цитата
Сергей Викторович написал:
вопрос: можно ли автоматически переместить указатель мыши во время нанесения очередного отрезка площадного объекта,в точку на карте

Это ничего не даст. TMapEditMetric помнит где находился курсор и при следующем нажатии или движении мыши курсор вернется на исходную позицию.
В этом плане TMapEditMetric не обмануть.

Но в целом идея интересная. Подумаем как реализовать и, возможно, в следующих версиях расширим возможности TMapEditMetric, чтобы можно было программно управлять позиционированием и установкой точек.
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)



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

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