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

Удаление и перемещение группы объектов как одного объекта

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

Подскажите пожалуйста как мне реализовать перемещение и удаление группы объектов как одного объекта.
т.е. я к примеру выделяю группу объектов по области и нажимаю на кнопку удалить, далее прохожу циклом по выделенным
объектам и выполняю удаление. Но в момент выполнения объекты удаляются по одному (такое создается ощущение что программа начинает подвисать),
а хотелось бы разом как один объект.
Может быть есть возможность удаления и перемещения группы объектов как массива???
 
Обработка группы объектов - это в любом случае цикл, не зависимо от того, реализован ли он будет внутри одной функции ГИС-ядра или в неком методе GIS ToolKit, либо Вы выполните циклическую обработку сами.

"Подтормаживание" при групповых операциях можно минимизировать следующими методами.

1. Не выполнять перерисовку карты на каждую итерацию обработки очередного объекта. Для этого перед групповой операцией выключить свойство Rendering компонента MapView, по окончании групповой операции - включить.
2. Выполнять группу операций в рамках одной транзакции карты. По умолчанию, если программист не открыл свою транзакцию, то каждая операция в журнал транзакций заносится отдельной транзакцией (транзакция неявно открывается и закрывается на каждую операцию). Рекомендуется перед групповой операцией открыть свою транзакцию, а по окончании перед групповой операции закрыть ее. Либо, если не требуется ведение истории операций и возможности отката, можно и вовсе отключить ведение журнала транзакций (без него все операции выполняются ощутимо быстрее).
3. Если с конкретной картой работает на редактирование только один экземпляр Вашего приложения, имеет смысл открывать данные в монопольном доступе. Это ускоряет все операции, не только групповые.

Описание функций доступа к журналу транзакций

axcMapView.Rendering

Установить монопольный доступ ко всем открываемым векторным картам - mapSetExclusiveAccess
 
Цитата
Денис Вицко написал:
Установить монопольный доступ ко всем открываемым векторным картам - mapSetExclusiveAccess
Я реализовал выполнение операций с группой объектов в одной транзакции, а также включение и отключение Rendering'а.
Мне это сильно помогло)) Спасибо!!

А вот по монопольному доступу есть один вопрос, в справочнике написано:

// Установить монопольный доступ ко всем открываемым векторным картам

// Ускоряет все операции редактирования карт за счет буферизации

// операций записи на диск при значении access не равном 0

// При монопольном доступе другие приложения не смогут

// редактировать карту

// Если какая-либо карта не может быть открыта в монопольном

// доступе - признак автоматически сбрасывается

// Возвращает новое значение признака монопольного доступа

_MAPIMP long int _MAPAPI mapSetExclusiveAccess(long int access);

Вопрос: // При монопольном доступе другие приложения не смогут редактировать карту т.е. если откроют эту же карту в ГИС "Панораме", то не смогут ее редактировать,
а если в моем приложении, тогда смогут - ПРАВИЛЬНО Я ПОНЯЛ??
Изменено: Александр Махин - 21.04.2020 11:14:44
 
Цитата
Александр Махин написал:
т.е. если откроют эту же карту в ГИС "Панораме", то не смогут ее редактировать,а если в моем приложении, тогда смогут - ПРАВИЛЬНО Я ПОНЯЛ??

Нет. Речь идет про обычный доступ на уровне операционной системы к файлу на диске.
Файл можно открыть в приложении на запись и чтение либо только на чтение, при этом то приложение, которое первое открыло файл, может определить как его будут открывать другие приложения.
Если приложение забирает себе файл в монопольный доступ, остальные в это время смогут открыть этот файл только на чтение.
Когда приложение закроет файл, который был у него в монопольном доступе, остальные программы смогут открыть этот файл как обычно.
За счет того, что операционной системе не надо следить за разделением ресурсов для файлов открытых в монопольном доступе, все операции с этими файлами выполняются быстрее.

То есть тут скорее вопрос, кто первый.
Если карта уже будет открыта в ГИС "Панорама", Ваше приложение не сможет открыть ее в монопольном доступе и откроет как обычно.
Но если Ваше приложение откроет карту первым, то пока оно ее не закроет, все остальные приложения, включая ГИС "Панорама", смогут открыть ее только на чтение.
 
Здравствуйте. Подскажите, есть ли механизм выделения (удаления) точечных объектов, пересекающихся с подписями.
 
Цитата
Александр Кононыхин написал:
Здравствуйте. Подскажите, есть ли механизм выделения (удаления) точечных объектов, пересекающихся с подписями.

Именно такого механизма нет.
Есть поиск объектов по определенным условиям, в т.ч. по пространственным.

Уточните для начала, что Вы понимаете под пересечением подписей точечными объектами?

Подписи, как правило, это линейные объекты - имеют две точки на контур. Могут иметь несколько контуров. Текст может располагаться по линии, выше или ниже неё, растягиваться или сжиматься по метрике контура либо наносится определенным шрифтом без масштабирования, выравнивание может быть слева/справа/по центру и т.д.
Точечный объект имеет одну точку метрики. На местности его габариты нулевые - это точка.

Если пересечение Вас интересует на уровне метрики - тут все просто: необходимо определить точечные объекты, точка которых принадлежит отрезкам линии (по метрике подписи) - цикл в цикле.
Если Вам надо определить программно визуальное пересечение условного знака точечного объекта с текстом подписи, то тут немного сложнее.
Придется определять пересечение габаритов условного знака точечного объекта с габаритами подписи - на каждом масштабе отображения это будет по-разному, влияют параметры условного знака, параметры шрифта и выравнивания подписи, параметры экрана.
 
Визуальные габариты можно определить функцией
// Определяет габариты объектов (точечных, векторных и подписей) с учетом текущих
// условий отображения (см. функции mapGetRealShowScale/mapSetRealShowScale и
// mapGetScaleMethod/mapSetScaleMethod)
// Для каждого подобъекта подписи создается прямоугольный подобъект,
// ограничивающий текст подписи
// info    - исходный объект
// contour - объект, в который заносятся габариты исходного объекта
// hPaint  - идентификатор контекста отображения для многопоточного вызова функции
//           отображения (может быть ноль)
// При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapGetObjectContour(HOBJ info, HOBJ contour, HPAINT hPaint);
 
Понимается второй вариант, когда нужно удалить точечные объекты, которые перекрываются подписями в определенном масштабе. Если подписи просто перекодировать в площадные объекты, то каким инструментом и как задать условия для выделения точечных данными площадными.
 
Алгоритм может быть следующим:
1. Делаете цикл (поиск) по подписям
2. Для каждой подписи определяете функцией выше габариты.
3. Найденные габариты устанавливаете в контекст поиска (HSELECT).
4. Далее осуществляете поиск с использованием настроенного HSELECT. Среди найденных объектов определяете точечный и удаляете.
 
Цитата
Александр Кононыхин написал:
Если подписи просто перекодировать в площадные объекты, то каким инструментом и как задать условия для выделения точечных данными площадными.

Цитата
Andrey Gheleznyakov написал:
Алгоритм может быть следующим:
1. Делаете цикл (поиск) по подписям
2. Для каждой подписи определяете функцией выше габариты.
3. Найденные габариты устанавливаете в контекст поиска (HSELECT).
4. Далее осуществляете поиск с использованием настроенного HSELECT. Среди найденных объектов определяете точечный и удаляете.


Функции поиска и отбора объектов электронной векторной карты

Цитата

 // Установить в контексте параметры поиска объектов по области.
 // hselect - контекст поиска об'ектов
 // object - объект-область поиска
 // distance - расстояние поиска в метрах
 // флажки,описывающие критерии поиска :
 // filter  - учитывать/не учитывать(1/0) фильтр объектов
 //           (параметры фильтра должны быть установлены заранее
 //           в контексте поиска)
 // inside  - границы поиска объектов по области :
 //           0 - внутри области по расстоянию от заданного объекта,
 //           1 - внутри области от заданного объекта, включая пересечение границы,
 //               если задано расстояние, то с учетом расстояния,
 //           2 - целиком внутри области без касания или пересечения границы,
 //           4 - целиком снаружи области без касания или пересечения границы,
 // visible - с учетом/без учета(1/0) видимости объектов на карте
 // action   - порядок поиска объектов :
 //            0 - последовательный поиск по мере запроса объектов,
 //            1 - предварительный отбор всех объектов (главному
 //            окну приложения посылается WM_PROGRESSBAR - maptype.h),
 //            ускоряет многократный запрос отобранных объектов;
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSelectSeekArea(HSELECT hselect, HOBJ object,
                                    double distance = 0.0,
                                    long int filter = 0,
                                    long int inside = 1,
                                    long int visible = 0,
                                    long int action = 0);

Это поиск объектов, метрика которых попадает внутрь заданного площадного объекта.
То есть точечные объекты будут анализироваться по своей метрике, а не по габаритам.
При этом если указать distance равным половине габаритов условного знака точечного объекта, то в результат поиска должны попасть все ваши точные объекты, условный знак которых хоть немного попадает в площадь подписи
(при условии, что привязка точечного условного знака выполнена по центру; как получить габариты условного знака - см. выше)
Страницы: 1
Читают тему (гостей: 1)



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

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