mirror of
https://gitlab.com/pamhyr/pamhyr2.git
synced 2026-10-30 03:20:41 +01:00
LateralContribution: add D50 and sigma to solid lateral contributions (database 0.2.11)
This commit is contained in:
1 parent
5f64362f65
commit
be7b5b892a
6 files changed
+124
-6
No files matched your search
@@ -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:
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@ logger = logging.getLogger()
|
||||
|
||||
|
||||
class Study(SQLModel):
|
||||
_version = "0.2.10"
|
||||
_version = "0.2.11"
|
||||
|
||||
_sub_classes = [
|
||||
Scenario,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -303,6 +303,7 @@ class LateralContributionWindow(PamhyrWindow):
|
||||
win = EditLateralContributionWindow(
|
||||
data=data,
|
||||
study=self._study,
|
||||
tab=tab,
|
||||
parent=self
|
||||
)
|
||||
win.show()
|
||||
|
||||
@@ -35,7 +35,13 @@
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QTableView" name="tableView"/>
|
||||
<widget class="QWidget" name="verticalLayoutWidget_2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_table">
|
||||
<item>
|
||||
<widget class="QTableView" name="tableView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout"/>
|
||||
</widget>
|
||||
|
||||
Reference in new issue
Block a user