Доброго времени суток. Дано: 1. Набор карт, загруженных к базовой. 2. Пользователь создаёт слой sit с неким сторонним классификатором, официальным и в первом приближении соответствующим документации
4. Пользователь создаёт объект по своему выбору из таблиц, полученных из используемого стороннего классификатора (например "Подпись 1.5 син")
Код
bool PanoramaUtility::startNewObject(const QString &newObjectNameFromFilter)
{
if( m_workingLayer == 0) return false;
if( m_descriptor == 0) return false;
QTextCodec *codec = QTextCodec::codecForName( "KOI8-R");
m_objectToSave.m_clean = true;
m_objectToSave.m_semList.clear();
m_objectToSave.m_objectPoints.clear();
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( newObjectNameFromFilter.toLower().compare( oNameInLayer.toLower()) == 0)
{
m_objectToSave.m_excode = mapGetRscObjectExcodeInLayer( hRsc, i, j);
m_objectToSave.m_local = mapGetRscObjectLocalInLayer( hRsc, i, j);
m_objectToSave.m_objectName = newObjectNameFromFilter;
if( m_objectToSave.m_excode == 0) continue;
//For this code no semantic is found at all <<<<<<<<< тут тоже вопросы, если ответите, будет полезно.
// long sheet = mapGetSiteNumber( m_descriptor, m_workingLayer);
// HOBJ obj = mapCreateObject( m_descriptor, sheet);
//<<<
HOBJ obj = mapCreateSiteObject( m_descriptor, m_workingLayer);
if( obj != 0)
{
m_objectIsCreated = true;
if( mapRegisterObject( obj, m_objectToSave.m_excode, m_objectToSave.m_local) != 0)
{
static long bufCount = 1024;
long codeBuffer[ 1024] = { 0};
if( mapAvailableMustSemanticList( obj, codeBuffer, bufCount) != 0) <<<<<<<<<< тут ничего не возвращает, обязательных семантик нет никогда?
{
for( long t = 0; codeBuffer[ t] != 0; t++)
{
if( codeBuffer[ t] != 0)
{
long num = mapAppendSemantic( obj, codeBuffer[ t], "0", 2);
if( num == 0)
{
qDebug() << "PanoramaUtility::startNewObject error MUST mapAppendSemantic" << codeBuffer[ t];
}
else
{
QString semName = codec->toUnicode( mapSemanticName( obj, num));
m_objectToSave.m_semList.append( Semantic( semName, codeBuffer[ t], "0"));
long semClassCount = mapSemanticClassificatorCount( obj, codeBuffer[ t]);
if( semClassCount > 0)
{
for( long k = 1; k <= semClassCount; k++)
{
//TODO: think about decode table for semantics, based on documents
QString semClassCodeOrderName = codec->toUnicode( mapSemanticClassificatorName( obj, codeBuffer[ t], k));
m_objectToSave.m_semList.last().m_availableValues.append( semClassCodeOrderName);
}
}
}
}
}
}
memset( codeBuffer, 0, bufCount * sizeof( long));
long semCode = 0;
long count = 1;
if( mapAvailableSemanticList( obj, codeBuffer, bufCount) != 0) <<<<<<<<<<<<<< Возвращает левый набор несуществующих в природе кодов семантик, код добавлен для проверки
{
for( long kC = 0; codeBuffer[ kC] != 0; kC++)
{
qDebug() << "mapAvailableSemanticList: " << codeBuffer[ kC];
}
}
while( ( mapAvailableSemanticCount( obj)) != 0) <<<<<<<<<<<<<< Возвращает набор кодов, соответствующих реальным семантикам, но они какие-то странные для
данного набора карт и, походу, зависят от этого самого набора карт, как такое может быть,
если объект создан для конкретного слоя с конкретным классификатором?
{
semCode = mapAvailableSemanticCode( obj, count++);
if( semCode == 0) break;
long num = mapAppendSemantic( obj, semCode, "0", 2);
if( num == 0)
{
qDebug() << "PanoramaUtility::startNewObject error mapAppendSemantic" << semCode;
}
else
{
QString semName = codec->toUnicode( mapSemanticName( obj, num));
m_objectToSave.m_semList.append( Semantic( semName, semCode, "0"));
long semClassCount = mapSemanticClassificatorCount( obj, semCode);
if( semClassCount > 0)
{
for( long k = 1; k <= semClassCount; k++)
{
//TODO: think about decode table for semantics, based on documents
QString semClassCodeOrderName = codec->toUnicode( mapSemanticClassificatorName( obj, semCode, k));
m_objectToSave.m_semList.last().m_availableValues.append( semClassCodeOrderName);
}
}
}
}
m_objectToSave.m_clean = false;
}
mapFreeObject( obj);
}
goto fin;
}
}
}
}
fin:;
return true;
// qDebug() << "PanoramaUtility::startNewObject" << newObjectNameFromFilter;
}
m_objectToSave потом редактируется пользователем для последующего сохранения объекта в слое. Вопросы: 1. Правильно ли я создаю слой? 2. Правильно ли я создаю объект для этого слоя? 3. Почему могут отличаться наборы кодов семантик, как указано в комментарии в коде?
Александр Лазарев написал: 1. Правильно ли я создаю слой? 2. Правильно ли я создаю объект для этого слоя?
Концептуально, функции используются правильно (детали записи значений в параметры не анализировал).
Цитата
Александр Лазарев написал: 3. Почему могут отличаться наборы кодов семантик, как указано в комментарии в коде?
Вы не могли бы немного разгрузить пример, чтобы можно было сфокусироваться именно на участке кода, относящемся к вопросу (в идеале, чтобы его можно было воспроизвести как тестовый пример).
Александр Лазарев написал: 1. Правильно ли я создаю слой? 2. Правильно ли я создаю объект для этого слоя?
Концептуально, функции используются правильно (детали записи значений в параметры не анализировал).
Цитата
Александр Лазарев написал: 3. Почему могут отличаться наборы кодов семантик, как указано в комментарии в коде?
Вы не могли бы немного разгрузить пример, чтобы можно было сфокусироваться именно на участке кода, относящемся к вопросу (в идеале, чтобы его можно было воспроизвести как тестовый пример).
На самом деле вышеприведённый код можно использовать напрямую, я вам только дам сейчас определения типов:
Используется стандартный классификатор operator.rsc для нанесения военно-тактической обстановки. Далее выполняются действия по пунктам, как я расписал в своём первом сообщении. Просто разгружать делее почти некуда, так или иначе потребуется загруженный базовый набор карт, на котором необходимо создать слой sit с классификатором, и любой из текстовых идентификаторов объекта из классификатора для заполнения полей объекта.
В реализации функции mapAvailableSemanticList допущена ошибка, связанная с неправильным анализом буфера семантик. В частности, если реализовать заполнение и обход следующим образом, то список семантик получится идентичным полученному с помощью функции mapAvailableSemanticCode:
Код
int availableSemanticList[1024];
memset(availableSemanticList, 0, sizeof(availableSemanticList));
long availableSemanticCount = mapAvailableSemanticList(objectHandle, (long int*)availableSemanticList, sizeof(availableSemanticList)/sizeof(int));
std::cout << "availableSemanticCount: " << availableSemanticCount << std::endl;
int semanticNumber = 0;
while (availableSemanticList[semanticNumber])
{
std::cout << "semantic code: " << availableSemanticList[semanticNumber] << std::endl;
semanticNumber++;
}