Commit 1b05f323 authored by Valentin Platzgummer's avatar Valentin Platzgummer

MeasurementItemEditor improved

parent 31d4efc3
...@@ -34,14 +34,13 @@ DebugBuild { ...@@ -34,14 +34,13 @@ DebugBuild {
DEFINES += DEBUG DEFINES += DEBUG
#DEFINES += SNAKE_SHOW_TIME #DEFINES += SNAKE_SHOW_TIME
#DEFINES += SNAKE_DEBUG #DEFINES += SNAKE_DEBUG
DEFINES += SNAKE_SHOW_TIME #DEFINES += SNAKE_SHOW_TIME
DEFINES += DEBUG_CIRCULAR_SURVEY
DEFINES += ROS_BRIDGE_DEBUG DEFINES += ROS_BRIDGE_DEBUG
} }
else { else {
DESTDIR = $${OUT_PWD}/release DESTDIR = $${OUT_PWD}/release
#DEFINES += ROS_BRIDGE_DEBUG #DEFINES += ROS_BRIDGE_DEBUG
DEFINES += SNAKE_SHOW_TIME #DEFINES += SNAKE_SHOW_TIME
#DEFINES += SNAKE_DEBUG #DEFINES += SNAKE_DEBUG
DEFINES += NDEBUG DEFINES += NDEBUG
} }
......
...@@ -18,8 +18,7 @@ AreaData::AreaData(QObject *parent) : QObject(parent) {} ...@@ -18,8 +18,7 @@ AreaData::AreaData(QObject *parent) : QObject(parent) {}
AreaData::~AreaData() {} AreaData::~AreaData() {}
AreaData::AreaData(const AreaData &other, QObject *parent) AreaData::AreaData(const AreaData &other, QObject *parent) : QObject(parent) {
: QObject(parent), _showErrorMessages(true) {
*this = other; *this = other;
} }
...@@ -93,21 +92,21 @@ const QmlObjectListModel *AreaData::areaList() const { return &_areaList; } ...@@ -93,21 +92,21 @@ const QmlObjectListModel *AreaData::areaList() const { return &_areaList; }
QGeoCoordinate AreaData::origin() const { return _origin; } QGeoCoordinate AreaData::origin() const { return _origin; }
bool AreaData::isCorrect() { bool AreaData::isCorrect(bool showError) {
if (!initialized()) { if (!initialized()) {
qCWarning(AreaDataLog) << "isCorrect(): not initialized"; qCWarning(AreaDataLog) << "isCorrect(): not initialized";
return false; return false;
} }
// Check if areas are correct // Check if areas are correct
if (!_areasCorrect()) { if (!_areasCorrect(showError)) {
return false; return false;
} }
// Check if areas where added. // Check if areas where added.
MeasurementArea *measurementArea = nullptr; MeasurementArea *measurementArea = nullptr;
SafeArea *safeArea = nullptr; SafeArea *safeArea = nullptr;
if (!_getAreas(&measurementArea, &safeArea)) { if (!_getAreas(&measurementArea, &safeArea, showError)) {
return false; return false;
} }
...@@ -128,7 +127,8 @@ bool AreaData::isCorrect() { ...@@ -128,7 +127,8 @@ bool AreaData::isCorrect() {
// qDebug() << ss.str().c_str(); // qDebug() << ss.str().c_str();
if (!bg::covered_by(measurementAreaENU, safeAreaENU)) { if (!bg::covered_by(measurementAreaENU, safeAreaENU)) {
_processError(tr("Measurement Area not inside Safe Area. Please adjust " _processError(tr("Measurement Area not inside Safe Area. Please adjust "
"the Measurement Area.\n")); "the Measurement Area.\n"),
showError);
return false; return false;
} }
...@@ -209,11 +209,11 @@ bool AreaData::initialized() { ...@@ -209,11 +209,11 @@ bool AreaData::initialized() {
measurementArea->count() >= 3 && safeArea->count() >= 3; measurementArea->count() >= 3 && safeArea->count() >= 3;
} }
void AreaData::intersection() { void AreaData::intersection(bool showError) {
if (initialized() && _areasCorrect()) { if (initialized() && _areasCorrect(showError)) {
MeasurementArea *measurementArea = nullptr; MeasurementArea *measurementArea = nullptr;
SafeArea *safeArea = nullptr; SafeArea *safeArea = nullptr;
if (_getAreas(&measurementArea, &safeArea)) { if (_getAreas(&measurementArea, &safeArea, showError)) {
// convert to ENU // convert to ENU
const auto origin = this->origin(); const auto origin = this->origin();
...@@ -230,7 +230,8 @@ void AreaData::intersection() { ...@@ -230,7 +230,8 @@ void AreaData::intersection() {
if (outputENU.size() < 1 || outputENU[0].outer().size() < 4) { if (outputENU.size() < 1 || outputENU[0].outer().size() < 4) {
_processError( _processError(
"Intersection did't deliver any result. Measurement Area and " "Intersection did't deliver any result. Measurement Area and "
"Safe Area must touch each other."); "Safe Area must touch each other.",
showError);
return; return;
} }
...@@ -238,7 +239,8 @@ void AreaData::intersection() { ...@@ -238,7 +239,8 @@ void AreaData::intersection() {
_processError( _processError(
"Hint: Only simple polygons can be displayed. If Intersection" "Hint: Only simple polygons can be displayed. If Intersection"
"produces polygons with holes or multi polygons, only " "produces polygons with holes or multi polygons, only "
"partial information can be displayed."); "partial information can be displayed.",
showError);
} }
// Shrink the result if safeAreaENU doesn't cover it. // Shrink the result if safeAreaENU doesn't cover it.
...@@ -247,9 +249,10 @@ void AreaData::intersection() { ...@@ -247,9 +249,10 @@ void AreaData::intersection() {
while (!bg::covered_by(large, safeAreaENU)) { while (!bg::covered_by(large, safeAreaENU)) {
snake::offsetPolygon(large, small, -0.1); snake::offsetPolygon(large, small, -0.1);
large = std::move(small); large = std::move(small);
qDebug() << "intersection(): shrink";
} }
// Check if result is different from input.
if (!bg::equals(large, measurementAreaENU)) {
// Convert. // Convert.
measurementArea->clear(); measurementArea->clear();
for (auto it = large.outer().begin(); it != large.outer().end() - 1; for (auto it = large.outer().begin(); it != large.outer().end() - 1;
...@@ -260,6 +263,7 @@ void AreaData::intersection() { ...@@ -260,6 +263,7 @@ void AreaData::intersection() {
} }
} }
} }
}
} }
MeasurementArea *AreaData::measurementArea() { MeasurementArea *AreaData::measurementArea() {
...@@ -302,7 +306,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) { ...@@ -302,7 +306,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
// load MeasurementArea // load MeasurementArea
if (jsonArea[GeoArea::areaTypeKey].toString() == if (jsonArea[GeoArea::areaTypeKey].toString() ==
MeasurementArea::name) { MeasurementArea::nameString) {
auto area = getGeoArea<MeasurementArea *>(_areaList); auto area = getGeoArea<MeasurementArea *>(_areaList);
...@@ -325,7 +329,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) { ...@@ -325,7 +329,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
} }
} }
// load SafeArea // load SafeArea
else if (jsonArea[GeoArea::areaTypeKey].toString() == SafeArea::name) { else if (jsonArea[GeoArea::areaTypeKey].toString() ==
SafeArea::nameString) {
auto area = getGeoArea<SafeArea *>(_areaList); auto area = getGeoArea<SafeArea *>(_areaList);
if (area == nullptr) { if (area == nullptr) {
...@@ -394,7 +399,6 @@ bool AreaData::save(QJsonObject &obj) { ...@@ -394,7 +399,6 @@ bool AreaData::save(QJsonObject &obj) {
} else { } else {
qDebug(AreaDataLog) << "save(): not able to save area: " qDebug(AreaDataLog) << "save(): not able to save area: "
<< area->objectName(); << area->objectName();
_processError(tr("Not able to save area: ") + area->objectName());
return false; return false;
} }
} }
...@@ -411,21 +415,21 @@ void AreaData::_setOrigin(const QGeoCoordinate &origin) { ...@@ -411,21 +415,21 @@ void AreaData::_setOrigin(const QGeoCoordinate &origin) {
} }
} }
void AreaData::_processError(const QString &str) { void AreaData::_processError(const QString &str, bool showError) {
this->_errorString = str; this->_errorString = str;
emit error(); emit error();
if (_showErrorMessages) { if (showError) {
qgcApp()->informationMessageBoxOnMainThread(tr("Area Editor"), qgcApp()->informationMessageBoxOnMainThread(tr("Area Editor"),
this->errorString()); this->errorString());
} }
} }
bool AreaData::_areasCorrect() { bool AreaData::_areasCorrect(bool showError) {
// Check if areas are correct. // Check if areas are correct.
for (int i = 0; i < _areaList.count(); ++i) { for (int i = 0; i < _areaList.count(); ++i) {
auto *area = _areaList.value<GeoArea *>(0); auto *area = _areaList.value<GeoArea *>(i);
if (!area->isCorrect()) { if (!area->isCorrect()) {
_processError(area->errorString()); _processError(area->errorString(), showError);
return false; return false;
} }
} }
...@@ -433,30 +437,25 @@ bool AreaData::_areasCorrect() { ...@@ -433,30 +437,25 @@ bool AreaData::_areasCorrect() {
return true; return true;
} }
bool AreaData::_getAreas(MeasurementArea **measurementArea, bool AreaData::_getAreas(MeasurementArea **measurementArea, SafeArea **safeArea,
SafeArea **safeArea) { bool showError) {
*measurementArea = getGeoArea<MeasurementArea *>(_areaList); *measurementArea = getGeoArea<MeasurementArea *>(_areaList);
if (*measurementArea == nullptr) { if (*measurementArea == nullptr) {
_processError( _processError(
tr("Measurement Area missing. Please define a measurement area.")); tr("Measurement Area missing. Please define a measurement area."),
showError);
return false; return false;
} }
*safeArea = getGeoArea<SafeArea *>(_areaList); *safeArea = getGeoArea<SafeArea *>(_areaList);
if (*safeArea == nullptr) { if (*safeArea == nullptr) {
_processError(tr("Safe Area missing. Please define a safe area.")); _processError(tr("Safe Area missing. Please define a safe area."),
showError);
return false; return false;
} }
return true; return true;
} }
void AreaData::setShowErrorMessages(bool showErrorMessages) {
if (showErrorMessages != _showErrorMessages) {
_showErrorMessages = showErrorMessages;
emit showErrorMessagesChanged();
}
}
void AreaData::_updateOrigin() { void AreaData::_updateOrigin() {
auto *measurementArea = getGeoArea<MeasurementArea *>(_areaList); auto *measurementArea = getGeoArea<MeasurementArea *>(_areaList);
if (measurementArea != nullptr) { if (measurementArea != nullptr) {
...@@ -464,6 +463,4 @@ void AreaData::_updateOrigin() { ...@@ -464,6 +463,4 @@ void AreaData::_updateOrigin() {
} }
} }
bool AreaData::showErrorMessages() const { return _showErrorMessages; }
QString AreaData::errorString() const { return _errorString; } QString AreaData::errorString() const { return _errorString; }
...@@ -20,8 +20,7 @@ public: ...@@ -20,8 +20,7 @@ public:
AreaData &operator=(const AreaData &other); AreaData &operator=(const AreaData &other);
Q_PROPERTY(QmlObjectListModel *areaList READ areaList NOTIFY areaListChanged) Q_PROPERTY(QmlObjectListModel *areaList READ areaList NOTIFY areaListChanged)
Q_PROPERTY(bool showErrorMessages READ showErrorMessages WRITE Q_PROPERTY(QString errorString READ errorString NOTIFY error)
setShowErrorMessages NOTIFY showErrorMessagesChanged)
// Member Methodes // Member Methodes
//! //!
...@@ -51,7 +50,7 @@ public: ...@@ -51,7 +50,7 @@ public:
//! \note Origin might change if the list of areas changes. //! \note Origin might change if the list of areas changes.
QGeoCoordinate origin() const; QGeoCoordinate origin() const;
Q_INVOKABLE bool isCorrect(); Q_INVOKABLE bool isCorrect(bool showError = true);
//! //!
//! \brief initialize Initializes the areas in a valid way, such that they //! \brief initialize Initializes the areas in a valid way, such that they
//! area inside the bounding box. \param bottomLeft bottom left corner of the //! area inside the bounding box. \param bottomLeft bottom left corner of the
...@@ -69,7 +68,7 @@ public: ...@@ -69,7 +68,7 @@ public:
//! either. //! either.
//! //!
Q_INVOKABLE bool initialized(); Q_INVOKABLE bool initialized();
Q_INVOKABLE void intersection(); Q_INVOKABLE void intersection(bool showError = true);
Q_INVOKABLE MeasurementArea *measurementArea(); Q_INVOKABLE MeasurementArea *measurementArea();
Q_INVOKABLE SafeArea *safeArea(); Q_INVOKABLE SafeArea *safeArea();
...@@ -82,25 +81,21 @@ public: ...@@ -82,25 +81,21 @@ public:
QString errorString() const; // Contains a message about the last error. QString errorString() const; // Contains a message about the last error.
bool showErrorMessages() const;
void setShowErrorMessages(bool showErrorMessages);
signals: signals:
void areaListChanged(); void areaListChanged();
void originChanged(); void originChanged();
void error(); // Emitted if errorString() contains a new message. void error(); // Emitted if errorString() contains a new message.
void showErrorMessagesChanged();
private slots: private slots:
void _updateOrigin(); void _updateOrigin();
private: private:
void _setOrigin(const QGeoCoordinate &origin); void _setOrigin(const QGeoCoordinate &origin);
void _processError(const QString &str); void _processError(const QString &str, bool showError);
bool _areasCorrect(); bool _areasCorrect(bool showError);
bool _getAreas(MeasurementArea **measurementArea, SafeArea **safeArea); bool _getAreas(MeasurementArea **measurementArea, SafeArea **safeArea,
bool showError);
QGeoCoordinate _origin; QGeoCoordinate _origin;
QmlObjectListModel _areaList; QmlObjectListModel _areaList;
QString _errorString; QString _errorString;
bool _showErrorMessages;
}; };
...@@ -406,6 +406,7 @@ void CircularGenerator::setMeasurementArea(MeasurementArea *area) { ...@@ -406,6 +406,7 @@ void CircularGenerator::setMeasurementArea(MeasurementArea *area) {
&CircularGenerator::resetReferenceIfInvalid); &CircularGenerator::resetReferenceIfInvalid);
connect(_measurementArea, &MeasurementArea::pathChanged, this, connect(_measurementArea, &MeasurementArea::pathChanged, this,
&GeneratorBase::generatorChanged); &GeneratorBase::generatorChanged);
resetReferenceIfInvalid();
} }
emit generatorChanged(); emit generatorChanged();
...@@ -438,16 +439,13 @@ bool circularTransects(const snake::FPoint &reference, ...@@ -438,16 +439,13 @@ bool circularTransects(const snake::FPoint &reference,
distances.reserve(polygon.outer().size()); distances.reserve(polygon.outer().size());
std::vector<snake::Angle> angles; std::vector<snake::Angle> angles;
angles.reserve(polygon.outer().size()); angles.reserve(polygon.outer().size());
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "circularTransects():"; // qCDebug(CircularGeneratorLog) << "circularTransects():";
//#endif
for (const auto &p : polygon.outer()) { for (const auto &p : polygon.outer()) {
snake::Length distance = bg::distance(reference, p) * si::meter; snake::Length distance = bg::distance(reference, p) * si::meter;
distances.push_back(distance); distances.push_back(distance);
snake::Angle alpha = (std::atan2(p.get<1>(), p.get<0>())) * si::radian; snake::Angle alpha = (std::atan2(p.get<1>(), p.get<0>())) * si::radian;
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
// qCDebug(CircularGeneratorLog) << "distances, angles, // qCDebug(CircularGeneratorLog) << "distances, angles,
// coordinates:"; qCDebug(CircularGeneratorLog) << // coordinates:"; qCDebug(CircularGeneratorLog) <<
// to_string(distance).c_str(); qCDebug(CircularGeneratorLog) // to_string(distance).c_str(); qCDebug(CircularGeneratorLog)
...@@ -455,7 +453,6 @@ bool circularTransects(const snake::FPoint &reference, ...@@ -455,7 +453,6 @@ bool circularTransects(const snake::FPoint &reference,
// qCDebug(CircularGeneratorLog) << "x = " << p.get<0>() << "y // qCDebug(CircularGeneratorLog) << "x = " << p.get<0>() << "y
// = " // = "
// << p.get<1>(); // << p.get<1>();
//#endif
} }
auto rMin = deltaR; // minimal circle radius auto rMin = deltaR; // minimal circle radius
...@@ -484,7 +481,6 @@ bool circularTransects(const snake::FPoint &reference, ...@@ -484,7 +481,6 @@ bool circularTransects(const snake::FPoint &reference,
vector<ClipperLib::Path> sectors(nTran, ClipperLib::Path()); vector<ClipperLib::Path> sectors(nTran, ClipperLib::Path());
const auto nSectors = const auto nSectors =
long(std::round(((alpha2 - alpha1) / deltaAlpha).value())); long(std::round(((alpha2 - alpha1) / deltaAlpha).value()));
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "circularTransects(): sector // qCDebug(CircularGeneratorLog) << "circularTransects(): sector
// parameres:"; qCDebug(CircularGeneratorLog) << "alpha1: " << // parameres:"; qCDebug(CircularGeneratorLog) << "alpha1: " <<
// to_string(snake::Degree(alpha1)).c_str(); // to_string(snake::Degree(alpha1)).c_str();
...@@ -499,7 +495,6 @@ bool circularTransects(const snake::FPoint &reference, ...@@ -499,7 +495,6 @@ bool circularTransects(const snake::FPoint &reference,
// qCDebug(CircularGeneratorLog) // qCDebug(CircularGeneratorLog)
// << "rMax: " << to_string(rMax).c_str(); // << "rMax: " << to_string(rMax).c_str();
// qCDebug(CircularGeneratorLog) << "nTran: " << nTran; // qCDebug(CircularGeneratorLog) << "nTran: " << nTran;
//#endif
using ClipperCircle = using ClipperCircle =
GenericCircle<ClipperLib::cInt, ClipperLib::IntPoint>; GenericCircle<ClipperLib::cInt, ClipperLib::IntPoint>;
for (auto &sector : sectors) { for (auto &sector : sectors) {
......
...@@ -67,6 +67,7 @@ bool GeneratorFactory::registerGenerator(const QString &type, ...@@ -67,6 +67,7 @@ bool GeneratorFactory::registerGenerator(const QString &type,
GeneratorFactory::Creator creator) { GeneratorFactory::Creator creator) {
const auto pair = _creatorMap.insert(std::make_pair(type, creator)); const auto pair = _creatorMap.insert(std::make_pair(type, creator));
auto success = pair.second; auto success = pair.second;
Q_ASSERT(success);
return success; return success;
} }
......
...@@ -33,12 +33,12 @@ const char *MeasurementComplexItem::jsonComplexItemTypeValue = ...@@ -33,12 +33,12 @@ const char *MeasurementComplexItem::jsonComplexItemTypeValue =
const QString MeasurementComplexItem::name(tr("Measurement")); const QString MeasurementComplexItem::name(tr("Measurement"));
namespace { namespace {
const char *variantKey = "Variant"; const char *variantIndexKey = "VariantIndex";
const char *altitudeKey = "Altitude"; const char *altitudeKey = "Altitude";
const char *areaDataKey = "AreaData"; const char *areaDataKey = "AreaData";
const char *variantNamesKey = "VariantNames"; const char *variantNamesKey = "VariantNames";
const char *generatorsKey = "Generators"; const char *generatorArrayKey = "GeneratorArray";
const char *variantsKey = "Variants"; const char *variantArrayKey = "VariantArray";
const char *generatorIndexKey = "GeneratorIndex"; const char *generatorIndexKey = "GeneratorIndex";
} // namespace } // namespace
...@@ -51,17 +51,39 @@ MeasurementComplexItem::MeasurementComplexItem( ...@@ -51,17 +51,39 @@ MeasurementComplexItem::MeasurementComplexItem(
QStringLiteral(":/json/MeasurementComplexItem.SettingsGroup.json"), QStringLiteral(":/json/MeasurementComplexItem.SettingsGroup.json"),
this)), this)),
_altitude(settingsGroup, _metaDataMap[altitudeKey]), _altitude(settingsGroup, _metaDataMap[altitudeKey]),
_variant(settingsGroup, _metaDataMap[variantKey]), _variantIndex(settingsGroup, _metaDataMap[variantIndexKey]),
_pAreaData(new AreaData(this)), _pEditorData(new AreaData(this)), _pAreaData(new AreaData(this)), _pEditorData(new AreaData(this)),
_pCurrentData(_pAreaData), _pGenerator(nullptr), _pCurrentData(_pAreaData), _pGenerator(nullptr),
_pWorker(new RoutingThread(this)) { _pWorker(new RoutingThread(this)) {
// Setup altitude.
_altitude.setRawValue(qgcApp()
->toolbox()
->settingsManager()
->appSettings()
->defaultMissionItemAltitude()
->rawValue());
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->minAMSLAltitudeChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->maxAMSLAltitudeChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->amslEntryAltChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, [this] {
emit this->amslExitAltChanged(this->_altitude.rawValue().toDouble());
});
connect(&_altitude, &SettingsFact::rawValueChanged, this,
&MeasurementComplexItem::_onAltitudeChanged);
Q_UNUSED(kmlOrShpFile) Q_UNUSED(kmlOrShpFile)
_editorQml = "qrc:/qml/MeasurementItemEditor.qml"; _editorQml = "qrc:/qml/MeasurementItemEditor.qml";
// Connect facts. // Connect facts.
connect(&this->_variant, &Fact::rawValueChanged, this, connect(&this->_variantIndex, &Fact::rawValueChanged, this,
&MeasurementComplexItem::_changeVariant); &MeasurementComplexItem::_changeVariantIndex);
// Connect worker. // Connect worker.
connect(this->_pWorker, &RoutingThread::result, this, connect(this->_pWorker, &RoutingThread::result, this,
...@@ -106,10 +128,6 @@ MeasurementComplexItem::MeasurementComplexItem( ...@@ -106,10 +128,6 @@ MeasurementComplexItem::MeasurementComplexItem(
resetGenerators(); resetGenerators();
startEditing(); startEditing();
qCritical() << "ToDo: _altitude connections missing.";
qCritical() << "ToDo: remove generatorNameList and use GeneratorBase::name() "
"instead.";
} }
MeasurementComplexItem::~MeasurementComplexItem() {} MeasurementComplexItem::~MeasurementComplexItem() {}
...@@ -173,10 +191,10 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -173,10 +191,10 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
setSequenceNumber(sequenceNumber); setSequenceNumber(sequenceNumber);
startEditing(); startEditing();
// load variant // load variant index
if (complexObject.contains(variantKey) && if (complexObject.contains(variantIndexKey) &&
complexObject[variantKey].isDouble()) { complexObject[variantIndexKey].isDouble()) {
_variant.setRawValue(complexObject[variantKey].toInt()); _variantIndex.setRawValue(complexObject[variantIndexKey].toInt());
} }
// load altitude // load altitude
...@@ -194,14 +212,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -194,14 +212,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
complexObject[areaDataKey].isObject()) { complexObject[areaDataKey].isObject()) {
QString e; QString e;
if (_pCurrentData->load(complexObject[areaDataKey].toObject(), e)) { if (_pCurrentData->load(complexObject[areaDataKey].toObject(), e)) {
_pCurrentData->setShowErrorMessages(false); if (!_pCurrentData->isCorrect(false /*don't show gui message*/)) {
if (!_pCurrentData->isCorrect()) {
errorString.append(_pCurrentData->errorString()); errorString.append(_pCurrentData->errorString());
_pCurrentData->setShowErrorMessages(true);
abortEditing(); abortEditing();
return false; return false;
} }
_pCurrentData->setShowErrorMessages(true);
} else { } else {
// this is critical, proceeding is not // this is critical, proceeding is not
...@@ -218,13 +233,13 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -218,13 +233,13 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
} }
// load Generators. // load Generators.
if (complexObject.contains(generatorsKey) && if (complexObject.contains(generatorArrayKey) &&
complexObject[generatorsKey].isArray()) { complexObject[generatorArrayKey].isArray()) {
QVector<PtrGenerator> generatorList; QVector<PtrGenerator> generatorList;
QObject parent; QObject parent;
for (const auto valueRef : complexObject[generatorsKey].toArray()) { for (const auto valueRef : complexObject[generatorArrayKey].toArray()) {
const auto jsonGen = valueRef.toObject(); const auto jsonGen = valueRef.toObject();
if (jsonGen.contains(routing::GeneratorBase::typeKey) && if (jsonGen.contains(routing::GeneratorBase::typeKey) &&
...@@ -276,7 +291,7 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -276,7 +291,7 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
// insert generators // insert generators
for (const auto gen : generatorList) { for (const auto gen : generatorList) {
gen->setParent(this); gen->setParent(this);
addGenerator(gen->name(), gen); addGenerator(gen);
} }
} }
} else { } else {
...@@ -303,11 +318,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -303,11 +318,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
// load Route Variants // load Route Variants
bool variantsSuccess = true; bool variantsSuccess = true;
QVector<Variant> variantVector; QVector<Variant> variantVector;
if (complexObject.contains(variantsKey) && if (complexObject.contains(variantArrayKey) &&
complexObject[variantsKey].isArray()) { complexObject[variantArrayKey].isArray()) {
// load variants to variantVector for further processing. // load variants to variantVector for further processing.
for (const auto valueRef : complexObject[variantsKey].toArray()) { for (const auto valueRef : complexObject[variantArrayKey].toArray()) {
if (valueRef.isArray()) { if (valueRef.isArray()) {
const auto jsonVariant = valueRef.toArray(); const auto jsonVariant = valueRef.toArray();
Variant variant; Variant variant;
...@@ -333,6 +348,16 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -333,6 +348,16 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
} }
} }
// Check if variantVector and variants are non empty
if (variantVector.size() == 0) {
variantsSuccess = false;
}
for (const auto &var : variantVector) {
if (var.size() == 0) {
variantsSuccess = false;
}
}
// Check if variants are covered by safe area. // Check if variants are covered by safe area.
if (variantsSuccess) { if (variantsSuccess) {
auto safeArea = _pCurrentData->safeArea(); auto safeArea = _pCurrentData->safeArea();
...@@ -362,11 +387,8 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject, ...@@ -362,11 +387,8 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
variantsSuccess = false; variantsSuccess = false;
} }
if (!variantsSuccess) { if (variantsSuccess) {
stopEditing(); // stop editing and trigger update
} else {
_variantVector.swap(variantVector); _variantVector.swap(variantVector);
qCritical() << "add variant names and set variant";