Scenarios: Merge branch 'master' into scenarios.

This commit is contained in:
parouby committed 2026-06-04 14:03:49 +02:00
commit 0f6709075f
25 files changed
+597 -122

No files matched your search

+19 -4
View File
@@ -302,7 +302,6 @@ class GeometryWindow(PamhyrWindow):
self.tableView.model().blockSignals(False)
def edit_meshing(self):
rows = list(
set(
(i.row() for i in self.tableView.selectedIndexes())
@@ -326,6 +325,25 @@ class GeometryWindow(PamhyrWindow):
logger_exception(e)
return
ind = []
for i in range(self._reach.number_profiles):
if self._reach.profile(i).rk in selected_rk:
ind.append(i)
self.tableView.setFocus()
selection = self.tableView.selectionModel()
index = QItemSelection()
if len(ind) > 0:
for i in ind:
index.append(QItemSelectionRange(
self.tableView.model().index(i, 0))
)
selection.select(
index,
QItemSelectionModel.Rows |
QItemSelectionModel.ClearAndSelect |
QItemSelectionModel.Select
)
def _edit_meshing(self, data):
try:
mesher = InternalMeshing()
@@ -371,9 +389,6 @@ class GeometryWindow(PamhyrWindow):
except Exception as e:
logger_exception(e)
raise ExternFileMissingError(
module="mage",
filename="MailleurTT",
path=MeshingWithMageMailleurTT._path(),
src_except=e
)
+2 -1
View File
@@ -53,7 +53,8 @@ class LCTranslate(MainTranslate):
self._dict["y"] = _translate("Geometry", "Y (m)")
self._dict["z"] = _translate("Geometry", "Z (m)")
self._dict["file_lat"] = _translate(
"LateralContribution", "Shapefile (*.LAT *.lat)")
"LateralContribution",
"Mage lateral contributions file (*.LAT *.lat)")
self._dict["file_all"] = _translate(
"LateralContribution", "All files (*)")
+7
View File
@@ -2006,6 +2006,13 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
if res.river.reach(r).has_bedload():
res.river.reach(r).bufferize(ts, "zfd")
for res in (result3, result4, result5):
for r in range(int(res.get("nb_reach"))):
for key in ["Z", "Q", "V"]:
res.river.reach(r).bufferize(ts, key)
if res.river.reach(r).has_bedload():
res.river.reach(r).bufferize(ts, "zfd")
return [result4, result5, result3]
def open_results_adists(self):
+18 -1
View File
@@ -19,7 +19,7 @@
from View.Tools.PamhyrWindow import PamhyrDialog
from PyQt5.QtWidgets import (
QRadioButton, QCheckBox, QVBoxLayout, QLabel,
QRadioButton, QCheckBox, QVBoxLayout, QLabel, QFrame
)
from View.Results.translate import ResultsTranslate
@@ -43,6 +43,7 @@ class CustomExportDialog(PamhyrDialog):
self.setup_radio_buttons_x()
self.setup_radio_buttons_res()
self.setup_label()
self.setup_envelop_box()
self.setup_check_boxes()
@@ -87,6 +88,22 @@ class CustomExportDialog(PamhyrDialog):
layout.addStretch()
def setup_label(self):
self._label = self.find(QLabel, "label_4")
self._label.setFrameStyle(QFrame.StyledPanel)
self._label.setStyleSheet('background-color: white')
self.set_label()
for r in self._radio:
r[1].clicked.connect(self.set_label)
def set_label(self):
if self._radio[0][1].isChecked():
self._label.setText(self._parent.text_bief() + "\n" +
self._parent.text_time())
else:
self._label.setText(self._parent.text_bief() + "\n" +
self._parent.text_profile())
def setup_envelop_box(self):
layout = self.find(QVBoxLayout, "verticalLayout_x")
self._envelop = QCheckBox(
@@ -19,7 +19,7 @@
from View.Tools.PamhyrWindow import PamhyrDialog
from PyQt5.QtWidgets import (
QRadioButton, QCheckBox, QVBoxLayout,
QRadioButton, QCheckBox, QVBoxLayout, QLabel, QFrame
)
from View.Results.translate import ResultsTranslate
@@ -50,6 +50,7 @@ class CustomExportAdisDialog(PamhyrDialog):
self.setup_radio_buttons_x()
self.setup_radio_buttons_pol()
self.setup_label()
self.setup_check_boxes()
self.value = None
@@ -84,6 +85,22 @@ class CustomExportAdisDialog(PamhyrDialog):
self._radio2[0][1].setChecked(True)
layout.addStretch()
def setup_label(self):
self._label = self.find(QLabel, "label_4")
self._label.setFrameStyle(QFrame.StyledPanel)
self._label.setStyleSheet('background-color: white')
self.set_label()
for r in self._radio:
r[1].clicked.connect(self.set_label)
def set_label(self):
if self._radio[0][1].isChecked():
self._label.setText(self._parent.text_bief() + "\n" +
self._parent.text_time())
else:
self._label.setText(self._parent.text_bief() + "\n" +
self._parent.text_profile())
def setup_check_boxes(self):
self._check = []
layout = self.find(QVBoxLayout, "verticalLayout_y")
@@ -19,7 +19,7 @@
from View.Tools.PamhyrWindow import PamhyrDialog
from PyQt5.QtWidgets import (
QRadioButton, QCheckBox, QVBoxLayout,
QRadioButton, QCheckBox, QVBoxLayout, QLabel, QFrame
)
from View.Results.CustomPlot.Translate import CustomPlotTranslate
@@ -38,10 +38,12 @@ class CustomPlotValuesSelectionDialog(PamhyrDialog):
parent=parent
)
self._parent = parent
self._available_values_x = self._trad.get_dict("values_x")
self._available_values_y = self._trad.get_dict("values_y")
self.setup_radio_buttons()
self.setup_label()
self.setup_envelop_box()
self.setup_check_boxs()
@@ -62,6 +64,22 @@ class CustomPlotValuesSelectionDialog(PamhyrDialog):
self._radio[0][1].setChecked(True)
layout.addStretch()
def setup_label(self):
self._label = self.find(QLabel, "label_3")
self._label.setFrameStyle(QFrame.StyledPanel)
self._label.setStyleSheet('background-color: white')
self.set_label()
for r in self._radio:
r[1].clicked.connect(self.set_label)
def set_label(self):
if self._radio[0][1].isChecked():
self._label.setText(self._parent.text_bief() + "\n" +
self._parent.text_time())
else:
self._label.setText(self._parent.text_bief() + "\n" +
self._parent.text_profile())
def setup_envelop_box(self):
self._envelop = []
layout = self.find(QVBoxLayout, "verticalLayout_x")
+4 -2
View File
@@ -204,7 +204,8 @@ class CustomPlot(PamhyrPlot):
e = list(
map(
lambda p: max(self.get_ts_zmin(p, res_id)),
lambda p: max(self.get_ts_zmin(
p, self._current_res_id)),
range(len(reach))
)
)
@@ -217,7 +218,8 @@ class CustomPlot(PamhyrPlot):
e = list(
map(
lambda p: min(self.get_ts_zmin(p, res_id)),
lambda p: min(self.get_ts_zmin(
p, self._current_res_id)),
range(len(reach))
)
)
+70 -36
View File
@@ -314,16 +314,12 @@ class ResultsWindow(PamhyrWindow):
super(ResultsWindow, self).closeEvent(event)
def _compute_status_label(self):
# Timestamp
ts = self._timestamps[self._slider_time.value()]
t0 = datetime.fromtimestamp(0)
fts = str(
datetime.fromtimestamp(ts) - t0
)
fts.replace("days", _translate("Results", "days"))\
.replace("day", _translate("Results", "day"))
return (self.text_bief() + " | " +
self.text_profile() + " | " +
self.text_time())
def text_bief(self):
# Reach
table = self.find(QTableView, f"tableView_reach")
indexes = table.selectedIndexes()
@@ -331,7 +327,16 @@ class ResultsWindow(PamhyrWindow):
reach = self._study.river.enable_edges()[0]
else:
reach = self._study.river.enable_edges()[indexes[0].row()]
return f"{self._trad['reach']}: {reach.name}"
def text_profile(self):
# Reach
table = self.find(QTableView, f"tableView_reach")
indexes = table.selectedIndexes()
if len(indexes) == 0:
reach = self._study.river.enable_edges()[0]
else:
reach = self._study.river.enable_edges()[indexes[0].row()]
# Profile
table = self.find(QTableView, f"tableView_profile")
indexes = table.selectedIndexes()
@@ -341,10 +346,22 @@ class ResultsWindow(PamhyrWindow):
profile = reach.reach.profile(indexes[0].row())
pname = profile.name if profile.name != "" else profile.rk
return f"{self._trad['cross_section']}: {pname}"
return (f"{self._trad['reach']}: {reach.name} | " +
f"{self._trad['cross_section']}: {pname} | " +
f"{self._trad['unit_time_s']} : {fts} ({ts} sec)")
def text_time(self):
# Timestamp
ts = self._timestamps[self._slider_time.value()]
t0 = datetime.fromtimestamp(0)
fts = str(
datetime.fromtimestamp(ts) - t0
)
fts = str(
datetime.fromtimestamp(ts) - t0
)
fts.replace("days", _translate("Results", "days"))\
.replace("day", _translate("Results", "day"))
return f"{self._trad['time']} : {fts} ({ts} sec)"
def setup_statusbar(self):
txt = self._compute_status_label()
@@ -779,20 +796,29 @@ class ResultsWindow(PamhyrWindow):
first_line.append(f"Profile: {pname}")
val_dict = self._export_time(profile_id, y, solver_id)
with open(filename, 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
dict_x = self._trad.get_dict("values_x")
header = []
writer.writerow(first_line)
for text in val_dict.keys():
header.append(text)
writer.writerow(header)
for row in range(len(val_dict[dict_x[x]])):
line = []
for var in val_dict.keys():
line.append(val_dict[var][row])
writer.writerow(line)
try:
with open(filename, 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
dict_x = self._trad.get_dict("values_x")
header = []
writer.writerow(first_line)
for text in val_dict.keys():
header.append(text)
writer.writerow(header)
for row in range(len(val_dict[dict_x[x]])):
line = []
for var in val_dict.keys():
line.append(val_dict[var][row])
writer.writerow(line)
self._timer.stop()
except Exception as e:
self.message_box(
window_title=self._trad["Warning"],
text=self._trad["mb_write_error"],
informative_text=self._trad["mb_close_file"]
)
logger_exception(e)
def export_all(self, reach, directory, timestamps):
name = reach.name
@@ -805,17 +831,25 @@ class ResultsWindow(PamhyrWindow):
f"reach_{name}.csv"
)
with open(file_name, 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
ts = timestamps[0]
writer.writerow(self._table["raw_data"]._headers)
for row in range(self._table["raw_data"].rowCount()):
line = []
for column in range(self._table["raw_data"].columnCount()):
index = self._table["raw_data"].index(row, column)
line.append(self._table["raw_data"].data(index))
writer.writerow(line)
try:
with open(file_name, 'w', newline='') as csvfile:
writer = csv.writer(csvfile, delimiter=',',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
ts = timestamps[0]
writer.writerow(self._table["raw_data"]._headers)
for row in range(self._table["raw_data"].rowCount()):
line = []
for column in range(self._table["raw_data"].columnCount()):
index = self._table["raw_data"].index(row, column)
line.append(self._table["raw_data"].data(index))
writer.writerow(line)
except Exception as e:
self.message_box(
window_title=self._trad["Warning"],
text=self._trad["mb_write_errore"],
informative_text=self._trad["mb_close_file"]
)
logger_exception(e)
def export_current(self):
self.file_dialog(
+34 -15
View File
@@ -345,24 +345,29 @@ class ResultsWindowAdisTS(PamhyrWindow):
super(ResultsWindowAdisTS, self).closeEvent(event)
def _compute_status_label(self):
# Timestamp
ts = self._timestamps[self._slider_time.value()]
t0 = datetime.fromtimestamp(0)
fts = str(
datetime.fromtimestamp(ts) - t0
)
fts.replace("days", _translate("Results", "days"))\
.replace("day", _translate("Results", "day"))
return (self.text_bief() + " | " +
self.text_profile() + " | " +
self.text_pollutant() + " | " +
self.text_time())
def text_bief(self):
# Reach
table = self.find(QTableView, f"tableView_reach")
indexes = table.selectedIndexes()
if len(indexes) == 0:
reach = self._study.river.edges()[0]
reach = self._study.river.enable_edges()[0]
else:
reach = self._study.river.edges()[indexes[0].row()]
reach = self._study.river.enable_edges()[indexes[0].row()]
return f"{self._trad['reach']}: {reach.name}"
def text_profile(self):
# Reach
table = self.find(QTableView, f"tableView_reach")
indexes = table.selectedIndexes()
if len(indexes) == 0:
reach = self._study.river.enable_edges()[0]
else:
reach = self._study.river.enable_edges()[indexes[0].row()]
# Profile
table = self.find(QTableView, f"tableView_profile")
indexes = table.selectedIndexes()
@@ -372,7 +377,24 @@ class ResultsWindowAdisTS(PamhyrWindow):
profile = reach.reach.profile(indexes[0].row())
pname = profile.name if profile.name != "" else profile.rk
return f"{self._trad['cross_section']}: {pname}"
def text_time(self):
# Timestamp
ts = self._timestamps[self._slider_time.value()]
t0 = datetime.fromtimestamp(0)
fts = str(
datetime.fromtimestamp(ts) - t0
)
fts = str(
datetime.fromtimestamp(ts) - t0
)
fts.replace("days", _translate("Results", "days"))\
.replace("day", _translate("Results", "day"))
return f"{self._trad['time']} : {fts} ({ts} sec)"
def text_pollutant(self):
# Pollutant
table = self.find(QTableView, f"tableView_pollutants")
indexes = table.selectedIndexes()
@@ -381,10 +403,7 @@ class ResultsWindowAdisTS(PamhyrWindow):
self._results.pollutants_list[i.row()+1] for i in indexes
]
return (f"{self._trad['reach']}: {reach.name} | " +
f"{self._trad['cross_section']}: {pname} | " +
f"Pollutant: {', '.join(self.pollutant_label)} | " +
f"{self._trad['unit_time_s']} : {fts} ({ts} sec)")
return (f"Pollutant: {', '.join(self.pollutant_label)}")
def setup_statusbar(self):
txt = self._compute_status_label()
+7
View File
@@ -56,6 +56,13 @@ class ResultsTranslate(MainTranslate):
self._dict["ImageCoordinates"] = _translate(
"Results", "Image coordinates"
)
self._dict["mb_write_error"] = _translate(
"Results", "An error occured when writing to file"
)
self._dict["mb_close_file"] = _translate(
"Results",
"If the file is in use, close it and try again"
)
self._sub_dict["table_headers_reach"] = {
"name": _translate("Results", "Reach name"),
+2 -1
View File
@@ -94,7 +94,8 @@ class SelectSolverWindowAdisTS(PamhyrDialog):
)
solvers_mage = list(filter(
lambda x: "mage" in x._type.lower(), self._config.solvers
lambda x: "mage" or "rubar" in x._type.lower(),
self._config.solvers
))
solvers_mage_names = list(map(lambda x: x._name, solvers_mage))
+18 -11
View File
@@ -7,23 +7,13 @@
<x>0</x>
<y>0</y>
<width>194</width>
<height>70</height>
<height>126</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QSplitter" name="splitter">
<property name="orientation">
@@ -64,6 +54,23 @@
</widget>
</widget>
</item>
<item row="5" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
+16 -9
View File
@@ -7,14 +7,24 @@
<x>0</x>
<y>0</y>
<width>414</width>
<height>70</height>
<height>132</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -43,13 +53,10 @@
</widget>
</widget>
</item>
<item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
@@ -22,7 +22,7 @@
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Upstream height (m)</string>
<string>Upstream elevation (m)</string>
</property>
</widget>
</item>
@@ -70,7 +70,7 @@
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Downstream height (m)</string>
<string>Downstream elevation (m)</string>
</property>
</widget>
</item>