From 1fb42a73fa082b2ae3e7d5d53ed232ee9ab6243d Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Tue, 18 Apr 2023 14:48:49 +0200
Subject: [PATCH] geometry: Fix some guidelines display.

---
 src/Model/Geometry/Reach.py         | 18 +++++++++++++-----
 src/View/Geometry/GeometryWindow.py | 15 ++++++++++++---
 src/tools.py                        | 16 ++++++++--------
 3 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py
index ea2c59a0..dad47caa 100644
--- a/src/Model/Geometry/Reach.py
+++ b/src/Model/Geometry/Reach.py
@@ -8,7 +8,7 @@ from copy import deepcopy
 from operator import itemgetter
 from functools import reduce
 
-from tools import flatten
+from tools import flatten, timer
 
 from Model.Geometry.Profile import Profile
 from Model.Geometry.ProfileXYZ import ProfileXYZ
@@ -167,10 +167,13 @@ class Reach:
 
     # Guidelines
 
+    @timer
     def _compute_guidelines_cache(self, guide_set, named_points,
                                   complete, incomplete):
         # Reset guide lines cache
         self._guidelines = {}
+        self._complete_guidelines = complete.copy()
+        self._incomplete_guidelines = incomplete.copy()
         self._guidelines_is_valid = len(incomplete) == 0
 
         # Make a list of point for each guideline
@@ -189,6 +192,7 @@ class Reach:
                 )
             )
 
+    @timer
     def compute_guidelines(self):
         """Compute reach guideline and check if is valid for all profiles
 
@@ -229,9 +233,9 @@ class Reach:
 
         return (complete, incomplete)
 
-    def _map_guidelines_points(self, func, _filter=None):
+    def _map_guidelines_points(self, func, full=False):
         if len(self._guidelines) == 0:
-            _ = compute_guidelines()
+            _ = self.compute_guidelines()
 
         return list(
             # Map for each guideline
@@ -243,13 +247,17 @@ class Reach:
                         self._guidelines[k],
                     )
                 ),
-                self._guidelines if not _filter else filter(
-                    _filter,
+                # Get only guide lines if FULL False
+                self._guidelines if full else filter(
+                    lambda x: x in self._complete_guidelines,
                     self._guidelines
                 )
             )
         )
 
+    def _complete_filter(self, gl):
+        return gl in self._complete_guidelines
+
     def get_guidelines_x(self):
         return self._map_guidelines_points(lambda p: p.x)
 
diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py
index b3a6e5ff..3a3574c8 100644
--- a/src/View/Geometry/GeometryWindow.py
+++ b/src/View/Geometry/GeometryWindow.py
@@ -6,6 +6,8 @@ import sys
 import csv
 import time
 
+from tools import timer
+
 from PyQt5 import QtWidgets
 from PyQt5.QtCore import (
     QModelIndex, Qt, QSettings, pyqtSlot,
@@ -220,9 +222,12 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self.list_second_window = []
         self.list_row = []
 
+    @timer
     def graphic_1(self):
         self.ui.canvas_1.axes.cla()
         self.ui.canvas_1.axes.grid(color='grey', linestyle='--', linewidth=0.5)
+
+        # Axes
         self.ui.canvas_1.axes.set_xlabel(
             _translate("MainWindow_reach", "X (m)"), color='green', fontsize=12
         )
@@ -230,13 +235,17 @@ class GeometryWindow(QMainWindow, WindowToolKit):
             _translate("MainWindow_reach", "Y (m)"), color='green', fontsize=12
         )
 
+        # Draw line for each profile
         self.line_xy = [
-            self.ui.canvas_1.axes.plot(x, y, color='r', lw=1.,
-                                       markersize=3, marker='+')
+            self.ui.canvas_1.axes.plot(
+                x, y,
+                color='r', lw=1.,
+                markersize=3, marker='+'
+            )
             for x, y in zip(self._reach.get_x(), self._reach.get_y())
         ]
 
-
+        # Guide lines
         self.x_complete = self._reach.get_guidelines_x()
         self.y_complete = self._reach.get_guidelines_y()
 
diff --git a/src/tools.py b/src/tools.py
index ad559a45..285a49d4 100644
--- a/src/tools.py
+++ b/src/tools.py
@@ -23,10 +23,10 @@ def display_timers():
     global _timers
     global _calls
 
-    print(" +--Timers----------------------------------------+")
+    print(" +---------------------------------------------------------Timers--+")
     for func in _timers:
-        print(f" | {func:<15} | {_timers[func]:>10.6f} sec | {_calls[func]:>5} calls |")
-    print(" +------------------------------------------------+")
+        print(f" | {func:<32} | {_timers[func]:>10.6f} sec | {_calls[func]:>5} calls |")
+    print(" +-----------------------------------------------------------------+")
 
 def timer(func):
     """Function wrapper to register function runtime"""
@@ -39,12 +39,12 @@ def timer(func):
         end_time = time.perf_counter()
         run_time = end_time - start_time
 
-        if func.__name__ not in _timers:
-            _timers[func.__name__] = 0
-            _calls[func.__name__] = 0
+        if func.__qualname__ not in _timers:
+            _timers[func.__qualname__] = 0
+            _calls[func.__qualname__] = 0
 
-        _timers[func.__name__] += run_time
-        _calls[func.__name__] += 1
+        _timers[func.__qualname__] += run_time
+        _calls[func.__qualname__] += 1
 
         return value
 
-- 
GitLab