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

[MAPAPI] Добавление семантик типа TDATE, TTIME, TCOLOR

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
[MAPAPI] Добавление семантик типа TDATE, TTIME, TCOLOR, Добавление семантик типа TDATE, TTIME, TCOLOR
 
Здравствуйте.

Какой формат у семантик с типом значения TDATE, TTIME, TCOLOR ?

В документации написано:
Цитата
Каждая семантика имеет номер, название, тип значения (символьная строка, числовое
значение, ссылка на другой объект, код характеристики и т.д.), признак повторяемости, единицу
измерения, максимальное и минимальное значения.

В maptype.h :
Код
enum SEMTYPE           // ТИПЫ ЗНАЧЕНИЯ СЕМАНТИКИ
{
   TUNDEFINED = -1,    // Значение не установлено
   TSTRING    = 0,     // Символьная строка
   TNUMBER    = 1,     // Числовое значение
   TANYFILE   = 9,     // Имя файла зарегистрированного типа
   TBMPFILE   = 10,    // Имя файла BMP
   TOLEFILE   = 11,    // Имя файла,обрабатываемого OLE-сервером
   TREFER     = 12,    // Ссылка на произвольный объект карты
                       // (уникальный номер объекта)
   TMAPFILE   = 13,    // Имя файла-паспорта района
   TTXTFILE   = 14,    // Имя текстового файла
   TPCXFILE   = 15,    // Имя файла PCX
   TCODE      = 16,    // Значение в виде числового кода
                       // из классификатора значений
   TDATE      = 17,    // Значение даты в числовом виде (ГГГГММДД)
   TANGLE     = 18,    // Угловая величина в радианах
   TTIME      = 19,    // Значение времени в числовом виде (ЧЧММСС)
   TFONT      = 20,    // Имя шрифта ("Arial", "Courier"...)
   TCOLOR     = 21,    // Числовое значение цвета в RGB
   TFDIGITAL  = 22,    // Семантика типа формула числовая (с вычисляемыми значениями)   
   TFSTRING   = 23,    // Семантика типа формула символьная (с вычисляемыми значениями) 
   TLAST      = 23,    // ВЕРХНЯЯ ГРАНИЦА СПИСКА КОДОВ

   TDOCREFMIN = 9,     // НИЖНЯЯ ГРАНИЦА ТИПА СЕМАНТИКИ - ССЫЛКА НА ДОКУМЕНТ (ГРАФИЧЕСКИЙ ФАЙЛ, КАРТА)
   TDOCREFMAX = 15,    // НИЖНЯЯ ГРАНИЦА ТИПА СЕМАНТИКИ - ССЫЛКА НА ДОКУМЕНТ (ГРАФИЧЕСКИЙ ФАЙЛ, КАРТА)
};

TDATE, TTIME - это строка или число?

Если число, значение TTIME 526 - это 0 часов 5 минут 26 секунд?
Если строка, то вроде всё понятно.

TCOLOR - это число в формате 0x00BBGGRR ??

Я хочу использовать QDateTime,
и для TDATE, TTIME чисел у меня вот такой пример:
Код
#include <QCoreApplication>
#include <QDateTime>
#include <QDebug>

QDateTime calcTime(int someTime){
    QString time = QString::number(someTime);
    QString ret;
    return QDateTime::fromString(ret.fill('0', 6 - time.length()).append(time),
                                 "hhmmss");
}

QDateTime calcDate(int someDate){
    QString date = QString::number(someDate);
    QString ret;
    return QDateTime::fromString(ret.fill('0', 8 - date.length()).append(date),
                                 "yyyyMMdd");

}

int       calcSemanticDate(const QDateTime& d){
    return d.toString("yyyyMMdd").toInt();
}
int       calcSemanticTime(const QDateTime& d){
    return d.toString("hhmmss").toInt();
}


int main()
{
    //получение QDateTime из значения семантики
    qDebug() << calcTime(526).toString("hhmmss");
    //получение из QDateTime значения для семантики TTIME
    qDebug() << calcSemanticTime(calcTime(526));
    //получение QDateTime из значение семантики
    qDebug() << calcDate(21225).toString("yyyyMMdd");
    //получение из QDateTime значения семантики TDATE
    qDebug() << calcSemanticDate(calcDate(21225));
    return 0;
}

Вывод:
Код
"000526"
526
"00021225"
21225
Изменено: Владимир Егоров - 27.03.2018 15:16:13
 
В примере совсем не разобрался, но в описании перечесления указано как хранятся данные:
TDATE      = 17,    // Значение даты в числовом виде (ГГГГММДД)
TTIME      = 19,    // Значение времени в числовом виде (ЧЧММСС)
TCOLOR     = 21,    // Числовое значение цвета в RGB

То есть это число(int), которое анализируется как 0dYYYYMMDD для TDATE, 0d00HHMMSS для TTIME и 0x00BBGGRR для TCOLOR
Если эту семантику выводить в строку, то можно анализировать строку, вроде это и делается в примере.
 
Спасибо, пример как раз для такого случая.

Получается значение времени 0 часов 5 минут 26 секунд будет числом 526, значение даты 25 декабря второго года будет 21225, функции из примера могут превращать такие числа в QDateTime и обратно из QDateTime в значения TDATE и TTIME.

Чтобы использовать QColor для TCOLOR понадобится менять порядок байт, пример:
Код
#include <QDebug>
#include <QColor>


QColor    calcColor(int someColor){
    QColor ret;
    ret.setRed(someColor & 0xFF);
    ret.setGreen((someColor & 0xFF00) >> 8;
    ret.setBlue( (someColor & 0xFF0000) >> 16);
    return ret;
}

int       calcSemanticColor(const QColor& color){
    unsigned int ret = 0;
    ret |= color.red();
    ret |= (color.green() << 8;
    ret |= (color.blue() << 16);
    return ret;
}

int main()
{
    QString colorName = "#FF00AA";
    QColor color(colorName);
    qDebug() << colorName + " hex:" << "0x" + QString::number(color.rgb(), 16);
    qDebug() << colorName + " hex:" << "0x" + QString::number(calcColor(0x00AA00FF).rgb(), 16);
    qDebug() << colorName + " hex in COLORREF format:" << "0x" + QString::number(calcSemanticColor(color), 16);
    qDebug() << colorName + " hex:" << "0x" + QString::number(calcColor(calcSemanticColor(color)).rgb(), 16);
    qDebug() << "Qt::red hex:" << "0x" + QString::number(QColor(Qt::red).rgb(), 16);
    qDebug() << "Qt::red in COLORREF format:" << "0x" + QString::number(calcSemanticColor(QColor(Qt::red)), 16);
    return 0;
}
Вывод:
Код
"#FF00AA hex:" "0xffff00aa"
"#FF00AA hex:" "0xffff00aa"
"#FF00AA hex in COLORREF format:" "0xaa00ff"
"#FF00AA hex:" "0xffff00aa"
Qt::red hex: "0xffff0000"
Qt::red in COLORREF format: "0xff"
 
С датами и временем так.
С цветом не вижу разницы с предыдущим примером)) Тут же нет взаимодействия с MAPAPI, поэтому трудно что-то сказать)
Возможно там все же 0xAARRGGBB, но стандартно в ядре используется 0xAABBGGRR
 
То есть там ещё и альфа есть ? В maptype.h написано RGB, и ни слова про альфу.
Пойду всё таки найду какие-нибудь объекты на картах с такими семантиками и посмотрю.
 
Альфу я привел просто для понимания порядка байт, потому что сам долго не мог понять, что RGB в понимании MAPAPI это 0x00BBGGRR, ведь в памяти(RAM в формате Intel) будет лежать как RRGGBB00, отсюда и RGB :)
У нас альфа-канал не учитывается
Страницы: 1
Читают тему (гостей: 1)



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

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