diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index adea3edaefc72f891a197a670050b83a4ae12d22..b79253b2a7b25de14a5099ee42021850bb247fcc 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 0000000000000000000000000000000000000000..33382b705b5a4c69c2bb21720a28cd91d28fabb2 --- /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 4205280f6d474a03de94bda6c1e6d64e4f7a8c42..41374b98c2dacba57c4204210b1d0f1bf4eef035 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 f25c527c994dfe227212d0508ea4ba16d28cde07..5cdd8d52e51473ddd54eaea5d99aedd17111a221 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 798ec605cefe245de3a8449b5967b07f1ec4efe4..f797e16a22428085f7d84b093a399f04f6e33609 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 3d73aa558fc7bce998b24e98ebda56668b8529e6..9d0052503d2d61b13f3c8cec02bf78ba90efbbf6 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 598f1c049bb8a5e0f1132fe3202b8b11ca4eab58..9b2df5b620cb33516dcc4b6c5c66a1356b58cfee 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 7f99715b045276e515e2a44fdfac557d303fce13..ac192a86ca2c160beff77d1c9e7482cfeaa393f9 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 - }*/ - }