From 4948045b7afa42b467db3a5865bab5a64d1f4371 Mon Sep 17 00:00:00 2001 From: Valentin Platzgummer Date: Thu, 31 Dec 2020 17:24:27 +0100 Subject: [PATCH] MeasurementArea prepared for new NemoInterface --- QGCExternalLibs.pri | 5 - qgroundcontrol.pro | 10 +- .../CircularGenerator.cpp | 35 +- src/MeasurementComplexItem/HashFunctions.cpp | 1 + src/MeasurementComplexItem/HashFunctions.h | 32 ++ .../LinearGenerator.cpp | 32 +- .../MeasurementComplexItem.cc | 2 +- src/MeasurementComplexItem/NemoInterface.cpp | 6 +- .../geometry/MeasurementArea.cc | 415 ++++++++---------- .../geometry/MeasurementArea.h | 36 +- .../geometry/ProgressArray.h | 10 + .../geometry/TileDiff.h | 11 + .../geometry/geometry.h | 5 +- .../nemo_interface/MeasurementTile.cpp | 52 +++ .../nemo_interface/MeasurementTile.h | 39 ++ .../nemo_interface/SnakeTile.cpp | 22 - .../nemo_interface/SnakeTile.h | 22 - .../nemo_interface/SnakeTiles.h | 4 +- .../qml/MeasurementAreaMapVisual.qml | 57 ++- src/comm/QmlObjectListHelper.cpp | 1 + src/comm/QmlObjectListHelper.h | 52 +++ 21 files changed, 474 insertions(+), 375 deletions(-) create mode 100644 src/MeasurementComplexItem/HashFunctions.cpp create mode 100644 src/MeasurementComplexItem/HashFunctions.h create mode 100644 src/MeasurementComplexItem/geometry/ProgressArray.h create mode 100644 src/MeasurementComplexItem/geometry/TileDiff.h create mode 100644 src/MeasurementComplexItem/nemo_interface/MeasurementTile.cpp create mode 100644 src/MeasurementComplexItem/nemo_interface/MeasurementTile.h delete mode 100644 src/MeasurementComplexItem/nemo_interface/SnakeTile.cpp delete mode 100644 src/MeasurementComplexItem/nemo_interface/SnakeTile.h create mode 100644 src/comm/QmlObjectListHelper.cpp create mode 100644 src/comm/QmlObjectListHelper.h diff --git a/QGCExternalLibs.pri b/QGCExternalLibs.pri index 8566d53a3..8e47d9238 100644 --- a/QGCExternalLibs.pri +++ b/QGCExternalLibs.pri @@ -226,11 +226,6 @@ contains (DEFINES, DISABLE_AIRMAP) { } } -# GeograpicLib (TODO: add Windows support!) -LinuxBuild { - LIBS += -L$$PWD/libs/libGeographic -lGeographic # libGeograpic.so.17 -} - # google or-tools (TODO: add Windows support!) LinuxBuild { OR_TOOLS_PATH = $$PWD/libs/or-tools-src-ubuntu diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index d5fd5f192..3677488dd 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -445,7 +445,11 @@ contains (DEFINES, QGC_ENABLE_PAIRING) { # HEADERS += \ + src/MeasurementComplexItem/geometry/ProgressArray.h \ + src/MeasurementComplexItem/geometry/TileDiff.h \ src/MeasurementComplexItem/geometry/geometry.h \ + src/MeasurementComplexItem/HashFunctions.h \ + src/MeasurementComplexItem/nemo_interface/MeasurementTile.h \ src/QmlControls/QmlUnitsConversion.h \ src/MeasurementComplexItem/geometry/GeoArea.h \ src/MeasurementComplexItem/geometry/MeasurementArea.h \ @@ -487,7 +491,6 @@ HEADERS += \ src/MeasurementComplexItem/nemo_interface/QNemoHeartbeat.h \ src/MeasurementComplexItem/nemo_interface/QNemoProgress.h \ src/MeasurementComplexItem/nemo_interface/QNemoProgress.h \ - src/MeasurementComplexItem/nemo_interface/SnakeTile.h \ src/MeasurementComplexItem/nemo_interface/SnakeTileLocal.h \ src/MeasurementComplexItem/nemo_interface/SnakeTiles.h \ src/MeasurementComplexItem/nemo_interface/SnakeTilesLocal.h \ @@ -498,6 +501,7 @@ HEADERS += \ src/api/QmlComponentInfo.h \ src/GPS/Drivers/src/base_station.h \ src/Settings/WimaSettings.h \ + src/comm/QmlObjectListHelper.h \ src/comm/ros_bridge/include/RosBridgeClient.h \ src/comm/ros_bridge/include/com_private.h \ src/comm/ros_bridge/include/message_traits.h \ @@ -525,6 +529,8 @@ SOURCES += \ src/MeasurementComplexItem/geometry/MeasurementArea.cc \ src/MeasurementComplexItem/geometry/SafeArea.cc \ src/MeasurementComplexItem/geometry/geometry.cpp \ + src/MeasurementComplexItem/HashFunctions.cpp \ + src/MeasurementComplexItem/nemo_interface/MeasurementTile.cpp \ src/Vehicle/VehicleEscStatusFactGroup.cc \ src/MeasurementComplexItem/AreaData.cc \ src/api/QGCCorePlugin.cc \ @@ -541,7 +547,7 @@ SOURCES += \ src/MeasurementComplexItem/geometry/GeoPoint3D.cpp \ src/MeasurementComplexItem/NemoInterface.cpp \ src/MeasurementComplexItem/nemo_interface/QNemoProgress.cc \ - src/MeasurementComplexItem/nemo_interface/SnakeTile.cpp \ + src/comm/QmlObjectListHelper.cpp \ src/comm/ros_bridge/include/RosBridgeClient.cpp \ src/comm/ros_bridge/include/com_private.cpp \ src/comm/ros_bridge/include/messages/geographic_msgs/geopoint.cpp \ diff --git a/src/MeasurementComplexItem/CircularGenerator.cpp b/src/MeasurementComplexItem/CircularGenerator.cpp index d8c7ffa15..c31a5e81e 100644 --- a/src/MeasurementComplexItem/CircularGenerator.cpp +++ b/src/MeasurementComplexItem/CircularGenerator.cpp @@ -10,7 +10,7 @@ #include "geometry/MeasurementArea.h" #include "geometry/SafeArea.h" #include "geometry/clipper/clipper.hpp" -#include "nemo_interface/SnakeTile.h" +#include "nemo_interface/MeasurementTile.h" QGC_LOGGING_CATEGORY(CircularGeneratorLog, "CircularGeneratorLog") @@ -118,31 +118,22 @@ bool CircularGenerator::get(Work &work) { auto pPolygon = std::make_shared(); geometry::areaToEnu(origin, geoPolygon, *pPolygon); - // Progress and tiles. - const auto &progress = measurementArea->progress(); + // Collect tiles with progress == 100 %. const auto *tiles = measurementArea->tiles(); auto pTiles = std::make_shared>(); - if (progress.size() == tiles->count()) { - for (int i = 0; i < tiles->count(); ++i) { - if (progress[i] == 100) { - const auto *obj = (*tiles)[int(i)]; - const auto *tile = qobject_cast(obj); - - if (tile != nullptr) { - geometry::FPolygon tileENU; - geometry::areaToEnu(origin, tile->coordinateList(), tileENU); - pTiles->push_back(std::move(tileENU)); - } else { - qCDebug(CircularGeneratorLog) - << "get(): progress.size() != tiles->count()."; - return false; - } + for (int i = 0; i < tiles->count(); ++i) { + const auto tile = + qobject_cast(tiles->operator[](i)); + if (tile != nullptr) { + if (qFuzzyCompare(tile->progress(), 100)) { + geometry::FPolygon tileENU; + geometry::areaToEnu(origin, tile->coordinateList(), tileENU); + pTiles->push_back(std::move(tileENU)); } + } else { + qCDebug(CircularGeneratorLog) << "get(): tile == nullptr."; + return false; } - } else { - qCDebug(CircularGeneratorLog) - << "get(): progress.size() != tiles->count()."; - return false; } auto serviceArea = getGeoArea(*this->_d->areaList()); diff --git a/src/MeasurementComplexItem/HashFunctions.cpp b/src/MeasurementComplexItem/HashFunctions.cpp new file mode 100644 index 000000000..e3f74aaab --- /dev/null +++ b/src/MeasurementComplexItem/HashFunctions.cpp @@ -0,0 +1 @@ +#include "HashFunctions.h" diff --git a/src/MeasurementComplexItem/HashFunctions.h b/src/MeasurementComplexItem/HashFunctions.h new file mode 100644 index 000000000..ce8830660 --- /dev/null +++ b/src/MeasurementComplexItem/HashFunctions.h @@ -0,0 +1,32 @@ +#ifndef HASHFUNCTIONS_H +#define HASHFUNCTIONS_H + +#include +#include + +#include + +namespace std { + +template <> struct hash { + std::size_t operator()(const QGeoCoordinate &c) { + hash h; + return h(c.latitude()) ^ h(c.longitude()) ^ h(c.altitude()); + } +}; + +template