Commit 3dfdeec9 authored by Valentin Platzgummer's avatar Valentin Platzgummer

temp

parent f4eb1bde
...@@ -423,6 +423,7 @@ INCLUDEPATH += \ ...@@ -423,6 +423,7 @@ INCLUDEPATH += \
src/comm \ src/comm \
src/MeasurementComplexItem \ src/MeasurementComplexItem \
src/MeasurementComplexItem/geometry \ src/MeasurementComplexItem/geometry \
src/MeasurementComplexItem/nemo_interface \
src/comm/ros_bridge \ src/comm/ros_bridge \
src/input \ src/input \
src/lib/qmapcontrol \ src/lib/qmapcontrol \
......
...@@ -39,14 +39,14 @@ const QString MeasurementComplexItem::name(tr("Measurement")); ...@@ -39,14 +39,14 @@ const QString MeasurementComplexItem::name(tr("Measurement"));
MeasurementComplexItem::MeasurementComplexItem( MeasurementComplexItem::MeasurementComplexItem(
PlanMasterController *masterController, bool flyView, PlanMasterController *masterController, bool flyView,
const QString &kmlOrShpFile, QObject *parent) const QString &kmlOrShpFile, QObject *parent)
: ComplexMissionItem(masterController, flyView, settingsGroup, parent), : ComplexMissionItem(masterController, flyView, parent),
_masterController(masterController), _sequenceNumber(0), _masterController(masterController), _sequenceNumber(0),
_followTerrain(false), _state(STATE::IDLE), _followTerrain(false),
_altitude(settingsGroup, _metaDataMap[altitudeName]), _state(STATE::IDLE),
_metaDataMap(FactMetaData::createMapFromJsonFile( _metaDataMap(FactMetaData::createMapFromJsonFile(
QStringLiteral(":/json/MeasurementComplexItem.SettingsGroup.json"), QStringLiteral(":/json/MeasurementComplexItem.SettingsGroup.json"),
this)), this)),
_variant(settingsGroup, _metaDataMap[variantName]), _variant(settingsGroup, _metaDataMap[variantName]),
_variant(settingsGroup, _metaDataMap[altitudeName]),
_areaData(new AreaData(this)), _editorData(new AreaData(this)), _areaData(new AreaData(this)), _editorData(new AreaData(this)),
_currentData(_areaData), _pWorker(new RoutingThread(this)) { _currentData(_areaData), _pWorker(new RoutingThread(this)) {
...@@ -59,9 +59,17 @@ MeasurementComplexItem::MeasurementComplexItem( ...@@ -59,9 +59,17 @@ MeasurementComplexItem::MeasurementComplexItem(
// Connect worker. // Connect worker.
connect(this->_pWorker, &RoutingThread::result, this, connect(this->_pWorker, &RoutingThread::result, this,
&MeasurementComplexItem::_setTransects); &MeasurementComplexItem::_storeRoutingData);
connect(this->_pWorker, &RoutingThread::calculatingChanged, this,
&MeasurementComplexItem::calculatingChanged); // Connect coordinate and exitCoordinate
connect(this, &MeasurementComplexItem::routeChanged,
[this] { emit this->coordinateChanged(this->coordinate()); });
connect(this, &MeasurementComplexItem::routeChanged,
[this] { emit this->exitCoordinateChanged(this->exitCoordinate()); });
connect(this, &MeasurementComplexItem::routeChanged, [this] {
emit this->exitCoordinateSameAsEntryChanged(
this->exitCoordinateSameAsEntry());
});
// Register Generators. // Register Generators.
auto lg = new routing::LinearGenerator(this->_areaData, this); auto lg = new routing::LinearGenerator(this->_areaData, this);
...@@ -75,10 +83,7 @@ MeasurementComplexItem::MeasurementComplexItem( ...@@ -75,10 +83,7 @@ MeasurementComplexItem::MeasurementComplexItem(
MeasurementComplexItem::~MeasurementComplexItem() {} MeasurementComplexItem::~MeasurementComplexItem() {}
void MeasurementComplexItem::revertPath() { void MeasurementComplexItem::reverseRoute() { _reverseRoute(); }
this->_setState(STATE::REVERT_PATH);
this->_update();
}
const AreaData *MeasurementComplexItem::areaData() const { const AreaData *MeasurementComplexItem::areaData() const {
return this->_currentData; return this->_currentData;
...@@ -86,12 +91,18 @@ const AreaData *MeasurementComplexItem::areaData() const { ...@@ -86,12 +91,18 @@ const AreaData *MeasurementComplexItem::areaData() const {
AreaData *MeasurementComplexItem::areaData() { return this->_currentData; } AreaData *MeasurementComplexItem::areaData() { return this->_currentData; }
QVariantList MeasurementComplexItem::route() { return _route; }
QStringList MeasurementComplexItem::variantNames() const { QStringList MeasurementComplexItem::variantNames() const {
return _variantNames; return _variantNames;
} }
bool MeasurementComplexItem::load(const QJsonObject &complexObject, bool MeasurementComplexItem::load(const QJsonObject &complexObject,
int sequenceNumber, QString &errorString) { int sequenceNumber, QString &errorString) {
qWarning() << "MeasurementComplexItem::load(): area data load missing.";
qWarning() << "MeasurementComplexItem::load(): mission item load missing.";
qWarning() << "MeasurementComplexItem::load(): add editingStart/Stop.";
// We need to pull version first to determine what validation/conversion // We need to pull version first to determine what validation/conversion
// needs to be performed // needs to be performed
QList<JsonHelper::KeyValidateInfo> versionKeyInfoList = { QList<JsonHelper::KeyValidateInfo> versionKeyInfoList = {
...@@ -132,31 +143,15 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -132,31 +143,15 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
return false; return false;
} }
_ignoreRecalc = true;
setSequenceNumber(sequenceNumber); setSequenceNumber(sequenceNumber);
if (!_surveyAreaPolygon.loadFromJson(complexObject, true /* required */,
errorString)) {
_surveyAreaPolygon.clear();
return false;
}
if (!load(complexObject, sequenceNumber, errorString)) { if (!load(complexObject, sequenceNumber, errorString)) {
_ignoreRecalc = false;
return false; return false;
} }
_variant.setRawValue(complexObject[variantName].toInt()); _variant.setRawValue(complexObject[variantName].toInt());
_altitude.setRawValue(complexObject[altitudeName].toDouble()); _altitude.setRawValue(complexObject[altitudeName].toDouble());
_ignoreRecalc = false;
if (_cameraShots == 0) {
// Shot count was possibly not available from plan file
_recalcCameraShots();
}
return true; return true;
} }
...@@ -171,23 +166,23 @@ QString MeasurementComplexItem::mapVisualQML() const { ...@@ -171,23 +166,23 @@ QString MeasurementComplexItem::mapVisualQML() const {
} }
void MeasurementComplexItem::save(QJsonArray &planItems) { void MeasurementComplexItem::save(QJsonArray &planItems) {
QJsonObject saveObject; qWarning() << "MeasurementComplexItem::save(): area data save missing.";
qWarning() << "MeasurementComplexItem::save(): mission item save missing.";
_save(saveObject);
saveObject[JsonHelper::jsonVersionKey] = 1; if (ready()) {
saveObject[VisualMissionItem::jsonTypeKey] = QJsonObject saveObject;
VisualMissionItem::jsonTypeComplexItemValue;
saveObject[ComplexMissionItem::jsonComplexItemTypeKey] =
jsonComplexItemTypeValue;
saveObject[variantName] = double(_variant.rawValue().toUInt()); saveObject[JsonHelper::jsonVersionKey] = 1;
saveObject[altitudeName] = double(_altitude.rawValue().toUInt()); saveObject[VisualMissionItem::jsonTypeKey] =
VisualMissionItem::jsonTypeComplexItemValue;
saveObject[ComplexMissionItem::jsonComplexItemTypeKey] =
jsonComplexItemTypeValue;
// Polygon shape saveObject[variantName] = double(_variant.rawValue().toUInt());
_surveyAreaPolygon.saveToJson(saveObject); saveObject[altitudeName] = double(_altitude.rawValue().toUInt());
planItems.append(saveObject); planItems.append(saveObject);
}
} }
double MeasurementComplexItem::amslEntryAlt() const { double MeasurementComplexItem::amslEntryAlt() const {
...@@ -214,11 +209,13 @@ bool MeasurementComplexItem::specifiesCoordinate() const { ...@@ -214,11 +209,13 @@ bool MeasurementComplexItem::specifiesCoordinate() const {
bool MeasurementComplexItem::specifiesAltitudeOnly() const { return false; } bool MeasurementComplexItem::specifiesAltitudeOnly() const { return false; }
QGeoCoordinate MeasurementComplexItem::coordinate() const { QGeoCoordinate MeasurementComplexItem::coordinate() const {
return this->_route.size() > 0 ? _route.first() : QGeoCoordinate(); return this->_route.size() > 0 ? _route.first().value<QGeoCoordinate>()
: QGeoCoordinate();
} }
QGeoCoordinate MeasurementComplexItem::exitCoordinate() const { QGeoCoordinate MeasurementComplexItem::exitCoordinate() const {
return this->_route.size() > 0 ? _route.last() : QGeoCoordinate(); return this->_route.size() > 0 ? _route.last().value<QGeoCoordinate>()
: QGeoCoordinate();
} }
int MeasurementComplexItem::sequenceNumber() const { return _sequenceNumber; } int MeasurementComplexItem::sequenceNumber() const { return _sequenceNumber; }
...@@ -237,26 +234,32 @@ double MeasurementComplexItem::specifiedGimbalPitch() { ...@@ -237,26 +234,32 @@ double MeasurementComplexItem::specifiedGimbalPitch() {
void MeasurementComplexItem::appendMissionItems(QList<MissionItem *> &items, void MeasurementComplexItem::appendMissionItems(QList<MissionItem *> &items,
QObject *missionItemParent) { QObject *missionItemParent) {
qCDebug(MeasurementComplexItemLog) << "appendMissionItems()";
if (ready()) {
int seqNum = this->_sequenceNumber; qCDebug(MeasurementComplexItemLog) << "appendMissionItems()";
MAV_FRAME mavFrame = int seqNum = this->_sequenceNumber;
followTerrain() ? MAV_FRAME_GLOBAL : MAV_FRAME_GLOBAL_RELATIVE_ALT;
MAV_FRAME mavFrame =
int transectIndex = 0; followTerrain() ? MAV_FRAME_GLOBAL : MAV_FRAME_GLOBAL_RELATIVE_ALT;
for (const auto &vertex : this->_route) {
MissionItem *item = new MissionItem( for (const auto &variant : this->_route) {
seqNum++, MAV_CMD_NAV_WAYPOINT, mavFrame, auto vertex = variant.value<QGeoCoordinate>();
0, // hold time MissionItem *item = new MissionItem(
0.0, // No acceptance radius specified seqNum++, MAV_CMD_NAV_WAYPOINT, mavFrame,
0.0, // Pass through waypoint 0, // hold time
std::numeric_limits<double>::quiet_NaN(), // Yaw unchanged 0.0, // No acceptance radius specified
vertex.latitude(), vertex.longitude(), vertex.altitude(), 0.0, // Pass through waypoint
true, // autoContinue std::numeric_limits<double>::quiet_NaN(), // Yaw unchanged
false, // isCurrentItem vertex.latitude(), vertex.longitude(), vertex.altitude(),
missionItemParent); true, // autoContinue
items.append(item); false, // isCurrentItem
missionItemParent);
items.append(item);
}
} else {
qCDebug(MeasurementComplexItemLog)
<< "appendMissionItems(): called while not ready().";
} }
} }
...@@ -266,7 +269,8 @@ void MeasurementComplexItem::setMissionFlightStatus( ...@@ -266,7 +269,8 @@ void MeasurementComplexItem::setMissionFlightStatus(
} }
void MeasurementComplexItem::applyNewAltitude(double newAltitude) { void MeasurementComplexItem::applyNewAltitude(double newAltitude) {
this->_altitude->setRawValue(newAltitude); this->_altitude.setRawValue(newAltitude);
qWarning() << "applyNewAltitude(): impl. missing.";
} }
double MeasurementComplexItem::additionalTimeDelay() const { return 0; } double MeasurementComplexItem::additionalTimeDelay() const { return 0; }
...@@ -275,16 +279,18 @@ bool MeasurementComplexItem::_setGenerator(PtrGenerator newG) { ...@@ -275,16 +279,18 @@ bool MeasurementComplexItem::_setGenerator(PtrGenerator newG) {
if (this->_pGenerator != newG) { if (this->_pGenerator != newG) {
if (this->_pGenerator != nullptr) { if (this->_pGenerator != nullptr) {
disconnect(this->_pGenerator, &routing::GeneratorBase::generatorChanged, disconnect(this->_pGenerator, &routing::GeneratorBase::generatorChanged,
this, &MeasurementComplexItem::_update); this, &MeasurementComplexItem::_updateRoute);
} }
this->_pGenerator = newG; this->_pGenerator = newG;
connect(this->_pGenerator, &routing::GeneratorBase::generatorChanged, this, connect(this->_pGenerator, &routing::GeneratorBase::generatorChanged, this,
&MeasurementComplexItem::_update); &MeasurementComplexItem::_updateRoute);
emit generatorChanged(); emit generatorChanged();
this->_setState(STATE::IDLE); if (!editing()) {
_update(); this->_setState(STATE::IDLE);
_updateRoute();
}
return true; return true;
} else { } else {
...@@ -304,14 +310,21 @@ void MeasurementComplexItem::_setState(MeasurementComplexItem::STATE state) { ...@@ -304,14 +310,21 @@ void MeasurementComplexItem::_setState(MeasurementComplexItem::STATE state) {
if (_editing(oldState) != _editing(state)) { if (_editing(oldState) != _editing(state)) {
emit editingChanged(); emit editingChanged();
} }
if (_ready(oldState) != _ready(state)) {
emit readyChanged();
}
} }
} }
bool MeasurementComplexItem::_calculating( bool MeasurementComplexItem::_calculating(MeasurementComplexItem::STATE state) {
MeasurementComplexItem::STATE state) const {
return state == STATE::ROUTING; return state == STATE::ROUTING;
} }
bool MeasurementComplexItem::_ready(MeasurementComplexItem::STATE state) {
return state == STATE::IDLE;
}
void MeasurementComplexItem::_setAreaData( void MeasurementComplexItem::_setAreaData(
MeasurementComplexItem::PtrAreaData data) { MeasurementComplexItem::PtrAreaData data) {
if (_currentData != data) { if (_currentData != data) {
...@@ -320,14 +333,9 @@ void MeasurementComplexItem::_setAreaData( ...@@ -320,14 +333,9 @@ void MeasurementComplexItem::_setAreaData(
} }
} }
void MeasurementComplexItem::_changeVariant() { bool MeasurementComplexItem::_updateRoute() {
this->_setState(STATE::CHANGE_VARIANT);
this->_update();
}
bool MeasurementComplexItem::_updateRouteWorker() {
// Reset data. // Reset data.
this->_transects.clear(); this->_route.clear();
this->_variantVector.clear(); this->_variantVector.clear();
this->_variantNames.clear(); this->_variantNames.clear();
emit variantNamesChanged(); emit variantNamesChanged();
...@@ -394,78 +402,67 @@ bool MeasurementComplexItem::_updateRouteWorker() { ...@@ -394,78 +402,67 @@ bool MeasurementComplexItem::_updateRouteWorker() {
} }
} }
void MeasurementComplexItem::_changeVariantWorker() { void MeasurementComplexItem::_changeVariant() {
auto variant = this->_variant.rawValue().toUInt(); if (ready()) {
auto variant = this->_variant.rawValue().toUInt();
// Find old variant and run. Old run corresponts with empty list.
std::size_t old_variant = std::numeric_limits<std::size_t>::max(); // Find old variant and run. Old run corresponts with empty list.
for (std::size_t i = 0; i < std::size_t(this->_variantVector.size()); ++i) { std::size_t old_variant = std::numeric_limits<std::size_t>::max();
const auto &variantCoordinates = this->_variantVector.at(i); for (std::size_t i = 0; i < std::size_t(this->_variantVector.size()); ++i) {
if (variantCoordinates.isEmpty()) { const auto &variantCoordinates = this->_variantVector.at(i);
old_variant = i; if (variantCoordinates.isEmpty()) {
break; old_variant = i;
break;
}
} }
}
// Swap route. // Swap route.
if (variant != old_variant) { if (variant != old_variant) {
// Swap in new variant. // Swap in new variant.
if (variant < std::size_t(this->_variantVector.size())) { if (variant < std::size_t(this->_variantVector.size())) {
if (old_variant != std::numeric_limits<std::size_t>::max()) { if (old_variant != std::numeric_limits<std::size_t>::max()) {
// this->_transects containes a route, swap it back to // this->_route containes a route, swap it back to
// this->_solutionVector // this->_solutionVector
auto &oldVariantCoordinates = this->_variantVector[old_variant]; auto &oldVariantCoordinates = this->_variantVector[old_variant];
oldVariantCoordinates.swap(this->_transects); oldVariantCoordinates.swap(this->_route);
} }
auto &newVariantCoordinates = this->_variantVector[variant]; auto &newVariantCoordinates = this->_variantVector[variant];
this->_transects.swap(newVariantCoordinates); this->_route.swap(newVariantCoordinates);
} else { // error } else { // error
qCDebug(MeasurementComplexItemLog) qCDebug(MeasurementComplexItemLog)
<< "Variant out of bounds (variant =" << variant << ")."; << "Variant out of bounds (variant =" << variant << ").";
qCDebug(MeasurementComplexItemLog) << "Resetting variant to zero."; qCDebug(MeasurementComplexItemLog) << "Resetting variant to zero.";
disconnect(&this->_variant, &Fact::rawValueChanged, this, disconnect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant); &MeasurementComplexItem::_changeVariant);
this->_variant.setCookedValue(QVariant(0)); this->_variant.setCookedValue(QVariant(0));
connect(&this->_variant, &Fact::rawValueChanged, this, connect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant); &MeasurementComplexItem::_changeVariant);
if (this->_variantVector.size() > 0) { if (this->_variantVector.size() > 0) {
this->_changeVariantWorker(); this->_changeVariant();
}
} }
} }
} }
} }
void MeasurementComplexItem::_reverseWorker() { void MeasurementComplexItem::_reverseRoute() {
if (this->_transects.size() > 0) { if (ready()) {
auto &t = this->_transects.front(); if (this->_route.size() > 0) {
std::reverse(t.begin(), t.end()); auto &t = this->_route;
std::reverse(t.begin(), t.end());
}
} }
} }
double MeasurementComplexItem::timeBetweenShots() { return 0; } ComplexMissionItem::ReadyForSaveState
QString MeasurementComplexItem::commandDescription() const {
return tr("Route");
}
QString MeasurementComplexItem::commandName() const { return tr("Route"); }
QString MeasurementComplexItem::abbreviation() const { return tr("R"); }
TransectStyleComplexItem::ReadyForSaveState
MeasurementComplexItem::readyForSaveState() const { MeasurementComplexItem::readyForSaveState() const {
if (TransectStyleComplexItem::readyForSaveState() == if (ready()) {
TransectStyleComplexItem::ReadyForSaveState::ReadyForSave) { return ReadyForSaveState::ReadyForSave;
if (this->_state == STATE::IDLE) {
return ReadyForSaveState::ReadyForSave;
} else {
return ReadyForSaveState::NotReadyForSaveData;
}
} else { } else {
return TransectStyleComplexItem::readyForSaveState(); return ReadyForSaveState::NotReadyForSaveData;
} }
} }
...@@ -583,7 +580,7 @@ bool MeasurementComplexItem::switchToGenerator(int index) { ...@@ -583,7 +580,7 @@ bool MeasurementComplexItem::switchToGenerator(int index) {
return true; return true;
} else { } else {
qCDebug(MeasurementComplexItemLog) qCDebug(MeasurementComplexItemLog)
<< "unregisterGenerator(): index (" << index << "switchToGenerator(): index (" << index
<< ") out" << ") out"
"of bounds ( " "of bounds ( "
<< this->_generatorNameList.size() << " )."; << this->_generatorNameList.size() << " ).";
...@@ -618,161 +615,120 @@ void MeasurementComplexItem::editingStop() { ...@@ -618,161 +615,120 @@ void MeasurementComplexItem::editingStop() {
} }
_setAreaData(_areaData); _setAreaData(_areaData);
_setState(STATE::IDLE); _setState(STATE::IDLE);
} if (_editorData->isValid() && *_editorData != *_areaData) {
} _updateRoute();
void MeasurementComplexItem::_update(void) {
auto start = std::chrono::high_resolution_clock::now();
switch (this->_state) {
case STATE::SKIPP:
qCDebug(MeasurementComplexItemLog) << "rebuildTransectsPhase1: skipp.";
this->_setState(STATE::IDLE);
break;
case STATE::CHANGE_VARIANT:
qCDebug(MeasurementComplexItemLog)
<< "rebuildTransectsPhase1: variant change.";
this->_changeVariantWorker();
this->_setState(STATE::IDLE);
break;
case STATE::REVERT_PATH:
qCDebug(MeasurementComplexItemLog) << "rebuildTransectsPhase1: reverse.";
this->_reverseWorker();
this->_setState(STATE::IDLE);
break;
case STATE::IDLE:
case STATE::ROUTING:
this->_setState(STATE::ROUTING);
qCDebug(MeasurementComplexItemLog) << "rebuildTransectsPhase1: update.";
if (!this->_updateRouteWorker()) {
this->_setState(STATE::IDLE);
} }
break;
} }
qCDebug(MeasurementComplexItemLog)
<< "rebuildTransectsPhase1(): "
<< std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::high_resolution_clock::now() - start)
.count()
<< " ms";
} }
void MeasurementComplexItem::_recalcCameraShots() { _cameraShots = 0; } void MeasurementComplexItem::_storeRoutingData(
void MeasurementComplexItem::_setTransects(
MeasurementComplexItem::PtrRoutingData pRoute) { MeasurementComplexItem::PtrRoutingData pRoute) {
// Store solutions. if (this->_state == STATE::ROUTING) {
auto ori = this->_areaData->origin(); // Store solutions.
ori.setAltitude(0); auto ori = this->_areaData->origin();
const auto &transectsENU = pRoute->transects; ori.setAltitude(0);
QVector<Variant> variantVector; const auto &transectsENU = pRoute->transects;
const auto nSolutions = pRoute->solutionVector.size(); QVector<Variant> variantVector;
const auto nSolutions = pRoute->solutionVector.size();
for (std::size_t j = 0; j < nSolutions; ++j) {
Variant var{QList<CoordInfo_t>()}; for (std::size_t j = 0; j < nSolutions; ++j) {
const auto &solution = pRoute->solutionVector.at(j); Variant var;
if (solution.size() > 0) { const auto &solution = pRoute->solutionVector.at(j);
const auto &route = solution.at(0); if (solution.size() > 0) {
const auto &path = route.path; const auto &route = solution.at(0);
const auto &info = route.info; const auto &path = route.path;
if (info.size() > 1) { const auto &info = route.info;
// Find index of first waypoint. if (info.size() > 1) {
std::size_t idxFirst = 0; // Find index of first waypoint.
const auto &infoFirst = info.at(1); std::size_t idxFirst = 0;
const auto &firstTransect = transectsENU[infoFirst.index]; const auto &infoFirst = info.at(1);
if (firstTransect.size() > 0) { const auto &firstTransect = transectsENU[infoFirst.index];
const auto &firstWaypoint = if (firstTransect.size() > 0) {
infoFirst.reversed ? firstTransect.back() : firstTransect.front(); const auto &firstWaypoint = infoFirst.reversed
double th = 0.01; ? firstTransect.back()
for (std::size_t i = 0; i < path.size(); ++i) { : firstTransect.front();
auto dist = bg::distance(path[i], firstWaypoint); double th = 0.01;
if (dist < th) { for (std::size_t i = 0; i < path.size(); ++i) {
idxFirst = i; auto dist = bg::distance(path[i], firstWaypoint);
break;
}
}
// Find index of last waypoint.
std::size_t idxLast = path.size() - 1;
const auto &infoLast = info.at(info.size() - 2);
const auto &lastTransect = transectsENU[infoLast.index];
if (lastTransect.size() > 0) {
const auto &lastWaypoint =
infoLast.reversed ? lastTransect.front() : lastTransect.back();
for (long i = path.size() - 1; i >= 0; --i) {
auto dist = bg::distance(path[i], lastWaypoint);
if (dist < th) { if (dist < th) {
idxLast = i; idxFirst = i;
break; break;
} }
} }
// Convert to geo coordinates. // Find index of last waypoint.
auto &list = var.front(); std::size_t idxLast = path.size() - 1;
for (std::size_t i = idxFirst; i <= idxLast; ++i) { const auto &infoLast = info.at(info.size() - 2);
auto &vertex = path[i]; const auto &lastTransect = transectsENU[infoLast.index];
QGeoCoordinate c; if (lastTransect.size() > 0) {
snake::fromENU(ori, vertex, c); const auto &lastWaypoint = infoLast.reversed
list.append(CoordInfo_t{c, CoordTypeInterior}); ? lastTransect.front()
} : lastTransect.back();
for (long i = path.size() - 1; i >= 0; --i) {
auto dist = bg::distance(path[i], lastWaypoint);
if (dist < th) {
idxLast = i;
break;
}
}
// Convert to geo coordinates.
for (std::size_t i = idxFirst; i <= idxLast; ++i) {
auto &vertex = path[i];
QGeoCoordinate c;
snake::fromENU(ori, vertex, c);
var.append(QVariant::fromValue(c));
}
} else {
qCDebug(MeasurementComplexItemLog)
<< "_setTransects(): lastTransect.size() == 0";
}
} else { } else {
qCDebug(MeasurementComplexItemLog) qCDebug(MeasurementComplexItemLog)
<< "_setTransects(): lastTransect.size() == 0"; << "_setTransects(): firstTransect.size() == 0";
} }
} else { } else {
qCDebug(MeasurementComplexItemLog) qCDebug(MeasurementComplexItemLog)
<< "_setTransects(): firstTransect.size() == 0"; << "_setTransects(): transectsInfo.size() <= 1";
} }
} else { } else {
qCDebug(MeasurementComplexItemLog) qCDebug(MeasurementComplexItemLog)
<< "_setTransects(): transectsInfo.size() <= 1"; << "_setTransects(): solution.size() == 0";
} }
} else {
qCDebug(MeasurementComplexItemLog)
<< "_setTransects(): solution.size() == 0";
}
if (var.size() > 0 && var.front().size() > 0) { if (var.size() > 0) {
variantVector.push_back(std::move(var)); variantVector.push_back(std::move(var));
}
} }
}
// Assign routes if no error occured. // Assign routes if no error occured.
if (variantVector.size() > 0) { if (variantVector.size() > 0) {
// Swap first route to _transects. // Swap first route to _route.
this->_variantVector.swap(variantVector); this->_variantVector.swap(variantVector);
// If the transects are getting rebuilt then any previously loaded
// mission items are now invalid.
if (_loadedMissionItemsParent) {
_loadedMissionItems.clear();
_loadedMissionItemsParent->deleteLater();
_loadedMissionItemsParent = nullptr;
}
// Add route variant names. // Add route variant names.
this->_variantNames.clear(); this->_variantNames.clear();
for (std::size_t i = 1; i <= std::size_t(this->_variantVector.size()); for (std::size_t i = 1; i <= std::size_t(this->_variantVector.size());
++i) { ++i) {
this->_variantNames.append(QString::number(i)); this->_variantNames.append(QString::number(i));
} }
emit variantNamesChanged(); emit variantNamesChanged();
disconnect(&this->_variant, &Fact::rawValueChanged, this, disconnect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant); &MeasurementComplexItem::_changeVariant);
this->_variant.setCookedValue(QVariant(0)); this->_variant.setCookedValue(QVariant(0));
connect(&this->_variant, &Fact::rawValueChanged, this, connect(&this->_variant, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant); &MeasurementComplexItem::_changeVariant);
this->_changeVariantWorker(); this->_changeVariant();
this->_setState(STATE::SKIPP); this->_setState(STATE::IDLE);
this->_update(); emit routeChanged();
} else { } else {
qCDebug(MeasurementComplexItemLog) qCDebug(MeasurementComplexItemLog)
<< "_setTransects(): failed, variantVector empty."; << "_setTransects(): failed, variantVector empty.";
this->_setState(STATE::IDLE); this->_setState(STATE::IDLE);
}
} }
} }
......
...@@ -24,9 +24,9 @@ class MeasurementComplexItem : public ComplexMissionItem { ...@@ -24,9 +24,9 @@ class MeasurementComplexItem : public ComplexMissionItem {
using PtrAreaData = AreaData *; using PtrAreaData = AreaData *;
using PtrRoutingData = std::shared_ptr<RoutingData>; using PtrRoutingData = std::shared_ptr<RoutingData>;
using PtrWorker = RoutingThread *; using PtrWorker = RoutingThread *;
using Variant = QList<QGeoCoordinate>; using Variant = QVariantList;
enum class STATE { IDLE, ROUTING, REVERT_PATH, CHANGE_VARIANT, EDITING }; enum class STATE { IDLE, ROUTING, EDITING };
public: public:
MeasurementComplexItem(PlanMasterController *masterController, bool flyView, MeasurementComplexItem(PlanMasterController *masterController, bool flyView,
...@@ -40,15 +40,17 @@ public: ...@@ -40,15 +40,17 @@ public:
Q_PROPERTY(QStringList generatorNameList READ generatorNameList NOTIFY Q_PROPERTY(QStringList generatorNameList READ generatorNameList NOTIFY
generatorNameListChanged) generatorNameListChanged)
Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged) Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
Q_PROPERTY(bool editing READ editing NOTIFY editingChanged)
Q_PROPERTY(bool ready READ ready NOTIFY readyChanged)
Q_PROPERTY( Q_PROPERTY(
routing::GeneratorBase *generator READ generator NOTIFY generatorChanged) routing::GeneratorBase *generator READ generator NOTIFY generatorChanged)
Q_PROPERTY(int generatorIndex READ generatorIndex NOTIFY generatorChanged) Q_PROPERTY(int generatorIndex READ generatorIndex NOTIFY generatorChanged)
Q_PROPERTY(bool editing READ editing NOTIFY editingChanged) Q_PROPERTY(bool editing READ editing NOTIFY editingChanged)
Q_PROPERTY(bool editing READ editing NOTIFY editingChanged)
Q_PROPERTY(AreaData *areaData READ areaData NOTIFY areaDataChanged) Q_PROPERTY(AreaData *areaData READ areaData NOTIFY areaDataChanged)
Q_PROPERTY(QVariantList visualTransectPoints READ visualTransectPoints NOTIFY Q_PROPERTY(QVariantList route READ route NOTIFY routeChanged)
visualTransectPointsChanged)
Q_INVOKABLE void revertPath(void); Q_INVOKABLE void reverseRoute(void);
// Overrides from ComplexMissionItem // Overrides from ComplexMissionItem
virtual QString patternName(void) const override final; virtual QString patternName(void) const override final;
...@@ -104,7 +106,7 @@ public: ...@@ -104,7 +106,7 @@ public:
//! //!
//! \brief editingStart Starts area data editing. //! \brief editingStart Starts area data editing.
//! //!
//! Starts area data editing. Transects will not be updated bewteen a call //! Starts area data editing. Route will not be updated bewteen a call
//! sequence of editingStart() and editingStop(). //! sequence of editingStart() and editingStop().
//! //!
void editingStart(); void editingStart();
...@@ -112,18 +114,22 @@ public: ...@@ -112,18 +114,22 @@ public:
//! \brief editingStop Stops area editing. //! \brief editingStop Stops area editing.
//! //!
//! Stops area editing. Will reset area data to the state before //! Stops area editing. Will reset area data to the state before
//! editingStart() if it is invalid. Triggers a transect update. //! editingStart() if it is invalid. Triggers a route update.
//! //!
void editingStop(); void editingStop();
// Property getters // Property getters
const AreaData *areaData() const; const AreaData *areaData() const;
AreaData *areaData(); AreaData *areaData();
QVariantList route();
Fact *variant(); Fact *variant();
Fact *altitude(); Fact *altitude();
QStringList variantNames() const; QStringList variantNames() const;
bool calculating() const; bool calculating() const;
bool editing() const; bool editing() const;
bool ready() const;
bool followTerrain() const; bool followTerrain() const;
static const char *settingsGroup; static const char *settingsGroup;
...@@ -133,23 +139,25 @@ public: ...@@ -133,23 +139,25 @@ public:
static const QString name; static const QString name;
signals: signals:
void calculatingChanged();
void variantNamesChanged(); void variantNamesChanged();
void generatorNameListChanged(); void generatorNameListChanged();
void generatorChanged(); void generatorChanged();
void calculatingChanged();
void editingChanged(); void editingChanged();
void readyChanged();
void areaDataChanged(); void areaDataChanged();
void routeChanged();
private slots: private slots:
// Overrides from TransectStyleComplexItem
void _update(void);
// Worker functions. // Worker functions.
void _setTransects(PtrRoutingData pRoute); void _storeRoutingData(PtrRoutingData pRoute);
bool _updateRoute();
void _changeVariant(); void _changeVariant();
bool _updateRouteWorker(); void _reverseRoute();
void _changeVariantWorker();
void _reverseWorker();
private: private:
bool _setGenerator(PtrGenerator newG); bool _setGenerator(PtrGenerator newG);
...@@ -157,12 +165,13 @@ private: ...@@ -157,12 +165,13 @@ private:
void _setAreaData(PtrAreaData data); void _setAreaData(PtrAreaData data);
static bool _calculating(STATE state); static bool _calculating(STATE state);
static bool _editing(STATE state); static bool _editing(STATE state);
static bool _ready(STATE state);
// Hirarcical stuff. // Hirarcical stuff.
PlanMasterController *_masterController; PlanMasterController *_masterController;
int _sequenceNumber; int _sequenceNumber;
bool _followTerrain; bool _followTerrain;
SettingsFact *_altitude; SettingsFact _altitude;
// State. // State.
STATE _state; STATE _state;
......
#pragma once #pragma once
#include "RouteMissionItem/geometry/GenericPolygonArray.h" #include "MeasurementComplexItem//geometry/GenericPolygonArray.h"
#include "RouteMissionItem/nemo_interface/SnakeTileLocal.h" #include "MeasurementComplexItem//nemo_interface/SnakeTileLocal.h"
#include <vector> #include <vector>
typedef GenericPolygonArray<SnakeTileLocal, std::vector> SnakeTilesLocal; typedef GenericPolygonArray<SnakeTileLocal, std::vector> SnakeTilesLocal;
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