Mainwindow: Checker: Add table.

setup.py
Pierre-Antoine Rouby 2024-03-20 12:24:13 +01:00
parent 3be4e6c112
commit 30170df1b1
7 changed files with 150 additions and 10 deletions

View File

@ -57,6 +57,7 @@ class AbstractModelChecker(object):
def __init__(self): def __init__(self):
self._name = "" self._name = ""
self._description = "" self._description = ""
self._solver = "study"
self._modules = Modules.NONE self._modules = Modules.NONE
self._status = STATUS.UNKNOWN self._status = STATUS.UNKNOWN

View File

@ -23,6 +23,8 @@ from tools import flatten, timer
from PyQt5.QtCore import QCoreApplication from PyQt5.QtCore import QCoreApplication
from Modules import Modules
from Checker.Checker import AbstractModelChecker, STATUS from Checker.Checker import AbstractModelChecker, STATUS
from Checker.Study import StudyGeometryChecker from Checker.Study import StudyGeometryChecker
@ -30,7 +32,7 @@ _translate = QCoreApplication.translate
class MageNetworkGraphChecker(AbstractModelChecker): class MageNetworkGraphChecker(AbstractModelChecker):
def __init__(self, connectivity=True): def __init__(self, connectivity=True, version="mage8"):
super(MageNetworkGraphChecker, self).__init__() super(MageNetworkGraphChecker, self).__init__()
self._mode_conn = connectivity self._mode_conn = connectivity
@ -44,6 +46,7 @@ class MageNetworkGraphChecker(AbstractModelChecker):
"Checker", f"Mage network graph {mode} checker") "Checker", f"Mage network graph {mode} checker")
self._description = _translate( self._description = _translate(
"Checker", "Check if the network graph is valid") "Checker", "Check if the network graph is valid")
self._solver = version
self._modules = Modules.NETWORK self._modules = Modules.NETWORK
@timer @timer
@ -200,7 +203,7 @@ class MageNetworkGraphChecker(AbstractModelChecker):
class MageGeometryGuideLineChecker(StudyGeometryChecker): class MageGeometryGuideLineChecker(StudyGeometryChecker):
def __init__(self): def __init__(self, version="mage8"):
super(MageGeometryGuideLineChecker, self).__init__() super(MageGeometryGuideLineChecker, self).__init__()
self._name = _translate("Checker", "Mage geometry guide line checker") 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 \ "Check if exists geometry guide line is correctly defined \
for each reaches of the study" for each reaches of the study"
) )
self._solver = version
self._modules = Modules.GEOMETRY self._modules = Modules.GEOMETRY
self._reachs = [] self._reachs = []

View File

@ -20,6 +20,7 @@ import time
from PyQt5.QtCore import QCoreApplication from PyQt5.QtCore import QCoreApplication
from Modules import Modules
from Checker.Checker import AbstractModelChecker, STATUS from Checker.Checker import AbstractModelChecker, STATUS
_translate = QCoreApplication.translate _translate = QCoreApplication.translate

View File

@ -36,7 +36,9 @@ class Modules(Flag):
HYDRAULIC_STRUCTURES = auto() HYDRAULIC_STRUCTURES = auto()
RESERVOIR = auto() RESERVOIR = auto()
SEDIMENT_LAYER = auto() SEDIMENT_LAYER = auto()
RESULT = auto()
# Results
RESULTS = auto()
# Display # Display
WINDOW_LIST = auto() WINDOW_LIST = auto()
@ -44,3 +46,31 @@ class Modules(Flag):
@classmethod @classmethod
def all(cls): def all(cls):
return ~cls.NONE 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,
]

View File

@ -16,6 +16,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import logging
from functools import reduce
from tools import trace, timer from tools import trace, timer
from PyQt5.QtCore import ( from PyQt5.QtCore import (
@ -35,9 +38,11 @@ from PyQt5.QtWidgets import (
QComboBox, QComboBox,
) )
from Modules import Modules
from Checker.Checker import STATUS
from View.Tools.PamhyrTable import PamhyrTableModel from View.Tools.PamhyrTable import PamhyrTableModel
_translate = QCoreApplication.translate logger = logging.getLogger()
class TableModel(PamhyrTableModel): class TableModel(PamhyrTableModel):
@ -68,3 +73,68 @@ class TableModel(PamhyrTableModel):
return self._data[row].summary return self._data[row].summary
return QVariant() 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()

View File

@ -193,7 +193,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
tab_widget = self.findChild(QTabWidget, "tabWidget") tab_widget = self.findChild(QTabWidget, "tabWidget")
self._tab_widget_checker = WidgetChecker( self._tab_widget_checker = WidgetChecker(
study=self._study, parent=self study=self._study, config=self.conf, parent=self
) )
tab_widget.addTab( tab_widget.addTab(

View File

@ -18,9 +18,18 @@
import logging 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.Tools.PamhyrWidget import PamhyrWidget
from View.CheckList.Table import TabTableModel
logger = logging.getLogger() logger = logging.getLogger()
@ -28,20 +37,45 @@ logger = logging.getLogger()
class WidgetChecker(PamhyrWidget): class WidgetChecker(PamhyrWidget):
_pamhyr_ui = "MainWindowTabCheckers" _pamhyr_ui = "MainWindowTabCheckers"
def __init__(self, study=None, parent=None): def __init__(self, study=None, config=None, parent=None):
self._study = study self._study = study
self._config = config
super(WidgetChecker, self).__init__( super(WidgetChecker, self).__init__(
parent=parent parent=parent
) )
self._checkers = set() self.setup_solver_list()
self.setup_checker_list()
self.setup_table() self.setup_table()
self.setup_list() 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): 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): def setup_list(self):
return return