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

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

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

Var
pX,pY : double;
begin
pX := MapPoint1.Point.X;
pY := MapPoint1.Point.Y;

hselN := mapCreateMapSelectContext(mvMap.MapHandle);  // Создание нового контекста поиска
mapClearSelectContext(hselN);
// Установка доступа к объектам заданных слоев
mapSelectLayer(hselN,-1,0); // Обнуление списка слоев
mapSelectLayer(hselN,3,1); // Дорожное хозяйство
mapSelectLayer(hselN,4,1); // ОКСы
mapSelectLayer(hselN,5,1); // Гидрография
mapSelectLayer(hselN,6,1); // Санитарная уборка
mapSelectLayer(hselN,7,1);   // Растительность
mapSelectLayer(hselN,8,1);   // Площадки
mapSelectLayer(hselN,9,1);  // Земельные участки
mapSelectLayer(hselN,13,1); // Санитарная очистка
// Установка доступа к объектам заданных локализаций
mapSelectLocal(hselN,-1,0);  // Обнуление списка локализаций
mapSelectLocal(hselN,1,1);   // Поиск площадных объектов

dfrm.X1 := pX-3;
dfrm.Y1 := pY-3;
dfrm.X2 := pX+3;
dfrm.Y2 := pY+3;

hobjinf := mapCreateObject(mvMap.MapHandle);
hobjprm := mapWhatObjectBySelect(mvMap.MapHandle,hObjInf, dfrm, hselN,0,3);

hobjprm возвращает положительное число,
но сам объект на карте не выбирается.
Какую функцию можно применить, чтобы объект выбирался на карте?
 

Можете для отображения информации об объекте использовать следующую функцию

Код
 // Вызов диалога выбора только для заданного через переменную
 // object объекта
 // Окно отображения объекта не может при входе содержать общие
 // сведения и семантику объекта
 // Если объект выбран - возвращается ненулевое значение
 // Если объект не выбран (нет в данной точке или пользователь
 // нажал "Cancel") - возвращается ноль

 function formSelectAssignObject(Obj : HObj;  var ObjForm : TOBJECTFORM;
   var Parm : TTASKPARM) : integer;
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
 external sGisForms;
 
Отображать информацию об объекте не нужно.
Нужно чтобы выбранный объект был обведен по контуру красной линией.
 
Отрисовать объект можно следующей функцией
Код
 // Отобразить существующий объект карты в пределах фрагмента окна (карты)     // 26/03/09
 // в условных знаках пользователя
 // hmap   - идентификатор открытых данных
 // hwnd  - идентификатор окна;
 // point - координаты верхнего левого угла окна на карте
 // в соответствующей параметру place системе координат
 // image - описание вида объекта (см. MAPGDI.H); если объект
 // должен рисоваться своим условным знаком - значение параметра
 // можно установить в ноль;
 // info - идентификатор объекта карты в памяти
 // При ошибке в параметрах возвращает ноль

function mapViewMapObject(Map:HMap;WND:HWND;var point:TDOUBLEPOINT;
                          var image:TPAINTPARM;Obj:HObj;place:integer=cPP_MAP):integer; // 23/09/2009 // 30/09/2009
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
  external sGisAcces;

Думаю, что проще будет "кинуть" на форму TMapObj и в него записывать результат поиска, а уже для самого компонента установить тот тип выделения, который Вам больше подходит. Посмотрите пример из GTK - MapWork
 
Сделал так:

procedure TForm1.mvMapDblClick(Sender: TObject);
begin
FRadius := 1;
pX := MapPoint1.Point.X;
pY := MapPoint1.Point.Y;

hselN := mapCreateMapSelectContext(mvMap.MapHandle);  // Создание нового контекста поиска
mapClearSelectContext(hselN);
// Установка доступа к объектам заданных слоев
mapSelectLayer(hselN,-1,0); // Обнуление списка слоев
mapSelectLayer(hselN,3,1); // Дорожное хозяйство
mapSelectLayer(hselN,4,1); // ОКСы
mapSelectLayer(hselN,5,1); // Гидрография
mapSelectLayer(hselN,6,1); // Санитарная уборка
mapSelectLayer(hselN,7,1);   // Растительность
mapSelectLayer(hselN,8,1);   // Площадки
mapSelectLayer(hselN,9,1);  // Земельные участки
mapSelectLayer(hselN,13,1); // Санитарная очистка

// Установка доступа к объектам заданных локализаций
mapSelectLocal(hselN,-1,0);  // Обнуление списка локализаций
mapSelectLocal(hselN,1,1);   // Поиск площадных объектов

FFrame.X1:=MapPoint1.Point.FX-FRadius;
FFrame.X2:=MapPoint1.Point.FX+FRadius;
FFrame.Y1:=MapPoint1.Point.FY-FRadius;
FFrame.Y2:=MapPoint1.Point.FY+FRadius;

hobjinf := mapCreateObject(mvMap.MapHandle);

MapObj1.ObjHandle := mapWhatObjectBySelect(mvMap.MapHandle,hobjinf, FFrame, hselN,0,3);
ShowMessage ('MapObj1.ObjHandle = '+IntToStr(MapObj1.ObjHandle));
end;

В результате, на карте выбирается объект, обведенный красной линией,
но только один раз(
При повторном выполнении, выбирается все тот же объект на карте с тем же MapObj1.ObjHandle.
Нужно, чтобы при повторном нажатии мышью в другом месте карты, выбирался соответственно другой объект.

Как сделать Next?
MapObj1.ObjHandle := mapWhatObjectBySelect(mvMap.MapHandle,hobjinf, FFrame, hselN,4,3);
 
да, для перехода к следующему объекту необходимо параметр flag функции mapWhatObjectBySelect установить  = 4
 
Роман, тут еще такой вопрос.

Если мы создаем объект в оперативной памяти

hobjinf := mapCreateObject(mvMap.MapHandle);

не нужно ли его потом освободить?

Если да, то как это сделать?
понятно, что так:
hobjinf.Free; не пройдет.
Как его освободить и надо ли?
 
Код
  // Удалить описание объекта векторной карты из памяти
  // info - идентификатор объекта карты в памяти
  // Для сохранения объекта на карте необходимо
  // до вызова mapFreeObject(...) выполнить функцию
  // mapCommitObject(...)
  // При ошибке возвращает ноль

procedure mapFreeObject(Obj : HObj);
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}
external sGisAcces;
 
Выбор работает.

Глобальные переменные:
Var
MouseX : integer;
MouseY : integer;
hobjinf : HOBJ;
FFrame:TMAPDFRAME;
hselN : HSELECT;
FRadius : integer;

procedure TForm1.mvMapDblClick(Sender: TObject);
begin
FRadius := 1;

MapPoint1.PlaceInp := PP_PICTURE;
MapPoint1.SetPoint(MouseX+mvMap.MapLeft, MouseY+mvMap.MapTop);;

hselN := mapCreateMapSelectContext(mvMap.MapHandle);  // Создание нового контекста поиска
mapClearSelectContext(hselN);
// Установка доступа к объектам заданных слоев
mapSelectLayer(hselN,-1,0); // Обнуление списка слоев
mapSelectLayer(hselN,3,1); // Дорожное хозяйство
mapSelectLayer(hselN,4,1); // ОКСы
mapSelectLayer(hselN,5,1); // Гидрография
mapSelectLayer(hselN,6,1); // Санитарная уборка
mapSelectLayer(hselN,7,1);   // Растительность
mapSelectLayer(hselN,8,1);   // Площадки
mapSelectLayer(hselN,9,1);  // Земельные участки
mapSelectLayer(hselN,13,1); // Санитарная очистка

// Установка доступа к объектам заданных локализаций
mapSelectLocal(hselN,-1,0);  // Обнуление списка локализаций
mapSelectLocal(hselN,1,1);   // Поиск площадных объектов

MapPoint1.PlaceInp := PP_PLANE;
FFrame.X1:=MapPoint1.Point.X+FRadius;
FFrame.Y1:=MapPoint1.Point.Y+FRadius;
FFrame.X2:=MapPoint1.Point.X-FRadius;
FFrame.Y2:=MapPoint1.Point.Y-FRadius;
hobjinf := mapCreateObject(mvMap.MapHandle);
MapObj1.ObjHandle := mapWhatObjectBySelect(mvMap.MapHandle,hobjinf, FFrame, hselN,0,3);
mapFreeObject(hobjinf);
mvMap.Repaint;
end;


Как сделать Next?

procedure TForm1.N3Click(Sender: TObject);
begin
hobjinf := mapCreateObject(mvMap.MapHandle);
MapObj1.ObjHandle := mapWhatObjectBySelect(mvMap.MapHandle,hobjinf, FFrame, hselN,4,3);
// mapFreeObject(hobjinf);
mvMap.Repaint;
end;

Так не работает.
Что я не правильно делаю?
Изменено: Сергей Викторович - 07.05.2019 15:18:23
 
Пришлите, пожалуйста, пример и карту.
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)



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

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