Commit 06e9bcab authored by Valentin Platzgummer's avatar Valentin Platzgummer

temp, not compilable

parent 86faa707
#include "CircularGenerator.h" #include "CircularGenerator.h"
#include "QGCLoggingCategory.h" #include "QGCLoggingCategory.h"
QGC_LOGGING_CATEGORY(CircularGeneratorLog, "CircularGeneratorLog") QGC_LOGGING_CATEGORY(CircularGeneratorLog, "CircularGeneratorLog")
#define CLIPPER_SCALE 1000000
#include "Wima/Geometry/GenericCircle.h"
#include "clipper/clipper.hpp"
// Clipper and GenericCircle
using namespace ClipperLib;
template <> auto get<0>(const IntPoint &p) { return p.X; }
template <> auto get<1>(const IntPoint &p) { return p.Y; }
namespace routing { namespace routing {
bool circularTransects(const snake::FPolygon &polygon, bool circularTransects(const snake::FPolygon &polygon,
...@@ -11,18 +18,7 @@ bool circularTransects(const snake::FPolygon &polygon, ...@@ -11,18 +18,7 @@ bool circularTransects(const snake::FPolygon &polygon,
snake::Length deltaR, snake::Angle deltaAlpha, snake::Length deltaR, snake::Angle deltaAlpha,
snake::Length minLength, snake::Transects &transects); snake::Length minLength, snake::Transects &transects);
CircularGenerator::CircularGenerator() : GeneratorBase() {} CircularGenerator::CircularGenerator(QObject *parent) : GeneratorBase(parent) {}
CircularGenerator::CircularGenerator(std::shared_ptr<GeneratorData> par,
QObject *parent)
: GeneratorBase(parent) {
if (qobject_cast<StandardData *>(par.get()) != nullptr) {
data_ = data;
} else {
qCWarning(CircularGeneratorLog)
<< "CircularGenerator(): CircularGenerator accepts only StandartData.";
}
}
QString CircularGenerator::editorQML() { QString CircularGenerator::editorQML() {
return QStringLiteral("CircularGeneratorEditor.qml"); return QStringLiteral("CircularGeneratorEditor.qml");
...@@ -38,19 +34,17 @@ QString CircularGenerator::name() { ...@@ -38,19 +34,17 @@ QString CircularGenerator::name() {
QString CircularGenerator::abbreviation() { return QStringLiteral("C. Gen."); } QString CircularGenerator::abbreviation() { return QStringLiteral("C. Gen."); }
GeneratorBase::Generator CircularGenerator::get() {} bool CircularGenerator::get(const WimaPlanData &data,
GeneratorBase &generator) {
bool CircularGenerator::setData(std::shared_ptr<GeneratorData> data) { auto generator = [depot, pPolygon, pTiles, distance, alpha,
if (qobject_cast<StandardData *>(par.get()) != nullptr) { minLength](snake::Transects &transects) -> bool {
data_ = data; bool value = circularTransects(*pPolygon, *pTiles, distance, alpha,
} else { minLength, transects);
qCWarning(CircularGeneratorLog) transects.insert(transects.begin(), snake::FLineString{depot});
<< "setData(): CircularGenerator accepts only StandartData."; return value;
} };
} }
std::shared_ptr<GeneratorData> CircularGenerator::data() { return data_; }
bool circularTransects(const snake::FPolygon &polygon, bool circularTransects(const snake::FPolygon &polygon,
const std::vector<snake::FPolygon> &tiles, const std::vector<snake::FPolygon> &tiles,
snake::Length deltaR, snake::Angle deltaAlpha, snake::Length deltaR, snake::Angle deltaAlpha,
...@@ -65,12 +59,12 @@ bool circularTransects(const snake::FPolygon &polygon, ...@@ -65,12 +59,12 @@ bool circularTransects(const snake::FPolygon &polygon,
std::string error; std::string error;
// Check validity. // Check validity.
if (!bg::is_valid(polygon, error)) { if (!bg::is_valid(polygon, error)) {
qCWarning(CircularSurveyLog) << "circularTransects(): " qCWarning(CircularGeneratorLog) << "circularTransects(): "
"invalid polygon."; "invalid polygon.";
qCWarning(CircularSurveyLog) << error.c_str(); qCWarning(CircularGeneratorLog) << error.c_str();
std::stringstream ss; std::stringstream ss;
ss << bg::wkt(polygon); ss << bg::wkt(polygon);
qCWarning(CircularSurveyLog) << ss.str().c_str(); qCWarning(CircularGeneratorLog) << ss.str().c_str();
} else { } else {
// Calculate polygon distances and angles. // Calculate polygon distances and angles.
std::vector<snake::Length> distances; std::vector<snake::Length> distances;
...@@ -78,7 +72,7 @@ bool circularTransects(const snake::FPolygon &polygon, ...@@ -78,7 +72,7 @@ bool circularTransects(const snake::FPolygon &polygon,
std::vector<snake::Angle> angles; std::vector<snake::Angle> angles;
angles.reserve(polygon.outer().size()); angles.reserve(polygon.outer().size());
//#ifdef DEBUG_CIRCULAR_SURVEY //#ifdef DEBUG_CIRCULAR_SURVEY
// qCWarning(CircularSurveyLog) << "circularTransects():"; // qCWarning(CircularGeneratorLog) << "circularTransects():";
//#endif //#endif
for (const auto &p : polygon.outer()) { for (const auto &p : polygon.outer()) {
snake::Length distance = bg::distance(origin, p) * si::meter; snake::Length distance = bg::distance(origin, p) * si::meter;
...@@ -87,11 +81,12 @@ bool circularTransects(const snake::FPolygon &polygon, ...@@ -87,11 +81,12 @@ bool circularTransects(const snake::FPolygon &polygon,
alpha = alpha < 0 * si::radian ? alpha + 2 * M_PI * si::radian : alpha; alpha = alpha < 0 * si::radian ? alpha + 2 * M_PI * si::radian : alpha;
angles.push_back(alpha); angles.push_back(alpha);
//#ifdef DEBUG_CIRCULAR_SURVEY //#ifdef DEBUG_CIRCULAR_SURVEY
// qCWarning(CircularSurveyLog) << "distances, angles, // qCWarning(CircularGeneratorLog) << "distances, angles,
// coordinates:"; qCWarning(CircularSurveyLog) << // coordinates:"; qCWarning(CircularGeneratorLog) <<
// to_string(distance).c_str(); qCWarning(CircularSurveyLog) << // to_string(distance).c_str(); qCWarning(CircularGeneratorLog)
// to_string(snake::Degree(alpha)).c_str(); // << to_string(snake::Degree(alpha)).c_str();
// qCWarning(CircularSurveyLog) << "x = " << p.get<0>() << "y = " // qCWarning(CircularGeneratorLog) << "x = " << p.get<0>() << "y
// = "
// << p.get<1>(); // << p.get<1>();
//#endif //#endif
} }
...@@ -123,19 +118,20 @@ bool circularTransects(const snake::FPolygon &polygon, ...@@ -123,19 +118,20 @@ bool circularTransects(const snake::FPolygon &polygon,
const auto nSectors = const auto nSectors =
long(std::round(((alpha2 - alpha1) / deltaAlpha).value())); long(std::round(((alpha2 - alpha1) / deltaAlpha).value()));
//#ifdef DEBUG_CIRCULAR_SURVEY //#ifdef DEBUG_CIRCULAR_SURVEY
// qCWarning(CircularSurveyLog) << "circularTransects(): sector // qCWarning(CircularGeneratorLog) << "circularTransects(): sector
// parameres:"; qCWarning(CircularSurveyLog) << "alpha1: " << // parameres:"; qCWarning(CircularGeneratorLog) << "alpha1: " <<
// to_string(snake::Degree(alpha1)).c_str(); // to_string(snake::Degree(alpha1)).c_str();
// qCWarning(CircularSurveyLog) << "alpha2: // qCWarning(CircularGeneratorLog) << "alpha2:
// " // "
// << to_string(snake::Degree(alpha2)).c_str(); // << to_string(snake::Degree(alpha2)).c_str();
// qCWarning(CircularSurveyLog) << "n: " // qCWarning(CircularGeneratorLog) << "n: "
// << to_string((alpha2 - alpha1) / deltaAlpha).c_str(); // << to_string((alpha2 - alpha1) / deltaAlpha).c_str();
// qCWarning(CircularSurveyLog) // qCWarning(CircularGeneratorLog)
// << "nSectors: " << nSectors; qCWarning(CircularSurveyLog) << // << "nSectors: " << nSectors; qCWarning(CircularGeneratorLog) <<
// "rMin: " << to_string(rMin).c_str(); qCWarning(CircularSurveyLog) // "rMin: " << to_string(rMin).c_str();
// qCWarning(CircularGeneratorLog)
// << "rMax: " << to_string(rMax).c_str(); // << "rMax: " << to_string(rMax).c_str();
// qCWarning(CircularSurveyLog) << "nTran: " << nTran; // qCWarning(CircularGeneratorLog) << "nTran: " << nTran;
//#endif //#endif
using ClipperCircle = using ClipperCircle =
GenericCircle<ClipperLib::cInt, ClipperLib::IntPoint>; GenericCircle<ClipperLib::cInt, ClipperLib::IntPoint>;
...@@ -254,7 +250,7 @@ bool circularTransects(const snake::FPolygon &polygon, ...@@ -254,7 +250,7 @@ bool circularTransects(const snake::FPolygon &polygon,
} }
} }
qCWarning(CircularSurveyLog) qCWarning(CircularGeneratorLog)
<< "circularTransects(): transect gen. time: " << "circularTransects(): transect gen. time: "
<< std::chrono::duration_cast<std::chrono::milliseconds>( << std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::high_resolution_clock::now() - s1) std::chrono::high_resolution_clock::now() - s1)
......
...@@ -6,21 +6,15 @@ namespace routing { ...@@ -6,21 +6,15 @@ namespace routing {
class CircularGenerator : public GeneratorBase { class CircularGenerator : public GeneratorBase {
Q_OBJECT Q_OBJECT
public: public:
CircularGenerator(); CircularGenerator(QObject *parent = nullptr) override;
CircularGenerator(std::shared_ptr<GeneratorData> par,
QObject *parent = nullptr);
~CircularGenerator();
virtual QString editorQML(); virtual QString editorQML() override;
virtual QString mapVisualQML(); virtual QString mapVisualQML() override;
virtual QString name(); virtual QString name() override;
virtual QString abbreviation(); virtual QString abbreviation() override;
virtual Generator get(); virtual bool get(const WimaPlanData &data, GeneratorBase &generator);
private:
std::shared_ptr<GeneratorData> _data;
}; };
} // namespace routing } // namespace routing
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include "snake.h" #include "snake.h"
#include "GeneratorData.h" #include "Wima/WimaPlanData.h"
namespace routing { namespace routing {
...@@ -15,7 +15,6 @@ public: ...@@ -15,7 +15,6 @@ public:
using Generator = std::function<bool(snake::Transects &)>; using Generator = std::function<bool(snake::Transects &)>;
explicit GeneratorBase(QObject *parent = nullptr); explicit GeneratorBase(QObject *parent = nullptr);
GeneratorBase(std::shared_ptr<GeneratorData> par, QObject *parent = nullptr);
~GeneratorBase(); ~GeneratorBase();
virtual QString editorQML() = 0; virtual QString editorQML() = 0;
...@@ -24,10 +23,10 @@ public: ...@@ -24,10 +23,10 @@ public:
virtual QString name() = 0; virtual QString name() = 0;
virtual QString abbreviation() = 0; virtual QString abbreviation() = 0;
virtual Generator get() = 0; virtual bool get(const WimaPlanData &data, GeneratorBase &generator) = 0;
virtual bool setData(std::shared_ptr<GeneratorData> par) = 0; signals:
virtual std::shared_ptr<GeneratorData> data() = 0; void generatorChanged();
}; };
} // namespace routing } // namespace routing
#include "WimaPlanData.h" #include "WimaPlanData.h"
WimaPlanData::WimaPlanData(QObject *parent) : QObject(parent) {} enum Signal {
measuremtAreaChanged,
serviceAreaChanged,
joinedAreaChanged,
corridorChanged,
};
WimaPlanData::WimaPlanData(QObject *parent)
: QObject(parent), _editing(false) {}
WimaPlanData::WimaPlanData(const WimaPlanData &other, QObject *parent) WimaPlanData::WimaPlanData(const WimaPlanData &other, QObject *parent)
: QObject(parent) { : QObject(parent), _editing(false) {
*this = other; *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) { WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other) {
// copy wima areas this->_measurementArea = other._measurementArea;
QList<const WimaAreaData *> areaList = other.areaList(); this->_serviceArea = other._serviceArea;
_areaList.clear(); this->_joinedArea = other._joinedArea;
for (int i = 0; i < areaList.size(); i++) { this->_corridor = other._corridor;
const WimaAreaData *areaData = areaList[i];
// determine area type and append
if (areaData->type() == WimaJoinedAreaData::typeString) {
this->append(*qobject_cast<const WimaJoinedAreaData *>(areaData));
} else if (areaData->type() == WimaServiceAreaData::typeString) {
this->append(*qobject_cast<const WimaServiceAreaData *>(areaData));
} else if (areaData->type() == WimaMeasurementAreaData::typeString) {
this->append(*qobject_cast<const WimaMeasurementAreaData *>(areaData));
} else if (areaData->type() == WimaCorridorData::typeString) {
this->append(*qobject_cast<const WimaCorridorData *>(areaData));
}
}
return *this; return *this;
} }
/*! void WimaPlanData::set(const WimaJoinedAreaData &areaData) {
* \fn void WimaPlanData::append(const WimaAreaData &areaData) if (_joinedArea != areaData) {
* _joinedArea = areaData;
* Adds a WimaAreaData item. emitJoinedAreaChanged();
*/ }
void WimaPlanData::append(const WimaJoinedAreaData &areaData) { }
_joinedArea = areaData;
if (!_areaList.contains(&_joinedArea)) { void WimaPlanData::set(const WimaServiceAreaData &areaData) {
_areaList.append(&_joinedArea); if (_serviceArea != areaData) {
_serviceArea = areaData;
emitServiceAreaChanged();
} }
} }
/*! void WimaPlanData::set(const WimaCorridorData &areaData) {
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData) if (_corridor != areaData) {
* _corridor = areaData;
* Adds a WimaServiceAreaData item. emitCorridorChanged();
*/ }
void WimaPlanData::append(const WimaServiceAreaData &areaData) { }
_serviceArea = areaData;
if (!_areaList.contains(&_serviceArea)) { void WimaPlanData::set(const WimaMeasurementAreaData &areaData) {
_areaList.append(&_serviceArea); if (_measurementArea != areaData) {
_measurementArea = areaData;
emitMeasurementAreaChanged();
} }
} }
/*! void WimaPlanData::clear() {
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData) _joinedArea = WimaJoinedAreaData();
* _serviceArea = WimaServiceAreaData();
* Adds a WimaCorridorData item. _corridor = WimaCorridorData();
*/ _measurementArea = WimaMeasurementAreaData();
void WimaPlanData::append(const WimaCorridorData &areaData) { }
_corridor = areaData;
if (!_areaList.contains(&_corridor)) { const WimaJoinedAreaData &WimaPlanData::joinedArea() const {
_areaList.append(&_corridor); return this->_joinedArea;
} }
const WimaServiceAreaData &WimaPlanData::serviceArea() const {
return this->_serviceArea;
} }
/*! const WimaCorridorData &WimaPlanData::corridor() const {
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData) return this->_corridor;
* }
* Adds a WimaMeasurementAreaData item.
*/ const WimaMeasurementAreaData &WimaPlanData::measurementArea() const {
void WimaPlanData::append(const WimaMeasurementAreaData &areaData) { return this->_measurementArea;
_measurementArea = areaData; }
if (!_areaList.contains(&_measurementArea)) { void WimaPlanData::startEditing() {
_areaList.append(&_measurementArea); if (!this->_editing) {
this->_editing = true;
} }
} }
/*! void WimaPlanData::stopEditing() {
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData) if (this->_editing) {
* this->_editing = false;
* Clears all stored objects for (auto &s : this->_queuedSignals) {
*/ s.second();
void WimaPlanData::clear() { _areaList.clear(); } }
this->_queuedSignals.clear();
}
}
const QList<const WimaAreaData *> &WimaPlanData::areaList() const { WimaPlanData::Guard WimaPlanData::guard() {
return _areaList; return Guard(std::bind(&WimaPlanData::stopEditing, this));
} }
bool WimaPlanData::operator==(const WimaPlanData &other) const { bool WimaPlanData::operator==(const WimaPlanData &other) const {
...@@ -107,14 +105,42 @@ bool WimaPlanData::operator!=(const WimaPlanData &other) const { ...@@ -107,14 +105,42 @@ bool WimaPlanData::operator!=(const WimaPlanData &other) const {
return !(*this == other); return !(*this == other);
} }
/*! void WimaPlanData::emitJoinedAreaChanged() {
* \class WimaPlanData if (!this->_editing) {
* \brief Class storing data generated by the \c WimaPlaner class. emit joinedAreaChanged();
* } else {
* This class is designed to store data generated by the \c WimaPlaner class and this->_queuedSignals.insert(
* meant for data exchange between the \c WimaController and the \c WimaPlanner. std::make_pair(Signal::joinedAreaChanged,
* It stores a QList of \c WimaAreaData objects, called area data list, std::bind(&WimaPlanData::joinedAreaChanged, this)));
* containing the data of serveral \c WimaAreas generated by the \c WimaPlaner. }
* }
* \sa QList
*/ void WimaPlanData::emitMeasurementAreaChanged() {
if (!this->_editing) {
emit measurementAreaChanged();
} else {
this->_queuedSignals.insert(
std::make_pair(Signal::measuremtAreaChanged,
std::bind(&WimaPlanData::measurementAreaChanged, this)));
}
}
void WimaPlanData::emitServiceAreaChanged() {
if (!this->_editing) {
emit serviceAreaChanged();
} else {
this->_queuedSignals.insert(
std::make_pair(Signal::serviceAreaChanged,
std::bind(&WimaPlanData::serviceAreaChanged, this)));
}
}
void WimaPlanData::emitCorridorChanged() {
if (!this->_editing) {
emit corridorChanged();
} else {
this->_queuedSignals.insert(
std::make_pair(Signal::corridorChanged,
std::bind(&WimaPlanData::corridorChanged, this)));
}
}
#pragma once #pragma once
#include <functional>
#include <map>
#include <QGeoCoordinate> #include <QGeoCoordinate>
#include <QObject> #include <QObject>
...@@ -13,38 +16,56 @@ ...@@ -13,38 +16,56 @@
class WimaPlanData : public QObject { class WimaPlanData : public QObject {
Q_OBJECT Q_OBJECT
public: public:
class Guard {
public:
Guard(std::function<void(void)> fun) : fun_(fun) {}
~Guard() { fun_(); }
private:
std::function<void(void)> fun_;
};
WimaPlanData(QObject *parent = nullptr); WimaPlanData(QObject *parent = nullptr);
WimaPlanData(const WimaPlanData &other, QObject *parent = nullptr); WimaPlanData(const WimaPlanData &other, QObject *parent = nullptr);
WimaPlanData &operator=(const WimaPlanData &other); WimaPlanData &operator=(const WimaPlanData &other);
// Member Methodes // Member Methodes
void append(const WimaJoinedAreaData &areaData); void set(const WimaJoinedAreaData &areaData);
void append(const WimaServiceAreaData &areaData); void set(const WimaServiceAreaData &areaData);
void append(const WimaCorridorData &areaData); void set(const WimaCorridorData &areaData);
void append(const WimaMeasurementAreaData &areaData); void set(const WimaMeasurementAreaData &areaData);
void setTransects(const QList<QList<QGeoCoordinate>> &transects);
//!
//! \brief append
//! \param missionItems
//! \note Takes owenership of MissionItems*
void append(const QList<MissionItem *> &missionItems);
void clear(); void clear();
const QList<const WimaAreaData *> &areaList() const; const WimaJoinedAreaData &joinedArea() const;
const QList<QList<QGeoCoordinate>> &transects() const; const WimaServiceAreaData &serviceArea() const;
const QList<MissionItem *> &missionItems() const; const WimaCorridorData &corridor() const;
const WimaMeasurementAreaData &measurementArea() const;
void startEditing();
void stopEditing();
Guard guard();
bool operator==(const WimaPlanData &other) const; bool operator==(const WimaPlanData &other) const;
bool operator!=(const WimaPlanData &other) const; bool operator!=(const WimaPlanData &other) const;
signals: signals:
void areaListChanged(); void joinedAreaChanged();
void serviceAreaChanged();
void corridorChanged();
void measurementAreaChanged();
private: private:
void emitJoinedAreaChanged();
void emitServiceAreaChanged();
void emitCorridorChanged();
void emitMeasurementAreaChanged();
WimaJoinedAreaData _joinedArea; WimaJoinedAreaData _joinedArea;
WimaServiceAreaData _serviceArea; WimaServiceAreaData _serviceArea;
WimaCorridorData _corridor; WimaCorridorData _corridor;
WimaMeasurementAreaData _measurementArea; WimaMeasurementAreaData _measurementArea;
QList<const WimaAreaData *> _areaList;
std::map<int, std::function<void(void)>> _queuedSignals;
bool _editing;
}; };
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