diff --git a/src/Wima/WimaArea.cc b/src/Wima/WimaArea.cc index 3632a4eaaad9822435a7a61a46639cfba1c6e179..b70d3701ead443287f06051d43824476ee8ee838 100644 --- a/src/Wima/WimaArea.cc +++ b/src/Wima/WimaArea.cc @@ -92,4 +92,25 @@ QGeoCoordinate WimaArea::getClosestVertex(QGeoCoordinate coordinate) return this->vertexCoordinate(getClosestVertexIndex(coordinate)); } +QGCMapPolygon* WimaArea::toQGCPolygon(WimaArea *poly) +{ + if (poly != nullptr) { + QGCMapPolygon* qgcPoly = new QGCMapPolygon(this); + qgcPoly->setPath(poly->path()); + qgcPoly->setCenter(poly->center()); + qgcPoly->setCenterDrag(poly->centerDrag()); + qgcPoly->setInteractive(poly->interactive()); + + return qgcPoly; + } else { + qWarning("WimaArea::toQGCPolygon(): poly == nullptr"); + return nullptr; + } +} + +QGCMapPolygon *WimaArea::joinPolygons(QList polyList) +{ + +} + diff --git a/src/Wima/WimaArea.h b/src/Wima/WimaArea.h index cd61b7ca992b2281755976c429b37e9bee029184..147dc16213c8824e8ebbff79ffcf7ed33e67776c 100644 --- a/src/Wima/WimaArea.h +++ b/src/Wima/WimaArea.h @@ -39,7 +39,9 @@ public: //iterates over all vertices in _polygon and returns the index of that one closest to coordinate int getClosestVertexIndex (QGeoCoordinate coordinate); //iterates over all vertices in _polygon and returns that one closest to coordinate - QGeoCoordinate getClosestVertex (QGeoCoordinate coordinate); + QGeoCoordinate getClosestVertex (QGeoCoordinate coordinate); + QGCMapPolygon* toQGCPolygon (WimaArea* poly); + QGCMapPolygon* joinPolygons (QList polyList); signals: void maxAltitudeChanged (void); diff --git a/src/Wima/WimaController.cc b/src/Wima/WimaController.cc index 972871e5c9fa846a7768fcb868c7087047252074..eb20d011196e186a060d5ea0bcacddd7b97d9c66 100644 --- a/src/Wima/WimaController.cc +++ b/src/Wima/WimaController.cc @@ -90,7 +90,7 @@ bool WimaController::addVehicleCorridor(WimaGOperationArea *opArea, WimaServiceA bool newCorridorCreated = false; if(corridor == nullptr){ - corridor = new WimaVCorridor(this); + corridor = new WimaVCorridor(opArea); newCorridorCreated = true; }else { corridor->clear(); @@ -175,15 +175,42 @@ bool WimaController::updateMission() return false; } - // create survey mission, will be extened with more mission types in the future - int secNumber = _missionController->insertComplexMissionItem(_missionController->surveyComplexItemName(), new QGeoCoordinate(), _missionController->visualItems()->count()); - SurveyComplexItem* survey = qobject_cast(_missionController->visualItems()->get(secNumber)); - if (survey != nullptr) - { - survey-> - }else{ + // reset visual items + _missionController->removeAll(); + QmlObjectListModel* missionItems = _missionController->visualItems(); + // set home position to serArea center + MissionSettingsItem* settingsItem= qobject_cast(missionItems->get(0)); + if (settingsItem == nullptr){ + qWarning("WimaController::updateMission(): settingsItem == nullptr"); + return false; + } + settingsItem->setCoordinate(serArea->center()); + // set take off position item + _missionController->insertSimpleMissionItem(serArea->center(), 1); + // create survey item, will be extened with more mission types in the future + _missionController->insertComplexMissionItem(_missionController->surveyComplexItemName(), opArea->center(), 2); + SurveyComplexItem* survey = qobject_cast(missionItems->get(missionItems->count()-1)); + if (survey == nullptr){ + qWarning("WimaController::updateMission(): survey == nullptr"); return false; + } else { + survey->surveyAreaPolygon()->clear(); + survey->surveyAreaPolygon()->appendVertices(opArea->coordinateList()); + } + // create land position item + _missionController->insertSimpleMissionItem(serArea->center(), 3); + SimpleMissionItem* landItem = qobject_cast(missionItems->get(missionItems->count()-1)); + if (landItem == nullptr){ + qWarning("WimaController::updateMission(): landItem == nullptr"); + return false; + } else { + Vehicle* controllerVehicle = _masterController->controllerVehicle(); + MAV_CMD landCmd = controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_LAND : MAV_CMD_NAV_LAND; + if (controllerVehicle->firmwarePlugin()->supportedMissionCommands().contains(landCmd)) { + landItem->setCommand(landCmd); + } } + return true; } void WimaController::saveMission() @@ -213,19 +240,28 @@ void WimaController::recalcAll() void WimaController::recalcPolygonInteractivity(int index) { - resetAllIsCurrentPolygon(); - WimaArea* interactivePoly = qobject_cast(_visualItems->get(index)); - interactivePoly->setInteractive(true); + if (index >= 0 && index < _visualItems->count()) { + resetAllInteractive(); + WimaArea* interactivePoly = qobject_cast(_visualItems->get(index)); + interactivePoly->setInteractive(true); + } } -void WimaController::resetAllIsCurrentPolygon() +void WimaController::resetAllInteractive() { int itemCount = _visualItems->count(); - for (int i = 0; i < itemCount; i++) { - WimaArea* iteratorPoly = qobject_cast(_visualItems->get(i)); - iteratorPoly->setInteractive(false); + if (itemCount > 0){ + for (int i = 0; i < itemCount; i++) { + WimaArea* iteratorPoly = qobject_cast(_visualItems->get(i)); + iteratorPoly->setInteractive(false); + } } } +void WimaController::setInteractive() +{ + recalcPolygonInteractivity(_currentPolygonIndex); +} + diff --git a/src/Wima/WimaController.h b/src/Wima/WimaController.h index e7b9d441259f38fc4539cd1775066d69e5b6fd94..8a03d90b874e886492f6dd1a4974b21a75e4b2b2 100644 --- a/src/Wima/WimaController.h +++ b/src/Wima/WimaController.h @@ -12,6 +12,8 @@ #include "PlanMasterController.h" #include "MissionController.h" #include "SurveyComplexItem.h" +#include "SimpleMissionItem.h" +#include "MissionSettingsItem.h" class WimaController : public QObject @@ -60,7 +62,8 @@ public: Q_INVOKABLE void saveMission(); Q_INVOKABLE void loadMission(); - Q_INVOKABLE void resetAllIsCurrentPolygon(void); + Q_INVOKABLE void resetAllInteractive(void); + Q_INVOKABLE void setInteractive(void); diff --git a/src/Wima/WimaGOperationArea.SettingsGroup.json b/src/Wima/WimaGOperationArea.SettingsGroup.json index 7c2656b30fa92ab3881a875a50eb9d391019a291..9fbc0724a846ac74147658e1524759f292894b0e 100644 --- a/src/Wima/WimaGOperationArea.SettingsGroup.json +++ b/src/Wima/WimaGOperationArea.SettingsGroup.json @@ -23,5 +23,14 @@ "min": 0, "decimalPlaces": 2, "defaultValue": 10 +}, +{ + "name": "BorderPolygonOffset", + "shortDescription": "The distance between the Operation Area and it's surounding Border Polygon.", + "type": "double", + "units": "m", + "min": 0, + "decimalPlaces": 1, + "defaultValue": 5 } ] diff --git a/src/Wima/WimaGOperationArea.cc b/src/Wima/WimaGOperationArea.cc index f5b2101d5d3f576e61ae5601a0c183048c5d8c61..b872c1eaecc14c59837b8fa241e13a1312ae7223 100644 --- a/src/Wima/WimaGOperationArea.cc +++ b/src/Wima/WimaGOperationArea.cc @@ -5,6 +5,7 @@ const char* WimaGOperationArea::settingsGroup = "OperatingArea const char* WimaGOperationArea::bottomLayerAltitudeName = "BottomLayerAltitude"; const char* WimaGOperationArea::numberOfLayersName = "NumberOfLayers"; const char* WimaGOperationArea::layerDistanceName = "LayerDistance"; +const char* WimaGOperationArea::borderPolygonOffsetName = "BorderPolygonOffset"; WimaGOperationArea::WimaGOperationArea(QObject *parent) : WimaGOperationArea (nullptr, parent) @@ -18,10 +19,14 @@ WimaGOperationArea::WimaGOperationArea(WimaArea *other, QObject *parent) , _bottomLayerAltitude (settingsGroup, _metaDataMap[bottomLayerAltitudeName]) , _numberOfLayers (settingsGroup, _metaDataMap[numberOfLayersName]) , _layerDistance (settingsGroup, _metaDataMap[layerDistanceName]) + , _borderPolygonOffset (settingsGroup, _metaDataMap[borderPolygonOffsetName]) , _polyline (new WimaTrackerPolyline(this)) + , _borderPolygon (new QGCMapPolygon(this)) { - this->setObjectName("Operating Area"); + this->setObjectName("Operation Area"); _polyline.bindPolygon(this); + connect(this, &WimaGOperationArea::pathChanged, this, &WimaGOperationArea::recalcBorderPolygon); + connect(&_borderPolygonOffset, &SettingsFact::rawValueChanged, this, &WimaGOperationArea::recalcBorderPolygon); //qWarning("Here I am!"); //connect(&_polyline, &WimaTrackerPolyline::pathChanged, this, &WimaGOperationArea::polylineChanged ); } @@ -57,6 +62,17 @@ void WimaGOperationArea::setVehicleCorridor(WimaVCorridor *corridor) } } +void WimaGOperationArea::recalcBorderPolygon() +{ + //qWarning("WimaGOperationArea::recalcBorderPolygon() %f", _borderPolygonOffset.rawValue().toDouble()); + QGCMapPolygon* polyCopy = this->toQGCPolygon(this); + polyCopy->offset(_borderPolygonOffset.rawValue().toDouble()); + _borderPolygon.setPath(polyCopy->path()); + polyCopy->deleteLater(); + + emit borderPolygonChanged(); +} + /*void WimaGOperationArea::recalculatesubPolygons() { int vehicleCount = _vehicleList->count(); diff --git a/src/Wima/WimaGOperationArea.h b/src/Wima/WimaGOperationArea.h index c234170463ed364e58b430c8c64ed3adc42fce02..b33b24fd0bd95d6f2f73f31d448f20f45ae9f4c1 100644 --- a/src/Wima/WimaGOperationArea.h +++ b/src/Wima/WimaGOperationArea.h @@ -15,12 +15,14 @@ public: WimaGOperationArea(QObject* parent = nullptr); WimaGOperationArea(WimaArea* other, QObject* parent = nullptr); - Q_PROPERTY(Fact* bottomLayerAltitude READ bottomLayerAltitude CONSTANT) - Q_PROPERTY(Fact* numberOfLayers READ numberOfLayers CONSTANT) - Q_PROPERTY(Fact* layerDistance READ layerDistance CONSTANT) + Q_PROPERTY(Fact* bottomLayerAltitude READ bottomLayerAltitude CONSTANT) + Q_PROPERTY(Fact* numberOfLayers READ numberOfLayers CONSTANT) + Q_PROPERTY(Fact* layerDistance READ layerDistance CONSTANT) + Q_PROPERTY(Fact* borderPolygonOffset READ borderPolygonOffset CONSTANT) /*Q_PROPERTY(QmlObjectListModel* vehicleList READ vehicleList NOTIFY vehicleListChanged) Q_PROPERTY(QmlObjectListModel* vehiclePolygons READ vehiclePolygons NOTIFY vehiclePolygonsChanged)*/ Q_PROPERTY(WimaTrackerPolyline* polyline READ polyline CONSTANT) + Q_PROPERTY(QGCMapPolygon* borderPolygon READ borderPolygon NOTIFY borderPolygonChanged) Q_INVOKABLE void addVehicle (WimaVehicle *vehicle); @@ -41,16 +43,19 @@ public: Fact* bottomLayerAltitude (void) { return &_bottomLayerAltitude;} Fact* numberOfLayers (void) { return &_numberOfLayers;} Fact* layerDistance (void) { return &_layerDistance;} + Fact* borderPolygonOffset (void) { return &_borderPolygonOffset;} /*QmlObjectListModel* vehicleList (void) const { return _vehicleList;} QmlObjectListModel* vehiclePolygons (void) const { return _vehiclePolygons;}*/ WimaTrackerPolyline* polyline (void) { return &_polyline;} WimaVCorridor* vehicleCorridor (void) { return _vehicleCorridor;} + QGCMapPolygon* borderPolygon (void) { return &_borderPolygon;} static const char* settingsGroup; static const char* bottomLayerAltitudeName; static const char* numberOfLayersName; static const char* layerDistanceName; + static const char* borderPolygonOffsetName; signals: @@ -61,6 +66,11 @@ signals: void polylineChanged (void); //void vehiclePolygonsChanged (void); void vehicleCorridorChanged (WimaVCorridor* corridor); + void borderPolygonChanged (void); + +private slots: + void recalcBorderPolygon (void); + private: QMap _metaDataMap; @@ -68,12 +78,14 @@ private: SettingsFact _bottomLayerAltitude; SettingsFact _numberOfLayers; SettingsFact _layerDistance; + SettingsFact _borderPolygonOffset; /*QmlObjectListModel* _vehicleList; QmlObjectListModel* _vehiclePolygons;*/ WimaTrackerPolyline _polyline; WimaVCorridor* _vehicleCorridor; + QGCMapPolygon _borderPolygon; diff --git a/src/WimaView/WimaGOperationAreaEditor.qml b/src/WimaView/WimaGOperationAreaEditor.qml index e3c0fa7db5795e6a751fd2181b65d14bf7c8d230..eec14e75a0c0741fd3a1c62abb8454f20fec6a5c 100644 --- a/src/WimaView/WimaGOperationAreaEditor.qml +++ b/src/WimaView/WimaGOperationAreaEditor.qml @@ -85,7 +85,7 @@ Rectangle { columns: 2 QGCLabel { - text: qsTr("Bottom Layer Altitude") + text: qsTr("Bottom Layer Alt.") } FactTextField { fact: areaItem.bottomLayerAltitude @@ -104,6 +104,12 @@ Rectangle { Layout.fillWidth: true } + QGCLabel { text: qsTr("Border Offset") } + FactTextField { + fact: areaItem.borderPolygonOffset + Layout.fillWidth: true + } + } diff --git a/src/WimaView/WimaGOperationAreaMapVisual.qml b/src/WimaView/WimaGOperationAreaMapVisual.qml index 6a96c9ce36bcb43d5b9d723436fe088d3bd6a12c..311e668858c0e5a43e66592949ae94a3855c01c2 100644 --- a/src/WimaView/WimaGOperationAreaMapVisual.qml +++ b/src/WimaView/WimaGOperationAreaMapVisual.qml @@ -28,6 +28,7 @@ Item { property var areaItem: object property var _polygon: areaItem property var _polyline: areaItem.polyline + property var _borderPolygon: areaItem.borderPolygon signal clicked(int sequenceNumber) @@ -89,6 +90,16 @@ Item { interiorOpacity: 0.25 } + WimaMapPolygonVisuals { + qgcView: _root.qgcView + mapControl: map + mapPolygon: _borderPolygon + borderWidth: 1 + borderColor: "white" + interiorColor: "transparent" + interiorOpacity: 1 + } + WimaMapPolylineVisuals { qgcView: _root.qgcView diff --git a/src/WimaView/WimaView.qml b/src/WimaView/WimaView.qml index 3ef09492612baa435e020eee9d169b1b24bb1415..1dbb9a2cc3b6a06bdcd21f73f8c0cbe36f29dabd 100644 --- a/src/WimaView/WimaView.qml +++ b/src/WimaView/WimaView.qml @@ -756,9 +756,11 @@ QGCView { switch (current) { case planElementMission: _editingLayer = _layerMission + _wimaController.resetAllInteractive(); break case planElementWima: _editingLayer = _layerWima + _wimaController.setInteractive(); break } }