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

Как отключить выбор отключенных объектов

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

На карте отключены некоторые объекты с помощью стандартного диалога Состав карты.
Но при выборе мышью в точке нажатия, все равно выбор объекта происходит.
Как отключить выбор отключенных объектов?
MapFind1.Active := false;
MapFind1.FindPoint := true;
form_main.MapFind1.MapSelect.Clear;
form_main.MapFind1.MapSelect.ClearSemantic;
form_main.MapFind1.MapSelect.                                     // Вот здесь?
form_main.MapFind1.MapObj.Style := OS_SELECT;
MapFind1.X      := mvMap.MapLeft + MouseX;
MapFind1.Y      := mvMap.MapTop + MouseY;
MapFind1.Radius := 3;
form_main.MapFind1.Active := true;
form_main.mvMap.Repaint;
 
Добрый день.
Вам необходимо установить условия поиска = условиям отображения, а далее уже запускать поиск в точке.

Код
       MapFindObject.MapSelect := mvMap.ViewSelect; // чтобы выбирались только видимые

       MapFindObject.FindPoint := true;
       MapFindObject.X         := mvMap.MapLeft + MouseUpX;
       MapFindObject.Y         := mvMap.MapTop + MouseUpY;
       MapFindObject.Radius    := iFindRadius;
       MapFindObject.Active    := true;
 
Сделал так:

MapFind1.Active := false;
MapFind1.FindPoint := true;
MapFind1.MapSelect.Clear;
MapFind1.MapSelect.ClearSemantic;
MapFind1.MapSelect := mvMap.ViewSelect; // чтобы выбирались только видимые
MapFind1.MapObj.Style := OS_SELECT;
MapFind1.X      := mvMap.MapLeft + MouseX;
MapFind1.Y      := mvMap.MapTop + MouseY;
MapFind1.Radius := 3;
MapFind1.Active := true;
mvMap.Repaint;

В результате,
объектs, которые отключены в диалоге Состав карты перестали выбираться,
что и требовалось.

Однако, сразу возник второй вопрос,
некоторые объекты отключены в результате отключения их в классификаторе объектов
по признаку Масштабного ряда, но при клике мышью по точке на карте, они продолжают выбираться.

Как теперь их отключить для выбора по клику мышью в точке на карте?
 
 
Для поиска объектов с учетом видимости Вам необходимо использовать метод
Код
 // Поиск объектов по заданным условиям среди отображаемых объектов
 // (пересечение заданных условий с условиями отображения)
 // hMap     - идентификатор открытой карты;
 // info     - идентификатор существующего объекта;
 //            в котором будет размещен результат поиска.
 // select   - условия поиска объекта
 // flag     - порядок поиска объектов (WO_FIRST; WO_NEXT...)
 // Если объект не найден - возвращает ноль

function mapSeekViewObject(Map:HMap;Obj:HObj;Select:HSelect;flag:integer= cWO_FIRST):HObj;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
  external sGisAcces;

Код
 // Флажки; определяющие ПОРЯДОК ПОИСКА ОБЪЕКТОВ
 // Первый в цепочке;последний;следующий за найденным ранее;
 // предыдущий; вместе c удаленными; только в заданной карте.
 // Если указано WO_INMAP - номер карты определяется
 // из HSELECT !
 // Поиск начинается с флажков WO_FIRST или WO_LAST (если нет
 // объекта с которого начинается поиск); затем применяются
 // флажки WO_NEXT или WO_BACK (например; в цикле).
 // enum SEEKTYPE        // ПОРЯДОК ПОИСКА ОБ'ЕКТОВ
 // {
 //    WO_FIRST  = 0,         // Первый в цепочке
 //    WO_LAST   = 2,         // Последний в цепочке
 //    WO_NEXT   = 4,         // Следующий за найденным ранее
 //    WO_BACK   = 8,         // Предыдущий от ранее найденного
 //    WO_CANCEL = 16,        // Включая удаленные объекты
 //    WO_INMAP  = 32,        // Только по одной карте (соответствующей HSELECT)
 //    WO_VISUAL = 64,        // Поиск только среди видимых объектов
 //    WO_VISUALIGNORE = 128, // Поиск среди всех объектов без учета видимости
 // };

Вам необходимо перебирать объекты с флагом WO_VISUAL.



Также можете воспользоваться методом, который используется в компоненте поиска
Код
 // Поиск объектов в окрестности точки, заданной прямоугольной рамкой,
 // удовлетворяющих условиям поиска
 // hMap - идентификатор открытой карты.
 // Obj - идентификатор объекта в памяти;
 //        предварительно созданного функцией mapCreateObject()
 //        или mapCreateSiteObject();
 //        в котором будет размещен результат поиска.
 // Поиск выполнется среди тех объектов;которые
 // соответствуют условиям HSELECT !
 // select- контекст условий выбора объектов;
 // place - система координат;
 // frame - прямоугольная область поиска объекта в системе координат;
 //         заданной переменной place (PP_PLANE;PP_GEO; ...)
 // flag  - порядок поиска объектов (WO_FIRST; WO_NEXT...)
 // Выбор объекта в "точке" лучше начинать с последнего; то
 // есть того; что нарисован поверх остальных (это чуть медленнее
 // прямого поиска).
 // При поиске с флажками WO_NEXT;WO_BACK параметр info должен
 // содержать результат предыдущего поиска.
 // Если объект не найден - возвращает ноль;
 // иначе - возвращает значение info !


function mapWhatObjectBySelect(Map:HMap;Obj:HObj;
                               var frame:TMAPDFRAME;
                               select :HSELECT; flag:integer;
                               place:integer):HObj;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
  external sGisAcces;
 
Роман, добрый день.

Сделал вот так:

MapFind1.Active := false;
MapFind1.FindPoint := true;
form_main.MapFind1.MapSelect.Clear;
form_main.MapFind1.MapSelect.ClearSemantic;
form_main.MapFind1.MapSelect := mvMap.ViewSelect; // чтобы выбирались только видимые
mapSeekViewObject(form_main.mvMap.MapHandle,form_main.MapFind1.MapObj.ObjHandle,form_main.mvMap.ViewSelect.SelectHandle[1],64); // Здесь ожидаю, что не будут выбираться те объекты, которые в данном масштабе не включены
form_main.MapFind1.MapObj.Style := OS_SELECT;
MapFind1.X      := mvMap.MapLeft + MouseX;
MapFind1.Y      := mvMap.MapTop + MouseY;
MapFind1.Radius := 3;
form_main.MapFind1.Active := true;
form_main.mvMap.Repaint;

Но, объекты, которые в данном масштабе не включены,
все равно выбираются при клике по карте мышью(.

Что я делаю не  правильно?  
 
Сергей Викторович, добрый день.

mapSeekViewObject возвращает объект (HOBJ), который удовлетворяет параметрам поиска.

Необходимо перебирать объекты данной функцией.
 
Цитата
Роман Твердов написал:
Сергей Викторович, добрый день.

mapSeekViewObject возвращает объект (HOBJ), который удовлетворяет параметрам поиска.

Необходимо перебирать объекты данной функцией.
Пытаюсь так перебрать.
Не получается.

form_main.MapFind1.MapObj.Style := OS_SELECT;
MapFind1.X      := mvMap.MapLeft + MouseX;
MapFind1.Y      := mvMap.MapTop + MouseY;
MapFind1.Radius := 3;
form_main.MapFind1.Active := true;
form_main.mvMap.Repaint;
form_main.MapFind2.Active := false;
form_main.MapFind2.FindPoint := false;
form_main.MapFind2.MapSelect.Clear;
form_main.MapFind2.Active := true;
form_main.MapFind2.First;

 While not form_main.MapFind2.Eof do
 begin
  If mapSeekViewObject(form_main.mvMap.MapHandle,form_main.MapFind1.MapObj.ObjHandle,form_main.mvMap.ViewSelect.SelectHandle[0],64) = 0 then
  ShowMessage ('объект не может быть выбран');
  form_main.MapFind2.Next;
end;

Как правильно перебрать объекты и проверить их на соответствие условию по масштабу?
Изменено: Сергей Викторович - 29.04.2019 11:50:28
 
Думаю, идея будет понятна. Примерно так
Код
var 
NewObj : HOBJ;

...
// перебор в цикле 
  NewObj := mapSeekViewObject(form_main.mvMap.MapHandle,form_main.MapObj1.ObjHandle, form_main.mvMap.ViewSelect.SelectHandle[0],WO_VISUAL + WO_NEXT);
  if NewObj = 0 
    then begin
      showmessage('Больше нет объектов, удовлетворяющих условия');
      break;
    end  
    else begin
      showmessage('Найден объект!');
      Return NewObj;
    end;
// перебор в цикле     
...
 
Цитата
Роман Твердов написал:
Думаю, идея будет понятна. Примерно так
Код
 var 
NewObj : HOBJ;

...
// перебор в цикле 
  NewObj := mapSeekViewObject(form_main.mvMap.MapHandle,form_main.MapObj1.ObjHandle, form_main.mvMap.ViewSelect.SelectHandle[0],WO_VISUAL + WO_NEXT);
  if NewObj = 0 
    then begin
      showmessage('Больше нет объектов, удовлетворяющих условия');
      break;
    end  
    else begin
      showmessage('Найден объект!');
      Return NewObj;
    end;
// перебор в цикле     
...
 
Сделал так:

form_main.MapFind2.Active := false;
form_main.MapFind2.FindPoint := false;
form_main.MapFind2.MapSelect.Clear;
form_main.MapFind2.Active := true;
form_main.MapFind2.First;

 While not form_main.MapFind2.Eof do
 begin
 NewObj := mapSeekViewObject(form_main.mvMap.MapHandle,form_main.MapObj1.ObjHandle, form_main.mvMap.ViewSelect.SelectHandle[0],64); // У меня DelphiXE5 только параметр 64, иначе пишет несовместимость типов, E2002 Incompatible types,  но не суть думаю, все равно правильно?
  If NewObj = 0
  then begin
  showmessage('Больше нет объектов, удовлетворяющих условия');
  break;
  end
  else begin
  showmessage('Найден объект!');
  // Return NewObj;
  end;
  form_main.MapFind2.Next;

А вот с циклом, с другим TMapFind -ом, например.
Такой цикл, см.выше, правильно будет?

У меня это почему-то не работает.
NewObj всегда положительное число, даже если на карте у объекта отключена видимость по масштабу.
Предыдущее мое сообщение, практически точная копия того, что вы написали.
Но у меня это не работает.
Похоже я все-таки чего-то не понимаю?
Может цикл не так нужно построить?
Изменено: Сергей Викторович - 06.05.2019 09:15:37
 
Сергей Викторович, в продолжение телефонного разговора.

place:
Код
  // ПРИМЕНЯЕМАЯ СИСТЕМА КООРДИНАТ при обращении к функциям MapApi

  cPP_MAP     = 1;   // КООРДИНАТЫ ТОЧЕК В СИСТЕМЕ КАРТЫ В ДИСКРЕТАХ
  cPP_PICTURE = 2;   // КООРДИНАТЫ ТОЧЕК В СИСТЕМЕ ИЗОБРАЖЕНИЯ В ПИКСЕЛАХ
  cPP_PLANE   = 3;   // КООРДИНАТЫ ТОЧЕК В ПЛОСКОЙ ПРЯМОУГОЛЬНОЙ СИСТЕМЕ
                     // НА МЕСТНОСТИ В МЕТРАХ
  cPP_GEO     = 4;   // КООРДИНАТЫ ТОЧЕК В ГЕОДЕЗИЧЕСКИХ КООРДИНАТАХ
  cPP_GEOWGS84 = 8;    // КООРДИНАТЫ ТОЧЕК В ГЕОДЕЗИЧЕСКИХ КООРДИНАТАХ
                       // В РАДИАНАХ В СИСТЕМЕ WGS-84

Пример получения получения области
Код
var
 FFrame:TMAPDFRAME;
.....
      FFrame.X1:=FMapPoint.FX-FRadius;
      FFrame.X2:=FMapPoint.FX+FRadius;
      FFrame.Y1:=FMapPoint.FY-FRadius;
      FFrame.Y2:=FMapPoint.FY+FRadius;
Изменено: Роман Твердов - 06.05.2019 09:49:10
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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