diff --git a/src/MissionManager/CameraCalc.cc b/src/MissionManager/CameraCalc.cc index 7e0d651570dab479d2db816123be6c460e7af034..ef08fd61abce9d964c51504883187d693f9d0001 100644 --- a/src/MissionManager/CameraCalc.cc +++ b/src/MissionManager/CameraCalc.cc @@ -21,14 +21,14 @@ 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::_jsonCameraSpecTypeKey = "CameraSpecType"; -const char* CameraCalc::_jsonKnownCameraNameKey = "CameraName"; CameraCalc::CameraCalc(Vehicle* vehicle, QObject* parent) : CameraSpec (parent) , _vehicle (vehicle) , _dirty (false) - , _cameraSpecType (CameraSpecNone) + , _cameraName (manualCameraName()) , _disableRecalc (false) , _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/CameraCalc.FactMetaData.json"), this)) , _valueSetIsDistanceFact (0, _valueSetIsDistanceName, FactMetaData::valueTypeBool) @@ -52,9 +52,7 @@ CameraCalc::CameraCalc(Vehicle* vehicle, QObject* parent) _adjustedFootprintSideFact.setMetaData (_metaDataMap[_adjustedFootprintSideName], true); _adjustedFootprintFrontalFact.setMetaData (_metaDataMap[_adjustedFootprintFrontalName], true); - connect(this, &CameraCalc::knownCameraNameChanged, this, &CameraCalc::_knownCameraNameChanged); - - connect(this, &CameraCalc::cameraSpecTypeChanged, this, &CameraCalc::_recalcTriggerDistance); + connect(this, &CameraCalc::cameraNameChanged, this, &CameraCalc::_recalcTriggerDistance); connect(&_distanceToSurfaceFact, &Fact::rawValueChanged, this, &CameraCalc::_recalcTriggerDistance); connect(&_imageDensityFact, &Fact::rawValueChanged, this, &CameraCalc::_recalcTriggerDistance); @@ -73,59 +71,57 @@ void CameraCalc::setDirty(bool dirty) } } -void CameraCalc::setCameraSpecType(CameraSpecType cameraSpecType) -{ - if (cameraSpecType != _cameraSpecType) { - _cameraSpecType = cameraSpecType; - emit cameraSpecTypeChanged(_cameraSpecType); - } -} - -void CameraCalc::setKnownCameraName(QString knownCameraName) -{ - if (knownCameraName != _knownCameraName) { - _knownCameraName = knownCameraName; - emit knownCameraNameChanged(_knownCameraName); - } -} - -void CameraCalc::_knownCameraNameChanged(QString knownCameraName) +void CameraCalc::setCameraName(QString cameraName) { - if (_cameraSpecType == CameraSpecKnown) { - CameraMetaData* cameraMetaData = NULL; - - // Update camera specs to new camera - for (int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) { - cameraMetaData = _knownCameraList[cameraIndex].value(); - if (knownCameraName == cameraMetaData->name()) { - break; + if (cameraName != _cameraName) { + _cameraName = cameraName; + + if (_cameraName == manualCameraName() || _cameraName == customCameraName()) { + // These values are unknown for these types + fixedOrientation()->setRawValue(false); + minTriggerInterval()->setRawValue(0); + if (_cameraName == manualCameraName()) { + valueSetIsDistance()->setRawValue(false); } - } - - _disableRecalc = true; - if (cameraMetaData) { - 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 - _cameraSpecType = CameraSpecCustom; - emit cameraSpecTypeChanged(_cameraSpecType); + // 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; } - _disableRecalc = false; - _recalcTriggerDistance(); + emit cameraNameChanged(_cameraName); } } void CameraCalc::_recalcTriggerDistance(void) { - if (_disableRecalc || _cameraSpecType == CameraSpecNone) { + if (_disableRecalc || _cameraName == manualCameraName()) { return; } @@ -168,14 +164,14 @@ void CameraCalc::_recalcTriggerDistance(void) void CameraCalc::save(QJsonObject& json) const { - json[_jsonCameraSpecTypeKey] = (int)_cameraSpecType; + json[JsonHelper::jsonVersionKey] = 1; json[_adjustedFootprintSideName] = _adjustedFootprintSideFact.rawValue().toDouble(); json[_adjustedFootprintFrontalName] = _adjustedFootprintFrontalFact.rawValue().toDouble(); json[_distanceToSurfaceName] = _distanceToSurfaceFact.rawValue().toDouble(); + json[_jsonCameraNameKey] = _cameraName; - if (_cameraSpecType != CameraSpecNone) { + if (_cameraName != manualCameraName()) { CameraSpec::save(json); - json[_jsonKnownCameraNameKey] = _knownCameraName; json[_valueSetIsDistanceName] = _valueSetIsDistanceFact.rawValue().toBool(); json[_imageDensityName] = _imageDensityFact.rawValue().toDouble(); json[_frontalOverlapName] = _frontalOverlapFact.rawValue().toDouble(); @@ -184,55 +180,65 @@ void CameraCalc::save(QJsonObject& json) const } bool CameraCalc::load(const QJsonObject& json, QString& errorString) -{ +{ + QJsonObject v1Json = json; + + if (!v1Json.contains(JsonHelper::jsonVersionKey)) { + // Version 0 file. Differences from Version 1 for conversion: + // JsonHelper::jsonVersionKey not stored + // _jsonCameraSpecTypeKey stores CameraSpecType + // _jsonCameraNameKey only set if CameraSpecKnown + int cameraSpec = v1Json[_jsonCameraSpecTypeKey].toInt(CameraSpecNone); + if (cameraSpec == CameraSpecCustom) { + v1Json[_jsonCameraNameKey] = customCameraName(); + } else if (cameraSpec == CameraSpecNone) { + v1Json[_jsonCameraNameKey] = manualCameraName(); + } + v1Json.remove(_jsonCameraSpecTypeKey); + v1Json[JsonHelper::jsonVersionKey] = 1; + } + + int version = v1Json[JsonHelper::jsonVersionKey].toInt(); + if (version != 1) { + errorString = tr("CameraCalc section version %1 not supported").arg(version); + return false; + } + QList keyInfoList1 = { - { _jsonCameraSpecTypeKey, QJsonValue::Double, true }, + { _jsonCameraNameKey, QJsonValue::String, true }, { _adjustedFootprintSideName, QJsonValue::Double, true }, { _adjustedFootprintFrontalName, QJsonValue::Double, true }, { _distanceToSurfaceName, QJsonValue::Double, true }, }; - if (!JsonHelper::validateKeys(json, keyInfoList1, errorString)) { - return false; - } - - int cameraSpecType = json[_jsonCameraSpecTypeKey].toInt(); - switch (cameraSpecType) { - case CameraSpecNone: - case CameraSpecCustom: - case CameraSpecKnown: - break; - default: - errorString = tr("Unsupported CameraSpecType %d").arg(cameraSpecType); + if (!JsonHelper::validateKeys(v1Json, keyInfoList1, errorString)) { return false; } _disableRecalc = true; - setCameraSpecType((CameraSpecType)cameraSpecType); - _adjustedFootprintSideFact.setRawValue (json[_adjustedFootprintSideName].toDouble()); - _adjustedFootprintFrontalFact.setRawValue (json[_adjustedFootprintFrontalName].toDouble()); - _distanceToSurfaceFact.setRawValue (json[_distanceToSurfaceName].toDouble()); + setCameraName(v1Json[_jsonCameraNameKey].toString()); + _adjustedFootprintSideFact.setRawValue (v1Json[_adjustedFootprintSideName].toDouble()); + _adjustedFootprintFrontalFact.setRawValue (v1Json[_adjustedFootprintFrontalName].toDouble()); + _distanceToSurfaceFact.setRawValue (v1Json[_distanceToSurfaceName].toDouble()); - if (_cameraSpecType != CameraSpecNone) { + if (_cameraName != manualCameraName()) { QList keyInfoList2 = { - { _jsonKnownCameraNameKey, QJsonValue::String, true }, { _valueSetIsDistanceName, QJsonValue::Bool, true }, { _imageDensityName, QJsonValue::Double, true }, { _frontalOverlapName, QJsonValue::Double, true }, { _sideOverlapName, QJsonValue::Double, true }, }; - if (!JsonHelper::validateKeys(json, keyInfoList2, errorString)) { + if (!JsonHelper::validateKeys(v1Json, keyInfoList2, errorString)) { return false; _disableRecalc = false; } - setKnownCameraName(json[_jsonKnownCameraNameKey].toString()); - _valueSetIsDistanceFact.setRawValue (json[_valueSetIsDistanceName].toBool()); - _imageDensityFact.setRawValue (json[_imageDensityName].toDouble()); - _frontalOverlapFact.setRawValue (json[_frontalOverlapName].toDouble()); - _sideOverlapFact.setRawValue (json[_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(json, errorString)) { + if (!CameraSpec::load(v1Json, errorString)) { return false; } } @@ -241,3 +247,13 @@ bool CameraCalc::load(const QJsonObject& json, QString& errorString) return true; } + +QString CameraCalc::customCameraName(void) +{ + return tr("Custom Camera"); +} + +QString CameraCalc::manualCameraName(void) +{ + return tr("Manual (no camera specs)"); +} diff --git a/src/MissionManager/CameraCalc.h b/src/MissionManager/CameraCalc.h index be714a1eb1c20ecdaf713a3ea39a22d052ca5670..071d6eb28892682857994d770cb59ca1f8562fb4 100644 --- a/src/MissionManager/CameraCalc.h +++ b/src/MissionManager/CameraCalc.h @@ -20,32 +20,25 @@ class CameraCalc : public CameraSpec public: CameraCalc(Vehicle* vehicle, QObject* parent = NULL); - Q_ENUMS(CameraSpecType) - - Q_PROPERTY(CameraSpecType cameraSpecType READ cameraSpecType WRITE setCameraSpecType NOTIFY cameraSpecTypeChanged) - Q_PROPERTY(QString knownCameraName READ knownCameraName WRITE setKnownCameraName NOTIFY knownCameraNameChanged) - 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) - Q_PROPERTY(Fact* frontalOverlap READ frontalOverlap CONSTANT) - Q_PROPERTY(Fact* sideOverlap READ sideOverlap CONSTANT) - Q_PROPERTY(Fact* adjustedFootprintSide READ adjustedFootprintSide CONSTANT) ///< Side footprint adjusted down for overlap - Q_PROPERTY(Fact* adjustedFootprintFrontal READ adjustedFootprintFrontal CONSTANT) ///< Frontal footprint adjusted down for overlap + 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(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) + Q_PROPERTY(Fact* frontalOverlap READ frontalOverlap CONSTANT) + Q_PROPERTY(Fact* sideOverlap READ sideOverlap CONSTANT) + Q_PROPERTY(Fact* adjustedFootprintSide READ adjustedFootprintSide CONSTANT) ///< Side footprint adjusted down for overlap + Q_PROPERTY(Fact* adjustedFootprintFrontal READ adjustedFootprintFrontal CONSTANT) ///< Frontal footprint adjusted down for overlap // The following values are calculated from the camera properties - Q_PROPERTY(double imageFootprintSide READ imageFootprintSide NOTIFY imageFootprintSideChanged) ///< Size of image size side in meters - Q_PROPERTY(double imageFootprintFrontal READ imageFootprintFrontal NOTIFY imageFootprintFrontalChanged) ///< Size of image size frontal in meters + Q_PROPERTY(double imageFootprintSide READ imageFootprintSide NOTIFY imageFootprintSideChanged) ///< Size of image size side in meters + Q_PROPERTY(double imageFootprintFrontal READ imageFootprintFrontal NOTIFY imageFootprintFrontalChanged) ///< Size of image size frontal in meters - enum CameraSpecType { - CameraSpecNone, - CameraSpecCustom, - CameraSpecKnown - }; - - CameraSpecType cameraSpecType(void) const { return _cameraSpecType; } - QString knownCameraName(void) const { return _knownCameraName; } - void setCameraSpecType(CameraSpecType cameraSpecType); - void setKnownCameraName(QString knownCameraName); + static QString customCameraName(void); + static QString manualCameraName(void); + QString cameraName(void) const { return _cameraName; } + void setCameraName(QString cameraName); Fact* valueSetIsDistance (void) { return &_valueSetIsDistanceFact; } Fact* distanceToSurface (void) { return &_distanceToSurfaceFact; } @@ -65,21 +58,18 @@ public: bool load(const QJsonObject& json, QString& errorString); signals: - void cameraSpecTypeChanged (CameraSpecType cameraSpecType); - void knownCameraNameChanged (QString knownCameraName); + void cameraNameChanged (QString cameraName); void dirtyChanged (bool dirty); void imageFootprintSideChanged (double imageFootprintSide); void imageFootprintFrontalChanged (double imageFootprintFrontal); private slots: - void _knownCameraNameChanged(QString knownCameraName); void _recalcTriggerDistance(void); private: Vehicle* _vehicle; bool _dirty; - CameraSpecType _cameraSpecType; - QString _knownCameraName; + QString _cameraName; bool _disableRecalc; QMap _metaDataMap; @@ -104,6 +94,15 @@ private: 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 { + CameraSpecNone, + CameraSpecCustom, + CameraSpecKnown + }; + static const char* _jsonCameraSpecTypeKey; - static const char* _jsonKnownCameraNameKey; }; diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 80e61ca43f47573648ac7ada5863904f960e613b..89eecafda2300165c0889d72adb6c34ceee72448 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -125,7 +125,7 @@ public: bool loadTextFile(QFile& file, QString& errorString); // Overrides from PlanElementController - bool supported (void) const final { return true; }; + bool supported (void) const final { return true; } void start (bool editMode) final; void save (QJsonObject& json) final; bool load (const QJsonObject& json, QString& errorString) final; diff --git a/src/MissionManager/PlanMasterController.cc b/src/MissionManager/PlanMasterController.cc index ca5bfe040d9a68579edc295b83d0a48a527978b4..a2041f935c4c1268df122af79f6a5739b66d3506 100644 --- a/src/MissionManager/PlanMasterController.cc +++ b/src/MissionManager/PlanMasterController.cc @@ -273,7 +273,7 @@ void PlanMasterController::sendToVehicle(void) void PlanMasterController::loadFromFile(const QString& filename) { QString errorString; - QString errorMessage = tr("Error reading Plan file (%1). %2").arg(filename).arg("%1"); + QString errorMessage = tr("Error loading Plan file (%1). %2").arg(filename).arg("%1"); if (filename.isEmpty()) { return; diff --git a/src/MissionManager/QGCMapPolygonVisuals.qml b/src/MissionManager/QGCMapPolygonVisuals.qml index 733a8202535a665bafd3eba293ebccc3f3318c95..daf0ad72e23f038b2fa0c5889fcf98ebee1b1a0c 100644 --- a/src/MissionManager/QGCMapPolygonVisuals.qml +++ b/src/MissionManager/QGCMapPolygonVisuals.qml @@ -148,10 +148,6 @@ Item { setCircleRadius(center, radius) } - function loadKMLFile() { - mapPolygon.loadKMLFile("/Users/Don/Downloads/polygon.kml") - } - onInteractiveChanged: { if (interactive) { addHandles() @@ -418,7 +414,7 @@ Item { MenuItem { text: qsTr("Set radius..." ) - enabled: _circle + visible: _circle onTriggered: radiusDialog.visible = true } diff --git a/src/MissionManager/StructureScanComplexItem.cc b/src/MissionManager/StructureScanComplexItem.cc index 1258979b3de31618fa2f1d26436bff0a5dcdc72b..a51befe63852e761d330cf83cada4b7d415ee2ad 100644 --- a/src/MissionManager/StructureScanComplexItem.cc +++ b/src/MissionManager/StructureScanComplexItem.cc @@ -87,7 +87,7 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, QObject* pa connect(&_flightPolygon, &QGCMapPolygon::pathChanged, this, &StructureScanComplexItem::_flightPathChanged); connect(_cameraCalc.distanceToSurface(), &Fact::valueChanged, this, &StructureScanComplexItem::_rebuildFlightPolygon); - connect(&_cameraCalc, &CameraCalc::cameraSpecTypeChanged, this, &StructureScanComplexItem::_cameraSpecTypeChanged); + connect(&_cameraCalc, &CameraCalc::cameraNameChanged, this, &StructureScanComplexItem::_resetGimbal); connect(&_flightPolygon, &QGCMapPolygon::pathChanged, this, &StructureScanComplexItem::_recalcCameraShots); connect(_cameraCalc.adjustedFootprintSide(), &Fact::valueChanged, this, &StructureScanComplexItem::_recalcCameraShots); @@ -205,12 +205,17 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen int version = complexObject[JsonHelper::jsonVersionKey].toInt(); if (version != 1) { - errorString = tr("Version %1 not supported").arg(version); + errorString = tr("%1 complex item version %2 not supported").arg(jsonComplexItemTypeValue).arg(version); return false; } setSequenceNumber(sequenceNumber); + // Load CameraCalc first since it will trigger camera name change which will trounce gimbal angles + if (!_cameraCalc.load(complexObject[_jsonCameraCalcKey].toObject(), errorString)) { + return false; + } + _gimbalPitchFact.setRawValue(complexObject[_gimbalPitchFactName].toDouble()); _gimbalYawFact.setRawValue (complexObject[_gimbalYawFactName].toDouble()); _altitudeFact.setRawValue (complexObject[_altitudeFactName].toDouble()); @@ -218,9 +223,6 @@ bool StructureScanComplexItem::load(const QJsonObject& complexObject, int sequen _altitudeRelative = complexObject[_jsonAltitudeRelativeKey].toBool(true); _yawVehicleToStructure = complexObject[_jsonYawVehicleToStructureKey].toBool(true); - if (!_cameraCalc.load(complexObject[_jsonCameraCalcKey].toObject(), errorString)) { - return false; - } if (!_structurePolygon.loadFromJson(complexObject, true /* required */, errorString)) { _structurePolygon.clear(); return false; @@ -455,10 +457,8 @@ void StructureScanComplexItem::_recalcCameraShots(void) _setCameraShots(cameraShots * _layersFact.rawValue().toInt()); } -void StructureScanComplexItem::_cameraSpecTypeChanged(CameraCalc::CameraSpecType cameraSpecType) +void StructureScanComplexItem::_resetGimbal(void) { - Q_UNUSED(cameraSpecType); - _gimbalPitchFact.setCookedValue(0); _gimbalYawFact.setCookedValue(90); } diff --git a/src/MissionManager/StructureScanComplexItem.h b/src/MissionManager/StructureScanComplexItem.h index cebfa9a403824419faafaadf047d600d333c1513..879da223ac4e040d04c5d36b9ab0f15396335da2 100644 --- a/src/MissionManager/StructureScanComplexItem.h +++ b/src/MissionManager/StructureScanComplexItem.h @@ -113,7 +113,7 @@ private slots: void _updateCoordinateAltitudes (void); void _rebuildFlightPolygon (void); void _recalcCameraShots (void); - void _cameraSpecTypeChanged (CameraCalc::CameraSpecType cameraSpecType); + void _resetGimbal (void); private: void _setExitCoordinate(const QGeoCoordinate& coordinate); diff --git a/src/MissionManager/StructureScanComplexItemTest.cc b/src/MissionManager/StructureScanComplexItemTest.cc index f4d1a2c9e2310e668b5d386637f83f136d7c4f4d..1acd2c67ea9a3f5b2c24d001e84a00efca26ccfe 100644 --- a/src/MissionManager/StructureScanComplexItemTest.cc +++ b/src/MissionManager/StructureScanComplexItemTest.cc @@ -99,7 +99,7 @@ void StructureScanComplexItemTest::_initItem(void) mapPolygon->appendVertex(vertex); } - _structureScanItem->cameraCalc()->setCameraSpecType(CameraCalc::CameraSpecNone); + _structureScanItem->cameraCalc()->setCameraName(CameraCalc::manualCameraName()); _structureScanItem->gimbalPitch()->setCookedValue(45); _structureScanItem->gimbalYaw()->setCookedValue(45); _structureScanItem->layers()->setCookedValue(2); @@ -118,7 +118,7 @@ void StructureScanComplexItemTest::_validateItem(StructureScanComplexItem* item) QCOMPARE(expectedVertex, actualVertex); } - QCOMPARE((int)item->cameraCalc()->cameraSpecType(), (int)CameraCalc::CameraSpecNone); + QCOMPARE(_structureScanItem->cameraCalc()->cameraName() , CameraCalc::manualCameraName()); QCOMPARE(item->gimbalPitch()->cookedValue().toDouble(), 45.0); QCOMPARE(item->gimbalYaw()->cookedValue().toDouble(), 45.0); QCOMPARE(item->layers()->cookedValue().toInt(), 2); @@ -144,8 +144,8 @@ void StructureScanComplexItemTest::_testGimbalAngleUpdate(void) // This sets the item to CameraCalc::CameraSpecNone and non-standard gimbal angles _initItem(); - // Switching to a camera specific setup should set gimbal angles to defaults surface scan - _structureScanItem->cameraCalc()->setCameraSpecType(CameraCalc::CameraSpecCustom); + // Switching to a camera specific setup should set gimbal angles to defaults + _structureScanItem->cameraCalc()->setCameraName(CameraCalc::customCameraName()); QCOMPARE(_structureScanItem->gimbalPitch()->cookedValue().toDouble(), 0.0); QCOMPARE(_structureScanItem->gimbalYaw()->cookedValue().toDouble(), 90.0); } diff --git a/src/PlanView/CameraCalc.qml b/src/PlanView/CameraCalc.qml index 7e51f211a519cd81f09692a8cc92ae971dc35004..dd55be3cc66cba9017ec812e1b635d94edcb2411 100644 --- a/src/PlanView/CameraCalc.qml +++ b/src/PlanView/CameraCalc.qml @@ -23,7 +23,7 @@ Column { property real _margin: ScreenTools.defaultFontPixelWidth / 2 property int _cameraIndex: 1 property real _fieldWidth: ScreenTools.defaultFontPixelWidth * 10.5 - property var _cameraList: [ qsTr("Manual (no camera specs)"), qsTr("Custom Camera") ] + property var _cameraList: [ ] property var _vehicle: QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle : QGroundControl.multiVehicleManager.offlineEditingVehicle property var _vehicleCameraList: _vehicle ? _vehicle.staticCameraList : [] @@ -32,31 +32,18 @@ Column { readonly property int _gridTypeCamera: 2 Component.onCompleted: { + _cameraList.push(cameraCalc.manualCameraName) + _cameraList.push(cameraCalc.customCameraName) for (var i=0; i<_vehicle.staticCameraList.length; i++) { _cameraList.push(_vehicle.staticCameraList[i].name) } gridTypeCombo.model = _cameraList - if (cameraCalc.cameraSpecType === CameraCalc.CameraSpecNone) { - gridTypeCombo.currentIndex = _gridTypeManual + var knownCameraIndex = gridTypeCombo.find(cameraCalc.cameraName) + if (knownCameraIndex != -1) { + gridTypeCombo.currentIndex = knownCameraIndex } else { - var index = -1 - for (index=0; index<_cameraList.length; index++) { - if (_cameraList[index] == cameraCalc.knownCameraName) { - break; - } - } - cameraCalc.fixedOrientation.value = false - if (index == _cameraList.length) { - gridTypeCombo.currentIndex = _gridTypeCustomCamera - } else { - gridTypeCombo.currentIndex = index - if (index != 1) { - // Specific camera is selected - var camera = _vehicleCameraList[index - _gridTypeCamera] - cameraCalc.fixedOrientation.value = camera.fixedOrientation - cameraCalc.minTriggerInterval.value = camera.minTriggerInterval - } - } + console.log("Internal error: Known camera not found", cameraCalc.cameraName) + gridTypeCombo.currentIndex = _gridTypeCustomCamera } } @@ -86,21 +73,7 @@ Column { anchors.right: parent.right model: _cameraList currentIndex: -1 - - onActivated: { - if (index == _gridTypeManual) { - cameraCalc.cameraSpecType = CameraCalc.CameraSpecNone - cameraCalc.valueSetIsDistance.value = false - } else if (index == _gridTypeCustomCamera) { - cameraCalc.cameraSpecType = CameraCalc.CameraSpecCustom - cameraCalc.knownCameraName = gridTypeCombo.textAt(index) - cameraCalc.fixedOrientation.value = false - cameraCalc.minTriggerInterval.value = 0 - } else { - cameraCalc.cameraSpecType = CameraCalc.CameraSpecKnown - cameraCalc.knownCameraName = gridTypeCombo.textAt(index) - } - } + onActivated: cameraCalc.cameraName = gridTypeCombo.textAt(index) } // QGCComboxBox // Camera based grid ui @@ -108,7 +81,7 @@ Column { anchors.left: parent.left anchors.right: parent.right spacing: _margin - visible: cameraCalc.cameraSpecType !== CameraCalc.CameraSpecNone + visible: cameraCalc.cameraName !== cameraCalc.manualCameraName Row { spacing: _margin @@ -138,7 +111,7 @@ Column { anchors.left: parent.left anchors.right: parent.right spacing: _margin - visible: cameraCalc.cameraSpecType === CameraCalc.CameraSpecCustom + visible: cameraCalc.cameraName === cameraCalc.customCameraName RowLayout { anchors.left: parent.left @@ -306,7 +279,7 @@ Column { columnSpacing: _margin rowSpacing: _margin columns: 2 - visible: cameraCalc.cameraSpecType === CameraCalc.CameraSpecNone + visible: cameraCalc.cameraName === cameraCalc.manualCameraName QGCLabel { text: distanceToSurfaceLabel } FactTextField { diff --git a/src/PlanView/StructureScanEditor.qml b/src/PlanView/StructureScanEditor.qml index 52fb2c9860f41a73232e84e3fd4505280c03695f..d9c8c89029ac8a03c35ba047ffe57a269e607d75 100644 --- a/src/PlanView/StructureScanEditor.qml +++ b/src/PlanView/StructureScanEditor.qml @@ -92,7 +92,7 @@ Rectangle { columnSpacing: ScreenTools.defaultFontPixelWidth / 2 rowSpacing: 0 columns: 3 - enabled: missionItem.cameraCalc.cameraSpecType === CameraCalc.CameraSpecNone + enabled: missionItem.cameraCalc.cameraName === missionItem.cameraCalc.manualCameraName Item { width: 1; height: 1 } QGCLabel { text: qsTr("Pitch") }