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

Несоответствие в списке семантики "Признак цвета объекта" и реального отображения

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 5 След.
RSS
Несоответствие в списке семантики "Признак цвета объекта" и реального отображения
 
Цитата
Почему цвет, задаваемый в признаке цвета не соответствует заданному индексу?
Там задом наперёд байты. BGR или ABGR. TCOLOR вроде называется тип значения семантики.

Вот тема про TCOLOR, TDATE и TTIME в семантиках.
Изменено: Владимир Егоров - 19.08.2018 19:29:43
 
Цитата
Владимир Егоров написал:
Цитата
Почему цвет, задаваемый в признаке цвета не соответствует заданному индексу?
Там задом наперёд байты. BGR или ABGR. TCOLOR вроде называется тип значения семантики.

Вот  тема  про TCOLOR, TDATE и TTIME в семантиках.
Это здесь при чём? Я не задаю RGB, я задаю индекс типа в классификаторе семантики, а уж как оно работает - внутреннее дело библиотек Панорамы, о чём собственно и был вопрос.
 
Цитата
Александр Лазарев написал:
1. Почему отсутствие значения в нём влияет на цвет?
2. Почему цвет, задаваемый в признаке цвета не соответствует заданному индексу?
Здравствуйте!
1. Семантика либо отсутствует, либо ей присвоено некоторое значение. Уточните, пожалуйста, каким образом Вы производите добавление семантики "Признак цвета" объекту и как потом проверяете ее значение?
2. Здесь необходимо уточнение, чтобы воспроизвести такое же поведение у нас. Продолжая предыдущее обсуждение: если есть объект "Танк" с одной семантикой "Государственная принадлежность" (значение "Свой"), с каким значением потом нужно добавить семантику "Признак цвета объета" для получения несоответствия цвета?
 
Цитата
Александр Савелов написал:
Цитата
Александр Лазарев написал:
1. Почему отсутствие значения в нём влияет на цвет?
2. Почему цвет, задаваемый в признаке цвета не соответствует заданному индексу?
Здравствуйте!
1. Семантика либо отсутствует, либо ей присвоено некоторое значение. Уточните, пожалуйста, каким образом Вы производите добавление семантики "Признак цвета" объекту и как потом проверяете ее значение?
2. Здесь необходимо уточнение, чтобы воспроизвести такое же поведение у нас. Продолжая предыдущее обсуждение: если есть объект "Танк" с одной семантикой "Государственная принадлежность" (значение "Свой"), с каким значением потом нужно добавить семантику "Признак цвета объета" для получения несоответствия цвета?
1. Запись семантик вновь созданного объекта:
Код
void PanoramaUtility::saveCreatedObject()
{
    if( m_workingLayer == 0) return;
    if( m_descriptor == 0) return;
    long objNumber = -1;
    long semPos = 0;
    QTextCodec *codec = QTextCodec::codecForName( "KOI8-R");
    if( m_objectIsCreated)
    {
        HRSC hRsc = mapGetRscIdent( m_descriptor, m_workingLayer);
        if( hRsc != 0)
        {
            long segmCount = mapGetRscSegmentCount( hRsc);
            for( long i = 0; i < segmCount; i++)
            {
                long objects_in_layer = mapGetRscSegmentObjectCount( hRsc, i);
                for( long j = 1; j <= objects_in_layer; j++)
                {
                    QString oNameInLa yer = codec->toUnicode( mapGetRscObjectNameInLayer( hRsc, i, j));
                    if( oNameInLayer.isEmpty()) continue;
                    if( m_objectToSave.m_objectName.toLower().compare( oNameInLayer.toLower()) == 0)
                    {
//                        long sheet = mapGetSiteNumber( m_descriptor, m_workingLayer);
                        HOBJ obj = mapCreateSiteObject( m_descriptor, m_workingLayer);//mapCreateObject( m_descriptor, sheet);
                        if( obj != 0)
                        {
                            if( mapRegisterObject( obj, m_objectToSave.m_excode, m_objectToSave.m_local) != 0)
                            {
                                for( int ik = 0; ik < m_objectToSave.m_semList.count(); ik++)
                                {
                                    if( m_objectToSave.m_semList.at( ik).m_semName.indexOf( "RGB") >= 0) continue;
                                    if( ( semPos = mapAppendSemantic( obj, m_objectToSave.m_semList.at( ik).m_semCode, "", 0)) != 0)
                                    {
                                        long semCode = m_objectToSave.m_semList.at( ik).m_semCode;//mapSemanticCode( obj, semPos);
                                        long semClassCount = mapSemanticClassificatorCount( obj, semCode);
                                        if( semClassCount > 0)
                                        {
                                            for( long jk = 1; jk <= semClassCount; jk++)
                                            {
                                                QString semClassCodeOrderName = codec->toUnicode( mapSemanticClassificatorName( obj, semCode, jk));
                                                ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                if( m_objectToSave.m_semList.at( ik).m_semValue.isEmpty())                                      //не установленные пользователем значения пустые, поэтому автоматически в их позиции в сематнике записывается 0
                                                {
                                                    QString numStr = QString::number( 0);
                                                    mapSetSemanticValue( obj, semPos, numStr.toLatin1().data(), numStr.length());
                                                    qDebug() << "PanoramaUtility::saveCreatedObject with classificator empty"
                                                             << m_objectToSave.m_semList.at( ik).m_semName
                                                             << m_objectToSave.m_semList.at( ik).m_semValue;
                                                    break;
                                                }
                                                else
                                                    if( m_objectToSave.m_semList.at( ik).m_semValue.compare( semClassCodeOrderName) == 0)
                                                    {
                                                        QString numStr = QString::number( jk);
                                                        mapSetSemanticValue( obj, semPos, numStr.toLatin1().data(), numStr.length());
                                                        qDebug() << "PanoramaUtility::saveCreatedObject with classificator"
                                                                 << m_objectToSave.m_semList.at( ik).m_semName
                                                                 << m_objectToSave.m_semList.at( ik).m_semValue;
                                                        break;
                                                    }
                                            }
                                        }
                                        else
                                        {
                                            //long semCode = mapSemanticCode( m_currentObject, i);
                                            mapSetSemanticValue( obj, semPos, codec->fromUnicode( m_objectToSave.m_semList.at( ik).m_semValue).data(),
                                                                 m_objectToSave.m_semList.at( ik).m_semValue.length());
                                            qDebug() << "PanoramaUtility::saveCreatedObject" << m_objectToSave.m_semList.at( ik).m_semName
                                                     << m_objectToSave.m_semList.at( ik).m_semValue;
                                        }

                                    }
                                }
                                for( int ik = 0; ik < m_objectToSave.m_objectPoints.count(); ik++)
                                {
                                    if( mapAppendPointGeo( obj,
                                                           m_objectToSave.m_objectPoints.at( ik).x() * M_PI / 180.,
                                                           m_objectToSave.m_objectPoints.at( ik).y() * M_PI / 180.,
                                                           0) == 0)
                                    {
                                        qDebug() << "PanoramaUtility::saveCreatedObject error mapAppendPointGeo" << m_objectToSave.m_semList.at( ik).m_semCode;
                                    }
                                }
                            }
                            if( mapCommit( obj) == 0)
                            {
                                qDebug() << "PanoramaUtility::saveCreatedObject() FAILED commiting object";
                            }
                            objNumber = mapGetObjectNumber( obj);
                            mapFreeObject( obj);
                            appendUndoRedoOperation( OT_APPEND, objNumber);
                        }
                    }
                }
            }
        }
        m_objectToSave.m_clean = true;
        m_objectToSave.m_semList.clear();
        m_objectToSave.m_objectPoints.clear();
        m_objectIsCreated = false;
    }
}
2. С любым, даже с "0"-м
 
А если не добавлять пустую строку для семантик типа TCODE, а сразу прописывать там какое-то валидное значение, работает ?

Я вот так делал добавление одной семантики в объект:
Код
bool VMapObject::appendNewSemantic(const RscSemanticInfo &semInfo,
                                   const QVariant &value)
{
    if (!isValid())
        return false;
    bool appendResult = false, ok = false;
    long longValue = 0; double doubleValue = 0.0;
//    QDateTime dateTimeValue;
    switch (semInfo.getValueType()) {
    case gis::common::SemanticValueType::TCODE: //перечисление, проверка значения на корректность
        longValue = value.toInt(&ok);
        if (ok)
            if (semInfo.getValueMap().count(longValue) == 1)
                appendResult = appendSemantic(semInfo.getExCode(), longValue);
        break;
    case gis::common::SemanticValueType::TSTRING:   //строка
        appendResult = appendSemantic(semInfo.getExCode(),
                                      value.toString().trimmed());
        break;
    case gis::common::SemanticValueType::TDATE:
    case gis::common::SemanticValueType::TTIME:
        if (value.canConvert<QDateTime>()){
            longValue = gis::common::convertToTDATETTIME(value.toDateTime(),
                                                         semInfo.getValueType());
            appendResult = appendSemantic(semInfo.getExCode(), longValue);
        }
        break;
    case gis::common::SemanticValueType::TCOLOR:
        longValue = gis::common::convertToTCOLOR(value.value<QColor>());
        appendResult = appendSemantic(semInfo.getExCode(), longValue);
        break;
    case gis::common::SemanticValueType::TNUMBER:  //просто числа
        longValue = value.toInt(&ok);
        if (ok)
            appendResult = appendSemantic(semInfo.getExCode(), longValue);
        break;
    case gis::common::SemanticValueType::TANGLE:
        doubleValue = value.toDouble(&ok);
        if (ok)
            appendResult = appendSemantic(semInfo.getExCode(), doubleValue);
        break;
    default:
        if (semInfo.getValueType() >= gis::common::SemanticValueType::TANYFILE &&
                semInfo.getValueType() <= gis::common::SemanticValueType::TPCXFILE){
            appendResult = appendSemantic(semInfo.getExCode(),
                                          value.toString().trimmed());
        }else{
            //остаются только формулы, для которых нельзя выставить значения
            return false;
        }
    }
    if (!appendResult)
        return false;
    if (!commit())
        return false;
    update();
    return true;
}

bool VMapObject::appendSemantic(long exCode, const QString &value)
{
    QByteArray koi8r = gis::common::convertStringToKOI8_R(value);
    long rc = mapAppendSemantic(m_obj, exCode, koi8r.constData(),
                                koi8r.size() + 1);
    return rc != 0;
}

bool VMapObject::appendSemantic(long exCode, long value)
{
    long rc = mapAppendSemanticLong(m_obj, exCode, value);
    return rc != 0;
}

bool VMapObject::appendSemantic(long exCode, double value)
{
    long rc = mapAppendSemanticDouble(m_obj, exCode, value);
    return rc != 0;
}

 
И у нас корректно вроде работают семантики признак цвета объекта, гос принадлежность, RGB ещё можно выставить - цвета меняются.
То есть если выставить сначала гос принадлежность - цвет будет зависеть от гос принадлежности, если выставить признак цвета объекта - то в зависимости от признака, гос принадлежность игнорируется.

Возможно в логике в программе проблема.
Изменено: Владимир Егоров - 20.08.2018 15:22:39
 
Приветствую!

У себя используем метод mapSetSemanticValue и тоже проблем не возникает. Гос принадлежность цвет меняет, признак цвета - тоже, цвет РГБ - тоже.. приоритеты как и было указано выше - ГП -> Признак цвета -> Цвет РГБ.
Строковое значение семантики в koi8r и, на всякий, еще нулем завершенное. Все это работает и на 11 и 12 версии ГИС Конструктор без изменений.
Наверно стоит упростить пример.


С уважением,
Матвеев П.В.
 
Пример и так проще некуда. Берётся весь хлам из классификатора для данного объекта, вываливается пользователю для редактирования.
Я, как программист, нифига не должен следить за порядком записи этого чудовищного списка всех форм семантик. Какие данные пользователь задал, такие обратно и запихал.
Если от порядка зависит отображение, то, извините, это ппц какой-то.
Изменено: Александр Лазарев - 20.08.2018 16:10:31
 
Цитата
Какие данные пользователь задал, такие обратно и запихал.
Вы помимо семантик, заданных пользователем, ещё и пустые зачем-то добавляете:
Цитата
//не установленные пользователем значения пустые, поэтому автоматически в их позиции в сематнике записывается 0
Не добавляйте - добавляйте только то, что пользователь выбрал.
Пример (ссылку удалил, кому-надо было уже посмотрели)
Изменено: Владимир Егоров - 20.08.2018 17:12:51
 
Цитата
Владимир Егоров написал:
Цитата
Какие данные пользователь задал, такие обратно и запихал.
Вы помимо семантик, заданных пользователем, ещё и пустые зачем-то добавляете:
Цитата
//не установленные пользователем значения пустые, поэтому автоматически в их позиции в сематнике записывается 0
Не добавляйте - добавляйте только то, что пользователь выбрал.
Пример
А почему нельзя добавлять пустые семантики? Этого нигде не запрещено.
Что на вашей гифке записывается в данные объекта для остальных не установленных семантик?
Изменено: Александр Лазарев - 20.08.2018 16:50:24
 
Цитата
Александр Лазарев написал:
Что на вашей гифке записывается в данные объекта для остальных не установленных семантик?
Предположу.. Ничего?
Изначально создается объект. У него нет семантик кроме тех, что есть по умолчанию (код кэуз например и т.п)
Когда пользователь тыкает в UI и выбирает значение, то семантика добавляется при помощи mapAppendSemantic...
Если пользователь выбирает другое значение для ранее установленной семантики, то значение меняется при помощи mapSetSemantic...
Если пользователь жмет на кнопку удалить или выбирает из комбика значение "Не установлено", то семантика удаляется.

От порядка добавления, изменения семантик результат на экране не зависит. Т.е. результат однозначно определяется набором семантик, который установлен для объекта.



С уважением,
Матвеев П.В.
Страницы: Пред. 1 2 3 4 5 След.
Читают тему (гостей: 1)



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

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