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

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

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

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

procedure Tform_main.mvMapMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
Var
resObj : integer;
Point1 : PDoublePoint;
Point2 : PDoublePoint;
begin
form_main.mvMap.SetFocus;

If (MouseX = X) and ( MouseY = Y)
then exit;

MapPoint1.PlaceInp := PP_PICTURE;
MapPoint1.SetPoint(X + mvMap.MapLeft, Y + mvMap.MapTop);

Point1.X := MapPoint1.Point.X;
Point1.Y := MapPoint1.Point.Y;
resObj := mapSeekSelectNearestObject(mvMap.MapHandle,MapObj1.ObjHandle, Point1, Point2,hselN,0); // При выполнении программы выдает ошибку по памяти

Просьба подсказать, что не правильно?
 
Point1 : PDoublePoint;
Point2 : PDoublePoint;

- эти переменные вы объявили как указатели.
Указатели должны указывать на выделенную область памяти (прошу прощения за тавтологию).

А где Вы эту память выделили?

Вообще ошибка должна была бы произойти еще тут:
Point1.X := MapPoint1.Point.X;
 
Да, вы правы, Денис. Здравствуйте!

procedure Tform_main.mvMapMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Var
resObj : integer;
Point1 : PDoublePoint;
Point2 : PDoublePoint;
begin
form_main.mvMap.SetFocus;

If (MouseX = X) and ( MouseY = Y)
then exit;

MapPoint1.PlaceInp := PP_PICTURE;
MapPoint1.SetPoint(X + mvMap.MapLeft, Y + mvMap.MapTop);

Point1.X := MapPoint1.Point.X; // Ошибка происходит здесь. В чем ошибка? Как должно быть?
Point1.Y := MapPoint1.Point.Y;
resObj := mapSeekSelectNearestObject(mvMap.MapHandle,MapObj1.ObjHandle, @Point1, @Point2,hselN,0); // Добавлены указатели на выделение памяти  
 
Цитата
Сергей Викторович написал:
Добавлены указатели на выделение памяти  

и получились указатели на указатели

если Вы хотите выделить память в стеке, то объявите не указатели а переменные типа TDoublePoint
Point1 : PTDoublePoint;
Point2 : PTDoublePoint;

Еще hselN - это должен быть идентификатор контекста поиска, который также должен быть предварительно создан!
По тексту это не очевидно. Если никаких условий поиска не накладывается, то можно передать 0.
 
Все хорошо работает!

procedure Tform_main.mvMapMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
Var
resObj : integer;
Point1 : TDoublePoint;
Point2 : TDoublePoint;
begin
form_main.mvMap.SetFocus;

If (MouseX = X) and ( MouseY = Y)
then exit;

MapPoint1.PlaceInp := PP_PICTURE;
MapPoint1.SetPoint(X + mvMap.MapLeft, Y + mvMap.MapTop);

Point1.X := MapPoint1.Point.X;
Point1.Y := MapPoint1.Point.Y;
resObj := mapSeekSelectNearestObject(mvMap.MapHandle,MapObj2.ObjHandle, @Point1, @Point2,0,0);

Point1, понятно текущие координаты указателя мыши.

Я правильно понимаю, что Point2, это координаты ближайшей, к текущим координатам указателя мыши, точки любого объекта?

Вопрос:

Как присвоить указателю мыши при клике мышью на карте во время нанесения объекта координаты?

Указатель мыши.Координаты := Point2;
 
Изменено: Сергей Викторович - 25.09.2020 12:59:26
 
Цитата
Сергей Викторович написал:
Я правильно понимаю, что Point2, это координаты ближайшей, к текущим координатам указателя мыши, точки любого объекта?  

Цитата

// Поиск ближайшего объекта по заданным условиям среди всех объектов  
// hMap - идентификатор открытой карты,
// info - идентификатор существующего объекта, в котором будет размещен результат поиска;
// pointin - координаты точки, относительно которой выполняется поиск;
// pointout - координаты ближайшей виртуальной точки на контуре объекта в метрах документа;
// select   - условия поиска объекта;
// flag     - дополнительные условия поиска объектов: WO_CANCEL, WO_INMAP, WO_VISUAL; флажки типа WO_FIRST, WO_NEXT не учитываются.
// Если flag равен 0, выполняется поиск по всем картам среди всех объектов          
// Если объект не найден - возвращает ноль

_MAPIMP long int _MAPAPI mapSeekSelectNearestObject(HMAP hMap,HOBJ info,
                                                   DOUBLEPOINT * pointin,
                                                   DOUBLEPOINT * pointout,
                                                   HSELECT select,
                                                   long int flag = WO_INMAP|WO_VISUAL);

Соответственно, если функция возвращает ненулевой результат, то в info будет заполнен найденный объект, а в pointout будут координаты виртуальной точки на контуре объекта.
Виртуальная точка - это не точка метрики объекта, это точка на контуре, ближайшая к заданной.
 
Понятно.
Как затем определить координаты ближайшей физической точки к этой виртуальной точки контура этого объекта?
 
Цитата
Сергей Викторович написал:
Как затем определить координаты ближайшей физической точки к этой виртуальной точки контура этого объекта?

Взять полученный объект и найти уже на нем ближайшую точку к заданной (Point1):

Цитата
 // Найти точку метрики подобъекта, ближайшую к заданной
 // info    - идентификатор объекта в памяти
 // point   - координаты точки в прямоугольной
 //           системе координат , в метрах на местности
 // subject - последовательный номер подобъекта
 //           (0 - объект, 1 - первый подобъект и т.д.,
 //           если равен -1  - поиск по всей метрике)
 // Возвращает номер точки (номер первой точки равен 1)
 // При ошибке возвращает 0
 // Для определения номера найденного подобъекта при поиске
 // по всей метрике применяется mapGetCurrentSubject()

_MAPIMP long int _MAPAPI mapSeekNearPoint(HOBJ info,
                                         DOUBLEPOINT *point,
                                         long int subject);


Затем запросить координаты точки по полученному номеру.
 
Сделал так:
Var
Point1                   : TDoublePoint;
Point2                   : TDoublePoint;
Point3                   : TDoublePoint;


procedure Tform_main.mvMapMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
Var
NumPoint : integer;
begin
form_main.mvMap.SetFocus;

If (MouseX = X) and ( MouseY = Y)
then exit;

MapPoint1.PlaceInp := PP_PICTURE;
MapPoint1.SetPoint(X + mvMap.MapLeft, Y + mvMap.MapTop);

If EditMode = true then
begin
Point1.X := MapPoint1.Point.X;
Point1.Y := MapPoint1.Point.Y;
mapSeekSelectNearestObject(mvMap.MapHandle,MapObj2.ObjHandle, @Point1, @Point2,0,0);
MapObj2.Style := OS_SELECT;
MapObj2.Repaint;
form_main.Repaint;
NumPoint := mapSeekNearPoint(MapObj2.ObjHandle,Point2,0);
mapGetPlanePoint(mvMap.MapHandle, @Point3, NumPoint, 0);
sbStatus2.Panels.Items[3].Text := 'NumPoint = '+IntToStr(NumPoint); // Здесь номер точки возвращается хорошо и правильно
sbStatus2.Panels.Items[4].Text := 'X = '+FloatToStr(Point3.X)+'    Y = '+FloatToStr(Point3.Y); // Здесь координаты возвращаются X = 0   Y = 0
end;

Пробовал:
mapGetMapPlanePoint(mvMap.MapHandle, @Point3, NumPoint, 0); // Результат тоже X = 0   Y = 0

Что-то я не так делаю?
Изменено: Сергей Викторович - 25.09.2020 14:37:34
 
Цитата
Сергей Викторович написал:
mapGetPlanePoint(mvMap.MapHandle, @Point3, NumPoint, 0);

Внимание на первый параметр.

Цитата
// Запросить координаты точки в системе координат документа
// number - номер точки (начинается с 1)
// subject - номер подобъекта (если = 0, обрабатывается объект)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetPlanePoint(HOBJ info, DOUBLEPOINT *point,
                                         long int number, long int subject);


И в очередной раз настоятельно рекомендую проверять коды возврата от функций.
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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