mirror of https://gitlab.com/pamhyr/pamhyr2
output kp
parent
59aae7fd40
commit
b40efc2426
|
|
@ -1,277 +0,0 @@
|
|||
# Table.py -- Pamhyr
|
||||
# Copyright (C) 2023-2024 INRAE
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import logging
|
||||
import traceback
|
||||
|
||||
from tools import trace, timer
|
||||
|
||||
from PyQt5.QtCore import (
|
||||
Qt, QVariant, QAbstractTableModel,
|
||||
QCoreApplication, QModelIndex, pyqtSlot,
|
||||
QRect,
|
||||
)
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QDialogButtonBox, QPushButton, QLineEdit,
|
||||
QFileDialog, QTableView, QAbstractItemView,
|
||||
QUndoStack, QShortcut, QAction, QItemDelegate,
|
||||
QComboBox, QMessageBox,
|
||||
)
|
||||
|
||||
from View.Tools.PamhyrTable import PamhyrTableModel
|
||||
|
||||
from View.HydraulicStructures.BasicHydraulicStructures.UndoCommand import (
|
||||
SetNameCommand, SetTypeCommand,
|
||||
SetEnabledCommand, AddCommand, DelCommand,
|
||||
SetValueCommand,
|
||||
)
|
||||
from Model.HydraulicStructures.Basic.Types import BHS_types
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
_translate = QCoreApplication.translate
|
||||
|
||||
|
||||
class ComboBoxDelegate(QItemDelegate):
|
||||
def __init__(self, data=None, trad=None, parent=None):
|
||||
super(ComboBoxDelegate, self).__init__(parent)
|
||||
|
||||
self._data = data
|
||||
self._trad = trad
|
||||
|
||||
self._long_types = {}
|
||||
if self._trad is not None:
|
||||
self._long_types = self._trad.get_dict("long_types")
|
||||
|
||||
def createEditor(self, parent, option, index):
|
||||
self.editor = QComboBox(parent)
|
||||
|
||||
lst = list(
|
||||
map(
|
||||
lambda k: self._long_types[k],
|
||||
BHS_types.keys()
|
||||
)
|
||||
)
|
||||
self.editor.addItems(lst)
|
||||
|
||||
self.editor.setCurrentText(index.data(Qt.DisplayRole))
|
||||
return self.editor
|
||||
|
||||
def setEditorData(self, editor, index):
|
||||
value = index.data(Qt.DisplayRole)
|
||||
self.editor.currentTextChanged.connect(self.currentItemChanged)
|
||||
|
||||
def setModelData(self, editor, model, index):
|
||||
text = str(editor.currentText())
|
||||
model.setData(index, text)
|
||||
editor.close()
|
||||
editor.deleteLater()
|
||||
|
||||
def updateEditorGeometry(self, editor, option, index):
|
||||
r = QRect(option.rect)
|
||||
if self.editor.windowFlags() & Qt.Popup:
|
||||
if editor.parent() is not None:
|
||||
r.setTopLeft(self.editor.parent().mapToGlobal(r.topLeft()))
|
||||
editor.setGeometry(r)
|
||||
|
||||
@pyqtSlot()
|
||||
def currentItemChanged(self):
|
||||
self.commitData.emit(self.sender())
|
||||
|
||||
|
||||
class TableModel(PamhyrTableModel):
|
||||
def __init__(self, trad=None, **kwargs):
|
||||
self._trad = trad
|
||||
self._long_types = {}
|
||||
if self._trad is not None:
|
||||
self._long_types = self._trad.get_dict("long_types")
|
||||
|
||||
super(TableModel, self).__init__(trad=trad, **kwargs)
|
||||
|
||||
def rowCount(self, parent):
|
||||
return len(self._lst)
|
||||
|
||||
def data(self, index, role):
|
||||
if role != Qt.ItemDataRole.DisplayRole:
|
||||
return QVariant()
|
||||
|
||||
row = index.row()
|
||||
column = index.column()
|
||||
|
||||
if self._headers[column] == "name":
|
||||
return self._data.basic_structure(row).name
|
||||
elif self._headers[column] == "type":
|
||||
return self._long_types[self._data.basic_structure(row).type]
|
||||
|
||||
return QVariant()
|
||||
|
||||
def setData(self, index, value, role=Qt.EditRole):
|
||||
if not index.isValid() or role != Qt.EditRole:
|
||||
return False
|
||||
|
||||
row = index.row()
|
||||
column = index.column()
|
||||
|
||||
try:
|
||||
if self._headers[column] == "name":
|
||||
self._undo.push(
|
||||
SetNameCommand(
|
||||
self._data, row, value
|
||||
)
|
||||
)
|
||||
elif self._headers[column] == "type":
|
||||
old_type = self._data.basic_structure(row).type
|
||||
|
||||
if old_type == "ND" or self._question_set_type():
|
||||
key = next(
|
||||
k for k, v in self._long_types.items()
|
||||
if v == value
|
||||
)
|
||||
|
||||
self._undo.push(
|
||||
SetTypeCommand(
|
||||
self._data, row, BHS_types[key]
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.debug(traceback.format_exc())
|
||||
|
||||
self.dataChanged.emit(index, index)
|
||||
return True
|
||||
|
||||
def _question_set_type(self):
|
||||
question = QMessageBox(self._parent)
|
||||
|
||||
question.setWindowTitle(self._trad['msg_type_change_title'])
|
||||
question.setText(self._trad['msg_type_change_text'])
|
||||
question.setStandardButtons(QMessageBox.Cancel | QMessageBox.Ok)
|
||||
question.setIcon(QMessageBox.Question)
|
||||
|
||||
res = question.exec()
|
||||
return res == QMessageBox.Ok
|
||||
|
||||
def add(self, row, parent=QModelIndex()):
|
||||
self.beginInsertRows(parent, row, row - 1)
|
||||
|
||||
self._undo.push(
|
||||
AddCommand(
|
||||
self._data, row
|
||||
)
|
||||
)
|
||||
|
||||
self.endInsertRows()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def delete(self, rows, parent=QModelIndex()):
|
||||
self.beginRemoveRows(parent, rows[0], rows[-1])
|
||||
|
||||
self._undo.push(
|
||||
DelCommand(
|
||||
self._data, rows
|
||||
)
|
||||
)
|
||||
|
||||
self.endRemoveRows()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def enabled(self, row, enabled, parent=QModelIndex()):
|
||||
self._undo.push(
|
||||
SetEnabledCommand(
|
||||
self._lst, row, enabled
|
||||
)
|
||||
)
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def undo(self):
|
||||
self._undo.undo()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def redo(self):
|
||||
self._undo.redo()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
|
||||
class ParametersTableModel(PamhyrTableModel):
|
||||
def __init__(self, trad=None, **kwargs):
|
||||
self._trad = trad
|
||||
self._long_types = {}
|
||||
|
||||
if self._trad is not None:
|
||||
self._long_types = self._trad.get_dict("long_types")
|
||||
|
||||
self._hs_index = None
|
||||
|
||||
super(ParametersTableModel, self).__init__(trad=trad, **kwargs)
|
||||
|
||||
def rowCount(self, parent):
|
||||
if self._hs_index is None:
|
||||
return 0
|
||||
|
||||
return len(
|
||||
self._data.basic_structure(self._hs_index)
|
||||
)
|
||||
|
||||
def data(self, index, role):
|
||||
if role != Qt.ItemDataRole.DisplayRole:
|
||||
return QVariant()
|
||||
|
||||
if self._hs_index is None:
|
||||
return QVariant()
|
||||
|
||||
row = index.row()
|
||||
column = index.column()
|
||||
|
||||
hs = self._data.basic_structure(self._hs_index)
|
||||
|
||||
if self._headers[column] == "name":
|
||||
return self._trad[hs.parameters[row].name]
|
||||
elif self._headers[column] == "value":
|
||||
return str(hs.parameters[row].value)
|
||||
|
||||
return QVariant()
|
||||
|
||||
def setData(self, index, value, role=Qt.EditRole):
|
||||
if not index.isValid() or role != Qt.EditRole:
|
||||
return False
|
||||
|
||||
if self._hs_index is None:
|
||||
return QVariant()
|
||||
|
||||
row = index.row()
|
||||
column = index.column()
|
||||
|
||||
try:
|
||||
if self._headers[column] == "value":
|
||||
self._undo.push(
|
||||
SetValueCommand(
|
||||
self._data.basic_structure(self._hs_index),
|
||||
row, value
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.debug(traceback.format_exc())
|
||||
|
||||
self.dataChanged.emit(index, index)
|
||||
return True
|
||||
|
||||
def update_hs_index(self, index):
|
||||
self._hs_index = index
|
||||
self.layoutChanged.emit()
|
||||
|
|
@ -1,155 +0,0 @@
|
|||
# translate.py -- Pamhyr
|
||||
# Copyright (C) 2023-2024 INRAE
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from PyQt5.QtCore import QCoreApplication
|
||||
|
||||
from View.Translate import MainTranslate
|
||||
|
||||
_translate = QCoreApplication.translate
|
||||
|
||||
|
||||
class BasicHydraulicStructuresTranslate(MainTranslate):
|
||||
def __init__(self):
|
||||
super(BasicHydraulicStructuresTranslate, self).__init__()
|
||||
|
||||
self._dict["Basic Hydraulic Structures"] = _translate(
|
||||
"BasicHydraulicStructures", "Basic Hydraulic Structures"
|
||||
)
|
||||
|
||||
self._dict['msg_type_change_title'] = _translate(
|
||||
"BasicHydraulicStructures",
|
||||
"Change hydraulic structure type"
|
||||
)
|
||||
|
||||
self._dict['msg_type_change_text'] = _translate(
|
||||
"BasicHydraulicStructures",
|
||||
"Do you want to change the hydraulic structure type and reset \
|
||||
hydraulic structure values?"
|
||||
)
|
||||
|
||||
# BHSValues translation
|
||||
|
||||
self._dict['width'] = self._dict["unit_width"]
|
||||
self._dict['height'] = self._dict["unit_thickness"]
|
||||
self._dict['elevation'] = self._dict["unit_elevation"]
|
||||
self._dict['diameter'] = self._dict["unit_diameter"]
|
||||
self._dict['discharge_coefficient'] = _translate(
|
||||
"BasicHydraulicStructures", "Discharge coefficient"
|
||||
)
|
||||
self._dict['loading_elevation'] = _translate(
|
||||
"BasicHydraulicStructures", "Upper elevation (m)"
|
||||
)
|
||||
self._dict['half-angle_tangent'] = _translate(
|
||||
"BasicHydraulicStructures", "Half-angle tangent"
|
||||
)
|
||||
self._dict['maximal_loading_elevation'] = _translate(
|
||||
"BasicHydraulicStructures", "Maximal loading elevation"
|
||||
)
|
||||
self._dict['siltation_height'] = _translate(
|
||||
"BasicHydraulicStructures", "Siltation height (m)"
|
||||
)
|
||||
self._dict['top_of_the_vault'] = _translate(
|
||||
"BasicHydraulicStructures", "Top of the vault (m)"
|
||||
)
|
||||
self._dict['bottom_of_the_vault'] = _translate(
|
||||
"BasicHydraulicStructures", "Bottom of the vault (m)"
|
||||
)
|
||||
self._dict['opening'] = _translate(
|
||||
"BasicHydraulicStructures", "Opening"
|
||||
)
|
||||
self._dict['maximal_opening'] = _translate(
|
||||
"BasicHydraulicStructures", "Maximal opening"
|
||||
)
|
||||
self._dict['step_space'] = _translate(
|
||||
"BasicHydraulicStructures", "Step space"
|
||||
)
|
||||
self._dict['weir'] = _translate(
|
||||
"BasicHydraulicStructures", "Weir"
|
||||
)
|
||||
self._dict['coefficient'] = _translate(
|
||||
"BasicHydraulicStructures", "Coefficient"
|
||||
)
|
||||
|
||||
# Dummy parameters
|
||||
|
||||
self._dict['parameter_1'] = _translate(
|
||||
"BasicHydraulicStructures", "Parameter 1"
|
||||
)
|
||||
self._dict['parameter_2'] = _translate(
|
||||
"BasicHydraulicStructures", "Parameter 2"
|
||||
)
|
||||
self._dict['parameter_3'] = _translate(
|
||||
"BasicHydraulicStructures", "Parameter 3"
|
||||
)
|
||||
self._dict['parameter_4'] = _translate(
|
||||
"BasicHydraulicStructures", "Parameter 4"
|
||||
)
|
||||
self._dict['parameter_5'] = _translate(
|
||||
"BasicHydraulicStructures", "Parameter 5"
|
||||
)
|
||||
|
||||
# BHS types long names
|
||||
|
||||
self._sub_dict["long_types"] = {
|
||||
"ND": self._dict["not_defined"],
|
||||
"S1": _translate(
|
||||
"BasicHydraulicStructures", "Discharge weir"
|
||||
),
|
||||
"S2": _translate(
|
||||
"BasicHydraulicStructures", "Trapezoidal weir"
|
||||
),
|
||||
"S3": _translate(
|
||||
"BasicHydraulicStructures", "Triangular weir"
|
||||
),
|
||||
"OR": _translate(
|
||||
"BasicHydraulicStructures", "Rectangular orifice"
|
||||
),
|
||||
"OC": _translate(
|
||||
"BasicHydraulicStructures", "Circular orifice"
|
||||
),
|
||||
"OV": _translate(
|
||||
"BasicHydraulicStructures", "Vaulted orifice"
|
||||
),
|
||||
"V1": _translate(
|
||||
"BasicHydraulicStructures", "Rectangular gate"
|
||||
),
|
||||
"V2": _translate(
|
||||
"BasicHydraulicStructures", "Simplified rectangular gate"
|
||||
),
|
||||
"BO": _translate(
|
||||
"BasicHydraulicStructures", "Borda-type head loss"
|
||||
),
|
||||
"CV": _translate(
|
||||
"BasicHydraulicStructures", "Check valve"
|
||||
),
|
||||
"UD": _translate(
|
||||
"BasicHydraulicStructures", "User defined"
|
||||
),
|
||||
}
|
||||
|
||||
# Tables
|
||||
|
||||
self._sub_dict["table_headers"] = {
|
||||
"name": self._dict["name"],
|
||||
"type": self._dict["type"],
|
||||
}
|
||||
|
||||
self._sub_dict["table_headers_parameters"] = {
|
||||
"name": self._dict["name"],
|
||||
"value": self._dict["value"],
|
||||
}
|
||||
|
|
@ -1,153 +0,0 @@
|
|||
# UndoCommand.py -- Pamhyr
|
||||
# Copyright (C) 2023-2024 INRAE
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from copy import deepcopy
|
||||
from tools import trace, timer
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QMessageBox, QUndoCommand, QUndoStack,
|
||||
)
|
||||
|
||||
|
||||
class SetNameCommand(QUndoCommand):
|
||||
def __init__(self, hs, index, new_value):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._hs = hs
|
||||
self._index = index
|
||||
self._old = self._hs.basic_structure(self._index).name
|
||||
self._new = str(new_value)
|
||||
|
||||
def undo(self):
|
||||
self._hs.basic_structure(self._index).name = self._old
|
||||
|
||||
def redo(self):
|
||||
self._hs.basic_structure(self._index).name = self._new
|
||||
|
||||
|
||||
class SetTypeCommand(QUndoCommand):
|
||||
def __init__(self, hs, index, new_type):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._hs = hs
|
||||
self._index = index
|
||||
self._type = new_type
|
||||
self._old = self._hs.basic_structure(self._index)
|
||||
self._new = self._hs.basic_structure(self._index)\
|
||||
.convert(self._type)
|
||||
|
||||
def undo(self):
|
||||
self._hs.delete_i([self._index])
|
||||
self._hs.insert(self._index, self._old)
|
||||
|
||||
def redo(self):
|
||||
self._hs.delete_i([self._index])
|
||||
self._hs.insert(self._index, self._new)
|
||||
|
||||
|
||||
class SetEnabledCommand(QUndoCommand):
|
||||
def __init__(self, hs, index, enabled):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._hs = hs
|
||||
self._index = index
|
||||
self._old = not enabled
|
||||
self._new = enabled
|
||||
|
||||
def undo(self):
|
||||
self._hs.basic_structure(self._index).enabled = self._old
|
||||
|
||||
def redo(self):
|
||||
self._hs.basic_structure(self._index).enabled = self._new
|
||||
|
||||
|
||||
class AddCommand(QUndoCommand):
|
||||
def __init__(self, hs, index):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._hs = hs
|
||||
|
||||
self._index = index
|
||||
self._new = None
|
||||
|
||||
def undo(self):
|
||||
self._hs.delete_i([self._index])
|
||||
|
||||
def redo(self):
|
||||
if self._new is None:
|
||||
self._new = self._hs.add(self._index)
|
||||
else:
|
||||
self._hs.insert(self._index, self._new)
|
||||
|
||||
|
||||
class DelCommand(QUndoCommand):
|
||||
def __init__(self, hs, rows):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._hs = hs
|
||||
|
||||
self._rows = rows
|
||||
|
||||
self._bhs = []
|
||||
for row in rows:
|
||||
self._bhs.append((row, self._hs.basic_structure(row)))
|
||||
|
||||
def undo(self):
|
||||
for row, el in self._bhs:
|
||||
self._hs.insert(row, el)
|
||||
|
||||
def redo(self):
|
||||
self._hs.delete_i(self._rows)
|
||||
|
||||
|
||||
class PasteCommand(QUndoCommand):
|
||||
def __init__(self, hs, row, h_s):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._hs = hs
|
||||
|
||||
self._row = row
|
||||
self._bhs = deepcopy(h_s)
|
||||
self._bhs.reverse()
|
||||
|
||||
def undo(self):
|
||||
self._hs.delete_i(range(self._row, self._row + len(self._bhs)))
|
||||
|
||||
def redo(self):
|
||||
for r in self._bhs:
|
||||
self._hs.insert(self._row, r)
|
||||
|
||||
####################################
|
||||
# Basic hydraulic structure values #
|
||||
####################################
|
||||
|
||||
|
||||
class SetValueCommand(QUndoCommand):
|
||||
def __init__(self, bhs, index, value):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._bhs = bhs
|
||||
self._index = index
|
||||
self._old = self._bhs.parameters[self._index].value
|
||||
self._new = self._bhs.parameters[self._index].type(value)
|
||||
|
||||
def undo(self):
|
||||
self._bhs.parameters[self._index].value = self._old
|
||||
|
||||
def redo(self):
|
||||
self._bhs.parameters[self._index].value = self._new
|
||||
|
|
@ -1,236 +0,0 @@
|
|||
# Window.py -- Pamhyr
|
||||
# Copyright (C) 2023-2024 INRAE
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import logging
|
||||
|
||||
from tools import timer, trace
|
||||
|
||||
from View.Tools.PamhyrWindow import PamhyrWindow
|
||||
|
||||
from PyQt5 import QtCore
|
||||
from PyQt5.QtCore import (
|
||||
Qt, QVariant, QAbstractTableModel, QCoreApplication,
|
||||
pyqtSlot, pyqtSignal, QItemSelectionModel,
|
||||
)
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QDialogButtonBox, QPushButton, QLineEdit,
|
||||
QFileDialog, QTableView, QAbstractItemView,
|
||||
QUndoStack, QShortcut, QAction, QItemDelegate,
|
||||
QHeaderView, QDoubleSpinBox, QVBoxLayout, QCheckBox
|
||||
)
|
||||
|
||||
from View.Tools.Plot.PamhyrCanvas import MplCanvas
|
||||
from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
|
||||
|
||||
from View.HydraulicStructures.BasicHydraulicStructures.Table import (
|
||||
ComboBoxDelegate, TableModel, ParametersTableModel,
|
||||
)
|
||||
|
||||
from View.Network.GraphWidget import GraphWidget
|
||||
from View.HydraulicStructures.BasicHydraulicStructures.Translate import (
|
||||
BasicHydraulicStructuresTranslate
|
||||
)
|
||||
|
||||
_translate = QCoreApplication.translate
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
||||
class BasicHydraulicStructuresWindow(PamhyrWindow):
|
||||
_pamhyr_ui = "BasicHydraulicStructures"
|
||||
_pamhyr_name = "Basic Hydraulic Structures"
|
||||
|
||||
def __init__(self, data=None, study=None, config=None, parent=None):
|
||||
trad = BasicHydraulicStructuresTranslate()
|
||||
name = " - ".join([
|
||||
trad[self._pamhyr_name], data.name, study.name
|
||||
])
|
||||
|
||||
super(BasicHydraulicStructuresWindow, self).__init__(
|
||||
title=name,
|
||||
study=study,
|
||||
config=config,
|
||||
trad=trad,
|
||||
parent=parent
|
||||
)
|
||||
|
||||
self._hash_data.append(data)
|
||||
|
||||
self._hs = data
|
||||
|
||||
self.setup_table()
|
||||
self.setup_checkbox()
|
||||
self.setup_connections()
|
||||
|
||||
self.update()
|
||||
|
||||
def setup_table(self):
|
||||
self.setup_table_bhs()
|
||||
self.setup_table_bhs_parameters()
|
||||
|
||||
def setup_table_bhs(self):
|
||||
self._table = None
|
||||
|
||||
self._delegate_type = ComboBoxDelegate(
|
||||
trad=self._trad,
|
||||
parent=self
|
||||
)
|
||||
|
||||
table = self.find(QTableView, f"tableView")
|
||||
self._table = TableModel(
|
||||
table_view=table,
|
||||
table_headers=self._trad.get_dict("table_headers"),
|
||||
editable_headers=["name", "type"],
|
||||
delegates={
|
||||
"type": self._delegate_type,
|
||||
},
|
||||
trad=self._trad,
|
||||
data=self._hs,
|
||||
undo=self._undo_stack,
|
||||
parent=self,
|
||||
)
|
||||
|
||||
selectionModel = table.selectionModel()
|
||||
index = table.model().index(0, 0)
|
||||
|
||||
selectionModel.select(
|
||||
index,
|
||||
QItemSelectionModel.Rows |
|
||||
QItemSelectionModel.ClearAndSelect |
|
||||
QItemSelectionModel.Select
|
||||
)
|
||||
table.scrollTo(index)
|
||||
|
||||
def setup_table_bhs_parameters(self):
|
||||
self._table_parameters = None
|
||||
|
||||
table = self.find(QTableView, f"tableView_2")
|
||||
self._table_parameters = ParametersTableModel(
|
||||
table_view=table,
|
||||
table_headers=self._trad.get_dict("table_headers_parameters"),
|
||||
editable_headers=["value"],
|
||||
delegates={},
|
||||
trad=self._trad,
|
||||
data=self._hs,
|
||||
undo=self._undo_stack,
|
||||
parent=self,
|
||||
)
|
||||
|
||||
def setup_checkbox(self):
|
||||
self._checkbox = self.find(QCheckBox, f"checkBox")
|
||||
self._set_checkbox_state()
|
||||
|
||||
def setup_connections(self):
|
||||
self.find(QAction, "action_add").triggered.connect(self.add)
|
||||
self.find(QAction, "action_delete").triggered.connect(self.delete)
|
||||
self._checkbox.clicked.connect(self._set_basic_structure_state)
|
||||
|
||||
table = self.find(QTableView, "tableView")
|
||||
table.selectionModel()\
|
||||
.selectionChanged\
|
||||
.connect(self.update)
|
||||
|
||||
self._table.dataChanged.connect(self.update)
|
||||
self._table.layoutChanged.connect(self.update)
|
||||
|
||||
def index_selected(self):
|
||||
table = self.find(QTableView, "tableView")
|
||||
r = table.selectionModel().selectedRows()
|
||||
|
||||
if len(r) > 0:
|
||||
return r[0]
|
||||
else:
|
||||
return None
|
||||
|
||||
def index_selected_row(self):
|
||||
table = self.find(QTableView, "tableView")
|
||||
r = table.selectionModel().selectedRows()
|
||||
|
||||
if len(r) > 0:
|
||||
return r[0].row()
|
||||
else:
|
||||
return None
|
||||
|
||||
def index_selected_rows(self):
|
||||
table = self.find(QTableView, "tableView")
|
||||
return list(
|
||||
# Delete duplicate
|
||||
set(
|
||||
map(
|
||||
lambda i: i.row(),
|
||||
table.selectedIndexes()
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
def add(self):
|
||||
rows = self.index_selected_rows()
|
||||
|
||||
if len(self._hs) == 0 or len(rows) == 0:
|
||||
self._table.add(0)
|
||||
else:
|
||||
self._table.add(rows[0])
|
||||
|
||||
def delete(self):
|
||||
rows = self.index_selected_rows()
|
||||
|
||||
if len(rows) == 0:
|
||||
return
|
||||
|
||||
self._table.delete(rows)
|
||||
|
||||
def _copy(self):
|
||||
logger.info("TODO: copy")
|
||||
|
||||
def _paste(self):
|
||||
logger.info("TODO: paste")
|
||||
|
||||
def _undo(self):
|
||||
self._table.undo()
|
||||
|
||||
def _redo(self):
|
||||
self._table.redo()
|
||||
|
||||
def _set_checkbox_state(self):
|
||||
row = self.index_selected_row()
|
||||
|
||||
if row is None:
|
||||
self._checkbox.setEnabled(False)
|
||||
self._checkbox.setChecked(True)
|
||||
else:
|
||||
self._checkbox.setEnabled(True)
|
||||
self._checkbox.setChecked(self._hs.basic_structure(row).enabled)
|
||||
|
||||
def _set_basic_structure_state(self):
|
||||
rows = self.index_selected_rows()
|
||||
if len(rows) != 0:
|
||||
for row in rows:
|
||||
if row is not None:
|
||||
self._table.enabled(
|
||||
row,
|
||||
self._checkbox.isChecked()
|
||||
)
|
||||
|
||||
def update(self):
|
||||
self._set_checkbox_state()
|
||||
self._update_parameters_table()
|
||||
|
||||
def _update_parameters_table(self):
|
||||
row = self.index_selected_row()
|
||||
self._table_parameters.update_hs_index(row)
|
||||
|
|
@ -37,7 +37,7 @@ from PyQt5.QtWidgets import (
|
|||
from View.Tools.PamhyrTable import PamhyrTableModel
|
||||
|
||||
from View.OutputKpAdisTS.UndoCommand import (
|
||||
SetNameCommand, SetReachCommand, SetKpCommand,
|
||||
SetTitleCommand, SetReachCommand, SetKpCommand,
|
||||
SetEnabledCommand, AddCommand, DelCommand,
|
||||
)
|
||||
|
||||
|
|
@ -145,7 +145,7 @@ class TableModel(PamhyrTableModel):
|
|||
try:
|
||||
if self._headers[column] == "title":
|
||||
self._undo.push(
|
||||
SetNameCommand(
|
||||
SetTitleCommand(
|
||||
self._lst, row, value
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,13 +28,13 @@ from PyQt5.QtWidgets import (
|
|||
logger = logging.getLogger()
|
||||
|
||||
|
||||
class SetNameCommand(QUndoCommand):
|
||||
class SetTitleCommand(QUndoCommand):
|
||||
def __init__(self, outputkp_lst, index, new_value):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._outputkp_lst = outputkp_lst
|
||||
self._index = index
|
||||
self._old = self._outputkp_lst.get(self._index).name
|
||||
self._old = self._outputkp_lst.get(self._index).title
|
||||
self._new = str(new_value)
|
||||
|
||||
def undo(self):
|
||||
|
|
@ -50,20 +50,20 @@ class SetReachCommand(QUndoCommand):
|
|||
|
||||
self._outputkp_lst = outputkp_lst
|
||||
self._index = index
|
||||
self._old = self._outputkp_lst.get(self._index).input_reach
|
||||
self._old = self._outputkp_lst.get(self._index).reach
|
||||
self._new = reach
|
||||
self._old_kp = self._outputkp_lst.get(self._index).input_kp
|
||||
self._old_kp = self._outputkp_lst.get(self._index).kp
|
||||
self._new_kp = None
|
||||
|
||||
def undo(self):
|
||||
i = self._outputkp_lst.get(self._index)
|
||||
i.input_reach = self._old
|
||||
i.input_kp = self._old_kp
|
||||
i.reach = self._old
|
||||
i.kp = self._old_kp
|
||||
|
||||
def redo(self):
|
||||
i = self._outputkp_lst.get(self._index)
|
||||
i.input_reach = self._new
|
||||
i.input_kp = self._new_kp
|
||||
i.reach = self._new
|
||||
i.kp = self._new_kp
|
||||
|
||||
|
||||
class SetKpCommand(QUndoCommand):
|
||||
|
|
@ -72,14 +72,14 @@ class SetKpCommand(QUndoCommand):
|
|||
|
||||
self._outputkp_lst = outputkp_lst
|
||||
self._index = index
|
||||
self._old = self._outputkp_lst.get(self._index).input_kp
|
||||
self._old = self._outputkp_lst.get(self._index).kp
|
||||
self._new = kp
|
||||
|
||||
def undo(self):
|
||||
self._outputkp_lst.get(self._index).input_kp = self._old
|
||||
self._outputkp_lst.get(self._index).kp = self._old
|
||||
|
||||
def redo(self):
|
||||
self._outputkp_lst.get(self._index).input_kp = self._new
|
||||
self._outputkp_lst.get(self._index).kp = self._new
|
||||
|
||||
|
||||
class SetEnabledCommand(QUndoCommand):
|
||||
|
|
|
|||
|
|
@ -45,10 +45,6 @@ from View.OutputKpAdisTS.Table import (
|
|||
from View.Network.GraphWidget import GraphWidget
|
||||
from View.OutputKpAdisTS.Translate import OutputKpAdisTSTranslate
|
||||
|
||||
from View.OutputKpAdisTS.BasicHydraulicStructures.Window import (
|
||||
BasicHydraulicStructuresWindow
|
||||
)
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
||||
|
|
@ -124,8 +120,7 @@ class OutputKpAdisTSWindow(PamhyrWindow):
|
|||
def setup_connections(self):
|
||||
self.find(QAction, "action_add").triggered.connect(self.add)
|
||||
self.find(QAction, "action_delete").triggered.connect(self.delete)
|
||||
self.find(QAction, "action_edit").triggered.connect(self.edit)
|
||||
self._checkbox.clicked.connect(self._set_structure_state)
|
||||
self._checkbox.clicked.connect(self._set_outputkp_state)
|
||||
|
||||
table = self.find(QTableView, "tableView")
|
||||
table.selectionModel()\
|
||||
|
|
@ -191,24 +186,6 @@ class OutputKpAdisTSWindow(PamhyrWindow):
|
|||
def _redo(self):
|
||||
self._table.redo()
|
||||
|
||||
def edit(self):
|
||||
rows = self.index_selected_rows()
|
||||
for row in rows:
|
||||
data = self._outputkp_lst.get(row)
|
||||
|
||||
if self.sub_window_exists(
|
||||
BasicHydraulicStructuresWindow,
|
||||
data=[self._study, None, data]
|
||||
):
|
||||
continue
|
||||
|
||||
win = BasicHydraulicStructuresWindow(
|
||||
data=data,
|
||||
study=self._study,
|
||||
parent=self
|
||||
)
|
||||
win.show()
|
||||
|
||||
def _set_checkbox_state(self):
|
||||
row = self.index_selected_row()
|
||||
if row is None:
|
||||
|
|
@ -218,7 +195,7 @@ class OutputKpAdisTSWindow(PamhyrWindow):
|
|||
self._checkbox.setEnabled(True)
|
||||
self._checkbox.setChecked(self._outputkp_lst.get(row).enabled)
|
||||
|
||||
def _set_structure_state(self):
|
||||
def _set_outputkp_state(self):
|
||||
rows = self.index_selected_rows()
|
||||
if len(rows) != 0:
|
||||
for row in rows:
|
||||
|
|
|
|||
|
|
@ -95,7 +95,6 @@
|
|||
</attribute>
|
||||
<addaction name="action_add"/>
|
||||
<addaction name="action_delete"/>
|
||||
<addaction name="action_edit"/>
|
||||
</widget>
|
||||
<action name="action_add">
|
||||
<property name="icon">
|
||||
|
|
@ -121,18 +120,6 @@
|
|||
<string>Delete points</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_edit">
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>ressources/edit.png</normaloff>ressources/edit.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Edit</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Edit selected hydraulic structure</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in New Issue