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

Об оверлейных функциях

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

Например:
SelectPoint := SelectPoint+1;
points[SelectPoint].X := xx1;
points[SelectPoint].Y := yy1;
MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_MAP));
mapAppendPointPlane(ObjectSquare, points[SelectPoint].X, points[SelectPoint].Y, 0);
mapCommitObject(ObjectSquare); // Пока не сделали commit объект ObjectSquare в оверлейной функции MapCheckInside1.CheckSubjects не виден.

Формально да, так и есть.
Можно потом его удалить и сделать сортировку карты, например.
А если не нужно сохранять этот объект.
Может как-то в оперативной памяти выполнить оверлей?
 
Цитата
Сергей Викторович написал:
а другой создан пока только в оперативной памяти для выполнения оверлейной функции, он не виден пока нет commit

Из приведенного ниже кода не следует, что объект создан.
Рисование объектов по произвольной метрике - не есть создание объекта в памяти.

Оверлейные операции прекрасно работают с объектами в памяти.
Создайте в памяти объект (mapCreateObject), получите HOBJ, заполните его метрику и используйте - в том числе в оверлейных операциях.
Commit делать не обязательно.
Не забудьте освободить его после использования (mapFreeObject).

Отрисовать объект пользовательским условным видом в этом случае можно функцией mapViewMapObject.
 
Цитата
Денис Вицко написал:
Из приведенного ниже кода не следует, что объект создан.
Да, вы правильно отметили,
что если привожу код,
то приводить его нужно полностью,
не пропуская ключевые строки.

// Создание объекта ObjectSquare
hSite := mapGetSiteIdent(form_main.mvMap.MapHandle,1);
ObjectSquare := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite,KM_IDDOUBLE2, 0);
mapRegisterObject(ObjectSquare, 10000177, OL_SQUARE);
ResObject  := mapCreateSiteObject(form_main.mvMap.MapHandle, hSite);

// На событие onMouseUp заполняем метрики
SelectPoint := SelectPoint+1;
points[SelectPoint].X := xx;
points[SelectPoint].Y := yy;
 If SelectPoint = 1 then
 begin
 xx1 := xx;
 yy1 := yy;
 end;
PaintRect();
mapAppendPointPlane(ObjectSquare, points[SelectPoint].X, points[SelectPoint].Y, 0);

// Функция  PaintRect();
MapTopLeft.X:=form_main.mvMap.MapLeft;
MapTopLeft.Y:=form_main.mvMap.MapTop;
form_main.mvMap.ConvertMetric(MapTopLeft.X, MapTopLeft.Y, PP_PICTURE, PP_PLANE);
mapViewUserObject(form_main.mvMap.MapHandle,form_main.mvMap.Handle, MapTopLeft, BlueLine, Data, integer(PP_MAP));

// Завершение расчета по событию onDblMouseClick
mapAppendPointPlane(ObjectSquare, points[SelectPoint].X, points[SelectPoint].Y, 0);
mapCommitObject(ObjectSquare); // Пока не сделали commit объект ObjectSquare в оверлейной функции MapCheckInside1.CheckSubjects не виден.
SquareObjectsInZone();

// Вызов оверлейных функций SquareObjectsInZone
If form_main.MapCheckInside1.CheckSubjects = CHI_CROSS then
 begin
 SquareObject   := CalcCrossObjectSquare(form_main.mvMap.MapHandle, form_main.MapObj1.ObjHandle, form_main.MapObj2.ObjHandle);
 SquareObjects  := SquareObjects + SquareObject;
 NameObject     := form_main.MapFind2.MapObj.ObjName;
 CodeMap        := form_main.MapFind2.MapObj.ExCode;
 AppendSanitObjects();
 end;

 If (form_main.MapCheckInside1.CheckSubjects = CHI_SECONDIN) or
 (form_main.MapCheckInside1.CheckSubjects = CHI_TOUCHIN) then
 begin
 SquareObject   := form_main.MapFind2.MapObj.Square;
 SquareObjects  := SquareObjects + SquareObject;
 NameObject     := form_main.MapFind2.MapObj.ObjName;
 CodeMap        := form_main.MapFind2.MapObj.ExCode;
 AppendSanitObjects();
 end;
Цитата
Денис Вицко написал:
Создайте в памяти объект (mapCreateObject), получите HOBJ, заполните его метрику и используйте - в том числе в оверлейных операциях.
А вот это  уже не работает.

Весь выше приведенный код прекрасно работает до тех пор пока не закомментировать строку
mapCommitObject(ObjectSquare);

Я так понял из вашего ответа, что работать должно.
Прошу подсказать,
как мне поправить код,
чтобы все работало без строки
mapCommitObject(ObjectSquare);
Изменено: Сергей Викторович - 15.08.2019 11:27:40
Страницы: 1
Читают тему (гостей: 1)



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

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