From 4d5609e801f303cd6a5f8a08015fcedb64a99487 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Mon, 26 Feb 2024 13:45:45 +0100 Subject: [PATCH 01/25] meteo widget menu info point --- graphics/stationMarker.cpp | 5 +++-- graphics/stationMarker.h | 4 ++-- meteo/meteoPoint.cpp | 17 +++++++++++++++++ meteo/meteoPoint.h | 1 + meteoWidget/meteoWidget.cpp | 37 +++++++++++++++++++++++++++++++++++++ meteoWidget/meteoWidget.h | 2 ++ project/project.cpp | 3 ++- project/project.h | 2 +- 8 files changed, 65 insertions(+), 6 deletions(-) diff --git a/graphics/stationMarker.cpp b/graphics/stationMarker.cpp index 5adf53ac4..14e7f1340 100644 --- a/graphics/stationMarker.cpp +++ b/graphics/stationMarker.cpp @@ -133,13 +133,14 @@ void StationMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) if (selection != nullptr) { + std::string lapseRateName = getLapseRateCodeName(_lapseRateCode); if (selection == openMeteoWidget) { - emit newStationClicked(_id, _name, isGrid); + emit newStationClicked(_id, _name, lapseRateName, isGrid); } else if (selection == appendMeteoWidget) { - emit appendStationClicked(_id, _name, isGrid); + emit appendStationClicked(_id, _name, lapseRateName, isGrid); } else if (selection == openPointStatisticsWidget) { diff --git a/graphics/stationMarker.h b/graphics/stationMarker.h index d5d9a3762..133a909f3 100644 --- a/graphics/stationMarker.h +++ b/graphics/stationMarker.h @@ -41,8 +41,8 @@ void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); signals: - void newStationClicked(std::string, std::string, bool); - void appendStationClicked(std::string, std::string, bool); + void newStationClicked(std::string, std::string, std::string, bool); + void appendStationClicked(std::string, std::string, std::string, bool); void newPointStatisticsClicked(std::string, bool); void changeOrogCodeClicked(std::string, int); void newHomogeneityTestClicked(std::string); diff --git a/meteo/meteoPoint.cpp b/meteo/meteoPoint.cpp index 65a8c3a5c..e00e41f78 100644 --- a/meteo/meteoPoint.cpp +++ b/meteo/meteoPoint.cpp @@ -98,6 +98,23 @@ void Crit3DMeteoPoint::setName(std::string name) this->name = name; } +void Crit3DMeteoPoint::setLapseRateCode(std::string lapseRateCode) +{ + if (lapseRateCode == "primary") + { + this->lapseRateCode = primary; + } + else if (lapseRateCode == "secondary") + { + this->lapseRateCode = secondary; + } + else if (lapseRateCode == "supplemental") + { + this->lapseRateCode = supplemental; + } + +} + void Crit3DMeteoPoint::initializeObsDataH(int myHourlyFraction, int numberOfDays, const Crit3DDate& firstDate) { this->cleanObsDataH(); diff --git a/meteo/meteoPoint.h b/meteo/meteoPoint.h index 5368ed963..895bb1dea 100644 --- a/meteo/meteoPoint.h +++ b/meteo/meteoPoint.h @@ -166,6 +166,7 @@ void setId(std::string value); void setName(std::string name); + void setLapseRateCode(std::string lapseRateCode); bool computeDerivedVariables(Crit3DTime dateTime); bool computeMonthlyAggregate(Crit3DDate firstDate, Crit3DDate lastDate, meteoVariable dailyMeteoVar, Crit3DMeteoSettings *meteoSettings, Crit3DQuality *qualityCheck, Crit3DClimateParameters *climateParam); diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index f6b602c7a..7828f8637 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -337,8 +337,10 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMet // menu QMenuBar* menuBar = new QMenuBar(); QMenu *editMenu = new QMenu("Edit"); + QMenu *viewMenu = new QMenu("View"); menuBar->addMenu(editMenu); + menuBar->addMenu(viewMenu); mainLayout->setMenuBar(menuBar); QAction* changeLeftAxis = new QAction(tr("&Change axis left"), this); @@ -351,6 +353,12 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMet editMenu->addAction(exportGraph); editMenu->addAction(removeStation); + QAction* infoPoint = new QAction(tr("&Info meteo point"), this); + QAction* dataAvailability = new QAction(tr("&Data availability"), this); + + viewMenu->addAction(infoPoint); + viewMenu->addAction(dataAvailability); + connect(addVarButton, &QPushButton::clicked, [=](){ showVar(); }); connect(dailyButton, &QPushButton::clicked, [=](){ showDailyGraph(); }); connect(hourlyButton, &QPushButton::clicked, [=](){ showHourlyGraph(); }); @@ -362,6 +370,8 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMet connect(changeRightAxis, &QAction::triggered, this, &Crit3DMeteoWidget::on_actionChangeRightAxis); connect(exportGraph, &QAction::triggered, this, &Crit3DMeteoWidget::on_actionExportGraph); connect(removeStation, &QAction::triggered, this, &Crit3DMeteoWidget::on_actionRemoveStation); + connect(infoPoint, &QAction::triggered, this, &Crit3DMeteoWidget::on_actionInfoPoint); + connect(dataAvailability, &QAction::triggered, this, &Crit3DMeteoWidget::on_actionDataAvailability); plotLayout->addWidget(chartView); horizontalGroupBox->setLayout(buttonLayout); @@ -2079,6 +2089,33 @@ void Crit3DMeteoWidget::on_actionRemoveStation() } } +void Crit3DMeteoWidget::on_actionInfoPoint() +{ + QDialog infoWindow; + infoWindow.setWindowTitle("Info meteo points"); + QVBoxLayout* layout = new QVBoxLayout(&infoWindow); + for (int mp=0; mpaddWidget(label); + QString info = QString("Point: %1
ID: %2
lapse rate code: %3") + .arg(stationsName, stationId, lapseRateName); + QTextEdit* plainTextEdit = new QTextEdit(info); + plainTextEdit->setReadOnly(true); + layout->addWidget(plainTextEdit); + } + infoWindow.exec(); +} + +void Crit3DMeteoWidget::on_actionDataAvailability() +{ + // TO DO +} + qreal findMedian(QList sortedList, int begin, int end) { diff --git a/meteoWidget/meteoWidget.h b/meteoWidget/meteoWidget.h index a9a06edd5..631b093f1 100644 --- a/meteoWidget/meteoWidget.h +++ b/meteoWidget/meteoWidget.h @@ -54,6 +54,8 @@ void on_actionChangeRightAxis(); void on_actionExportGraph(); void on_actionRemoveStation(); + void on_actionInfoPoint(); + void on_actionDataAvailability(); private: int meteoWidgetID; diff --git a/project/project.cpp b/project/project.cpp index f9adbdabe..f5e91031c 100644 --- a/project/project.cpp +++ b/project/project.cpp @@ -3173,7 +3173,7 @@ void Project::importHourlyMeteoData(const QString& csvFileName, bool importAllFi } -void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, bool isAppend) +void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string lapseRate, bool isAppend) { logInfoGUI("Loading data..."); @@ -3219,6 +3219,7 @@ void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoi Crit3DMeteoPoint mp; mp.setId(idMeteoPoint); mp.setName(namePoint); + mp.setLapseRateCode(lapseRate); if (isAppend) { diff --git a/project/project.h b/project/project.h index d06976a76..7809a6e58 100644 --- a/project/project.h +++ b/project/project.h @@ -259,7 +259,7 @@ void importHourlyMeteoData(const QString& fileName, bool importAllFiles, bool deletePreviousData); gis::Crit3DRasterGrid* getHourlyMeteoRaster(meteoVariable myVar); - void showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, bool isAppend); + void showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string lapseRate, bool isAppend); void showMeteoWidgetGrid(std::string idCell, bool isAppend); void showProxyGraph(); From 41e53102a0c34c9758c348bf251dd244f10a22c6 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Mon, 26 Feb 2024 15:04:35 +0100 Subject: [PATCH 02/25] Menu DataAvailability --- meteoWidget/meteoWidget.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index 7828f8637..4294fc6f6 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -2093,7 +2093,7 @@ void Crit3DMeteoWidget::on_actionInfoPoint() { QDialog infoWindow; infoWindow.setWindowTitle("Info meteo points"); - QVBoxLayout* layout = new QVBoxLayout(&infoWindow); + QVBoxLayout* layout = new QVBoxLayout(); for (int mp=0; mpsetReadOnly(true); layout->addWidget(plainTextEdit); } + infoWindow.setLayout(layout); infoWindow.exec(); } void Crit3DMeteoWidget::on_actionDataAvailability() { - // TO DO + QDialog infoWindow; + infoWindow.setWindowTitle("DataAvailability"); + QVBoxLayout* layout = new QVBoxLayout(); + QString infoDaily = QString(" Daily Data: "); + QLabel* labelDaily = new QLabel(infoDaily); + layout->addWidget(labelDaily); + QString dailyInfo = QString("%1 - %2") + .arg(firstDailyDate.toString("yyyy/MM/dd"), lastDailyDate.toString("yyyy/MM/dd")); + QTextEdit* dailyTextEdit = new QTextEdit(dailyInfo); + QFont font = dailyTextEdit->font(); + QFontMetrics fontMetrics = QFontMetrics(font); + dailyTextEdit->setMaximumHeight(fontMetrics.height()+10); + dailyTextEdit->setReadOnly(true); + layout->addWidget(dailyTextEdit); + + QString infoHourly = QString(" Hourly Data: "); + QLabel* labelHourly = new QLabel(infoHourly); + layout->addWidget(labelHourly); + QString hourlyInfo = QString("%1 - %2") + .arg(firstHourlyDate.toString("yyyy/MM/dd"), lastHourlyDate.toString("yyyy/MM/dd")); + QTextEdit* hourlyTextEdit = new QTextEdit(hourlyInfo); + hourlyTextEdit->setMaximumHeight(fontMetrics.height()+10); + hourlyTextEdit->setReadOnly(true); + layout->addWidget(hourlyTextEdit); + + infoWindow.setLayout(layout); + infoWindow.exec(); } From 4c9d8b30110622680c72d9f63e05ba1daed4704b Mon Sep 17 00:00:00 2001 From: lauracosta Date: Mon, 26 Feb 2024 17:43:54 +0100 Subject: [PATCH 03/25] add dataset info --- graphics/stationMarker.cpp | 4 ++-- graphics/stationMarker.h | 4 ++-- meteo/meteoPoint.cpp | 5 +++++ meteo/meteoPoint.h | 1 + meteoWidget/meteoWidget.cpp | 5 +++-- project/project.cpp | 3 ++- project/project.h | 2 +- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/graphics/stationMarker.cpp b/graphics/stationMarker.cpp index 14e7f1340..7625ce5c3 100644 --- a/graphics/stationMarker.cpp +++ b/graphics/stationMarker.cpp @@ -136,11 +136,11 @@ void StationMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) std::string lapseRateName = getLapseRateCodeName(_lapseRateCode); if (selection == openMeteoWidget) { - emit newStationClicked(_id, _name, lapseRateName, isGrid); + emit newStationClicked(_id, _name, _dataset, lapseRateName, isGrid); } else if (selection == appendMeteoWidget) { - emit appendStationClicked(_id, _name, lapseRateName, isGrid); + emit appendStationClicked(_id, _name, _dataset, lapseRateName, isGrid); } else if (selection == openPointStatisticsWidget) { diff --git a/graphics/stationMarker.h b/graphics/stationMarker.h index 133a909f3..dd8cc8fc8 100644 --- a/graphics/stationMarker.h +++ b/graphics/stationMarker.h @@ -41,8 +41,8 @@ void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); signals: - void newStationClicked(std::string, std::string, std::string, bool); - void appendStationClicked(std::string, std::string, std::string, bool); + void newStationClicked(std::string, std::string, std::string, std::string, bool); + void appendStationClicked(std::string, std::string, std::string, std::string, bool); void newPointStatisticsClicked(std::string, bool); void changeOrogCodeClicked(std::string, int); void newHomogeneityTestClicked(std::string); diff --git a/meteo/meteoPoint.cpp b/meteo/meteoPoint.cpp index e00e41f78..73d182235 100644 --- a/meteo/meteoPoint.cpp +++ b/meteo/meteoPoint.cpp @@ -115,6 +115,11 @@ void Crit3DMeteoPoint::setLapseRateCode(std::string lapseRateCode) } +void Crit3DMeteoPoint::setDataset(std::string dataset) +{ + this->dataset = dataset; +} + void Crit3DMeteoPoint::initializeObsDataH(int myHourlyFraction, int numberOfDays, const Crit3DDate& firstDate) { this->cleanObsDataH(); diff --git a/meteo/meteoPoint.h b/meteo/meteoPoint.h index 895bb1dea..e15969c0c 100644 --- a/meteo/meteoPoint.h +++ b/meteo/meteoPoint.h @@ -166,6 +166,7 @@ void setId(std::string value); void setName(std::string name); + void setDataset(std::string dataset); void setLapseRateCode(std::string lapseRateCode); bool computeDerivedVariables(Crit3DTime dateTime); diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index 4294fc6f6..201ea7975 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -2099,11 +2099,12 @@ void Crit3DMeteoWidget::on_actionInfoPoint() QString stationId = QString::fromStdString(meteoPoints[mp].id); QString stationsName = QString::fromStdString(meteoPoints[mp].name); QString station = stationId+"_"+stationsName; + QString dataset = QString::fromStdString(meteoPoints[mp].dataset); QString lapseRateName = QString::fromStdString(getLapseRateCodeName(meteoPoints[mp].lapseRateCode)); QLabel* label = new QLabel(station); layout->addWidget(label); - QString info = QString("Point: %1
ID: %2
lapse rate code: %3") - .arg(stationsName, stationId, lapseRateName); + QString info = QString("Point: %1
ID: %2
dataset: %3
lapse rate code: %4") + .arg(stationsName, stationId, dataset, lapseRateName); QTextEdit* plainTextEdit = new QTextEdit(info); plainTextEdit->setReadOnly(true); layout->addWidget(plainTextEdit); diff --git a/project/project.cpp b/project/project.cpp index f5e91031c..add335b3a 100644 --- a/project/project.cpp +++ b/project/project.cpp @@ -3173,7 +3173,7 @@ void Project::importHourlyMeteoData(const QString& csvFileName, bool importAllFi } -void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string lapseRate, bool isAppend) +void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string dataset, std::string lapseRate, bool isAppend) { logInfoGUI("Loading data..."); @@ -3220,6 +3220,7 @@ void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoi mp.setId(idMeteoPoint); mp.setName(namePoint); mp.setLapseRateCode(lapseRate); + mp.setDataset(dataset); if (isAppend) { diff --git a/project/project.h b/project/project.h index 7809a6e58..8d81fc652 100644 --- a/project/project.h +++ b/project/project.h @@ -259,7 +259,7 @@ void importHourlyMeteoData(const QString& fileName, bool importAllFiles, bool deletePreviousData); gis::Crit3DRasterGrid* getHourlyMeteoRaster(meteoVariable myVar); - void showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string lapseRate, bool isAppend); + void showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string dataset, std::string lapseRate, bool isAppend); void showMeteoWidgetGrid(std::string idCell, bool isAppend); void showProxyGraph(); From e57b3ef9564a266b2f3d15385a7bb359291b4bfe Mon Sep 17 00:00:00 2001 From: lauracosta Date: Mon, 26 Feb 2024 18:10:09 +0100 Subject: [PATCH 04/25] on_actionDataAvailability --- meteoWidget/meteoWidget.cpp | 65 +++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index 201ea7975..dc3d0fcf6 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -2118,28 +2118,51 @@ void Crit3DMeteoWidget::on_actionDataAvailability() QDialog infoWindow; infoWindow.setWindowTitle("DataAvailability"); QVBoxLayout* layout = new QVBoxLayout(); - QString infoDaily = QString(" Daily Data: "); - QLabel* labelDaily = new QLabel(infoDaily); - layout->addWidget(labelDaily); - QString dailyInfo = QString("%1 - %2") - .arg(firstDailyDate.toString("yyyy/MM/dd"), lastDailyDate.toString("yyyy/MM/dd")); - QTextEdit* dailyTextEdit = new QTextEdit(dailyInfo); - QFont font = dailyTextEdit->font(); - QFontMetrics fontMetrics = QFontMetrics(font); - dailyTextEdit->setMaximumHeight(fontMetrics.height()+10); - dailyTextEdit->setReadOnly(true); - layout->addWidget(dailyTextEdit); - - QString infoHourly = QString(" Hourly Data: "); - QLabel* labelHourly = new QLabel(infoHourly); - layout->addWidget(labelHourly); - QString hourlyInfo = QString("%1 - %2") - .arg(firstHourlyDate.toString("yyyy/MM/dd"), lastHourlyDate.toString("yyyy/MM/dd")); - QTextEdit* hourlyTextEdit = new QTextEdit(hourlyInfo); - hourlyTextEdit->setMaximumHeight(fontMetrics.height()+10); - hourlyTextEdit->setReadOnly(true); - layout->addWidget(hourlyTextEdit); + QDate myFirstDailyDate; + QDate myLastDailyDate; + QDate myFirstHourlyDate; + QDate myLastHourlyDate; + + for (int mp=0; mp Daily Data: "); + QLabel* labelDaily = new QLabel(infoDaily); + vbox->addWidget(labelDaily); + myFirstDailyDate.setDate(meteoPoints[mp].obsDataD[0].date.year, meteoPoints[mp].obsDataD[0].date.month, meteoPoints[mp].obsDataD[0].date.day); + myLastDailyDate = myFirstDailyDate.addDays(meteoPoints[mp].nrObsDataDaysD-1); + QString dailyInfo = QString("%1 - %2") + .arg(myFirstDailyDate.toString("yyyy/MM/dd"), myLastDailyDate.toString("yyyy/MM/dd")); + QTextEdit* dailyTextEdit = new QTextEdit(dailyInfo); + QFont font = dailyTextEdit->font(); + QFontMetrics fontMetrics = QFontMetrics(font); + dailyTextEdit->setMaximumHeight(fontMetrics.height()+10); + dailyTextEdit->setReadOnly(true); + vbox->addWidget(dailyTextEdit); + + QString infoHourly = QString(" Hourly Data: "); + QLabel* labelHourly = new QLabel(infoHourly); + vbox->addWidget(labelHourly); + myFirstHourlyDate.setDate(meteoPoints[mp].getMeteoPointHourlyValuesDate(0).year, meteoPoints[mp].getMeteoPointHourlyValuesDate(0).month, + meteoPoints[mp].getMeteoPointHourlyValuesDate(0).day); + myLastHourlyDate = myFirstHourlyDate.addDays(meteoPoints[mp].nrObsDataDaysH-1); + + QString hourlyInfo = QString("%1 - %2") + .arg(myFirstHourlyDate.toString("yyyy/MM/dd"), myLastHourlyDate.toString("yyyy/MM/dd")); + QTextEdit* hourlyTextEdit = new QTextEdit(hourlyInfo); + hourlyTextEdit->setMaximumHeight(fontMetrics.height()+10); + hourlyTextEdit->setReadOnly(true); + vbox->addWidget(hourlyTextEdit); + groupBox->setLayout(vbox); + layout->addWidget(groupBox); + } infoWindow.setLayout(layout); infoWindow.exec(); } From 6bb9c4c43a5eff12f10bcc81ad15cdd1808503a4 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Tue, 27 Feb 2024 14:45:07 +0100 Subject: [PATCH 05/25] add altitude --- graphics/stationMarker.cpp | 4 ++-- graphics/stationMarker.h | 4 ++-- meteo/meteoPoint.cpp | 5 +++++ meteo/meteoPoint.h | 1 + meteoWidget/meteoWidget.cpp | 5 +++-- project/project.cpp | 3 ++- project/project.h | 2 +- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/graphics/stationMarker.cpp b/graphics/stationMarker.cpp index 7625ce5c3..00cf8dbed 100644 --- a/graphics/stationMarker.cpp +++ b/graphics/stationMarker.cpp @@ -136,11 +136,11 @@ void StationMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) std::string lapseRateName = getLapseRateCodeName(_lapseRateCode); if (selection == openMeteoWidget) { - emit newStationClicked(_id, _name, _dataset, lapseRateName, isGrid); + emit newStationClicked(_id, _name, _dataset, _altitude, lapseRateName, isGrid); } else if (selection == appendMeteoWidget) { - emit appendStationClicked(_id, _name, _dataset, lapseRateName, isGrid); + emit appendStationClicked(_id, _name, _dataset, _altitude, lapseRateName, isGrid); } else if (selection == openPointStatisticsWidget) { diff --git a/graphics/stationMarker.h b/graphics/stationMarker.h index dd8cc8fc8..84171b4fa 100644 --- a/graphics/stationMarker.h +++ b/graphics/stationMarker.h @@ -41,8 +41,8 @@ void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); signals: - void newStationClicked(std::string, std::string, std::string, std::string, bool); - void appendStationClicked(std::string, std::string, std::string, std::string, bool); + void newStationClicked(std::string, std::string, std::string, double, std::string, bool); + void appendStationClicked(std::string, std::string, std::string, double, std::string, bool); void newPointStatisticsClicked(std::string, bool); void changeOrogCodeClicked(std::string, int); void newHomogeneityTestClicked(std::string); diff --git a/meteo/meteoPoint.cpp b/meteo/meteoPoint.cpp index 73d182235..0b5ddb504 100644 --- a/meteo/meteoPoint.cpp +++ b/meteo/meteoPoint.cpp @@ -98,6 +98,11 @@ void Crit3DMeteoPoint::setName(std::string name) this->name = name; } +void Crit3DMeteoPoint::setAltitude(double altitude) +{ + this->point.z = altitude; +} + void Crit3DMeteoPoint::setLapseRateCode(std::string lapseRateCode) { if (lapseRateCode == "primary") diff --git a/meteo/meteoPoint.h b/meteo/meteoPoint.h index e15969c0c..3d0e5f2b9 100644 --- a/meteo/meteoPoint.h +++ b/meteo/meteoPoint.h @@ -167,6 +167,7 @@ void setId(std::string value); void setName(std::string name); void setDataset(std::string dataset); + void setAltitude(double altitude); void setLapseRateCode(std::string lapseRateCode); bool computeDerivedVariables(Crit3DTime dateTime); diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index dc3d0fcf6..5bf8f887a 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -2100,11 +2100,12 @@ void Crit3DMeteoWidget::on_actionInfoPoint() QString stationsName = QString::fromStdString(meteoPoints[mp].name); QString station = stationId+"_"+stationsName; QString dataset = QString::fromStdString(meteoPoints[mp].dataset); + QString altitude = QString::number(meteoPoints[mp].point.z); QString lapseRateName = QString::fromStdString(getLapseRateCodeName(meteoPoints[mp].lapseRateCode)); QLabel* label = new QLabel(station); layout->addWidget(label); - QString info = QString("Point: %1
ID: %2
dataset: %3
lapse rate code: %4") - .arg(stationsName, stationId, dataset, lapseRateName); + QString info = QString("Point: %1
ID: %2
dataset: %3
altitude: %4 m
lapse rate code: %5") + .arg(stationsName, stationId, dataset, altitude, lapseRateName); QTextEdit* plainTextEdit = new QTextEdit(info); plainTextEdit->setReadOnly(true); layout->addWidget(plainTextEdit); diff --git a/project/project.cpp b/project/project.cpp index add335b3a..db154d40c 100644 --- a/project/project.cpp +++ b/project/project.cpp @@ -3173,7 +3173,7 @@ void Project::importHourlyMeteoData(const QString& csvFileName, bool importAllFi } -void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string dataset, std::string lapseRate, bool isAppend) +void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string dataset, double altitude, std::string lapseRate, bool isAppend) { logInfoGUI("Loading data..."); @@ -3221,6 +3221,7 @@ void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoi mp.setName(namePoint); mp.setLapseRateCode(lapseRate); mp.setDataset(dataset); + mp.point.z = altitude; if (isAppend) { diff --git a/project/project.h b/project/project.h index 8d81fc652..1ce436483 100644 --- a/project/project.h +++ b/project/project.h @@ -259,7 +259,7 @@ void importHourlyMeteoData(const QString& fileName, bool importAllFiles, bool deletePreviousData); gis::Crit3DRasterGrid* getHourlyMeteoRaster(meteoVariable myVar); - void showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string dataset, std::string lapseRate, bool isAppend); + void showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoint, std::string dataset, double altitude, std::string lapseRate, bool isAppend); void showMeteoWidgetGrid(std::string idCell, bool isAppend); void showProxyGraph(); From c5e430ba47317402bb04473bb6faf43414dd047f Mon Sep 17 00:00:00 2001 From: ftomei Date: Tue, 27 Feb 2024 15:41:10 +0100 Subject: [PATCH 06/25] fix meteogrid data availability --- meteoWidget/meteoWidget.cpp | 141 +++++++++++++++++++++++------------- meteoWidget/meteoWidget.h | 2 +- project/project.cpp | 90 ++++++++++++++++------- 3 files changed, 155 insertions(+), 78 deletions(-) diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index dc3d0fcf6..81bf7337c 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -35,18 +35,18 @@ #include -Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMeteoSettings* meteoSettings_) +Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid_, QString projectPath, Crit3DMeteoSettings* meteoSettings_) { isInitialized = false; meteoSettings = meteoSettings_; - this->isGrid = isGrid; - this->isEnsemble = false; - this->nrMembers = NODATA; + isGrid = isGrid_; + isEnsemble = false; + nrMembers = NODATA; maxEnsembleBar = -1; maxEnsembleLine = NODATA; minEnsembleLine = -NODATA; - if (this->isGrid) + if (isGrid) { this->setWindowTitle("Grid"); } @@ -58,11 +58,13 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMet this->resize(1240, 700); this->setAttribute(Qt::WA_DeleteOnClose); currentFreq = noFrequency; - currentDate = QDate(1800,1,1); - firstDailyDate = currentDate; - firstHourlyDate = currentDate; - lastDailyDate = currentDate; - lastHourlyDate = currentDate; + + QDate noDate = QDate(1800,1,1); + currentDate = noDate; + firstDailyDate = noDate; + firstHourlyDate = noDate; + lastDailyDate = noDate; + lastHourlyDate = noDate; isLine = false; isBar = false; @@ -70,7 +72,7 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMet QVector vectorBarSet; QString csvPath, defaultPath, stylesPath; - if (!projectPath.isEmpty()) + if (! projectPath.isEmpty()) { defaultPath = projectPath + "SETTINGS/Crit3DPlotDefault.csv"; stylesPath = projectPath + "SETTINGS/Crit3DPlotStyles.csv"; @@ -309,8 +311,6 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMet axisY = new QValueAxis(); axisYdx = new QValueAxis(); - QDate first(QDate::currentDate().year(), 1, 1); - QDate last(QDate::currentDate().year(), 12, 31); axisX->setTitleText("Date"); axisXvirtual->setTitleText("Date"); axisXvirtual->setGridLineVisible(false); @@ -2113,56 +2113,95 @@ void Crit3DMeteoWidget::on_actionInfoPoint() infoWindow.exec(); } + void Crit3DMeteoWidget::on_actionDataAvailability() { QDialog infoWindow; infoWindow.setWindowTitle("DataAvailability"); QVBoxLayout* layout = new QVBoxLayout(); - QDate myFirstDailyDate; - QDate myLastDailyDate; - QDate myFirstHourlyDate; - QDate myLastHourlyDate; - - for (int mp=0; mp Daily Data: "); - QLabel* labelDaily = new QLabel(infoDaily); - vbox->addWidget(labelDaily); - myFirstDailyDate.setDate(meteoPoints[mp].obsDataD[0].date.year, meteoPoints[mp].obsDataD[0].date.month, meteoPoints[mp].obsDataD[0].date.day); - myLastDailyDate = myFirstDailyDate.addDays(meteoPoints[mp].nrObsDataDaysD-1); - QString dailyInfo = QString("%1 - %2") - .arg(myFirstDailyDate.toString("yyyy/MM/dd"), myLastDailyDate.toString("yyyy/MM/dd")); - QTextEdit* dailyTextEdit = new QTextEdit(dailyInfo); - QFont font = dailyTextEdit->font(); - QFontMetrics fontMetrics = QFontMetrics(font); - dailyTextEdit->setMaximumHeight(fontMetrics.height()+10); - dailyTextEdit->setReadOnly(true); - vbox->addWidget(dailyTextEdit); - - QString infoHourly = QString(" Hourly Data: "); - QLabel* labelHourly = new QLabel(infoHourly); - vbox->addWidget(labelHourly); - myFirstHourlyDate.setDate(meteoPoints[mp].getMeteoPointHourlyValuesDate(0).year, meteoPoints[mp].getMeteoPointHourlyValuesDate(0).month, - meteoPoints[mp].getMeteoPointHourlyValuesDate(0).day); - myLastHourlyDate = myFirstHourlyDate.addDays(meteoPoints[mp].nrObsDataDaysH-1); - - QString hourlyInfo = QString("%1 - %2") - .arg(myFirstHourlyDate.toString("yyyy/MM/dd"), myLastHourlyDate.toString("yyyy/MM/dd")); - QTextEdit* hourlyTextEdit = new QTextEdit(hourlyInfo); - hourlyTextEdit->setMaximumHeight(fontMetrics.height()+10); - hourlyTextEdit->setReadOnly(true); - vbox->addWidget(hourlyTextEdit); + if (!firstDailyDate.isNull() && firstDailyDate.year() != 1800) + { + QLabel* labelDaily = new QLabel("Daily Data:"); + vbox->addWidget(labelDaily); + + QString dailyInfo = QString("%1 - %2").arg(firstDailyDate.toString("yyyy/MM/dd"), lastDailyDate.toString("yyyy/MM/dd")); + QTextEdit* dailyTextEdit = new QTextEdit(dailyInfo); + + dailyTextEdit->setMaximumHeight(QFontMetrics(dailyTextEdit->font()).height() + 10); + dailyTextEdit->setReadOnly(true); + + vbox->addWidget(dailyTextEdit); + } + + if (!firstHourlyDate.isNull() && firstHourlyDate.year() != 1800) + { + QLabel* labelHourly = new QLabel("Hourly Data:"); + vbox->addWidget(labelHourly); + + QString hourlyInfo = QString("%1 - %2").arg(firstHourlyDate.toString("yyyy/MM/dd"), lastHourlyDate.toString("yyyy/MM/dd")); + QTextEdit* hourlyTextEdit = new QTextEdit(hourlyInfo); + + hourlyTextEdit->setMaximumHeight(QFontMetrics(hourlyTextEdit->font()).height() + 10); + hourlyTextEdit->setReadOnly(true); + + vbox->addWidget(hourlyTextEdit); + } + groupBox->setLayout(vbox); layout->addWidget(groupBox); } + else + { + QDate myFirstDailyDate, myLastDailyDate; + QDate myFirstHourlyDate, myLastHourlyDate; + + for (int mp=0; mpaddWidget(labelDaily); + myFirstDailyDate.setDate(meteoPoints[mp].obsDataD[0].date.year, meteoPoints[mp].obsDataD[0].date.month, meteoPoints[mp].obsDataD[0].date.day); + myLastDailyDate = myFirstDailyDate.addDays(meteoPoints[mp].nrObsDataDaysD-1); + QString dailyInfo = QString("%1 - %2") + .arg(myFirstDailyDate.toString("yyyy/MM/dd"), myLastDailyDate.toString("yyyy/MM/dd")); + QTextEdit* dailyTextEdit = new QTextEdit(dailyInfo); + QFont font = dailyTextEdit->font(); + QFontMetrics fontMetrics = QFontMetrics(font); + dailyTextEdit->setMaximumHeight(fontMetrics.height()+10); + dailyTextEdit->setReadOnly(true); + vbox->addWidget(dailyTextEdit); + + QString infoHourly = QString("Hourly Data:"); + QLabel* labelHourly = new QLabel(infoHourly); + vbox->addWidget(labelHourly); + myFirstHourlyDate.setDate(meteoPoints[mp].getMeteoPointHourlyValuesDate(0).year, meteoPoints[mp].getMeteoPointHourlyValuesDate(0).month, + meteoPoints[mp].getMeteoPointHourlyValuesDate(0).day); + myLastHourlyDate = myFirstHourlyDate.addDays(meteoPoints[mp].nrObsDataDaysH-1); + + QString hourlyInfo = QString("%1 - %2") + .arg(myFirstHourlyDate.toString("yyyy/MM/dd"), myLastHourlyDate.toString("yyyy/MM/dd")); + QTextEdit* hourlyTextEdit = new QTextEdit(hourlyInfo); + hourlyTextEdit->setMaximumHeight(fontMetrics.height()+10); + hourlyTextEdit->setReadOnly(true); + vbox->addWidget(hourlyTextEdit); + groupBox->setLayout(vbox); + layout->addWidget(groupBox); + } + } + infoWindow.setLayout(layout); infoWindow.exec(); } diff --git a/meteoWidget/meteoWidget.h b/meteoWidget/meteoWidget.h index 631b093f1..4e8f02b43 100644 --- a/meteoWidget/meteoWidget.h +++ b/meteoWidget/meteoWidget.h @@ -14,7 +14,7 @@ Q_OBJECT public: - Crit3DMeteoWidget(bool isGrid, QString projectPath, Crit3DMeteoSettings* meteoSettings_); + Crit3DMeteoWidget(bool isGrid_, QString projectPath, Crit3DMeteoSettings* meteoSettings_); ~Crit3DMeteoWidget() override; int getMeteoWidgetID() const; diff --git a/project/project.cpp b/project/project.cpp index add335b3a..218b0f2c5 100644 --- a/project/project.cpp +++ b/project/project.cpp @@ -3228,7 +3228,7 @@ void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoi meteoPointsDbHandler->loadHourlyData(getCrit3DDate(firstHourly.date()), getCrit3DDate(lastHourly.date()), &mp); meteoWidgetPointList[meteoWidgetPointList.size()-1]->draw(mp, isAppend); } - else if (!isAppend) + else { bool isGrid = false; Crit3DMeteoWidget* meteoWidgetPoint = new Crit3DMeteoWidget(isGrid, projectPath, meteoSettings); @@ -3246,9 +3246,14 @@ void Project::showMeteoWidgetPoint(std::string idMeteoPoint, std::string namePoi meteoPointsDbHandler->loadDailyData(getCrit3DDate(firstDaily), getCrit3DDate(lastDaily), &mp); meteoPointsDbHandler->loadHourlyData(getCrit3DDate(firstHourly.date()), getCrit3DDate(lastHourly.date()), &mp); - // TODO add check on hourly - meteoWidgetPoint->setDateIntervalDaily(firstDate, lastDate); - meteoWidgetPoint->setDateIntervalHourly(firstDate, lastDate); + if (hasDailyData) + { + meteoWidgetPoint->setDateIntervalDaily(firstDaily, lastDaily); + } + if (hasHourlyData) + { + meteoWidgetPoint->setDateIntervalHourly(firstHourly.date(), lastHourly.date()); + } meteoWidgetPoint->setCurrentDate(this->currentDate); meteoWidgetPoint->draw(mp, isAppend); @@ -3263,8 +3268,15 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) QDate firstDate = meteoGridDbHandler->firstDate(); QDate lastDate = meteoGridDbHandler->lastDate(); - QDateTime firstDateTime = QDateTime(firstDate, QTime(1,0), Qt::UTC); - QDateTime lastDateTime = QDateTime(lastDate.addDays(1), QTime(0,0), Qt::UTC); + QDateTime firstDateTime, lastDateTime; + if (meteoGridDbHandler->getFirstHourlyDate().isValid()) + { + firstDateTime = QDateTime(meteoGridDbHandler->getFirstHourlyDate(), QTime(1,0), Qt::UTC); + } + if (meteoGridDbHandler->getLastHourlyDate().isValid()) + { + lastDateTime = QDateTime(meteoGridDbHandler->getLastHourlyDate().addDays(1), QTime(0,0), Qt::UTC); + } int meteoWidgetId = 0; if (meteoWidgetGridList.isEmpty() || meteoGridDbHandler->gridStructure().isEnsemble()) @@ -3282,26 +3294,39 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) { logInfoGUI("Loading data...\n"); - if (!meteoGridDbHandler->gridStructure().isFixedFields()) + if (! meteoGridDbHandler->gridStructure().isFixedFields()) { - meteoGridDbHandler->loadGridDailyData(errorString, QString::fromStdString(idCell), firstDate, lastDate); - meteoGridDbHandler->loadGridHourlyData(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + if (meteoGridDbHandler->isDaily()) + { + meteoGridDbHandler->loadGridDailyData(errorString, QString::fromStdString(idCell), firstDate, lastDate); + } + if (meteoGridDbHandler->isHourly()) + { + meteoGridDbHandler->loadGridHourlyData(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + } } else { - meteoGridDbHandler->loadGridDailyDataFixedFields(errorString, QString::fromStdString(idCell), firstDate, lastDate); - meteoGridDbHandler->loadGridHourlyDataFixedFields(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + if (meteoGridDbHandler->isDaily()) + { + meteoGridDbHandler->loadGridDailyDataFixedFields(errorString, QString::fromStdString(idCell), firstDate, lastDate); + } + if (meteoGridDbHandler->isHourly()) + { + meteoGridDbHandler->loadGridHourlyDataFixedFields(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + } } closeLogInfo(); + if(meteoWidgetGridList[meteoWidgetGridList.size()-1]->getIsEnsemble()) { // an ensemble grid is already open, append on that // The new one is not ensemble (otherwise append mode is not possible) meteoWidgetGridList[meteoWidgetGridList.size()-1]->setIsEnsemble(false); } - unsigned row; - unsigned col; - if (meteoGridDbHandler->meteoGrid()->findMeteoPointFromId(&row,&col,idCell)) + + unsigned row, col; + if (meteoGridDbHandler->meteoGrid()->findMeteoPointFromId(&row, &col, idCell)) { meteoWidgetGridList[meteoWidgetGridList.size()-1]->draw(meteoGridDbHandler->meteoGrid()->meteoPoint(row,col), isAppend); } @@ -3319,23 +3344,23 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) { meteoWidgetId = 0; } + meteoWidgetGrid->setMeteoWidgetID(meteoWidgetId); - meteoWidgetGrid->setCurrentDate(this->currentDate); + meteoWidgetGrid->setCurrentDate(currentDate); meteoWidgetGridList.append(meteoWidgetGrid); QObject::connect(meteoWidgetGrid, SIGNAL(closeWidgetGrid(int)), this, SLOT(deleteMeteoWidgetGrid(int))); - logInfoGUI("Loading data..."); logInfoGUI("Loading data..."); if (meteoGridDbHandler->gridStructure().isEnsemble()) { meteoWidgetGrid->setIsEnsemble(true); meteoWidgetGrid->setNrMembers(meteoGridDbHandler->gridStructure().nrMembers()); - unsigned row; - unsigned col; + + unsigned row, col; int nMembers = meteoGridDbHandler->gridStructure().nrMembers(); - if (meteoGridDbHandler->meteoGrid()->findMeteoPointFromId(&row,&col,idCell)) + if (meteoGridDbHandler->meteoGrid()->findMeteoPointFromId(&row, &col, idCell)) { if (meteoGridDbHandler->isDaily()) { @@ -3343,7 +3368,7 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) } if (meteoGridDbHandler->isHourly()) { - meteoWidgetGrid->setDateIntervalHourly(firstDate, lastDate); + meteoWidgetGrid->setDateIntervalHourly(firstDateTime.date(), lastDateTime.date()); } } else @@ -3351,7 +3376,8 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) closeLogInfo(); return; } - for (int i = 1; i<=nMembers; i++) + + for (int i = 1; i <= nMembers; i++) { meteoGridDbHandler->loadGridDailyDataEnsemble(errorString, QString::fromStdString(idCell), i, firstDate, lastDate); meteoWidgetGrid->addMeteoPointsEnsemble(meteoGridDbHandler->meteoGrid()->meteoPoint(row,col)); @@ -3363,13 +3389,25 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) { if (!meteoGridDbHandler->gridStructure().isFixedFields()) { - meteoGridDbHandler->loadGridDailyData(errorString, QString::fromStdString(idCell), firstDate, lastDate); - meteoGridDbHandler->loadGridHourlyData(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + if (meteoGridDbHandler->isDaily()) + { + meteoGridDbHandler->loadGridDailyData(errorString, QString::fromStdString(idCell), firstDate, lastDate); + } + if (meteoGridDbHandler->isHourly()) + { + meteoGridDbHandler->loadGridHourlyData(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + } } else { - meteoGridDbHandler->loadGridDailyDataFixedFields(errorString, QString::fromStdString(idCell), firstDate, lastDate); - meteoGridDbHandler->loadGridHourlyDataFixedFields(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + if (meteoGridDbHandler->isDaily()) + { + meteoGridDbHandler->loadGridDailyDataFixedFields(errorString, QString::fromStdString(idCell), firstDate, lastDate); + } + if (meteoGridDbHandler->isHourly()) + { + meteoGridDbHandler->loadGridHourlyDataFixedFields(errorString, QString::fromStdString(idCell), firstDateTime, lastDateTime); + } } closeLogInfo(); @@ -3382,7 +3420,7 @@ void Project::showMeteoWidgetGrid(std::string idCell, bool isAppend) } if (meteoGridDbHandler->isHourly()) { - meteoWidgetGrid->setDateIntervalHourly(firstDate, lastDate); + meteoWidgetGrid->setDateIntervalHourly(firstDateTime.date(), lastDateTime.date()); } meteoWidgetGrid->draw(meteoGridDbHandler->meteoGrid()->meteoPoint(row,col), isAppend); From 788f7a979186bcd0591f4e0b538602844bd8035d Mon Sep 17 00:00:00 2001 From: ftomei Date: Tue, 27 Feb 2024 15:48:49 +0100 Subject: [PATCH 07/25] update info meteogrid --- meteoWidget/meteoWidget.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index 31991d813..e317ad458 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -2104,9 +2104,18 @@ void Crit3DMeteoWidget::on_actionInfoPoint() QString lapseRateName = QString::fromStdString(getLapseRateCodeName(meteoPoints[mp].lapseRateCode)); QLabel* label = new QLabel(station); layout->addWidget(label); - QString info = QString("Point: %1
ID: %2
dataset: %3
altitude: %4 m
lapse rate code: %5") + QString infoStr; + if (isGrid) + { + infoStr = QString("Cell: %1
ID: %2
altitude: %3 m ") + .arg(stationsName, stationId, altitude); + } + else + { + infoStr = QString("Point: %1
ID: %2
dataset: %3
altitude: %4 m
lapse rate code: %5") .arg(stationsName, stationId, dataset, altitude, lapseRateName); - QTextEdit* plainTextEdit = new QTextEdit(info); + } + QTextEdit* plainTextEdit = new QTextEdit(infoStr); plainTextEdit->setReadOnly(true); layout->addWidget(plainTextEdit); } From 3eb06fc7ee1f88ad4725fc4683298ceea501fe1b Mon Sep 17 00:00:00 2001 From: ftomei Date: Tue, 27 Feb 2024 17:11:29 +0100 Subject: [PATCH 08/25] fix read climate list --- climate/crit3dClimateList.cpp | 42 +++++++++++++++++++++------ pragaProject/dialogMeteoComputation.h | 1 - 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/climate/crit3dClimateList.cpp b/climate/crit3dClimateList.cpp index 5f7ff83f9..69332da3c 100644 --- a/climate/crit3dClimateList.cpp +++ b/climate/crit3dClimateList.cpp @@ -193,9 +193,9 @@ std::vector Crit3DClimateList::listDailyCumulated() const return _listDailyCumulated; } + void Crit3DClimateList::parserElaboration() { - for (int i = 0; i < _listClimateElab.size(); i++) { int pos = 0; @@ -207,24 +207,37 @@ void Crit3DClimateList::parserElaboration() if (words.isEmpty()) { _listClimateElab.replace(i, "NULL"); + continue; } + // split years QString periodElabList = words.at(pos); - QList myYearWords = periodElabList.split('-'); // รท + QList myYearWords = periodElabList.split('-'); - if (myYearWords[0].toInt() == false || myYearWords[1].toInt() == false) + bool isOk = false; + int firstYear = myYearWords[0].toInt(&isOk); + if (! isOk) { - _listClimateElab.replace(i, "NULL"); + _listClimateElab.replace(i, "NULL"); + continue; + } + + int lastYear = myYearWords[1].toInt(&isOk); + if (! isOk) + { + _listClimateElab.replace(i, "NULL"); + continue; } - _listYearStart.push_back(myYearWords[0].toInt()); - _listYearEnd.push_back(myYearWords[1].toInt()); + _listYearStart.push_back(firstYear); + _listYearEnd.push_back(lastYear); pos = pos + 1; if (words.size() == pos) { _listClimateElab.replace(i, "NULL"); + continue; } meteoVariable var = noMeteoVar; @@ -239,20 +252,29 @@ void Crit3DClimateList::parserElaboration() { _listDailyCumulated.push_back(false); } - var = getKeyMeteoVarMeteoMap(MapDailyMeteoVarToString, words[pos].toStdString()); + var = getKeyMeteoVarMeteoMap(MapDailyMeteoVarToString, words[pos].toUpper().toStdString()); if (var == noMeteoVar) { - var = getKeyMeteoVarMeteoMapWithoutUnderscore(MapDailyMeteoVarToString, words[pos].toStdString()); + var = getKeyMeteoVarMeteoMapWithoutUnderscore(MapDailyMeteoVarToString, words[pos].toUpper().toStdString()); } } - _listVariable.push_back(var); + if (var == noMeteoVar) + { + _listClimateElab.replace(i, "NULL"); + continue; + } + else + { + _listVariable.push_back(var); + } pos = pos + 1; if (words.size() == pos) { _listClimateElab.replace(i, "NULL"); + continue; } QString periodTypeStr = words[pos]; @@ -263,6 +285,7 @@ void Crit3DClimateList::parserElaboration() if (words.size() == pos) { _listClimateElab.replace(i, "NULL"); + continue; } @@ -283,6 +306,7 @@ void Crit3DClimateList::parserElaboration() if (words.size() == pos) { _listClimateElab.replace(i, "NULL"); + continue; } QString elab = words[pos]; diff --git a/pragaProject/dialogMeteoComputation.h b/pragaProject/dialogMeteoComputation.h index a6bc737aa..21124d6e2 100644 --- a/pragaProject/dialogMeteoComputation.h +++ b/pragaProject/dialogMeteoComputation.h @@ -62,7 +62,6 @@ class DialogMeteoComputation : public QDialog QComboBox climateDbElabList; - public: DialogMeteoComputation(QSettings *settings, bool isMeteoGridLoaded, bool isMeteoPointLoaded, bool isAnomaly, bool saveClima); void done(bool res); From 37141fae76f306735bc19344b5da50741d46a060 Mon Sep 17 00:00:00 2001 From: ftomei Date: Tue, 27 Feb 2024 18:25:53 +0100 Subject: [PATCH 09/25] fix climate elab --- climate/crit3dClimateList.cpp | 48 +++++++++++++++++--------- climate/crit3dClimateList.h | 2 +- pragaProject/pragaProject.cpp | 27 +++++++++++++-- pragaProject/saveClimaLayout.cpp | 58 +++++++++++++++++--------------- 4 files changed, 88 insertions(+), 47 deletions(-) diff --git a/climate/crit3dClimateList.cpp b/climate/crit3dClimateList.cpp index 69332da3c..2656d5e2e 100644 --- a/climate/crit3dClimateList.cpp +++ b/climate/crit3dClimateList.cpp @@ -194,7 +194,7 @@ std::vector Crit3DClimateList::listDailyCumulated() const } -void Crit3DClimateList::parserElaboration() +void Crit3DClimateList::parserElaboration(QString &errorStr) { for (int i = 0; i < _listClimateElab.size(); i++) { @@ -218,6 +218,7 @@ void Crit3DClimateList::parserElaboration() int firstYear = myYearWords[0].toInt(&isOk); if (! isOk) { + errorStr += "Wrong year: " + myYearWords[0] + "\n"; _listClimateElab.replace(i, "NULL"); continue; } @@ -225,6 +226,7 @@ void Crit3DClimateList::parserElaboration() int lastYear = myYearWords[1].toInt(&isOk); if (! isOk) { + errorStr += "Wrong year: " + myYearWords[1] + "\n"; _listClimateElab.replace(i, "NULL"); continue; } @@ -236,31 +238,34 @@ void Crit3DClimateList::parserElaboration() if (words.size() == pos) { - _listClimateElab.replace(i, "NULL"); + errorStr += "Missing parameters in line: " + climateElab + "\n"; + _listClimateElab.replace(i, "NULL"); continue; } meteoVariable var = noMeteoVar; - if (words[pos] != "") + QString varStr = words[pos]; + if (varStr != "") { - if (words[pos].contains("CUMULATED")) + if (varStr.contains("CUMULATED")) { _listDailyCumulated.push_back(true); - words[pos].remove("CUMULATED"); + varStr.remove("CUMULATED"); } else { _listDailyCumulated.push_back(false); } - var = getKeyMeteoVarMeteoMap(MapDailyMeteoVarToString, words[pos].toUpper().toStdString()); + var = getKeyMeteoVarMeteoMap(MapDailyMeteoVarToString, varStr.toUpper().toStdString()); if (var == noMeteoVar) { - var = getKeyMeteoVarMeteoMapWithoutUnderscore(MapDailyMeteoVarToString, words[pos].toUpper().toStdString()); + var = getKeyMeteoVarMeteoMapWithoutUnderscore(MapDailyMeteoVarToString, varStr.toUpper().toStdString()); } } if (var == noMeteoVar) { + errorStr += "Wrong variable: " + varStr + "\n"; _listClimateElab.replace(i, "NULL"); continue; } @@ -273,23 +278,24 @@ void Crit3DClimateList::parserElaboration() if (words.size() == pos) { + errorStr += "Missing parameters in line: " + climateElab + "\n"; _listClimateElab.replace(i, "NULL"); continue; } QString periodTypeStr = words[pos]; - _listPeriodType.push_back(getPeriodTypeFromString(periodTypeStr)); + pos = pos + 1; // pos = 3 if (words.size() == pos) { - _listClimateElab.replace(i, "NULL"); + errorStr += "Missing parameters in line: " + climateElab + "\n"; + _listClimateElab.replace(i, "NULL"); continue; } - - if ( (_listPeriodType[i] == genericPeriod) && ( (words[pos].at(0)).isDigit() ) ) + if ( (_listPeriodType[i] == genericPeriod) && ( (words[pos].at(0)).isDigit() )) { _listPeriodStr.push_back(words[pos]); parserGenericPeriodString(i); @@ -305,7 +311,8 @@ void Crit3DClimateList::parserElaboration() if (words.size() == pos) { - _listClimateElab.replace(i, "NULL"); + errorStr += "Missing parameters in line: " + climateElab + "\n"; + _listClimateElab.replace(i, "NULL"); continue; } @@ -314,6 +321,12 @@ void Crit3DClimateList::parserElaboration() QString param1ClimateField; meteoComputation elabMeteoComputation = getMeteoCompFromString(MapMeteoComputation, elab.toStdString()); + if (elabMeteoComputation == noMeteoComp) + { + errorStr += "Wrong elaboration: " + elab + "\n"; + _listClimateElab.replace(i, "NULL"); + continue; + } float param = NODATA; int nrParam = nParameters(elabMeteoComputation); @@ -343,7 +356,6 @@ void Crit3DClimateList::parserElaboration() } else { - param1IsClimate = false; param1ClimateField = ""; param = words[pos].toFloat(); @@ -368,6 +380,14 @@ void Crit3DClimateList::parserElaboration() elab1 = words[pos]; _listElab1.push_back(elab1); elabMeteoComputation = getMeteoCompFromString(MapMeteoComputation, elab1.toStdString()); + + if (elabMeteoComputation == noMeteoComp) + { + errorStr += "Wrong elaboration: " + elab1 + "\n"; + _listClimateElab.replace(i, "NULL"); + continue; + } + nrParam = nParameters(elabMeteoComputation); if (nrParam > 0) @@ -422,9 +442,7 @@ void Crit3DClimateList::parserElaboration() _listParam1IsClimate.push_back(param1IsClimate); _listParam1ClimateField.push_back(param1ClimateField); } - } - } diff --git a/climate/crit3dClimateList.h b/climate/crit3dClimateList.h index 1a3226517..1edd367eb 100644 --- a/climate/crit3dClimateList.h +++ b/climate/crit3dClimateList.h @@ -100,7 +100,7 @@ std::vector listParam2() const; void setListParam2(const std::vector &listParam2); - void parserElaboration(); + void parserElaboration(QString &errorStr); bool parserGenericPeriodString(int index); void insertDailyCumulated(bool dailyCumulated); diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index fe1f19361..9c65e0b7b 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -620,7 +620,14 @@ void PragaProject::readClimate(bool isMeteoGrid, QString climateSelected, int cl climate.push_back(climateSelected); climateList.setListClimateElab(climate); - climateList.parserElaboration(); + + errorString = ""; + climateList.parserElaboration(errorString); + if (! errorString.isEmpty()) + { + logError(); + errorString = ""; + } // copy elaboration to clima clima->setYearStart(climateList.listYearStart().at(0)); @@ -1045,7 +1052,14 @@ bool PragaProject::climatePointsCycle(bool showInfo) } // parser all the list Crit3DClimateList* climateList = clima->getListElab(); - climateList->parserElaboration(); + + errorString = ""; + climateList->parserElaboration(errorString); + if (! errorString.isEmpty()) + { + logError(); + errorString = ""; + } Crit3DMeteoPoint* meteoPointTemp = new Crit3DMeteoPoint; for (int i = 0; i < nrMeteoPoints; i++) @@ -1166,7 +1180,14 @@ bool PragaProject::climatePointsCycleGrid(bool showInfo) // parser all the list Crit3DClimateList* climateList = clima->getListElab(); - climateList->parserElaboration(); + + errorString = ""; + climateList->parserElaboration(errorString); + if (! errorString.isEmpty()) + { + logError(); + errorString = ""; + } Crit3DMeteoPoint* meteoPointTemp = new Crit3DMeteoPoint; for (int row = 0; row < meteoGridDbHandler->gridStructure().header().nrRows; row++) diff --git a/pragaProject/saveClimaLayout.cpp b/pragaProject/saveClimaLayout.cpp index 198b3b709..2a81d5004 100644 --- a/pragaProject/saveClimaLayout.cpp +++ b/pragaProject/saveClimaLayout.cpp @@ -1,6 +1,9 @@ #include "saveClimaLayout.h" -bool compareClimateElab(const QString &el1, const QString &el2) { +bool compareClimateElab(const QString &el1, const QString &el2) +{ + if (! el1.contains('_') || ! el2.contains('_')) + return false; QString var1 = el1.split("_")[1]; QString var2 = el2.split("_")[1]; @@ -8,12 +11,17 @@ bool compareClimateElab(const QString &el1, const QString &el2) { if (var1 != var2) return var1.compare(var2) < 0; - return (el1.mid(5, 9).toInt() - el1.left(4).toInt()) > (el2.mid(5, 9).toInt() - el2.left(4).toInt()); + if (el1.size() < 9 || el2.size() < 9) + return false; + + int period1 = el1.mid(5, 4).toInt() - el1.left(4).toInt(); + int period2 = el2.mid(5, 4).toInt() - el2.left(4).toInt(); + return (period1 > period2); } + SaveClimaLayout::SaveClimaLayout() { - listLayout.addWidget(&listView); saveList.setText("Save list"); @@ -31,10 +39,9 @@ SaveClimaLayout::SaveClimaLayout() } + void SaveClimaLayout::addElab() { - - QString elabAdded = firstYear + "-" + lastYear + "_" + variable.remove("_") + "_" + period; if (period == "Generic") { @@ -73,9 +80,9 @@ void SaveClimaLayout::addElab() listView.clear(); listView.addItems(list); - } + void SaveClimaLayout::deleteRaw() { if (listView.selectedItems().size()==0) @@ -110,41 +117,36 @@ void SaveClimaLayout::saveElabList() return; } elabList.close(); - } + void SaveClimaLayout::loadElabList() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Open elaborations file"), "", tr("(*.txt)")); - if (fileName == "") return; + if (fileName.isEmpty()) + return; QFile elabList(fileName); - if (elabList.open(QFile::ReadOnly | QFile::Text)) - { - QTextStream sIn(&elabList); - while (!sIn.atEnd()) - { - QString line = sIn.readLine(); - if (list.contains(line) == 0) - { - list << line; - } - } - std::sort(list.begin(), list.end(), compareClimateElab); - - listView.clear(); - listView.addItems(list); + if (! elabList.open(QFile::ReadOnly | QFile::Text)) + return; - } - else + QTextStream sIn(&elabList); + while (! sIn.atEnd()) { - qDebug() << "error opening output file\n"; - return; + QString line = sIn.readLine(); + if (!line.isEmpty() && !list.contains(line)) + { + list << line; + } } + std::sort(list.begin(), list.end(), compareClimateElab); + + listView.clear(); + listView.addItems(list); } + QList SaveClimaLayout::getList() const { return list; From 9429831439776b5fd99546cdda8818d2110e5267 Mon Sep 17 00:00:00 2001 From: ftomei Date: Tue, 27 Feb 2024 19:49:17 +0100 Subject: [PATCH 10/25] fix show climate --- climate/climate.cpp | 20 ++++++++++---------- climate/dbClimate.cpp | 28 +++++++++++++++++----------- climate/dbClimate.h | 2 +- pragaProject/pragaProject.cpp | 14 ++++++-------- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/climate/climate.cpp b/climate/climate.cpp index 540c58d88..5f5cfeeb0 100644 --- a/climate/climate.cpp +++ b/climate/climate.cpp @@ -32,7 +32,7 @@ bool elaborationOnPoint(QString *myError, Crit3DMeteoPointsDbHandler* meteoPoint int index = clima->getParam1ClimateIndex(); if (index != NODATA) { - float param = readElab(clima->db(), table, index, QString::fromStdString(meteoPointTemp->id), clima->param1ClimateField(), myError); + float param = readClimateElab(clima->db(), table, index, QString::fromStdString(meteoPointTemp->id), clima->param1ClimateField(), myError); clima->setParam1(param); } else @@ -138,7 +138,7 @@ bool passingClimateToAnomaly(QString *myError, Crit3DMeteoPoint* meteoPointTemp, float valueClimate; QString table = getTable(clima->climateElab()); int index = clima->getParam1ClimateIndex(); - valueClimate = readElab(clima->db(), table, index, QString::fromStdString(meteoPointTemp->id), clima->climateElab(), myError); + valueClimate = readClimateElab(clima->db(), table, index, QString::fromStdString(meteoPointTemp->id), clima->climateElab(), myError); if (index != NODATA && valueClimate != NODATA) { // MP found @@ -194,7 +194,7 @@ bool passingClimateToAnomaly(QString *myError, Crit3DMeteoPoint* meteoPointTemp, if (minDist != NODATA) { - valueClimate = readElab(clima->db(), table, index, idNearMP, clima->climateElab(), myError); + valueClimate = readClimateElab(clima->db(), table, index, idNearMP, clima->climateElab(), myError); if (index != NODATA && valueClimate != NODATA) { return anomalyOnPoint(meteoPointTemp, valueClimate); @@ -215,7 +215,7 @@ bool passingClimateToAnomalyGrid(QString *myError, Crit3DMeteoPoint* meteoPointT float valueClimate; QString table = getTable(clima->climateElab()); int index = clima->getParam1ClimateIndex(); - valueClimate = readElab(clima->db(), table, index, QString::fromStdString(meteoPointTemp->id), clima->climateElab(), myError); + valueClimate = readClimateElab(clima->db(), table, index, QString::fromStdString(meteoPointTemp->id), clima->climateElab(), myError); if (index != NODATA && valueClimate != NODATA) { // MP found @@ -355,7 +355,7 @@ bool climateTemporalCycle(QString *myError, Crit3DClimate* clima, std::vectorparam1ClimateField()); if (climateIndex != NODATA) { - paramValue = readElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); + paramValue = readClimateElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); clima->setParam1(paramValue); } else @@ -417,7 +417,7 @@ bool climateTemporalCycle(QString *myError, Crit3DClimate* clima, std::vectorparam1ClimateField()); if (climateIndex != NODATA) { - paramValue = readElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); + paramValue = readClimateElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); clima->setParam1(paramValue); } else @@ -466,7 +466,7 @@ bool climateTemporalCycle(QString *myError, Crit3DClimate* clima, std::vectorid), clima->param1ClimateField(), myError); + paramValue = readClimateElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); clima->setParam1(paramValue); } else @@ -531,7 +531,7 @@ bool climateTemporalCycle(QString *myError, Crit3DClimate* clima, std::vectorid), clima->param1ClimateField(), myError); + paramValue = readClimateElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); clima->setParam1(paramValue); } else @@ -573,7 +573,7 @@ bool climateTemporalCycle(QString *myError, Crit3DClimate* clima, std::vectorid), clima->param1ClimateField(), myError); + paramValue = readClimateElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); clima->setParam1(paramValue); } else @@ -607,7 +607,7 @@ bool climateTemporalCycle(QString *myError, Crit3DClimate* clima, std::vectorparam1ClimateField()); if (climateIndex != NODATA) { - paramValue = readElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); + paramValue = readClimateElab(db, table, climateIndex, QString::fromStdString(meteoPoint->id), clima->param1ClimateField(), myError); clima->setParam1(paramValue); } else diff --git a/climate/dbClimate.cpp b/climate/dbClimate.cpp index 272e76dac..649df1485 100644 --- a/climate/dbClimate.cpp +++ b/climate/dbClimate.cpp @@ -70,30 +70,36 @@ bool deleteElab(QSqlDatabase db, QString *myError, QString table, QString elab) } -float readElab(const QSqlDatabase &db, const QString &table, const int &timeIndex, const QString &id, const QString &elab, QString *myError) +float readClimateElab(const QSqlDatabase &db, const QString &table, const int &timeIndex, + const QString &id, const QString &elab, QString *myError) { *myError = ""; QSqlQuery qry(db); QString statement = QString("SELECT * FROM `%1` ").arg(table); - qry.prepare( statement + " WHERE TimeIndex= :TimeIndex AND id_point = :id_point AND elab = :elab" ); + if (table == "climate_annual" || table == "climate_generic") + { + qry.prepare( statement + " WHERE id_point = :id_point AND elab = :elab" ); + } + else + { + qry.prepare( statement + " WHERE TimeIndex= :TimeIndex AND id_point = :id_point AND elab = :elab" ); + qry.bindValue(":TimeIndex", timeIndex); + } - qry.bindValue(":TimeIndex", timeIndex); qry.bindValue(":id_point", id); qry.bindValue(":elab", elab); - - float value = NODATA; - if( !qry.exec() ) + if(! qry.exec() ) { *myError = qry.lastError().text(); + return NODATA; } - else + + float value = NODATA; + if (qry.next()) { - if (qry.next()) - { - getValue(qry.value("value"), &value); - } + getValue(qry.value("value"), &value); } return value; diff --git a/climate/dbClimate.h b/climate/dbClimate.h index 63f98afdf..864ef6f1d 100644 --- a/climate/dbClimate.h +++ b/climate/dbClimate.h @@ -22,7 +22,7 @@ bool deleteElab(QSqlDatabase db, QString *myError, QString table, QString elab); - float readElab(const QSqlDatabase &db, const QString &table, const int &timeIndex, const QString &id, const QString &elab, QString *myError); + float readClimateElab(const QSqlDatabase &db, const QString &table, const int &timeIndex, const QString &id, const QString &elab, QString *myError); QList getIdListFromElab(QSqlDatabase db, QString table, QString *myError, QString elab); QList getIdListFromElab(QSqlDatabase db, QString table, QString *myError, QString elab, int index); diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index 9c65e0b7b..0772699d1 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -673,7 +673,7 @@ void PragaProject::readClimate(bool isMeteoGrid, QString climateSelected, int cl Crit3DMeteoPoint* meteoPoint = meteoGridDbHandler->meteoGrid()->meteoPointPointer(row,col); if (climateIndex != NODATA) { - result = readElab(db, table.toLower(), climateIndex, QString::fromStdString(meteoPoint->id), climateSelected, &errorString); + result = readClimateElab(db, table.toLower(), climateIndex, QString::fromStdString(meteoPoint->id), climateSelected, &errorString); meteoPoint->climate = result; } else @@ -709,7 +709,7 @@ void PragaProject::readClimate(bool isMeteoGrid, QString climateSelected, int cl } else { - result = readElab(db, table.toLower(), climateIndex, id, climateSelected, &errorString); + result = readClimateElab(db, table.toLower(), climateIndex, id, climateSelected, &errorString); meteoPoints[i].climate = result; } } @@ -1983,11 +1983,11 @@ bool PragaProject::interpolationOutputPointsPeriod(QDate firstDate, QDate lastDa QVector> hourlyDataList; if (isDaily) { - dailyDataList.resize(outputPoints.size()); + dailyDataList.resize(int(outputPoints.size())); } if (isHourly) { - hourlyDataList.resize(outputPoints.size()); + hourlyDataList.resize(int(outputPoints.size())); } int nrDays = firstDate.daysTo(lastDate) + 1; @@ -3775,18 +3775,16 @@ bool PragaProject::cleanClimatePoint() QList climateTables; QList climateFields; - unsigned i,j; - if (getClimateTables(db, &errorString, &climateTables) ) { - for (i=0; i < climateTables.size(); i++) + for (int i = 0; i < climateTables.size(); i++) { climateFields.clear(); getClimateFieldsFromTable(db, &errorString, climateTables[i], &climateFields); if (! climateFields.isEmpty()) { - for (j=0; j < climateFields.size(); j++) + for (int j = 0; j < climateFields.size(); j++) if (! deleteElab(db, &errorString, climateTables[i].toLower(), climateFields[j])) return false; } From c72f9ae23400c243405da95b9a9a1490a9820232 Mon Sep 17 00:00:00 2001 From: Antonio Volta Date: Wed, 28 Feb 2024 10:44:53 +0100 Subject: [PATCH 11/25] test local Detrending veloce output solo nodata --- interpolation/interpolation.cpp | 6 +++--- mathFunctions/furtherMathFunctions.cpp | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/interpolation/interpolation.cpp b/interpolation/interpolation.cpp index 3e6f3c87d..56964a333 100644 --- a/interpolation/interpolation.cpp +++ b/interpolation/interpolation.cpp @@ -1513,11 +1513,11 @@ bool multipleDetrending(std::vector &myPoints, Cr setFittingParameters(myCombination, mySettings, myFunc, parametersMin, parametersMax, parametersDelta, parameters); // multiple non linear fitting + /*interpolation::bestFittingMarquardt_nDimension(&functionSum, myFunc, 4, 3, parametersMin, parametersMax, parameters, parametersDelta, + 20, 0.05, 0.02, predictors, predictands, false, weights);*/ interpolation::bestFittingMarquardt_nDimension(&functionSum, myFunc, 10000, 5, parametersMin, parametersMax, parameters, parametersDelta, - 100, 0.0001, 0.02, predictors, predictands, false, weights); - /*interpolation::bestFittingMarquardt_nDimension(&functionSum, myFunc, 10000, 5, parametersMin, parametersMax, parameters, parametersDelta, 100, EPSILON, 0.01, predictors, predictands, false, weights); - */ + mySettings->setFittingFunction(myFunc); mySettings->setFittingParameters(parameters); diff --git a/mathFunctions/furtherMathFunctions.cpp b/mathFunctions/furtherMathFunctions.cpp index 7b5fc29f7..3f344c109 100644 --- a/mathFunctions/furtherMathFunctions.cpp +++ b/mathFunctions/furtherMathFunctions.cpp @@ -1064,19 +1064,19 @@ namespace interpolation //int iRandom = 0; int counter = 0; - //srand (unsigned(time(nullptr))); - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_real_distribution dis(0.0, 1.0); - //double randomNumber; + srand (unsigned(time(nullptr))); + //std::random_device rd; + //std::mt19937 gen(rd()); + //std::uniform_real_distribution dis(0.0, 1.0); + double randomNumber; do { for (i=0; i Date: Wed, 28 Feb 2024 12:12:39 +0100 Subject: [PATCH 12/25] add menu exportxml meteoPoint --- importDataXML/importDataXML.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/importDataXML/importDataXML.cpp b/importDataXML/importDataXML.cpp index 44cf2913e..16c82d996 100644 --- a/importDataXML/importDataXML.cpp +++ b/importDataXML/importDataXML.cpp @@ -81,15 +81,15 @@ bool ImportDataXML::parserXML(QString *myError) if (mySecondTag == "PRAGANAME" || mySecondTag == "PRAGAFIELD") { - fileName_pragaName[fileName_pragaName.size()-1] = secondChild.toElement().text(); + fileName_pragaName.append(secondChild.toElement().text()); } else if (mySecondTag == "TEXT" || mySecondTag == "FIXEDTEXT") { - fileName_fixedText[fileName_fixedText.size()-1] = secondChild.toElement().text(); + fileName_fixedText.append(secondChild.toElement().text()); } else if (mySecondTag == "NRCHAR" || mySecondTag == "NR_CHAR") { - fileName_nrChar[fileName_nrChar.size()-1] = secondChild.toElement().text().toInt(); + fileName_nrChar.append(secondChild.toElement().text().toInt()); } } From c7f572f1d3f72f268d7eedbed8f9da15485cf481 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Wed, 28 Feb 2024 12:59:28 +0100 Subject: [PATCH 13/25] rename importDataXML with inOutDataXML --- {importDataXML => inOutDataXML}/fieldXML.cpp | 0 {importDataXML => inOutDataXML}/fieldXML.h | 0 .../inOutDataXML.cpp | 24 +++++++++---------- .../inOutDataXML.h | 10 ++++---- .../inOutDataXML.pro | 12 +++++----- .../variableXML.cpp | 0 {importDataXML => inOutDataXML}/variableXML.h | 0 pragaProject/pragaProject.cpp | 4 ++-- pragaProject/pragaProject.h | 6 ++--- pragaProject/pragaProject.pro | 2 +- project/project.pro | 2 +- 11 files changed, 30 insertions(+), 30 deletions(-) rename {importDataXML => inOutDataXML}/fieldXML.cpp (100%) rename {importDataXML => inOutDataXML}/fieldXML.h (100%) rename importDataXML/importDataXML.cpp => inOutDataXML/inOutDataXML.cpp (98%) rename importDataXML/importDataXML.h => inOutDataXML/inOutDataXML.h (85%) rename importDataXML/importDataXML.pro => inOutDataXML/inOutDataXML.pro (72%) rename {importDataXML => inOutDataXML}/variableXML.cpp (100%) rename {importDataXML => inOutDataXML}/variableXML.h (100%) diff --git a/importDataXML/fieldXML.cpp b/inOutDataXML/fieldXML.cpp similarity index 100% rename from importDataXML/fieldXML.cpp rename to inOutDataXML/fieldXML.cpp diff --git a/importDataXML/fieldXML.h b/inOutDataXML/fieldXML.h similarity index 100% rename from importDataXML/fieldXML.h rename to inOutDataXML/fieldXML.h diff --git a/importDataXML/importDataXML.cpp b/inOutDataXML/inOutDataXML.cpp similarity index 98% rename from importDataXML/importDataXML.cpp rename to inOutDataXML/inOutDataXML.cpp index 16c82d996..a32c84d5d 100644 --- a/importDataXML/importDataXML.cpp +++ b/inOutDataXML/inOutDataXML.cpp @@ -1,4 +1,4 @@ -#include "importDataXML.h" +#include "inOutDataXML.h" #include "commonConstants.h" #include #include @@ -6,7 +6,7 @@ -ImportDataXML::ImportDataXML(bool isGrid, Crit3DMeteoPointsDbHandler *meteoPointsDbHandler, Crit3DMeteoGridDbHandler *meteoGridDbHandler, QString xmlFileName) +InOutDataXML::InOutDataXML(bool isGrid, Crit3DMeteoPointsDbHandler *meteoPointsDbHandler, Crit3DMeteoGridDbHandler *meteoGridDbHandler, QString xmlFileName) { this->isGrid = isGrid; this->xmlFileName = xmlFileName; @@ -15,7 +15,7 @@ ImportDataXML::ImportDataXML(bool isGrid, Crit3DMeteoPointsDbHandler *meteoPoint this->format_headerRow = 0; } -bool ImportDataXML::parseXMLFile(QDomDocument* xmlDoc, QString *errorStr) +bool InOutDataXML::parseXMLFile(QDomDocument* xmlDoc, QString *errorStr) { if (xmlFileName == "") { @@ -46,7 +46,7 @@ bool ImportDataXML::parseXMLFile(QDomDocument* xmlDoc, QString *errorStr) return true; } -bool ImportDataXML::parserXML(QString *myError) +bool InOutDataXML::parserXML(QString *myError) { QDomDocument xmlDoc; if (!parseXMLFile(&xmlDoc, myError)) return false; @@ -416,7 +416,7 @@ bool ImportDataXML::parserXML(QString *myError) } -bool ImportDataXML::importDataMain(QString fileName, QString& errorStr) +bool InOutDataXML::importDataMain(QString fileName, QString& errorStr) { if (fileName == "") { @@ -436,7 +436,7 @@ bool ImportDataXML::importDataMain(QString fileName, QString& errorStr) } -bool ImportDataXML::checkPointCodeFromFileName(QString& myPointCode, QString& errorStr) +bool InOutDataXML::checkPointCodeFromFileName(QString& myPointCode, QString& errorStr) { myPointCode = ""; @@ -483,7 +483,7 @@ bool ImportDataXML::checkPointCodeFromFileName(QString& myPointCode, QString& er } -bool ImportDataXML::importXMLDataFixed(QString& errorStr) +bool InOutDataXML::importXMLDataFixed(QString& errorStr) { QFile myFile(dataFileName); if (!myFile.open(QIODevice::ReadOnly)) @@ -785,7 +785,7 @@ bool ImportDataXML::importXMLDataFixed(QString& errorStr) } -bool ImportDataXML::importXMLDataDelimited(QString& errorStr) +bool InOutDataXML::importXMLDataDelimited(QString& errorStr) { QFile myFile(dataFileName); if ( !myFile.open(QIODevice::ReadOnly) ) @@ -1132,7 +1132,7 @@ bool ImportDataXML::importXMLDataDelimited(QString& errorStr) } -QString ImportDataXML::parseXMLPointCode(QString text) +QString InOutDataXML::parseXMLPointCode(QString text) { QString myPointCode = ""; @@ -1169,7 +1169,7 @@ QString ImportDataXML::parseXMLPointCode(QString text) return myPointCode; } -QDate ImportDataXML::parseXMLDate(QString text) +QDate InOutDataXML::parseXMLDate(QString text) { QDate myDate(1800,1,1); @@ -1181,7 +1181,7 @@ QDate ImportDataXML::parseXMLDate(QString text) } -QDateTime ImportDataXML::parseXMLDateTime(QString text) +QDateTime InOutDataXML::parseXMLDateTime(QString text) { QString myDateStr = text.mid(time.getFirstChar()-1,time.getNrChar()); QString format = time.getFormat(); @@ -1193,7 +1193,7 @@ QDateTime ImportDataXML::parseXMLDateTime(QString text) } -QVariant ImportDataXML::parseXMLFixedValue(QString text, int nReplication, FieldXML myField) +QVariant InOutDataXML::parseXMLFixedValue(QString text, int nReplication, FieldXML myField) { QVariant myValue = "ERROR"; QString mySubstring; diff --git a/importDataXML/importDataXML.h b/inOutDataXML/inOutDataXML.h similarity index 85% rename from importDataXML/importDataXML.h rename to inOutDataXML/inOutDataXML.h index e7f36a58a..2bbcab2e0 100644 --- a/importDataXML/importDataXML.h +++ b/inOutDataXML/inOutDataXML.h @@ -1,5 +1,5 @@ -#ifndef IMPORTDATAXML_H -#define IMPORTDATAXML_H +#ifndef INOUTDATAXML_H +#define INOUTDATAXML_H #ifndef QDOM_H #include @@ -16,10 +16,10 @@ enum formatType{ XMLFORMATFIXED, XMLFORMATDELIMITED}; -class ImportDataXML +class InOutDataXML { public: - ImportDataXML(bool isGrid, Crit3DMeteoPointsDbHandler* meteoPointsDbHandler, Crit3DMeteoGridDbHandler* meteoGridDbHandler, QString xmlFileName); + InOutDataXML(bool isGrid, Crit3DMeteoPointsDbHandler* meteoPointsDbHandler, Crit3DMeteoGridDbHandler* meteoGridDbHandler, QString xmlFileName); bool parseXMLFile(QDomDocument* xmlDoc, QString *error); bool parserXML(QString *error); bool importDataMain(QString fileName, QString &error); @@ -55,4 +55,4 @@ class ImportDataXML bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); }; -#endif // IMPORTDATAXML_H +#endif // INOUTDATAXML_H diff --git a/importDataXML/importDataXML.pro b/inOutDataXML/inOutDataXML.pro similarity index 72% rename from importDataXML/importDataXML.pro rename to inOutDataXML/inOutDataXML.pro index cd786f2df..2d955601c 100644 --- a/importDataXML/importDataXML.pro +++ b/inOutDataXML/inOutDataXML.pro @@ -1,6 +1,6 @@ #------------------------------------------------- # -# ImportDataXML library +# Import Export DataXML library # #------------------------------------------------- @@ -15,23 +15,23 @@ CONFIG += c++11 c++14 c++17 unix:{ CONFIG(debug, debug|release) { - TARGET = debug/importDataXML + TARGET = debug/inOutDataXML } else { - TARGET = release/importDataXML + TARGET = release/inOutDataXML } } win32:{ - TARGET = importDataXML + TARGET = inOutDataXML } INCLUDEPATH += ../crit3dDate ../mathFunctions ../meteo ../gis ../interpolation ../dbMeteoPoints ../dbMeteoGrid -SOURCES += importDataXML.cpp \ +SOURCES += inOutDataXML.cpp \ fieldXML.cpp \ variableXML.cpp -HEADERS += importDataXML.h \ +HEADERS += inOutDataXML.h \ fieldXML.h \ variableXML.h diff --git a/importDataXML/variableXML.cpp b/inOutDataXML/variableXML.cpp similarity index 100% rename from importDataXML/variableXML.cpp rename to inOutDataXML/variableXML.cpp diff --git a/importDataXML/variableXML.h b/inOutDataXML/variableXML.h similarity index 100% rename from importDataXML/variableXML.h rename to inOutDataXML/variableXML.h diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index 0772699d1..8bedb0151 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3218,11 +3218,11 @@ bool PragaProject::parserXMLImportData(QString xmlName, bool isGrid) } if (isGrid) { - importData = new ImportDataXML(isGrid, nullptr, meteoGridDbHandler, xmlName); + importData = new InOutDataXML(isGrid, nullptr, meteoGridDbHandler, xmlName); } else { - importData = new ImportDataXML(isGrid, meteoPointsDbHandler, nullptr, xmlName); + importData = new InOutDataXML(isGrid, meteoPointsDbHandler, nullptr, xmlName); } errorString = ""; diff --git a/pragaProject/pragaProject.h b/pragaProject/pragaProject.h index 21cfffb07..b6a7683b7 100644 --- a/pragaProject/pragaProject.h +++ b/pragaProject/pragaProject.h @@ -21,8 +21,8 @@ #include "netcdfHandler.h" #endif - #ifndef IMPORTDATAXML_H - #include "importDataXML.h" + #ifndef INOUTDATAXML_H + #include "inOutDataXML.h" #endif #ifndef DROUGHT_H @@ -76,7 +76,7 @@ std::string synchReferencePoint; - ImportDataXML* importData; + InOutDataXML* importData; Crit3DMeteoPointsDbHandler* outputMeteoPointsDbHandler; bool outputMeteoPointsLoaded; diff --git a/pragaProject/pragaProject.pro b/pragaProject/pragaProject.pro index 32b74ca0e..daa9870c9 100644 --- a/pragaProject/pragaProject.pro +++ b/pragaProject/pragaProject.pro @@ -33,7 +33,7 @@ INCLUDEPATH += ../crit3dDate ../mathFunctions ../phenology ../meteo ../gis \ ../drought ../interpolation ../solarRadiation ../utilities \ ../outputPoints ../dbMeteoPoints ../dbMeteoGrid ../meteoWidget \ ../proxyWidget ../pointStatisticsWidget ../homogeneityWidget ../synchronicityWidget ../climate ../netcdfHandler \ - ../graphics ../commonDialogs ../commonChartElements ../pragaDialogs ../importDataXML ../project + ../graphics ../commonDialogs ../commonChartElements ../pragaDialogs ../inOutDataXML ../project SOURCES += \ diff --git a/project/project.pro b/project/project.pro index 16ab33dce..1c40de9e4 100644 --- a/project/project.pro +++ b/project/project.pro @@ -30,7 +30,7 @@ win32:{ INCLUDEPATH += ../crit3dDate ../mathFunctions ../gis ../meteo \ ../solarRadiation ../interpolation ../utilities \ ../netcdfHandler ../dbMeteoPoints ../outputPoints ../dbMeteoGrid \ - ../meteoWidget ../commonDialogs ../commonChartElements ../climate ../proxyWidget ../importDataXML + ../meteoWidget ../commonDialogs ../commonChartElements ../climate ../proxyWidget ../inOutDataXML SOURCES += \ From ff3df1848e3bbccff1acc9c328401c4f952b7f76 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Wed, 28 Feb 2024 14:29:28 +0100 Subject: [PATCH 14/25] rename importData with inOutData --- pragaProject/pragaProject.cpp | 16 ++++++++++------ pragaProject/pragaProject.h | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index 8bedb0151..4b08a5d97 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3209,27 +3209,31 @@ bool PragaProject::loadForecastToGrid(QString fileName, bool overWrite, bool che } */ -bool PragaProject::parserXMLImportData(QString xmlName, bool isGrid) +bool PragaProject::parserXMLImportExportData(QString xmlName, bool isGrid) { if (! QFile(xmlName).exists() || ! QFileInfo(xmlName).isFile()) { logError("Missing file: " + xmlName); return false; } + if (inOutData) + { + delete inOutData; + } if (isGrid) { - importData = new InOutDataXML(isGrid, nullptr, meteoGridDbHandler, xmlName); + inOutData = new InOutDataXML(isGrid, nullptr, meteoGridDbHandler, xmlName); } else { - importData = new InOutDataXML(isGrid, meteoPointsDbHandler, nullptr, xmlName); + inOutData = new InOutDataXML(isGrid, meteoPointsDbHandler, nullptr, xmlName); } errorString = ""; - if (!importData->parserXML(&errorString)) + if (!inOutData->parserXML(&errorString)) { logError(errorString); - delete importData; + delete inOutData; return false; } return true; @@ -3245,7 +3249,7 @@ bool PragaProject::loadXMLImportData(QString fileName) } errorString = ""; - if (!importData->importDataMain(fileName, errorString)) + if (!inOutData->importDataMain(fileName, errorString)) { logError(errorString); return false; diff --git a/pragaProject/pragaProject.h b/pragaProject/pragaProject.h index b6a7683b7..62c573ab3 100644 --- a/pragaProject/pragaProject.h +++ b/pragaProject/pragaProject.h @@ -76,7 +76,7 @@ std::string synchReferencePoint; - InOutDataXML* importData; + InOutDataXML* inOutData; Crit3DMeteoPointsDbHandler* outputMeteoPointsDbHandler; bool outputMeteoPointsLoaded; @@ -137,7 +137,7 @@ bool dbMeteoGridMissingData(QDate myFirstDate, QDate myLastDate, meteoVariable myVar, QList &dateList, QList &idList); int executePragaCommand(QList argumentList, bool* isCommandFound); - bool parserXMLImportData(QString xmlName, bool isGrid); + bool parserXMLImportExportData(QString xmlName, bool isGrid); bool loadXMLImportData(QString fileName); bool monthlyAggregateVariablesGrid(const QDate &firstDate, const QDate &lastDate, QList &variablesList); bool computeDroughtIndexAll(droughtIndex index, int firstYear, int lastYear, QDate date, int timescale, meteoVariable myVar); From 71a7945ea4c724912166282aa6997ca17109ca90 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Wed, 28 Feb 2024 16:11:11 +0100 Subject: [PATCH 15/25] loadXMLExportData TO DO --- inOutDataXML/inOutDataXML.h | 3 +-- pragaProject/pragaProject.cpp | 18 ++++++++++++++++++ pragaProject/pragaProject.h | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/inOutDataXML/inOutDataXML.h b/inOutDataXML/inOutDataXML.h index 2bbcab2e0..04d017f50 100644 --- a/inOutDataXML/inOutDataXML.h +++ b/inOutDataXML/inOutDataXML.h @@ -29,6 +29,7 @@ class InOutDataXML QString parseXMLPointCode(QString text); QDate parseXMLDate(QString text); QVariant parseXMLFixedValue(QString text, int nReplication, FieldXML myField); + bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); private: bool isGrid; @@ -51,8 +52,6 @@ class InOutDataXML QList variable; QString dataFileName; int numVarFields; - - bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); }; #endif // INOUTDATAXML_H diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index 4b08a5d97..b01d009b5 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3258,6 +3258,24 @@ bool PragaProject::loadXMLImportData(QString fileName) return true; } +bool PragaProject::loadXMLExportData(QString filename) +{ + qDebug() << "loadXMLExportData"; + qDebug() << "filename " << filename; +/* + errorString = ""; + QString myPointCode = inOutData->parseXMLPointCode(filename); + if (myPointCode.isEmpty()) + { + qDebug() << "ERROR"; + logError(errorString); + return false; + } + qDebug() << "myPointCode " << myPointCode; +*/ + + return true; +} bool PragaProject::monthlyAggregateVariablesGrid(const QDate &firstDate, const QDate &lastDate, QList &variablesList) { diff --git a/pragaProject/pragaProject.h b/pragaProject/pragaProject.h index 62c573ab3..63a927051 100644 --- a/pragaProject/pragaProject.h +++ b/pragaProject/pragaProject.h @@ -139,6 +139,7 @@ int executePragaCommand(QList argumentList, bool* isCommandFound); bool parserXMLImportExportData(QString xmlName, bool isGrid); bool loadXMLImportData(QString fileName); + bool loadXMLExportData(QString filename); bool monthlyAggregateVariablesGrid(const QDate &firstDate, const QDate &lastDate, QList &variablesList); bool computeDroughtIndexAll(droughtIndex index, int firstYear, int lastYear, QDate date, int timescale, meteoVariable myVar); bool computeDroughtIndexPoint(droughtIndex index, int timescale, int refYearStart, int refYearEnd); From 9681683d2f9bd84db73ebb68f4bf59d07ec63d98 Mon Sep 17 00:00:00 2001 From: ftomei Date: Wed, 28 Feb 2024 19:55:53 +0100 Subject: [PATCH 16/25] fix label --- meteoWidget/meteoWidget.cpp | 92 ++++++++++++++++++++++--------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/meteoWidget/meteoWidget.cpp b/meteoWidget/meteoWidget.cpp index e317ad458..5e1e63387 100644 --- a/meteoWidget/meteoWidget.cpp +++ b/meteoWidget/meteoWidget.cpp @@ -180,7 +180,7 @@ Crit3DMeteoWidget::Crit3DMeteoWidget(bool isGrid_, QString projectPath, Crit3DMe // check valid data int dailyVar = 0; int hourlyVar = 0; - for (int i = 0; i words = pointName.split(' '); + + if (words.size() == 1) + { + int size = std::min(int(words[0].size()), 12); + pointName = words[0].left(size); + } + else + { + int last = words.size() - 1; + int size1 = std::min(int(words[0].size()), 7); + int size2 = std::min(int(words[last].size()), 12-size1); + pointName = words[0].left(size1) + '_' + words[last].left(size2); + } + + if (varName.contains("DAILY_")) + { + varName = varName.remove("DAILY_"); + } + + label = pointName + '_' + varName; + + return label; +} + + void Crit3DMeteoWidget::drawEnsemble() { if (! isInitialized || meteoPointsEnsemble.isEmpty() || meteoPointsEnsemble.size() != nrMembers) @@ -521,6 +551,7 @@ void Crit3DMeteoWidget::drawEnsemble() show(); } + void Crit3DMeteoWidget::resetValues() { int nMeteoPoints = meteoPoints.size(); @@ -541,7 +572,7 @@ void Crit3DMeteoWidget::resetValues() } lineSeries.clear(); } - if (!barSeries.isEmpty()) + if (! barSeries.isEmpty()) { for (int mp = 0; mp < barSeries.size(); mp++) { @@ -562,23 +593,16 @@ void Crit3DMeteoWidget::resetValues() { QVector vectorLine; // add lineSeries elements for each mp, clone lineSeries[0] - for (int mp=0; mp elementsName = pointName.split(' '); - if (elementsName.size() == 1) - { - pointName = elementsName[0].left(10); - } - else - { - pointName = elementsName[0].left(5) + elementsName[elementsName.size()-1].left(5); - } - line->setName(QString::fromStdString(meteoPoints[mp].id)+"_"+pointName+"_"+nameLines[i]); + line->setName(getFormattedLabel(pointName, nameLines[i])); + //QColor lineColor = colorLine[i]; QColor lineColor = colorLines[i]; if (nMeteoPoints == 1) @@ -599,28 +623,21 @@ void Crit3DMeteoWidget::resetValues() } } + // possono essere veri entrambi if (isBar) { QVector vectorBarSet; - QString name; // add vectorBarSet elements for each mp - for (int mp=0; mp elementsName = pointName.split(' '); - if (elementsName.size() == 1) - { - pointName = elementsName[0].left(10); - } - else - { - pointName = elementsName[0].left(5) + elementsName[elementsName.size()-1].left(5); - } - name = QString::fromStdString(meteoPoints[mp].id)+"_"+pointName+"_"+nameBar[i]; - QBarSet* set = new QBarSet(name); + QBarSet* bar = new QBarSet(getFormattedLabel(pointName, nameBar[i])); + bar->setLabel(getFormattedLabel(pointName, nameBar[i])); + QColor barColor = colorBar[i]; if (meteoPointsEnsemble.size() == 0) { @@ -632,14 +649,14 @@ void Crit3DMeteoWidget::resetValues() { barColor.setAlpha( 255-(mp*(150/(nMeteoPoints-1))) ); } - set->setColor(barColor); + bar->setColor(barColor); } else { - set->setColor(Qt::transparent); + bar->setColor(Qt::transparent); } - set->setBorderColor(barColor); - vectorBarSet.append(set); + bar->setBorderColor(barColor); + vectorBarSet.append(bar); } if (vectorBarSet.size() != 0) { @@ -905,6 +922,7 @@ void Crit3DMeteoWidget::drawEnsembleDailyVar() formInfo.close(); } + void Crit3DMeteoWidget::drawDailyVar() { if (! isInitialized) return; @@ -1016,7 +1034,7 @@ void Crit3DMeteoWidget::drawDailyVar() if (isBar) { - for (int mp=0; mp Date: Thu, 29 Feb 2024 11:44:39 +0100 Subject: [PATCH 17/25] fix InoutDataXML parser --- inOutDataXML/inOutDataXML.cpp | 18 ++++++++++++++++-- inOutDataXML/inOutDataXML.h | 5 +++-- pragaProject/pragaProject.cpp | 17 ++++++----------- pragaProject/pragaProject.h | 2 +- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/inOutDataXML/inOutDataXML.cpp b/inOutDataXML/inOutDataXML.cpp index a32c84d5d..fd5bb6aac 100644 --- a/inOutDataXML/inOutDataXML.cpp +++ b/inOutDataXML/inOutDataXML.cpp @@ -81,7 +81,7 @@ bool InOutDataXML::parserXML(QString *myError) if (mySecondTag == "PRAGANAME" || mySecondTag == "PRAGAFIELD") { - fileName_pragaName.append(secondChild.toElement().text()); + fileName_pragaName = secondChild.toElement().text(); } else if (mySecondTag == "TEXT" || mySecondTag == "FIXEDTEXT") { @@ -89,8 +89,9 @@ bool InOutDataXML::parserXML(QString *myError) } else if (mySecondTag == "NRCHAR" || mySecondTag == "NR_CHAR") { - fileName_nrChar.append(secondChild.toElement().text().toInt()); + fileName_nrChar = secondChild.toElement().text().toInt(); } + secondChild = secondChild.nextSibling(); } } @@ -1244,3 +1245,16 @@ QVariant InOutDataXML::parseXMLFixedValue(QString text, int nReplication, FieldX } return myValue; } + +QString InOutDataXML::parseXMLFilename(QString code) +{ + QString filename = ""; + if (code.length() > fileName_nrChar) + { + return filename; + } + QString suffix = fileName_fixedText.join(","); + suffix.replace(",",""); + filename = fileName_path + code + suffix; + return filename; +} diff --git a/inOutDataXML/inOutDataXML.h b/inOutDataXML/inOutDataXML.h index 04d017f50..d81ecf57a 100644 --- a/inOutDataXML/inOutDataXML.h +++ b/inOutDataXML/inOutDataXML.h @@ -30,6 +30,7 @@ class InOutDataXML QDate parseXMLDate(QString text); QVariant parseXMLFixedValue(QString text, int nReplication, FieldXML myField); bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); + QString parseXMLFilename(QString code); private: bool isGrid; @@ -43,9 +44,9 @@ class InOutDataXML QString format_delimiter; QString format_decimalSeparator; QString fileName_path; - QList fileName_pragaName; + QString fileName_pragaName; QList fileName_fixedText; - QList fileName_nrChar; + int fileName_nrChar; FieldXML time; FieldXML pointCode; FieldXML variableCode; diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index b01d009b5..f054fa41a 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3228,7 +3228,7 @@ bool PragaProject::parserXMLImportExportData(QString xmlName, bool isGrid) { inOutData = new InOutDataXML(isGrid, meteoPointsDbHandler, nullptr, xmlName); } - +qDebug() << "parserXML call "; errorString = ""; if (!inOutData->parserXML(&errorString)) { @@ -3236,6 +3236,7 @@ bool PragaProject::parserXMLImportExportData(QString xmlName, bool isGrid) delete inOutData; return false; } +qDebug() << "parserXML DONE "; return true; } @@ -3258,22 +3259,16 @@ bool PragaProject::loadXMLImportData(QString fileName) return true; } -bool PragaProject::loadXMLExportData(QString filename) +bool PragaProject::loadXMLExportData(QString code) { - qDebug() << "loadXMLExportData"; - qDebug() << "filename " << filename; -/* errorString = ""; - QString myPointCode = inOutData->parseXMLPointCode(filename); - if (myPointCode.isEmpty()) + QString filename = inOutData->parseXMLFilename(code); + if (filename.isEmpty()) { - qDebug() << "ERROR"; logError(errorString); return false; } - qDebug() << "myPointCode " << myPointCode; -*/ - + qDebug() << "filename " << filename; return true; } diff --git a/pragaProject/pragaProject.h b/pragaProject/pragaProject.h index 63a927051..31078d7b6 100644 --- a/pragaProject/pragaProject.h +++ b/pragaProject/pragaProject.h @@ -139,7 +139,7 @@ int executePragaCommand(QList argumentList, bool* isCommandFound); bool parserXMLImportExportData(QString xmlName, bool isGrid); bool loadXMLImportData(QString fileName); - bool loadXMLExportData(QString filename); + bool loadXMLExportData(QString code); bool monthlyAggregateVariablesGrid(const QDate &firstDate, const QDate &lastDate, QList &variablesList); bool computeDroughtIndexAll(droughtIndex index, int firstYear, int lastYear, QDate date, int timescale, meteoVariable myVar); bool computeDroughtIndexPoint(droughtIndex index, int timescale, int refYearStart, int refYearEnd); From 5ef015c2659c74c169f4f6cddbda3f656509387f Mon Sep 17 00:00:00 2001 From: lauracosta Date: Thu, 29 Feb 2024 12:29:11 +0100 Subject: [PATCH 18/25] getVariable --- inOutDataXML/inOutDataXML.cpp | 10 ++++++++++ inOutDataXML/inOutDataXML.h | 1 + pragaProject/pragaProject.cpp | 2 ++ 3 files changed, 13 insertions(+) diff --git a/inOutDataXML/inOutDataXML.cpp b/inOutDataXML/inOutDataXML.cpp index fd5bb6aac..168877636 100644 --- a/inOutDataXML/inOutDataXML.cpp +++ b/inOutDataXML/inOutDataXML.cpp @@ -1258,3 +1258,13 @@ QString InOutDataXML::parseXMLFilename(QString code) filename = fileName_path + code + suffix; return filename; } + +QStringList InOutDataXML::getVariableList() +{ + QStringList variableList; + for (int i = 0; i < variable.size(); i++) + { + variableList.append(variable[i].varField.getType()); + } + return variableList; +} diff --git a/inOutDataXML/inOutDataXML.h b/inOutDataXML/inOutDataXML.h index d81ecf57a..90ca7b074 100644 --- a/inOutDataXML/inOutDataXML.h +++ b/inOutDataXML/inOutDataXML.h @@ -31,6 +31,7 @@ class InOutDataXML QVariant parseXMLFixedValue(QString text, int nReplication, FieldXML myField); bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); QString parseXMLFilename(QString code); + QStringList getVariableList(); private: bool isGrid; diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index f054fa41a..cc96cb017 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3269,6 +3269,8 @@ bool PragaProject::loadXMLExportData(QString code) return false; } qDebug() << "filename " << filename; + QStringList variableList = inOutData->getVariableList(); + qDebug() << "variableList " << variableList; return true; } From d9bd3100fa4db157902401681cd8a715d687103c Mon Sep 17 00:00:00 2001 From: lauracosta Date: Thu, 29 Feb 2024 14:04:50 +0100 Subject: [PATCH 19/25] get functions --- inOutDataXML/inOutDataXML.cpp | 25 +++++++++++++++++++++++++ inOutDataXML/inOutDataXML.h | 5 +++++ 2 files changed, 30 insertions(+) diff --git a/inOutDataXML/inOutDataXML.cpp b/inOutDataXML/inOutDataXML.cpp index 168877636..44f3d1a11 100644 --- a/inOutDataXML/inOutDataXML.cpp +++ b/inOutDataXML/inOutDataXML.cpp @@ -1268,3 +1268,28 @@ QStringList InOutDataXML::getVariableList() } return variableList; } + +int InOutDataXML::getPointCodeFirstChar() +{ + return pointCode.getFirstChar(); +} + +int InOutDataXML::getVariableCodeFirstChar() +{ + return variableCode.getFirstChar(); +} + +QString InOutDataXML::getVariableCodeAttribute() +{ + return variableCode.getAttribute(); +} + +int InOutDataXML::getTimeFirstChar() +{ + return time.getFirstChar(); +} + +QString InOutDataXML::getTimeFormat() +{ + return time.getFormat(); +} diff --git a/inOutDataXML/inOutDataXML.h b/inOutDataXML/inOutDataXML.h index 90ca7b074..10114cb08 100644 --- a/inOutDataXML/inOutDataXML.h +++ b/inOutDataXML/inOutDataXML.h @@ -32,6 +32,11 @@ class InOutDataXML bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); QString parseXMLFilename(QString code); QStringList getVariableList(); + int getPointCodeFirstChar(); + int getVariableCodeFirstChar(); + QString getVariableCodeAttribute(); + int getTimeFirstChar(); + QString getTimeFormat(); private: bool isGrid; From f4fc1923fd99d25e5cb0cd83b846f04f57c301a0 Mon Sep 17 00:00:00 2001 From: lauracosta Date: Thu, 29 Feb 2024 14:44:37 +0100 Subject: [PATCH 20/25] 1 variable export --- inOutDataXML/inOutDataXML.cpp | 14 +++++++++----- inOutDataXML/inOutDataXML.h | 2 +- pragaProject/pragaProject.cpp | 6 ++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/inOutDataXML/inOutDataXML.cpp b/inOutDataXML/inOutDataXML.cpp index 44f3d1a11..c73a6ee80 100644 --- a/inOutDataXML/inOutDataXML.cpp +++ b/inOutDataXML/inOutDataXML.cpp @@ -1259,14 +1259,18 @@ QString InOutDataXML::parseXMLFilename(QString code) return filename; } -QStringList InOutDataXML::getVariableList() +QString InOutDataXML::getVariableExport() { - QStringList variableList; - for (int i = 0; i < variable.size(); i++) + QString variableExport; + if (variable.size() == 0) { - variableList.append(variable[i].varField.getType()); + variableExport = ""; } - return variableList; + else + { + variableExport = variable[0].varField.getType(); + } + return variableExport; } int InOutDataXML::getPointCodeFirstChar() diff --git a/inOutDataXML/inOutDataXML.h b/inOutDataXML/inOutDataXML.h index 10114cb08..43d194718 100644 --- a/inOutDataXML/inOutDataXML.h +++ b/inOutDataXML/inOutDataXML.h @@ -31,7 +31,7 @@ class InOutDataXML QVariant parseXMLFixedValue(QString text, int nReplication, FieldXML myField); bool checkPointCodeFromFileName(QString& myPointCode, QString& errorStr); QString parseXMLFilename(QString code); - QStringList getVariableList(); + QString getVariableExport(); int getPointCodeFirstChar(); int getVariableCodeFirstChar(); QString getVariableCodeAttribute(); diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index cc96cb017..218199276 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3228,7 +3228,6 @@ bool PragaProject::parserXMLImportExportData(QString xmlName, bool isGrid) { inOutData = new InOutDataXML(isGrid, meteoPointsDbHandler, nullptr, xmlName); } -qDebug() << "parserXML call "; errorString = ""; if (!inOutData->parserXML(&errorString)) { @@ -3236,7 +3235,6 @@ qDebug() << "parserXML call "; delete inOutData; return false; } -qDebug() << "parserXML DONE "; return true; } @@ -3269,8 +3267,8 @@ bool PragaProject::loadXMLExportData(QString code) return false; } qDebug() << "filename " << filename; - QStringList variableList = inOutData->getVariableList(); - qDebug() << "variableList " << variableList; + QString variable = inOutData->getVariableExport(); + qDebug() << "variable " << variable; return true; } From e7b0afbe76a376d7c604fd3c4b597020aeba268c Mon Sep 17 00:00:00 2001 From: Antonio Volta Date: Thu, 29 Feb 2024 15:51:57 +0100 Subject: [PATCH 21/25] prova con meno colonne fallito --- mathFunctions/furtherMathFunctions.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mathFunctions/furtherMathFunctions.cpp b/mathFunctions/furtherMathFunctions.cpp index 3f344c109..27f59f55b 100644 --- a/mathFunctions/furtherMathFunctions.cpp +++ b/mathFunctions/furtherMathFunctions.cpp @@ -68,7 +68,8 @@ double lapseRateFrei(double x, std::vector & par) double lapseRatePiecewise(double x, std::vector & par) { - + // the piecewise line is parameterized as follows + // the line passes through A(par[0];par[1])and B(par[0]+par[2];par[3]). par[4] is the slope of the 2 externals pieces // "y = mx + q" piecewise function; double xb; // par[2] means the delta between the two quotes. It must be positive. From a938df3dfaa23d44cd5e540e97ff1a04c8a0f60a Mon Sep 17 00:00:00 2001 From: lauracosta Date: Thu, 29 Feb 2024 16:47:32 +0100 Subject: [PATCH 22/25] getAllDailyVar --- dbMeteoPoints/dbMeteoPointsHandler.cpp | 35 ++++++++++++++++++++++++++ dbMeteoPoints/dbMeteoPointsHandler.h | 1 + pragaProject/pragaProject.cpp | 21 ++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/dbMeteoPoints/dbMeteoPointsHandler.cpp b/dbMeteoPoints/dbMeteoPointsHandler.cpp index 6f2138465..0b8444b7b 100644 --- a/dbMeteoPoints/dbMeteoPointsHandler.cpp +++ b/dbMeteoPoints/dbMeteoPointsHandler.cpp @@ -686,6 +686,41 @@ std::vector Crit3DMeteoPointsDbHandler::loadDailyVar(QString *myError, me return dailyVarList; } +std::vector Crit3DMeteoPointsDbHandler::getAllDailyVar(QString *myError, meteoVariable variable, QString id, std::vector &dateStr) +{ + QString date; + float value; + std::vector dailyVarList; + + int idVar = getIdfromMeteoVar(variable); + + + QSqlQuery myQuery(_db); + + QString tableName = id + "_D"; + + QString statement = QString( "SELECT * FROM `%1` WHERE `%2` = %3") + .arg(tableName).arg(FIELD_METEO_VARIABLE).arg(idVar); + + if( !myQuery.exec(statement) ) + { + *myError = myQuery.lastError().text(); + return dailyVarList; + } + else + { + while (myQuery.next()) + { + date = myQuery.value(0).toString(); + dateStr.push_back(date); + value = myQuery.value(2).toFloat(); + dailyVarList.push_back(value); + } + } + + return dailyVarList; +} + std::vector Crit3DMeteoPointsDbHandler::loadHourlyVar(QString *myError, meteoVariable variable, Crit3DDate dateStart, Crit3DDate dateEnd, QDateTime* firstDateDB, Crit3DMeteoPoint *meteoPoint) { QString dateStr; diff --git a/dbMeteoPoints/dbMeteoPointsHandler.h b/dbMeteoPoints/dbMeteoPointsHandler.h index d6d78c1fd..283a7ae1f 100644 --- a/dbMeteoPoints/dbMeteoPointsHandler.h +++ b/dbMeteoPoints/dbMeteoPointsHandler.h @@ -68,6 +68,7 @@ std::vector loadDailyVar(QString *myError, meteoVariable variable, Crit3DDate dateStart, Crit3DDate dateEnd, QDate* firstDateDB, Crit3DMeteoPoint *meteoPoint); + std::vector getAllDailyVar(QString *myError, meteoVariable variable, QString id, std::vector &dateStr); bool loadHourlyData(const Crit3DDate &firstDate, const Crit3DDate &lastDate, Crit3DMeteoPoint *meteoPoint); diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index 218199276..49e51b80c 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3269,6 +3269,27 @@ bool PragaProject::loadXMLExportData(QString code) qDebug() << "filename " << filename; QString variable = inOutData->getVariableExport(); qDebug() << "variable " << variable; + meteoVariable meteoVar = getMeteoVar(variable.toStdString()); + if (meteoVar == noMeteoVar) + { + errorString = "Unknown meteo variable: " + variable; + logError(errorString); + return false; + } + /* + std::vector dateStr; + std::vector values = meteoPointsDbHandler->getAllDailyVar(&errorString, meteoVar, code, dateStr); + for (int i = 0; i Date: Thu, 29 Feb 2024 17:41:29 +0100 Subject: [PATCH 23/25] getAllDailyVar --- pragaProject/pragaProject.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index 49e51b80c..fdbe06017 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3276,20 +3276,8 @@ bool PragaProject::loadXMLExportData(QString code) logError(errorString); return false; } - /* std::vector dateStr; std::vector values = meteoPointsDbHandler->getAllDailyVar(&errorString, meteoVar, code, dateStr); - for (int i = 0; i Date: Thu, 29 Feb 2024 20:17:03 +0100 Subject: [PATCH 24/25] remove double delete inOutData --- pragaProject/pragaProject.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pragaProject/pragaProject.cpp b/pragaProject/pragaProject.cpp index fdbe06017..9161a0440 100644 --- a/pragaProject/pragaProject.cpp +++ b/pragaProject/pragaProject.cpp @@ -3216,10 +3216,6 @@ bool PragaProject::parserXMLImportExportData(QString xmlName, bool isGrid) logError("Missing file: " + xmlName); return false; } - if (inOutData) - { - delete inOutData; - } if (isGrid) { inOutData = new InOutDataXML(isGrid, nullptr, meteoGridDbHandler, xmlName); From 8be9c15128b97341b90be0d0e8d5dcce9abaa486 Mon Sep 17 00:00:00 2001 From: cate-to Date: Fri, 1 Mar 2024 11:27:47 +0100 Subject: [PATCH 25/25] aggiunta commento --- mathFunctions/gammaFunction.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/mathFunctions/gammaFunction.cpp b/mathFunctions/gammaFunction.cpp index 35d984be4..370e627b9 100644 --- a/mathFunctions/gammaFunction.cpp +++ b/mathFunctions/gammaFunction.cpp @@ -22,6 +22,7 @@ ftomei@arpae.it gantolini@arpae.it avolta@arpae.it + */ #include