From 52c311887a2c147bd7b005d2c4f89fc1e2affe48 Mon Sep 17 00:00:00 2001
From: Theophile Terraz <theophile.terraz@inrae.fr>
Date: Wed, 17 Jul 2024 11:36:57 +0200
Subject: [PATCH] more hydraulic values in raw results

---
 src/Model/Geometry/ProfileXYZ.py | 26 +++++++++++++++++++++++---
 src/View/Results/Table.py        | 29 ++++++++++++++++++++++++++++-
 src/View/Results/translate.py    |  7 ++++++-
 src/View/Translate.py            | 10 +++++++++-
 4 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index 9d31a97d..ee765c22 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -402,12 +402,12 @@ class ProfileXYZ(Profile, SQLSubModel):
         return abs(rg.dist(rd))
 
     def wet_perimeter(self, z):
-        poly = self.wet_polygon(z)
+        line = self.wet_line(z)
 
-        if poly is None:
+        if line is None:
             return 0
 
-        return poly.length
+        return line.length
 
     def wet_area(self, z):
         poly = self.wet_polygon(z)
@@ -417,6 +417,26 @@ class ProfileXYZ(Profile, SQLSubModel):
 
         return poly.area
 
+    def wet_radius(self, z):
+        p = self.wet_perimeter(z)
+        a = self.wet_area(z)
+
+        if p == 0:
+            return 0
+
+        return a/p
+
+    def wet_line(self, z):
+        points = self.wet_points(z)
+        if len(points) < 3:
+            return None
+
+        z = map(lambda p: p.z, points)
+        station = self._get_station(points)
+
+        line = geometry.LineString(list(zip(station, z)))
+        return line
+
     def wet_polygon(self, z):
         points = self.wet_points(z)
         if len(points) < 3:
diff --git a/src/View/Results/Table.py b/src/View/Results/Table.py
index 7ce91f38..1b16a882 100644
--- a/src/View/Results/Table.py
+++ b/src/View/Results/Table.py
@@ -86,12 +86,39 @@ class TableModel(PamhyrTableModel):
             elif self._headers[column] == "discharge":
                 v = self._lst[row].get_ts_key(self._timestamp, "Q")
                 return f"{v:.4f}"
-            elif self._headers[column] == "speed":
+            elif self._headers[column] == "velocity":
                 q = self._lst[row].get_ts_key(self._timestamp, "Q")
                 z = self._lst[row].get_ts_key(self._timestamp, "Z")
 
                 v = self._lst[row].geometry.speed(q, z)
                 return f"{v:.4f}"
+            elif self._headers[column] == "width":
+                pt_left, pt_right = self._lst[row].get_ts_key(
+                    self._timestamp,
+                    "water_limits"
+                )
+                v = pt_left.dist_2d(pt_right)
+                return f"{v:.4f}"
+            elif self._headers[column] == "depth":
+                z = self._lst[row].get_ts_key(self._timestamp, "Z")
+                z_min = self._lst[row].geometry.z_min()
+                v = z - z_min
+                return f"{v:.4f}"
+            elif self._headers[column] == "wet_area":
+                z = self._lst[row].get_ts_key(self._timestamp, "Z")
+                v = self._lst[row].geometry.wet_area(z)
+                return f"{v:.4f}"
+            elif self._headers[column] == "wet_perimeter":
+                z = self._lst[row].get_ts_key(self._timestamp, "Z")
+                v = self._lst[row].geometry.wet_perimeter(z)
+                return f"{v:.4f}"
+            elif self._headers[column] == "hydraulic_radius":
+                z = self._lst[row].get_ts_key(self._timestamp, "Z")
+                v = self._lst[row].geometry.wet_radius(z)
+                return f"{v:.4f}"
+            else:
+                v = 0.0
+                return f"{v:.4f}"
 
         return QVariant()
 
diff --git a/src/View/Results/translate.py b/src/View/Results/translate.py
index 55c9c45e..05ae7d6b 100644
--- a/src/View/Results/translate.py
+++ b/src/View/Results/translate.py
@@ -57,5 +57,10 @@ class ResultsTranslate(MainTranslate):
             "name": _translate("Results", "Profile"),
             "water_elevation": self._dict["unit_water_elevation"],
             "discharge": self._dict["unit_discharge"],
-            "speed": self._dict["unit_speed"],
+            "velocity": self._dict["unit_speed"],
+            "width": self._dict["unit_width"],
+            "depth": self._dict["unit_height"],
+            "wet_area": self._dict["unit_wet_area"],
+            "wet_perimeter": self._dict["unit_wet_perimeter"],
+            "hydraulic_radius": self._dict["unit_hydraulic_radius"],
         }
diff --git a/src/View/Translate.py b/src/View/Translate.py
index 16b198b5..a9c3d8ee 100644
--- a/src/View/Translate.py
+++ b/src/View/Translate.py
@@ -61,7 +61,7 @@ class UnitTranslate(CommonWordTranslate):
         self._dict["unit_water_elevation"] = _translate(
             "Unit", "Water elevation (m)"
         )
-        self._dict["unit_speed"] = _translate("Unit", "Speed (m/s)")
+        self._dict["unit_speed"] = _translate("Unit", "Velocity (m/s)")
         self._dict["unit_discharge"] = _translate("Unit", "Discharge (m³/s)")
         self._dict["unit_area"] = _translate("Unit", "Area (hectare)")
 
@@ -71,6 +71,14 @@ class UnitTranslate(CommonWordTranslate):
         self._dict["unit_date_s"] = _translate("Unit", "Date (sec)")
         self._dict["unit_date_iso"] = _translate("Unit", "Date (ISO format)")
 
+        self._dict["unit_wet_area"] = _translate("Unit", "Wet Area (m²)")
+        self._dict["unit_wet_perimeter"] = _translate(
+            "Unit", "Wet Perimeter (m)"
+        )
+        self._dict["unit_hydraulic_radius"] = _translate(
+            "Unit", "Hydraulic Radius (m)"
+        )
+
 
 class MainTranslate(UnitTranslate):
     def __init__(self):
-- 
GitLab