226 lines
5.8 KiB
C++
Executable File
226 lines
5.8 KiB
C++
Executable File
/**
|
||
* @RDE_HEADER@
|
||
* Interface-Implementation of EsriDictionaryProcessor
|
||
* $Id$
|
||
* $HeadURL$
|
||
* $Author$
|
||
*/
|
||
#pragma once
|
||
|
||
// Own
|
||
#include <Symbology/symbol_dictionary.h> // Our interface "SymbolDictionary"
|
||
#include "advanced_symbology_logging.h"
|
||
#include <Symbology/sidc_definitions.h>
|
||
#include <Symbology/sidc_codec.h>
|
||
|
||
|
||
// Qt
|
||
#include <QImage>
|
||
|
||
|
||
// Esri
|
||
#include <arcgis/DictionarySymbolStyle.h>
|
||
|
||
|
||
|
||
|
||
//----------------------------------------------------------------------------
|
||
namespace AdvancedSymbology
|
||
{
|
||
|
||
struct createSwatchParameter
|
||
{
|
||
static constexpr int m_width = 128;
|
||
static constexpr int m_height = 64;
|
||
static constexpr float m_screenScale = 2;
|
||
|
||
};
|
||
static constexpr createSwatchParameter CREATE_SWATCH_PARAMETER = createSwatchParameter();
|
||
|
||
static constexpr float CREATE_SWATCH_SCREEN_SCALE = 5;
|
||
|
||
|
||
QImage scaleImage(const QImage &image, int sizeL = 100);
|
||
|
||
|
||
/**
|
||
* @brief The EsriDictionaryProcessor class analyses the stylx files of ESRI.
|
||
* The process is seperated:
|
||
* Setup: The EsriDictionaryProcessor has to be set up with the desired
|
||
* SymbologyType and initialized with the loaded raw Esri::ArcGISRuntime::DictionarySymbolStyle.
|
||
* Step 1:
|
||
* Search all from esri_dictionary (prepare)
|
||
* When this is finished,
|
||
* Step 2:
|
||
* For all results the associated Esri::ArcGISRuntime:Symbol has to be retrieved.
|
||
* This has to be done in the mainThread (syncTableWithinMainThread).
|
||
* Step 3:
|
||
* The single jobs can be triggered and performed in seperate threads:
|
||
* Job 1: startBaseSymbolCodeToPropertyTable();
|
||
* Job 2: startModifierTable();
|
||
* And the end of each job it´s checked if all jobs are finished (checkIfAllAreDone).
|
||
* If so the signal allIsDone is emitted.
|
||
*
|
||
* Now the BaseSymbolCodeToPropertyTableFinished and the ModifierTable is prepared.
|
||
*/
|
||
class EsriDictionaryProcessor : public QObject
|
||
{
|
||
Q_OBJECT
|
||
|
||
public:
|
||
/*! \name Construction, Destruction */
|
||
//@{
|
||
explicit EsriDictionaryProcessor(SymbologyType symbologyType);
|
||
virtual ~EsriDictionaryProcessor();
|
||
|
||
void cancel();
|
||
void waitForFinished();
|
||
//@}
|
||
|
||
virtual bool searchResultIsValid(const QHash<QString, int> &key8LookupTable,
|
||
const Esri::ArcGISRuntime::SymbolStyleSearchResult &resultItem,
|
||
QString *toBeRemovedFromName = nullptr) = 0;
|
||
|
||
//
|
||
// Common:
|
||
//
|
||
/*! \name Common */
|
||
//@{
|
||
void init(Esri::ArcGISRuntime::DictionarySymbolStyle *loaded_esri_dictionary);
|
||
void prepare();
|
||
|
||
protected:
|
||
//@}
|
||
|
||
|
||
//
|
||
// Job 1: BaseSymbolCodeToPropertyTable
|
||
//
|
||
public:
|
||
/*! \name Job 1: BaseSymbolCodeToPropertyTable */
|
||
//@{
|
||
void startBaseSymbolCodeToPropertyTable();
|
||
virtual bool processBaseSymbolCodeToPropertyTable() = 0;
|
||
bool baseSymbolCodeToPropertyTableFinished()
|
||
{
|
||
return m_baseSymbolCodeToSymbolPropertyTableFilled;
|
||
}
|
||
|
||
const SidcCodec::SidcHashTable<SymbolProperties> baseSymbolCodeToSymbolPropertyTable() const
|
||
{
|
||
return m_baseSymbolCodeToSymbolPropertyTable;
|
||
}
|
||
|
||
//@}
|
||
|
||
|
||
//
|
||
// Job 2: ModifierTable
|
||
//
|
||
public:
|
||
/*! \name Job 2: ModifierTable */
|
||
//@{
|
||
void startModifierTable();
|
||
virtual bool processModifierTable() = 0;
|
||
bool modifierTableFinished()
|
||
{
|
||
return m_modifierTableFilled;
|
||
}
|
||
|
||
QStringList symbolModifierKeys() const;
|
||
|
||
bool symbolModifierData(const QString &key, ModifierData &data) const;
|
||
|
||
QVector<ModifierData> symbolModifierList(SidcDefinitions::SymbolSet symbolSet, unsigned int modifierSector) const;
|
||
|
||
//@}
|
||
|
||
|
||
//
|
||
// Job n:
|
||
//
|
||
public:
|
||
|
||
|
||
|
||
//
|
||
// common final:
|
||
//
|
||
public:
|
||
bool allJobsDone() const;
|
||
|
||
Q_SIGNALS:
|
||
void allIsDone();
|
||
void baseSymbolCodeToPropertyTableDone();
|
||
void modifierTableDone();
|
||
|
||
|
||
protected Q_SLOTS:
|
||
void onSearchSymbolsCompletedPropertyTable(QUuid /*ssTaskId*/, Esri::ArcGISRuntime::SymbolStyleSearchResultListModel *searchResults);
|
||
void onEsriSymbolSwatchCompleted(const QUuid &csTaskId, const QImage &image);
|
||
|
||
|
||
protected:
|
||
void checkIfAllAreDone();
|
||
void searchSymbols();
|
||
void syncTableWithinMainThread();
|
||
|
||
//
|
||
// Common
|
||
//
|
||
LOGGER_T m_logger; ///< Interface of the Logging-Facility
|
||
|
||
Esri::ArcGISRuntime::DictionarySymbolStyle *m_esri_dictionary = nullptr;
|
||
|
||
QList<Esri::ArcGISRuntime::SymbolStyleSearchResult> m_searchResultList;
|
||
QList<Esri::ArcGISRuntime::SymbolStyleSearchResult> m_searchResultListValid;
|
||
|
||
// originalKey
|
||
struct EsriSymbol
|
||
{
|
||
Esri::ArcGISRuntime::SymbolStyleSearchResult m_sssResult;
|
||
mutable Esri::ArcGISRuntime::Symbol *esriSymbol = nullptr;
|
||
mutable QImage swatchImage;
|
||
};
|
||
QHash<QString, EsriSymbol> m_originalKeyToEsriSymbol;
|
||
|
||
// symbolPropertyImage-Uuid -> SymbolResult
|
||
mutable QMap<QUuid, QWeakPointer<SymbolResult>> m_symbolPropertyImage2symbolResult;
|
||
|
||
public:
|
||
bool symbolPropertyImageContains(const QString &originalKey) const;
|
||
QSharedPointer<SymbolResult> symbolPropertyImage(QSharedPointer<SymbolResult> symResult, const QString &originalKey) const;
|
||
|
||
const QList<Esri::ArcGISRuntime::SymbolStyleSearchResult> & getSearchResultList() const { return m_searchResultList; }
|
||
const QList<Esri::ArcGISRuntime::SymbolStyleSearchResult> & getSearchResultListValid() const { return m_searchResultListValid; }
|
||
|
||
protected:
|
||
//
|
||
// Job 1: baseSymbolCodeToSymbolPropertyTable:
|
||
//
|
||
SidcCodec::SidcHashTable<SymbolProperties> m_baseSymbolCodeToSymbolPropertyTable;
|
||
bool m_baseSymbolCodeToSymbolPropertyTableFilled = false;
|
||
QFuture<bool> m_baseSymbolCodeToSymbolPropertyTableWatcher;
|
||
|
||
|
||
|
||
|
||
//
|
||
// Job 2:
|
||
//
|
||
QMap<QString, ModifierData> m_modifierTable;
|
||
bool m_modifierTableFilled = false;
|
||
QFuture<bool> m_modifierTableWatcher;
|
||
|
||
//
|
||
// Job n:
|
||
//
|
||
|
||
|
||
|
||
};
|
||
|
||
} // namespace AdvancedSymbology
|
||
|
||
|