From 8c2874e04daf193405963765ca32af68d26c19e5 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Tue, 23 Apr 2024 14:29:11 +0200
Subject: [PATCH] Geometry: Compute KP at shape file import.

---
 src/Model/Geometry/PointXYZ.py | 18 +++++++++++++++++-
 src/Model/Geometry/Reach.py    | 23 ++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/Model/Geometry/PointXYZ.py b/src/Model/Geometry/PointXYZ.py
index 2e806687..cf678c24 100644
--- a/src/Model/Geometry/PointXYZ.py
+++ b/src/Model/Geometry/PointXYZ.py
@@ -192,6 +192,22 @@ class PointXYZ(Point, SQLSubModel):
     def dist(self, p2):
         return PointXYZ.distance(self, p2)
 
+    def dist_2d(self, p2):
+        return PointXYZ.distance_2d(self, p2)
+
+    @staticmethod
+    def distance_2d(p1, p2):
+        """Euclidean distance between p1 and p2.
+
+        Args:
+            p1: A XYZ Point
+            p2: A XYZ Point
+
+        Returns:
+            Euclidean 2D distance between the two points
+        """
+        return dist((p1.x, p1.y), (p2.x, p2.y))
+
     @staticmethod
     def distance(p1, p2):
         """Euclidean distance between p1 and p2.
@@ -201,6 +217,6 @@ class PointXYZ(Point, SQLSubModel):
             p2: A XYZ Point
 
         Returns:
-            Euclidean distance between the two points
+            Euclidean 3D distance between the two points
         """
         return dist((p1.x, p1.y, p1.z), (p2.x, p2.y, p2.z))
diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py
index 1b7748fe..e294a087 100644
--- a/src/Model/Geometry/Reach.py
+++ b/src/Model/Geometry/Reach.py
@@ -573,7 +573,6 @@ class Reach(SQLSubModel):
                 ind += 1
 
             prof = ProfileXYZ(
-                kp=round(points[0][0]),
                 reach=self, status=self._status
             )
             prof.import_points(points)
@@ -582,6 +581,7 @@ class Reach(SQLSubModel):
 
         self.profiles = profiles + self.profiles
         self._update_profile_numbers()
+        self._recompute_kp()
 
         return profiles
 
@@ -814,3 +814,24 @@ class Reach(SQLSubModel):
         except Exception as e:
             logger_exception(e)
             return 0
+
+    def _recompute_kp(self, offset=0.0):
+        self._recompute_kp_no_gl(offset=offset)
+
+    def _recompute_kp_no_gl(self, offset=0.0):
+        profiles = iter(self.profiles)
+
+        previous = next(profiles)
+        previous.kp = offset
+
+        for profile in profiles:
+            prev_points = previous.points
+            curr_points = profile.points
+
+            dist = (
+                prev_points[0].dist_2d(curr_points[0]) +
+                prev_points[-1].dist_2d(curr_points[-1])
+            ) / 2.0
+
+            profile.kp = previous.kp + dist
+            previous = profile
-- 
GitLab