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

Удаление подобъекта

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

n := MapObj1.Metric.SubObjCount;
ShowMessage ('n = '+IntToStr(n)); // Здесь все хорошо программа видит сколько подобъектов у объекта
res := mapDeleteSubject(MapObj1.ObjHandle,1);
mvMap.Repaint;
ShowMessage ('res = '+IntToStr(res)); // Здесь res > 0

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

Потому, что операция фактического удаления не была Вами выполнена.
Всё, что вы делаете с объектом в TMapObj (или через HOBJ в MAPAPI) - Вы делаете в памяти.
До вызова метода Commit об этих операциях знаете только Вы.
Commit Вы не выполнили, mvMap.Repaint перерисует Вам карту так, как она есть - без Ваших изменений с объектом.
Если есть желание отображать на карте состояние объекта, не сохраненного в карту, то это Вам придется делать самостоятельно, для этого есть соответствующие функции, которыми Вы, кстати, уже пробовали использовать (например, mapViewObject).

PS
И, кстати, не очень хорошая практика смешивать без особой необходимости применение компонент и вызовов MAPAPI.
Вы сами рано или поздно запутаетесь. Компоненты в большинстве случаев не могут узнать о изменениях, которые Вы выполняете в обход их.
Поэтому, если Вы используете компоненты, то не стоит часть методов выполнить с их помощью, а часть нет.
Удаление подобъектов с помощью компонент можно выполнить через TMapObj.Metric.Delete.
 
Да, Денис, большое спасибо.
Не хватало Commit.
Использую компонент TMapObj.
MapObj1.Metric.Delete(1,-1);
MapObj1.Commit;
mvMap.Repaint;  
MAPAPI использую, когда не хватает методов в компоненте или по другим соображениям.
Конечно, согласен, что постепенно нужно переходить по максимум на MAPAPI, но это постепенно.

Еще вопрос по подобъектам.
Программа не знает, какой по номеру подобъект нужно удалить.
Мы запускаем TMapEditMetric чтобы погулять по точкам объекта.
Шлейф точки остановился на подобъекте,
как узнать номер этого подобъекта? по номеру точки? по координате точке? с помощью какого метода?  
Изменено: Сергей Викторович - 17.08.2019 10:22:35
 
Цитата
Сергей Викторович написал:
как узнать номер этого подобъекта? по номеру точки? по координате точке? с помощью какого метода?  

Штатного такого метода в TMapEditMetric в настоящее время нет.
Возможно, Вам поможет вызов mapGetCurrentSubject сразу после выбора точки.
 
Я понимаю так:
SelectPointsFirst[1].X := xx; // Определяем где клик мыши
SelectPointsFirst[1].Y := yy;
PointFirst_1 :=  mapSeekNearPoint(form_main.MapObj1.ObjHandle,SelectPointsFirst[1],0); // Определяем номер ближайшей точки объекта MapObj1
CoordX := mapXPlane(form_main.MapObj1.ObjHandle,PointFirst_1,0);
CoordY := mapYPlane(form_main.MapObj1.ObjHandle,PointFirst_1,0); // Определяем точные координаты ближайшей точки объекта MapObj1
Далее, mapGetCurrentSubject  в параметрах которой указываем только хендл form_main.MapObj1.ObjHandle?

Вопрос:в чем это поможет понять программе, какой номер подобъекта?
Если бы в параметрах этой функции, после хендл объекта, еще были указаны координаты CoordX и CoordY
или номер точки PointFirst_1, тогда это было бы логично,
а так просто хендл? Не пойму.
Просьба еще пояснить. В чем я не прав?
 
Цитата
Сергей Викторович написал:
Вопрос:в чем это поможет понять программе, какой номер подобъекта?

Отвечу вопросом на вопрос. Вы попробовали сделать так, как Вам посоветовали?

Функция mapSeekNearPoint после выполнения поиска точки выполняет установку номера текущего подобъекта в объекте, чья точка была найдена.
Функция mapGetCurrentSubject возвращает номер текущего подобъекта.

Описание функций доступно по ссылкам, которые я привожу при упоминании имени функции MAPAPI.

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

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


 // Запросить номер текущего подобъекта (после поиска)
 // hObj - идентификатор объекта в памяти
 // При ошибке возвращает ноль, если текущим подобъектом
 // является сам объект - тоже возвращает ноль

 _MAPIMP long int _MAPAPI mapGetCurrentSubject(HOBJ hobj);
 
Цитата
Денис Вицко написал:
Функция  mapSeekNearPoint  после выполнения поиска точки выполняет установку номера текущего подобъекта в объекте, чья точка была найдена.
SelectPointsFirst[1].X := xx;
SelectPointsFirst[1].Y := yy;
PointFirst_1 :=  mapSeekNearPoint(form_main.MapObj1.ObjHandle,SelectPointsFirst[1],0);

Результат: номер точки в объекте, возможно эта точка и принадлежит подобъекту, но пока мы этого не знаем. Правильно?

номер подобъекта = mapGetCurrentSubject(form_main.MapObj1.ObjHandle);

И как мы поймем какой номер подобъекта?

Что-то я пока все же не понимаю.
Просьба подсказать, что я не понимаю?
 
В предыдущем ответе все написано, продублирую:
1. Вызываете mapSeekNearPoint в режиме поиска по все метрике объекта.
2. При успехе вызываете mapGetCurrentSubject для определения номера подобъекта.
 
Сделал так:

SelectPointsFirst[1].X := xx;

ShowMessage ('SelectPointsFirst[1].X = '+FormatFloat('0.00',SelectPointsFirst[1].X)); // Здесь координата нормальная

SelectPointsFirst[1].Y := yy;

ShowMessage ('SelectPointsFirst[1].Y = '+FormatFloat('0.00',SelectPointsFirst[1].Y)); // Здесь координата нормальная

PointFirst_1 :=  mapSeekNearPoint(form_main.MapObj1.ObjHandle,SelectPointsFirst[1],1);

ShowMessage ('PointFirst_1 = '+IntToStr(PointFirst_1)); // Здесь выдает все время одно и то же число 13 на всех подобъектах, хотя их всего три

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

// Возвращает номер точки (номер первой точки равен 1)
// При ошибке возвращает 0
// Для определения номера найденного подобъекта при поиске
// по всей метрике применяется mapGetCurrentSubject()


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


Если Вы в параметре subject указали не -1, поиск точки будет осуществлен только на том контуре (подобъекте), который Вы указываете.

Функция возвращает номер точки на том подобъекте, на котором она найдена.

Цитата
Сергей Викторович написал:
Здесь выдает все время одно и то же число 13 на всех подобъектах, хотя их всего три
Что я делаю не правильно?

Число 13 - это номер точки в подобъекте 1, так как поиск Вы выполняете только по подобъекту 1.



Для примера приведу фрагмент кода компонента TMapEditMetric, который Вы используете:
Цитата
// РЕДАКТИРОВАНИЕ ТОЧКИ МЕТРИКИ
if FEditMode = emEdit then
 begin
   FPointNumber := mapSeekNearPoint(FObjTemp, FPointXY, -1);
   if FPointNumber = 0 then exit;
   FDragPoint := true; //тащим точку
   // Определение номера подобъекта
   FSubObj  := mapGetCurrentSubject(FObjTemp);
   FObjXY.X := mapXPlane(FObjTemp, FPointNumber, FSubObj);
   FObjXY.Y := mapYPlane(FObjTemp, FPointNumber, FSubObj);
   delta.X  := FPointXY.X - FObjXY.X;
   delta.Y  := FPointXY.Y - FObjXY.Y;
   exit;
 end;
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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