From 870cba5005a3b15fa716cda5d09db42686c50ab9 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 17 Jan 2024 11:02:44 +0100
Subject: [PATCH] Geometry: Fix width_approximation when rg and rd is missing.

---
 src/Model/Geometry/ProfileXYZ.py | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py
index 37b32339..2b29b1f7 100644
--- a/src/Model/Geometry/ProfileXYZ.py
+++ b/src/Model/Geometry/ProfileXYZ.py
@@ -19,6 +19,7 @@
 import logging
 import numpy as np
 from typing import List
+from functools import reduce
 
 from tools import timer
 
@@ -324,6 +325,19 @@ class ProfileXYZ(Profile, SQLSubModel):
                 f"for profile ({self.id}) kp = {self.kp}"
             )
 
+    def has_standard_named_points(self):
+        l, r = reduce(
+            lambda acc, n: (
+                (acc[0] | (n == "rg")),
+                (acc[1] | (n == "rd"))
+            ),
+            map(lambda p: p.name.lower().strip(),
+                self.points),
+            (False, False)
+        )
+
+        return l & r
+
     def add(self):
         """Add a new PointXYZ to profile.
 
@@ -454,8 +468,12 @@ class ProfileXYZ(Profile, SQLSubModel):
             return list(map(lambda s: s - constant, station))
 
     def width_approximation(self):
-        rg = self.get_point_by_name("rg")
-        rd = self.get_point_by_name("rd")
+        if self.has_standard_named_points():
+            rg = self.get_point_by_name("rg")
+            rd = self.get_point_by_name("rd")
+        else:
+            rg = self.points[0]
+            rd = self.points[-1]
 
         return abs(rg.dist(rd))
 
-- 
GitLab