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

mapSetScreenImageSize

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

Нужна консультация по использованию функции mapSetScreenImageSize
В поиске нашёл некоторые пояснения от Олега Валентиновичаhttp://gisweb.ru/forum/messages/forum2/topic4304/message27497/4304#message27497 но они не совсем поясняют мой вопрос.

Итак. Имеем на входе
1. Видеокарту в двухмониторном режиме с двумя подключенными мониторами
2. Разрешение основного монитора (который слева FullHD 1920 х 1080 - диагональ 22")
3. Разрешение дополнительного монитора (на котором карта) - 1600х1200 (4:3 диагональ 19")

Перед открытием всех карт в секции инициализации (initialization)
устанавливаю следующие параметры буфера  mapSetScreenImageSize(4000, 3000)

В итоге
на правом (дополнительном мониторе) все объекты становятся очень мелкими, а в масштабе 1:500 000 (1см/5км) видно территорию всего "золотого кольца"
ну и карта естественно очень сильно тормозит при перемещении.

Опытным путём было вычислено, что вышеуказанная функция меняет не только размер буфера, а и размер "Диагонали" монитора по умолчанию
Исходя из этого, достигается эффект отображения района карты который размещается на дисплее размером в 33" (после увеличения буфера)
на мониторе с реальной диагональю 22".

По сути, функция mapSetScreenImageSizeне только устанавливает буфер экрана, а и пересчитывает "под себя" параметр
которые возвращается и уста навивается функциями  mapGetScreenSize / mapSetScreenSize

Чтобы достичь эффекта увеличения буфера без масштабирования карты функцию  mapSetScreenImageSize использую вот так:
Цитата
int scrSize = mapGetScreenSize(); // запоминаю диагональ
mapSetScreenImageSize(screen.Width*2, screen.Height*2); // расширяю буфер в два раза
mapSetScreenSize (scrSize);   // возвращаю диагональ
Вопрос 1: это правильное применение функции выделения буфера, или я что-то делаю не так:
Вопрос 2: это правильно, что функция mapSetScreenImageSize пересчитывает параметр который возвращается функцией mapGetScreenSize ?
Изменено: KFF - 25.01.2019 20:26:50
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
У нас вот такие настройки экрана при инициализации:

Код
void SetupScreenSettings(){
    QSize screenSizePix = QGuiApplication::primaryScreen()->geometry().size();
    long scWidth = static_cast<long>(screenSizePix.width());
    long scHeight =static_cast<long>(screenSizePix.height());
    panorama::mapSetScreenImageSize(scWidth, scHeight);
    QString env = QProcessEnvironment::systemEnvironment().value(envScreenWidthInMM, "");
    bool ok = false;
    if (env.isEmpty()){
        return;
    }
    double scWidthMM = static_cast<double>(env.toInt(&ok));
    if (!ok || (env.toInt() == 0)){
        return;
    }
    env = QProcessEnvironment::systemEnvironment().value(envScreenHeightInMM, "");
    ok = false;
    if (env.isEmpty()){
        return;
    }
    double scHeightMM = static_cast<double>(env.toInt(&ok));
    if (!ok || (env.toInt() == 0)){
        return;
    }
    double scHorPrecision = static_cast<double>(scWidth * 1000) / (scWidthMM);
    double scVerPrecision = static_cast<double>(scHeight * 1000) / (scHeightMM);
    panorama::mapSetScreenPrecisionEx(scHorPrecision, scVerPrecision);
}
 
Текст функций такой:
Код
 // Запросить/Установить размер диагонали видимого изображения
 // экрана в миллиметрах (50 - 4000). При установке возвращает
 // старое значение
 // При ошибке возвращает 0

 double SetScreenSize(double size, HDC hdc)
 {
   if (size == 0)
     size = ::ScreenSize;

   double old = ::ScreenSize;
   ::ScreenSize = size;
   if (::ScreenSize > 4000.)
     ::ScreenSize = 4000.;
   else
   if (::ScreenSize < 50.)
     ::ScreenSize = 50.;

   HorPixelInMeter = sqrt((double)ScreenWidth  * ScreenWidth +
                                ScreenHeight * ScreenHeight);

   double temp = ::ScreenSize;
   HorPixelInMeter = HorPixelInMeter / temp * 1000.0;
   temp = ScreenScale;
   HorPixelInMeter = HorPixelInMeter * temp / 100.0;

   VerPixelInMeter = HorPixelInMeter;  
   return old;
 }

 // Запросить/Установить точность текущего режима экрана в точках
 // на метр (1000 - 100000). При установке возвращает старое
 // значение и пересчитывает коэффициент масштабирования экрана
 // При ошибке возвращает 0

 double GetScreenPrecision() 
 {
   return HorPixelInMeter;
 }

 double SetScreenPrecision(double value)
 {
   if (value == 0)
     {
       SetScreenSize(0, 0);
       return HorPixelInMeter;
     }

   double old = HorPixelInMeter;

   // 28/04/06 заменил 100000 на 1000000
   value = max(39.0, min(1000000.0, value));  // 39 точек на метр - это 1 точка на дюйм. Меньше нельзя // 11/03/04  // 09/03/13

   // Установить текущие параметры
   mapSetScreenScale(0);

   // Поправить масштабный коэффициент
   ScreenScale  = ScreenScale * value / HorPixelInMeter;

   HorPixelInMeter = value;
   VerPixelInMeter = value;

   IsScreenPrecisionSet = 1;

   return old;
 }

 // Установить предельные размеры буфера изображения
 // Должна вызываться до открытия данных
 // При ошибке возвращает 0

_MAPIMP  long int _MAPAPI mapSetScreenImageSize(long int width, long int height)
 {
   if (width == 0)
     width = ScreenWidth;

   if (height == 0)
     height = ScreenHeight;

   if (width < 128)
     width = 128;
   else
    if (width > 16 * 1024)
      width = 16 * 1024;

   if (height < 128)
     height = 128;
   else
    if (height > 8 * 1024)
      height = 8 * 1024;

   ScreenWidth  = width;
   ScreenHeight = height;
   IsScreenSet  = 1;

   if (MaxScreenWidth < ScreenWidth)
     MaxScreenWidth = ScreenWidth;
   if (MaxScreenHeight < ScreenHeight)
     MaxScreenHeight = ScreenHeight;

   // Уточнить размер экрана в миллиметрах для сохранения HorPixelInMeter
   ScreenSize = sqrt((double)ScreenWidth  * ScreenWidth + ScreenHeight * ScreenHeight) /
                      HorPixelInMeter * 1000.0 * ScreenScale / 100.0;
   return 1;
 }

_MAPIMP long int _MAPAPI mapSetMaxScreenImageSize(long int width, long int height)
 {
   if (width == 0)
     width = MaxScreenWidth;

   if (height == 0)
     height = MaxScreenHeight;

   if (width < 128)
     width = 128;
   else
    if (width > 16 * 1024)
      width = 16 * 1024;

   if (height < 128)
     height = 128;
   else
    if (height > 8 * 1024)
      height = 8 * 1024;

   MaxScreenWidth  = width;
   MaxScreenHeight = height;
   IsMaxScreenSet  = 1;
   return 1;
 }

 void _MAPAPI mapSetScreenPrecisionEx(double valueHor, double valueVer)
 {
   if (valueHor == 0) valueHor = HorPixelInMeter;
   if (valueVer == 0) valueVer = VerPixelInMeter;

   valueHor = Max((double)39, Min((double)100000, valueHor));
   valueVer = Max((double)39, Min((double)100000, valueVer));

   // Установить текущие параметры
   mapSetScreenScale(0);

   // Поправить масштабный коэффициент
   ScreenScale  = ScreenScale * valueHor / HorPixelInMeter;

   HorPixelInMeter = valueHor;
   VerPixelInMeter = valueVer;

   IsScreenPrecisionSet = 1;
 }

 double _MAPAPI mapSetScreenScaleEx(double scale)
 {
   if (scale == 0) scale = ScreenScale;

   double old = ScreenScale;
   ScreenScale = max(50., min(200., scale));

   SetScreenSize(ScreenSize, 0);

   return old;
 }
 
Цитата
   // Уточнить размер экрана в миллиметрах для сохранения HorPixelInMeter  
ScreenSize = sqrt((double)ScreenWidth  * ScreenWidth + ScreenHeight * ScreenHeight) /    
   HorPixelInMeter * 1000.0 * ScreenScale / 100.0;
Всё таки внутренний пересчёт присутствует, ОК.
Вопрос:
Имеется 2 разных монитора подключенных к видеокарте (1920х1080 основной и 1600х1400 резервный)
Отображение карты на резервном с метрикой 4х3, у основного 16х9 (HD)
При старте, ядро берёт по умолчанию метрику первого монитора (число 512) и применяет к картографии в итоге
на мониторе на котором карты - в нижней части чёрная полоса высотой 1400-1080 (320 пиксель)

Чтобы "убрать" эффект" я использовал вышеуказанную функцию с коррекцией метрики  монитора.
То есть, запоминая исходный mapGetScreenSize в глобальную переменную (условная базовая диагональ нормального отображения карты)

устанавливаю буфер который перекроет 1400 пиксель по высоте
mapSetScreenImageSize(screen.Width*2, screen.Height*2); 3840х2160и возвращаю mapSetScreenSize(512)


Чёрная полоса на втором мониторе - пропадает.
Вопрос - это правильное использование памяти/функция/ядра? или я что-то делаю не так
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Цитата
KFF написал:
Чёрная полоса на втором мониторе - пропадает.Вопрос - это правильное использование памяти/функция/ядра? или я что-то делаю не так
Необходимо, чтобы размеры внутри буфера были больше размеров экрана пикселях.
Тогда черной полосы не будет.
Страницы: 1
Читают тему (гостей: 1)



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

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