Compare commits

..
17 Commits
Author SHA1 Message Date
Pierre-Antoine Rouby 8c64652b33 ui: Minor change. 2024-07-16 10:56:13 +02:00
Pierre-Antoine Rouby 66a9563345 pamhyr: Fix pep8. 2024-07-16 10:43:12 +02:00
Pierre-Antoine Rouby fdf241c6dd Results: Fix reach selection with disable reaches in network. 2024-07-16 10:39:41 +02:00
Pierre-Antoine Rouby 113989dc46 Network: Fix crash where reservoir is defined. 2024-07-16 09:46:56 +02:00
Pierre-Antoine Rouby 430cff8747 IC: Fix name KP to RK. 2024-07-16 09:43:32 +02:00
Pierre-Antoine Rouby aee69fa3c7 Merge remote-tracking branch 'origin/master' 2024-07-16 09:35:11 +02:00
Pierre-Antoine Rouby afb3483fe3 pamhyr: Fix windows timestamp. 2024-07-16 09:34:10 +02:00
Theophile Terraz 90272fa444 turn node shape to square when the node is a reservoir 2024-07-05 15:52:45 +02:00
Pierre-Antoine Rouby 73fd407aff doc: tools: Minor change. 2024-07-05 15:27:18 +02:00
Pierre-Antoine Rouby 46dc527222 Translate: Rename KP to RK (River Kilometric). 2024-07-05 15:27:18 +02:00
Theophile Terraz b83494888b debug right click graph 2024-07-05 14:34:41 +02:00
Theophile Terraz a0f964e89e generate discharge without height 2024-07-05 13:39:54 +02:00
Pierre-Antoine Rouby 30b3b8800e IC: Minor change. 2024-07-05 11:31:41 +02:00
Pierre-Antoine Rouby 366baa737a IC: Fix generate_growing_constante_height method. 2024-07-05 11:30:07 +02:00
Theophile Terraz 453a2084e7 debug 2024-07-05 10:21:04 +02:00
Theophile Terraz fe30a20882 allow to define height or discharge only 2024-07-05 10:09:43 +02:00
Theophile Terraz 70dcb1a6ee remove print 2024-07-02 10:47:28 +02:00
20 changed files with 133 additions and 63 deletions

No files matched your search

+2 -1
View File
@@ -72,7 +72,8 @@ class Friction(SQLSubModel):
major, minor, release = version.strip().split(".") major, minor, release = version.strip().split(".")
if major == minor == "0": if major == minor == "0":
if int(release) < 11: if int(release) < 11:
execute("ALTER TABLE friction RENAME COLUMN begin_kp TO begin_rk") execute("ALTER TABLE friction " +
"RENAME COLUMN begin_kp TO begin_rk")
execute("ALTER TABLE friction RENAME COLUMN end_kp TO end_rk") execute("ALTER TABLE friction RENAME COLUMN end_kp TO end_rk")
return True return True
@@ -147,7 +147,6 @@ class Data(SQLSubModel):
reach=self._reach, reach=self._reach,
status=self._status, status=self._status,
) )
return new return new
@property @property
@@ -375,25 +374,39 @@ class InitialConditions(SQLSubModel):
key=lambda p: p.rk key=lambda p: p.rk
) )
def generate_growing_constante_height(self, height: float): def generate_growing_constante_height(self, height: float,
self._data = [] compute_discharge: bool):
profiles = self._reach.reach.profiles.copy() profiles = self._reach.reach.profiles.copy()
self._sort_by_z_and_rk(profiles) self._sort_by_z_and_rk(profiles)
previous_elevation = -99999.99
data_discharge = {}
if not compute_discharge:
if len(self._data) == 0:
for profile in profiles:
data_discharge[profile.rk] = 0.0
else:
for data in self._data:
data_discharge[data["rk"]] = data["discharge"]
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 = []
previous_elevation = -99999.99
for profile in profiles: for profile in profiles:
width = profile.width_approximation() width = profile.width_approximation()
strickler = 25 strickler = 25
discharge = (
((width * 0.8) if not compute_discharge:
* strickler discharge = data_discharge[profile.rk]
* (height ** (5/3)) else:
* (abs(incline) ** (0.5))) discharge = (
) ((width * 0.8)
* strickler
* (height ** (5/3))
* (abs(incline) ** (0.5)))
)
elevation = max( elevation = max(
profile.z_min() + height, profile.z_min() + height,
@@ -408,38 +421,44 @@ class InitialConditions(SQLSubModel):
new = Data(reach=self._reach, status=self._status) new = Data(reach=self._reach, status=self._status)
new["rk"] = profile.rk new["rk"] = profile.rk
new["discharge"] = discharge new["discharge"] = discharge
new["elevation"] = elevation new["elevation"] = elevation
self._data.append(new)
previous_elevation = elevation previous_elevation = elevation
self._data.append(new)
self._generate_resort_data(profiles) self._generate_resort_data(profiles)
def generate_discharge(self, discharge: float): def generate_discharge(self, discharge: float, compute_height: bool):
self._data = []
self._generate_height_estimation_from_discharge(
discharge
)
def _generate_height_estimation_from_discharge(self, discharge: float):
profiles = self._reach.reach.profiles.copy() profiles = self._reach.reach.profiles.copy()
self._sort_by_z_and_rk(profiles) self._sort_by_z_and_rk(profiles)
previous_elevation = -99999.99 previous_elevation = -99999.99
data_height = {}
if not compute_height:
if len(self._data) == 0:
for profile in profiles:
data_height[profile.rk] = 0.0
else:
for data in self._data:
data_height[data["rk"]] = data["height"]
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 = []
for profile in profiles: for profile in profiles:
width = profile.width_approximation() width = profile.width_approximation()
strickler = 25 strickler = 25
height = (
discharge if not compute_height:
/ height = data_height[profile.rk]
((width * 0.8) * strickler * (abs(incline) ** (0.5))) else:
) ** (0.6) height = (
discharge
/
((width * 0.8) * strickler * (abs(incline) ** (0.5)))
) ** (0.6)
elevation = max( elevation = max(
profile.z_min() + height, profile.z_min() + height,
+3 -3
View File
@@ -230,16 +230,16 @@ class Study(SQLModel):
) )
self.execute( self.execute(
"INSERT INTO info VALUES ('date', " + "INSERT INTO info VALUES ('date', " +
f"'{self._date.timestamp()}')" f"'{timestamp(self._date)}')"
) )
self.execute( self.execute(
"INSERT INTO info VALUES ('creation_date', " + "INSERT INTO info VALUES ('creation_date', " +
f"'{self.creation_date.timestamp()}')" f"'{timestamp(self.creation_date)}')"
) )
self.execute( self.execute(
"INSERT INTO info VALUES ('last_save_date', " + "INSERT INTO info VALUES ('last_save_date', " +
f"'{self.last_save_date.timestamp()}')" f"'{timestamp(self.last_save_date)}')"
) )
self._create_submodel() self._create_submodel()
+1 -1
View File
@@ -61,7 +61,7 @@ class GeometryTranslate(MainTranslate):
self._sub_dict["table_headers"] = { self._sub_dict["table_headers"] = {
"name": self._dict["name"], "name": self._dict["name"],
"rk": self._dict["unit_rk_short"], "rk": self._dict["unit_rk"],
"poins": _translate("Geometry", "Points"), "poins": _translate("Geometry", "Points"),
} }
@@ -28,7 +28,7 @@ from PyQt5.QtCore import (
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QDialogButtonBox, QComboBox, QUndoStack, QShortcut, QDialogButtonBox, QComboBox, QUndoStack, QShortcut,
QDoubleSpinBox, QDoubleSpinBox, QCheckBox,
) )
@@ -45,9 +45,11 @@ class DischargeDialog(PamhyrDialog):
) )
self.value = None self.value = None
self.option = None
def accept(self): def accept(self):
self.value = self.find(QDoubleSpinBox, "doubleSpinBox").value() self.value = self.find(QDoubleSpinBox, "doubleSpinBox").value()
self.option = self.find(QCheckBox, "checkBox").isChecked()
super().accept() super().accept()
def reject(self): def reject(self):
+3 -1
View File
@@ -28,7 +28,7 @@ from PyQt5.QtCore import (
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QDialogButtonBox, QComboBox, QUndoStack, QShortcut, QDialogButtonBox, QComboBox, QUndoStack, QShortcut,
QDoubleSpinBox, QDoubleSpinBox, QCheckBox,
) )
@@ -45,9 +45,11 @@ class HeightDialog(PamhyrDialog):
) )
self.value = None self.value = None
self.option = None
def accept(self): def accept(self):
self.value = self.find(QDoubleSpinBox, "doubleSpinBox").value() self.value = self.find(QDoubleSpinBox, "doubleSpinBox").value()
self.option = self.find(QCheckBox, "checkBox").isChecked()
super().accept() super().accept()
def reject(self): def reject(self):
+2 -2
View File
@@ -289,10 +289,10 @@ class InitialConditionTableModel(PamhyrTableModel):
self._undo.redo() self._undo.redo()
self.layoutChanged.emit() self.layoutChanged.emit()
def generate(self, generator, param): def generate(self, generator, param, option):
self._undo.push( self._undo.push(
GenerateCommand( GenerateCommand(
self._lst, generator, param self._lst, generator, param, option
) )
) )
self.layoutChanged.emit() self.layoutChanged.emit()
+6 -3
View File
@@ -174,11 +174,12 @@ class DuplicateCommand(QUndoCommand):
class GenerateCommand(QUndoCommand): class GenerateCommand(QUndoCommand):
def __init__(self, ics, generator, param): def __init__(self, ics, generator, param, option):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._ics = ics self._ics = ics
self._param = param self._param = param
self._option = option
self._copy = self._ics.data self._copy = self._ics.data
self._generator = generator self._generator = generator
@@ -187,6 +188,8 @@ class GenerateCommand(QUndoCommand):
def redo(self): def redo(self):
if self._generator == "growing": if self._generator == "growing":
self._ics.generate_growing_constante_height(self._param) self._ics.generate_growing_constante_height(self._param,
self._option)
elif self._generator == "discharge": elif self._generator == "discharge":
self._ics.generate_discharge(self._param) self._ics.generate_discharge(self._param,
self._option)
+4 -2
View File
@@ -349,12 +349,14 @@ class InitialConditionsWindow(PamhyrWindow):
dlg = HeightDialog(trad=self._trad, parent=self) dlg = HeightDialog(trad=self._trad, parent=self)
if dlg.exec(): if dlg.exec():
value = dlg.value value = dlg.value
self._table.generate("growing", value) compute_discharge = dlg.option
self._table.generate("growing", value, compute_discharge)
self._update() self._update()
def generate_discharge(self): def generate_discharge(self):
dlg = DischargeDialog(trad=self._trad, parent=self) dlg = DischargeDialog(trad=self._trad, parent=self)
if dlg.exec(): if dlg.exec():
value = dlg.value value = dlg.value
self._table.generate("discharge", value) compute_height = dlg.option
self._table.generate("discharge", value, compute_height)
self._update() self._update()
+21 -2
View File
@@ -73,7 +73,10 @@ class NodeItem(QGraphicsItem):
def shape(self): def shape(self):
path = QPainterPath() path = QPainterPath()
path.addEllipse(-10, -10, 20, 20) if self.graph.graph._reservoir.get_assoc_to_node(self.node) is None:
path.addEllipse(-10, -10, 20, 20)
else:
path.addRect(-10, -10, 20, 20)
return path return path
@timer @timer
@@ -95,7 +98,10 @@ class NodeItem(QGraphicsItem):
color = Qt.green color = Qt.green
painter.setBrush(QBrush(color)) painter.setBrush(QBrush(color))
painter.drawEllipse(-10, -10, 20, 20) if self.graph.graph._reservoir.get_assoc_to_node(self.node) is None:
painter.drawEllipse(-10, -10, 20, 20)
else:
painter.drawRect(-10, -10, 20, 20)
def itemChange(self, change, value): def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionHasChanged: if change == QGraphicsItem.ItemPositionHasChanged:
@@ -610,11 +616,15 @@ class GraphWidget(QGraphicsView):
def add_node_reservoir(self, node): def add_node_reservoir(self, node):
self.parent.add_node_reservoir(node) self.parent.add_node_reservoir(node)
self.display_update()
def del_node_reservoir(self, node): def del_node_reservoir(self, node):
self.parent.del_node_reservoir(node) self.parent.del_node_reservoir(node)
self.changeNode.emit(self.sender())
self.display_update()
def edit_node_reservoir(self, node): def edit_node_reservoir(self, node):
self.changeNode.emit(self.sender())
self.parent.edit_node_reservoir(node) self.parent.edit_node_reservoir(node)
def enable_edge(self, edge, prev): def enable_edge(self, edge, prev):
@@ -999,12 +1009,20 @@ class GraphWidget(QGraphicsView):
items = self.items(event.pos()) items = self.items(event.pos())
# Select current menu # Select current menu
while len(items) > 0:
if type(items[0]) in [NodeItem, EdgeItem]:
break
else:
items = items[1:]
if len(items) == 0: if len(items) == 0:
m_type = DefaultMenu m_type = DefaultMenu
elif type(items[0]) is NodeItem: elif type(items[0]) is NodeItem:
m_type = NodeMenu m_type = NodeMenu
elif type(items[0]) is EdgeItem: elif type(items[0]) is EdgeItem:
m_type = EdgeMenu m_type = EdgeMenu
else:
m_type = DefaultMenu
# Create and exec menu # Create and exec menu
m = m_type( m = m_type(
@@ -1012,3 +1030,4 @@ class GraphWidget(QGraphicsView):
graph=self.graph, trad=self._trad, parent=self graph=self.graph, trad=self._trad, parent=self
) )
m.run() m.run()
self.clicked = False
+2
View File
@@ -54,10 +54,12 @@ class NetworkTranslate(MainTranslate):
self._sub_dict["table_headers_node"] = { self._sub_dict["table_headers_node"] = {
"name": self._dict['name'], "name": self._dict['name'],
"type": self._dict['type'], "type": self._dict['type'],
"id": _translate("Network", "Index"),
} }
self._sub_dict["table_headers_edge"] = { self._sub_dict["table_headers_edge"] = {
"name": self._dict['name'], "name": self._dict['name'],
"node1": _translate("Network", "Source node"), "node1": _translate("Network", "Source node"),
"node2": _translate("Network", "Destination node"), "node2": _translate("Network", "Destination node"),
"id": _translate("Network", "Index"),
} }
-1
View File
@@ -65,7 +65,6 @@ class PlotXY(PamhyrPlot):
self._table = parent.find(QTableView, f"tableView_profile") self._table = parent.find(QTableView, f"tableView_profile")
def onpick(self, event): def onpick(self, event):
print(event.mouseevent.button.value)
if event.mouseevent.inaxes != self.canvas.axes: if event.mouseevent.inaxes != self.canvas.axes:
return return
if event.mouseevent.button.value != 1: if event.mouseevent.button.value != 1:
+2 -2
View File
@@ -271,9 +271,9 @@ class ResultsWindow(PamhyrWindow):
table = self.find(QTableView, f"tableView_reach") table = self.find(QTableView, f"tableView_reach")
indexes = table.selectedIndexes() indexes = table.selectedIndexes()
if len(indexes) == 0: if len(indexes) == 0:
reach = self._study.river.edges()[0] reach = self._study.river.enable_edges()[0]
else: else:
reach = self._study.river.edges()[indexes[0].row()] reach = self._study.river.enable_edges()[indexes[0].row()]
# Profile # Profile
table = self.find(QTableView, f"tableView_profile") table = self.find(QTableView, f"tableView_profile")
+4 -2
View File
@@ -18,6 +18,8 @@
import logging import logging
from tools import timestamp
from PyQt5.QtCore import ( from PyQt5.QtCore import (
Qt, QRect, QTime, QDateTime, pyqtSlot, Qt, QRect, QTime, QDateTime, pyqtSlot,
) )
@@ -55,8 +57,8 @@ class PamhyrExTimeDelegate(QItemDelegate):
if self._mode == "time": if self._mode == "time":
model.setData(index, int(time.total_seconds())) model.setData(index, int(time.total_seconds()))
else: else:
logger.debug(str(time.timestamp())) logger.debug(str(timestamp(time)))
model.setData(index, int(time.timestamp())) model.setData(index, int(timestamp(time)))
editor.close() editor.close()
editor.deleteLater() editor.deleteLater()
-1
View File
@@ -53,7 +53,6 @@ class UnitTranslate(CommonWordTranslate):
super(UnitTranslate, self).__init__() super(UnitTranslate, self).__init__()
self._dict["unit_rk"] = _translate("Unit", "River Kilometric (m)") self._dict["unit_rk"] = _translate("Unit", "River Kilometric (m)")
self._dict["unit_rk_short"] = _translate("Unit", "RK (m)")
self._dict["unit_width"] = _translate("Unit", "Width (m)") self._dict["unit_width"] = _translate("Unit", "Width (m)")
self._dict["unit_height"] = _translate("Unit", "Height (m)") self._dict["unit_height"] = _translate("Unit", "Height (m)")
self._dict["unit_diameter"] = _translate("Unit", "Diameter (m)") self._dict["unit_diameter"] = _translate("Unit", "Diameter (m)")
@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>284</width> <width>284</width>
<height>80</height> <height>107</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -17,6 +17,16 @@
<locale language="English" country="Europe"/> <locale language="English" country="Europe"/>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
@@ -39,12 +49,12 @@
</layout> </layout>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QCheckBox" name="checkBox">
<property name="orientation"> <property name="text">
<enum>Qt::Horizontal</enum> <string>Generate height</string>
</property> </property>
<property name="standardButtons"> <property name="checked">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
@@ -17,6 +17,16 @@
<locale language="English" country="Europe"/> <locale language="English" country="Europe"/>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
@@ -29,19 +39,19 @@
<item> <item>
<widget class="QDoubleSpinBox" name="doubleSpinBox"> <widget class="QDoubleSpinBox" name="doubleSpinBox">
<property name="maximum"> <property name="maximum">
<double>999999.998999999952503</double> <double>1000000.000000000000000</double>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QCheckBox" name="checkBox">
<property name="orientation"> <property name="text">
<enum>Qt::Horizontal</enum> <string>Generate discharge</string>
</property> </property>
<property name="standardButtons"> <property name="checked">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
+1 -1
View File
@@ -37,7 +37,7 @@
</size> </size>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>2</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="tab_liquid"> <widget class="QWidget" name="tab_liquid">
<attribute name="title"> <attribute name="title">
+1 -1
View File
@@ -145,7 +145,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>2</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="tab_4"> <widget class="QWidget" name="tab_4">
<attribute name="title"> <attribute name="title">
+1 -1
View File
@@ -237,7 +237,7 @@ def timestamp(dt: datetime):
def date_iso_to_timestamp(date: str): def date_iso_to_timestamp(date: str):
if type(date) is str: if type(date) is str:
return datetime.fromisoformat(date).timestamp() return timestamp(datetime.fromisoformat(date))
else: else:
return datetime.isoformat(date) return datetime.isoformat(date)