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

Отобразить произвольный объект

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Отобразить произвольный объект, mapViewUserObject
 
Хорошая и удобная функция:

// Отобразить произвольный объект в пределах фрагмента окна (карты)
// hmap   - идентификатор открытых данных
// hwnd  - идентификатор окна;
// point - координаты верхнего левого угла окна на карте
// в соответсвующей параметру place системе координат
// image - описание вида объекта (см. MAPGDI.H);
// data  - координаты объекта.
// Координаты объекта заданы в соответствии с параметром place

function  mapViewUserObject(Map : HMap;Wnd : HWnd; var Point : TDoublePoint;
                                   var image : TPAINTPARM; var data : TPLACEDATA;
                                   place : integer=cPP_MAP) : integer; // 30/09/2009
{$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}
external sGisAcces;

Просьба подсказать,
вот нанесли мы линии произвольного объекта,
как теперь одной командой убрать их
и освободить все, что касается этой функцией из памяти компьютера?
 
Чтобы "убрать" объект в этом случае достаточно просто перерисовать карту.

Всё, что Вы выделяли для вызова этой функции, освободить придется самостоятельно (TDoublePoint, TPAINTPARM, TPLACEDATA).
 
Цитата
Денис Вицко написал:
Чтобы "убрать" объект в этом случае достаточно просто перерисовать карту.
Да, при перерисовки карты убирается то, что нарисовано.
Цитата
Денис Вицко написал:
Всё, что Вы выделяли для вызова этой функции, освободить придется самостоятельно (TDoublePoint, TPAINTPARM, TPLACEDATA).
Здесь не понятно.
Это было объявлено:

points : array [1..255] of TDOUBLEPOINT;

Data.Points:=@points;
Data.PolyCounts:=@SelectPoints;
Data.Count:=1;
Data.PolyText:=0;


BlueLine.Image := Maptype.IMG_LINE;
BlueLine.Parm  := @ImageLine;
BlueLine.Mode  := R2_COPYPEN;  // R2_XORPEN;

Это было нарисовано:

procedure PaintRect;
begin
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));
end;

При повторном вызове procedure PaintRect,
то что нарисовано повторяется.

Единственно, что может помочь,
очистить массив координат точек

for i := 1 to 255 do
begin
points[i].X := 0;
points[i].Y := 0;
end;

Но при такой "очистке" координаты со значение 0,
тянутся похоже к нулевой точки системе координат.

Как правильно очистить массив координат?
Изменено: Сергей Викторович - 14.08.2019 17:38:47
 
Цитата
Сергей Викторович написал:
Но при такой "очистке" координаты со значение 0,тянутся похоже к нулевой точки системе координат.

Потому что координаты x = 0, y = 0 имеют право на существование.


Цитата
Сергей Викторович написал:
При повторном вызове procedure PaintRect, то что нарисовано повторяется.

Логику работы Вашей программы определяете Вы.
Надо рисовать - вызываете функцию отрисовки объекта, не надо - не вызываете.
Можно, конечно, "испортить" вызов, чтобы функция отработала с ошибкой и ничего не нарисовала. Но зачем?
Если очень необходимо, чтобы программа работала по такой странной логике, установите количество точек метрики в ноль.
Но это какое-то странное программирование.

Освобождать надо память, которую выделяли в куче (new, GetMem, memalloc...), тогда, когда она больше не нужна.
Статически объявленные переменные выделяются в стеке. Их освободит компилятор при выходе за пределы их видимости.
 
Цитата
Денис Вицко написал:
Потому что координаты x = 0, y = 0 имеют право на существование
Это согласен.
Цитата
Денис Вицко написал:
Надо рисовать - вызываете функцию отрисовки объекта, не надо - не вызываете.
Вот здесь проблема в том, что если нужно рисовать,
опять вызываем туже функцию отрисовки,
procedure PaintRect;
begin
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));
end;
а поскольку все параметры в ней уже заполнены в памяти компьютера,
то на карте опять тот же многоугольник, который был до этого.
Можно ли обнулить Data?
Цитата
Денис Вицко написал:
Можно, конечно, "испортить" вызов, чтобы функция отработала с ошибкой и ничего не нарисовала. Но зачем?
Это не вариант, я хочу понять как сделать правильно.
Цитата
Денис Вицко написал:
Если очень необходимо, чтобы программа работала по такой странной логике, установите количество точек метрики в ноль.
Подумал об этом, но не понятно.
Максимально возможное количество метрик в объекте
я сразу установил при объявлении
points                   : array [1..255] of TDOUBLEPOINT;
и как тут что-то менять не понятно и нужно ли?
Здесь нужен другой механизм,
обнуляющий ранее нарисованный на карте объект?
Изменено: Сергей Викторович - 15.08.2019 14:47:07
 
Цитата
Сергей Викторович написал:
Здесь нужен другой механизм,обнуляющий ранее нарисованный на карте объект?

Что такое "обнуляющий" с точки зрения функции отрисовки?
Ей отдают метрику и говорят как рисовать - она рисует.

Остальное - дело запрограммированной логики с Вашей стороны.
Цитата
Сергей Викторович написал:
Вот здесь проблема в том, что если нужно рисовать,опять вызываем туже функцию отрисовки,
Ну так Вы же управляете режимами работы своей программы.
Определитесь, в каких случаях надо рисовать и с какими данными.
Пример.
Рисуем метрику по кликам пользователя на карте.
1. Вошли в режим, кликов не было - не рисуем.
2. Первый клик - добавили первую точку, можно начинать рисовать метрику от первой точки к текущему положению курсора (то есть точек минимум две). И так далее для остальных точек.
3. Вышли из режима - не рисуем.
4. Надо снова рисовать - переход к п.1.


Массив координат вполне можно выделить сразу на 255 точек, но функция рисует только ту метрику, которая заполнена в начале этого массива и ограничена параметром PolyCounts.
PolyCounts - это массив с количеством точек метрики по каждому контуру отрисовываемого объекта.
Размерность массива PolyCounts = количеству контуров.
 
Разобрался.
Да, действительно достаточно
SelectPoint := 0;
т.е. номер первой точки изменить на 0 при попытке начать рисовать новый многоугольник.
Тогда программа начнет рисовать новый многоугольник уже по новому набору номеров точек.
Если не сделать SelectPoint := 0;, то программа начинает добавлять к последнему значению
SelectPoint := новое значение плюс 1  
и процесс рисования нового многоугольника продолжается продолжением предыдущего.
Спасибо.
Изменено: Сергей Викторович - 20.08.2019 11:53:56
Страницы: 1
Читают тему (гостей: 1)



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

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