From 62b3a020d15f7f1becf6f9a3f27d54c2d9ff8d6c Mon Sep 17 00:00:00 2001 From: Valentin Platzgummer Date: Sat, 14 Sep 2019 20:46:31 +0200 Subject: [PATCH] changing borderpolygon... --- qgroundcontrol.qrc | 1 + src/Wima/WimaArea.SettingsGroup.json | 17 ++++++++ src/Wima/WimaArea.cc | 43 ++++++++++++++++++- src/Wima/WimaArea.h | 38 ++++++++++++---- src/Wima/WimaMeasurementArea.cc | 37 ---------------- src/Wima/WimaMeasurementArea.h | 16 +------ src/WimaView/WimaItemEditor.qml | 2 +- src/WimaView/WimaMeasurementAreaMapVisual.qml | 22 +++------- 8 files changed, 97 insertions(+), 79 deletions(-) create mode 100644 src/Wima/WimaArea.SettingsGroup.json diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index adea3edae..b79253b2a 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -272,6 +272,7 @@ src/Settings/Video.SettingsGroup.json src/Wima/WimaMeasurementArea.SettingsGroup.json src/Wima/CircularSurvey.SettingsGroup.json + src/Wima/WimaArea.SettingsGroup.json src/comm/APMArduCopterMockLink.params diff --git a/src/Wima/WimaArea.SettingsGroup.json b/src/Wima/WimaArea.SettingsGroup.json new file mode 100644 index 000000000..33382b705 --- /dev/null +++ b/src/Wima/WimaArea.SettingsGroup.json @@ -0,0 +1,17 @@ +[ +{ + "name": "BorderPolygonOffset", + "shortDescription": "The distance between the measurement area and it's surrounding polygon", + "type": "double", + "units": "m", + "min": 0, + "decimalPlaces": 1, + "defaultValue": 5 +}, +{ + "name": "showBorderPolygon", + "shortDescription": "Border polygon will be displayed if checked.", + "type": "bool", + "defaultValue": true +} +] diff --git a/src/Wima/WimaArea.cc b/src/Wima/WimaArea.cc index 4205280f6..41374b98c 100644 --- a/src/Wima/WimaArea.cc +++ b/src/Wima/WimaArea.cc @@ -23,6 +23,8 @@ const char* WimaArea::wimaAreaName = "WimaArea"; const char* WimaArea::areaTypeName = "AreaType"; +const char* WimaArea::borderPolygonOffsetName = "BorderPolygonOffset"; +const char* WimaArea::settingsGroup ="MeasurementArea"; // Constructors WimaArea::WimaArea(QObject *parent) @@ -34,6 +36,8 @@ WimaArea::WimaArea(QObject *parent) WimaArea::WimaArea(const WimaArea &other, QObject *parent) : QGCMapPolygon (parent) + , _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/WimaArea.SettingsGroup.json"), this /* QObject parent */)) + , _borderPolygonOffset (SettingsFact(settingsGroup, _metaDataMap[borderPolygonOffsetName], this /* QObject parent */)) { init(); *this = other; @@ -69,6 +73,25 @@ void WimaArea::setMaxAltitude(double altitude) } } + + +void WimaArea::setBorderPolygonOffset(double offset) +{ + if ( !qFuzzyCompare(_borderPolygonOffset.rawValue().toDouble(), offset) ) { + _borderPolygonOffset.setRawValue(offset); + + emit borderPolygonOffsetChanged(); + } +} + +void WimaArea::recalcMeasurementPolygon() +{ + this->setPath(_borderPolygon.coordinateList()); + this->offset(-_borderPolygonOffset.rawValue().toDouble()); + + emit borderPolygonChanged(); +} + /*! * \fn int WimaArea::getClosestVertexIndex(const QGeoCoordinate &coordinate) const * Returns the index of the vertex (element of the polygon path) @@ -313,6 +336,7 @@ void WimaArea::saveToJson(QJsonObject &json) { this->QGCMapPolygon::saveToJson(json); json[maxAltitudeName] = _maxAltitude; + json[borderPolygonOffsetName] = _borderPolygonOffset.rawValue().toDouble(); json[areaTypeName] = wimaAreaName; // add WimaVehicle if necessary.. } @@ -330,15 +354,23 @@ bool WimaArea::loadFromJson(const QJsonObject &json, QString& errorString) if ( this->QGCMapPolygon::loadFromJson(json, false /*no poly required*/, errorString) ) { if ( json.contains(maxAltitudeName) && json[maxAltitudeName].isDouble()) { _maxAltitude = json[maxAltitudeName].toDouble(); - return true; } else { errorString.append(tr("Could not load Maximum Altitude value!\n")); return false; } + + if ( json.contains(borderPolygonOffsetName) && json[borderPolygonOffsetName].isDouble()) { + _borderPolygonOffset.setRawValue(json[borderPolygonOffsetName].toDouble()); + } else { + errorString.append(tr("Could not load border polygon offset value!\n")); + return false; + } } else { qWarning() << errorString; return false; } + + return true; } /*! @@ -348,6 +380,8 @@ bool WimaArea::loadFromJson(const QJsonObject &json, QString& errorString) void WimaArea::init() { this->setObjectName(wimaAreaName); + connect(&_borderPolygon, &QGCMapPolygon::pathChanged, this, &WimaArea::recalcPolygons); + connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaArea::recalcPolygons); } /*! @@ -370,6 +404,13 @@ void print(const WimaArea &area, QString &outputString) outputString.append(QString("Type: %1\n").arg(area.objectName())); print(static_cast(area), outputString); outputString.append(QString("Maximum Altitude: %1\n").arg(area._maxAltitude)); + outputString.append(QString("Border Polygon Offset: %1\n").arg(area._borderPolygonOffset.rawValue().toDouble())); + + outputString.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); + outputString.append(QString("%1\n").arg(coordinate.toString(QGeoCoordinate::Degrees))); + } } diff --git a/src/Wima/WimaArea.h b/src/Wima/WimaArea.h index f25c527c9..5cdd8d52e 100644 --- a/src/Wima/WimaArea.h +++ b/src/Wima/WimaArea.h @@ -23,12 +23,20 @@ public: WimaArea &operator=(const WimaArea &other); - Q_PROPERTY(double maxAltitude READ maxAltitude WRITE setMaxAltitude NOTIFY maxAltitudeChanged) - Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT) - Q_PROPERTY(QString editorQML READ editorQML CONSTANT) + Q_PROPERTY(double maxAltitude READ maxAltitude WRITE setMaxAltitude NOTIFY maxAltitudeChanged) + Q_PROPERTY(QString mapVisualQML READ mapVisualQML CONSTANT) + Q_PROPERTY(QString editorQML READ editorQML CONSTANT) + Q_PROPERTY(Fact* borderPolygonOffset READ borderPolygonOffsetFact CONSTANT) + Q_PROPERTY(QGCMapPolygon* borderPolygon READ borderPolygon NOTIFY borderPolygonChanged) + Q_PROPERTY(Fact* showBorderPolygon READ showBorderPolygon CONSTANT) + //Property accessors - double maxAltitude (void) const { return _maxAltitude;} + double maxAltitude (void) const { return _maxAltitude;} + Fact* borderPolygonOffsetFact (void) { return &_borderPolygonOffset;} + Fact* showBorderPolygon (void) { return &_showBorderPolygon;} + double borderPolygonOffset (void) const { return _borderPolygonOffset.rawValue().toDouble();} + QGCMapPolygon* borderPolygon (void) { return &_borderPolygon;} // overrides from WimaArea virtual QString mapVisualQML (void) const { return ""; } @@ -62,19 +70,33 @@ public: static const double epsilonMeter; static const char* maxAltitudeName; static const char* wimaAreaName; - static const char* areaTypeName; + static const char* areaTypeName; + static const char* borderPolygonOffsetName; + static const char* settingsGroup; signals: void maxAltitudeChanged (void); + void borderPolygonChanged (void); + void borderPolygonOffsetChanged (void); public slots: - void setMaxAltitude (double altitude); + void setMaxAltitude (double altitude); + void setShowBorderPolygon (bool showBorderPolygon); + void setBorderPolygonOffset (double offset); -private: - double _maxAltitude; +private slots: + void recalcPolygons (void); private: void init(); + + double _maxAltitude; + + QMap _metaDataMap; + SettingsFact _borderPolygonOffset; + SettingsFact _showBorderPolygon; + + QGCMapPolygon _borderPolygon; }; diff --git a/src/Wima/WimaMeasurementArea.cc b/src/Wima/WimaMeasurementArea.cc index 798ec605c..f797e16a2 100644 --- a/src/Wima/WimaMeasurementArea.cc +++ b/src/Wima/WimaMeasurementArea.cc @@ -5,7 +5,6 @@ const char* WimaMeasurementArea::settingsGroup = "MeasurementA const char* WimaMeasurementArea::bottomLayerAltitudeName = "BottomLayerAltitude"; const char* WimaMeasurementArea::numberOfLayersName = "NumberOfLayers"; const char* WimaMeasurementArea::layerDistanceName = "LayerDistance"; -const char* WimaMeasurementArea::borderPolygonOffsetName = "BorderPolygonOffset"; const char* WimaMeasurementArea::WimaMeasurementAreaName = "Measurement Area"; @@ -15,7 +14,6 @@ WimaMeasurementArea::WimaMeasurementArea(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 */)) { init(); } @@ -26,7 +24,6 @@ WimaMeasurementArea::WimaMeasurementArea(const WimaMeasurementArea &other, QObje , _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 */)) { init(); } @@ -49,7 +46,6 @@ void WimaMeasurementArea::saveToJson(QJsonObject &json) json[bottomLayerAltitudeName] = _bottomLayerAltitude.rawValue().toDouble(); json[numberOfLayersName] = _numberOfLayers.rawValue().toInt(); json[layerDistanceName] = _layerDistance.rawValue().toDouble(); - json[borderPolygonOffsetName] = _borderPolygonOffset.rawValue().toDouble(); json[areaTypeName] = WimaMeasurementAreaName; } @@ -79,13 +75,6 @@ bool WimaMeasurementArea::loadFromJson(const QJsonObject &json, QString& errorSt 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; @@ -119,15 +108,6 @@ void WimaMeasurementArea::setLayerDistance(double layerDistance) } } -void WimaMeasurementArea::setBorderPolygonOffset(double offset) -{ - if ( !qFuzzyCompare(_borderPolygonOffset.rawValue().toDouble(), offset) ) { - _borderPolygonOffset.setRawValue(offset); - - emit borderPolygonOffsetChanged(); - } -} - void print(const WimaMeasurementArea &area) { QString message; @@ -141,28 +121,11 @@ void print(const WimaMeasurementArea &area, QString 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() -{ - _borderPolygon = this->toQGCPolygon(*this); - _borderPolygon.offset(_borderPolygonOffset.rawValue().toDouble()); - - emit borderPolygonChanged(); } void WimaMeasurementArea::init() { 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 3d73aa558..9d0052503 100644 --- a/src/Wima/WimaMeasurementArea.h +++ b/src/Wima/WimaMeasurementArea.h @@ -19,8 +19,6 @@ public: 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";} @@ -30,12 +28,9 @@ public: 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) { return &_borderPolygon;} // Member Methodes void saveToJson(QJsonObject& json); @@ -50,25 +45,19 @@ public: 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); - void borderPolygonOffsetChanged (void); public slots: 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(); @@ -79,9 +68,6 @@ private: SettingsFact _bottomLayerAltitude; SettingsFact _numberOfLayers; SettingsFact _layerDistance; - SettingsFact _borderPolygonOffset; - - QGCMapPolygon _borderPolygon; }; diff --git a/src/WimaView/WimaItemEditor.qml b/src/WimaView/WimaItemEditor.qml index 598f1c049..9b2df5b62 100644 --- a/src/WimaView/WimaItemEditor.qml +++ b/src/WimaView/WimaItemEditor.qml @@ -140,7 +140,7 @@ Rectangle { } } - onClicked: qgcView.showDialog(commandDialog, qsTr("Select Mission Command"), qgcView.showDialogDefaultWidth, StandardButton.Cancel) + //onClicked: qgcView.showDialog(commandDialog, qsTr("Select Mission Command"), qgcView.showDialogDefaultWidth, StandardButton.Cancel) } QGCLabel { diff --git a/src/WimaView/WimaMeasurementAreaMapVisual.qml b/src/WimaView/WimaMeasurementAreaMapVisual.qml index 7f99715b0..ac192a86c 100644 --- a/src/WimaView/WimaMeasurementAreaMapVisual.qml +++ b/src/WimaView/WimaMeasurementAreaMapVisual.qml @@ -32,7 +32,7 @@ Item { /// Add an initial 4 sided polygon if there is none function _addInitialPolygon() { - if (_polygon.count < 3) { + if (areaItem.borderPolygon.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 @@ -55,10 +55,10 @@ Item { 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) + areaItem.borderPolygon.appendVertex(topLeftCoord) + areaItem.borderPolygon.appendVertex(topRightCoord) + areaItem.borderPolygon.appendVertex(bottomRightCoord) + areaItem.borderPolygon.appendVertex(bottomLeftCoord) } } @@ -98,16 +98,4 @@ Item { interiorOpacity: 1 } - - /*WimaMapPolylineVisuals { - qgcView: _root.qgcView - mapControl: map - mapPolyline: _polyline - lineWidth: 4 - lineColor: interactive ? "white" : "green" - enableSplitHandels: false - enableDragHandels: true - edgeHandelsOnly: true - }*/ - } -- 2.22.0