diff --git a/src/Model/LateralContribution/LateralContribution.py b/src/Model/LateralContribution/LateralContribution.py
index 5e9e5469..ff418f7d 100644
--- a/src/Model/LateralContribution/LateralContribution.py
+++ b/src/Model/LateralContribution/LateralContribution.py
@@ -223,6 +223,11 @@ class LateralContribution(SQLSubModel):
self._data = []
self._header = []
self._types = [float, float]
+ # Grain size of the sediment brought by a solid contribution:
+ # median diameter (m) and spread sqrt(d84/d16), as for a solid
+ # boundary condition
+ self._d50 = 0.002
+ self._sigma = 1.0
@classmethod
def _db_create(cls, execute, ext=""):
@@ -236,6 +241,8 @@ class LateralContribution(SQLSubModel):
reach INTEGER,
begin_section INTEGER,
end_section INTEGER,
+ d50 REAL DEFAULT 0.002,
+ sigma REAL DEFAULT 1,
{Scenario.create_db_add_scenario()},
{Scenario.create_db_add_scenario_fk()},
FOREIGN KEY(reach) REFERENCES river_reach(pamhyr_id),
@@ -286,8 +293,32 @@ class LateralContribution(SQLSubModel):
"ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE"
)
+ if major == "0" and (int(minor) < 2 or
+ (minor == "2" and int(release) < 11)):
+ cls._db_update_to_0_2_11(execute)
+
return cls._update_submodel(execute, version, data)
+ @classmethod
+ def _db_update_to_0_2_11(cls, execute):
+ # The table may already have been recreated with these columns
+ # by _db_update_to_0_2_0
+ columns = [
+ row[0] for row in execute(
+ "SELECT name FROM pragma_table_info('lateral_contribution')"
+ )
+ ]
+ if "d50" not in columns:
+ execute(
+ "ALTER TABLE lateral_contribution " +
+ "ADD COLUMN d50 REAL DEFAULT 0.002"
+ )
+ if "sigma" not in columns:
+ execute(
+ "ALTER TABLE lateral_contribution " +
+ "ADD COLUMN sigma REAL DEFAULT 1"
+ )
+
@classmethod
def _db_update_to_0_2_0(cls, execute, data):
table = "lateral_contribution"
@@ -339,7 +370,7 @@ class LateralContribution(SQLSubModel):
table = execute(
"SELECT pamhyr_id, deleted, name, type, " +
- "reach, begin_section, end_section, scenario " +
+ "reach, begin_section, end_section, d50, sigma, scenario " +
"FROM lateral_contribution " +
f"WHERE tab = '{tab}'" +
f"AND scenario = {scenario.id} " +
@@ -356,6 +387,8 @@ class LateralContribution(SQLSubModel):
reach = next(it)
b_section = next(it)
e_section = next(it)
+ d50 = next(it)
+ sigma = next(it)
owner_scenario = next(it)
ctor = cls._get_ctor_from_type(t)
@@ -367,6 +400,10 @@ class LateralContribution(SQLSubModel):
lc.reach = None
lc._begin_section = None
lc._end_section = None
+ if d50 is not None:
+ lc._d50 = float(d50)
+ if sigma is not None:
+ lc._sigma = float(sigma)
if row[3] != -1:
lc.reach = next(
@@ -426,12 +463,13 @@ class LateralContribution(SQLSubModel):
"INSERT INTO " +
"lateral_contribution(" +
"pamhyr_id, deleted, name, type, tab, " +
- "reach, begin_section, end_section, scenario) " +
+ "reach, begin_section, end_section, d50, sigma, scenario) " +
"VALUES (" +
f"{self.id}, {self._db_format(self.is_deleted())}, " +
f"'{self._db_format(self._name)}', " +
f"'{self._db_format(self._type)}', '{tab}', {reach}, " +
f"{begin_section}, {end_section}, " +
+ f"{self._d50}, {self._sigma}, " +
f"{self._status.scenario_id}" +
")"
)
@@ -523,10 +561,30 @@ class LateralContribution(SQLSubModel):
new._reach = reach
new._begin_section = begin_section
new._end_section = end_section
+ new._d50 = self._d50
+ new._sigma = self._sigma
new._data = [data.cloned() for data in self.data]
new.modified()
return new
+ @property
+ def d50(self):
+ return self._d50
+
+ @d50.setter
+ def d50(self, value):
+ self._d50 = float(value)
+ self.modified()
+
+ @property
+ def sigma(self):
+ return self._sigma
+
+ @sigma.setter
+ def sigma(self, value):
+ self._sigma = float(value)
+ self.modified()
+
@property
def begin_rk(self):
if self._begin_section is None:
diff --git a/src/Model/Study.py b/src/Model/Study.py
index 0299f0f0..e14cef22 100644
--- a/src/Model/Study.py
+++ b/src/Model/Study.py
@@ -48,7 +48,7 @@ logger = logging.getLogger()
class Study(SQLModel):
- _version = "0.2.10"
+ _version = "0.2.11"
_sub_classes = [
Scenario,
diff --git a/src/View/LateralContribution/Edit/UndoCommand.py b/src/View/LateralContribution/Edit/UndoCommand.py
index 41d3eb08..254a9fac 100644
--- a/src/View/LateralContribution/Edit/UndoCommand.py
+++ b/src/View/LateralContribution/Edit/UndoCommand.py
@@ -44,6 +44,22 @@ class SetDataCommand(QUndoCommand):
self._data._set_i_c_v(self._index, self._column, self._new)
+class SetMetaDataCommand(QUndoCommand):
+ def __init__(self, data, column, new_value):
+ QUndoCommand.__init__(self)
+
+ self._data = data
+ self._column = column
+ self._old = getattr(self._data, self._column)
+ self._new = float(new_value)
+
+ def undo(self):
+ setattr(self._data, self._column, self._old)
+
+ def redo(self):
+ setattr(self._data, self._column, self._new)
+
+
class AddCommand(QUndoCommand):
def __init__(self, data, index):
QUndoCommand.__init__(self)
diff --git a/src/View/LateralContribution/Edit/Window.py b/src/View/LateralContribution/Edit/Window.py
index d3f378bd..3084733a 100644
--- a/src/View/LateralContribution/Edit/Window.py
+++ b/src/View/LateralContribution/Edit/Window.py
@@ -35,7 +35,7 @@ from PyQt5.QtWidgets import (
QDialogButtonBox, QPushButton, QLineEdit,
QFileDialog, QTableView, QAbstractItemView,
QUndoStack, QShortcut, QAction, QItemDelegate,
- QHeaderView,
+ QHeaderView, QVBoxLayout,
)
from View.Tools.Plot.PamhyrCanvas import MplCanvas
@@ -44,6 +44,8 @@ from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
from View.LateralContribution.Edit.translate import LCETranslate
from View.LateralContribution.Edit.Table import TableModel
from View.LateralContribution.Edit.Plot import Plot
+from View.LateralContribution.Edit.UndoCommand import SetMetaDataCommand
+from View.BoundaryCondition.Edit.Window import WD50Sigma
_translate = QCoreApplication.translate
@@ -54,8 +56,10 @@ class EditLateralContributionWindow(PamhyrWindow):
def __init__(self, data=None,
study=None, config=None,
- parent=None):
+ tab="liquid", parent=None):
self._data = data
+ # Grain size of the sediment brought: solid contributions only
+ self._is_solid = tab == "solid"
trad = LCETranslate()
name = trad[self._pamhyr_name]
@@ -81,6 +85,7 @@ class EditLateralContributionWindow(PamhyrWindow):
self.setup_table()
self.setup_plot()
+ self.setup_d50sigma()
self.setup_connections()
def setup_table(self):
@@ -139,6 +144,15 @@ class EditLateralContributionWindow(PamhyrWindow):
)
self.plot.draw()
+ def setup_d50sigma(self):
+ if not self._is_solid:
+ return
+
+ layout = self.find(QVBoxLayout, "verticalLayout_table")
+ self._d50sigma = WD50Sigma(parent=self)
+ layout.addWidget(self._d50sigma)
+ self.widget_update()
+
def setup_connections(self):
if self._study.is_editable():
self.find(QAction, "action_add").triggered.connect(self.add)
@@ -148,10 +162,31 @@ class EditLateralContributionWindow(PamhyrWindow):
self._table.dataChanged.connect(self.update)
self._table.layoutChanged.connect(self.update)
+ if self._is_solid:
+ if self._study.is_editable():
+ self._d50sigma.d50Changed.connect(self.d50_changed)
+ self._d50sigma.sigmaChanged.connect(self.sigma_changed)
+ else:
+ self._d50sigma.setEnabled(False)
+
+ def d50_changed(self, value):
+ self._undo_stack.push(SetMetaDataCommand(self._data, "d50", value))
+
+ def sigma_changed(self, value):
+ self._undo_stack.push(
+ SetMetaDataCommand(self._data, "sigma", value)
+ )
+
+ def widget_update(self):
+ if self._is_solid:
+ self._d50sigma.set_d50(self._data.d50)
+ self._d50sigma.set_sigma(self._data.sigma)
+
def _propagated_update(self, key=Modules(0)):
if Modules.STUDY in key:
self._table.layoutChanged.emit()
self.plot.update()
+ self.widget_update()
def update(self):
self.plot.update()
@@ -235,7 +270,9 @@ class EditLateralContributionWindow(PamhyrWindow):
def _undo(self):
self._table.undo()
self.plot.update()
+ self.widget_update()
def _redo(self):
self._table.redo()
self.plot.update()
+ self.widget_update()
diff --git a/src/View/LateralContribution/Window.py b/src/View/LateralContribution/Window.py
index 2cc857d9..741a1ee8 100644
--- a/src/View/LateralContribution/Window.py
+++ b/src/View/LateralContribution/Window.py
@@ -303,6 +303,7 @@ class LateralContributionWindow(PamhyrWindow):
win = EditLateralContributionWindow(
data=data,
study=self._study,
+ tab=tab,
parent=self
)
win.show()
diff --git a/src/View/ui/EditLateralContribution.ui b/src/View/ui/EditLateralContribution.ui
index 2e739f88..8bff6a22 100644
--- a/src/View/ui/EditLateralContribution.ui
+++ b/src/View/ui/EditLateralContribution.ui
@@ -35,7 +35,13 @@
Qt::Horizontal
-
+
+
+ -
+
+
+
+