From 05c2790f46ad3e636a9efde9778f27e748bade80 Mon Sep 17 00:00:00 2001 From: Valentin Platzgummer Date: Mon, 1 Jul 2019 18:53:24 +0200 Subject: [PATCH] adding --- qgroundcontrol.pro | 17 ++- src/Wima/WimaArea.cc | 2 +- src/Wima/WimaArea.h | 2 +- src/Wima/WimaAreaData.cc | 77 +++++++++++ src/Wima/WimaAreaData.h | 32 +++++ src/Wima/WimaController.cc | 7 +- src/Wima/WimaController.h | 10 +- src/Wima/WimaCorridor.cc | 63 +++++++++ src/Wima/WimaCorridor.h | 41 ++++++ src/Wima/WimaCorridorData.cpp | 25 ++++ src/Wima/WimaCorridorData.h | 22 ++++ src/Wima/WimaDataContainer.cc | 4 +- src/Wima/WimaDataContainer.h | 20 +-- src/Wima/WimaGOperationArea.h | 87 ------------- src/Wima/WimaMeasurementArea.cc | 134 +++++++++++++++++++- src/Wima/WimaMeasurementArea.h | 85 ++++++++++++- src/Wima/WimaMeasurementAreaData.h | 31 +++++ src/Wima/WimaMeasurementAreaDataareadata.cc | 6 + src/Wima/WimaPlaner.cc | 14 +- src/Wima/WimaPlaner.h | 11 +- src/Wima/WimaServiceAreaData.cc | 77 +++++++++++ src/Wima/WimaServiceAreaData.h | 33 +++++ src/Wima/WimaVCorridor.cc | 57 --------- src/Wima/WimaVCorridor.h | 43 ------- 24 files changed, 661 insertions(+), 239 deletions(-) create mode 100644 src/Wima/WimaAreaData.cc create mode 100644 src/Wima/WimaAreaData.h create mode 100644 src/Wima/WimaCorridor.cc create mode 100644 src/Wima/WimaCorridor.h create mode 100644 src/Wima/WimaCorridorData.cpp create mode 100644 src/Wima/WimaCorridorData.h delete mode 100644 src/Wima/WimaGOperationArea.h create mode 100644 src/Wima/WimaMeasurementAreaData.h create mode 100644 src/Wima/WimaMeasurementAreaDataareadata.cc create mode 100644 src/Wima/WimaServiceAreaData.cc create mode 100644 src/Wima/WimaServiceAreaData.h delete mode 100644 src/Wima/WimaVCorridor.cc delete mode 100644 src/Wima/WimaVCorridor.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 4ad851969..e930bb831 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -408,16 +408,19 @@ HEADERS += \ src/comm/MavlinkMessagesTimer.h \ src/GPS/Drivers/src/base_station.h \ src/Wima/WimaArea.h \ - src/Wima/WimaGOperationArea.h \ src/Wima/WimaServiceArea.h \ - src/Wima/WimaVCorridor.h \ src/Wima/WimaTrackerPolyline.h \ src/Wima/WimaController.h \ src/Wima/WimaVehicle.h \ src/Wima/WimaDataContainer.h \ src/Wima/WimaPlaner.h \ src/Wima/WimaPlaner.h \ - src/Wima/WimaMeasurementArea.h + src/Wima/WimaMeasurementArea.h \ + src/Wima/WimaCorridor.h \ + src/Wima/WimaAreaData.h \ + src/Wima/WimaServiceAreaData.h \ + src/Wima/WimaCorridorData.h \ + src/Wima/WimaMeasurementAreaData.h SOURCES += \ src/api/QGCCorePlugin.cc \ src/api/QGCOptions.cc \ @@ -426,13 +429,17 @@ SOURCES += \ src/comm/MavlinkMessagesTimer.cc \ src/Wima/WimaArea.cc \ src/Wima/WimaServiceArea.cc \ - src/Wima/WimaVCorridor.cc \ src/Wima/WimaTrackerPolyline.cc \ src/Wima/WimaController.cc \ src/Wima/WimaVehicle.cc \ src/Wima/WimaDataContainer.cc \ src/Wima/WimaPlaner.cc \ - src/Wima/WimaMeasurementArea.cc + src/Wima/WimaMeasurementArea.cc \ + src/Wima/WimaCorridor.cc \ + src/Wima/WimaAreaData.cc \ + src/Wima/WimaServiceAreaData.cc \ + src/Wima/WimaCorridorData.cpp \ + src/Wima/WimaMeasurementAreaDataareadata.cc # # Unit Test specific configuration goes here (requires full debug build with all plugins) diff --git a/src/Wima/WimaArea.cc b/src/Wima/WimaArea.cc index 20f7505f1..835e46556 100644 --- a/src/Wima/WimaArea.cc +++ b/src/Wima/WimaArea.cc @@ -677,7 +677,7 @@ bool WimaArea::loadFromJson(const QJsonObject &json, QString& errorString) void WimaArea::update(const WimaArea &area) { this->QGCMapPolygon::update(area); - this->setMaxAltitude(area.maxAltitude());displays + this->setMaxAltitude(area.maxAltitude()); } /*! diff --git a/src/Wima/WimaArea.h b/src/Wima/WimaArea.h index 2a554d7be..6ab10f3ed 100644 --- a/src/Wima/WimaArea.h +++ b/src/Wima/WimaArea.h @@ -80,7 +80,7 @@ public: static bool dijkstraPath (const QGeoCoordinate& c1, const QGeoCoordinate& c2, const WimaArea& area, QList& dijkstraPath); /// @return true if the polygon is self intersecting - static bool isSelfIntersecting (const WimaArea& area); + static bool isSelfIntersectin contrast to \c WimaAreaing (const WimaArea& area); bool isSelfIntersecting (); // Friends diff --git a/src/Wima/WimaAreaData.cc b/src/Wima/WimaAreaData.cc new file mode 100644 index 000000000..9498e8a4e --- /dev/null +++ b/src/Wima/WimaAreaData.cc @@ -0,0 +1,77 @@ +#include "WimaAreaData.h" + +WimaAreaData::WimaAreaData(QObject *parent) : QObject(parent) +{ + _maxAltitude = 0; +} + +WimaAreaData::WimaAreaData(WimaAreaData &other, QObject *parent) + : QObject (parent) + , _maxAltitude(other.maxAltitude()) +{ + setPath(other.path()); +} + +/*! + * \fn double WimaAreaData::maxAltitude() + * + * Returns the maximum altitude at which vehicles are allowed to fly. + */ +double WimaAreaData::maxAltitude() const +{ + return _maxAltitude; +} + +/*! + * \fn double WimaAreaData::maxAltitude() + * + * Returns the path (vertex list defining the \l {Simple Polygon}). + */ +const QList &WimaAreaData::path() const +{ + return _path; +} + +/*! + * \fn void WimaAreaData::setMaxAltitude(double maxAltitude) + * + * Sets the maximum altitude member to \a maxAltitude and emits the \c maxAltitudeChanged() signal if + * \a maxAltitude differs from the members value. + */ +void WimaAreaData::setMaxAltitude(double maxAltitude) +{ + if ( !qFuzzyCompare(_maxAltitude, maxAltitude) ) { + _maxAltitude = maxAltitude; + + emit maxAltitudeChanged(_maxAltitude); + } +} + +/*! + * \fn void WimaAreaData::setPath(const QList &coordinateList) + * + * Sets the path member to \a coordinateList by copying all entries of \a coordinateList. + * Emits the \c pathChanged() signal. + */ +void WimaAreaData::setPath(const QList &coordinateList) +{ + _path.clear(); + + // copy all coordinates to _path + for(int i = 0; i < coordinateList.size(); i++) { + _path.append(coordinateList.value(i)); + } + + emit pathChanged(_path); +} + +/*! + * \class WimaArea::WimaAreaData + * \brief Class to store and exchange data of a \c WimaArea Object. + * Class to store and exchange data of a \c WimaArea Object. In contrast to \c WimaArea this class + * does not provied any interface to a grafical user interface, neiter it uses the QGC Fact System. + * It is designed to exchange data between the \c WimaPlaner and the \c WimaController class. And it + * is the base class for any derived data objects + * + * \sa WimaArea + */ diff --git a/src/Wima/WimaAreaData.h b/src/Wima/WimaAreaData.h new file mode 100644 index 000000000..22916740d --- /dev/null +++ b/src/Wima/WimaAreaData.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "QGeoCoordinate" + +class WimaAreaData : public QObject +{ + Q_OBJECT + +public: + explicit WimaAreaData(QObject *parent = nullptr); + explicit WimaAreaData(WimaAreaData &other, QObject *parent = nullptr); + + double maxAltitude() const; + const QList& path() const; + +signals: + void maxAltitudeChanged(double maxAltitude); + void pathChanged(const QList& coordinateList); + + +public slots: + void setMaxAltitude(double maxAltitude); + void setPath(const QList& coordinateList); + +private: + // see WimaArea.h for explanation + double _maxAltitude; + QList _path; +}; + diff --git a/src/Wima/WimaController.cc b/src/Wima/WimaController.cc index 340a92634..9c98377a5 100644 --- a/src/Wima/WimaController.cc +++ b/src/Wima/WimaController.cc @@ -1,4 +1,4 @@ -#include "WimaController.h" +#include "WimaController.h" const char* WimaController::wimaFileExtension = "wima"; const char* WimaController::areaItemsName = "AreaItems"; @@ -43,11 +43,6 @@ QGeoCoordinate WimaController::joinedAreaCenter() const return _joinedArea.center(); } -QGCMapPolygon WimaController::joinedArea() const -{ - return _joinedArea; -} - void WimaController::setMasterController(PlanMasterController *masterC) { _masterController = masterC; diff --git a/src/Wima/WimaController.h b/src/Wima/WimaController.h index e0fc9ef03..b4bd60e1e 100644 --- a/src/Wima/WimaController.h +++ b/src/Wima/WimaController.h @@ -7,7 +7,7 @@ #include "WimaArea.h" #include "WimaMeasurementArea.h" #include "WimaServiceArea.h" -#include "WimaVCorridor.h" +#include "WimaCorridor.h" #include "WimaDataContainer.h" #include "PlanMasterController.h" @@ -37,8 +37,8 @@ public: Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT) Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT) - Q_PROPERTY(WimaArea joinedArea READ joinedArea NOTIFY joinedAreaChanged) - Q_PROPERTY(WimaDataContainer* dataContainer WRITE setDataContainer NOTIFY dataContainerChanged) + Q_PROPERTY(QGCMapPolygon joinedArea READ joinedArea NOTIFY joinedAreaChanged) + Q_PROPERTY(WimaDataContainer* dataContainer READ dataContainer WRITE setDataContainer NOTIFY dataContainerChanged) Q_PROPERTY(bool readyForSaveSend READ readyForSaveSend NOTIFY readyForSaveSendChanged) @@ -51,7 +51,8 @@ public: QStringList saveNameFilters (void) const; QString fileExtension (void) const { return wimaFileExtension; } QGeoCoordinate joinedAreaCenter (void) const; - QGCMapPolygon joinedArea(void) const; + QGCMapPolygon joinedArea (void) const; + WimaDataContainer* dataContainer (void) const; bool readyForSaveSend (void) const { return _readyForSaveSend; } @@ -92,6 +93,7 @@ signals: void currentFileChanged (); void dataContainerChanged (); void readyForSaveSendChanged (bool ready); + void joinedAreaChanged (); private slots: void pullFromContainer (); diff --git a/src/Wima/WimaCorridor.cc b/src/Wima/WimaCorridor.cc new file mode 100644 index 000000000..fcf15185f --- /dev/null +++ b/src/Wima/WimaCorridor.cc @@ -0,0 +1,63 @@ +#include "WimaCorridor.h" + +const char* WimaCorridor::WimaCorridorName = "Corridor"; + + + +WimaCorridor::WimaCorridor(QObject *parent) + : WimaArea (parent) +{ + init(); +} + +WimaCorridor::WimaCorridor(const WimaCorridor &other, QObject *parent) + : WimaArea (other, parent) +{ + init(); +} + +void WimaCorridor::saveToJson(QJsonObject &json) +{ + this->WimaArea::saveToJson(json); + json[areaTypeName] = WimaCorridorName; +} + +bool WimaCorridor::loadFromJson(const QJsonObject &json, QString &errorString) +{ + if ( this->WimaArea::loadFromJson(json, errorString)) { + bool retVal = true; + // code for loading here + return retVal; + } else { + qWarning() << errorString; + return false; + } +} + +void WimaCorridor::update(const WimaCorridor &area) +{ + this->WimaArea::update(area); +} + +void WimaCorridor::init() +{ + this->setObjectName(WimaCorridorName); +} + +void print(const WimaCorridor &area) +{ + QString message; + print(area, message); + qWarning() << message; +} + +void print(const WimaCorridor &area, QString &outputString) +{ + print(static_cast(area), outputString); +} + + +/*! + \class WimaCorridor + \brief Corridor (derived from \c WimaArea) connecting the \c WimaMeasurementArea and the \c WimaServiceArea. +*/ diff --git a/src/Wima/WimaCorridor.h b/src/Wima/WimaCorridor.h new file mode 100644 index 000000000..8f9739f56 --- /dev/null +++ b/src/Wima/WimaCorridor.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include "WimaArea.h" +#include "WimaServiceArea.h" +#include "WimaMeasurementArea.h" + +class WimaCorridor : public WimaArea +{ + Q_OBJECT +public: + WimaCorridor(QObject* parent = nullptr); + WimaCorridor(const WimaCorridor& other, QObject* parent = nullptr); + + // Overrides from WimaPolygon + QString mapVisualQML (void) const { return "WimaCorridorMapVisual.qml";} + QString editorQML (void) const { return "WimaCorridorEditor.qml";} + + // Methodes + void saveToJson (QJsonObject& json); + bool loadFromJson (const QJsonObject& json, QString& errorString); + + // static Members + static const char* WimaCorridorName; + + // Friends + friend void print(const WimaCorridor& area, QString& outputString); + friend void print(const WimaCorridor& area); + +signals: + +public slots: + /// Updates this with data from area + void update(const WimaCorridor& area); + +private: + void init(); + +}; + + diff --git a/src/Wima/WimaCorridorData.cpp b/src/Wima/WimaCorridorData.cpp new file mode 100644 index 000000000..cf3f8736d --- /dev/null +++ b/src/Wima/WimaCorridorData.cpp @@ -0,0 +1,25 @@ +#include "WimaCorridorData.h" + + +WimaCorridorData::WimaCorridorData(QObject *parent) + :WimaAreaData (parent) +{ + +} + +WimaCorridorData::WimaCorridorData(WimaCorridorData &other, QObject *parent) + : WimaAreaData (other, parent) +{ + +} + +/*! + * \class WimaAreaData::WimaCorridorData + * \brief Class to store and exchange data of a \c WimaCorridorData Object. + * Class to store and exchange data of a \c WimaCorridor Object. In contrast to \c WimaCorridor this class + * does not provied any interface to a grafical user interface, neiter it uses the QGC Fact System. + * It is designed to exchange data between the \c WimaPlaner and the \c WimaController class. And it + * is the derived from WimaAreaData. + * + * \sa WimaCorridor, WimaAreaData + */ diff --git a/src/Wima/WimaCorridorData.h b/src/Wima/WimaCorridorData.h new file mode 100644 index 000000000..758089cb9 --- /dev/null +++ b/src/Wima/WimaCorridorData.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "WimaAreaData.h" +#include "QGeoCoordinate" + +class WimaCorridorData : public WimaAreaData +{ + Q_OBJECT + +public: + explicit WimaCorridorData(QObject *parent = nullptr); + explicit WimaCorridorData(WimaCorridorData &other, QObject *parent = nullptr); + +signals: + +public slots: + +private: +}; + diff --git a/src/Wima/WimaDataContainer.cc b/src/Wima/WimaDataContainer.cc index 60d69cbd2..017e3f3e0 100644 --- a/src/Wima/WimaDataContainer.cc +++ b/src/Wima/WimaDataContainer.cc @@ -19,7 +19,7 @@ void WimaDataContainer::setJoinedArea(const WimaArea *joinedArea) } } -void WimaDataContainer::setOpArea(const WimaGOperationArea *opArea) +void WimaDataContainer::setOpArea(const WimaMeasurementArea *opArea) { if (_opArea != opArea) { _opArea = opArea; @@ -37,7 +37,7 @@ void WimaDataContainer::setSerArea(const WimaServiceArea *serArea) } } -void WimaDataContainer::setCorridor(const WimaVCorridor *corridor) +void WimaDataContainer::setCorridor(const WimaCorridor *corridor) { if (_corridor != corridor) { _corridor = corridor; diff --git a/src/Wima/WimaDataContainer.h b/src/Wima/WimaDataContainer.h index 4dbca1d54..4f3cdeae4 100644 --- a/src/Wima/WimaDataContainer.h +++ b/src/Wima/WimaDataContainer.h @@ -5,9 +5,9 @@ #include "QmlObjectListModel.h" #include "WimaArea.h" -#include "WimaGOperationArea.h" +#include "WimaMeasurementArea.h" #include "WimaServiceArea.h" -#include "WimaVCorridor.h" +#include "WimaCorridor.h" class WimaDataContainer : public QObject { @@ -18,30 +18,30 @@ public: WimaDataContainer(WimaDataContainer &other) = delete; const WimaArea * joinedArea (void) { return _joinedArea; } - const WimaGOperationArea * opArea (void) { return _opArea; } + const WimaMeasurementArea * opArea (void) { return _opArea; } const WimaServiceArea * serArea (void) { return _serArea; } - const WimaVCorridor * corridor (void) { return _corridor; } + const WimaCorridor * corridor (void) { return _corridor; } const QmlObjectListModel * visualItems (void) { return _visualItems; } signals: void joinedAreaChanged (const WimaArea *area); - void opAreaChanged (const WimaGOperationArea *area); + void opAreaChanged (const WimaMeasurementArea *area); void serAreaChanged (const WimaServiceArea *area); - void corridorChanged (const WimaVCorridor *area); + void corridorChanged (const WimaCorridor *area); void visualItemsChanged (const QmlObjectListModel *area); public slots: void setJoinedArea (const WimaArea *joinedArea); - void setOpArea (const WimaGOperationArea *opArea); + void setOpArea (const WimaMeasurementArea *opArea); void setSerArea (const WimaServiceArea *serArea); - void setCorridor (const WimaVCorridor *corridor); + void setCorridor (const WimaCorridor *corridor); void setVisualItems (const QmlObjectListModel *visualItems); private: const WimaArea *_joinedArea; - const WimaGOperationArea *_opArea; + const WimaMeasurementArea *_opArea; const WimaServiceArea *_serArea; - const WimaVCorridor *_corridor; + const WimaCorridor *_corridor; const QmlObjectListModel *_visualItems; }; diff --git a/src/Wima/WimaGOperationArea.h b/src/Wima/WimaGOperationArea.h deleted file mode 100644 index 1a9966a3d..000000000 --- a/src/Wima/WimaGOperationArea.h +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once - -#include -#include "WimaArea.h" -#include "SettingsFact.h" -#include "WimaTrackerPolyline.h" -#include "WimaGOperationArea.h" - -#include "QScopedPointer" - -class WimaGOperationArea : public WimaArea -{ - Q_OBJECT -public: - WimaGOperationArea(QObject* parent = nullptr); - WimaGOperationArea(const WimaGOperationArea &other, QObject *parent = nullptr); - - Q_PROPERTY(Fact* bottomLayerAltitude READ bottomLayerAltitudeFact CONSTANT) - Q_PROPERTY(Fact* numberOfLayers READ numberOfLayersFact CONSTANT) - Q_PROPERTY(Fact* layerDistance READ layerDistanceFact CONSTANT) - Q_PROPERTY(Fact* borderPolygonOffset READ borderPolygonOffsetFact CONSTANT) - Q_PROPERTY(QGCMapPolygon borderPolygon READ borderPolygon NOTIFY borderPolygonChanged) - - // Overrides from WimaPolygon - QString mapVisualQML (void) const { return "WimaGOperationAreaMapVisual.qml";} - QString editorQML (void) const { return "WimaGOperationAreaEditor.qml";} - - // Property accessors - Fact* bottomLayerAltitudeFact (void) { return &_bottomLayerAltitude;} - Fact* numberOfLayersFact (void) { return &_numberOfLayers;} - Fact* layerDistanceFact (void) { return &_layerDistance;} - Fact* borderPolygonOffsetFact (void) { return &_borderPolygonOffset;} - double bottomLayerAltitude (void) const { return _bottomLayerAltitude.rawValue().toDouble();} - int numberOfLayers (void) const { return _numberOfLayers.rawValue().toInt();} - double layerDistance (void) const { return _layerDistance.rawValue().toDouble();} - double borderPolygonOffset (void) const { return _borderPolygonOffset.rawValue().toDouble();} - QGCMapPolygon borderPolygon (void) const { return _borderPolygon;} - - // Member Methodes - void saveToJson(QJsonObject& json); - bool loadFromJson(const QJsonObject& json, QString &errorString); - - // Friends - friend void print(const WimaGOperationArea& area, QString outputStr); - friend void print(const WimaGOperationArea& area); - - // Static Variables - static const char* settingsGroup; - static const char* bottomLayerAltitudeName; - static const char* numberOfLayersName; - static const char* layerDistanceName; - static const char* borderPolygonOffsetName; - static const char* wimaGOperationAreaName; - -signals: - void bottomLayerAltitudeChanged (void); - void numberOfLayersChanged (void); - void layerDistanceChanged (void); - void polylineChanged (void); - void vehicleCorridorChanged (WimaVCorridor* corridor); - void borderPolygonChanged (void); - -public slots: - /// Updates this with data from area - void update(const WimaGOperationArea &area); - void setBottomLayerAltitude (double altitude); - void setNumberOfLayers (double numLayers); - void setLayerDistance (double layerDistance); - void setBorderPolygonOffset (double offset); -private slots: - void recalcBorderPolygon (void); -private: - // Member Methodes - void init(); - - // Members - QMap _metaDataMap; - - SettingsFact _bottomLayerAltitude; - SettingsFact _numberOfLayers; - SettingsFact _layerDistance; - SettingsFact _borderPolygonOffset; - - QGCMapPolygon _borderPolygon; -}; - - diff --git a/src/Wima/WimaMeasurementArea.cc b/src/Wima/WimaMeasurementArea.cc index 45d9aa91f..eb40d4884 100644 --- a/src/Wima/WimaMeasurementArea.cc +++ b/src/Wima/WimaMeasurementArea.cc @@ -1,6 +1,138 @@ #include "WimaMeasurementArea.h" -WimaMeasurementArea::WimaMeasurementArea() + +const char* WimaMeasurementArea::settingsGroup = "OperationArea"; +const char* WimaMeasurementArea::bottomLayerAltitudeName = "BottomLayerAltitude"; +const char* WimaMeasurementArea::numberOfLayersName = "NumberOfLayers"; +const char* WimaMeasurementArea::layerDistanceName = "LayerDistance"; +const char* WimaMeasurementArea::borderPolygonOffsetName = "BorderPolygonOffset"; +const char* WimaMeasurementArea::WimaMeasurementAreaName = "Operation Area"; + + +WimaMeasurementArea::WimaMeasurementArea(QObject *parent) + : WimaArea (parent) +{ + init(); +} + +WimaMeasurementArea::WimaMeasurementArea(const WimaMeasurementArea &other, QObject *parent) + : WimaArea(other, parent) +{ + init(); +} + +void WimaMeasurementArea::saveToJson(QJsonObject &json) +{ + this->WimaArea::saveToJson(json); + json[bottomLayerAltitudeName] = _bottomLayerAltitude.rawValue().toDouble(); + json[numberOfLayersName] = _numberOfLayers.rawValue().toInt(); + json[layerDistanceName] = _layerDistance.rawValue().toDouble(); + json[borderPolygonOffsetName] = _borderPolygonOffset.rawValue().toDouble(); + json[areaTypeName] = WimaMeasurementAreaName; +} + +bool WimaMeasurementArea::loadFromJson(const QJsonObject &json, QString& errorString) { + if (this->WimaArea::loadFromJson(json, errorString)) { + bool retVal = true; + + if ( json.contains(bottomLayerAltitudeName) && json[bottomLayerAltitudeName].isDouble() ) { + _bottomLayerAltitude.setRawValue(json[bottomLayerAltitudeName].toDouble()); + } else { + errorString.append(tr("Could not load Bottom Layer Altitude!\n")); + retVal = false; + } + + if ( json.contains(numberOfLayersName) && json[numberOfLayersName].isDouble() ) { + _numberOfLayers.setRawValue(json[numberOfLayersName].toInt()); + } else { + errorString.append(tr("Could not load Number of Layers!\n")); + retVal = false; + } + if ( json.contains(layerDistanceName) && json[layerDistanceName].isDouble() ) { + _layerDistance.setRawValue(json[layerDistanceName].toDouble()); + } else { + errorString.append(tr("Could not load Layer Distance!\n")); + retVal = false; + } + + if ( json.contains(borderPolygonOffsetName) && json[borderPolygonOffsetName].isDouble() ) { + _borderPolygonOffset.setRawValue(json[borderPolygonOffsetName].toDouble()); + } else { + errorString.append(tr("Could not load Border Polygon Offset!\n")); + retVal = false; + } + + return retVal; + } else { + return false; + } } + +void WimaMeasurementArea::update(const WimaMeasurementArea &area) +{ + this->WimaArea::update(area); + + this->setBottomLayerAltitude(area.bottomLayerAltitude()); + this->setNumberOfLayers(area.numberOfLayers()); + this->setLayerDistance(area.layerDistance()); + this->setBorderPolygonOffset(area.borderPolygonOffset()); + + recalcBorderPolygon(); +} + +void WimaMeasurementArea::setBottomLayerAltitude(double altitude) +{ + +} + +void print(const WimaMeasurementArea &area) +{ + QString message; + print(area, message); + qWarning() << message; +} + +void print(const WimaMeasurementArea &area, QString outputStr) +{ + print(static_cast(area), outputStr); + outputStr.append(QString("Bottom Layer Altitude: %1\n").arg(area._bottomLayerAltitude.rawValue().toDouble())); + outputStr.append(QString("Number of Layers: %1\n").arg(area._numberOfLayers.rawValue().toInt())); + outputStr.append(QString("Layer Distance: %1\n").arg(area._layerDistance.rawValue().toDouble())); + outputStr.append(QString("Border Polygon Offset: %1\n").arg(area._borderPolygonOffset.rawValue().toDouble())); + + outputStr.append(QString("Border Polygon Coordinates\n").arg(area._borderPolygonOffset.rawValue().toDouble())); + for (int i = 0; i < area._borderPolygon.count(); i++) { + QGeoCoordinate coordinate = area._borderPolygon.vertexCoordinate(i); + outputStr.append(QString("%1\n").arg(coordinate.toString(QGeoCoordinate::Degrees))); + } +} + +void WimaMeasurementArea::recalcBorderPolygon() +{ + //qWarning("WimaMeasurementArea::recalcBorderPolygon() %f", _borderPolygonOffset.rawValue().toDouble()); + QGCMapPolygon polyCopy = this->toQGCPolygon(*this); + polyCopy.offset(_borderPolygonOffset.rawValue().toDouble()); + _borderPolygon.setPath(polyCopy.path()); + polyCopy.deleteLater(); + + emit borderPolygonChanged(); +} + +void WimaMeasurementArea::init() +{ + + _metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/WimaMeasurementArea.SettingsGroup.json"), this /* QObject parent */); + _bottomLayerAltitude = SettingsFact(settingsGroup, _metaDataMap[bottomLayerAltitudeName], this /* QObject parent */); + _numberOfLayers = SettingsFact(settingsGroup, _metaDataMap[numberOfLayersName], this /* QObject parent */); + _layerDistance = SettingsFact(settingsGroup, _metaDataMap[layerDistanceName], this /* QObject parent */); + _borderPolygonOffset = SettingsFact(settingsGroup, _metaDataMap[borderPolygonOffsetName], this /* QObject parent */); + _borderPolygon = new QGCMapPolygon(this); + + this->setObjectName(WimaMeasurementAreaName); + connect(this, &WimaMeasurementArea::pathChanged, this, &WimaMeasurementArea::recalcBorderPolygon); + connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaMeasurementArea::recalcBorderPolygon); +} + + diff --git a/src/Wima/WimaMeasurementArea.h b/src/Wima/WimaMeasurementArea.h index acf362c75..ce1261bc2 100644 --- a/src/Wima/WimaMeasurementArea.h +++ b/src/Wima/WimaMeasurementArea.h @@ -1,11 +1,86 @@ -#ifndef WIMAMEASUREMENTAREA_H -#define WIMAMEASUREMENTAREA_H +#pragma once +#include +#include "WimaArea.h" +#include "SettingsFact.h" +#include "WimaTrackerPolyline.h" -class WimaMeasurementArea +#include "QScopedPointer" + +class WimaMeasurementArea : public WimaArea { + Q_OBJECT public: - WimaMeasurementArea(); + WimaMeasurementArea(QObject* parent = nullptr); + WimaMeasurementArea(const WimaMeasurementArea &other, QObject *parent = nullptr); + + Q_PROPERTY(Fact* bottomLayerAltitude READ bottomLayerAltitudeFact CONSTANT) + Q_PROPERTY(Fact* numberOfLayers READ numberOfLayersFact CONSTANT) + Q_PROPERTY(Fact* layerDistance READ layerDistanceFact CONSTANT) + Q_PROPERTY(Fact* borderPolygonOffset READ borderPolygonOffsetFact CONSTANT) + Q_PROPERTY(QGCMapPolygon borderPolygon READ borderPolygon NOTIFY borderPolygonChanged) + + // Overrides from WimaPolygon + QString mapVisualQML (void) const { return "WimaMeasurementAreaMapVisual.qml";} + QString editorQML (void) const { return "WimaMeasurementAreaEditor.qml";} + + // Property accessors + Fact* bottomLayerAltitudeFact (void) { return &_bottomLayerAltitude;} + Fact* numberOfLayersFact (void) { return &_numberOfLayers;} + Fact* layerDistanceFact (void) { return &_layerDistance;} + Fact* borderPolygonOffsetFact (void) { return &_borderPolygonOffset;} + double bottomLayerAltitude (void) const { return _bottomLayerAltitude.rawValue().toDouble();} + int numberOfLayers (void) const { return _numberOfLayers.rawValue().toInt();} + double layerDistance (void) const { return _layerDistance.rawValue().toDouble();} + double borderPolygonOffset (void) const { return _borderPolygonOffset.rawValue().toDouble();} + QGCMapPolygon borderPolygon (void) const { return _borderPolygon;} + + // Member Methodes + void saveToJson(QJsonObject& json); + bool loadFromJson(const QJsonObject& json, QString &errorString); + + // Friends + friend void print(const WimaMeasurementArea& area, QString outputStr); + friend void print(const WimaMeasurementArea& area); + + // Static Variables + static const char* settingsGroup; + static const char* bottomLayerAltitudeName; + static const char* numberOfLayersName; + static const char* layerDistanceName; + static const char* borderPolygonOffsetName; + static const char* WimaMeasurementAreaName; + +signals: + void bottomLayerAltitudeChanged (void); + void numberOfLayersChanged (void); + void layerDistanceChanged (void); + void polylineChanged (void); + void vehicleCorridorChanged (WimaVCorridor* corridor); + void borderPolygonChanged (void); + +public slots: + /// Updates this with data from area + void update(const WimaMeasurementArea &area); + void setBottomLayerAltitude (double altitude); + void setNumberOfLayers (double numLayers); + void setLayerDistance (double layerDistance); + void setBorderPolygonOffset (double offset); +private slots: + void recalcBorderPolygon (void); +private: + // Member Methodes + void init(); + + // Members + QMap _metaDataMap; + + SettingsFact _bottomLayerAltitude; + SettingsFact _numberOfLayers; + SettingsFact _layerDistance; + SettingsFact _borderPolygonOffset; + + QGCMapPolygon _borderPolygon; }; -#endif // WIMAMEASUREMENTAREA_H \ No newline at end of file + diff --git a/src/Wima/WimaMeasurementAreaData.h b/src/Wima/WimaMeasurementAreaData.h new file mode 100644 index 000000000..23e9d1f76 --- /dev/null +++ b/src/Wima/WimaMeasurementAreaData.h @@ -0,0 +1,31 @@ +#pragma once + +#include + +#include "WimaAreaData.h" +#include "QGeoCoordinate" + +class WimaMeasurementAreaData : public WimaAreaData +{ + Q_OBJECT + +public: + explicit WimaMeasurementAreaData(QObject *parent = nullptr); + explicit WimaMeasurementAreaData(WimaMeasurementAreaData &other, QObject *parent = nullptr); + + + const QGeoCoordinate &takeOffPosition() const; + const QGeoCoordinate &landOffPosition() const; + +signals: + void takeOffPositionChanged(const QGeoCoordinate& other); + void landOffPositionChanged(const QGeoCoordinate& other); + +public slots: + void setTakeOffPosition(const QGeoCoordinate& newCoordinate); + void setLandOffPosition(const QGeoCoordinate& newCoordinate); + +private: + // see WimaServieArea.h for explanation +}; + diff --git a/src/Wima/WimaMeasurementAreaDataareadata.cc b/src/Wima/WimaMeasurementAreaDataareadata.cc new file mode 100644 index 000000000..eda8c0b6b --- /dev/null +++ b/src/Wima/WimaMeasurementAreaDataareadata.cc @@ -0,0 +1,6 @@ +#include "WimaMeasurementAreaData.h" + +WimaMeasurementAreaData::WimaMeasurementAreaData(QObject *parent) : QObject(parent) +{ + +} diff --git a/src/Wima/WimaPlaner.cc b/src/Wima/WimaPlaner.cc index b1ad63835..d37962636 100644 --- a/src/Wima/WimaPlaner.cc +++ b/src/Wima/WimaPlaner.cc @@ -44,11 +44,6 @@ QGeoCoordinate WimaPlaner::joinedAreaCenter() const return _joinedArea.center(); } -WimaArea WimaPlaner::joinedArea() const -{ - return _joinedArea; -} - void WimaPlaner::setMasterController(PlanMasterController *masterC) { _masterController = masterC; @@ -388,7 +383,7 @@ bool WimaPlaner::loadFromFile(const QString &filename) QJsonObject jsonArea = areaArray[i].toObject(); if (jsonArea.contains(WimaArea::areaTypeName) && jsonArea[WimaArea::areaTypeName].isString()) { - if ( jsonArea[WimaArea::areaTypeName] == WimaGOperationArea::wimaGOperationAreaName) { + if ( jsonArea[WimaArea::areaTypeName] == WimaMeasurementArea::WimaMeasurementAreaName) { print(_opArea); bool success = _opArea.loadFromJson(jsonArea, errorString); print(_opArea); @@ -412,7 +407,7 @@ bool WimaPlaner::loadFromFile(const QString &filename) validAreaCounter++; _visualItems.append(&_serArea); emit visualItemsChanged(); - } else if ( jsonArea[WimaArea::areaTypeName] == WimaVCorridor::wimaVCorridorName) { + } else if ( jsonArea[WimaArea::areaTypeName] == WimaCorridor::WimaCorridorName) { bool success = _corridor.loadFromJson(jsonArea, errorString); if ( !success ) { @@ -507,7 +502,6 @@ bool WimaPlaner::recalcJoinedArea() if ( !_joinedArea.join(_opArea) ) return false; // this happens if all areas are pairwise disjoint else { - emit joinedAreaChanged() ; return true; } @@ -566,7 +560,7 @@ QJsonDocument WimaPlaner::saveToJson(FileType fileType) } // check the type of area, create and append the JsonObject to the JsonArray once determined - WimaGOperationArea* opArea = qobject_cast(area); + WimaMeasurementArea* opArea = qobject_cast(area); if (opArea != nullptr) { opArea->saveToJson(json); jsonArray.append(json); @@ -580,7 +574,7 @@ QJsonDocument WimaPlaner::saveToJson(FileType fileType) continue; } - WimaVCorridor* corridor = qobject_cast(area); + WimaCorridor* corridor = qobject_cast(area); if (corridor != nullptr) { corridor->saveToJson(json); jsonArray.append(json); diff --git a/src/Wima/WimaPlaner.h b/src/Wima/WimaPlaner.h index 3a003e3c6..c2f0f9521 100644 --- a/src/Wima/WimaPlaner.h +++ b/src/Wima/WimaPlaner.h @@ -5,9 +5,9 @@ #include "QmlObjectListModel.h" #include "WimaArea.h" -#include "WimaGOperationArea.h" +#include "WimaMeasurementArea.h" #include "WimaServiceArea.h" -#include "WimaVCorridor.h" +#include "WimaCorridor.h" #include "WimaDataContainer.h" #include "PlanMasterController.h" @@ -41,7 +41,6 @@ public: Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT) Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT) - Q_PROPERTY(WimaArea joinedArea READ joinedArea NOTIFY joinedAreaChanged) Q_PROPERTY(WimaDataContainer* dataContainer WRITE setDataContainer NOTIFY dataContainerChanged) Q_PROPERTY(bool readyForSaveSend READ readyForSaveSend NOTIFY readyForSaveSendChanged) @@ -56,7 +55,6 @@ public: QStringList saveNameFilters (void) const; QString fileExtension (void) const { return wimaFileExtension; } QGeoCoordinate joinedAreaCenter (void) const; - WimaArea joinedArea (void) const; bool readyForSaveSend (void) const { return _readyForSaveSend; } @@ -110,7 +108,6 @@ signals: void visualItemsChanged (void); void currentPolygonIndexChanged (int index); void currentFileChanged (); - void joinedAreaChanged (); void dataContainerChanged (); void readyForSaveSendChanged (bool ready); @@ -128,7 +125,7 @@ private: WimaDataContainer *_container; // container for data exchange with WimaController QmlObjectListModel _visualItems; // contains all visible areas WimaArea _joinedArea; // joined area fromed by opArea, serArea, _corridor - WimaGOperationArea _opArea; // measurement area + WimaMeasurementArea _opArea; // measurement area WimaServiceArea _serArea; // area for supplying - WimaVCorridor _corridor; // corridor connecting opArea and serArea + WimaCorridor _corridor; // corridor connecting opArea and serArea }; diff --git a/src/Wima/WimaServiceAreaData.cc b/src/Wima/WimaServiceAreaData.cc new file mode 100644 index 000000000..39730971c --- /dev/null +++ b/src/Wima/WimaServiceAreaData.cc @@ -0,0 +1,77 @@ +#include "WimaServiceAreaData.h" + + +WimaServiceAreaData::WimaServiceAreaData(QObject *parent) + : WimaAreaData(parent) +{ + +} + +WimaServiceAreaData::WimaServiceAreaData(WimaServiceAreaData &other, QObject *parent) + : WimaAreaData (other, parent) + , _takeOffPosition(other.takeOffPosition()) + , _landPosition(other.landOffPosition()) +{ + +} + +/*! + * \fn const QGeoCoordinate &WimaServiceAreaData::takeOffPosition() const + * Returns a constant reference to the takeOffPosition. + * + */ +const QGeoCoordinate &WimaServiceAreaData::takeOffPosition() const +{ + return _takeOffPosition; +} + +/*! + * \fn const QGeoCoordinate &WimaServiceAreaData::landOffPosition() const + * Returns a constant reference to the landOffPosition. + * + */ +const QGeoCoordinate &WimaServiceAreaData::landOffPosition() const +{ + return _landPosition; +} + +/*! + * \fn void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate &newCoordinate) + * Sets the takeoff position to the \a newCoordinate and emits the takeOffPositionChanged() signal, + * if newCoordinate differs from the member value. + * + */ +void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate &newCoordinate) +{ + if (_takeOffPosition != newCoordinate) { + _takeOffPosition = newCoordinate; + + emit takeOffPositionChanged(_takeOffPosition); + } +} + +/*! + * \fn void WimaServiceAreaData::setLandOffPosition(const QGeoCoordinate &newCoordinate) + * Sets the land position to the \a newCoordinate and emits the landOffPositionChanged() signal, + * if newCoordinate differs from the member value. + * + */ +void WimaServiceAreaData::setLandOffPosition(const QGeoCoordinate &newCoordinate) +{ + if (_landPosition != newCoordinate) { + _landPosition = newCoordinate; + + emit landOffPositionChanged(_landPosition); + } +} + +/*! + * \class WimaAreaData::WimaServiceAreaData + * \brief Class to store and exchange data of a \c WimaServiceArea Object. + * Class to store and exchange data of a \c WimaServiceArea Object. In contrast to \c WimaServiceArea this class + * does not provied any interface to a grafical user interface, neiter it uses the QGC Fact System. + * It is designed to exchange data between the \c WimaPlaner and the \c WimaController class. And it + * is the derived from WimaAreaData. + * + * \sa WimaServiceArea, WimaAreaData + */ diff --git a/src/Wima/WimaServiceAreaData.h b/src/Wima/WimaServiceAreaData.h new file mode 100644 index 000000000..7154c49ab --- /dev/null +++ b/src/Wima/WimaServiceAreaData.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include "WimaAreaData.h" +#include "QGeoCoordinate" + +class WimaServiceAreaData : public WimaAreaData +{ + Q_OBJECT + +public: + explicit WimaServiceAreaData(QObject *parent = nullptr); + explicit WimaServiceAreaData(WimaServiceAreaData &other, QObject *parent = nullptr); + + + const QGeoCoordinate &takeOffPosition() const; + const QGeoCoordinate &landOffPosition() const; + +signals: + void takeOffPositionChanged(const QGeoCoordinate& other); + void landOffPositionChanged(const QGeoCoordinate& other); + +public slots: + void setTakeOffPosition(const QGeoCoordinate& newCoordinate); + void setLandOffPosition(const QGeoCoordinate& newCoordinate); + +private: + // see WimaServieArea.h for explanation + QGeoCoordinate _takeOffPosition; + QGeoCoordinate _landPosition; +}; + diff --git a/src/Wima/WimaVCorridor.cc b/src/Wima/WimaVCorridor.cc deleted file mode 100644 index 6c13e68a0..000000000 --- a/src/Wima/WimaVCorridor.cc +++ /dev/null @@ -1,57 +0,0 @@ -#include "WimaVCorridor.h" - -const char* WimaVCorridor::wimaVCorridorName = "Corridor"; - - - -WimaVCorridor::WimaVCorridor(QObject *parent) - : WimaArea (parent) -{ - init(); -} - -WimaVCorridor::WimaVCorridor(const WimaVCorridor &other, QObject *parent) - : WimaArea (other, parent) -{ - init(); -} - -void WimaVCorridor::saveToJson(QJsonObject &json) -{ - this->WimaArea::saveToJson(json); - json[areaTypeName] = wimaVCorridorName; -} - -bool WimaVCorridor::loadFromJson(const QJsonObject &json, QString &errorString) -{ - if ( this->WimaArea::loadFromJson(json, errorString)) { - bool retVal = true; - // code for loading here - return retVal; - } else { - qWarning() << errorString; - return false; - } -} - -void WimaVCorridor::update(const WimaVCorridor &area) -{ - this->WimaArea::update(area); -} - -void WimaVCorridor::init() -{ - this->setObjectName(wimaVCorridorName); -} - -void print(const WimaVCorridor &area) -{ - QString message; - print(area, message); - qWarning() << message; -} - -void print(const WimaVCorridor &area, QString &outputString) -{ - print(static_cast(area), outputString); -} diff --git a/src/Wima/WimaVCorridor.h b/src/Wima/WimaVCorridor.h deleted file mode 100644 index 514837669..000000000 --- a/src/Wima/WimaVCorridor.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include -#include "WimaArea.h" -#include "WimaServiceArea.h" -#include "WimaGOperationArea.h" - -class WimaVCorridor : public WimaArea -{ - Q_OBJECT -public: - WimaVCorridor(QObject* parent = nullptr); - WimaVCorridor(const WimaVCorridor& other, QObject* parent = nullptr); - - // Overrides from WimaPolygon - QString mapVisualQML (void) const { return "WimaVCorridorMapVisual.qml";} - QString editorQML (void) const { return "WimaVCorridorEditor.qml";} - - // Methodes - void saveToJson (QJsonObject& json); - bool loadFromJson (const QJsonObject& json, QString& errorString); - - // static Members - static const char* wimaVCorridorName; - - // Friends - friend void print(const WimaVCorridor& area, QString& outputString); - friend void print(const WimaVCorridor& area); - -signals: - void serviceAreaChanged (WimaServiceArea* serviceArea); - void opAreaChanged (WimaGOperationArea* opArea); - -public slots: - /// Updates this with data from area - void update(const WimaVCorridor& area); - -private: - void init(); - -}; - - -- 2.22.0