Используем "ГИС Конструктор FREE для Qt Designer x64 (версия 12.3.2, Qt4, Qt5, ОС Astra Linux SE, релиз Смоленск)" Работаем под Astra Linux SE 1.6, Qt 5.11.
В процессе работы столкнулись со следующей проблеммой. Пытаемся выделить объекты на карте, с помощью компонента QDMapSelectRect.
Код
void MapWindow::slotRectSelectFinish(double left, double top, double right, double bottom)
{
HMAP Map = ui->MapWidget->GetMapHandle(); // Получаем "Карту"
HSITE Site = /**/ // Получаем используемый сит
qint32 SiteNumber = mapGetSiteNumber(Map, Site); // Получаем № сита
// Пересчитываем пиксели в координаты
mapPictureToPlane(Map, &left, &top);
mapPictureToPlane(Map, &right, &bottom);
QDMapObj FrameObject; // Инициализируем новый объект карты
FrameObject.SetMapView(ui->MapWidget); // "Привязываем" его к компоненту отображения
FrameObject.CreateNullObj(SiteNumber); // Создаём пустой объект на нашем сите
// Задаём метрику объекта (Рамки)
DOUBLEPOINT FramePoint = {left, top};
FrameObject.AppendPlanePoint(0, &FramePoint);
FramePoint = {left, bottom};
FrameObject.AppendPlanePoint(0, &FramePoint);
FramePoint = {right, bottom};
FrameObject.AppendPlanePoint(0, &FramePoint);
FramePoint = {right, top};
FrameObject.AppendPlanePoint(0, &FramePoint);
FramePoint = {left, top};
FrameObject.AppendPlanePoint(0, &FramePoint);
FrameObject.Commit(); // Для наглядности)
QDMapFind Finder(this); // Инициализируем компонент поиска
Finder.SetMapView(ui->MapWidget); // "Привязываем" его к компоненту отображения
Finder.VarMapSelect->ClearAll(); // Очищаем
Finder.SetActive(false); // Отключаем
Finder.SetFindPoint(false); // Отключаем поиск по точке
Finder.VarMapSelect->SetSiteNumber(SiteNumber); // Устанавливаем номер сита
if (Finder.VarMapSelect->SelectSeekArea(SiteNumber, &FrameObject, 0.0, 1, 1, 1, 0)) // Ищем в заданной "рамке"
{
int FindCount = Finder.VarMapSelect->GetSelectObjectCount(SiteNumber); // Получаем количество найденных объектов (Дебаг)
qDebug() << "Site =" << SiteNumber << "FindCount =" << FindCount; // Выводим количество найденных объектов (Дебаг)
Finder.SetActive(true); // Активируем поисковик
ui->MapWidget->SetObjSelected(Finder.VarMapSelect, 0xFF, true); // Задаём выделение
}
//FrameObject.Delete(); // Для наглядности)
}
Объекты действительно находятся, а вот выделение в любом случаи срабатывает на всю карту. https://ibb.co/zsM0fbq https://ibb.co/WK5vtXp Пожалуйста подскажите, что мы делаем не правильно. Заранее спасибо.
QDMapSelect содержит в себе контексты поиска для всех открытых карт в документе. Когда Вы вычисляете число объектов, Вы подаете номер карты в GetSelectObjectCount. Когда выполняется отображение, выделение рисуется для каждой карты отдельно. Поэтому необходимо отключить контексты поиска для других слоев. На текущий момент это можно сделать вызвав у QDMapSelect метод SetExcode(int excode, int local, bool value) с параметрами: excode = -1(применить для всех объектов карты), local = 0(не важно, потому что ранее указано -1), value = false (выключить видимость). Вызывать необходимо для каждой карты, которая не используется в данном контексте поиска (если убрать и у используемой карты, то ничего не выведет). Количество внутренних контекстов указывается в CountSelect, а текущий номер записывается в VarSite.
Код
for (int i = 0; i < Finder.VarMapSelect->CountSelect; i++)
{
if (i == SiteNumber)
continue;
Finder.VarMapSelect->VarSite = i;
Finder.VarMapSelect->SetExcode(-1, 0, false);
}
Приведенный код можно вставить вместо строки: Finder.VarMapSelect->SetSiteNumber(SiteNumber); // Устанавливаем номер сита
В будущем добавим учет активности контекста поиска для каждой карты в отдельности и более простой способ выключения всех карт.
Спасибо за развёрнутый ответ. Но добавление данного кода проблемму "всеобщего" выделения не решило... https://ibb.co/gvMLv9c Есть ещё какая либо возможность решения данной проблеммы. Спасибо.
Выполнил проверку на последней версии ГИС Конструктор для Astra Linux с нашего сайта. В примере myfirst вставил Ваш код в один из пунктов меню. Указал свои координаты и вызвал пункт меню. На карте были выделены только объекты 2-й карты в заданном регионе. Пожалуйста, попробуйте на версии с сайта.