From 92990948adfe88a2cd52122ac6cd814041ee9205 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Thu, 10 Sep 2026 10:26:16 +0200 Subject: [PATCH] Ensemble: PlotRKC: Fix table selection plot update. --- src/View/Results/PlotRKCEnsemble.py | 55 ++++++++++++++--------- src/View/Results/Window.py | 70 +++++++++-------------------- 2 files changed, 55 insertions(+), 70 deletions(-) diff --git a/src/View/Results/PlotRKCEnsemble.py b/src/View/Results/PlotRKCEnsemble.py index bcfba2bd..8126e5e4 100644 --- a/src/View/Results/PlotRKCEnsemble.py +++ b/src/View/Results/PlotRKCEnsemble.py @@ -33,7 +33,7 @@ logger = logging.getLogger() class PlotRKCEnsemble(PamhyrPlot): def __init__(self, canvas=None, trad=None, toolbar=None, - results=None, reach_id=0, profile_id=0, run_id=0, + results=None, reach_id=0, profile_id=0, parent=None): super(PlotRKCEnsemble, self).__init__( canvas=canvas, @@ -46,7 +46,6 @@ class PlotRKCEnsemble(PamhyrPlot): self._parent = parent self._current_reach_id = reach_id self._current_profile_id = profile_id - self._current_run_id = run_id[0] self._timestamps = parent._timestamps self._current_timestamp = max(self._timestamps) @@ -59,6 +58,8 @@ class PlotRKCEnsemble(PamhyrPlot): self.label_water_min = self._trad["label_water_min"] self.label_water_max = self._trad["label_water_max"] + self.water = [] + self._isometric_axis = False self._auto_relim_update = True @@ -80,10 +81,10 @@ class PlotRKCEnsemble(PamhyrPlot): if self.results is None: return - if self.results[self._current_run_id] is None: + if self.results[0] is None: return - results = self.results[self._current_run_id] + results = self.results[0] reach = results.river.reach(self._current_reach_id) self.draw_bottom(reach) @@ -100,7 +101,7 @@ class PlotRKCEnsemble(PamhyrPlot): self.draw_bottom_geometry(reach) def draw_profiles_hs(self, reach): - results = self.results[self._current_run_id] + results = self.results[0] lhs = filter( lambda hs: hs._input_reach.reach is reach.geometry, filter( @@ -146,10 +147,12 @@ class PlotRKCEnsemble(PamhyrPlot): def draw_water_elevation(self, reach): if len(reach.geometry.profiles) != 0: - result = self.results[self._current_run_id] + result = self.results[0] rk = reach.geometry.get_rk() z_min = reach.geometry.get_z_min() + self.water = [] + colors = [ ("z_min", self.color_plot_ensemble_min), ("Z", self.color_plot_ensemble_mean), @@ -163,15 +166,17 @@ class PlotRKCEnsemble(PamhyrPlot): gi_0, gi_1 = reach.global_index water_z = table[ts, gi_0 : gi_1 + 1] - self.water = self.canvas.axes.plot( + plot, = self.canvas.axes.plot( rk, water_z, lw=1., color=color, linestyle='dotted', label=f"Elevation: {t} (m)", ) - def draw_additional_data(self, run_id): - results = self.results[run_id] + self.water.append(plot) + + def draw_additional_data(self): + results = self.results[0] self._add_data_lines = [] @@ -231,10 +236,6 @@ class PlotRKCEnsemble(PamhyrPlot): self._current_profile_id = profile_id self.update_current() - def set_result(self, run_id): - self._current_run_id = run_id[0] - self.update() - def set_timestamp(self, timestamp): self._current_timestamp = timestamp self.update() @@ -243,7 +244,7 @@ class PlotRKCEnsemble(PamhyrPlot): if not self._init: self.draw() - results = self.results[self._current_run_id] + results = self.results[0] reach = results.river.reach(self._current_reach_id) self.update_water_elevation() @@ -253,13 +254,12 @@ class PlotRKCEnsemble(PamhyrPlot): def update_all(self): self._current_reach_id = self._parent._get_current_reach() self._current_profile_id = self._parent._get_current_profile() - self._current_run_id = self._parent._get_current_results()[0] self._current_timestamp = self._parent._get_current_timestamp() self._init = False self.update() def update_water_elevation(self): - result = self.results[self._current_run_id] + result = self.results[0] reach = result.river.reach(self._current_reach_id) rk = reach.geometry.get_rk() z_min = reach.geometry.get_z_min() @@ -269,16 +269,27 @@ class PlotRKCEnsemble(PamhyrPlot): gi_0, gi_1 = reach.global_index water_z = table[ts, gi_0 : gi_1 + 1] - self.water[0].set_data( - rk, water_z - ) + colors = [ + (0, "z_min", self.color_plot_ensemble_min), + (1, "Z", self.color_plot_ensemble_mean), + (2, "z_max", self.color_plot_ensemble_max), + ] + + for i, t, color in colors: + table = result.get("table")[t] + ts = result.get_timestamp_id(self._current_timestamp) + + gi_0, gi_1 = reach.global_index + water_z = table[ts, gi_0 : gi_1 + 1] + + self.water[i].set_data(rk, water_z) def update_additional_data(self): - self.draw_additional_data(0) + self.draw_additional_data() self.update_idle() def update_current(self): - results = self.results[self._current_run_id] + results = self.results[0] reach = results.river.reach(self._current_reach_id) rk = reach.geometry.get_rk() z_min = reach.geometry.get_z_min() @@ -289,4 +300,6 @@ class PlotRKCEnsemble(PamhyrPlot): [rk[cid], rk[cid]], [z_max[cid], z_min[cid]] ) + self.canvas.figure.canvas.draw_idle() + self.update_idle() diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index 585fa3be..df554549 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -398,21 +398,21 @@ class ResultsWindow(PamhyrWindow): ) # Table and Plot - fun = { - "reach": self._set_current_reach, - "profile": self._set_current_profile, - "raw_data": self._set_current_profile_raw_data, - "solver": self._set_current_results, - } + funs = [ + ("reach", self._set_current_reach), + ("profile", self._set_current_profile), + ("raw_data", self._set_current_profile_raw_data), + ("solver", self._set_current_results), + ] - for t in ["reach", "profile", "raw_data", "solver"]: + for t, f in funs: table = self.find(QTableView, f"tableView_{t}") table.selectionModel()\ .selectionChanged\ - .connect(fun[t]) + .connect(f) - self._table[t].dataChanged.connect(fun[t]) + self._table[t].dataChanged.connect(f) self._slider_time.valueChanged.connect(self._set_current_timestamp) self._button_play.setChecked(False) @@ -1491,7 +1491,6 @@ class ResultsEnsembleWindow(ResultsWindow): results=self._results, reach_id=0, profile_id=0, - run_id=self._current_results, trad=self._trad, toolbar=self.toolbar_1, parent=self @@ -1541,20 +1540,19 @@ class ResultsEnsembleWindow(ResultsWindow): ) # Table and Plot - fun = { - "reach": self._set_current_reach, - "profile": self._set_current_profile, - "runs": self._set_current_results, - } + funs = [ + ("reach", self._set_current_reach), + ("profile", self._set_current_profile), + ] - for t in ["reach", "profile", "runs"]: + for t, f in funs: table = self.find(QTableView, f"tableView_{t}") table.selectionModel()\ .selectionChanged\ - .connect(fun[t]) + .connect(f) - self._table[t].dataChanged.connect(fun[t]) + self._table[t].dataChanged.connect(f) self._slider_time.valueChanged.connect(self._set_current_timestamp) self._button_play.setChecked(False) @@ -1569,64 +1567,38 @@ class ResultsEnsembleWindow(ResultsWindow): tab_widget = self.find(QTabWidget, f"tabWidget") tab_widget.currentChanged.connect(self.tab_changed) - def _set_current_results(self): - table = self.find(QTableView, f"tableView_runs") - indexes = table.selectedIndexes() - if len(indexes) == 0: - return - - self.update(runs_id=[i.row() for i in indexes]) - def update(self, reach_id=None, profile_id=None, - runs_id=None, timestamp=None): - tab_widget = self.find(QTabWidget, f"tabWidget") tab_index = tab_widget.currentIndex() name = tab_widget.tabText(tab_index) if reach_id is not None: - if tab_index == 1: + if tab_index == 0: self.plot_rkc.set_reach(reach_id) - elif tab_index == 2: + elif tab_index == 1: self.plot_h.set_reach(reach_id) - elif tab_index > 2: - self._additional_plot[name].set_reach(reach_id) self.update_table_selection_reach(reach_id) self.update_table_selection_profile(0) if profile_id is not None: - if tab_index == 1: + if tab_index == 0: self.plot_rkc.set_profile(profile_id[0]) - elif tab_index == 2: + elif tab_index == 1: self.plot_h.set_profile(profile_id) - elif tab_widget.currentIndex() > 2: - self._additional_plot[name].set_profile(profile_id[0]) tab_widget = self.find(QTabWidget, f"tabWidget") if tab_widget.currentIndex() != 2: self.update_table_selection_profile(profile_id[0]) - if runs_id is not None: - if tab_index == 1: - self._current_results = runs_id - self.plot_rkc.set_result(runs_id) - elif tab_index == 2: - self.plot_h.set_result(runs_id) - elif tab_widget.currentIndex() > 2: - self._additional_plot[name].set_result(runs_id) - if timestamp is not None: self.plot_rkc.set_timestamp(timestamp) - if tab_index == 2: + if tab_index == 1: self.plot_h.set_timestamp(timestamp) - if tab_widget.currentIndex() > 2: - self._additional_plot[name].set_timestamp(timestamp) - self.update_statusbar() def tab_changed(self, i):