diff --git a/src/Model/Geometry/Profile.py b/src/Model/Geometry/Profile.py index b24e2eb94da10ed0fa1301fa61fda2d9a5a68432..6a4b45ef7f1507512b8c3f5b361526a92b2db3e1 100644 --- a/src/Model/Geometry/Profile.py +++ b/src/Model/Geometry/Profile.py @@ -351,6 +351,9 @@ class Profile(object): def wet_points(self, z): raise NotImplementedMethodeError(self, self.wet_point) + def wet_width(self, z): + raise NotImplementedMethodeError(self, self.wet_width) + def wet_perimeter(self, z): raise NotImplementedMethodeError(self, self.wet_perimeter) diff --git a/src/Model/Geometry/ProfileXYZ.py b/src/Model/Geometry/ProfileXYZ.py index bcbd42e93659645d36c172ef49bbc6cf61cf305d..d06728d7af3aee5761c3b48997bedf33b31788f4 100644 --- a/src/Model/Geometry/ProfileXYZ.py +++ b/src/Model/Geometry/ProfileXYZ.py @@ -401,6 +401,18 @@ class ProfileXYZ(Profile, SQLSubModel): return abs(rg.dist(rd)) + def wet_width(self, z): + start, end = self.get_all_water_limits_ac(z) + + if len(start) == 0: + return 0 + + length = 0.0 + for s,e in zip(start, end): + length += abs(s - e) + return length + + def wet_perimeter(self, z): lines = self.wet_lines(z) @@ -515,6 +527,50 @@ class ProfileXYZ(Profile, SQLSubModel): return n_zones + def get_all_water_limits_ac(self, z): + """ + Determine all water limits for z elevation. + """ + + points = self._points + if len(points) < 3: + return None + + zz = list(map(lambda p: p.z, points)) + station = self._get_station(points) + + start = [] + if points[0].z <= z: + start.append(station[0]) + + for i in range(self.number_points-1): + if zz[i] > z and zz[i+1] <= z: + y = np.interp( + z, + [zz[i], zz[i+1]], + [station[i], station[i+1]] + ) + start.append(y) + + end = [] + for i in reversed(range(self.number_points-1)): + if zz[i-1] <= z and zz[i] > z: + y = np.interp( + z, + [zz[i-1], zz[i]], + [station[i-1], station[i]] + ) + end.append(y) + + if points[-1].z <= z: + end.append(station[-1]) + + if len(start) != len(end): + logger.error(f"ERROR in get_all_water_limits_ac") + return [], [] + + return start, list(reversed(end)) + def get_water_limits(self, z): """ Determine left and right limits of water elevation. diff --git a/src/View/Results/Table.py b/src/View/Results/Table.py index 1b16a882219e670d46ac5b60a20d1ab81d002401..7b49910c1a71ca422c209e36f7409b6dd4b30239 100644 --- a/src/View/Results/Table.py +++ b/src/View/Results/Table.py @@ -93,11 +93,8 @@ class TableModel(PamhyrTableModel): v = self._lst[row].geometry.speed(q, z) return f"{v:.4f}" elif self._headers[column] == "width": - pt_left, pt_right = self._lst[row].get_ts_key( - self._timestamp, - "water_limits" - ) - v = pt_left.dist_2d(pt_right) + z = self._lst[row].get_ts_key(self._timestamp, "Z") + v = self._lst[row].geometry.wet_width(z) return f"{v:.4f}" elif self._headers[column] == "depth": z = self._lst[row].get_ts_key(self._timestamp, "Z")