From eab5fe7c3efc433312c93374430bf8bafb4905bf Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Fri, 18 May 2018 12:25:20 -0700 Subject: [PATCH] Save fact settings for new Transect code --- .../CameraCalc.FactMetaData.json | 6 + src/MissionManager/CameraCalc.cc | 195 +++++++++--------- src/MissionManager/CameraCalc.h | 54 ++--- src/MissionManager/CameraCalcTest.cc | 4 +- .../StructureScan.SettingsGroup.json | 8 + .../StructureScanComplexItem.cc | 51 ++--- src/MissionManager/StructureScanComplexItem.h | 18 +- .../StructureScanComplexItemTest.cc | 4 +- src/MissionManager/SurveyComplexItem.cc | 4 +- .../TransectStyleComplexItem.cc | 17 +- src/MissionManager/TransectStyleComplexItem.h | 1 - src/PlanView/CameraCalc.qml | 12 +- 12 files changed, 192 insertions(+), 182 deletions(-) diff --git a/src/MissionManager/CameraCalc.FactMetaData.json b/src/MissionManager/CameraCalc.FactMetaData.json index 7df18d099..9860f5491 100644 --- a/src/MissionManager/CameraCalc.FactMetaData.json +++ b/src/MissionManager/CameraCalc.FactMetaData.json @@ -1,4 +1,10 @@ [ +{ + "name": "CameraName", + "shortDescription": "Camera name.", + "type": "string", + "defaultValue": "Manual (no camera specs)" +}, { "name": "ValueSetIsDistance", "shortDescription": "Value specified is distance to surface.", diff --git a/src/MissionManager/CameraCalc.cc b/src/MissionManager/CameraCalc.cc index a1efa9c5e..7dd5af018 100644 --- a/src/MissionManager/CameraCalc.cc +++ b/src/MissionManager/CameraCalc.cc @@ -14,46 +14,39 @@ #include -const char* CameraCalc::_valueSetIsDistanceName = "ValueSetIsDistance"; -const char* CameraCalc::_distanceToSurfaceName = "DistanceToSurface"; -const char* CameraCalc::_distanceToSurfaceRelativeName = "DistanceToSurfaceRelative"; -const char* CameraCalc::_imageDensityName = "ImageDensity"; -const char* CameraCalc::_frontalOverlapName = "FrontalOverlap"; -const char* CameraCalc::_sideOverlapName = "SideOverlap"; -const char* CameraCalc::_adjustedFootprintFrontalName = "AdjustedFootprintFrontal"; -const char* CameraCalc::_adjustedFootprintSideName = "AdjustedFootprintSide"; -const char* CameraCalc::_jsonCameraNameKey = "CameraName"; +const char* CameraCalc::cameraNameName = "CameraName"; +const char* CameraCalc::valueSetIsDistanceName = "ValueSetIsDistance"; +const char* CameraCalc::distanceToSurfaceName = "DistanceToSurface"; +const char* CameraCalc::distanceToSurfaceRelativeName = "DistanceToSurfaceRelative"; +const char* CameraCalc::imageDensityName = "ImageDensity"; +const char* CameraCalc::frontalOverlapName = "FrontalOverlap"; +const char* CameraCalc::sideOverlapName = "SideOverlap"; +const char* CameraCalc::adjustedFootprintFrontalName = "AdjustedFootprintFrontal"; +const char* CameraCalc::adjustedFootprintSideName = "AdjustedFootprintSide"; + const char* CameraCalc::_jsonCameraSpecTypeKey = "CameraSpecType"; -CameraCalc::CameraCalc(Vehicle* vehicle, QObject* parent) +CameraCalc::CameraCalc(Vehicle* vehicle, QString settingsGroup, QObject* parent) : CameraSpec (parent) , _vehicle (vehicle) , _dirty (false) - , _cameraName (manualCameraName()) , _disableRecalc (false) , _distanceToSurfaceRelative (true) , _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/CameraCalc.FactMetaData.json"), this)) - , _valueSetIsDistanceFact (0, _valueSetIsDistanceName, FactMetaData::valueTypeBool) - , _distanceToSurfaceFact (0, _distanceToSurfaceName, FactMetaData::valueTypeDouble) - , _imageDensityFact (0, _imageDensityName, FactMetaData::valueTypeDouble) - , _frontalOverlapFact (0, _frontalOverlapName, FactMetaData::valueTypeDouble) - , _sideOverlapFact (0, _sideOverlapName, FactMetaData::valueTypeDouble) - , _adjustedFootprintSideFact (0, _adjustedFootprintSideName, FactMetaData::valueTypeDouble) - , _adjustedFootprintFrontalFact (0, _adjustedFootprintFrontalName, FactMetaData::valueTypeDouble) + , _cameraNameFact (settingsGroup, _metaDataMap[cameraNameName]) + , _valueSetIsDistanceFact (settingsGroup, _metaDataMap[valueSetIsDistanceName]) + , _distanceToSurfaceFact (settingsGroup, _metaDataMap[distanceToSurfaceName]) + , _imageDensityFact (settingsGroup, _metaDataMap[imageDensityName]) + , _frontalOverlapFact (settingsGroup, _metaDataMap[frontalOverlapName]) + , _sideOverlapFact (settingsGroup, _metaDataMap[sideOverlapName]) + , _adjustedFootprintSideFact (settingsGroup, _metaDataMap[adjustedFootprintSideName]) + , _adjustedFootprintFrontalFact (settingsGroup, _metaDataMap[adjustedFootprintFrontalName]) , _imageFootprintSide (0) , _imageFootprintFrontal (0) , _knownCameraList (_vehicle->staticCameraList()) { QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); - _valueSetIsDistanceFact.setMetaData (_metaDataMap[_valueSetIsDistanceName], true /* setDefaultFromMetaData */); - _distanceToSurfaceFact.setMetaData (_metaDataMap[_distanceToSurfaceName], true); - _imageDensityFact.setMetaData (_metaDataMap[_imageDensityName], true); - _frontalOverlapFact.setMetaData (_metaDataMap[_frontalOverlapName], true); - _sideOverlapFact.setMetaData (_metaDataMap[_sideOverlapName], true); - _adjustedFootprintSideFact.setMetaData (_metaDataMap[_adjustedFootprintSideName], true); - _adjustedFootprintFrontalFact.setMetaData (_metaDataMap[_adjustedFootprintFrontalName], true); - connect(&_valueSetIsDistanceFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); connect(&_distanceToSurfaceFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); connect(&_imageDensityFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); @@ -61,11 +54,12 @@ CameraCalc::CameraCalc(Vehicle* vehicle, QObject* parent) connect(&_sideOverlapFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); connect(&_adjustedFootprintSideFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); connect(&_adjustedFootprintFrontalFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); - connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_setDirty); + connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::_setDirty); connect(this, &CameraCalc::distanceToSurfaceRelativeChanged, this, &CameraCalc::_setDirty); - connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_recalcTriggerDistance); - connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_adjustDistanceToSurfaceRelative); + connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::_cameraNameChanged); + connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::isManualCameraChanged); + connect(&_cameraNameFact, &Fact::valueChanged, this, &CameraCalc::isCustomCameraChanged); connect(&_distanceToSurfaceFact, &Fact::rawValueChanged, this, &CameraCalc::_recalcTriggerDistance); connect(&_imageDensityFact, &Fact::rawValueChanged, this, &CameraCalc::_recalcTriggerDistance); @@ -84,57 +78,64 @@ void CameraCalc::setDirty(bool dirty) } } -void CameraCalc::setCameraName(QString cameraName) +void CameraCalc::_cameraNameChanged(void) { - if (cameraName != _cameraName) { - _cameraName = cameraName; + if (_disableRecalc) { + return; + } - if (_cameraName == manualCameraName() || _cameraName == customCameraName()) { + QString cameraName = _cameraNameFact.rawValue().toString(); + + // Validate known camera name + bool foundKnownCamera = false; + CameraMetaData* cameraMetaData = NULL; + if (!isManualCamera() && !isCustomCamera()) { + for (int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) { + cameraMetaData = _knownCameraList[cameraIndex].value(); + if (cameraName == cameraMetaData->name()) { + foundKnownCamera = true; + break; + } + } + + if (!foundKnownCamera) { + // This will cause another camera changed signal which will recurse back to this routine + _cameraNameFact.setRawValue(customCameraName()); + return; + } + } + + _disableRecalc = true; + if (foundKnownCamera) { + sensorWidth()->setRawValue (cameraMetaData->sensorWidth()); + sensorHeight()->setRawValue (cameraMetaData->sensorHeight()); + imageWidth()->setRawValue (cameraMetaData->imageWidth()); + imageHeight()->setRawValue (cameraMetaData->imageHeight()); + focalLength()->setRawValue (cameraMetaData->focalLength()); + landscape()->setRawValue (cameraMetaData->landscape()); + fixedOrientation()->setRawValue (cameraMetaData->fixedOrientation()); + minTriggerInterval()->setRawValue (cameraMetaData->minTriggerInterval()); + } else { + if (isManualCamera() || isCustomCamera()) { // These values are unknown for these types fixedOrientation()->setRawValue(false); minTriggerInterval()->setRawValue(0); - if (_cameraName == manualCameraName()) { + if (isManualCamera()) { valueSetIsDistance()->setRawValue(false); } } else { - // This should be a known camera name. Update camera specs to new camera - - bool foundKnownCamera = false; - CameraMetaData* cameraMetaData = NULL; - for (int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) { - cameraMetaData = _knownCameraList[cameraIndex].value(); - if (cameraName == cameraMetaData->name()) { - foundKnownCamera = true; - break; - } - } - - _disableRecalc = true; - if (foundKnownCamera) { - sensorWidth()->setRawValue (cameraMetaData->sensorWidth()); - sensorHeight()->setRawValue (cameraMetaData->sensorHeight()); - imageWidth()->setRawValue (cameraMetaData->imageWidth()); - imageHeight()->setRawValue (cameraMetaData->imageHeight()); - focalLength()->setRawValue (cameraMetaData->focalLength()); - landscape()->setRawValue (cameraMetaData->landscape()); - fixedOrientation()->setRawValue (cameraMetaData->fixedOrientation()); - minTriggerInterval()->setRawValue (cameraMetaData->minTriggerInterval()); - } else { - // We don't know this camera, switch back to custom - _cameraName = customCameraName(); - fixedOrientation()->setRawValue(false); - minTriggerInterval()->setRawValue(0); - } - _disableRecalc = false; + qWarning() << "Internal Error: Not known camera, but now manual or custom either"; } - - emit cameraNameChanged(_cameraName); } + _disableRecalc = false; + + _recalcTriggerDistance(); + _adjustDistanceToSurfaceRelative(); } void CameraCalc::_recalcTriggerDistance(void) { - if (_disableRecalc || _cameraName == manualCameraName()) { + if (_disableRecalc || isManualCamera()) { return; } @@ -178,18 +179,18 @@ void CameraCalc::_recalcTriggerDistance(void) void CameraCalc::save(QJsonObject& json) const { json[JsonHelper::jsonVersionKey] = 1; - json[_adjustedFootprintSideName] = _adjustedFootprintSideFact.rawValue().toDouble(); - json[_adjustedFootprintFrontalName] = _adjustedFootprintFrontalFact.rawValue().toDouble(); - json[_distanceToSurfaceName] = _distanceToSurfaceFact.rawValue().toDouble(); - json[_distanceToSurfaceRelativeName] = _distanceToSurfaceRelative; - json[_jsonCameraNameKey] = _cameraName; + json[adjustedFootprintSideName] = _adjustedFootprintSideFact.rawValue().toDouble(); + json[adjustedFootprintFrontalName] = _adjustedFootprintFrontalFact.rawValue().toDouble(); + json[distanceToSurfaceName] = _distanceToSurfaceFact.rawValue().toDouble(); + json[distanceToSurfaceRelativeName] = _distanceToSurfaceRelative; + json[cameraNameName] = _cameraNameFact.rawValue().toString(); - if (_cameraName != manualCameraName()) { + if (!isManualCamera()) { CameraSpec::save(json); - json[_valueSetIsDistanceName] = _valueSetIsDistanceFact.rawValue().toBool(); - json[_imageDensityName] = _imageDensityFact.rawValue().toDouble(); - json[_frontalOverlapName] = _frontalOverlapFact.rawValue().toDouble(); - json[_sideOverlapName] = _sideOverlapFact.rawValue().toDouble(); + json[valueSetIsDistanceName] = _valueSetIsDistanceFact.rawValue().toBool(); + json[imageDensityName] = _imageDensityFact.rawValue().toDouble(); + json[frontalOverlapName] = _frontalOverlapFact.rawValue().toDouble(); + json[sideOverlapName] = _sideOverlapFact.rawValue().toDouble(); } } @@ -204,9 +205,9 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString) // _jsonCameraNameKey only set if CameraSpecKnown int cameraSpec = v1Json[_jsonCameraSpecTypeKey].toInt(CameraSpecNone); if (cameraSpec == CameraSpecCustom) { - v1Json[_jsonCameraNameKey] = customCameraName(); + v1Json[cameraNameName] = customCameraName(); } else if (cameraSpec == CameraSpecNone) { - v1Json[_jsonCameraNameKey] = manualCameraName(); + v1Json[cameraNameName] = manualCameraName(); } v1Json.remove(_jsonCameraSpecTypeKey); v1Json[JsonHelper::jsonVersionKey] = 1; @@ -219,11 +220,11 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString) } QList keyInfoList1 = { - { _jsonCameraNameKey, QJsonValue::String, true }, - { _adjustedFootprintSideName, QJsonValue::Double, true }, - { _adjustedFootprintFrontalName, QJsonValue::Double, true }, - { _distanceToSurfaceName, QJsonValue::Double, true }, - { _distanceToSurfaceRelativeName, QJsonValue::Bool, true }, + { cameraNameName, QJsonValue::String, true }, + { adjustedFootprintSideName, QJsonValue::Double, true }, + { adjustedFootprintFrontalName, QJsonValue::Double, true }, + { distanceToSurfaceName, QJsonValue::Double, true }, + { distanceToSurfaceRelativeName, QJsonValue::Bool, true }, }; if (!JsonHelper::validateKeys(v1Json, keyInfoList1, errorString)) { return false; @@ -231,29 +232,29 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString) _disableRecalc = true; - setCameraName(v1Json[_jsonCameraNameKey].toString()); - _adjustedFootprintSideFact.setRawValue (v1Json[_adjustedFootprintSideName].toDouble()); - _adjustedFootprintFrontalFact.setRawValue (v1Json[_adjustedFootprintFrontalName].toDouble()); - _distanceToSurfaceFact.setRawValue (v1Json[_distanceToSurfaceName].toDouble()); + _cameraNameFact.setRawValue (v1Json[cameraNameName].toString()); + _adjustedFootprintSideFact.setRawValue (v1Json[adjustedFootprintSideName].toDouble()); + _adjustedFootprintFrontalFact.setRawValue (v1Json[adjustedFootprintFrontalName].toDouble()); + _distanceToSurfaceFact.setRawValue (v1Json[distanceToSurfaceName].toDouble()); - _distanceToSurfaceRelative = v1Json[_distanceToSurfaceRelativeName].toBool(); + _distanceToSurfaceRelative = v1Json[distanceToSurfaceRelativeName].toBool(); - if (_cameraName != manualCameraName()) { + if (!isManualCamera()) { QList keyInfoList2 = { - { _valueSetIsDistanceName, QJsonValue::Bool, true }, - { _imageDensityName, QJsonValue::Double, true }, - { _frontalOverlapName, QJsonValue::Double, true }, - { _sideOverlapName, QJsonValue::Double, true }, + { valueSetIsDistanceName, QJsonValue::Bool, true }, + { imageDensityName, QJsonValue::Double, true }, + { frontalOverlapName, QJsonValue::Double, true }, + { sideOverlapName, QJsonValue::Double, true }, }; if (!JsonHelper::validateKeys(v1Json, keyInfoList2, errorString)) { return false; _disableRecalc = false; } - _valueSetIsDistanceFact.setRawValue (v1Json[_valueSetIsDistanceName].toBool()); - _imageDensityFact.setRawValue (v1Json[_imageDensityName].toDouble()); - _frontalOverlapFact.setRawValue (v1Json[_frontalOverlapName].toDouble()); - _sideOverlapFact.setRawValue (v1Json[_sideOverlapName].toDouble()); + _valueSetIsDistanceFact.setRawValue (v1Json[valueSetIsDistanceName].toBool()); + _imageDensityFact.setRawValue (v1Json[imageDensityName].toDouble()); + _frontalOverlapFact.setRawValue (v1Json[frontalOverlapName].toDouble()); + _sideOverlapFact.setRawValue (v1Json[sideOverlapName].toDouble()); if (!CameraSpec::load(v1Json, errorString)) { return false; diff --git a/src/MissionManager/CameraCalc.h b/src/MissionManager/CameraCalc.h index 953114ec5..1b2339e89 100644 --- a/src/MissionManager/CameraCalc.h +++ b/src/MissionManager/CameraCalc.h @@ -10,6 +10,7 @@ #pragma once #include "CameraSpec.h" +#include "SettingsFact.h" class Vehicle; @@ -18,12 +19,13 @@ class CameraCalc : public CameraSpec Q_OBJECT public: - CameraCalc(Vehicle* vehicle, QObject* parent = NULL); + CameraCalc(Vehicle* vehicle, QString settingsGroup, QObject* parent = NULL); - Q_PROPERTY(QString cameraName READ cameraName WRITE setCameraName NOTIFY cameraNameChanged) Q_PROPERTY(QString customCameraName READ customCameraName CONSTANT) ///< Camera name for custom camera setting Q_PROPERTY(QString manualCameraName READ manualCameraName CONSTANT) ///< Camera name for manual camera setting - Q_PROPERTY(bool isManualCamera READ isManualCamera NOTIFY cameraNameChanged) ///< true: using manual camera + Q_PROPERTY(bool isManualCamera READ isManualCamera NOTIFY isManualCameraChanged) + Q_PROPERTY(bool isCustomCamera READ isCustomCamera NOTIFY isCustomCameraChanged) + Q_PROPERTY(Fact* cameraName READ cameraName CONSTANT) Q_PROPERTY(Fact* valueSetIsDistance READ valueSetIsDistance CONSTANT) ///< true: distance specified, resolution calculated Q_PROPERTY(Fact* distanceToSurface READ distanceToSurface CONSTANT) ///< Distance to surface for image foot print calculation Q_PROPERTY(Fact* imageDensity READ imageDensity CONSTANT) ///< Image density on surface (cm/px) @@ -39,9 +41,8 @@ public: static QString customCameraName(void); static QString manualCameraName(void); - QString cameraName(void) const { return _cameraName; } - void setCameraName(QString cameraName); + Fact* cameraName (void) { return &_cameraNameFact; } Fact* valueSetIsDistance (void) { return &_valueSetIsDistanceFact; } Fact* distanceToSurface (void) { return &_distanceToSurfaceFact; } Fact* imageDensity (void) { return &_imageDensityFact; } @@ -59,7 +60,8 @@ public: const Fact* adjustedFootprintFrontal (void) const { return &_adjustedFootprintFrontalFact; } bool dirty (void) const { return _dirty; } - bool isManualCamera (void) { return cameraName() == manualCameraName(); } + bool isManualCamera (void) const { return _cameraNameFact.rawValue().toString() == manualCameraName(); } + bool isCustomCamera (void) const { return _cameraNameFact.rawValue().toString() == customCameraName(); } double imageFootprintSide (void) const { return _imageFootprintSide; } double imageFootprintFrontal (void) const { return _imageFootprintFrontal; } bool distanceToSurfaceRelative (void) const { return _distanceToSurfaceRelative; } @@ -70,50 +72,52 @@ public: void save(QJsonObject& json) const; bool load(const QJsonObject& json, QString& errorString); + static const char* cameraNameName; + static const char* valueSetIsDistanceName; + static const char* distanceToSurfaceName; + static const char* distanceToSurfaceRelativeName; + static const char* imageDensityName; + static const char* frontalOverlapName; + static const char* sideOverlapName; + static const char* adjustedFootprintSideName; + static const char* adjustedFootprintFrontalName; + signals: - void cameraNameChanged (QString cameraName); void dirtyChanged (bool dirty); void imageFootprintSideChanged (double imageFootprintSide); void imageFootprintFrontalChanged (double imageFootprintFrontal); void distanceToSurfaceRelativeChanged (bool distanceToSurfaceRelative); + void isManualCameraChanged (void); + void isCustomCameraChanged (void); private slots: void _recalcTriggerDistance (void); void _adjustDistanceToSurfaceRelative (void); void _setDirty (void); + void _cameraNameChanged (void); private: Vehicle* _vehicle; bool _dirty; - QString _cameraName; bool _disableRecalc; bool _distanceToSurfaceRelative; QMap _metaDataMap; - Fact _valueSetIsDistanceFact; - Fact _distanceToSurfaceFact; - Fact _imageDensityFact; - Fact _frontalOverlapFact; - Fact _sideOverlapFact; - Fact _adjustedFootprintSideFact; - Fact _adjustedFootprintFrontalFact; + SettingsFact _cameraNameFact; + SettingsFact _valueSetIsDistanceFact; + SettingsFact _distanceToSurfaceFact; + SettingsFact _imageDensityFact; + SettingsFact _frontalOverlapFact; + SettingsFact _sideOverlapFact; + SettingsFact _adjustedFootprintSideFact; + SettingsFact _adjustedFootprintFrontalFact; double _imageFootprintSide; double _imageFootprintFrontal; QVariantList _knownCameraList; - static const char* _valueSetIsDistanceName; - static const char* _distanceToSurfaceName; - static const char* _distanceToSurfaceRelativeName; - static const char* _imageDensityName; - static const char* _frontalOverlapName; - static const char* _sideOverlapName; - static const char* _adjustedFootprintSideName; - static const char* _adjustedFootprintFrontalName; - static const char* _jsonCameraNameKey; - // The following are deprecated usage and only included in order to convert older formats enum CameraSpecType { diff --git a/src/MissionManager/CameraCalcTest.cc b/src/MissionManager/CameraCalcTest.cc index cb44927c3..2ca5f17d9 100644 --- a/src/MissionManager/CameraCalcTest.cc +++ b/src/MissionManager/CameraCalcTest.cc @@ -21,7 +21,7 @@ void CameraCalcTest::init(void) UnitTest::init(); _offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); - _cameraCalc = new CameraCalc(_offlineVehicle, this); + _cameraCalc = new CameraCalc(_offlineVehicle, "CameraCalcUnitTest" /* settingsGroup */, this); _rgSignals[cameraNameChangedIndex] = SIGNAL(cameraNameChanged(QString)); _rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool)); @@ -81,7 +81,7 @@ void CameraCalcTest::_testDirty(void) } rgFacts.clear(); - _cameraCalc->setCameraName(_cameraCalc->customCameraName()); + _cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName()); QVERIFY(_cameraCalc->dirty()); _multiSpy->clearAllSignals(); diff --git a/src/MissionManager/StructureScan.SettingsGroup.json b/src/MissionManager/StructureScan.SettingsGroup.json index 9c3beebab..690167442 100644 --- a/src/MissionManager/StructureScan.SettingsGroup.json +++ b/src/MissionManager/StructureScan.SettingsGroup.json @@ -34,6 +34,14 @@ "min": 1, "defaultValue": 1 }, +{ + "name": "StructureHeight", + "shortDescription": "Height of structure being scanned.", + "type": "double", + "units": "m", + "min": 1, + "defaultValue": 100 +}, { "name": "Layer distance", "shortDescription": "Distance between each layer.", diff --git a/src/MissionManager/StructureScanComplexItem.cc b/src/MissionManager/StructureScanComplexItem.cc index 1b815d4dc..798818ab1 100644 --- a/src/MissionManager/StructureScanComplexItem.cc +++ b/src/MissionManager/StructureScanComplexItem.cc @@ -21,18 +21,18 @@ QGC_LOGGING_CATEGORY(StructureScanComplexItemLog, "StructureScanComplexItemLog") -const char* StructureScanComplexItem::_altitudeFactName = "Altitude"; -const char* StructureScanComplexItem::_structureHeightFactName = "StructureHeight"; -const char* StructureScanComplexItem::_layersFactName = "Layers"; +const char* StructureScanComplexItem::settingsGroup = "StructureScan"; +const char* StructureScanComplexItem::altitudeName = "Altitude"; +const char* StructureScanComplexItem::structureHeightName = "StructureHeight"; +const char* StructureScanComplexItem::layersName = "Layers"; -const char* StructureScanComplexItem::jsonComplexItemTypeValue = "StructureScan"; -const char* StructureScanComplexItem::_jsonCameraCalcKey = "CameraCalc"; -const char* StructureScanComplexItem::_jsonAltitudeRelativeKey = "altitudeRelative"; - -QMap StructureScanComplexItem::_metaDataMap; +const char* StructureScanComplexItem::jsonComplexItemTypeValue = "StructureScan"; +const char* StructureScanComplexItem::_jsonCameraCalcKey = "CameraCalc"; +const char* StructureScanComplexItem::_jsonAltitudeRelativeKey = "altitudeRelative"; StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyView, QObject* parent) : ComplexMissionItem (vehicle, flyView, parent) + , _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/StructureScan.SettingsGroup.json"), this /* QObject parent */)) , _sequenceNumber (0) , _dirty (false) , _altitudeRelative (true) @@ -41,22 +41,13 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie , _scanDistance (0.0) , _cameraShots (0) , _cameraMinTriggerInterval (0) - , _cameraCalc (vehicle) - , _altitudeFact (0, _altitudeFactName, FactMetaData::valueTypeDouble) - , _layersFact (0, _layersFactName, FactMetaData::valueTypeUint32) + , _cameraCalc (vehicle, settingsGroup) + , _altitudeFact (settingsGroup, _metaDataMap[altitudeName]) + , _structureHeightFact (settingsGroup, _metaDataMap[structureHeightName]) + , _layersFact (settingsGroup, _metaDataMap[layersName]) { _editorQml = "qrc:/qml/StructureScanEditor.qml"; - if (_metaDataMap.isEmpty()) { - _metaDataMap = FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/StructureScan.SettingsGroup.json"), NULL /* QObject parent */); - } - - _altitudeFact.setMetaData (_metaDataMap[_altitudeFactName]); - _layersFact.setMetaData (_metaDataMap[_layersFactName]); - - _altitudeFact.setRawValue (_altitudeFact.rawDefaultValue()); - _layersFact.setRawValue (_layersFact.rawDefaultValue()); - _altitudeFact.setRawValue(qgcApp()->toolbox()->settingsManager()->appSettings()->defaultMissionItemAltitude()->rawValue()); connect(&_altitudeFact, &Fact::valueChanged, this, &StructureScanComplexItem::_setDirty); @@ -143,10 +134,10 @@ void StructureScanComplexItem::save(QJsonArray& missionItems) saveObject[VisualMissionItem::jsonTypeKey] = VisualMissionItem::jsonTypeComplexItemValue; saveObject[ComplexMissionItem::jsonComplexItemTypeKey] = jsonComplexItemTypeValue; - saveObject[_altitudeFactName] = _altitudeFact.rawValue().toDouble(); - saveObject[_structureHeightFactName] = _structureHeightFact.rawValue().toDouble(); - saveObject[_jsonAltitudeRelativeKey] = _altitudeRelative; - saveObject[_layersFactName] = _layersFact.rawValue().toDouble(); + saveObject[altitudeName] = _altitudeFact.rawValue().toDouble(); + saveObject[structureHeightName] = _structureHeightFact.rawValue().toDouble(); + saveObject[_jsonAltitudeRelativeKey] = _altitudeRelative; + saveObject[layersName] = _layersFact.rawValue().toDouble(); QJsonObject cameraCalcObject; _cameraCalc.save(cameraCalcObject); @@ -173,10 +164,10 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen { VisualMissionItem::jsonTypeKey, QJsonValue::String, true }, { ComplexMissionItem::jsonComplexItemTypeKey, QJsonValue::String, true }, { QGCMapPolygon::jsonPolygonKey, QJsonValue::Array, true }, - { _altitudeFactName, QJsonValue::Double, true }, - { _structureHeightFactName, QJsonValue::Double, true }, + { altitudeName, QJsonValue::Double, true }, + { structureHeightName, QJsonValue::Double, true }, { _jsonAltitudeRelativeKey, QJsonValue::Bool, true }, - { _layersFactName, QJsonValue::Double, true }, + { layersName, QJsonValue::Double, true }, { _jsonCameraCalcKey, QJsonValue::Object, true }, }; if (!JsonHelper::validateKeys(complexObject, keyInfoList, errorString)) { @@ -205,8 +196,8 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen return false; } - _altitudeFact.setRawValue (complexObject[_altitudeFactName].toDouble()); - _layersFact.setRawValue (complexObject[_layersFactName].toDouble()); + _altitudeFact.setRawValue (complexObject[altitudeName].toDouble()); + _layersFact.setRawValue (complexObject[layersName].toDouble()); _altitudeRelative = complexObject[_jsonAltitudeRelativeKey].toBool(true); if (!_structurePolygon.loadFromJson(complexObject, true /* required */, errorString)) { diff --git a/src/MissionManager/StructureScanComplexItem.h b/src/MissionManager/StructureScanComplexItem.h index 3577abe0c..d8ce95616 100644 --- a/src/MissionManager/StructureScanComplexItem.h +++ b/src/MissionManager/StructureScanComplexItem.h @@ -92,6 +92,11 @@ public: static const char* jsonComplexItemTypeValue; + static const char* settingsGroup; + static const char* altitudeName; + static const char* structureHeightName; + static const char* layersName; + signals: void cameraShotsChanged (int cameraShots); void timeBetweenShotsChanged (void); @@ -115,6 +120,8 @@ private: void _setCameraShots(int cameraShots); double _triggerDistance(void) const; + QMap _metaDataMap; + int _sequenceNumber; bool _dirty; QGCMapPolygon _structurePolygon; @@ -130,15 +137,10 @@ private: double _cruiseSpeed; CameraCalc _cameraCalc; - static QMap _metaDataMap; - - Fact _altitudeFact; - Fact _structureHeightFact; - Fact _layersFact; - static const char* _altitudeFactName; - static const char* _structureHeightFactName; - static const char* _layersFactName; + SettingsFact _altitudeFact; + SettingsFact _structureHeightFact; + SettingsFact _layersFact; static const char* _jsonCameraCalcKey; static const char* _jsonAltitudeRelativeKey; diff --git a/src/MissionManager/StructureScanComplexItemTest.cc b/src/MissionManager/StructureScanComplexItemTest.cc index 7f7280b33..5efadfcfc 100644 --- a/src/MissionManager/StructureScanComplexItemTest.cc +++ b/src/MissionManager/StructureScanComplexItemTest.cc @@ -92,7 +92,7 @@ void StructureScanComplexItemTest::_initItem(void) mapPolygon->appendVertex(vertex); } - _structureScanItem->cameraCalc()->setCameraName(CameraCalc::manualCameraName()); + _structureScanItem->cameraCalc()->cameraName()->setRawValue(CameraCalc::manualCameraName()); _structureScanItem->layers()->setCookedValue(2); _structureScanItem->setDirty(false); @@ -109,7 +109,7 @@ void StructureScanComplexItemTest::_validateItem(StructureScanComplexItem* item) QCOMPARE(expectedVertex, actualVertex); } - QCOMPARE(_structureScanItem->cameraCalc()->cameraName() , CameraCalc::manualCameraName()); + QVERIFY(_structureScanItem->cameraCalc()->isManualCamera()); QCOMPARE(item->layers()->cookedValue().toInt(), 2); } diff --git a/src/MissionManager/SurveyComplexItem.cc b/src/MissionManager/SurveyComplexItem.cc index 92b3955b4..c4bb728c2 100644 --- a/src/MissionManager/SurveyComplexItem.cc +++ b/src/MissionManager/SurveyComplexItem.cc @@ -257,7 +257,7 @@ bool SurveyComplexItem::_loadV3(const QJsonObject& complexObject, int sequenceNu _cameraCalc.adjustedFootprintFrontal()->setRawValue (complexObject[_jsonV3CameraTriggerDistanceKey].toDouble()); if (manualGrid) { - _cameraCalc.setCameraName(_cameraCalc.manualCameraName()); + _cameraCalc.cameraName()->setRawValue(_cameraCalc.manualCameraName()); } else { if (!complexObject.contains(_jsonV3CameraObjectKey)) { errorString = tr("%1 but %2 object is missing").arg("manualGrid = false").arg("camera"); @@ -292,7 +292,7 @@ bool SurveyComplexItem::_loadV3(const QJsonObject& complexObject, int sequenceNu return false; } - _cameraCalc.setCameraName (cameraObject[_jsonV3CameraNameKey].toString()); + _cameraCalc.cameraName()->setRawValue (cameraObject[_jsonV3CameraNameKey].toString()); _cameraCalc.landscape()->setRawValue (cameraObject[_jsonV3CameraOrientationLandscapeKey].toBool(true)); _cameraCalc.frontalOverlap()->setRawValue (cameraObject[_jsonV3FrontalOverlapKey].toInt()); _cameraCalc.sideOverlap()->setRawValue (cameraObject[_jsonV3SideOverlapKey].toInt()); diff --git a/src/MissionManager/TransectStyleComplexItem.cc b/src/MissionManager/TransectStyleComplexItem.cc index b987ca5b4..3ad1c1baa 100644 --- a/src/MissionManager/TransectStyleComplexItem.cc +++ b/src/MissionManager/TransectStyleComplexItem.cc @@ -40,7 +40,6 @@ const int TransectStyleComplexItem::_terrainQueryTimeoutMsecs = 1000 TransectStyleComplexItem::TransectStyleComplexItem(Vehicle* vehicle, bool flyView, QString settingsGroup, QObject* parent) : ComplexMissionItem (vehicle, flyView, parent) - , _settingsGroup (settingsGroup) , _sequenceNumber (0) , _dirty (false) , _terrainPolyPathQuery (NULL) @@ -48,17 +47,17 @@ TransectStyleComplexItem::TransectStyleComplexItem(Vehicle* vehicle, bool flyVie , _complexDistance (0) , _cameraShots (0) , _cameraMinTriggerInterval (0) - , _cameraCalc (vehicle) + , _cameraCalc (vehicle, settingsGroup) , _followTerrain (false) , _loadedMissionItemsParent (NULL) , _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/TransectStyle.SettingsGroup.json"), this)) - , _turnAroundDistanceFact (_settingsGroup, _metaDataMap[_vehicle->multiRotor() ? turnAroundDistanceMultiRotorName : turnAroundDistanceName]) - , _cameraTriggerInTurnAroundFact (_settingsGroup, _metaDataMap[cameraTriggerInTurnAroundName]) - , _hoverAndCaptureFact (_settingsGroup, _metaDataMap[hoverAndCaptureName]) - , _refly90DegreesFact (_settingsGroup, _metaDataMap[refly90DegreesName]) - , _terrainAdjustToleranceFact (_settingsGroup, _metaDataMap[terrainAdjustToleranceName]) - , _terrainAdjustMaxClimbRateFact (_settingsGroup, _metaDataMap[terrainAdjustMaxClimbRateName]) - , _terrainAdjustMaxDescentRateFact (_settingsGroup, _metaDataMap[terrainAdjustMaxDescentRateName]) + , _turnAroundDistanceFact (settingsGroup, _metaDataMap[_vehicle->multiRotor() ? turnAroundDistanceMultiRotorName : turnAroundDistanceName]) + , _cameraTriggerInTurnAroundFact (settingsGroup, _metaDataMap[cameraTriggerInTurnAroundName]) + , _hoverAndCaptureFact (settingsGroup, _metaDataMap[hoverAndCaptureName]) + , _refly90DegreesFact (settingsGroup, _metaDataMap[refly90DegreesName]) + , _terrainAdjustToleranceFact (settingsGroup, _metaDataMap[terrainAdjustToleranceName]) + , _terrainAdjustMaxClimbRateFact (settingsGroup, _metaDataMap[terrainAdjustMaxClimbRateName]) + , _terrainAdjustMaxDescentRateFact (settingsGroup, _metaDataMap[terrainAdjustMaxDescentRateName]) { _terrainQueryTimer.setInterval(_terrainQueryTimeoutMsecs); _terrainQueryTimer.setSingleShot(true); diff --git a/src/MissionManager/TransectStyleComplexItem.h b/src/MissionManager/TransectStyleComplexItem.h index 0b5bbf8f4..5f3eb343d 100644 --- a/src/MissionManager/TransectStyleComplexItem.h +++ b/src/MissionManager/TransectStyleComplexItem.h @@ -143,7 +143,6 @@ protected: bool _hasTurnaround (void) const; double _turnaroundDistance (void) const; - QString _settingsGroup; int _sequenceNumber; bool _dirty; QGeoCoordinate _coordinate; diff --git a/src/PlanView/CameraCalc.qml b/src/PlanView/CameraCalc.qml index 6f0d33e45..f6ef5feb1 100644 --- a/src/PlanView/CameraCalc.qml +++ b/src/PlanView/CameraCalc.qml @@ -38,11 +38,11 @@ Column { _cameraList.push(_vehicle.staticCameraList[i].name) } gridTypeCombo.model = _cameraList - var knownCameraIndex = gridTypeCombo.find(cameraCalc.cameraName) + var knownCameraIndex = gridTypeCombo.find(cameraCalc.cameraName.value) if (knownCameraIndex !== -1) { gridTypeCombo.currentIndex = knownCameraIndex } else { - console.log("Internal error: Known camera not found", cameraCalc.cameraName) + console.log("Internal error: Known camera not found", cameraCalc.cameraName.value) gridTypeCombo.currentIndex = _gridTypeCustomCamera } } @@ -73,7 +73,7 @@ Column { anchors.right: parent.right model: _cameraList currentIndex: -1 - onActivated: cameraCalc.cameraName = gridTypeCombo.textAt(index) + onActivated: cameraCalc.cameraName.value = gridTypeCombo.textAt(index) } // QGCComboxBox // Camera based grid ui @@ -81,7 +81,7 @@ Column { anchors.left: parent.left anchors.right: parent.right spacing: _margin - visible: cameraCalc.cameraName !== cameraCalc.manualCameraName + visible: !cameraCalc.isManualCamera Row { spacing: _margin @@ -111,7 +111,7 @@ Column { anchors.left: parent.left anchors.right: parent.right spacing: _margin - visible: cameraCalc.cameraName === cameraCalc.customCameraName + visible: cameraCalc.isCustomCamera RowLayout { anchors.left: parent.left @@ -282,7 +282,7 @@ Column { columnSpacing: _margin rowSpacing: _margin columns: 2 - visible: cameraCalc.cameraName === cameraCalc.manualCameraName + visible: cameraCalc.isManualCamera QGCLabel { text: distanceToSurfaceLabel } FactTextField { -- 2.22.0