Commit 22be1d1a authored by Valentin Platzgummer's avatar Valentin Platzgummer

adding areas to flyView, WimaPlanData restructured, WimaController and WimaPlaner edited

parent 05c2790f
...@@ -6,6 +6,7 @@ sourcedirs = ./src/Wima ...@@ -6,6 +6,7 @@ sourcedirs = ./src/Wima
headers = ./src/Wima/WimaArea.h headers = ./src/Wima/WimaArea.h
sources = ./src/Wima/WimaArea.cc sources = ./src/Wima/WimaArea.cc
sources.fileextensions = "*.cpp *.cc *.qdoc *.mm *.qml" sources.fileextensions = "*.cpp *.cc *.qdoc *.mm *.qml"
headers.fileextensions = "*.h *.ch *.h++ *.hh *.hpp *.hxx" headers.fileextensions = "*.h *.ch *.h++ *.hh *.hpp *.hxx"
......
...@@ -420,7 +420,8 @@ HEADERS += \ ...@@ -420,7 +420,8 @@ HEADERS += \
src/Wima/WimaAreaData.h \ src/Wima/WimaAreaData.h \
src/Wima/WimaServiceAreaData.h \ src/Wima/WimaServiceAreaData.h \
src/Wima/WimaCorridorData.h \ src/Wima/WimaCorridorData.h \
src/Wima/WimaMeasurementAreaData.h src/Wima/WimaMeasurementAreaData.h \
src/Wima/WimaPlanData.h
SOURCES += \ SOURCES += \
src/api/QGCCorePlugin.cc \ src/api/QGCCorePlugin.cc \
src/api/QGCOptions.cc \ src/api/QGCOptions.cc \
...@@ -439,7 +440,8 @@ SOURCES += \ ...@@ -439,7 +440,8 @@ SOURCES += \
src/Wima/WimaAreaData.cc \ src/Wima/WimaAreaData.cc \
src/Wima/WimaServiceAreaData.cc \ src/Wima/WimaServiceAreaData.cc \
src/Wima/WimaCorridorData.cpp \ src/Wima/WimaCorridorData.cpp \
src/Wima/WimaMeasurementAreaDataareadata.cc src/Wima/WimaPlanData.cc \
src/Wima/WimaMeasurementAreaData.cc
# #
# Unit Test specific configuration goes here (requires full debug build with all plugins) # Unit Test specific configuration goes here (requires full debug build with all plugins)
...@@ -1321,4 +1323,4 @@ contains (CONFIG, QGC_DISABLE_INSTALLER_SETUP) { ...@@ -1321,4 +1323,4 @@ contains (CONFIG, QGC_DISABLE_INSTALLER_SETUP) {
} }
DISTFILES += \ DISTFILES += \
src/Wima/WimaGOperationArea.SettingsGroup.json src/WimaView/WimaMeasurementAreaEditor.qml
...@@ -211,16 +211,15 @@ ...@@ -211,16 +211,15 @@
<file alias="QGroundControl/Controls/WimaToolBar.qml">src/WimaView/WimaToolBar.qml</file> <file alias="QGroundControl/Controls/WimaToolBar.qml">src/WimaView/WimaToolBar.qml</file>
<file alias="WimaView.qml">src/WimaView/WimaView.qml</file> <file alias="WimaView.qml">src/WimaView/WimaView.qml</file>
<file alias="QGroundControl/Controls/WimaMapVisual.qml">src/WimaView/WimaMapVisual.qml</file> <file alias="QGroundControl/Controls/WimaMapVisual.qml">src/WimaView/WimaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaServicePolygonMapVisual.qml">src/WimaView/WimaServicePolygonMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaItemEditor.qml">src/WimaView/WimaItemEditor.qml</file> <file alias="QGroundControl/Controls/WimaItemEditor.qml">src/WimaView/WimaItemEditor.qml</file>
<file alias="QGroundControl/Controls/WimaMapPolylineVisuals.qml">src/WimaView/WimaMapPolylineVisuals.qml</file> <file alias="QGroundControl/Controls/WimaMapPolylineVisuals.qml">src/WimaView/WimaMapPolylineVisuals.qml</file>
<file alias="QGroundControl/Controls/WimaMapPolygonVisuals.qml">src/WimaView/WimaMapPolygonVisuals.qml</file> <file alias="QGroundControl/Controls/WimaMapPolygonVisuals.qml">src/WimaView/WimaMapPolygonVisuals.qml</file>
<file alias="QGroundControl/Controls/WimaGOperationAreaMapVisual.qml">src/WimaView/WimaGOperationAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaServiceAreaMapVisual.qml">src/WimaView/WimaServiceAreaMapVisual.qml</file> <file alias="QGroundControl/Controls/WimaServiceAreaMapVisual.qml">src/WimaView/WimaServiceAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaGOperationAreaEditor.qml">src/WimaView/WimaGOperationAreaEditor.qml</file>
<file alias="QGroundControl/Controls/WimaServiceAreaEditor.qml">src/WimaView/WimaServiceAreaEditor.qml</file> <file alias="QGroundControl/Controls/WimaServiceAreaEditor.qml">src/WimaView/WimaServiceAreaEditor.qml</file>
<file alias="QGroundControl/Controls/WimaVCorridorMapVisual.qml">src/WimaView/WimaVCorridorMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaAreaMapVisual.qml">src/WimaView/WimaAreaMapVisual.qml</file> <file alias="QGroundControl/Controls/WimaAreaMapVisual.qml">src/WimaView/WimaAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaMeasurementAreaMapVisual.qml">src/WimaView/WimaMeasurementAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaCorridorMapVisual.qml">src/WimaView/WimaCorridorMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaMeasurementAreaEditor.qml">src/WimaView/WimaMeasurementAreaEditor.qml</file>
</qresource> </qresource>
<qresource prefix="/json"> <qresource prefix="/json">
<file alias="APMMavlinkStreamRate.SettingsGroup.json">src/Settings/APMMavlinkStreamRate.SettingsGroup.json</file> <file alias="APMMavlinkStreamRate.SettingsGroup.json">src/Settings/APMMavlinkStreamRate.SettingsGroup.json</file>
...@@ -265,7 +264,7 @@ ...@@ -265,7 +264,7 @@
<file alias="Vehicle/VibrationFact.json">src/Vehicle/VibrationFact.json</file> <file alias="Vehicle/VibrationFact.json">src/Vehicle/VibrationFact.json</file>
<file alias="Vehicle/WindFact.json">src/Vehicle/WindFact.json</file> <file alias="Vehicle/WindFact.json">src/Vehicle/WindFact.json</file>
<file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file> <file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file>
<file alias="WimaGOperationArea.SettingsGroup.json">src/Wima/WimaGOperationArea.SettingsGroup.json</file> <file alias="WimaMeasurementArea.SettingsGroup.json">src/Wima/WimaMeasurementArea.SettingsGroup.json</file>
</qresource> </qresource>
<qresource prefix="/MockLink"> <qresource prefix="/MockLink">
<file alias="APMArduCopterMockLink.params">src/comm/APMArduCopterMockLink.params</file> <file alias="APMArduCopterMockLink.params">src/comm/APMArduCopterMockLink.params</file>
......
...@@ -117,7 +117,7 @@ QGCView { ...@@ -117,7 +117,7 @@ QGCView {
WimaController { WimaController {
id: wimaController id: wimaController
Component.onCompleted: { Component.onCompleted: {
startWimaController(true /* flyView */) wimaController.dataContainer = Qt.binding(function() { return dataContainerPointer })
} }
} }
...@@ -136,9 +136,8 @@ QGCView { ...@@ -136,9 +136,8 @@ QGCView {
flyViewOverlay.source = QGroundControl.corePlugin.options.flyViewOverlay flyViewOverlay.source = QGroundControl.corePlugin.options.flyViewOverlay
} }
wimaController.masterController = masterController wimaController.masterController = Qt.binding(function() { return masterController; })
wimaController.missionController = masterController.missionController wimaController.missionController = Qt.binding(function() { return masterController.missionController; })
wimaController.dataContainer = dataContainer
} }
// The following code is used to track vehicle states such that we prompt to remove mission from vehicle when mission completes // The following code is used to track vehicle states such that we prompt to remove mission from vehicle when mission completes
......
...@@ -194,13 +194,16 @@ FlightMap { ...@@ -194,13 +194,16 @@ FlightMap {
} }
// Add wima Areas to the Map // Add wima Areas to the Map
WimaMapPolygonVisuals { MapItemView {
mapControl: flightMap model: wimaController.visualItems
mapPolygon: wimaController.joinedArea
borderWidth: 1 delegate: MapPolygon{
borderColor: "transparent" path: object.path;
interiorColor: "gray" border.color: "black"
interiorOpacity: 0.25 color: "green"
opacity: 0.25
z: QGroundControl.zOrderTrajectoryLines-1
}
} }
// Add trajectory points to the map // Add trajectory points to the map
......
...@@ -369,11 +369,6 @@ void QGCMapPolygon::setInteractive(bool interactive) ...@@ -369,11 +369,6 @@ void QGCMapPolygon::setInteractive(bool interactive)
} }
} }
void QGCMapPolygon::update(const QGCMapPolygon &poly)
{
this->setPath(poly.path());
}
void print(const QGCMapPolygon &poly) void print(const QGCMapPolygon &poly)
{ {
QString message; QString message;
...@@ -384,18 +379,18 @@ void print(const QGCMapPolygon &poly) ...@@ -384,18 +379,18 @@ void print(const QGCMapPolygon &poly)
void print(const QGCMapPolygon &poly, QString &outputString) void print(const QGCMapPolygon &poly, QString &outputString)
{ {
outputString.append(QString("Coordinates:\n")); outputString.append(QString("Coordinates:\r\n"));
for (int i = 0; i < poly.count(); i++) { for (int i = 0; i < poly.count(); i++) {
QGeoCoordinate coordinate = poly.vertexCoordinate(i); QGeoCoordinate coordinate = poly.vertexCoordinate(i);
outputString.append(QString("%s\n").arg(coordinate.toString(QGeoCoordinate::Degrees))); outputString.append(QString("%1\n").arg(coordinate.toString(QGeoCoordinate::Degrees)));
} }
outputString.append(QString("Dirty: %s\n").arg(QVariant(poly._dirty).toString())); outputString.append(QString("Dirty: %1\n").arg(QVariant(poly._dirty).toString()));
outputString.append(QString("Center: %s\n").arg(poly._center.toString(QGeoCoordinate::Degrees))); outputString.append(QString("Center: %1\n").arg(poly._center.toString(QGeoCoordinate::Degrees)));
outputString.append(QString("Center Drag: %s\n").arg(QVariant(poly._centerDrag).toString())); outputString.append(QString("Center Drag: %1\n").arg(QVariant(poly._centerDrag).toString()));
outputString.append(QString("Ignore Center Updates: %s\n").arg(QVariant(poly._centerDrag).toString())); outputString.append(QString("Ignore Center Updates: %1\n").arg(QVariant(poly._centerDrag).toString()));
outputString.append(QString("Interactive: %s\n").arg(QVariant(poly._interactive).toString())); outputString.append(QString("Interactive: %1\n").arg(QVariant(poly._interactive).toString()));
} }
QGeoCoordinate QGCMapPolygon::vertexCoordinate(int vertex) const QGeoCoordinate QGCMapPolygon::vertexCoordinate(int vertex) const
......
...@@ -99,9 +99,6 @@ public: ...@@ -99,9 +99,6 @@ public:
QmlObjectListModel* qmlPathModel(void) { return &_polygonModel; } QmlObjectListModel* qmlPathModel(void) { return &_polygonModel; }
QmlObjectListModel& pathModel (void) { return _polygonModel; } QmlObjectListModel& pathModel (void) { return _polygonModel; }
/// Updates this with data from poly
void update(const QGCMapPolygon &poly);
// Friends // Friends
friend void print(const QGCMapPolygon& poly, QString& outputString); friend void print(const QGCMapPolygon& poly, QString& outputString);
friend void print(const QGCMapPolygon& poly); friend void print(const QGCMapPolygon& poly);
......
...@@ -67,8 +67,9 @@ ...@@ -67,8 +67,9 @@
#include "FlightMapSettings.h" #include "FlightMapSettings.h"
#include "CoordinateVector.h" #include "CoordinateVector.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "Wima/WimaController.h" //custom #include "Wima/WimaController.h"
#include "Wima/WimaDataContainer.h" //custom #include "Wima/WimaDataContainer.h"
#include "Wima/WimaPlaner.h"
#include "VideoManager.h" #include "VideoManager.h"
#include "VideoSurface.h" #include "VideoSurface.h"
#include "VideoReceiver.h" #include "VideoReceiver.h"
...@@ -465,8 +466,9 @@ void QGCApplication::_initCommon(void) ...@@ -465,8 +466,9 @@ void QGCApplication::_initCommon(void)
qmlRegisterType<MavlinkConsoleController> (kQGCControllers, 1, 0, "MavlinkConsoleController"); qmlRegisterType<MavlinkConsoleController> (kQGCControllers, 1, 0, "MavlinkConsoleController");
#endif #endif
// Wima // Wima
qmlRegisterType<WimaController> ("Wima", 1, 0, "WimaController"); //custom qmlRegisterType<WimaController> ("Wima", 1, 0, "WimaController");
qmlRegisterType<WimaDataContainer> ("Wima", 1, 0, "WimaDataContainer"); //custom qmlRegisterType<WimaPlaner> ("Wima", 1, 0, "WimaPlaner");
qmlRegisterType<WimaDataContainer> ("Wima", 1, 0, "WimaDataContainer");
// Register Qml Singletons // Register Qml Singletons
......
...@@ -86,12 +86,12 @@ ViewWidget 1.0 ViewWidget.qml ...@@ -86,12 +86,12 @@ ViewWidget 1.0 ViewWidget.qml
FlyAreaItemEditor 1.0 FlyAreaItemEditor.qml FlyAreaItemEditor 1.0 FlyAreaItemEditor.qml
WimaMapVisual 1.0 WimaMapVisual.qml WimaMapVisual 1.0 WimaMapVisual.qml
WimaGOperationAreaMapVisual 1.0 WimaGOperationAreaMapVisual.qml WimaMeasurementAreaMapVisual 1.0 WimaMeasurementAreaMapVisual.qml
WimaGOperationAreaEditor 1.0 WimaGOperationAreaEditor.qml WimaMeasurementAreaEditor 1.0 WimaMeasurementAreaEditor.qml
WimaServiceAreaMapVisual 1.0 WimaServiceAreaMapVisual.qml WimaServiceAreaMapVisual 1.0 WimaServiceAreaMapVisual.qml
WimaAreaMapVisual 1.0 WimaAreaMapVisual.qml WimaAreaMapVisual 1.0 WimaAreaMapVisual.qml
WimaServiceAreaEditor 1.0 WimaServiceAreaEditor.qml WimaServiceAreaEditor 1.0 WimaServiceAreaEditor.qml
WimaVCorridorMapVisual 1.0 WimaVCorridorMapVisual.qml WimaCorridorMapVisual 1.0 WimaCorridorMapVisual.qml
WimaItemEditor 1.0 WimaItemEditor.qml WimaItemEditor 1.0 WimaItemEditor.qml
WimaMapPolygonVisuals 1.0 WimaMapPolygonVisuals.qml WimaMapPolygonVisuals 1.0 WimaMapPolygonVisuals.qml
WimaMapPolylineVisuals 1.0 WimaMapPolylineVisuals.qml WimaMapPolylineVisuals 1.0 WimaMapPolylineVisuals.qml
......
This diff is collapsed.
...@@ -17,6 +17,7 @@ class WimaArea : public QGCMapPolygon //abstract base class for all WimaAreas ...@@ -17,6 +17,7 @@ class WimaArea : public QGCMapPolygon //abstract base class for all WimaAreas
public: public:
WimaArea(QObject* parent = nullptr); WimaArea(QObject* parent = nullptr);
WimaArea(const WimaArea& other, QObject* parent = nullptr); WimaArea(const WimaArea& other, QObject* parent = nullptr);
WimaArea &operator=(const WimaArea &other);
Q_PROPERTY(double maxAltitude READ maxAltitude WRITE setMaxAltitude NOTIFY maxAltitudeChanged) Q_PROPERTY(double maxAltitude READ maxAltitude WRITE setMaxAltitude NOTIFY maxAltitudeChanged)
...@@ -31,20 +32,12 @@ public: ...@@ -31,20 +32,12 @@ public:
virtual QString editorQML (void) const { return "WimaAreaEditor.qml";} virtual QString editorQML (void) const { return "WimaAreaEditor.qml";}
// Member Methodes // Member Methodes
//iterates over all vertices in _polygon and returns the index of that one closest to coordinate
int getClosestVertexIndex (const QGeoCoordinate& coordinate) const; int getClosestVertexIndex (const QGeoCoordinate& coordinate) const;
//iterates over all vertices in _polygon and returns that one closest to coordinate
QGeoCoordinate getClosestVertex (const QGeoCoordinate& coordinate) const; QGeoCoordinate getClosestVertex (const QGeoCoordinate& coordinate) const;
QGCMapPolygon toQGCPolygon () const; QGCMapPolygon toQGCPolygon () const;
void join (QList<WimaArea*>* polyList, WimaArea* joinedPoly);// change to & notation
bool join (WimaArea &area); bool join (WimaArea &area);
bool isDisjunct (QList<WimaArea*>* polyList);// change to & notation, if necessary bool join (WimaArea &area, QString &errorString);
bool isDisjunct (WimaArea* poly1, WimaArea* poly2);// change to & notation, if necessary
/// calculates the next polygon vertex index
/// @return index + 1 if index < poly->count()-1 && index >= 0, or 0 if index == poly->count()-1, -1 else
int nextVertexIndex (int index) const; int nextVertexIndex (int index) const;
/// calculates the previous polygon vertex index
/// @return index - 1 if index < poly->count() && index > 0, or poly->count()-1 if index == 0, -1 else
int previousVertexIndex (int index) const; int previousVertexIndex (int index) const;
...@@ -53,45 +46,26 @@ public: ...@@ -53,45 +46,26 @@ public:
// static Methodes // static Methodes
static QGCMapPolygon toQGCPolygon (const WimaArea& area); static QGCMapPolygon toQGCPolygon (const WimaArea& area);
/// joins the poly1 and poly2 if possible, joins the polygons to form a simple polygon (no holes) static bool join (WimaArea &area1, WimaArea &area2, WimaArea& joinedArea, QString &errorString);
/// see https://en.wikipedia.org/wiki/Simple_polygon
/// @return true if polygons have been joined, false else
static bool join (WimaArea &area1, WimaArea &area2, WimaArea& joinedArea); static bool join (WimaArea &area1, WimaArea &area2, WimaArea& joinedArea);
/// checks if line1 and line2 intersect with each other, takes latitude and longitute into account only (height neglected)
/// @param line1 line containing two coordinates, height not taken into account
/// @param line2 line containing two coordinates, height not taken into account
/// @param intersectionPt Coordinate item to store intersection pt. in.
/// @return false on error or no intersection, true else
static bool intersects (const QGCMapPolyline& line1, const QGCMapPolyline& line2, static bool intersects (const QGCMapPolyline& line1, const QGCMapPolyline& line2,
QGeoCoordinate& intersectionPt); QGeoCoordinate& intersectionPt);
/// checks if line1 and poly intersect with each other, takes latitude and longitute into account only (height neglected)
/// @param line line containing two coordinates, height not taken into account
/// @param intersectionList Empty list to store intersection points in.
/// @param neighbourList Empty list to store the indices of the neighbours (the two Vertices of poly with the smallest distance to the intersection pt.)
/// @return false on error or no intersection, true else
static bool intersects (const QGCMapPolyline& line, const WimaArea& area, static bool intersects (const QGCMapPolyline& line, const WimaArea& area,
QList<QGeoCoordinate>& intersectionList, QList<QGeoCoordinate>& intersectionList,
QList<QPair<int, int>>& neighbourList); QList<QPair<int, int>>& neighbourList);
/// calculates the distance between to geo coordinates, returns the distance if the path lies within the polygon and inf. else.
/// @return the distance if the path lies within the polygon and inf. else.
static double distInsidePoly (const QGeoCoordinate& c1, const QGeoCoordinate& c2, WimaArea area); static double distInsidePoly (const QGeoCoordinate& c1, const QGeoCoordinate& c2, WimaArea area);
/// calculates the shortes path between two geo coordinates inside a polygon using the Dijkstra Algorithm
/// @return true if path was found, false else
static bool dijkstraPath (const QGeoCoordinate& c1, const QGeoCoordinate& c2, static bool dijkstraPath (const QGeoCoordinate& c1, const QGeoCoordinate& c2,
const WimaArea& area, QList<QGeoCoordinate>& dijkstraPath); const WimaArea& area, QList<QGeoCoordinate>& dijkstraPath, QString &errorstring);
/// @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 (); bool isSelfIntersecting ();
// Friends // Friends
/// prints the member values of area to the outputString
friend void print(const WimaArea& area, QString& outputString); friend void print(const WimaArea& area, QString& outputString);
/// prints the member values of area to the console
friend void print(const WimaArea& area); friend void print(const WimaArea& area);
// static Members // static Members
// Accurracy used to compute isDisjunct // Accurracy used to compute isDisjunct
static const double numericalAccuracy; static const double epsilonMeter;
static const char* maxAltitudeName; static const char* maxAltitudeName;
static const char* wimaAreaName; static const char* wimaAreaName;
static const char* areaTypeName; static const char* areaTypeName;
...@@ -101,8 +75,6 @@ signals: ...@@ -101,8 +75,6 @@ signals:
public slots: public slots:
void setMaxAltitude (double altitude); void setMaxAltitude (double altitude);
/// Updates this with data from area
void update(const WimaArea& area);
private: private:
double _maxAltitude; double _maxAltitude;
......
#include "WimaAreaData.h" #include "WimaAreaData.h"
const char *WimaAreaData::typeString = "WimaAreaData";
WimaAreaData::WimaAreaData(QObject *parent) : QObject(parent) WimaAreaData::WimaAreaData(QObject *parent) : QObject(parent)
{ {
_maxAltitude = 0; _maxAltitude = 0;
} }
WimaAreaData::WimaAreaData(WimaAreaData &other, QObject *parent) WimaAreaData::WimaAreaData(const WimaAreaData &other, QObject *parent)
: QObject (parent)
{
*this = other;
}
WimaAreaData::WimaAreaData(const WimaArea &other, QObject *parent)
: QObject (parent) : QObject (parent)
, _maxAltitude(other.maxAltitude())
{ {
setPath(other.path()); *this = other;
}
/*!
* \fn WimaAreaData &WimaAreaData::operator=(const WimaAreaData &otherData)
*
* Copies the maximum altitude and the path of the \c WimaAreaData \a otherData to the calling object.
* Returns a reference to the calling object.
*/
WimaAreaData &WimaAreaData::operator=(const WimaAreaData &otherData)
{
setMaxAltitude(otherData.maxAltitude());
setPath(otherData.path());
return *this;
}
/*!
* \overload operator=()
*
* Copies the maximum altitude and the path of \c WimaArea \a otherArea to the calling object.
* Returns a reference to the calling object.
*/
WimaAreaData &WimaAreaData::operator=(const WimaArea &otherArea)
{
setMaxAltitude(otherArea.maxAltitude());
setPath(otherArea.coordinateList());
return *this;
} }
/*! /*!
...@@ -27,11 +62,21 @@ double WimaAreaData::maxAltitude() const ...@@ -27,11 +62,21 @@ double WimaAreaData::maxAltitude() const
* *
* Returns the path (vertex list defining the \l {Simple Polygon}). * Returns the path (vertex list defining the \l {Simple Polygon}).
*/ */
const QList<QGeoCoordinate> &WimaAreaData::path() const QVariantList WimaAreaData::path() const
{ {
return _path; return _path;
} }
/*!
* \fn QString WimaAreaData::type()
*
* Returns the type name of the object. Used to destinguish between derived objects.
*/
QString WimaAreaData::type() const
{
return typeString;
}
/*! /*!
* \fn void WimaAreaData::setMaxAltitude(double maxAltitude) * \fn void WimaAreaData::setMaxAltitude(double maxAltitude)
* *
...@@ -47,6 +92,13 @@ void WimaAreaData::setMaxAltitude(double maxAltitude) ...@@ -47,6 +92,13 @@ void WimaAreaData::setMaxAltitude(double maxAltitude)
} }
} }
void WimaAreaData::setPath(const QVariantList &coordinateList)
{
_path.clear();
_path.append(coordinateList);
}
/*! /*!
* \fn void WimaAreaData::setPath(const QList<QGeoCoordinate> &coordinateList) * \fn void WimaAreaData::setPath(const QList<QGeoCoordinate> &coordinateList)
* *
...@@ -59,7 +111,7 @@ void WimaAreaData::setPath(const QList<QGeoCoordinate> &coordinateList) ...@@ -59,7 +111,7 @@ void WimaAreaData::setPath(const QList<QGeoCoordinate> &coordinateList)
// copy all coordinates to _path // copy all coordinates to _path
for(int i = 0; i < coordinateList.size(); i++) { for(int i = 0; i < coordinateList.size(); i++) {
_path.append(coordinateList.value(i)); _path.append(QVariant::fromValue(coordinateList.value(i)));
} }
emit pathChanged(_path); emit pathChanged(_path);
...@@ -69,9 +121,8 @@ void WimaAreaData::setPath(const QList<QGeoCoordinate> &coordinateList) ...@@ -69,9 +121,8 @@ void WimaAreaData::setPath(const QList<QGeoCoordinate> &coordinateList)
* \class WimaArea::WimaAreaData * \class WimaArea::WimaAreaData
* \brief Class to store and exchange data of a \c WimaArea Object. * \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 * 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. * does not uses the QGC Fact System. It is designed to exchange data between the \c WimaPlaner and
* It is designed to exchange data between the \c WimaPlaner and the \c WimaController class. And it * the \c WimaController class. And it is the base class for any derived data objects
* is the base class for any derived data objects
* *
* \sa WimaArea * \sa WimaArea
*/ */
...@@ -4,29 +4,42 @@ ...@@ -4,29 +4,42 @@
#include "QGeoCoordinate" #include "QGeoCoordinate"
#include "WimaArea.h"
class WimaAreaData : public QObject class WimaAreaData : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit WimaAreaData(QObject *parent = nullptr); Q_PROPERTY(const QVariantList path READ path NOTIFY pathChanged)
explicit WimaAreaData(WimaAreaData &other, QObject *parent = nullptr);
WimaAreaData(QObject *parent = nullptr);
WimaAreaData(const WimaAreaData &other, QObject *parent = nullptr);
WimaAreaData(const WimaArea &other, QObject *parent = nullptr);
WimaAreaData& operator=(const WimaAreaData& otherData);
WimaAreaData& operator=(const WimaArea& otherArea);
double maxAltitude() const; double maxAltitude() const;
const QList<QGeoCoordinate>& path() const; QVariantList path() const;
QString type() const;
signals: static const char *typeString;
void maxAltitudeChanged(double maxAltitude);
void pathChanged(const QList<QGeoCoordinate>& coordinateList);
signals:
void maxAltitudeChanged (double maxAltitude);
void pathChanged (const QVariantList& coordinateList);
public slots: public slots:
void setMaxAltitude(double maxAltitude); void setMaxAltitude(double maxAltitude);
void setPath(const QList<QGeoCoordinate>& coordinateList); void setPath(const QList<QGeoCoordinate> &coordinateList);
void setPath(const QVariantList &coordinateList);
private: private:
// Member Functions
// Member Variables
// see WimaArea.h for explanation // see WimaArea.h for explanation
double _maxAltitude; double _maxAltitude;
QList<QGeoCoordinate> _path; QVariantList _path;
}; };
...@@ -6,12 +6,12 @@ const char* WimaController::missionItemsName = "MissionItems"; ...@@ -6,12 +6,12 @@ const char* WimaController::missionItemsName = "MissionItems";
WimaController::WimaController(QObject *parent) WimaController::WimaController(QObject *parent)
: QObject (parent) : QObject (parent)
, _readyForSaveSend (false)
, _container (nullptr) , _container (nullptr)
, _joinedArea (this) , _joinedArea (this)
, _opArea (this) , _measurementArea (this)
, _serArea (this) , _serviceArea (this)
, _corridor (this) , _corridor (this)
, _localPlanDataValid (false)
{ {
} }
...@@ -38,9 +38,9 @@ QStringList WimaController::saveNameFilters() const ...@@ -38,9 +38,9 @@ QStringList WimaController::saveNameFilters() const
return filters; return filters;
} }
QGeoCoordinate WimaController::joinedAreaCenter() const WimaDataContainer *WimaController::dataContainer() const
{ {
return _joinedArea.center(); return _container;
} }
void WimaController::setMasterController(PlanMasterController *masterC) void WimaController::setMasterController(PlanMasterController *masterC)
...@@ -55,21 +55,26 @@ void WimaController::setMissionController(MissionController *missionC) ...@@ -55,21 +55,26 @@ void WimaController::setMissionController(MissionController *missionC)
emit missionControllerChanged(); emit missionControllerChanged();
} }
/*!
* \fn void WimaController::setDataContainer(WimaDataContainer *container)
* Sets the pointer to the \c WimaDataContainer, which is meant to exchange data between the \c WimaController and the \c WimaPlaner.
*
* \sa WimaPlaner, WimaDataContainer, WimaPlanData
*/
void WimaController::setDataContainer(WimaDataContainer *container) void WimaController::setDataContainer(WimaDataContainer *container)
{ {
if (_container == nullptr && container != nullptr) { if (container != nullptr) {
if (_container != nullptr) {
disconnect(_container, &WimaDataContainer::dataValidChanged, this, &WimaController::containerDataValidChanged);
}
_container = container; _container = container;
pullFromContainer(); connect(_container, &WimaDataContainer::dataValidChanged, this, &WimaController::containerDataValidChanged);
emit dataContainerChanged(); emit dataContainerChanged();
} }
} }
void WimaController::startWimaController(bool flyView)
{
}
void WimaController::startMission() void WimaController::startMission()
{ {
...@@ -118,14 +123,88 @@ bool WimaController::loadFromFile(const QString &filename) ...@@ -118,14 +123,88 @@ bool WimaController::loadFromFile(const QString &filename)
QJsonDocument WimaController::saveToJson(FileType fileType) QJsonDocument WimaController::saveToJson(FileType fileType)
{ {
return QJsonDocument();
} }
void WimaController::setReadyForSaveSend(bool ready) /*!
* \fn void WimaController::containerDataValidChanged(bool valid)
* Pulls plan data generated by \c WimaPlaner from the \c _container if the data is valid (\a valid equals true).
* Is connected to the dataValidChanged() signal of the \c WimaDataContainer.
*
* \sa WimaDataContainer, WimaPlaner, WimaPlanData
*/
void WimaController::containerDataValidChanged(bool valid)
{ {
if (ready != _readyForSaveSend) { if ( valid ) {
_readyForSaveSend = ready; if (_container == nullptr) {
emit readyForSaveSendChanged(ready); qWarning("WimaController::containerDataValidChanged(): No container assigned!");
}
_localPlanDataValid = false;
WimaPlanData planData = _container->pull();
// extract list with WimaAreas
QList<const WimaAreaData*> areaList = planData.areaList();
int areaCounter = 0;
int numAreas = 4; // extract only numAreas Areas, if there are more they are invalid and ignored
bool joinedAreaAssigned = false;
for (int i = 0; i < areaList.size(); i++) {
const WimaAreaData *areaData = areaList[i];
if (areaData->type() == WimaServiceAreaData::typeString) { // is it a service area?
_serviceArea = *qobject_cast<WimaServiceAreaData*>(areaData);
qWarning("Service area, wuhuuu!");
areaCounter++;
continue;
}
WimaMeasurementAreaData *measurementAreaData = qobject_cast<WimaMeasurementAreaData*>(areaData);
if (measurementAreaData != nullptr) { // is it a measurement area?
_measurementArea = *measurementAreaData;
qWarning("Measurement area, wuhuuu!");
areaCounter++;
continue;
}
WimaCorridorData *corridorAreaData = qobject_cast<WimaCorridorData*>(areaData);
if (corridorAreaData != nullptr) { // is it a corridor?
_corridor = *corridorAreaData;
qWarning("Corridor, wuhuuu!");
areaCounter++;
continue;
}
if (!joinedAreaAssigned) { // first WimaAreaData object is assumed to be the joined Area
_joinedArea = *areaData;
qWarning("Joined area, wuhuuu!");
areaCounter++;
joinedAreaAssigned = true;
continue;
}
if (areaCounter >= numAreas)
break;
}
// append areas to _visualItems, don't append _corridor, it's not necessary to display it in flyView
_visualItems.clear();
//_visualItems.append(&_measurementArea);
//_visualItems.append(&_serviceArea);
_visualItems.append(&_joinedArea);
emit visualItemsChanged();
_localPlanDataValid = true;
} else {
_localPlanDataValid = false;
_visualItems.clear();
emit visualItemsChanged();
} }
} }
...@@ -133,3 +212,5 @@ void WimaController::setReadyForSaveSend(bool ready) ...@@ -133,3 +212,5 @@ void WimaController::setReadyForSaveSend(bool ready)
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
#include "WimaServiceArea.h" #include "WimaServiceArea.h"
#include "WimaCorridor.h" #include "WimaCorridor.h"
#include "WimaDataContainer.h" #include "WimaDataContainer.h"
#include "WimaMeasurementAreaData.h"
#include "WimaCorridorData.h"
#include "WimaServiceAreaData.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "MissionController.h" #include "MissionController.h"
...@@ -36,24 +39,19 @@ public: ...@@ -36,24 +39,19 @@ public:
Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT) Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT)
Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT) Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT)
Q_PROPERTY(QGCMapPolygon joinedArea READ joinedArea NOTIFY joinedAreaChanged)
Q_PROPERTY(WimaDataContainer* dataContainer READ dataContainer WRITE setDataContainer NOTIFY dataContainerChanged) Q_PROPERTY(WimaDataContainer* dataContainer READ dataContainer WRITE setDataContainer NOTIFY dataContainerChanged)
Q_PROPERTY(bool readyForSaveSend READ readyForSaveSend NOTIFY readyForSaveSendChanged)
// Property accessors // Property accessors
PlanMasterController* masterController (void) const { return _masterController; } PlanMasterController* masterController (void) { return _masterController; }
MissionController* missionController (void) const { return _missionController; } MissionController* missionController (void) { return _missionController; }
QmlObjectListModel* visualItems (void) ; QmlObjectListModel* visualItems (void) ;
QString currentFile (void) const { return _currentFile; } QString currentFile (void) const { return _currentFile; }
QStringList loadNameFilters (void) const; QStringList loadNameFilters (void) const;
QStringList saveNameFilters (void) const; QStringList saveNameFilters (void) const;
QString fileExtension (void) const { return wimaFileExtension; } QString fileExtension (void) const { return wimaFileExtension; }
QGeoCoordinate joinedAreaCenter (void) const;
QGCMapPolygon joinedArea (void) const; QGCMapPolygon joinedArea (void) const;
WimaDataContainer* dataContainer (void) const; WimaDataContainer* dataContainer (void) const;
bool readyForSaveSend (void) const { return _readyForSaveSend; }
...@@ -63,7 +61,6 @@ public: ...@@ -63,7 +61,6 @@ public:
void setDataContainer (WimaDataContainer* container); void setDataContainer (WimaDataContainer* container);
// Member Methodes // Member Methodes
Q_INVOKABLE void startWimaController(bool flyView);
Q_INVOKABLE void startMission(); Q_INVOKABLE void startMission();
Q_INVOKABLE void abortMission(); Q_INVOKABLE void abortMission();
Q_INVOKABLE void pauseMission(); Q_INVOKABLE void pauseMission();
...@@ -83,8 +80,6 @@ public: ...@@ -83,8 +80,6 @@ public:
// Member Methodes // Member Methodes
QJsonDocument saveToJson(FileType fileType); QJsonDocument saveToJson(FileType fileType);
void setReadyForSaveSend(bool ready);
signals: signals:
void masterControllerChanged (void); void masterControllerChanged (void);
...@@ -93,21 +88,20 @@ signals: ...@@ -93,21 +88,20 @@ signals:
void currentFileChanged (); void currentFileChanged ();
void dataContainerChanged (); void dataContainerChanged ();
void readyForSaveSendChanged (bool ready); void readyForSaveSendChanged (bool ready);
void joinedAreaChanged ();
private slots: private slots:
void pullFromContainer (); void containerDataValidChanged (bool valid);
private: private:
bool _readyForSaveSend; // basically true if updateMission() was sucessful
PlanMasterController *_masterController; PlanMasterController *_masterController;
MissionController *_missionController; MissionController *_missionController;
QString _currentFile; // file for saveing QString _currentFile; // file for saveing
WimaDataContainer *_container; // container for data exchange with WimaController WimaDataContainer *_container; // container for data exchange with WimaController
QmlObjectListModel _visualItems; // contains all visible areas QmlObjectListModel _visualItems; // contains all visible areas
// The following areas are of type QGCMapPolygon (only path information is required, as they are used for visualisation) WimaAreaData _joinedArea; // joined area fromed by opArea, serArea, _corridor
QGCMapPolygon _joinedArea; // joined area fromed by opArea, serArea, _corridor WimaMeasurementAreaData _measurementArea; // measurement area
QGCMapPolygon _opArea; // measurement area WimaServiceAreaData _serviceArea; // area for supplying
QGCMapPolygon _serArea; // area for supplying WimaCorridorData _corridor; // corridor connecting opArea and serArea
QGCMapPolygon _corridor; // corridor connecting opArea and serArea bool _localPlanDataValid;
}; };
...@@ -16,6 +16,18 @@ WimaCorridor::WimaCorridor(const WimaCorridor &other, QObject *parent) ...@@ -16,6 +16,18 @@ WimaCorridor::WimaCorridor(const WimaCorridor &other, QObject *parent)
init(); init();
} }
/*!
* \overload operator=()
*
* Calls the inherited operator WimaArea::operator=().
*/
WimaCorridor &WimaCorridor::operator=(const WimaCorridor &other)
{
WimaArea::operator=(other);
return *this;
}
void WimaCorridor::saveToJson(QJsonObject &json) void WimaCorridor::saveToJson(QJsonObject &json)
{ {
this->WimaArea::saveToJson(json); this->WimaArea::saveToJson(json);
...@@ -34,11 +46,6 @@ bool WimaCorridor::loadFromJson(const QJsonObject &json, QString &errorString) ...@@ -34,11 +46,6 @@ bool WimaCorridor::loadFromJson(const QJsonObject &json, QString &errorString)
} }
} }
void WimaCorridor::update(const WimaCorridor &area)
{
this->WimaArea::update(area);
}
void WimaCorridor::init() void WimaCorridor::init()
{ {
this->setObjectName(WimaCorridorName); this->setObjectName(WimaCorridorName);
......
...@@ -12,6 +12,8 @@ public: ...@@ -12,6 +12,8 @@ public:
WimaCorridor(QObject* parent = nullptr); WimaCorridor(QObject* parent = nullptr);
WimaCorridor(const WimaCorridor& other, QObject* parent = nullptr); WimaCorridor(const WimaCorridor& other, QObject* parent = nullptr);
WimaCorridor &operator=(const WimaCorridor &other);
// Overrides from WimaPolygon // Overrides from WimaPolygon
QString mapVisualQML (void) const { return "WimaCorridorMapVisual.qml";} QString mapVisualQML (void) const { return "WimaCorridorMapVisual.qml";}
QString editorQML (void) const { return "WimaCorridorEditor.qml";} QString editorQML (void) const { return "WimaCorridorEditor.qml";}
...@@ -30,8 +32,6 @@ public: ...@@ -30,8 +32,6 @@ public:
signals: signals:
public slots: public slots:
/// Updates this with data from area
void update(const WimaCorridor& area);
private: private:
void init(); void init();
......
#include "WimaCorridorData.h" #include "WimaCorridorData.h"
const char *WimaCorridorData::typeString = "WimaCorridorData";
WimaCorridorData::WimaCorridorData(QObject *parent) WimaCorridorData::WimaCorridorData(QObject *parent)
:WimaAreaData (parent) :WimaAreaData (parent)
...@@ -7,10 +8,40 @@ WimaCorridorData::WimaCorridorData(QObject *parent) ...@@ -7,10 +8,40 @@ WimaCorridorData::WimaCorridorData(QObject *parent)
} }
WimaCorridorData::WimaCorridorData(WimaCorridorData &other, QObject *parent) WimaCorridorData::WimaCorridorData(const WimaCorridorData &other, QObject *parent)
: WimaAreaData (other, parent) : WimaAreaData (parent)
{ {
*this = other;
}
WimaCorridorData::WimaCorridorData(const WimaCorridor &other, QObject *parent)
: WimaAreaData (parent)
{
*this = other;
}
/*!
* \overload operator=()
*
* Assigns \a other to the invoking object.
*/
WimaCorridorData &WimaCorridorData::operator=(const WimaCorridorData &other)
{
WimaAreaData::operator=(other);
return *this;
}
/*!
* \overload operator=()
*
* Assigns \a other to the invoking object.
*/
WimaCorridorData &WimaCorridorData::operator=(const WimaCorridor &other)
{
WimaAreaData::operator=(other);
return *this;
} }
/*! /*!
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#include <QObject> #include <QObject>
#include "WimaAreaData.h" #include "WimaAreaData.h"
#include "WimaCorridor.h"
#include "QGeoCoordinate" #include "QGeoCoordinate"
class WimaCorridorData : public WimaAreaData class WimaCorridorData : public WimaAreaData
...@@ -10,8 +12,14 @@ class WimaCorridorData : public WimaAreaData ...@@ -10,8 +12,14 @@ class WimaCorridorData : public WimaAreaData
Q_OBJECT Q_OBJECT
public: public:
explicit WimaCorridorData(QObject *parent = nullptr); WimaCorridorData(QObject *parent = nullptr);
explicit WimaCorridorData(WimaCorridorData &other, QObject *parent = nullptr); WimaCorridorData(const WimaCorridorData &other, QObject *parent = nullptr);
WimaCorridorData(const WimaCorridor &other, QObject *parent = nullptr);
WimaCorridorData &operator=(const WimaCorridorData &other);
WimaCorridorData &operator=(const WimaCorridor &other);
static const char* typeString;
signals: signals:
......
...@@ -2,55 +2,75 @@ ...@@ -2,55 +2,75 @@
WimaDataContainer::WimaDataContainer(QObject *parent) WimaDataContainer::WimaDataContainer(QObject *parent)
: QObject (parent) : QObject (parent)
, _joinedArea (nullptr) , _planData (this /* parent */)
, _opArea (nullptr) , _dataValid (false)
, _serArea (nullptr)
, _corridor (nullptr)
{ {
} }
void WimaDataContainer::setJoinedArea(const WimaArea *joinedArea) /*!
* \fn bool WimaDataContainer::dataValid() const
* Returns \c true if the data is valid, \c false else.
*/
bool WimaDataContainer::dataValid() const
{ {
if (_joinedArea != joinedArea) { return _dataValid;
_joinedArea = joinedArea;
emit joinedAreaChanged(_joinedArea);
}
} }
void WimaDataContainer::setOpArea(const WimaMeasurementArea *opArea) /*!
* \fn void WimaDataContainer::push(const WimaPlanData &planData)
*
* Updates the \c WimaPlanData members content with \a planData.
* Emits the planDataChanged() signal.
*
* \sa WimaPlanData
*/
void WimaDataContainer::push(const WimaPlanData &planData)
{ {
if (_opArea != opArea) { setDataValid(false);
_opArea = opArea; _planData = planData;
setDataValid(true);
emit opAreaChanged(_opArea);
}
} }
void WimaDataContainer::setSerArea(const WimaServiceArea *serArea) /*!
* \fn const WimaPlanData &WimaDataContainer::pull() const
*
* Returns a constant referenc to the \c WimaPlanData member.
*
* \sa WimaPlanData
*/
const WimaPlanData &WimaDataContainer::pull() const
{ {
if (_serArea != serArea) { return _planData;
_serArea = serArea;
emit serAreaChanged(_serArea);
}
} }
void WimaDataContainer::setCorridor(const WimaCorridor *corridor) /*!
* \fn void WimaDataContainer::setDataValid(bool valid)
*
* Sets the validity of the data to \a valid.
* Mainly for internal usage. Should be invoked from \c WimaPlaner only.
*
* \sa WimaPlanData
*/
void WimaDataContainer::setDataValid(bool valid)
{ {
if (_corridor != corridor) { if ( _dataValid != valid ) {
_corridor = corridor; _dataValid = valid;
emit corridorChanged(_corridor); emit dataValidChanged(_dataValid);
} }
} }
void WimaDataContainer::setVisualItems(const QmlObjectListModel *visualItems) /*!
{ * \class WimaDataContainer
if (_visualItems != visualItems) { * \brief Data container designed for data exchange between \c WimaPlaner and \c WimaController.
_visualItems = visualItems; * Data container designed for data exchange between \c WimaPlaner and \c WimaController.
* It is meant that only one instance of this class exists. Both \c WimaPlaner and \c WimaController
* have a reference to this instance and can modify its data.
*
* \sa WimaController, WimaPlaner
*/
emit visualItemsChanged(_visualItems);
}
}
...@@ -2,46 +2,31 @@ ...@@ -2,46 +2,31 @@
#include <QObject> #include <QObject>
#include "QmlObjectListModel.h" #include "WimaPlanData.h"
#include "WimaArea.h"
#include "WimaMeasurementArea.h"
#include "WimaServiceArea.h"
#include "WimaCorridor.h"
class WimaDataContainer : public QObject class WimaDataContainer : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit WimaDataContainer(QObject *parent = nullptr); WimaDataContainer(QObject *parent = nullptr);
WimaDataContainer(WimaDataContainer &other, QObject *parent = nullptr) = delete; WimaDataContainer(WimaDataContainer &other, QObject *parent = nullptr) = delete;
WimaDataContainer(WimaDataContainer &other) = delete; WimaDataContainer(WimaDataContainer &other) = delete;
const WimaArea * joinedArea (void) { return _joinedArea; } Q_INVOKABLE WimaDataContainer* pointerToThis() {return this;}
const WimaMeasurementArea * opArea (void) { return _opArea; }
const WimaServiceArea * serArea (void) { return _serArea; } bool dataValid() const;
const WimaCorridor * corridor (void) { return _corridor; }
const QmlObjectListModel * visualItems (void) { return _visualItems; }
signals: signals:
void joinedAreaChanged (const WimaArea *area); void dataValidChanged (bool valid);
void opAreaChanged (const WimaMeasurementArea *area);
void serAreaChanged (const WimaServiceArea *area);
void corridorChanged (const WimaCorridor *area);
void visualItemsChanged (const QmlObjectListModel *area);
public slots: public slots:
void setJoinedArea (const WimaArea *joinedArea); void push(const WimaPlanData &planData);
void setOpArea (const WimaMeasurementArea *opArea); const WimaPlanData &pull() const;
void setSerArea (const WimaServiceArea *serArea); void setDataValid(bool valid);
void setCorridor (const WimaCorridor *corridor);
void setVisualItems (const QmlObjectListModel *visualItems);
private: private:
const WimaArea *_joinedArea;
const WimaMeasurementArea *_opArea;
const WimaServiceArea *_serArea; WimaPlanData _planData;
const WimaCorridor *_corridor; bool _dataValid;
const QmlObjectListModel *_visualItems;
}; };
[ [
{ {
"name": "BottomLayerAltitude", "name": "BottomLayerAltitude",
"shortDescription": "Altitude of the bottom layer.", "shortDescription": "The distance between the terrain and the first layer of the measurement path.",
"type": "double", "type": "double",
"units": "m", "units": "m",
"min": 1, "min": 1,
"decimalPlaces": 2, "decimalPlaces": 2,
"defaultValue": 10 "defaultValue": 5
}, },
{ {
"name": "NumberOfLayers", "name": "NumberOfLayers",
"shortDescription": "The number of layers.", "shortDescription": "The number of layers.",
"type": "uint32", "type": "uint32",
"units": "m",
"min": 1, "min": 1,
"decimalPlaces": 0,
"defaultValue": 1 "defaultValue": 1
}, },
{ {
"name": "LayerDistance", "name": "LayerDistance",
"shortDescription": "The distance between two adjacent layers.", "shortDescription": "Specify the time between each photo",
"type": "double", "type": "double",
"units": "m", "units": "m",
"min": 0, "min": 0,
"decimalPlaces": 2, "decimalPlaces": 2,
"defaultValue": 2 "defaultValue": 1
}, },
{ {
"name": "BorderPolygonOffset", "name": "BorderPolygonOffset",
"shortDescription": "The distance between the Operation Area and it's surounding Border Polygon.", "shortDescription": "The distance between the measurement area and it's enclosing polygon",
"type": "double", "type": "double",
"units": "m", "units": "m",
"min": 0, "min": 0,
......
#include "WimaMeasurementArea.h" #include "WimaMeasurementArea.h"
const char* WimaMeasurementArea::settingsGroup = "OperationArea"; const char* WimaMeasurementArea::settingsGroup = "MeasurementArea";
const char* WimaMeasurementArea::bottomLayerAltitudeName = "BottomLayerAltitude"; const char* WimaMeasurementArea::bottomLayerAltitudeName = "BottomLayerAltitude";
const char* WimaMeasurementArea::numberOfLayersName = "NumberOfLayers"; const char* WimaMeasurementArea::numberOfLayersName = "NumberOfLayers";
const char* WimaMeasurementArea::layerDistanceName = "LayerDistance"; const char* WimaMeasurementArea::layerDistanceName = "LayerDistance";
const char* WimaMeasurementArea::borderPolygonOffsetName = "BorderPolygonOffset"; const char* WimaMeasurementArea::borderPolygonOffsetName = "BorderPolygonOffset";
const char* WimaMeasurementArea::WimaMeasurementAreaName = "Operation Area"; const char* WimaMeasurementArea::WimaMeasurementAreaName = "Measurement Area";
WimaMeasurementArea::WimaMeasurementArea(QObject *parent) WimaMeasurementArea::WimaMeasurementArea(QObject *parent)
...@@ -21,6 +21,18 @@ WimaMeasurementArea::WimaMeasurementArea(const WimaMeasurementArea &other, QObje ...@@ -21,6 +21,18 @@ WimaMeasurementArea::WimaMeasurementArea(const WimaMeasurementArea &other, QObje
init(); init();
} }
/*!
* \overload operator=()
*
* Calls the inherited operator WimaArea::operator=().
*/
WimaMeasurementArea &WimaMeasurementArea::operator=(const WimaMeasurementArea &other)
{
WimaArea::operator=(other);
return *this;
}
void WimaMeasurementArea::saveToJson(QJsonObject &json) void WimaMeasurementArea::saveToJson(QJsonObject &json)
{ {
this->WimaArea::saveToJson(json); this->WimaArea::saveToJson(json);
...@@ -70,21 +82,40 @@ bool WimaMeasurementArea::loadFromJson(const QJsonObject &json, QString& errorSt ...@@ -70,21 +82,40 @@ bool WimaMeasurementArea::loadFromJson(const QJsonObject &json, QString& errorSt
} }
} }
void WimaMeasurementArea::update(const WimaMeasurementArea &area) void WimaMeasurementArea::setBottomLayerAltitude(double altitude)
{
if ( !qFuzzyCompare(_bottomLayerAltitude.rawValue().toDouble(), altitude) ) {
_bottomLayerAltitude.setRawValue(altitude);
emit bottomLayerAltitudeChanged();
}
}
void WimaMeasurementArea::setNumberOfLayers(double numLayers)
{ {
this->WimaArea::update(area); if ( !qFuzzyCompare(_numberOfLayers.rawValue().toDouble(), numLayers) ) {
_numberOfLayers.setRawValue(numLayers);
this->setBottomLayerAltitude(area.bottomLayerAltitude()); emit numberOfLayersChanged();
this->setNumberOfLayers(area.numberOfLayers()); }
this->setLayerDistance(area.layerDistance()); }
this->setBorderPolygonOffset(area.borderPolygonOffset());
void WimaMeasurementArea::setLayerDistance(double layerDistance)
{
if ( !qFuzzyCompare(_layerDistance.rawValue().toDouble(), layerDistance) ) {
_layerDistance.setRawValue(layerDistance);
recalcBorderPolygon(); emit layerDistanceChanged();
}
} }
void WimaMeasurementArea::setBottomLayerAltitude(double altitude) void WimaMeasurementArea::setBorderPolygonOffset(double offset)
{ {
if ( !qFuzzyCompare(_borderPolygonOffset.rawValue().toDouble(), offset) ) {
_borderPolygonOffset.setRawValue(offset);
emit borderPolygonOffsetChanged();
}
} }
void print(const WimaMeasurementArea &area) void print(const WimaMeasurementArea &area)
...@@ -111,11 +142,8 @@ void print(const WimaMeasurementArea &area, QString outputStr) ...@@ -111,11 +142,8 @@ void print(const WimaMeasurementArea &area, QString outputStr)
void WimaMeasurementArea::recalcBorderPolygon() void WimaMeasurementArea::recalcBorderPolygon()
{ {
//qWarning("WimaMeasurementArea::recalcBorderPolygon() %f", _borderPolygonOffset.rawValue().toDouble()); _borderPolygon = this->toQGCPolygon(*this);
QGCMapPolygon polyCopy = this->toQGCPolygon(*this); _borderPolygon.offset(_borderPolygonOffset.rawValue().toDouble());
polyCopy.offset(_borderPolygonOffset.rawValue().toDouble());
_borderPolygon.setPath(polyCopy.path());
polyCopy.deleteLater();
emit borderPolygonChanged(); emit borderPolygonChanged();
} }
...@@ -135,4 +163,11 @@ void WimaMeasurementArea::init() ...@@ -135,4 +163,11 @@ void WimaMeasurementArea::init()
connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaMeasurementArea::recalcBorderPolygon); connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaMeasurementArea::recalcBorderPolygon);
} }
/*!
* \class WimaMeasurementArea
* \brief Class defining the area inside which the actual drone measurements are performed.
*
* \sa WimaArea, WimaController, WimaPlaner
*/
#pragma once #pragma once
#include "QScopedPointer"
#include <QObject> #include <QObject>
#include "WimaArea.h" #include "WimaArea.h"
#include "WimaMeasurementAreaData.h"
#include "SettingsFact.h" #include "SettingsFact.h"
#include "WimaTrackerPolyline.h"
#include "QScopedPointer"
class WimaMeasurementArea : public WimaArea class WimaMeasurementArea : public WimaArea
{ {
...@@ -13,12 +15,13 @@ class WimaMeasurementArea : public WimaArea ...@@ -13,12 +15,13 @@ class WimaMeasurementArea : public WimaArea
public: public:
WimaMeasurementArea(QObject* parent = nullptr); WimaMeasurementArea(QObject* parent = nullptr);
WimaMeasurementArea(const WimaMeasurementArea &other, QObject *parent = nullptr); WimaMeasurementArea(const WimaMeasurementArea &other, QObject *parent = nullptr);
WimaMeasurementArea &operator=(const WimaMeasurementArea &other);
Q_PROPERTY(Fact* bottomLayerAltitude READ bottomLayerAltitudeFact CONSTANT) Q_PROPERTY(Fact* bottomLayerAltitude READ bottomLayerAltitudeFact CONSTANT)
Q_PROPERTY(Fact* numberOfLayers READ numberOfLayersFact CONSTANT) Q_PROPERTY(Fact* numberOfLayers READ numberOfLayersFact CONSTANT)
Q_PROPERTY(Fact* layerDistance READ layerDistanceFact CONSTANT) Q_PROPERTY(Fact* layerDistance READ layerDistanceFact CONSTANT)
Q_PROPERTY(Fact* borderPolygonOffset READ borderPolygonOffsetFact CONSTANT) Q_PROPERTY(Fact* borderPolygonOffset READ borderPolygonOffsetFact CONSTANT)
Q_PROPERTY(QGCMapPolygon borderPolygon READ borderPolygon NOTIFY borderPolygonChanged) Q_PROPERTY(QGCMapPolygon* borderPolygon READ borderPolygon NOTIFY borderPolygonChanged)
// Overrides from WimaPolygon // Overrides from WimaPolygon
QString mapVisualQML (void) const { return "WimaMeasurementAreaMapVisual.qml";} QString mapVisualQML (void) const { return "WimaMeasurementAreaMapVisual.qml";}
...@@ -33,7 +36,7 @@ public: ...@@ -33,7 +36,7 @@ public:
int numberOfLayers (void) const { return _numberOfLayers.rawValue().toInt();} int numberOfLayers (void) const { return _numberOfLayers.rawValue().toInt();}
double layerDistance (void) const { return _layerDistance.rawValue().toDouble();} double layerDistance (void) const { return _layerDistance.rawValue().toDouble();}
double borderPolygonOffset (void) const { return _borderPolygonOffset.rawValue().toDouble();} double borderPolygonOffset (void) const { return _borderPolygonOffset.rawValue().toDouble();}
QGCMapPolygon borderPolygon (void) const { return _borderPolygon;} QGCMapPolygon* borderPolygon (void) { return &_borderPolygon;}
// Member Methodes // Member Methodes
void saveToJson(QJsonObject& json); void saveToJson(QJsonObject& json);
...@@ -58,10 +61,9 @@ signals: ...@@ -58,10 +61,9 @@ signals:
void polylineChanged (void); void polylineChanged (void);
void vehicleCorridorChanged (WimaVCorridor* corridor); void vehicleCorridorChanged (WimaVCorridor* corridor);
void borderPolygonChanged (void); void borderPolygonChanged (void);
void borderPolygonOffsetChanged (void);
public slots: public slots:
/// Updates this with data from area
void update(const WimaMeasurementArea &area);
void setBottomLayerAltitude (double altitude); void setBottomLayerAltitude (double altitude);
void setNumberOfLayers (double numLayers); void setNumberOfLayers (double numLayers);
void setLayerDistance (double layerDistance); void setLayerDistance (double layerDistance);
......
#include "WimaMeasurementAreaData.h"
const char *WimaMeasurementAreaData::typeString = "WimaMeasurementAreaData";
WimaMeasurementAreaData::WimaMeasurementAreaData(QObject *parent)
: WimaAreaData(parent)
{
}
WimaMeasurementAreaData::WimaMeasurementAreaData(const WimaMeasurementAreaData &other, QObject *parent)
: WimaAreaData (parent)
{
*this = other;
}
WimaMeasurementAreaData::WimaMeasurementAreaData(const WimaMeasurementArea &other, QObject *parent)
: WimaAreaData (parent)
{
*this = other;
}
/*!
* \overload operator=();
*
* Assigns \a other to the invoking object.
*/
WimaMeasurementAreaData &WimaMeasurementAreaData::operator=(const WimaMeasurementAreaData &other)
{
WimaAreaData::operator=(other);
return *this;
}
/*!
* \overload operator=();
*
* Assigns \a other to the invoking object.
*/
WimaMeasurementAreaData &WimaMeasurementAreaData::operator=(const WimaMeasurementArea &other)
{
WimaAreaData::operator=(other);
return *this;
}
#pragma once #pragma once
#include <QObject> #include <QObject>
#include "QGeoCoordinate"
#include "WimaAreaData.h" #include "WimaAreaData.h"
#include "QGeoCoordinate" #include "WimaMeasurementArea.h"
class WimaMeasurementAreaData : public WimaAreaData class WimaMeasurementAreaData : public WimaAreaData
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit WimaMeasurementAreaData(QObject *parent = nullptr); WimaMeasurementAreaData(QObject *parent = nullptr);
explicit WimaMeasurementAreaData(WimaMeasurementAreaData &other, QObject *parent = nullptr); WimaMeasurementAreaData(const WimaMeasurementAreaData &other, QObject *parent = nullptr);
WimaMeasurementAreaData(const WimaMeasurementArea &other, QObject *parent = nullptr);
WimaMeasurementAreaData& operator=(const WimaMeasurementAreaData &other);
WimaMeasurementAreaData& operator=(const WimaMeasurementArea &other);
const QGeoCoordinate &takeOffPosition() const; static const char* typeString;
const QGeoCoordinate &landOffPosition() const;
signals: signals:
void takeOffPositionChanged(const QGeoCoordinate& other);
void landOffPositionChanged(const QGeoCoordinate& other);
public slots: public slots:
void setTakeOffPosition(const QGeoCoordinate& newCoordinate);
void setLandOffPosition(const QGeoCoordinate& newCoordinate);
private: private:
// see WimaServieArea.h for explanation // see WimaMeasurementArea.h for explanation
}; };
#include "WimaMeasurementAreaData.h"
WimaMeasurementAreaData::WimaMeasurementAreaData(QObject *parent) : QObject(parent)
{
}
#include "WimaPlanData.h"
WimaPlanData::WimaPlanData(QObject *parent)
: QObject (parent)
{
}
WimaPlanData::WimaPlanData(const WimaPlanData &other, QObject *parent)
: QObject (parent)
{
*this = other;
}
/*!
* \fn WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other)
*
* Copies the data area list of \a other to the calling \c WimaPlanData object.
* Returns a reference to the calling \c WimaPlanData object.
*/
WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other)
{
QList<const WimaAreaData*> areaList = other.areaList();
_areaList.clear();
for (const WimaAreaData* areaData: areaList) {
if (areaData->type() == WimaAreaData::typeString) {
this->append(*areaData);
}else if (areaData->type() == WimaServiceAreaData::typeString) {
this->append(*qobject_cast<WimaServiceAreaData*>(areaData));
}else if (areaData->type() == WimaMeasurementAreaData::typeString) {
this->append(*qobject_cast<WimaMeasurementAreaData*>(areaData));
}else if (areaData->type() == WimaCorridorData::typeString) {
this->append(*qobject_cast<WimaCorridorData*>(areaData));
}
}
return *this;
}
/*!
* \fn void WimaPlanData::append(const WimaAreaData &areaData)
*
* Adds a WimaAreaData item.
*/
void WimaPlanData::append(const WimaAreaData &areaData)
{
_joinedArea = areaData;
if( !_areaList.contains(&_joinedArea) ) {
_areaList.append(&_joinedArea);
}
}
/*!
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData)
*
* Adds a WimaServiceAreaData item.
*/
void WimaPlanData::append(const WimaServiceAreaData &areaData)
{
_serviceArea = areaData;
if( !_areaList.contains(&_serviceArea) ) {
_areaList.append(&_serviceArea);
}
}
/*!
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData)
*
* Adds a WimaCorridorData item.
*/
void WimaPlanData::append(const WimaCorridorData &areaData)
{
_corridor = areaData;
if( !_areaList.contains(&_corridor) ) {
_areaList.append(&_corridor);
}
}
/*!
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData)
*
* Adds a WimaMeasurementAreaData item.
*/
void WimaPlanData::append(const WimaMeasurementAreaData &areaData)
{
_measurementArea = areaData;
if( !_areaList.contains(&_measurementArea) ) {
_areaList.append(&_measurementArea);
}
}
/*!
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData)
*
* Clears all stored objects
*/
void WimaPlanData::clear()
{
_areaList.clear();
}
QList<const WimaAreaData *> WimaPlanData::areaList() const
{
return _areaList;
}
/*!
* \class WimaPlanData
* \brief Class storing data generated by the \c WimaPlaner class.
*
* This class is designed to store data generated by the \c WimaPlaner class and
* meant for data exchange between the \c WimaController and the \c WimaPlanner.
* It stores a QList of \c WimaAreaData objects, called area data list, containing the data of serveral \c WimaAreas
* generated by the \c WimaPlaner.
*
* \sa QList
*/
#pragma once
#include <QObject>
#include "WimaAreaData.h"
#include "WimaServiceAreaData.h"
#include "WimaCorridorData.h"
#include "WimaMeasurementAreaData.h"
class WimaPlanData : QObject
{
Q_OBJECT
public:
WimaPlanData(QObject *parent = nullptr);
WimaPlanData(const WimaPlanData &other, QObject *parent = nullptr);
WimaPlanData& operator=(const WimaPlanData &other);
// Member Methodes
void append(const WimaAreaData &areaData);
void append(const WimaServiceAreaData &areaData);
void append(const WimaCorridorData &areaData);
void append(const WimaMeasurementAreaData &areaData);
void clear();
QList<const WimaAreaData *> areaList() const;
signals:
void areaListChanged();
private:
WimaAreaData _joinedArea;
WimaServiceAreaData _serviceArea;
WimaCorridorData _corridor;
WimaMeasurementAreaData _measurementArea;
QList<const WimaAreaData*> _areaList;
};
This diff is collapsed.
...@@ -9,6 +9,11 @@ ...@@ -9,6 +9,11 @@
#include "WimaServiceArea.h" #include "WimaServiceArea.h"
#include "WimaCorridor.h" #include "WimaCorridor.h"
#include "WimaDataContainer.h" #include "WimaDataContainer.h"
#include "WimaPlanData.h"
#include "WimaAreaData.h"
#include "WimaServiceAreaData.h"
#include "WimaMeasurementAreaData.h"
#include "WimaCorridorData.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "MissionController.h" #include "MissionController.h"
...@@ -41,13 +46,13 @@ public: ...@@ -41,13 +46,13 @@ public:
Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT) Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT) Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT)
Q_PROPERTY(WimaDataContainer* dataContainer WRITE setDataContainer NOTIFY dataContainerChanged) Q_PROPERTY(WimaDataContainer* dataContainer READ dataContainer WRITE setDataContainer NOTIFY dataContainerChanged)
Q_PROPERTY(bool readyForSaveSend READ readyForSaveSend NOTIFY readyForSaveSendChanged) Q_PROPERTY(bool missionReady READ missionReady NOTIFY missionReadyChanged)
// Property accessors // Property accessors
PlanMasterController* masterController (void) const { return _masterController; } PlanMasterController* masterController (void) { return _masterController; }
MissionController* missionController (void) const { return _missionController; } MissionController* missionController (void) { return _missionController; }
QmlObjectListModel* visualItems (void) ; QmlObjectListModel* visualItems (void) ;
int currentPolygonIndex (void) const { return _currentAreaIndex; } int currentPolygonIndex (void) const { return _currentAreaIndex; }
QString currentFile (void) const { return _currentFile; } QString currentFile (void) const { return _currentFile; }
...@@ -55,9 +60,8 @@ public: ...@@ -55,9 +60,8 @@ public:
QStringList saveNameFilters (void) const; QStringList saveNameFilters (void) const;
QString fileExtension (void) const { return wimaFileExtension; } QString fileExtension (void) const { return wimaFileExtension; }
QGeoCoordinate joinedAreaCenter (void) const; QGeoCoordinate joinedAreaCenter (void) const;
bool readyForSaveSend (void) const { return _readyForSaveSend; } bool missionReady (void) const { return _missionReady; }
WimaDataContainer* dataContainer (void) { return _container;}
// Property setters // Property setters
void setMasterController (PlanMasterController* masterController); void setMasterController (PlanMasterController* masterController);
...@@ -67,13 +71,12 @@ public: ...@@ -67,13 +71,12 @@ public:
void setDataContainer (WimaDataContainer* container); void setDataContainer (WimaDataContainer* container);
// Member Methodes // Member Methodes
Q_INVOKABLE void startWimaPlaner(bool flyView); Q_INVOKABLE bool addMeasurementArea();
Q_INVOKABLE bool addGOperationArea();
/// Removes an area from _visualItems /// Removes an area from _visualItems
/// @param index Index of the area to be removed /// @param index Index of the area to be removed
Q_INVOKABLE void removeArea(int index); Q_INVOKABLE void removeArea(int index);
Q_INVOKABLE bool addServiceArea(); Q_INVOKABLE bool addServiceArea();
Q_INVOKABLE bool addVehicleCorridor(); Q_INVOKABLE bool addCorridor();
/// Remove all areas from WimaPlaner and all mission items from MissionController /// Remove all areas from WimaPlaner and all mission items from MissionController
Q_INVOKABLE void removeAll(); Q_INVOKABLE void removeAll();
...@@ -92,16 +95,13 @@ public: ...@@ -92,16 +95,13 @@ public:
Q_INVOKABLE void resetAllInteractive(void); Q_INVOKABLE void resetAllInteractive(void);
Q_INVOKABLE void setInteractive(void); Q_INVOKABLE void setInteractive(void);
QJsonDocument saveToJson(FileType fileType);
// static Members // static Members
static const char* wimaFileExtension; static const char* wimaFileExtension;
static const char* areaItemsName; static const char* areaItemsName;
static const char* missionItemsName; static const char* missionItemsName;
// Member Methodes
QJsonDocument saveToJson(FileType fileType);
void setReadyForSaveSend(bool ready);
signals: signals:
void masterControllerChanged (void); void masterControllerChanged (void);
void missionControllerChanged (void); void missionControllerChanged (void);
...@@ -109,23 +109,28 @@ signals: ...@@ -109,23 +109,28 @@ signals:
void currentPolygonIndexChanged (int index); void currentPolygonIndexChanged (int index);
void currentFileChanged (); void currentFileChanged ();
void dataContainerChanged (); void dataContainerChanged ();
void readyForSaveSendChanged (bool ready); void missionReadyChanged (bool ready);
private slots: private slots:
void recalcPolygonInteractivity (int index); void recalcPolygonInteractivity (int index);
bool recalcJoinedArea (); bool recalcJoinedArea (QString &errorString);
void pushToContainer (); void pushToContainer ();
private: private:
bool _readyForSaveSend; // basically true if updateMission() was sucessful // Member Functions
WimaPlanData toPlanData();
void setMissionReady(bool ready);
// Member Variables
bool _missionReady; // basically true if updateMission() was sucessful
PlanMasterController *_masterController; PlanMasterController *_masterController;
MissionController *_missionController; MissionController *_missionController;
int _currentAreaIndex; int _currentAreaIndex;
QString _currentFile; // file for saveing QString _currentFile; // file for saveing
WimaDataContainer *_container; // container for data exchange with WimaController WimaDataContainer *_container; // container for data exchange with WimaController
QmlObjectListModel _visualItems; // contains all visible areas QmlObjectListModel _visualItems; // contains all visible areas
WimaArea _joinedArea; // joined area fromed by opArea, serArea, _corridor WimaArea _joinedArea; // joined area fromed by _measurementArea, _serviceArea, _corridor
WimaMeasurementArea _opArea; // measurement area WimaMeasurementArea _measurementArea; // measurement area
WimaServiceArea _serArea; // area for supplying WimaServiceArea _serviceArea; // area for supplying
WimaCorridor _corridor; // corridor connecting opArea and serArea WimaCorridor _corridor; // corridor connecting _measurementArea and _serviceArea
}; };
...@@ -16,6 +16,18 @@ WimaServiceArea::WimaServiceArea(const WimaServiceArea &other, QObject *parent) ...@@ -16,6 +16,18 @@ WimaServiceArea::WimaServiceArea(const WimaServiceArea &other, QObject *parent)
init(); init();
} }
/*!
* \overload operator=()
*
* Calls the inherited operator WimaArea::operator=().
*/
WimaServiceArea &WimaServiceArea::operator=(const WimaServiceArea &other)
{
WimaArea::operator=(other);
return *this;
}
void WimaServiceArea::setTakeOffPosition(const QGeoCoordinate &coordinate) void WimaServiceArea::setTakeOffPosition(const QGeoCoordinate &coordinate)
{ {
if(_takeOffPosition != coordinate){ if(_takeOffPosition != coordinate){
...@@ -50,13 +62,6 @@ bool WimaServiceArea::loadFromJson(const QJsonObject &json, QString &errorString ...@@ -50,13 +62,6 @@ bool WimaServiceArea::loadFromJson(const QJsonObject &json, QString &errorString
} }
} }
void WimaServiceArea::update(const WimaServiceArea &area)
{
this->WimaArea::update(area);
this->setTakeOffPosition(area.takeOffPosition());
this->setLandPosition(area.landPosition());
}
void print(const WimaServiceArea &area) void print(const WimaServiceArea &area)
{ {
QString message; QString message;
......
...@@ -10,6 +10,7 @@ class WimaServiceArea : public WimaArea ...@@ -10,6 +10,7 @@ class WimaServiceArea : public WimaArea
public: public:
WimaServiceArea(QObject* parent = nullptr); WimaServiceArea(QObject* parent = nullptr);
WimaServiceArea(const WimaServiceArea& other, QObject* parent); WimaServiceArea(const WimaServiceArea& other, QObject* parent);
WimaServiceArea& operator=(const WimaServiceArea &other);
Q_PROPERTY(const QGeoCoordinate& takeOffPosition READ takeOffPosition WRITE setTakeOffPosition NOTIFY takeOffPositionChanged) Q_PROPERTY(const QGeoCoordinate& takeOffPosition READ takeOffPosition WRITE setTakeOffPosition NOTIFY takeOffPositionChanged)
Q_PROPERTY(const QGeoCoordinate& landPosition READ landPosition WRITE setLandPosition NOTIFY landPositionChanged) Q_PROPERTY(const QGeoCoordinate& landPosition READ landPosition WRITE setLandPosition NOTIFY landPositionChanged)
...@@ -42,8 +43,6 @@ signals: ...@@ -42,8 +43,6 @@ signals:
public slots: public slots:
void setTakeOffPosition (const QGeoCoordinate& coordinate); void setTakeOffPosition (const QGeoCoordinate& coordinate);
void setLandPosition (const QGeoCoordinate& coordinate); void setLandPosition (const QGeoCoordinate& coordinate);
/// Updates this with data from area
void update(const WimaServiceArea &area);
private: private:
// Member Methodes // Member Methodes
......
#include "WimaServiceAreaData.h" #include "WimaServiceAreaData.h"
const char *WimaServiceAreaData::typeString = "WimaServiceAreaData";
WimaServiceAreaData::WimaServiceAreaData(QObject *parent) WimaServiceAreaData::WimaServiceAreaData(QObject *parent)
: WimaAreaData(parent) : WimaAreaData(parent)
...@@ -7,12 +9,34 @@ WimaServiceAreaData::WimaServiceAreaData(QObject *parent) ...@@ -7,12 +9,34 @@ WimaServiceAreaData::WimaServiceAreaData(QObject *parent)
} }
WimaServiceAreaData::WimaServiceAreaData(WimaServiceAreaData &other, QObject *parent) WimaServiceAreaData::WimaServiceAreaData(const WimaServiceAreaData &other, QObject *parent)
: WimaAreaData (other, parent) : WimaAreaData (parent)
, _takeOffPosition(other.takeOffPosition()) {
, _landPosition(other.landOffPosition()) *this = other;
}
WimaServiceAreaData::WimaServiceAreaData(const WimaServiceArea &other, QObject *parent)
: WimaAreaData (parent)
{
*this = other;
}
WimaServiceAreaData &WimaServiceAreaData::operator=(const WimaServiceAreaData &otherData)
{
WimaAreaData::operator=(otherData);
setLandPosition(otherData.landPosition());
setTakeOffPosition(otherData.takeOffPosition());
return *this;
}
WimaServiceAreaData &WimaServiceAreaData::operator=(const WimaServiceArea &otherArea)
{ {
WimaAreaData::operator=(otherArea);
setLandPosition(otherArea.landPosition());
setTakeOffPosition(otherArea.takeOffPosition());
return *this;
} }
/*! /*!
...@@ -30,7 +54,7 @@ const QGeoCoordinate &WimaServiceAreaData::takeOffPosition() const ...@@ -30,7 +54,7 @@ const QGeoCoordinate &WimaServiceAreaData::takeOffPosition() const
* Returns a constant reference to the landOffPosition. * Returns a constant reference to the landOffPosition.
* *
*/ */
const QGeoCoordinate &WimaServiceAreaData::landOffPosition() const const QGeoCoordinate &WimaServiceAreaData::landPosition() const
{ {
return _landPosition; return _landPosition;
} }
...@@ -56,12 +80,12 @@ void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate &newCoordinate ...@@ -56,12 +80,12 @@ void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate &newCoordinate
* if newCoordinate differs from the member value. * if newCoordinate differs from the member value.
* *
*/ */
void WimaServiceAreaData::setLandOffPosition(const QGeoCoordinate &newCoordinate) void WimaServiceAreaData::setLandPosition(const QGeoCoordinate &newCoordinate)
{ {
if (_landPosition != newCoordinate) { if (_landPosition != newCoordinate) {
_landPosition = newCoordinate; _landPosition = newCoordinate;
emit landOffPositionChanged(_landPosition); emit landPositionChanged(_landPosition);
} }
} }
......
#pragma once #pragma once
#include <QObject> #include <QObject>
#include "QGeoCoordinate"
#include "WimaAreaData.h" #include "WimaAreaData.h"
#include "QGeoCoordinate" #include "WimaServiceArea.h"
class WimaServiceAreaData : public WimaAreaData class WimaServiceAreaData : public WimaAreaData
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit WimaServiceAreaData(QObject *parent = nullptr); WimaServiceAreaData(QObject *parent = nullptr);
explicit WimaServiceAreaData(WimaServiceAreaData &other, QObject *parent = nullptr); WimaServiceAreaData(const WimaServiceAreaData &other, QObject *parent = nullptr);
WimaServiceAreaData(const WimaServiceArea &other, QObject *parent = nullptr);
WimaServiceAreaData& operator=(const WimaServiceAreaData &otherData);
WimaServiceAreaData& operator=(const WimaServiceArea &otherArea);
const QGeoCoordinate &takeOffPosition() const; const QGeoCoordinate &takeOffPosition() const;
const QGeoCoordinate &landOffPosition() const; const QGeoCoordinate &landPosition() const;
static const char* typeString;
signals: signals:
void takeOffPositionChanged(const QGeoCoordinate& other); void takeOffPositionChanged(const QGeoCoordinate& other);
void landOffPositionChanged(const QGeoCoordinate& other); void landPositionChanged(const QGeoCoordinate& other);
public slots: public slots:
void setTakeOffPosition(const QGeoCoordinate& newCoordinate); void setTakeOffPosition(const QGeoCoordinate& newCoordinate);
void setLandOffPosition(const QGeoCoordinate& newCoordinate); void setLandPosition(const QGeoCoordinate& newCoordinate);
private: private:
// see WimaServieArea.h for explanation // see WimaServieArea.h for explanation
......
project = Wima
headerdirs = ../
sourcedirs = ../
sources.fileextensions = "*.cpp *.cc *.qdoc *.mm *.qml"
headers.fileextensions = "*.h *.ch *.h++ *.hh *.hpp *.hxx"
examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml"
examples.imageextensions = "*.png *.jpeg *.jpg *.gif *.mng"
outputdir = ./doc/QDoc/html
outputformats = HTML
......
...@@ -20,7 +20,7 @@ Rectangle { ...@@ -20,7 +20,7 @@ Rectangle {
radius: _radius radius: _radius
property var map ///< Map control property var map ///< Map control
property var wimaController property var wimaPlaner
property var masterController property var masterController
property bool readOnly ///< true: read only view, false: full editing view property bool readOnly ///< true: read only view, false: full editing view
property var rootQgcView property var rootQgcView
...@@ -94,13 +94,18 @@ Rectangle { ...@@ -94,13 +94,18 @@ Rectangle {
id: hamburgerMenu id: hamburgerMenu
MenuItem { MenuItem {
text: qsTr("Add Operation Area") text: qsTr("Add Measurement Area")
onTriggered: wimaController.addGOperationArea() onTriggered: wimaPlaner.addMeasurementArea()
} }
MenuItem { MenuItem {
text: qsTr("Add Service Area") text: qsTr("Add Service Area")
onTriggered: wimaController.addServiceArea() onTriggered: wimaPlaner.addServiceArea()
}
MenuItem {
text: qsTr("Add Corridor")
onTriggered: wimaPlaner.addCorridor()
} }
MenuItem { MenuItem {
...@@ -108,10 +113,10 @@ Rectangle { ...@@ -108,10 +113,10 @@ Rectangle {
onTriggered: remove() onTriggered: remove()
} }
MenuItem { /*MenuItem {
text: qsTr("Change Area Type ...") text: qsTr("Change Area Type ...")
onTriggered: commandPicker.clicked() onTriggered: commandPicker.clicked()
} }*/
} }
......
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Dialogs 1.2
import QtQml 2.2
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Vehicle 1.0
import QGroundControl.Controls 1.0
import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0
/// Fly Area Item edit control
Rectangle {
id: _root
height: editorLoader.visible ? (editorLoader.y + editorLoader.height + (_margin * 2)) : (descriptionLabel.y + descriptionLabel.height + _margin / 2)
color: _currentItem ? qgcPal.missionItemEditor : qgcPal.windowShade
radius: _radius
property var map ///< Map control
property var flyArea
property var masterController
property var polygon ///< MissionItem associated with this editor
property bool readOnly ///< true: read only view, false: full editing view
property var rootQgcView
property int _index
signal clicked
signal remove
property var _masterController: masterController
property var _missionController: _masterController.missionController
property bool _currentItem: polygon.interactive
property color _outerTextColor: _currentItem ? qgcPal.primaryButtonText : qgcPal.text
property bool _noMissionItemsAdded: ListView.view.model.count === 1
property real _sectionSpacer: ScreenTools.defaultFontPixelWidth / 2 // spacing between section headings
readonly property real _editFieldWidth: Math.min(width - _margin * 2, ScreenTools.defaultFontPixelWidth * 12)
readonly property real _margin: ScreenTools.defaultFontPixelWidth / 2
readonly property real _radius: ScreenTools.defaultFontPixelWidth / 2
readonly property real _hamburgerSize: descriptionLabel.height * 0.75
readonly property bool _waypointsOnlyMode: QGroundControl.corePlugin.options.missionWaypointsOnly
QGCPalette {
id: qgcPal
colorGroupEnabled: enabled
}
FocusScope {
id: currentItemScope
anchors.fill: parent
MouseArea {
anchors.fill: parent
onClicked: {
currentItemScope.focus = true
_root.clicked()
}
}
}
QGCLabel {
id: label
anchors.verticalCenter: descriptionLabel.verticalCenter
anchors.leftMargin: _margin
anchors.left: parent.left
text: index
color: _outerTextColor
}
QGCColoredImage {
id: hamburger
anchors.rightMargin: ScreenTools.defaultFontPixelWidth
anchors.right: parent.right
anchors.verticalCenter: descriptionLabel.verticalCenter
width: _hamburgerSize
height: _hamburgerSize
sourceSize.height: _hamburgerSize
source: "qrc:/qmlimages/Hamburger.svg"
visible: _currentItem
color: qgcPal.text
}
QGCMouseArea {
fillItem: hamburger
visible: hamburger.visible
onClicked: {
currentItemScope.focus = true
hamburgerMenu.popup()
}
Menu {
id: hamburgerMenu
MenuItem {
text: qsTr("Insert Fly Area")
onTriggered: flyArea.appendFlyAreaPolygon()
}
MenuItem {
text: qsTr("Delete")
onTriggered: remove()
}
MenuItem {
text: qsTr("Copy Fly Area")
//onTriggered: //To Do
}
}
}
QGCLabel {
id: descriptionLabel
anchors.topMargin: _margin / 2
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2
anchors.rightMargin: ScreenTools.defaultFontPixelWidth
anchors.left: label.right
anchors.top: parent.top
text: "Fly Area"
verticalAlignment: Text.AlignVCenter
color: _outerTextColor
}
Loader {
id: editorLoader
anchors.leftMargin: _margin
anchors.topMargin: _margin
anchors.left: parent.left
anchors.top: descriptionLabel.bottom
source: "FlyAreaEditor.qml"
visible: _currentItem
property var masterController: _masterController
property real availableWidth: _root.width - (_margin * 2) ///< How wide the editor should be
property var editorRoot: _root
}
} // Rectangle
...@@ -27,7 +27,6 @@ Item { ...@@ -27,7 +27,6 @@ Item {
property var areaItem: object property var areaItem: object
property var _polygon: areaItem property var _polygon: areaItem
property var _borderPolygon: areaItem.borderPolygon
signal clicked(int sequenceNumber) signal clicked(int sequenceNumber)
...@@ -92,7 +91,7 @@ Item { ...@@ -92,7 +91,7 @@ Item {
WimaMapPolygonVisuals { WimaMapPolygonVisuals {
qgcView: _root.qgcView qgcView: _root.qgcView
mapControl: map mapControl: map
mapPolygon: _borderPolygon mapPolygon: areaItem.borderPolygon
borderWidth: 1 borderWidth: 1
borderColor: "white" borderColor: "white"
interiorColor: "transparent" interiorColor: "transparent"
......
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtLocation 5.3
import QtPositioning 5.3
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
import QGroundControl.Controls 1.0
import QGroundControl.FlightMap 1.0
/// Wima Global Measurement Area visuals
Item {
id: _root
property var map ///< Map control to place item in
property var qgcView ///< QGCView to use for popping dialogs
property var _missionItem: object
property var _polygon: object.polygon
signal clicked(int sequenceNumber)
/// Add an initial 4 sided polygon if there is none
function _addInitialPolygon() {
if (_polygon.count < 3) {
// Initial polygon is inset to take 2/3rds space
var rect = Qt.rect(map.centerViewport.x, map.centerViewport.y, map.centerViewport.width, map.centerViewport.height)
rect.x += (rect.width * 0.25) / 2
rect.y += (rect.height * 0.25) / 2
rect.width *= 0.25
rect.height *= 0.25
var centerCoord = map.toCoordinate(Qt.point(rect.x + (rect.width / 2), rect.y + (rect.height / 2)), false /* clipToViewPort */)
var topLeftCoord = map.toCoordinate(Qt.point(rect.x, rect.y), false /* clipToViewPort */)
var topRightCoord = map.toCoordinate(Qt.point(rect.x + rect.width, rect.y), false /* clipToViewPort */)
var bottomLeftCoord = map.toCoordinate(Qt.point(rect.x, rect.y + rect.height), false /* clipToViewPort */)
var bottomRightCoord = map.toCoordinate(Qt.point(rect.x + rect.width, rect.y + rect.height), false /* clipToViewPort */)
// Adjust polygon to max size
var maxSize = 100
var halfWidthMeters = Math.min(topLeftCoord.distanceTo(topRightCoord), maxSize) / 2
var halfHeightMeters = Math.min(topLeftCoord.distanceTo(bottomLeftCoord), maxSize) / 2
topLeftCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 0)
topRightCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 0)
bottomLeftCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 180)
bottomRightCoord = centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 180)
_polygon.appendVertex(topLeftCoord)
_polygon.appendVertex(topRightCoord)
_polygon.appendVertex(bottomRightCoord)
_polygon.appendVertex(bottomLeftCoord)
}
}
Component.onCompleted: {
_addInitialPolygon()
}
Component.onDestruction: {
}
QGCMapPolygonVisuals {
qgcView: _root.qgcView
mapControl: map
mapPolygon: _polygon
interactive: _missionItem.isCurrentPolygon
borderWidth: 1
borderColor: "black"
interiorColor: "yellow"
interiorOpacity: 0.25
}
}
This diff is collapsed.
...@@ -401,7 +401,7 @@ Item { ...@@ -401,7 +401,7 @@ Item {
visible: false visible: false
property var toolbar: wimaToolBar property var toolbar: wimaToolBar
property var dataContainer: wimaDataContainer property var dataContainerPointer: wimaDataContainer.pointerToThis()
} }
...@@ -410,7 +410,7 @@ Item { ...@@ -410,7 +410,7 @@ Item {
anchors.fill: parent anchors.fill: parent
visible: true visible: true
property var dataContainer: wimaDataContainer property var dataContainerPointer: wimaDataContainer.pointerToThis()
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//-- Loader helper for any child, no matter how deep can display an element //-- Loader helper for any child, no matter how deep can display an element
// on top of the video window. // on top of the video window.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment