From 634d0a4194bbee8504f70368a19c897c6667af6f Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 17 Apr 2023 11:50:09 +0200
Subject: [PATCH] Geometry: Update guidelines computation.

* src/Model/Geometry/Reach.py (compute_guidelines): Now return complete and incomplete guidelines names.
---
 src/Model/Geometry/ProfileXYZ.py    |   2 -
 src/Model/Geometry/Reach.py         |  28 ++++---
 src/View/Geometry/GeometryWindow.py | 119 ++++++++++++++--------------
 3 files changed, 76 insertions(+), 73 deletions(-)

diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index d7baf4b4..de194fbe 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -227,9 +227,7 @@ class ProfileXYZ(Profile):
                     station_i = (normalized_direction_vec[0] * xi +
                                  normalized_direction_vec[1] * yi)
                     station.append(station_i)
-
                     ret = np.array(station)
-
                     constant = ret[index_first_named_point]
             elif first_named_point is None:
                 vector = Vector1d(first_point_not_nan,
diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py
index f81416fe..ab79afd4 100644
--- a/src/Model/Geometry/Reach.py
+++ b/src/Model/Geometry/Reach.py
@@ -166,9 +166,11 @@ class Reach:
 
     # Guidelines
 
-    def _compute_guidelines_cache(self, guide_set, named_points):
+    def _compute_guidelines_cache(self, guide_set, named_points,
+                                  complete, incomplete):
         # Reset guide lines cache
         self._guidelines = {}
+        self._guidelines_is_valid = len(incomplete) == 0
 
         # Make a list of point for each guideline
         for guide in guide_set:
@@ -190,7 +192,7 @@ class Reach:
         """Compute reach guideline and check if is valid for all profiles
 
         Returns:
-            True if all guide line is valid
+            Tuple of complete and incomplete guidelines name.
         """
         # Get all point contains into a guideline
         named_points = [profile.named_points() for profile in self._profiles]
@@ -207,20 +209,24 @@ class Reach:
             points_name
         )
 
-        # All guide line is valid
-        is_ok = reduce(
-            bool.__and__,
-            map(
-                lambda l: len(set(l).symmetric_difference(guide_set)) == 0,
-                points_name
+        # Get incomplete guideline
+        incomplete = set(
+            reduce(
+                lambda acc, h: acc[1] + h[1],
+                map(
+                    lambda l: list(set(l).symmetric_difference(guide_set)),
+                    points_name
+                )
             )
         )
-        self._guidelines_is_valid = is_ok
+
+        complete = guide_set - incomplete
 
         # Compute guideline and put data in cache
-        self._compute_guidelines_cache(guide_set, named_points)
+        self._compute_guidelines_cache(guide_set, named_points,
+                                       complete, incomplete)
 
-        return is_ok
+        return (complete, incomplete)
 
     def _map_guidelines_points(self, func):
         return list(
diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py
index 9908831c..433b0b40 100644
--- a/src/View/Geometry/GeometryWindow.py
+++ b/src/View/Geometry/GeometryWindow.py
@@ -240,7 +240,7 @@ class GeometryWindow(QMainWindow, WindowToolKit):
             for x, y in zip(self._reach.get_x(), self._reach.get_y())
         ]
 
-        self.line_ld_1 = self.ui.canvas_1.axes.plot(
+        self.line_gl_1 = self.ui.canvas_1.axes.plot(
             self._reach.get_guidelines_x(),
             self._reach.get_guidelines_y()
         )
@@ -319,7 +319,7 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self.after_plot_selected_2.set_visible(False)
 
         try:
-            self.line_kp_zld = [
+            self.line_kp_zgl = [
                 self.ui.canvas_2.axes.plot(
                     self._reach.get_kp(), i, lw=1.
                 ) for i in self.model.z_complete_guideline()
@@ -348,10 +348,10 @@ class GeometryWindow(QMainWindow, WindowToolKit):
                 self._reach.profile(ind).y
             )
 
-        for i in range(len(self.line_ld_1)):
-            self.line_ld_1[i].set_data(
-                [x[i] for x in self.get_x_complete_list_ld],
-                [y[i] for y in self.get_y_complete_list_ld]
+        for i in range(len(self.line_gl_1)):
+            self.line_gl_1[i].set_data(
+                [x[i] for x in self.get_x_complete_list_gl],
+                [y[i] for y in self.get_y_complete_list_gl]
             )
 
         self.tableView.model().blockSignals(False)
@@ -374,8 +374,8 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         )
 
         try:
-            for i in range(len(self.line_kp_zld)):
-                self.line_kp_zld[i][0].set_data(
+            for i in range(len(self.line_kp_zgl)):
+                self.line_kp_zgl[i][0].set_data(
                     kp, self.model.z_complete_guideline()[i]
                 )
         except:
@@ -391,9 +391,9 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         selected_profile = 0
         station = self._reach.profile(selected_profile).get_station()
         station_plus_1 = self._reach.profile(selected_profile + 1).get_station()
-        elevation = self._reach.profile(selected_profile).z
-        elevation_i_plus_1 = self._reach.profile(selected_profile + 1).z
-        ld = self._reach.profile(selected_profile).name
+        elevation = self._reach.profile(selected_profile).z()
+        elevation_i_plus_1 = self._reach.profile(selected_profile + 1).z()
+        gl = self._reach.profile(selected_profile).name
 
         self.ui.canvas_3.axes.cla()
         self.ui.canvas_3.axes.grid(color='grey', linestyle='--', linewidth=0.5)
@@ -429,54 +429,53 @@ class GeometryWindow(QMainWindow, WindowToolKit):
             color=color_profile_i_plus_1, lw=1.6, linestyle='--'
         )
         self.annotation_3 = []
-        self.complete_list_ld = self._reach.get_complete_list_ld()
-        self.incomplete_list_ld = self._reach.get_incomplete_list_ld()
-
-        line_2d = [[line_2D] for line_2D in self.line_ld_1]
-        self.color_complete_ld = self.get_line_ld_colors(line_2d)
-        self.color_incomplete_ld = 2 * ["#000000"]
-
-        x_ld_complete = []
-        y_ld_complete = []
-        color_scat_complete_ld = []
-        x_ld_incomplete = []
-        y_ld_incomplete = []
-        color_scat_incomplete_ld = []
-
-        for i, txt in enumerate(list(ld)):
-            if txt.strip() in self.complete_list_ld:
+        self.complete_gl, self.incomplete_gl = self._reach.compute_guidelines()
+
+        line_2d = [[line_2D] for line_2D in self.line_gl_1]
+        self.color_complete_gl = self.get_line_gl_colors(line_2d)
+        self.color_incomplete_gl = 2 * ["#000000"]
+
+        x_gl_complete = []
+        y_gl_complete = []
+        color_scat_complete_gl = []
+        x_gl_incomplete = []
+        y_gl_incomplete = []
+        color_scat_incomplete_gl = []
+
+        for i, txt in enumerate(list(gl)):
+            if txt.strip() in self.complete_gl:
                 annotation_3 = self.ui.canvas_3.axes.annotate(
                     txt, (station[i], elevation[i]),
                     horizontalalignment='left',
                     verticalalignment='top', annotation_clip=True,
                     fontsize=10,
-                    color=self.color_complete_ld[
-                        self.complete_list_ld.index(txt)
+                    color=self.color_complete_gl[
+                        self.complete_gl.index(txt)
                     ]
                 )
 
                 annotation_3.set_position((station[i] + 0., elevation[i] + 0.))
                 self.annotation_3.append(annotation_3)
 
-                x_ld_complete.append(station[i])
-                y_ld_complete.append(elevation[i])
-                color_scat_complete_ld.append(self.color_complete_ld[self.complete_list_ld.index(txt)])
-            elif txt.strip() in self.incomplete_list_ld:
+                x_gl_complete.append(station[i])
+                y_gl_complete.append(elevation[i])
+                color_scat_complete_gl.append(self.color_complete_gl[self.complete_gl.index(txt)])
+            elif txt.strip() in self.incomplete_gl:
                 annotate = self.ui.canvas_3.axes.annotate(
                     txt, (station[i], elevation[i]), horizontalalignment='left',
                     verticalalignment='top', annotation_clip=True, fontsize=11,
-                    color=self.color_incomplete_ld[
-                        self.incomplete_list_ld.index(txt)
+                    color=self.color_incomplete_gl[
+                        self.incomplete_gl.index(txt)
                     ],
                     size=10
                 )
 
                 self.annotation_3.append(annotate)
 
-                x_ld_incomplete.append(station[i])
-                y_ld_incomplete.append(elevation[i])
-                color_scat_incomplete_ld.append(
-                    self.color_incomplete_ld[self.incomplete_list_ld.index(txt)]
+                x_gl_incomplete.append(station[i])
+                y_gl_incomplete.append(elevation[i])
+                color_scat_incomplete_gl.append(
+                    self.color_incomplete_gl[self.incomplete_gl.index(txt)]
                 )
 
         self.tableView.model().blockSignals(False)
@@ -497,45 +496,45 @@ class GeometryWindow(QMainWindow, WindowToolKit):
 
         x = self.profile(ind).get_station()
         y = self._reach.profile(ind).z()
-        ld = self._reach.profile(ind).name
-        get_complete_list_ld = self._reach.get_complete_list_ld()
-        get_incomplete_list_ld = self._reach.get_incomplete_list_ld()
+        gl = self._reach.profile(ind).name
+        get_complete_list_gl = self._reach.get_complete_list_gl()
+        get_incomplete_list_gl = self._reach.get_incomplete_list_gl()
 
         try:
-            x_ld_complete = []
-            color_scat_complete_ld = []
-            x_ld_incomplete = []
-            color_scat_incomplete_ld = []
-            for i, txt in enumerate(list(ld)):
-                if txt in get_complete_list_ld:
+            x_gl_complete = []
+            color_scat_complete_gl = []
+            x_gl_incomplete = []
+            color_scat_incomplete_gl = []
+            for i, txt in enumerate(list(gl)):
+                if txt in get_complete_list_gl:
                     annotate = self.ui.canvas_3.axes.annotate(
                         txt, (x[i], y[i]), horizontalalignment='left',
                         verticalalignment='top', annotation_clip=True,
                         fontsize=11,
-                        color=self.color_complete_ld[
-                            get_complete_list_ld.index(txt)
+                        color=self.color_complete_gl[
+                            get_complete_list_gl.index(txt)
                         ],
                         size=10
                     )
                     self.annotation_3.append(annotate)
-                    x_ld_complete.append([x[i], y[i]])
-                    color_scat_complete_ld.append(
-                        self.color_complete_ld[self.complete_list_ld.index(txt)]
+                    x_gl_complete.append([x[i], y[i]])
+                    color_scat_complete_gl.append(
+                        self.color_complete_gl[self.complete_gl.index(txt)]
                     )
-                elif txt in get_incomplete_list_ld:
+                elif txt in get_incomplete_list_gl:
                     annotate = self.ui.canvas_3.axes.annotate(
                         txt, (x[i], y[i]), horizontalalignment='left',
                         verticalalignment='top', annotation_clip=True,
                         fontsize=11,
-                        color=self.color_incomplete_ld[
-                            get_incomplete_list_ld.index(txt)
+                        color=self.color_incomplete_gl[
+                            get_incomplete_list_gl.index(txt)
                         ],
                         size=10
                     )
                     self.annotation_3.append(annotate)
-                    x_ld_incomplete.append([x[i], y[i]])
-                    color_scat_incomplete_ld.append(
-                        self.color_incomplete_ld[get_incomplete_list_ld.index(txt)]
+                    x_gl_incomplete.append([x[i], y[i]])
+                    color_scat_incomplete_gl.append(
+                        self.color_incomplete_gl[get_incomplete_list_gl.index(txt)]
                     )
         except:
             print("FIXME")
@@ -543,7 +542,7 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self.tableView.model().blockSignals(False)
         self.ui.canvas_3.figure.canvas.draw_idle()
 
-    def get_line_ld_colors(self, line_2d):
+    def get_line_gl_colors(self, line_2d):
         colors = []
 
         for line in line_2d:
-- 
GitLab