Compare commits

..

No commits in common. "1b70e22a58942d5df80f21e71e78be9c94c5f2a4" and "c58620fdc21cc3818c0cc94c0d585add14eb8651" have entirely different histories.

10 changed files with 81 additions and 122 deletions

View File

@ -58,7 +58,7 @@ class Point(SQLSubModel):
self._name = name self._name = name
self.modified() self.modified()
def is_named(self): def point_is_named(self):
""" """
Returns: Returns:
True if the point is named. True if the point is named.

View File

@ -292,9 +292,6 @@ class PointXYZ(Point):
def __repr__(self): def __repr__(self):
return f"({self._x}, {self._y}, {self._z}, {self._name})" return f"({self._x}, {self._y}, {self._z}, {self._name})"
def __gt__(self, other):
return self.y > other.y
@property @property
def x(self): def x(self):
return self._x return self._x
@ -371,10 +368,5 @@ class PointXYZ(Point):
a = PointXYZ.distance(p1, p2) a = PointXYZ.distance(p1, p2)
b = PointXYZ.distance(p2, p3) b = PointXYZ.distance(p2, p3)
c = PointXYZ.distance(p3, p1) c = PointXYZ.distance(p3, p1)
s = (a + b + c) / 2
s = float((a + b + c) / 2) return (s*(s-a) * (s-b)*(s-c)) ** 0.5
res = (
s * abs(s - a) * abs(s - b) * abs(s - c)
) ** 0.5
return res

View File

@ -187,7 +187,7 @@ class Profile(object):
The list of named point The list of named point
""" """
return [point for point in self.points return [point for point in self.points
if point.is_named()] if point.point_is_named()]
def insert_point(self, index: int, point: Point): def insert_point(self, index: int, point: Point):
"""Insert point at index. """Insert point at index.

View File

@ -16,8 +16,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import queue
import random
import logging import logging
import numpy as np import numpy as np
from typing import List from typing import List
@ -931,13 +929,13 @@ class ProfileXYZ(Profile, SQLSubModel):
last_point_not_nan = self._last_point_not_nan(points) last_point_not_nan = self._last_point_not_nan(points)
for index, point in enumerate(points): for index, point in enumerate(points):
if point.is_named(): if point.point_is_named():
index_first_named_point = index index_first_named_point = index
first_named_point = point first_named_point = point
break break
for point in reversed(points): for point in reversed(points):
if point.is_named(): if point.point_is_named():
last_named_point = point last_named_point = point
break break
@ -1011,46 +1009,46 @@ class ProfileXYZ(Profile, SQLSubModel):
if (self.nb_points <= np_purge): if (self.nb_points <= np_purge):
return return
q_area = queue.PriorityQueue() nb_named = 2 # we consider the first and last point as named
deleted = [] area = [0.0]
for ind, point in enumerate(self.points): for i in range(1, self.nb_points-1):
if (ind == 0) or (ind == self.nb_points - 1): if self.point(i).point_is_named():
continue area.append(9999999.999)
nb_named += 1
if not point.is_named(): else:
q_area.put(( area.append(
PointXYZ.areatriangle3d( PointXYZ.areatriangle3d(
self.point(ind - 1), self.point(i-1),
point, self.point(i),
self.point(ind + 1) self.point(i+1))
), )
ind, point
))
while self.nb_points > np_purge and not q_area.empty(): area.append(0.0)
area, ind, point = q_area.get()
self.delete_points([point]) while self.nb_points > max(np_purge, nb_named):
deleted.append(point) to_rm = np.argmin(area[1:self.nb_points - 1]) + 1
# Recompute point neighbourhood self.delete_i([to_rm])
for i in [ind-1, ind]: area.pop(to_rm)
if (i <= 0) or (i >= self.nb_points - 1):
for i in [to_rm-1, to_rm]:
if (i == 0):
continue continue
point = self.point(i) if (i == self.nb_points - 1):
if not point.is_named(): continue
q_area.put((
PointXYZ.areatriangle3d( if self.point(i).point_is_named():
self.point(i-1), area[i] = 9999999.999
point, else:
self.point(i+1) area[i] = PointXYZ.areatriangle3d(
), i, point self.point(i-1),
)) self.point(i),
self.point(i+1)
)
self.modified() self.modified()
return deleted
def shift(self, x, y, z): def shift(self, x, y, z):
for p in self._points: for p in self._points:

View File

@ -375,7 +375,7 @@ class InitialConditions(SQLSubModel):
return ok return ok
def __len__(self): def __len__(self):
return len(self.data) return len(self._data)
def lst(self): def lst(self):
return self._data return self._data
@ -403,7 +403,7 @@ class InitialConditions(SQLSubModel):
self._data = data self._data = data
def get(self, index): def get(self, index):
return self.data[index] return self._data[index]
def set(self, index, data): def set(self, index, data):
self._data.insert(index, data) self._data.insert(index, data)
@ -441,12 +441,9 @@ class InitialConditions(SQLSubModel):
def delete(self, data): def delete(self, data):
list( list(
map( filter(
lambda x: x.set_as_deleted(), lambda x: x.set_as_deleted(),
filter( self._data
lambda x: x in data,
self._data
)
) )
) )
self.modified() self.modified()
@ -471,7 +468,7 @@ class InitialConditions(SQLSubModel):
return list( return list(
map( map(
lambda d: d[key], lambda d: d[key],
self.data self._data
) )
) )
@ -479,7 +476,7 @@ class InitialConditions(SQLSubModel):
return list( return list(
map( map(
lambda d: d["rk"].rk, lambda d: d["rk"].rk,
self.data self._data
) )
) )
@ -489,10 +486,6 @@ class InitialConditions(SQLSubModel):
def get_discharge(self): def get_discharge(self):
return self._data_get("discharge") return self._data_get("discharge")
def clear_data(self):
for data in self._data:
data.set_as_deleted()
def generate_growing_constant_depth(self, height: float, def generate_growing_constant_depth(self, height: float,
compute_discharge: bool): compute_discharge: bool):
profiles = self._reach.reach.profiles.copy() profiles = self._reach.reach.profiles.copy()
@ -509,9 +502,7 @@ class InitialConditions(SQLSubModel):
incline = self._reach.reach.get_incline_median_mean() incline = self._reach.reach.get_incline_median_mean()
logger.debug(f"incline = {incline}") logger.debug(f"incline = {incline}")
self._data = []
self.clear_data()
for profile in reversed(profiles): for profile in reversed(profiles):
width = profile.wet_width(profile.z_min() + height) width = profile.wet_width(profile.z_min() + height)
area = profile.wet_area(profile.z_min() + height) area = profile.wet_area(profile.z_min() + height)
@ -577,9 +568,7 @@ class InitialConditions(SQLSubModel):
incline = self._reach.reach.get_incline_median_mean() incline = self._reach.reach.get_incline_median_mean()
logger.debug(f"incline = {incline}") logger.debug(f"incline = {incline}")
self._data = []
self.clear_data()
for profile in reversed(profiles): for profile in reversed(profiles):
width = profile.width_approximation() width = profile.width_approximation()
frictions = self._reach.frictions.frictions frictions = self._reach.frictions.frictions
@ -642,7 +631,7 @@ class InitialConditions(SQLSubModel):
for data in self._data: for data in self._data:
data_discharge[data["rk"].rk] = data["discharge"] data_discharge[data["rk"].rk] = data["discharge"]
self.clear_data() self._data = []
for profile in profiles: for profile in profiles:
if not compute_discharge: if not compute_discharge:

View File

@ -193,7 +193,7 @@ class GeometryProfileTableModel(PamhyrTableModel):
DelCommand( DelCommand(
self._data, list( self._data, list(
map( map(
lambda r: self._data.point(r), lambda r: self.get_true_data_row(r),
rows rows
) )
) )
@ -285,8 +285,6 @@ class GeometryProfileTableModel(PamhyrTableModel):
) )
) )
row = self.get_true_data_row(row)
self._undo.push( self._undo.push(
PasteCommand( PasteCommand(
self._data, row, points self._data, row, points

View File

@ -116,19 +116,23 @@ class AddCommand(QUndoCommand):
class DelCommand(QUndoCommand): class DelCommand(QUndoCommand):
def __init__(self, profile, points): def __init__(self, profile, rows):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._profile = profile self._profile = profile
self._points = points self._rows = rows
self._points = []
for row in rows:
self._points.append(self._profile.point(row))
def undo(self): def undo(self):
for point in self._points: for row, point in zip(self._rows, self._points):
point.set_as_not_deleted() self._profile.insert_point(row, point)
self._profile.modified() self._profile.modified()
def redo(self): def redo(self):
self._profile.delete_points(self._points) self._profile.delete_i(self._rows)
self._profile.modified() self._profile.modified()
@ -202,17 +206,16 @@ class PurgeCommand(QUndoCommand):
def __init__(self, profile, np_purge): def __init__(self, profile, np_purge):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._deleted = []
self._profile = profile self._profile = profile
self._old = self._profile.points.copy()
self._np_purge = np_purge self._np_purge = np_purge
def undo(self): def undo(self):
for point in self._deleted: self._profile._points = self._old.copy()
point.set_as_not_deleted()
self._profile.modified() self._profile.modified()
def redo(self): def redo(self):
self._deleted = self._profile.purge(self._np_purge) self._profile.purge(self._np_purge)
self._profile.modified() self._profile.modified()
@ -227,7 +230,8 @@ class PasteCommand(QUndoCommand):
self._points.reverse() self._points.reverse()
def undo(self): def undo(self):
self._profile.delete_points(self._points) for ind in range(len(self._points)):
self._profile.delete_i([self._row])
self._profile.modified() self._profile.modified()
def redo(self): def redo(self):

View File

@ -277,17 +277,18 @@ class PurgeCommand(QUndoCommand):
self._reach = reach self._reach = reach
self._np_purge = np_purge self._np_purge = np_purge
self._deleted = {}
self._old = []
for profile in self._reach.profiles:
self._old.append(profile.points.copy())
def undo(self): def undo(self):
for profile in self._deleted: for i in range(self._reach.number_profiles):
for point in self._deleted[profile]: self._reach.profiles[i]._points = self._old[i].copy()
point.set_as_not_deleted()
profile.modified()
def redo(self): def redo(self):
for profile in self._reach._profiles: for profile in self._reach._profiles:
self._deleted[profile] = profile.purge(self._np_purge) profile.purge(self._np_purge)
class ChangeReachCommand(QUndoCommand): class ChangeReachCommand(QUndoCommand):

View File

@ -104,19 +104,6 @@ class InitialConditionTableModel(PamhyrTableModel):
def _setup_lst(self): def _setup_lst(self):
self._lst = self._data.river.initial_conditions.get(self._reach) self._lst = self._data.river.initial_conditions.get(self._reach)
def get_true_data_row(self, row):
data = self._lst.get(row)
return next(
map(
lambda e: e[0],
filter(
lambda e: e[1] == data,
enumerate(self._lst._data)
)
), 0
)
def data(self, index, role): def data(self, index, role):
if role != Qt.ItemDataRole.DisplayRole: if role != Qt.ItemDataRole.DisplayRole:
return QVariant() return QVariant()
@ -135,11 +122,8 @@ class InitialConditionTableModel(PamhyrTableModel):
return f"{velocity:.4f}" return f"{velocity:.4f}"
return "" return ""
if self._headers[column] == "rk": if self._headers[column] == "rk":
p = self._lst.get(row)[self._headers[column]] p = self._lst.get(row)[self._headers[column]]
if p is None:
return ""
return f"{p.rk:.4f}" return f"{p.rk:.4f}"
elif self._headers[column] not in ["name", "comment"]: elif self._headers[column] not in ["name", "comment"]:
v = self._lst.get(row)[self._headers[column]] v = self._lst.get(row)[self._headers[column]]
@ -173,8 +157,6 @@ class InitialConditionTableModel(PamhyrTableModel):
def add(self, row, parent=QModelIndex()): def add(self, row, parent=QModelIndex()):
self.beginInsertRows(parent, row, row - 1) self.beginInsertRows(parent, row, row - 1)
row = self.get_true_data_row(row)
self._undo.push( self._undo.push(
AddCommand( AddCommand(
self._lst, row self._lst, row
@ -189,12 +171,7 @@ class InitialConditionTableModel(PamhyrTableModel):
self._undo.push( self._undo.push(
DelCommand( DelCommand(
self._lst, list( self._lst, rows
map(
lambda row: self._lst.get(row),
rows
)
)
) )
) )
@ -217,10 +194,9 @@ class InitialConditionTableModel(PamhyrTableModel):
if row <= 0: if row <= 0:
return return
target = row + 1 target = row + 2
self.beginMoveRows(parent, row - 1, row - 1, parent, target)
row = self.get_true_data_row(row) self.beginMoveRows(parent, row - 1, row - 1, parent, target)
self._undo.push( self._undo.push(
MoveCommand( MoveCommand(
@ -239,8 +215,6 @@ class InitialConditionTableModel(PamhyrTableModel):
self.beginMoveRows(parent, row + 1, row + 1, parent, target) self.beginMoveRows(parent, row + 1, row + 1, parent, target)
row = self.get_true_data_row(row)
self._undo.push( self._undo.push(
MoveCommand( MoveCommand(
self._lst, "down", row self._lst, "down", row
@ -265,8 +239,6 @@ class InitialConditionTableModel(PamhyrTableModel):
self.layoutAboutToBeChanged.emit() self.layoutAboutToBeChanged.emit()
index = self.get_true_data_row(index)
self._undo.push( self._undo.push(
InsertCommand( InsertCommand(
self._lst, index, self._lst, index,

View File

@ -75,18 +75,23 @@ class AddCommand(QUndoCommand):
class DelCommand(QUndoCommand): class DelCommand(QUndoCommand):
def __init__(self, ics, data): def __init__(self, ics, rows):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._ics = ics self._ics = ics
self._data = data self._rows = rows
self._ic = []
for row in rows:
self._ic.append((row, self._ics.get(row)))
self._ic.sort()
def undo(self): def undo(self):
for ic in self._data: for row, el in self._ic:
ic.set_as_not_deleted() self._ics.insert(row, el)
def redo(self): def redo(self):
self._ics.delete(self._data) self._ics.delete_i(self._rows)
class SortCommand(QUndoCommand): class SortCommand(QUndoCommand):