From 21197ead2385316f0107f6ec71d6d82b6779633c Mon Sep 17 00:00:00 2001
From: Theophile Terraz <theophile.terraz@inrae.fr>
Date: Thu, 30 Nov 2023 15:06:00 +0100
Subject: [PATCH] work on vater limits for top view visualization

---
 src/Model/Geometry/Profile.py    |  4 ++++
 src/Model/Geometry/ProfileXYZ.py | 41 ++++++++++++++++++++++++++++++++
 src/Solver/Mage.py               |  6 +++++
 3 files changed, 51 insertions(+)

diff --git a/src/Model/Geometry/Profile.py b/src/Model/Geometry/Profile.py
index ad1b8225..ee662308 100644
--- a/src/Model/Geometry/Profile.py
+++ b/src/Model/Geometry/Profile.py
@@ -351,3 +351,7 @@ class Profile(object):
     # Abstract method for width approximation
     def width_approximation(self):
         raise NotImplementedMethodeError(self, self.width_approximation)
+
+    # Abstract method for width approximation
+    def get_water_limits(self, z):
+        raise NotImplementedMethodeError(self, self.get_water_limits)
diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index dfe18702..2763924b 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -442,3 +442,44 @@ class ProfileXYZ(Profile, SQLSubModel):
         rd = self.get_point_by_name("rd")
 
         return abs(rg.dist(rd))
+
+    def get_water_limits(self, z):
+#==============================================================================
+#   détermination des points limites RG et RD pour un niveau d'eau donné
+#
+#   irg et ird sont les premiers indices en partant des rives gauche et
+#   droite qui correspondent à des points sous la surface de l'eau
+#   ptX et ptY sont les points interpolés où le plan d'eau intersecte le profil
+#   known_level est le niveau d'eau pour lequel on a obtenu irg, ird, ptX et ptY
+#==============================================================================
+        # initialisation
+        irg = -1  ;  ird = -1
+        for i in range(self.number_points):
+            if self.point(i).z <= z:
+                irg = i
+        for i in reversed(range(self.number_points)):
+            if self.point(i).z <= z:
+                ird = i
+        # interpolation des points ptX et ptY
+        if (irg > 0):
+            x=np.interp(z,
+                        [self.point(irg).z,self.point(irg+1).z],
+                        [self.point(irg).x,self.point(irg+1).x])
+            y=np.interp(z,
+                        [self.point(irg).z,self.point(irg+1).z],
+                        [self.point(irg).y,self.point(irg+1).y])
+            ptX=PointXYZ(x,y,z)
+        else:
+            ptX = self.point(0)
+        if (ird < self.number_points-1):
+            x=np.interp(z,
+                        [self.point(ird).z,self.point(ird+1).z],
+                        [self.point(ird).x,self.point(ird+1).x])
+            y=np.interp(z,
+                        [self.point(ird).z,self.point(ird+1).z],
+                        [self.point(ird).y,self.point(ird+1).y])
+            ptY=PointXYZ(x,y,z)
+        else:
+            ptY = self.point(self.number_points-1)
+
+        return ptX,ptY
diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py
index fa4ce18c..22349870 100644
--- a/src/Solver/Mage.py
+++ b/src/Solver/Mage.py
@@ -813,6 +813,12 @@ class Mage8(Mage):
 
                         # Set data for profile RI
                         reach.set(ri, timestamp, key, d)
+                        if key == "Z":
+                            profile = study.river.current_reach().reach.profile(ri)
+                            ptX,ptY = profile.get_water_limits(d)
+                            reach.set(ri, timestamp, "ptX", ptX)
+                            reach.set(ri, timestamp, "ptY", ptY)
+
 
                 endline()
                 end = newline().size <= 0
-- 
GitLab