/** * @RDE_HEADER@ * HMI Plugin for Exercisemanagemt (Interface for access from other Plugins) * $Id$ * $HeadURL$ * $Author$ * Created by Patric Karwat, SLSE, 2016-02-29 */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace LtsWidgets { class LtsDialog; } namespace SituationMap { enum class MapMode { Undefined, MapMode_2D, MapMode_3D }; /*! \brief Define different line pattern. */ enum class MapLinePattern { Dash, DashDot, DashDotDot, Dot, Null, Solid }; /*! \brief Define different fill pattern. */ enum class MapFillPattern { BackwardDiagonal, // / Cross, DiagonalCross, ForwardDiagonal, // '\' Horizontal, Null, Solid, Vertical }; class Map; class ForeignGuiInterface : public TopicReplay::Factory, public TopicEditorBase::Interface { public: /*! \name Construction, Destruction */ //@{ ForeignGuiInterface() = default; virtual ~ForeignGuiInterface() = default; //@} //interface functions virtual bool clearObjects() = 0; /*! \name map... */ //@{ virtual LtsWidgets::LtsDialog *createMapDialog(QWidget *parent) = 0; virtual QPointer map() const = 0; virtual void setMapUpdatesEnabled(bool bEnabled) = 0; virtual bool isMapReady() const = 0; virtual bool setMapReadyCallback(QObject *context, const std::function &mapReadyCallback) = 0; // mapReady && isSymbolDictionaryLoaded virtual MapMode mapMode() const = 0; virtual bool reInitToSystemDefault() = 0; virtual bool forceUpdate() = 0; //@} /*! \name ResourceManagerMode (RMM_PlanActivityView|RMM_PlanDefinitionView|RMM_ComponentMonitor) ... */ //@{ virtual ResourceManagerMode resourceManagerMode() const = 0; virtual bool setResourceManagerMode(ResourceManagerMode rmm) = 0; virtual bool setResourceManagerModeChangedCallback(QObject *context, const std::function &cb) = 0; //@} /*! \name center map / zoomTo*/ //@{ virtual QPointF centerPoint() const = 0; virtual void setCenterPoint(const QPointF ¢er, double scale = -1.0, float durationSeconds = -1.0) = 0; virtual void centerMapToParticipant(int participantId) = 0; virtual void centerMapToAesObject(int entityId) = 0; virtual void centerMapToBuildingObject(int entityId) = 0; virtual void centerMapToGuezIedObject(int entityId) = 0; virtual void centerMapToChargeEffectObject(int entityId) = 0; // more general approach: virtual void centerMapToMapObject(MapObjectType mot, int entityId) = 0; virtual void zoomMapTo(const QVector> &entities, int paddingInDIPS = 100) = 0; //@} /*! \name Object Indicator */ //@{ /*! * \brief objectIndicatorToParticipant * \param participantId obj to point to * \param setSelected set selecttion of obj to point to * \param lifetimeMsec lifetime of indicator, 0 and less -> infinite * \return true on success, otherwise false */ virtual bool objectIndicatorToParticipant(int participantId, bool setSelected = false, int lifetimeMsec = -1) = 0; virtual bool objectIndicatorToAesObject(int entityId) = 0; virtual bool objectIndicatorToBuildingObject(int entityId) = 0; virtual bool objectIndicatorToGuezIedObject(int entityId) = 0; // more general approach: virtual bool objectIndicatorToMapObject(MapObjectType mot, int entityId, bool setSelected = false, int lifetimeMsec = -1) = 0; virtual bool objectIndicatorToPoint(const QPointF &targetGeo, int lifetimeMsec = -1) = 0; virtual bool removeObjectIndicator() = 0; //@} /*! \name Object Selection */ //@{ struct MapObjectTypeEntityId { MapObjectTypeEntityId(MapObjectType _mot, const QVector &_entityIds) : mot(_mot), entityIds(_entityIds) {} MapObjectType mot; QVector entityIds; }; virtual bool openMapObjectSelection(MapObjectType mot, const QVector &entityIds) = 0; virtual bool openMapObjectSelection(const QVector &mapObjectTypeEntityIdPairs) = 0; virtual bool setMapObjectSelected(MapObjectType mot, const QVector &entityIds, bool selection = true) = 0; virtual bool clearMapObjectSelection(MapObjectType mot = MapObjectType::MOT_Undefined) = 0; //@} /*! \name Participant */ //@{ virtual void enableMovementTrack(int participantId, bool enable) = 0; virtual bool isMovementTrackEnabled(int participantId) = 0; virtual bool setMovementTrackCallback(QObject *context, const std::function &activeSimIds)> &movementTrackCallback) = 0; // virtual void enableGearRanges(int participantId, bool enable) = 0; virtual bool isGearRangesEnabled(int participantId) = 0; virtual bool enableFireEventFlashing(bool enable) = 0; virtual bool isFireEventFlashingEnabled() const = 0; //@} /*! \name Rubberband */ //@{ virtual bool getCoordinate(QObject *objectToInform, const char *replySlot, const char *errorSlot) = 0; virtual QVector getParallelTranslation(const QVector &line, double distance, bool &angleFault) = 0; virtual bool getCorridor(QObject *objectToInform , const char *replySlot , const char *errorSlot , double widthMin , double widthMax , double maxSegmentLength , int maxSegmentCount , bool centerLine , const QVector &segments , double width) = 0; virtual bool getCircle(QObject *objectToInform , const char *replySlot , const char *errorSlot , double radiusMin , double radiusMax , const QPointF ¢er = QPointF() , double initialRadius = 0.0) = 0; virtual bool getCircleSectorFixRadius(QObject *objectToInform , const char *replySlot , const char *errorSlot , double radius , const QPointF ¢er = QPointF() , double openingAngle = 90.0 , double rotationDegNorth = 0.0) = 0; virtual bool getCircleSector(QObject *objectToInform , const char *replySlot , const char *errorSlot , double radiusInitial, double radiusMin, double radiusMax , const QPointF ¢er = QPointF() , double openingAngle = 90.0 , double rotationDegNorth = 0.0) = 0; virtual bool getTwoCircleSector(QObject *objectToInform , const char *replySlot , const char *errorSlot , double radius1Initial, double radius1Min, double radius1Max , double radius2Initial, double radius2Min, double radius2Max , const QPointF ¢er = QPointF() , double openingAngle = 90.0 , double rotationDegNorth = 0.0) = 0; virtual bool getRectangle(QObject *objectToInform , const char *replySlot , const char *errorSlot , double widthMin , double widthMax , double heightMin , double heightMax , const QPointF &bottomLeft = QPointF() , double width = 0.0 , double height = 0.0 , double angleNorth = 0.0) = 0; virtual bool getRectangleNorth(QObject *objectToInform , const char *replySlot , const char *errorSlot , double widthMin , double widthMax , double heightMin , double heightMax , const QPointF ¢er = QPointF() , double width = 0.0 , double height = 0.0) = 0; virtual bool getPolygon(QObject *objectToInform, const char *replySlot, const char *errorSlot, unsigned int minPoints = 0, unsigned int maxPoints = 0, double minSegmentLength = -1.0, double maxSegmentLength = -1.0, const QPolygonF &coordinates = QPolygonF()) = 0; virtual bool getPolyline(QObject *objectToInform, const char *replySlot, const char *errorSlot, unsigned int minPoints = 0, unsigned int maxPoints = 0, double minSegmentLength = -1.0, double maxSegmentLength = -1.0, const QPolygonF &coordinates = QPolygonF()) = 0; virtual void cancelActiveRubberbands() = 0; virtual bool displayPreviewObject(QObject *parent, const QPolygonF &poly, bool closed) = 0; virtual bool displayPreviewObjects(QObject *parent, const QVector &polyVec, bool closed) = 0; virtual bool displayPreviewObject(QObject *parent, const QPointF ¢erGeo, double radius) = 0; virtual bool displayPreviewObjects(QObject *parent, const QVector ¢erGeoVec, double radiusd) = 0; virtual bool displayPreviewObject(QObject *parent, const QPointF ¢erPoint, double radius, double rotation, double openAngle) = 0; // introduced for CollateralDamage: struct PreviewCircleData { // geometry QPointF centerGeo; double radius{100.0}; //meter // line MapLinePattern linePattern{MapLinePattern::Solid}; QColor lineColor{Qt::black}; int lineWidth{2}; // fill MapFillPattern fillPattern{MapFillPattern::Solid}; QColor fillColor{Qt::gray}; }; virtual bool displayPreviewObjects(QObject *parent, const QVector &previewCirclesAscending) = 0; virtual bool removePreviewObject() = 0; //@} /*! \name Object Selection: single or list*/ // Useful for assignment of MountingPoints at resourceApp of ISM //@{ virtual bool skipMapObjectSelectionDialog() const = 0; virtual void setSkipMapObjectSelectionDialog(bool skip) = 0; // virtual void //@} /*! \name Tools... */ //@{ virtual void startMeasureLength() = 0; virtual void clearMeasureLength() = 0; virtual void startTerrainProfile() = 0; virtual void clearTerrainProfile() = 0; virtual void startViewshed() = 0; virtual void clearViewshed() = 0; //@} /*! \name EmergencyCalls ... */ //@{ virtual bool showExpiredEmergencyCalls(bool showExpired) = 0; //@} /*! \name OC situation range... */ //@{ struct ocSituationRangeAttributes { QColor lineColor; ///< invalid by default -> black or participant color will be used double opacity = -1.0; ///< range: 0.0 ... 1.0; neg. value -> no fill int lineWidth = 2; ocSituationRangeAttributes() {} }; virtual bool ocSituationRange_create(const QPointF &origin_lonLatRadiant, double radius_meter, const ocSituationRangeAttributes &attributes = ocSituationRangeAttributes()) = 0; // default color -> black virtual bool ocSituationRange_create(int participantId, double radius_meter, const ocSituationRangeAttributes &attributes = ocSituationRangeAttributes()) = 0; // default color -> partyColor virtual bool ocSituationRange_show(bool visible) = 0; virtual bool ocSituationRange_remove() = 0; //@} /*! \name ESC order position... */ //@{ struct escOrderPositionAttributes { QColor lineColor; ///< invalid by default -> black or participant color will be used double opacity = -1.0; ///< range: 0.0 ... 1.0; neg. value -> no fill int lineWidth = 2; escOrderPositionAttributes() {} }; virtual bool escOrderPosition_create(const QPointF &origin_lonLatRadiant, int areaWidth, int areaDepth, int rotation, bool is_smoke, const escOrderPositionAttributes &attributes = escOrderPositionAttributes()) = 0; // default color -> black virtual bool escOrderPosition_show(bool visible) = 0; virtual bool escOrderPosition_remove() = 0; virtual bool isEscOrderPositionVisible() = 0; //@} /*! \name OperatorMapSetting */ //@{ virtual bool setInitialOperatorMapSettings(const QByteArray &data) = 0; virtual bool setInitialOperatorMapSettings(const QJsonValue &data) = 0; virtual QByteArray operatorMapSettingsJson() const = 0; virtual bool setOperatorMapSettingsJson(const QByteArray &data) = 0; virtual QJsonValue operatorMapSettings() const = 0; virtual bool setOperatorMapSettings(const QJsonValue &data) = 0; //@} /*! \name MovementTrackManager */ //@{ virtual QByteArray movementTrackManagerSettingsJson() const = 0; virtual bool setMovementTrackManagerSettingsJSon(const QByteArray &data) = 0; virtual QJsonObject movementTrackManagerSettings() const = 0; virtual bool setMovementTrackManagerSettings(const QJsonValue &data) = 0; //@} /*! \name Handle plan overlays */ //@{ /*! * Provides a list of all plan overlay id's. The list is sorted in display order from bottom to top. */ virtual QList planOverlayList() const = 0; virtual QList planOverlayIdsFromOperatorMapSettings(const QJsonValue &data) const = 0; /*! * Returns the XML reperesentation of the plan with id \c id. In case of error the provides string is empty. */ virtual QByteArray planOverlayContent(int id) const = 0; /*! * Set a new plan overlay to situationmap, or update if it already exists * @param id Id of plan used to store plan in file mamagement service * @param name name of plan * @param xmlContent Content of plan coded as XML string */ virtual bool planOverlaySetContent(int id, const QString &name, const QByteArray &xmlContent, bool isSnapshot = false) = 0; virtual bool planOverlayRemove(int id) = 0; virtual void planOverlayChangeOrder(const QVector &orderOfIds) = 0; virtual double planOverlayMinScale(int id) = 0; virtual double planOverlayMaxScale(int id) = 0; virtual bool planOverlayVisibility(int id) = 0; virtual double planOverlayOpacity(int id) = 0; virtual void setPlanOverlayOpacity(int id, double opacity) = 0; virtual void setPlanOverlayMinScale(int id, double minScale) = 0; virtual void setPlanOverlayMaxScale(int id, double maxScale) = 0; virtual void setPlanOverlayVisibility(int id, bool on) = 0; virtual double getCurrentMapScale() const = 0; //@} /*! \name Image... */ //@{ virtual bool toImage(QObject *context, const std::function &imageCompletedCallback) = 0; //@} virtual void showExerciseTimeString(bool visible = false) = 0; }; class SitMapUpdatesEnabledHelper { public: explicit inline SitMapUpdatesEnabledHelper(const std::shared_ptr &sitMapPtr) : m_sitMapPtr(sitMapPtr) { if (m_sitMapPtr) m_sitMapPtr->setMapUpdatesEnabled(false); } inline ~SitMapUpdatesEnabledHelper() { if (m_sitMapPtr) m_sitMapPtr->setMapUpdatesEnabled(true); } private: std::shared_ptr m_sitMapPtr; }; } // namespace SituationMap