Это здесь при чём? Я не задаю RGB, я задаю индекс типа в классификаторе семантики, а уж как оно работает - внутреннее дело библиотек Панорамы, о чём собственно и был вопрос.
Александр Лазарев написал: 1. Почему отсутствие значения в нём влияет на цвет? 2. Почему цвет, задаваемый в признаке цвета не соответствует заданному индексу?
Здравствуйте! 1. Семантика либо отсутствует, либо ей присвоено некоторое значение. Уточните, пожалуйста, каким образом Вы производите добавление семантики "Признак цвета" объекту и как потом проверяете ее значение? 2. Здесь необходимо уточнение, чтобы воспроизвести такое же поведение у нас. Продолжая предыдущее обсуждение: если есть объект "Танк" с одной семантикой "Государственная принадлежность" (значение "Свой"), с каким значением потом нужно добавить семантику "Признак цвета объета" для получения несоответствия цвета?
Александр Лазарев написал: 1. Почему отсутствие значения в нём влияет на цвет? 2. Почему цвет, задаваемый в признаке цвета не соответствует заданному индексу?
Здравствуйте! 1. Семантика либо отсутствует, либо ей присвоено некоторое значение. Уточните, пожалуйста, каким образом Вы производите добавление семантики "Признак цвета" объекту и как потом проверяете ее значение? 2. Здесь необходимо уточнение, чтобы воспроизвести такое же поведение у нас. Продолжая предыдущее обсуждение: если есть объект "Танк" с одной семантикой "Государственная принадлежность" (значение "Свой"), с каким значением потом нужно добавить семантику "Признак цвета объета" для получения несоответствия цвета?
А если не добавлять пустую строку для семантик типа 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 ещё можно выставить - цвета меняются. То есть если выставить сначала гос принадлежность - цвет будет зависеть от гос принадлежности, если выставить признак цвета объекта - то в зависимости от признака, гос принадлежность игнорируется.
У себя используем метод mapSetSemanticValue и тоже проблем не возникает. Гос принадлежность цвет меняет, признак цвета - тоже, цвет РГБ - тоже.. приоритеты как и было указано выше - ГП -> Признак цвета -> Цвет РГБ. Строковое значение семантики в koi8r и, на всякий, еще нулем завершенное. Все это работает и на 11 и 12 версии ГИС Конструктор без изменений. Наверно стоит упростить пример.
Пример и так проще некуда. Берётся весь хлам из классификатора для данного объекта, вываливается пользователю для редактирования. Я, как программист, нифига не должен следить за порядком записи этого чудовищного списка всех форм семантик. Какие данные пользователь задал, такие обратно и запихал. Если от порядка зависит отображение, то, извините, это ппц какой-то.
Какие данные пользователь задал, такие обратно и запихал.
Вы помимо семантик, заданных пользователем, ещё и пустые зачем-то добавляете:
Цитата
//не установленные пользователем значения пустые, поэтому автоматически в их позиции в сематнике записывается 0
Не добавляйте - добавляйте только то, что пользователь выбрал. Пример
А почему нельзя добавлять пустые семантики? Этого нигде не запрещено. Что на вашей гифке записывается в данные объекта для остальных не установленных семантик?
Александр Лазарев написал: Что на вашей гифке записывается в данные объекта для остальных не установленных семантик?
Предположу.. Ничего? Изначально создается объект. У него нет семантик кроме тех, что есть по умолчанию (код кэуз например и т.п) Когда пользователь тыкает в UI и выбирает значение, то семантика добавляется при помощи mapAppendSemantic... Если пользователь выбирает другое значение для ранее установленной семантики, то значение меняется при помощи mapSetSemantic... Если пользователь жмет на кнопку удалить или выбирает из комбика значение "Не установлено", то семантика удаляется.
От порядка добавления, изменения семантик результат на экране не зависит. Т.е. результат однозначно определяется набором семантик, который установлен для объекта.