Files
qt5-legatus-legacy/Lts/Viewer/SituationMap/Map/layer_factory.h
T
2026-08-13 18:33:10 +02:00

441 lines
15 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Interface for LayerFactory (Construction of MapObjects)
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Own
#include "situation_map_types.h"
#include <Common/situation_map_logging.h>
#include <arcgis/arcgisversion.h> // This file is created by RME, not ESRI
// Qt
//----------------------------------------------------------------------------
namespace SituationMap
{
class Map;
class LayerParameter;
class LocationToElevationHelper;
/**
* @brief The LayerFactory manages logical layer.
* Each logical layer is composed of one or more technical layers. If requested from instances of
* AbstractMapObject the associated technical layers are created on demand. This approachs is
* choosen to reduce the number of layers and to avoid empty layer.
* (It is thinkable to merge different logical layers to one technical layer.)
*
* \section LayerTypeOverview LayerType and logical respectively technical layernames
| Usage | LayerType | Logical layername | Technical layername |
| :--------------| : ----------| : ---------------------- | : ------------------------------------ |
| Map | Basemap | ArcGISTiled... | e.g. ArcGISTiledMapService |
| JumpPoints | JumpPoint | "JumpPoints" | GraphicsLayer |
| Overlays | Overlay | Overlay_... | GraphicsLayer and/or MessageGroupLayer |
| Participants | Operational | e.g AES, Participants | GraphicsLayer and/or MessageGroupLayer |
| Viewshed | Tools | "Tools" | GraphicsLayer and/or MessageGroupLayer |
| Rubberband | Rubberband | "RubberbandLayer" | GraphicsLayer and/or MessageGroupLayer |
* \sa LayerType
* \n
* \section HowToDifferentiateBasemaps How to differentiate different basemaps
* The basemaps are typically initialized using a list of urls and the required SymbologyType.
* The urls are added to the map, whereat the first layer/url is setting the projection.
* \n\n The \b access to layers (basemap as well as operational layers) is done using a string called \b layername.
* \n All basemaps have a common prefix: 'basemapLayernamePrefix', which can be accessed/modified using basemapLayernamePrefix() / setBasemapLayernamePrefix().
* \n The final layername has a continuous number, starting with zero (0): 'basemapLayernamePrefix\%number'
* \n
* \n E.g: mapServiceUrlList = "url0,url1" will lead to:
| # url | pattern | concrete layername |
| :------| : ----------------------- | : --------------------------------- |
| url0 | basemapLayernamePrefix%0 | "ArcGISTiledLayer_URL_0" |
| url1 | basemapLayernamePrefix%1 | "ArcGISTiledLayer_URL_1" |
*/
class LayerFactory
{
public:
/*! \name Construction, Destruction */
//@{
LayerFactory() = default; ///< Constructor
virtual ~LayerFactory() = default; ///< Destructor
//@}
/*! \name Initializing of Basemap Layer
* \ref HowToDifferentiateBasemaps
*/
//@{
/**
* @brief initializeBasemapBuiltIn is for Demos only! (alternative to initializeBasemaps).
* @param tpkFile file to be used.
* @return True on success, otherwise false.
* @note only for special cases.
*/
virtual bool initializeBasemapBuiltIn(const QString &tpkFile) = 0;
virtual bool isUsingBaseMapBuiltIn() const = 0;
/**
* @brief Get basemapLayernamePrefix to construct the layername of the basemaps.
* @return basemapLayernamePrefix
* default: 'ArcGISTiledMapServiceLayer_URL_' (first basemap -> 'ArcGISTiledMapServiceLayer_URL_0')
* @see\ref HowToDifferentiateBasemaps
*/
virtual QString basemapLayernamePrefix() const = 0;
/**
* @brief Set basemapLayernamePrefix
* @param basemapLayernamePrefix to be set.
* @see\ref HowToDifferentiateBasemaps
*/
virtual void setBasemapLayernamePrefix(const QString &basemapLayernamePrefix) = 0;
/**
* @brief Get prefix/name for participant layer
* @return participant layername
*/
virtual QString participantLayername() const = 0;
/**
* @brief Get RenderingMode for participant layer
* @return RenderingMode for participants
*/
virtual RenderingMode participantLayerRenderingMode() const = 0;
/**
* @brief Get SurfacePlacement for participant layer
* @return SurfacePlacement for participants
*/
virtual SurfacePlacement participantLayerSurfacePlacement() const = 0;
/**
* @brief Set ParticipantLayername: layername, RenderingMode and SurfacePlacement
* @param participantLayername like ('Participants:Dynamic:Relative')
*/
/**
* @brief Set ParticipantLayername: layername, RenderingMode and SurfacePlacement
* @param participantLayername like ('Participants:Dynamic:Relative')
* @param renderingMode mode to be used
* @param surfacePlacement placement to be used
*/
virtual void setParticipantLayer(const QString &participantLayername,
RenderingMode renderingMode,
SurfacePlacement surfacePlacement) = 0;
/**
* @brief addBasemap will add a basemap upon the topmost basemap.
* @param layername layer name to be used.
* @param mapServiceUrl to be added
* @param basemapType to be added
* @param displayName to be used.
* @param description to be used.
* @param previewImage to be used.
* @return True on success, otherwise false.
* @sa initializeBasemaps
*/
virtual bool addBasemap(const QString &layername,
const QUrl &mapServiceUrl,
const BasemapType basemapType,
const double minScale = -1,
const double maxScale = -1,
const QString &displayName = QString(),
const QString &description = QString(),
const QImage &previewImage = QImage()) = 0;
/**
* @brief Remove a basemap.
* @param layername to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeBasemap(const QString &layername) = 0;
//@}
/*! \name Scene Object Layer */
//@{
// virtual bool initializeSceneObjectLayers(const QStringList &sceneObjectServiceUrls) = 0;
virtual bool addSceneObjectLayer(const QString &layername,
const QUrl &sceneLayerServiceUrl,
const double altitudeOffset = 0,
const QString &displayName = QString(),
const QString &description = QString(),
const QImage &previewImage = QImage()) = 0;
virtual bool isSceneObjectLayerVisible() const = 0;
virtual void setSceneObjectLayerVisible(bool visible) = 0;
//@}
/*! \name Elevation */
//@{
virtual bool initializeElevationSources(const QStringList &sceneElevationServiceUrls) = 0;
//@}
/*! \name Initializing of Operational Layer*/
//@{
/**
* @brief Add an operational layer
* @param layerName to add
* @param displayName to use
* @return True on success, otherwise false.
*/
virtual bool addOperationalLayer(const QString &layerName,
const QString &displayName,
RenderingMode renderMode = RenderingMode::Dynamic,
SurfacePlacement surfacePlacement = SurfacePlacement::Relative) = 0;
/**
* @brief Remove an operational layer.
* @param layername to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeOperationalLayer(const QString &layername) = 0;
/**
* @brief Check if OperationalLayer exists
* @param layername to be checked
* @return True on success, otherwise false.
*/
virtual bool hasOperationalLayer(const QString &layername) const = 0;
//@}
/**
* @brief Add an OverlayLayer to map.
* @param logicalLayerName to add
* @param displayName to use
* @return True on success, otherwise false.
*/
virtual bool addOverlayLayer(const QString &logicalLayerName,
const QString &displayName,
bool isSnapshot = false) = 0;
/**
* @brief Remove an OverlayLayer.
* @param layername to be removed.
* @return True on success, otherwise false.
*/
virtual bool removeOverlayLayer(const QString &logicalLayerName) = 0;
virtual QString snapshotOverlayLayername() const = 0;
virtual QString toolLayer() = 0; ///< Mame of tool layer.
virtual QString layernameForCubes() const = 0;
virtual void setLayernameForCubes(const QString &logicalName) = 0;
virtual bool hasLayernameForCubes() const = 0;
/**
* @brief assignUniqueValueRendererForCubes (displaying the building ownership)
* @param logicalName where the renderer should be assigned to
* @return True on success, otherwise false.
*/
virtual bool assignUniqueValueRendererForCubes() = 0;
struct UniqueValueData
{
QString label; // more or less optional
QString value; // concrete value like 'Partyname_Red'
QImage img;
};
virtual bool assignUniqueValueRenderer(const QString &layername,
const QString &fieldName,
const QVector<UniqueValueData> &uvDataCont) = 0;
// For BoobyTraps
struct UniqueValueDataAesCentral
{
QString label; // more or less optional
QVariantList values; // concrete values like 'Partyname_Red'
enum class TYPE {SPHERE, CONE};
TYPE type{TYPE::SPHERE};
QColor col;
float radius{1.0};
float height{1.0};
};
static QString toString(UniqueValueDataAesCentral::TYPE _type)
{
switch (_type) {
case UniqueValueDataAesCentral::TYPE::SPHERE:
return QStringLiteral("SPHERE");
break;
case UniqueValueDataAesCentral::TYPE::CONE:
return QStringLiteral("CONE");
break;
default:
break;
}
return QStringLiteral("UniqueValueDataAesCentral::TYPE::error");
}
virtual bool assignUniqueValueRendererAesCentral(const QString &layername,
const QStringList &fieldNames,
const QVector<UniqueValueDataAesCentral> &uvDataCont) = 0;
// For Areas (AreaEffect)
virtual bool assignUniqueValueRendererAesCentral3DExtrusion(const QString &layername,
const QStringList &fieldNames,
const QVector<UniqueValueDataAesCentral> &uvDataCont) = 0;
/**
* @brief Initialize layer - only for UnitTests.
* @return True on success, otherwise false.
*/
virtual bool initializeUnitTestLayer() = 0;
/*! \name Map access */
//@{
virtual Map *map() const = 0;
//@}
/*! \name Layer access */
//@{
virtual int count() const = 0; ///< Number of layers
virtual QStringList layernames() const = 0; ///< List of layernames (basemap, operational, rubberband....
virtual QStringList layernames(const LayerType &layerType) const = 0; ///< List of layernames (basemap | operational | rubberband....)
/**
* @brief rubberbandLayer get rubberbandlayer
* @return rubberbandlayer
*/
virtual QString rubberbandLayer() const = 0;
/*! \name EmergencyCall (at least relevant for GUEZ) */
//@{
virtual QString emergencyCallLayer(bool getJustTheName = false) = 0;
virtual bool emergencyCallLayerExists() const = 0;
virtual bool switchEmergencyCallLayerOn() = 0; // usefull for Live
virtual bool switchEmergencyCallLayerOff() = 0; // usefull for Replay
//@}
/**
* @brief Check new LayerOrder
* @param orderedLayernames to be checked
* @return True on success, otherwise false.
*/
virtual bool checkLayerOrder(const QStringList &orderedLayernames) = 0;
/**
* @brief Provide new order of layers. Attention: All LayerType::Basemap are below other types.
* @param orderedLayernames new order
* @return True on success, otherwise false.
*/
virtual bool orderLayerTo(const QStringList &orderedLayernames) = 0;
/**
* @brief Get the LayerType of a logical layer.
* @param layername requested layername.
* @return LayerType of logical layer.
*/
virtual LayerType layerType(const QString &layername) const = 0;
/**
* @brief Get the LayerParameter of a logical layer.
* @param layername requested layername.
* @return LayerParameter of logical layer.
*/
virtual LayerParameter layerParameter(const QString &layername) const = 0;
/**
* @brief Set the LayerParameter of a logical layer.
* @param layername requested layername.
* @param layerParameter to be set.
* @return True on success, otherwise false.
*/
virtual bool setLayerParameter(const QString &layername, const LayerParameter &layerParameter) = 0;
/**
* @brief Set the layer parameter contrast of all logical layer from given layer type.
* @param layerType requested layer type.
* @param opacity to be set. value range: 0..100; 100 everything is visible
* @return True on success, otherwise false.
*/
virtual bool setLayerOpacity(LayerType layerType, int opacity) = 0;
/**
* @brief Set the layer parameter brightness of all logical layer from given layer type.
* @param layerType requested layer type.
* @param brightness to be set. value range: -100..100
* @return True on success, otherwise false.
*/
virtual bool setLayerBrightness(LayerType layerType, int brightness) = 0;
/**
* @brief Set the layer parameter contrast of all logical layer from given layer type.
* @param layerType requested layer type.
* @param contrast to be set. value range: -100..100
* @return True on success, otherwise false.
*/
virtual bool setLayerContrast(LayerType layerType, int contrast) = 0;
/**
* @brief Set the layer parameter gamma of all logical layer from given layer type.
* @param layerType requested layer type.
* @param gamma to be set.
* @return True on success, otherwise false.
*/
virtual bool setLayerGamma(LayerType layerType, int gamma) = 0;
/**
* @brief Set the layers of the given type(s) visible or invisible
* @param layerTypes layer types to be modified
* @param visbile set visible (true) or hidden (false).
*/
virtual void setLayersVisible(const QVector<LayerType> &layerTypes, bool visible) = 0;
//@}
#if ACRGIS_VERSION < 0x640500 // 100.5.0 / Update 5
// deprecated in V100.5, replaced by GeoView::setSelectionProperties()
/*! \name Selection */
//@{
virtual QColor selectionColor() const = 0; ///< Get current selectionColor.
/**
* @brief Set selectionColor.
* @param selectionColor value to be set.
*/
virtual void setSelectionColor(const QColor &selectionColor) = 0;
//@}
#endif // ACRGIS_VERSION
/*! \name Elevation */
//@{
virtual bool elevationAvailable() const = 0;
virtual QPointer<LocationToElevationHelper> locationToElevation() const = 0;
//@}
};
} // namespace SituationMap
//----------------------------------------------------------------------------