7#include <QtQml/QQmlEngine>
11 , _distanceMode (masterController->missionController()->globalAltitudeFrameDefault())
12 , _knownCameraList (masterController->controllerVehicle()->staticCameraList())
13 , _metaDataMap (
FactMetaData::createMapFromJsonFile(QStringLiteral(
":/json/CameraCalc.FactMetaData.json"), this))
14 , _cameraNameFact (settingsGroup, _metaDataMap[cameraNameName])
15 , _valueSetIsDistanceFact (settingsGroup, _metaDataMap[valueSetIsDistanceName])
16 , _distanceToSurfaceFact (settingsGroup, _metaDataMap[distanceToSurfaceName])
17 , _imageDensityFact (settingsGroup, _metaDataMap[imageDensityName])
18 , _frontalOverlapFact (settingsGroup, _metaDataMap[frontalOverlapName])
19 , _sideOverlapFact (settingsGroup, _metaDataMap[sideOverlapName])
20 , _adjustedFootprintSideFact (settingsGroup, _metaDataMap[adjustedFootprintSideName])
21 , _adjustedFootprintFrontalFact (settingsGroup, _metaDataMap[adjustedFootprintFrontalName])
23 QQmlEngine::setObjectOwnership(
this, QQmlEngine::CppOwnership);
30 connect(&_adjustedFootprintSideFact, &
Fact::valueChanged,
this, &CameraCalc::_setDirty);
31 connect(&_adjustedFootprintFrontalFact, &
Fact::valueChanged,
this, &CameraCalc::_setDirty);
53 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
55 if (!_cameraBrandList.contains(cameraMetaData->
brand)) {
56 _cameraBrandList.append(cameraMetaData->
brand);
61 _setBrandModelFromCanonicalName(_cameraNameFact.
rawValue().toString());
66void CameraCalc::_cameraNameChanged(
void)
72 QString cameraName = _cameraNameFact.
rawValue().toString();
83 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
86 knownCameraMetaData = cameraMetaData;
91 if (!knownCameraMetaData) {
98 _disableRecalc =
true;
109 _disableRecalc =
false;
112 _recalcTriggerDistance();
119void CameraCalc::_recalcTriggerDistance(
void)
125 _disableRecalc =
true;
138 if (_valueSetIsDistanceFact.
rawValue().toBool()) {
153 _adjustedFootprintSideFact.
setRawValue (_imageFootprintSide * ((100.0 - _sideOverlapFact.
rawValue().toDouble()) / 100.0));
154 _adjustedFootprintFrontalFact.
setRawValue (_imageFootprintFrontal * ((100.0 - _frontalOverlapFact.
rawValue().toDouble()) / 100.0));
159 _disableRecalc =
false;
182 QJsonObject json = originalJson;
194 int cameraSpec = json[_jsonCameraSpecTypeKeyDeprecated].toInt(CameraSpecNone);
195 if (cameraSpec == CameraSpecCustom) {
197 }
else if (cameraSpec == CameraSpecNone) {
200 json.remove(_jsonCameraSpecTypeKeyDeprecated);
207 if (deprecatedFollowTerrain) {
212 json.remove(_jsonDistanceToSurfaceRelativeKeyDeprecated);
216 errorString = tr(
"CameraCalc section version %1 not supported").arg(version);
220 QList<JsonParsing::KeyValidateInfo> keyInfoList1 = {
231 _disableRecalc = !forPresets;
235 QString canonicalCameraName = _validCanonicalCameraName(json[
cameraNameName].toString());
245 QList<JsonParsing::KeyValidateInfo> keyInfoList2 = {
252 _disableRecalc =
false;
262 _disableRecalc =
false;
267 _disableRecalc =
false;
269 _setBrandModelFromCanonicalName(canonicalCameraName);
277 return "Custom Camera";
283 return "Manual (no camera specs)";
288 return tr(
"Custom Camera");
293 return tr(
"Manual (no camera specs)");
298 if (altFrame != _distanceMode) {
299 _distanceMode = altFrame;
304void CameraCalc::_setDirty(
void)
313 if (cameraBrand != _cameraBrand) {
314 QString newCameraName = cameraBrand;
316 _cameraBrand = cameraBrand;
317 _cameraModel.clear();
321 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
322 firstCameraMetaData = _knownCameraList[cameraIndex].value<
CameraMetaData*>();
323 if (firstCameraMetaData->
brand == _cameraBrand) {
328 _cameraModel = firstCameraMetaData->
model;
333 _rebuildCameraModelList();
341 if (cameraModel != _cameraModel) {
342 _cameraModel = cameraModel;
345 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
347 if (cameraMetaData->
brand == _cameraBrand && cameraMetaData->
model == _cameraModel) {
356void CameraCalc::_setBrandModelFromCanonicalName(
const QString& cameraName)
358 _cameraBrand = cameraName;
359 _cameraModel.clear();
360 _cameraModelList.clear();
363 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
366 _cameraBrand = cameraMetaData->
brand;
367 _cameraModel = cameraMetaData->
model;
375 _rebuildCameraModelList();
378void CameraCalc::_rebuildCameraModelList(
void)
380 _cameraModelList.clear();
382 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
384 if (cameraMetaData->
brand == _cameraBrand) {
385 _cameraModelList.append(cameraMetaData->
model);
395 _disableRecalc =
true;
396 QString canonicalCameraName = _validCanonicalCameraName(cameraName);
398 _disableRecalc =
true;
400 _setBrandModelFromCanonicalName(canonicalCameraName);
403QString CameraCalc::_validCanonicalCameraName(
const QString& cameraName)
405 QString canonicalCameraName = cameraName;
414 for (
int cameraIndex=0; cameraIndex<_knownCameraList.count(); cameraIndex++) {
425 return canonicalCameraName;
static constexpr const char * distanceModeName
static QString xlatManualCameraName(void)
void save(QJsonObject &json) const
void _setCameraNameFromV3TransectLoad(const QString &cameraName)
static constexpr const char * sideOverlapName
void cameraModelListChanged(void)
void setDistanceMode(QGroundControlQmlGlobal::AltitudeFrame altFrame)
Fact * imageDensity(void)
CameraCalc(PlanMasterController *masterController, const QString &settingsGroup, QObject *parent=nullptr)
static constexpr const char * frontalOverlapName
static constexpr const char * adjustedFootprintFrontalName
bool isCustomCamera(void) const
bool isManualCamera(void) const
void imageFootprintSideChanged(double imageFootprintSide)
static constexpr const char * adjustedFootprintSideName
static constexpr const char * valueSetIsDistanceName
void cameraBrandChanged(void)
static constexpr const char * cameraNameName
void isCustomCameraChanged(void)
void distanceModeChanged(int altFrame)
bool load(const QJsonObject &json, bool deprecatedFollowTerrain, QString &errorString, bool forPresets)
QGroundControlQmlGlobal::AltitudeFrame distanceMode(void) const
static QString canonicalCustomCameraName(void)
void setCameraBrand(const QString &cameraBrand)
static constexpr const char * distanceToSurfaceName
static constexpr const char * imageDensityName
void isManualCameraChanged(void)
Fact * valueSetIsDistance(void)
void cameraModelChanged(void)
void imageFootprintFrontalChanged(double imageFootprintFrontal)
static QString xlatCustomCameraName(void)
< Size of image size frontal in meters
void setCameraModel(const QString &cameraModel)
static QString canonicalManualCameraName(void)
SettingsFact * minTriggerInterval(void)
SettingsFact * imageHeight(void)
SettingsFact * sensorWidth(void)
SettingsFact * fixedOrientation(void)
void save(QJsonObject &json) const
SettingsFact * focalLength(void)
void setDirty(bool dirty)
SettingsFact * sensorHeight(void)
SettingsFact * imageWidth(void)
bool load(const QJsonObject &json, QString &errorString)
SettingsFact * landscape(void)
void rawValueChanged(const QVariant &value)
void setRawValue(const QVariant &value)
QVariant rawValue() const
Value after translation.
void valueChanged(const QVariant &value)
This signal is only meant for use by the QT property system. It should not be connected to by client ...
Master controller for mission, fence, rally.
@ AltitudeFrameCalcAboveTerrain
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)
Validates that all required keys are present and that listed keys have the expected type.
constexpr const char * jsonVersionKey