From 2896c604a5eb82b5358663f6d6f29f0c7844b9b6 Mon Sep 17 00:00:00 2001 From: Theophile Terraz <theophile.terraz@inrae.fr> Date: Mon, 4 Nov 2024 17:44:30 +0100 Subject: [PATCH] export envelops to .csv --- src/View/Results/CustomPlot/Plot.py | 26 ++--- src/View/Results/CustomPlot/Translate.py | 4 +- src/View/Results/Window.py | 125 +++++++++++++++++------ src/View/Results/translate.py | 15 ++- src/View/Translate.py | 4 +- 5 files changed, 123 insertions(+), 51 deletions(-) diff --git a/src/View/Results/CustomPlot/Plot.py b/src/View/Results/CustomPlot/Plot.py index c8bb0c6c..f807d508 100644 --- a/src/View/Results/CustomPlot/Plot.py +++ b/src/View/Results/CustomPlot/Plot.py @@ -165,7 +165,7 @@ class CustomPlot(PamhyrPlot): color='blue', linestyle='dotted', ) - #self.lines["water_elevation_envelop2"] = line2 + # self.lines["water_elevation_envelop2"] = line2 if "discharge" in self._y: @@ -204,7 +204,7 @@ class CustomPlot(PamhyrPlot): color='r', linestyle='dotted', ) - #self.lines["discharge_envelop2"] = line2 + # self.lines["discharge_envelop2"] = line2 if "velocity" in self._y: @@ -226,8 +226,9 @@ class CustomPlot(PamhyrPlot): if self._envelop: - velocities = list(map(lambda p: - list(map(lambda q, z: + velocities = list(map( + lambda p: list(map( + lambda q, z: p.geometry.speed(q, z), p.get_key("Q"), p.get_key("Z") )), reach.profiles @@ -250,7 +251,7 @@ class CustomPlot(PamhyrPlot): color='g', linestyle='dotted', ) - #self.lines["velocity_envelop2"] = line2 + # self.lines["velocity_envelop2"] = line2 if "depth" in self._y: @@ -272,8 +273,8 @@ class CustomPlot(PamhyrPlot): ax = self._axes[unit["depth_envelop"]] - d = list(map(lambda p1, p2: p1 - p2, - map( + d = list(map( + lambda p1, p2: p1 - p2, map( lambda p: max(p.get_key("Z")), reach.profiles ), z_min) @@ -285,8 +286,8 @@ class CustomPlot(PamhyrPlot): ) self.lines["depth_envelop"] = line1 - d = list(map(lambda p1, p2: p1 - p2, - map( + d = list(map( + lambda p1, p2: p1 - p2, map( lambda p: min(p.get_key("Z")), reach.profiles ), z_min) @@ -296,7 +297,7 @@ class CustomPlot(PamhyrPlot): color='brown', lw=1., linestyle='dotted', ) - #self.lines["depth_envelop2"] = line2 + # self.lines["depth_envelop2"] = line2 if "mean_depth" in self._y: @@ -781,10 +782,9 @@ class CustomPlot(PamhyrPlot): @timer def update(self): - if not self._init: - #self.draw_static() - self.draw_current() + #if not self._init: self.draw_update() + self.draw_current() return def set_reach(self, reach_id): diff --git a/src/View/Results/CustomPlot/Translate.py b/src/View/Results/CustomPlot/Translate.py index 1bfe7f96..b864f206 100644 --- a/src/View/Results/CustomPlot/Translate.py +++ b/src/View/Results/CustomPlot/Translate.py @@ -36,7 +36,9 @@ class CustomPlotTranslate(ResultsTranslate): self._dict['time'] = self._dict["unit_time_s"] self._dict['rk'] = self._dict["unit_rk"] self._dict['water_elevation'] = self._dict["unit_water_elevation"] - self._dict['water_elevation_envelop'] = self._dict["unit_water_elevation_envelop"] + self._dict['water_elevation_envelop'] = self._dict[ + "unit_water_elevation_envelop" + ] self._dict['discharge'] = self._dict["unit_discharge"] self._dict['discharge_envelop'] = self._dict["unit_discharge_envelop"] self._dict['bed_elevation'] = self._dict["unit_bed_elevation"] diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py index 38f7005d..00b4434e 100644 --- a/src/View/Results/Window.py +++ b/src/View/Results/Window.py @@ -591,7 +591,7 @@ class ResultsWindow(PamhyrWindow): dlg = CustomPlotValuesSelectionDialog(parent=self) if dlg.exec(): - x, y, = dlg.value + x, y, envelop = dlg.value else: return @@ -601,12 +601,12 @@ class ResultsWindow(PamhyrWindow): ) self.file_dialog( select_file="AnyFile", - callback=lambda f: self.export_to(f[0], x, y), + callback=lambda f: self.export_to(f[0], x, y, envelop), default_suffix=".csv", file_filter=["CSV (*.csv)"], ) - def export_to(self, filename, x, y): + def export_to(self, filename, x, y, envelop): timestamps = sorted(self._results.get("timestamps")) reach = self._results.river.reachs[self._get_current_reach()] first_line = [f"Study: {self._results.study.name}", @@ -614,7 +614,7 @@ class ResultsWindow(PamhyrWindow): if x == "rk": timestamp = self._get_current_timestamp() first_line.append(f"Time: {timestamp}s") - val_dict = self._export_rk(timestamp, y, filename) + val_dict = self._export_rk(timestamp, y, envelop, filename) elif x == "time": profile_id = self._get_current_profile() profile = reach.profile(profile_id) @@ -626,15 +626,14 @@ class ResultsWindow(PamhyrWindow): writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) dict_x = self._trad.get_dict("values_x") - dict_y = self._trad.get_dict("values_y") - header = [dict_x[x]] + header = [] writer.writerow(first_line) - for text in y: - header.append(dict_y[text]) + for text in val_dict.keys(): + header.append(text) writer.writerow(header) - for row in range(len(val_dict[x])): - line = [val_dict[x][row]] - for var in y: + 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) @@ -676,28 +675,59 @@ class ResultsWindow(PamhyrWindow): self._additional_plot.pop(tab_widget.tabText(index)) tab_widget.removeTab(index) - def _export_rk(self, timestamp, y, filename): + def _export_rk(self, timestamp, y, envelop, filename): reach = self._results.river.reachs[self._get_current_reach()] + dict_x = self._trad.get_dict("values_x") + dict_y = self._trad.get_dict("values_y") + if envelop: + dict_y.update(self._trad.get_dict("values_y_envelop")) my_dict = {} - my_dict["rk"] = reach.geometry.get_rk() - if "elevation" in y: - my_dict["elevation"] = reach.geometry.get_z_min() + my_dict[dict_x["rk"]] = reach.geometry.get_rk() + if "bed_elevation" in y: + my_dict[dict_y["bed_elevation"]] = reach.geometry.get_z_min() if "discharge" in y: - my_dict["discharge"] = list( + my_dict[dict_y["discharge"]] = list( map( lambda p: p.get_ts_key(timestamp, "Q"), reach.profiles ) ) + if envelop: + my_dict[dict_y["min_discharge"]] = list( + map( + lambda p: min(p.get_key("Q")), + reach.profiles + ) + ) + my_dict[dict_y["max_discharge"]] = list( + map( + lambda p: max(p.get_key("Q")), + reach.profiles + ) + ) if "water_elevation" in y: - my_dict["water_elevation"] = list( + my_dict[dict_y["water_elevation"]] = list( map( lambda p: p.get_ts_key(timestamp, "Z"), reach.profiles ) ) + if envelop: + my_dict[dict_y["min_water_elevation"]] = list( + map( + lambda p: min(p.get_key("Z")), + reach.profiles + ) + ) + my_dict[dict_y["max_water_elevation"]] = list( + map( + lambda p: max(p.get_key("Z")), + reach.profiles + ) + ) + if "velocity" in y: - my_dict["velocity"] = list( + my_dict[dict_y["velocity"]] = list( map( lambda p: p.geometry.speed( p.get_ts_key(timestamp, "Q"), @@ -705,16 +735,44 @@ class ResultsWindow(PamhyrWindow): reach.profiles ) ) + if envelop: + velocities = list(map( + lambda p: list(map( + lambda q, z: + p.geometry.speed(q, z), + p.get_key("Q"), p.get_key("Z") + )), reach.profiles + ) + ) + my_dict[dict_y["min_velocity"]] = [min(v) for v in velocities] + my_dict[dict_y["max_velocity"]] = [max(v) for v in velocities] + if "depth" in y: - my_dict["depth"] = list( + my_dict[dict_y["depth"]] = list( map( lambda p: p.geometry.max_water_depth( p.get_ts_key(timestamp, "Z")), reach.profiles ) ) + if envelop: + my_dict[dict_y["min_depth"]] = list(map( + lambda p1, p2: p1 - p2, map( + lambda p: min(p.get_key("Z")), + reach.profiles + ), reach.geometry.get_z_min() + ) + ) + my_dict[dict_y["max_depth"]] = list(map( + lambda p1, p2: p1 - p2, map( + lambda p: max(p.get_key("Z")), + reach.profiles + ), reach.geometry.get_z_min() + ) + ) + if "mean_depth" in y: - my_dict["mean_depth"] = list( + my_dict[dict_y["mean_depth"]] = list( map( lambda p: p.geometry.mean_water_depth( p.get_ts_key(timestamp, "Z")), @@ -722,7 +780,7 @@ class ResultsWindow(PamhyrWindow): ) ) if "froude" in y: - my_dict["froude"] = list( + my_dict[dict_y["froude"]] = list( map( lambda p: p.geometry.speed( @@ -738,7 +796,7 @@ class ResultsWindow(PamhyrWindow): ) ) if "wet_area" in y: - my_dict["wet_area"] = list( + my_dict[dict_y["wet_area"]] = list( map( lambda p: p.geometry.wet_area( p.get_ts_key(timestamp, "Z")), @@ -753,33 +811,36 @@ class ResultsWindow(PamhyrWindow): profile = reach.profile(profile) ts = list(self._results.get("timestamps")) ts.sort() + dict_x = self._trad.get_dict("values_x") + dict_y = self._trad.get_dict("values_y") my_dict = {} - my_dict["time"] = ts + my_dict[dict_x["time"]] = ts z = profile.get_key("Z") q = profile.get_key("Q") - if "elevation" in y: - my_dict["elevation"] = [profile.geometry.z_min()] * len(ts) + if "bed_elevation" in y: + my_dict[dict_y["bed_elevation"]] = [ + profile.geometry.z_min()] * len(ts) if "discharge" in y: - my_dict["discharge"] = q + my_dict[dict_y["discharge"]] = q if "water_elevation" in y: - my_dict["water_elevation"] = z + my_dict[dict_y["water_elevation"]] = z if "velocity" in y: - my_dict["velocity"] = list( + my_dict[dict_y["velocity"]] = list( map( lambda q, z: profile.geometry.speed(q, z), q, z ) ) if "depth" in y: - my_dict["depth"] = list( + my_dict[dict_y["depth"]] = list( map(lambda z: profile.geometry.max_water_depth(z), z) ) if "mean_depth" in y: - my_dict["mean_depth"] = list( + my_dict[dict_y["mean_depth"]] = list( map(lambda z: profile.geometry.mean_water_depth(z), z) ) if "froude" in y: - my_dict["froude"] = list( + my_dict[dict_y["froude"]] = list( map(lambda z, q: profile.geometry.speed(q, z) / sqrt(9.81 * ( @@ -788,7 +849,7 @@ class ResultsWindow(PamhyrWindow): ), z, q) ) if "wet_area" in y: - my_dict["wet_area"] = list( + my_dict[dict_y["wet_area"]] = list( map(lambda z: profile.geometry.wet_area(z), z) ) diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py index 68675e51..abdc2efb 100644 --- a/src/View/Results/translate.py +++ b/src/View/Results/translate.py @@ -75,14 +75,21 @@ class ResultsTranslate(MainTranslate): self._sub_dict["values_y"] = { "bed_elevation": self._dict["unit_bed_elevation"], "water_elevation": self._dict["unit_water_elevation"], - #"water_elevation_envelop": self._dict["unit_water_elevation_envelop"], "discharge": self._dict["unit_discharge"], - #"discharge_envelop": self._dict["unit_discharge_envelop"], "velocity": self._dict["unit_velocity"], - #"velocity_envelop": self._dict["unit_velocity_envelop"], "depth": self._dict["unit_depth"], - #"depth_envelop": self._dict["unit_depth_envelop"], "mean_depth": self._dict["unit_mean_depth"], "froude": self._dict["unit_froude"], "wet_area": self._dict["unit_wet_area"], } + + self._sub_dict["values_y_envelop"] = { + "min_water_elevation": self._dict["unit_min_water_elevation"], + "max_water_elevation": self._dict["unit_max_water_elevation"], + "min_discharge": self._dict["unit_min_discharge"], + "max_discharge": self._dict["unit_max_discharge"], + "min_velocity": self._dict["unit_min_velocity"], + "max_velocity": self._dict["unit_max_velocity"], + "min_depth": self._dict["unit_min_depth"], + "max_depth": self._dict["unit_max_depth"], + } diff --git a/src/View/Translate.py b/src/View/Translate.py index 160c95e9..fcde628a 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -69,7 +69,9 @@ class UnitTranslate(CommonWordTranslate): self._dict["unit_diameter"] = _translate("Unit", "Diameter (m)") self._dict["unit_thickness"] = _translate("Unit", "Thickness (m)") self._dict["unit_elevation"] = _translate("Unit", "Elevation (m)") - self._dict["unit_bed_elevation"] = _translate("Unit", "Bed Elevation (m)") + self._dict["unit_bed_elevation"] = _translate( + "Unit", "Bed Elevation (m)" + ) self._dict["unit_water_elevation"] = _translate( "Unit", "Water Elevation (m)" ) -- GitLab