diff --git a/src/Checker/Checker.py b/src/Checker/Checker.py index 4591bedad16897f86f2b15762cc96393bfaed9b7..328c3588a84ee239c19b574b03f6343011a62b25 100644 --- a/src/Checker/Checker.py +++ b/src/Checker/Checker.py @@ -57,6 +57,7 @@ class AbstractModelChecker(object): def __init__(self): self._name = "" self._description = "" + self._solver = "study" self._modules = Modules.NONE self._status = STATUS.UNKNOWN diff --git a/src/Checker/Mage.py b/src/Checker/Mage.py index 260431a563bf6ac830b5ee85ca52e75ef3e98971..e7f8352b6d16ec8b2e003f4040b6ce8e6ca6fca6 100644 --- a/src/Checker/Mage.py +++ b/src/Checker/Mage.py @@ -23,6 +23,8 @@ from tools import flatten, timer from PyQt5.QtCore import QCoreApplication +from Modules import Modules + from Checker.Checker import AbstractModelChecker, STATUS from Checker.Study import StudyGeometryChecker @@ -30,7 +32,7 @@ _translate = QCoreApplication.translate class MageNetworkGraphChecker(AbstractModelChecker): - def __init__(self, connectivity=True): + def __init__(self, connectivity=True, version="mage8"): super(MageNetworkGraphChecker, self).__init__() self._mode_conn = connectivity @@ -44,6 +46,7 @@ class MageNetworkGraphChecker(AbstractModelChecker): "Checker", f"Mage network graph {mode} checker") self._description = _translate( "Checker", "Check if the network graph is valid") + self._solver = version self._modules = Modules.NETWORK @timer @@ -200,7 +203,7 @@ class MageNetworkGraphChecker(AbstractModelChecker): class MageGeometryGuideLineChecker(StudyGeometryChecker): - def __init__(self): + def __init__(self, version="mage8"): super(MageGeometryGuideLineChecker, self).__init__() self._name = _translate("Checker", "Mage geometry guide line checker") @@ -209,6 +212,7 @@ class MageGeometryGuideLineChecker(StudyGeometryChecker): "Check if exists geometry guide line is correctly defined \ for each reaches of the study" ) + self._solver = version self._modules = Modules.GEOMETRY self._reachs = [] diff --git a/src/Checker/Study.py b/src/Checker/Study.py index 01dbc309801a0e08116ac9172c15e966e9294111..a9562aa25210555e07658c1d1e6e018dc5ba8cd0 100644 --- a/src/Checker/Study.py +++ b/src/Checker/Study.py @@ -20,6 +20,7 @@ import time from PyQt5.QtCore import QCoreApplication +from Modules import Modules from Checker.Checker import AbstractModelChecker, STATUS _translate = QCoreApplication.translate diff --git a/src/Modules.py b/src/Modules.py index d7107c377ab8663ad9f4dd694e88af0fde607b56..6f7b1d765003cae3d701a6b507d0a5ae87504b41 100644 --- a/src/Modules.py +++ b/src/Modules.py @@ -36,7 +36,9 @@ class Modules(Flag): HYDRAULIC_STRUCTURES = auto() RESERVOIR = auto() SEDIMENT_LAYER = auto() - RESULT = auto() + + # Results + RESULTS = auto() # Display WINDOW_LIST = auto() @@ -44,3 +46,31 @@ class Modules(Flag): @classmethod def all(cls): return ~cls.NONE + + @classmethod + def modelling(cls): + return ( + cls.NETWORK + | cls.GEOMETRY + | cls.BOUNDARY_CONDITION + | cls.LATERAL_CONTRIBUTION + | cls.FRICTION + | cls.INITIAL_CONDITION + | cls.HYDRAULIC_STRUCTURES + | cls.RESERVOIR + | cls.SEDIMENT_LAYER + ) + + @classmethod + def modelling_list(cls): + return [ + cls.NETWORK, + cls.GEOMETRY, + cls.BOUNDARY_CONDITION, + cls.LATERAL_CONTRIBUTION, + cls.FRICTION, + cls.INITIAL_CONDITION, + cls.HYDRAULIC_STRUCTURES, + cls.RESERVOIR, + cls.SEDIMENT_LAYER, + ] diff --git a/src/View/CheckList/Table.py b/src/View/CheckList/Table.py index 3d2dc66b8ac5b1015ec7462e35e07f03cedbcecd..5d210b93a4dd72cd862f2ec4526bb92229ad6c36 100644 --- a/src/View/CheckList/Table.py +++ b/src/View/CheckList/Table.py @@ -16,6 +16,9 @@ # -*- coding: utf-8 -*- +import logging + +from functools import reduce from tools import trace, timer from PyQt5.QtCore import ( @@ -35,9 +38,11 @@ from PyQt5.QtWidgets import ( QComboBox, ) +from Modules import Modules +from Checker.Checker import STATUS from View.Tools.PamhyrTable import PamhyrTableModel -_translate = QCoreApplication.translate +logger = logging.getLogger() class TableModel(PamhyrTableModel): @@ -68,3 +73,68 @@ class TableModel(PamhyrTableModel): return self._data[row].summary return QVariant() + +class TabTableModel(PamhyrTableModel): + def compute_status(self, row, column): + module = self._opt_data[row] + solver = self._headers[column] + + checkers = filter( + lambda checker: checker._modules is module, + filter( + lambda checker: checker._solver is solver, + self._data + ) + ) + checkers_status = list( + map( + lambda c: c._status, + checkers + ) + ) + + status = STATUS.UNKNOWN + if len(checkers_status) > 0: + status = reduce(lambda acc, c: acc | c, checkers_status) + + logger.debug(f"Checkers: {row}, {column}: {checkers_status} {status}") + + return status, checkers_status + + def data(self, index, role): + row = index.row() + column = index.column() + + if role == Qt.ForegroundRole: + if self._headers[column] == "type": + return QVariant() + + color = Qt.gray + status, _ = self.compute_status(row, column) + + if status is STATUS.OK: + color = Qt.green + elif status is STATUS.WARNING: + color = Qt.yellow + elif status is STATUS.ERROR: + color = Qt.red + + return QBrush(color) + + if role == Qt.ItemDataRole.DisplayRole: + if self._headers[column] == "type": + return str(self._opt_data[row]) + + value = "UNKNOWN" + status, _ = self.compute_status(row, column) + + if status is STATUS.OK: + value = "OK" + elif status is STATUS.WARNING: + value = "WARNING" + elif status is STATUS.ERROR: + value = "ERROR" + + return value + + return QVariant() diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py index f98811d22b4ca3705a0e3436dade89e7166605ab..81d2520fce22e91c5102b675a4a6d897eb5ef186 100644 --- a/src/View/MainWindow.py +++ b/src/View/MainWindow.py @@ -193,7 +193,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): tab_widget = self.findChild(QTabWidget, "tabWidget") self._tab_widget_checker = WidgetChecker( - study=self._study, parent=self + study=self._study, config=self.conf, parent=self ) tab_widget.addTab( diff --git a/src/View/MainWindowTabChecker.py b/src/View/MainWindowTabChecker.py index d3118d61b6059a9034e6658ca2951aac7c7657d9..1bbe8492d20e93bfbb35b4bf4a358bd643f4b68f 100644 --- a/src/View/MainWindowTabChecker.py +++ b/src/View/MainWindowTabChecker.py @@ -18,9 +18,18 @@ import logging -from tools import timer, trace +from tools import timer, trace, flatten + +from PyQt5.QtWidgets import ( + QTableView, +) + +from Modules import Modules +from Model.Study import Study +from Solver.Solvers import solver_type_list, solver_long_name from View.Tools.PamhyrWidget import PamhyrWidget +from View.CheckList.Table import TabTableModel logger = logging.getLogger() @@ -28,20 +37,45 @@ logger = logging.getLogger() class WidgetChecker(PamhyrWidget): _pamhyr_ui = "MainWindowTabCheckers" - def __init__(self, study=None, parent=None): + def __init__(self, study=None, config=None, parent=None): self._study = study + self._config = config super(WidgetChecker, self).__init__( parent=parent ) - self._checkers = set() - + self.setup_solver_list() + self.setup_checker_list() self.setup_table() self.setup_list() + def setup_solver_list(self): + self._solvers = list( + map( + lambda solver: solver_type_list[solver], + solver_type_list + ) + ) + + def setup_checker_list(self): + self._checkers = flatten( + map( + lambda solver: solver.checkers(), + self._solvers + [Study] + ) + ) + def setup_table(self): - return + header = {'type': "Type", **solver_long_name} + + table = self.find(QTableView, f"tableView_checker") + self._table = TabTableModel( + table_view=table, + table_headers=header, + data=self._checkers, + opt_data=Modules.modelling_list() + ) def setup_list(self): return