/** * @RDE_HEADER@ * Interface-Implementation of SymbolDictionaryImpl * $Id$ * $HeadURL$ * $Author$ */ #pragma once // Own #include // Our interface "SymbolDictionary" #include "esri_dictionary_processor.h" #include "advanced_symbology_logging.h" // Esri #include class QStandardItemModel; class QTimer; namespace SymbologyXML { class PixmapSymbolCache; } //---------------------------------------------------------------------------- /** * Support advanced Symbology (like APP6 and MIL2525). * Some extensions like injury/damage are added to standard and rendered to the final image. * It is related to SituationMap. * */ namespace AdvancedSymbology { class BaseSymbolModel; QStringList listOfEtsPointSidcs_Internal(); QStringList listOfPointSidcs_Internal(); QStringList listOfLineSidcs_Internal(); QStringList listOfAreaSidcs_Internal(); QStringList listOfPlanEditorSidcs_Internal(); /*! * \addtogroup AdvancedSymbology * @{ Handle the symbology based on MIL2525 and APP6 standard */ /** * @brief The SymbolDictionaryImpl class * * Current focus: Only access to the dictionary for generating images/icons * Wrapper to EsriSymbolDictionaryImpl */ class ADVANCED_SYMBOLOGY_EXPORT SymbolDictionaryImpl : public /*virtual*/ SymbolDictionary { Q_OBJECT public: /*! \name Construction, Destruction */ //@{ SymbolDictionaryImpl(SymbologyType symbologyType, const QString &symbologyResourcePath); virtual ~SymbolDictionaryImpl(); private: bool init(SymbologyType symbologyType, const QString &symbologyResourcePath); void connectSignals(); public: bool isOk() const override; void load() override; bool isLoaded() const override; bool isLoading() const { return m_isLoading; } LoadStatus loadStatus() const override; bool setEtsSymbol(int fileId, const QString &encodedSidc, const SymbolProperties &properties, const QImage &image) override; void removeEtsSymbol(int fileId) override; void removeEtsSymbol(const QString &encodedSidc) override; void clearEtsSymbols() override; int addEtsSymbols(const QString &path) override; int etsSymbolCount() const override; QStringList etsSymbols() const override; bool containsXmlSymbol(const QString &encodedSidc) const override; bool setXmlSymbol(int fileId, const QString &name, const QString &operatorName, qint64 lastModified, const QString &xmlSymbol, const SymbolProperties &properties) override; bool setXmlSymbol(int fileId, const QString &name, const QString &operatorName, qint64 lastModified, const SymbologyXML::Symbol &symbol, const SymbolProperties &properties) override; void removeXmlSymbol(int fileId) override; /**< Remove symbol from dictionary */ void removeXmlSymbol(const QString &encodedSidc) override; void clearXmlSymbols() override; void clearXmlSymbolCache() override; int xmlSymbolCount() const override; QStringList xmlSymbols() const override; QString xmlSidc(const QString &xmlSymbol) const override; QString xmlSidc(const SymbologyXML::Symbol &symbol) const override; SymbologyXML::Symbol xmlSymbol(const QString &encodedSidc) const override; SymbolProperties xmlSymbolProps(const QString &encodedSidc) const override; SymbolDictionaryImpl(const SymbolDictionaryImpl &other) = delete; SymbolDictionaryImpl &operator=(const SymbolDictionaryImpl &other) = delete; //@} SymbologyType symbologyType() const override; QString specificationType() const override; QString symbologyResourcePath() const override; int symbologySpecificCount() const override; const Esri::ArcGISRuntime::DictionarySymbolStyle *getEsriSymbolDictionary() const; static QImage temporaryImage(int sizeL = 100); static QImage notFoundImage(int sizeL = 100, const QColor &fillColor = QColor(255, 255, 0, 128)); static QSharedPointer notFoundSymbolResult(const SymbolDataToRender &symDataToRender); static QSharedPointer notFoundSymbolResult(int sizeL = 100); QStringList symbologyAttributeKeyList() const override; QStringList cachedBaseSymbolCodes() const override; SymbolProperties symbolProperties(const QString &baseSymbolCode) const override; bool searchResultIsValid(const QHash &key8LookupTable, const Esri::ArcGISRuntime::SymbolStyleSearchResult &resultItem, QString *toBeRemovedFromName = nullptr); QSharedPointer symbolPropertyImage(const SymbolProperties &symbolProperties, int sizeL = 100) const override; QSharedPointer symbolPropertyImage(QSharedPointer symResult, const SymbolProperties &symbolProperties, int sizeL = 100) const; /*! \name Render symbol: findImage, findPreview, findBaseSymbol*/ //@{ // for concrete symbols (with frame, modifier, injury..) QSharedPointer findImage(const SymbolDataToRender &symDataToRender) const override; // for concrete symbols (with frame) QSharedPointer findPreview(const QString &sidc, int sizeL = 100) const override; // for abstract object (just baseSymbol/Mainicon) QSharedPointer findBaseSymbol(const QString &sidc) const override; //@} /*! \name Fetch * Similar to findImage, except that fetchSymbol returns a different baseSymbolIcon for multiPoint sidcs. * In most cases you should prefer findImage, findPreview, findBaseSymbol */ //@{ QSharedPointer fetchSymbol(const QString &sidc, int sizeL = 100) const override; QSharedPointer fetchSymbol(const SymbolDataToRender &symDataToRender) const override; //@} QStringList symbolModifierKeys() const override; bool symbolModifierData(const QString &key, ModifierData &data) const override; QList symbolModifierList(SidcDefinitions::SymbolSet symbolSet, unsigned int modifierSector) const override; QList symbolModifierList(const QString &baseSymbolCode, unsigned int modifierSector) const override; bool insertXmlTestSymbol(const SymbolProperties &symbolProps) override; bool insertXmlComplexTestSymbol(const SymbolProperties &symbolProps) override; int count() const override; //------------------------------- // void createSidc(QString &sidc_inOut, // SymbolTypes::t_affil identity, // friend, neutral... // SymbolTypes::t_state state) const override // present, anticipated // {}; QString toString() const override; const EsriDictionaryProcessor *getEsriDictionaryProcessor() const { return m_esriDictionaryProcessor; } const SidcCodec::SidcHashTable baseSymbolCodeToSymbolPropertyTable() const { if (!m_esriDictionaryProcessor) return SidcCodec::SidcHashTable(); return m_esriDictionaryProcessor->baseSymbolCodeToSymbolPropertyTable(); } QStringList symbologyFieldNamesInternal() const; QStringList textFieldNamesInternal() const; BaseSymbolModel* getBaseSymbolModelEsri(); BaseSymbolModel* getBaseSymbolModelXML() { return m_xmlBaseSymbolModel; } const BaseSymbolModel* getBaseSymbolModelXML() const { return m_xmlBaseSymbolModel; } BaseSymbolModel* getBaseSymbolModelEts() { return m_etsBaseSymbolModel; } const BaseSymbolModel* getBaseSymbolModelEts() const { return m_etsBaseSymbolModel; } protected Q_SLOTS: void onErrorDictionary(const Esri::ArcGISRuntime::Error &error); void onLoadStatusChanged(Esri::ArcGISRuntime::LoadStatus loadStatus); void onProcessorAllIsDone(); void onFetchSymbolCompleted(QUuid fsTaskId, Esri::ArcGISRuntime::Symbol *symbol); void onSwatchCompleted(const QUuid &csTaskId, const QImage &image); private: Esri::ArcGISRuntime::DictionarySymbolStyle *m_esri_dictionary = nullptr; protected: bool m_initOk; // ESRI data: QString m_specificationType; SymbologyType m_symbolDictionaryType_own = SymbologyType::MIL2525C; QString m_symbologyResourcePath; // // OWN data: // createSwatch-Uuid -> findSymbol-Uuid QMap m_createSwatch2findSymbolTaskId; // searchSymbol-Uuid -> propertyResult mutable QMap> m_findSymbol2propertyResult; // findSymbol-Uuid -> symbolResult mutable QMap> m_findSymbol2symbolResult; // QStringList m_sidcList; // QList m_symbolProperties; // QHash m_sidcToSymbolProperties; EsriDictionaryProcessor *m_esriDictionaryProcessor = nullptr; SidcCodec::SidcHashTable m_baseSymbolCodeToSymbolPropertyTable; // just a copy // to extent the esriDict by own entries : SidcCodec::SidcHashTable m_etsSidcSymbolProperties; SidcCodec::SidcHashTable m_etsSidcImages; QStringList m_etsSidcOrdered; SidcCodec::SidcHashTable m_xmlSidcSymbolProperties; SidcCodec::SidcHashTable m_xmlSymbols; QSharedPointer m_xmlSymbolCache; // : to extent the esriDict by own entries // EsriSymbols: BaseSymbolModel *m_esriBaseSymbolModel = nullptr; // XML: BaseSymbolModel *m_xmlBaseSymbolModel = nullptr; // Ets: BaseSymbolModel *m_etsBaseSymbolModel = nullptr; QTimer *m_changedDelayTimer; bool m_isLoading; LOGGER_T m_logger; ///< Interface of the Logging-Facility }; QImage renderExtensions(QImage &coreImage, const SymbolDataToRender &symbolDataToRender, const QColor &colorToBeReplaced, bool renderJustCoreImage = false); QImage renderXML_Symbol(const QSharedPointer &xmlSymbolCache, const SidcCodec::SidcHashTable &xmlSymbols, const SymbolDataToRender &symbolDataToRender, bool renderJustCoreImage = false); } // namespace AdvancedSymbology