diff --git a/src/Model/Results/ResultsAdisTS.py b/src/Model/Results/ResultsAdisTS.py new file mode 100644 index 0000000000000000000000000000000000000000..79b1b4e05c9b473aecefe6dda0ba94c7a94bd5fe --- /dev/null +++ b/src/Model/Results/ResultsAdisTS.py @@ -0,0 +1,77 @@ +# Results.py -- Pamhyr +# Copyright (C) 2023-2024 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +import logging +import numpy as np +import os, glob + +from copy import deepcopy +from datetime import datetime + +from Model.Results.River.River import River + +logger = logging.getLogger() + + +class Results(object): + def __init__(self, study=None, solver=None, + repertory="", name="0"): + self._study = study + self._solver = solver + self._repertory = repertory + self._name = name + + self._river = River(self._study) + + self._meta_data = { + # Keep results creation date + "creation_date": datetime.now(), + } + + repertory_results = os.path.join(repertory, "resultats") + self._pollutants_list = [el.split("/")[-1][0:-4] for el in glob.glob(repertory_results + "/*.bin")] + + print("*********files names resultats from Results Object: ", self._pollutants_list) + + @property + def date(self): + date = self._meta_data["creation_date"] + return f"{date.isoformat(sep=' ')}" + + @property + def river(self): + return self._river + + @property + def study(self): + return self._study + + @property + def pollutants_list(self): + return self._pollutants_list + + def set(self, key, value): + self._meta_data[key] = value + + def get(self, key): + return self._meta_data[key] + + def reload(self): + return self._solver.results( + self._study, + self._repertory, + qlog=None, + ) diff --git a/src/Solver/AdisTS.py b/src/Solver/AdisTS.py index bea442b1343e137a6fb3388c1f31ce215362f0cf..2c9865b08994575e8f05a9434be92da645ef2a4f 100644 --- a/src/Solver/AdisTS.py +++ b/src/Solver/AdisTS.py @@ -33,7 +33,7 @@ from tools import ( from Solver.CommandLine import CommandLineSolver -from Model.Results.Results import Results +from Model.Results.ResultsAdisTS import Results from Model.Results.River.River import River, Reach, Profile from Checker.Adists import ( diff --git a/src/View/Results/TableAdisTS.py b/src/View/Results/TableAdisTS.py new file mode 100644 index 0000000000000000000000000000000000000000..31821911369f8d45facdbfd2a2c16290e6637333 --- /dev/null +++ b/src/View/Results/TableAdisTS.py @@ -0,0 +1,131 @@ +# Table.py -- Pamhyr +# Copyright (C) 2023-2024 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# -*- coding: utf-8 -*- + +import logging +import traceback + +from tools import timer, trace + +from PyQt5.QtGui import ( + QKeySequence, QColor +) +from PyQt5.QtCore import ( + Qt, QAbstractTableModel, QModelIndex, + QVariant, pyqtSlot, QCoreApplication, +) +from PyQt5.QtWidgets import ( + QMessageBox, QUndoCommand, QUndoStack, + QStyledItemDelegate, QLineEdit, QAbstractItemView, + QComboBox, +) + +from View.Tools.PamhyrTable import PamhyrTableModel +from View.Results.translate import * + +logger = logging.getLogger() + +_translate = QCoreApplication.translate + + +class TableModel(PamhyrTableModel): + def _setup_lst(self): + _river = self._data.river + print("//////////////////opt_data: ", self._opt_data) + print("data: ", self._data) + print("river: ", _river) + print("reaches: ", _river.reachs) + if self._opt_data == "reach": + self._lst = _river.reachs + print("optreach: ", self._lst) + elif self._opt_data == "profile": + self._lst = _river.reach(0).profiles + elif self._opt_data == "raw_data": + self._lst = _river.reach(0).profiles + elif self._opt_data == "pollutants": + tmp_list = self._data.pollutants_list.copy() + tmp_list.remove("total_sediment") + print(type(tmp_list)) + tmp_list.insert(len(tmp_list), "total_sediment") + self._lst = tmp_list + print("=====table pollutants: ", self._lst) + + def __init__(self, **kwargs): + self._timestamp = 0.0 + super(TableModel, self).__init__(**kwargs) + + def data(self, index, role=Qt.DisplayRole): + if role != Qt.ItemDataRole.DisplayRole: + return QVariant() + + row = index.row() + column = index.column() + + if self._opt_data == "reach": + if self._headers[column] == "name": + v = self._lst[row].name + return str(v) + elif self._opt_data == "pollutants": + if self._headers[column] == "name": + v = self._lst[row] + return str(v) + elif self._opt_data == "profile": + if self._headers[column] == "name": + v = self._lst[row].name + return str(v) + elif self._headers[column] == "kp": + v = self._lst[row].kp + return f"{v:.4f}" + elif self._opt_data == "raw_data": + p = self._lst[row] + if self._headers[column] == "name": + if p.name == "": + return f"{p.kp:.4f}" + return f"{p.name}" + elif self._headers[column] == "water_elevation": + v = self._lst[row].get_ts_key(self._timestamp, "Z") + return f"{v:.4f}" + elif self._headers[column] == "discharge": + v = self._lst[row].get_ts_key(self._timestamp, "Q") + return f"{v:.4f}" + elif self._headers[column] == "speed": + q = self._lst[row].get_ts_key(self._timestamp, "Q") + z = self._lst[row].get_ts_key(self._timestamp, "Q") + + v = self._lst[row].geometry.speed(q, z) + return f"{v:.4f}" + + return QVariant() + + def update(self, reach): + _river = self._data.river + + if self._opt_data == "reach": + self._lst = _river.reachs + elif self._opt_data == "profile" or self._opt_data == "raw_data": + self._lst = _river.reach(reach).profiles + + self.layoutChanged.emit() + + @property + def timestamp(self): + return self._timestamp + + @timestamp.setter + def timestamp(self, timestamp): + self._timestamp = timestamp + self.layoutChanged.emit() diff --git a/src/View/Results/WindowAdisTS.py b/src/View/Results/WindowAdisTS.py index 628068092fb0ee0ade950801863bbbb6734e023b..1d72585dd51b61ac08335b307b6d6cc2d0c2609e 100644 --- a/src/View/Results/WindowAdisTS.py +++ b/src/View/Results/WindowAdisTS.py @@ -58,7 +58,7 @@ from View.Results.CustomPlot.CustomPlotValuesSelectionDialog import ( CustomPlotValuesSelectionDialog, ) -from View.Results.Table import TableModel +from View.Results.TableAdisTS import TableModel from View.Results.translate import ResultsTranslate from View.Stricklers.Window import StricklersWindow @@ -124,8 +124,9 @@ class ResultsWindowAdisTS(PamhyrWindow): print("setup table adists results") print("results study name: ", self._results.study.name) print("results study river: ", self._results.study.river) + print("*********files names resultats from Results Window: ", self._results.pollutants_list) self._table = {} - for t in ["reach", "profile"]:#, "raw_data"]: + for t in ["reach", "profile", "pollutants"]:#, "raw_data"]: print("t: ", t) table = self.find(QTableView, f"tableView_{t}") self._table[t] = TableModel( diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index e59fb789eb91742a3a47ecbf7ca8ed9d37206654..12264c621945bc6ca0fa27c3c054c2eb9aa86925 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -45,7 +45,7 @@ class ResultsTranslate(MainTranslate): ) self._sub_dict["table_headers_reach"] = { - "name": _translate("Results", "Reach name"), + "name": _translate("Results", "Pollutant name"), } self._sub_dict["table_headers_profile"] = { @@ -53,6 +53,10 @@ class ResultsTranslate(MainTranslate): "kp": self._dict["unit_kp"], } + self._sub_dict["table_headers_pollutants"] = { + "name": _translate("Results", "Reach name"), + } + self._sub_dict["table_headers_raw_data"] = { "name": _translate("Results", "Profile"), "water_elevation": self._dict["unit_water_elevation"], diff --git a/src/View/ui/ResultsAdisTS.ui b/src/View/ui/ResultsAdisTS.ui index c7c319a0bd6fe066d6ba46bcf777cb628e277905..6d08656a95c6bd53acfa4983dcbada3b9eb52e0e 100644 --- a/src/View/ui/ResultsAdisTS.ui +++ b/src/View/ui/ResultsAdisTS.ui @@ -54,6 +54,7 @@ </item> </layout> </widget> + <widget class="QTableView" name="tableView_pollutants"/> </widget> <widget class="QWidget" name="layoutWidget"> <layout class="QGridLayout" name="gridLayout_2"> @@ -164,38 +165,6 @@ </item> </layout> </widget> - <widget class="QWidget" name="tab"> - <attribute name="title"> - <string>Water elevation</string> - </attribute> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QSplitter" name="splitter_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <widget class="QSplitter" name="splitter"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <widget class="QWidget" name="verticalLayoutWidget"> - <layout class="QVBoxLayout" name="verticalLayout"/> - </widget> - <widget class="QWidget" name="verticalLayoutWidget_2"> - <layout class="QVBoxLayout" name="verticalLayout_2"/> - </widget> - </widget> - <widget class="QWidget" name="verticalLayoutWidget_3"> - <layout class="QVBoxLayout" name="verticalLayout_3"/> - </widget> - </widget> - </item> - </layout> - </item> - </layout> - </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>Hydrograph</string>