mirror of https://gitlab.com/pamhyr/pamhyr2
BC AdisTS Complete
parent
b927aa81b3
commit
704130966e
|
|
@ -105,7 +105,7 @@ class BoundaryConditionAdisTS(SQLSubModel):
|
|||
|
||||
bc.node = None
|
||||
if row[3] != -1:
|
||||
bc.node = next(filter(lambda n: n.id == row[3], data["nodes"]))
|
||||
bc.node = next(filter(lambda n: n.id == row[3], data["nodes"])).id
|
||||
|
||||
values = execute(
|
||||
"SELECT data0, data1 FROM boundary_condition_data_adists " +
|
||||
|
|
@ -114,8 +114,8 @@ class BoundaryConditionAdisTS(SQLSubModel):
|
|||
|
||||
# Write data
|
||||
for v in values:
|
||||
data0 = bc._types[0](v[1])
|
||||
data1 = bc._types[1](v[2])
|
||||
data0 = bc._types[0](v[0])
|
||||
data1 = bc._types[1](v[1])
|
||||
# Replace data at pos ind
|
||||
bc._data.append((data0, data1))
|
||||
|
||||
|
|
@ -124,20 +124,19 @@ class BoundaryConditionAdisTS(SQLSubModel):
|
|||
return new
|
||||
|
||||
def _db_save(self, execute, data=None):
|
||||
pollutant_id = data["pollutant_id"]
|
||||
|
||||
execute(f"DELETE FROM boundary_condition_adists WHERE id = {self.id}")
|
||||
execute(f"DELETE FROM boundary_condition_data_adists WHERE bc = {self.id}")
|
||||
|
||||
node = -1
|
||||
if self._node is not None:
|
||||
node = self._node.id
|
||||
node = self._node
|
||||
|
||||
sql = (
|
||||
"INSERT INTO " +
|
||||
"boundary_condition_adists(id, pollutant, type, node) " +
|
||||
"VALUES (" +
|
||||
f"{self.id}, {pollutant_id}, " +
|
||||
f"{self.id}, {self._pollutant}, " +
|
||||
f"'{self._db_format(self._type)}', {node}" +
|
||||
")"
|
||||
)
|
||||
|
|
@ -188,6 +187,11 @@ class BoundaryConditionAdisTS(SQLSubModel):
|
|||
def header(self):
|
||||
return self._header.copy()
|
||||
|
||||
@header.setter
|
||||
def header(self, header):
|
||||
self._header = header
|
||||
self._status.modified()
|
||||
|
||||
@property
|
||||
def pollutant(self):
|
||||
return self._pollutant
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ class BoundaryConditionsAdisTSList(PamhyrModelList):
|
|||
|
||||
def _db_save(self, execute, data=None):
|
||||
execute("DELETE FROM boundary_condition_adists")
|
||||
execute("DELETE FROM boundary_condition_data_adists")
|
||||
|
||||
if data is None:
|
||||
data = {}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ class Plot(PamhyrPlot):
|
|||
self._table_headers = self._trad.get_dict("table_headers")
|
||||
|
||||
header = self.data.header
|
||||
|
||||
self.label_x = self._table_headers[header[0]]
|
||||
self.label_y = self._table_headers[header[1]]
|
||||
|
||||
|
|
|
|||
|
|
@ -40,14 +40,8 @@ from PyQt5.QtWidgets import (
|
|||
QTimeEdit, QDateTimeEdit, QItemDelegate,
|
||||
)
|
||||
|
||||
from Model.BoundaryCondition.BoundaryConditionTypes import (
|
||||
NotDefined, PonctualContribution,
|
||||
TimeOverZ, TimeOverDischarge, ZOverDischarge
|
||||
)
|
||||
|
||||
from View.BoundaryCondition.Edit.UndoCommand import (
|
||||
SetDataCommand, AddCommand, DelCommand,
|
||||
SortCommand, MoveCommand, PasteCommand,
|
||||
from View.BoundaryConditionsAdisTS.Edit.UndoCommand import (
|
||||
AddCommand, DelCommand, SetDataCommand,
|
||||
)
|
||||
|
||||
_translate = QCoreApplication.translate
|
||||
|
|
@ -69,8 +63,8 @@ class TableModel(PamhyrTableModel):
|
|||
value = QVariant()
|
||||
|
||||
if 0 <= column < 2:
|
||||
v = self._data.get_i(row)[column]
|
||||
if self._data.get_type_column(column) == float:
|
||||
v = self._data._data[row][column]
|
||||
if self._data._types[column] == float:
|
||||
value = f"{v:.4f}"
|
||||
elif self._data.header[column] == "time":
|
||||
if self._opt_data == "time":
|
||||
|
|
@ -125,69 +119,3 @@ class TableModel(PamhyrTableModel):
|
|||
|
||||
self.endRemoveRows()
|
||||
|
||||
def sort(self, _reverse, parent=QModelIndex()):
|
||||
self.layoutAboutToBeChanged.emit()
|
||||
|
||||
self._undo.push(
|
||||
SortCommand(
|
||||
self._data, _reverse
|
||||
)
|
||||
)
|
||||
|
||||
self.layoutAboutToBeChanged.emit()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def move_up(self, row, parent=QModelIndex()):
|
||||
if row <= 0:
|
||||
return
|
||||
|
||||
target = row + 2
|
||||
|
||||
self.beginMoveRows(parent, row - 1, row - 1, parent, target)
|
||||
|
||||
self._undo_stack.push(
|
||||
MoveCommand(
|
||||
self._data, "up", row
|
||||
)
|
||||
)
|
||||
|
||||
self.endMoveRows()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def move_down(self, index, parent=QModelIndex()):
|
||||
if row > len(self._data):
|
||||
return
|
||||
|
||||
target = row
|
||||
|
||||
self.beginMoveRows(parent, row + 1, row + 1, parent, target)
|
||||
|
||||
self._undo_stack.push(
|
||||
MoveCommand(
|
||||
self._data, "down", row
|
||||
)
|
||||
)
|
||||
|
||||
self.endMoveRows()
|
||||
self.layoutChanged.emit()
|
||||
|
||||
def paste(self, row, header, data):
|
||||
if len(data) == 0:
|
||||
return
|
||||
|
||||
self.layoutAboutToBeChanged.emit()
|
||||
|
||||
self._undo.push(
|
||||
PasteCommand(
|
||||
self._data, row,
|
||||
list(
|
||||
map(
|
||||
lambda d: self._data.new_from_data(header, d),
|
||||
data
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
self.layoutAboutToBeChanged.emit()
|
||||
self.layoutChanged.emit()
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ from PyQt5.QtWidgets import (
|
|||
QMessageBox, QUndoCommand, QUndoStack,
|
||||
)
|
||||
|
||||
from Model.BoundaryCondition.BoundaryCondition import BoundaryCondition
|
||||
from Model.BoundaryConditionsAdisTS.BoundaryConditionAdisTS import BoundaryConditionAdisTS
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
|
@ -37,42 +37,21 @@ class SetDataCommand(QUndoCommand):
|
|||
self._data = data
|
||||
self._index = index
|
||||
self._column = column
|
||||
self._old = self._data.get_i(self._index)[self._column]
|
||||
_type = self._data.get_type_column(self._column)
|
||||
self._old = self._data._data[self._index][self._column]
|
||||
_type = self._data._types[self._column]
|
||||
self._new = _type(new_value)
|
||||
|
||||
def undo(self):
|
||||
self._data._set_i_c_v(self._index, self._column, self._old)
|
||||
if self._column == 0:
|
||||
self._data._data[self._index] = (self._old,self._data._data[self._index][1])
|
||||
else:
|
||||
self._data._data[self._index] = (self._data._data[self._index][1], self._old)
|
||||
|
||||
def redo(self):
|
||||
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
|
||||
if self._column == "d50":
|
||||
self._old = self._data.d50
|
||||
elif self._column == "sigma":
|
||||
self._old = self._data.sigma
|
||||
|
||||
self._new = float(new_value)
|
||||
|
||||
def undo(self):
|
||||
if self._column == "d50":
|
||||
self._data.d50 = self._old
|
||||
elif self._column == "sigma":
|
||||
self._data.sigma = self._old
|
||||
|
||||
def redo(self):
|
||||
if self._column == "d50":
|
||||
self._data.d50 = self._new
|
||||
elif self._column == "sigma":
|
||||
self._data.sigma = self._new
|
||||
|
||||
if self._column == 0:
|
||||
self._data._data[self._index] = (self._new,self._data._data[self._index][1])
|
||||
else:
|
||||
self._data._data[self._index] = (self._data._data[self._index][1], self._new)
|
||||
|
||||
class AddCommand(QUndoCommand):
|
||||
def __init__(self, data, index):
|
||||
|
|
@ -83,14 +62,13 @@ class AddCommand(QUndoCommand):
|
|||
self._new = None
|
||||
|
||||
def undo(self):
|
||||
self._data.delete_i([self._index])
|
||||
del self._data._data[self._index]
|
||||
|
||||
def redo(self):
|
||||
if self._new is None:
|
||||
self._new = self._data.add(self._index)
|
||||
self._new = self._data._data.insert(self._index, (self._data._types[0](0), self._data._types[1](0.0)))
|
||||
else:
|
||||
self._data.insert(self._index, self._new)
|
||||
|
||||
self._data._data.insert(self._index, self._new)
|
||||
|
||||
class DelCommand(QUndoCommand):
|
||||
def __init__(self, data, rows):
|
||||
|
|
@ -101,7 +79,7 @@ class DelCommand(QUndoCommand):
|
|||
|
||||
self._bc = []
|
||||
for row in rows:
|
||||
self._bc.append((row, self._data.get_i(row)))
|
||||
self._bc.append((row, self._data._data[row]))
|
||||
self._bc.sort()
|
||||
|
||||
def undo(self):
|
||||
|
|
@ -109,75 +87,9 @@ class DelCommand(QUndoCommand):
|
|||
self._data.insert(row, el)
|
||||
|
||||
def redo(self):
|
||||
self._data.delete_i(self._rows)
|
||||
for row in self._rows:
|
||||
del self._data._data[row]
|
||||
|
||||
|
||||
class SortCommand(QUndoCommand):
|
||||
def __init__(self, data, _reverse):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._data = data
|
||||
self._reverse = _reverse
|
||||
|
||||
self._old = self._data.data
|
||||
self._indexes = None
|
||||
|
||||
def undo(self):
|
||||
ll = self._data.data
|
||||
self._data.sort(
|
||||
key=lambda x: self._indexes[ll.index(x)]
|
||||
)
|
||||
|
||||
def redo(self):
|
||||
self._data.sort(
|
||||
_reverse=self._reverse,
|
||||
key=lambda x: x[0]
|
||||
)
|
||||
if self._indexes is None:
|
||||
self._indexes = list(
|
||||
map(
|
||||
lambda p: self._old.index(p),
|
||||
self._data.data
|
||||
)
|
||||
)
|
||||
self._old = None
|
||||
|
||||
|
||||
class MoveCommand(QUndoCommand):
|
||||
def __init__(self, data, up, i):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._data = data
|
||||
self._up = up == "up"
|
||||
self._i = i
|
||||
|
||||
def undo(self):
|
||||
if self._up:
|
||||
self._data.move_up(self._i)
|
||||
else:
|
||||
self._data.move_down(self._i)
|
||||
|
||||
def redo(self):
|
||||
if self._up:
|
||||
self._data.move_up(self._i)
|
||||
else:
|
||||
self._data.move_down(self._i)
|
||||
|
||||
|
||||
class PasteCommand(QUndoCommand):
|
||||
def __init__(self, data, row, bcs):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._data = data
|
||||
self._row = row
|
||||
self._bcs = bcs
|
||||
self._bcs.reverse()
|
||||
|
||||
def undo(self):
|
||||
self._data.delete_i(
|
||||
range(self._row, self._row + len(self._bcs))
|
||||
)
|
||||
|
||||
def redo(self):
|
||||
for bc in self._bcs:
|
||||
self._data.insert(self._row, bc)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Window.py -- Pamhyr
|
||||
# Window.py -- Pamhyr
|
||||
# Copyright (C) 2023-2024 INRAE
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
|
|
@ -44,76 +44,23 @@ from PyQt5.QtWidgets import (
|
|||
from View.Tools.Plot.PamhyrCanvas import MplCanvas
|
||||
from View.Tools.Plot.PamhyrToolbar import PamhyrPlotToolbar
|
||||
|
||||
from View.BoundaryCondition.Edit.translate import BCETranslate
|
||||
from View.BoundaryCondition.Edit.UndoCommand import SetMetaDataCommand
|
||||
from View.BoundaryCondition.Edit.Table import TableModel
|
||||
from View.BoundaryCondition.Edit.Plot import Plot
|
||||
from View.BoundaryConditionsAdisTS.Edit.translate import BCETranslate
|
||||
from View.BoundaryConditionsAdisTS.Edit.Table import TableModel
|
||||
from View.BoundaryConditionsAdisTS.Edit.Plot import Plot
|
||||
|
||||
_translate = QCoreApplication.translate
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
||||
class WD50Sigma(PamhyrWidget):
|
||||
_pamhyr_ui = "d50sigma"
|
||||
|
||||
d50Changed = pyqtSignal(float)
|
||||
sigmaChanged = pyqtSignal(float)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super(WD50Sigma, self).__init__(
|
||||
parent=parent
|
||||
)
|
||||
|
||||
self.spinBox_d50 = self.find(QDoubleSpinBox, "doubleSpinBox_d50")
|
||||
self.spinBox_sigma = self.find(QDoubleSpinBox, "doubleSpinBox_sigma")
|
||||
|
||||
self.spinBox_d50.valueChanged.connect(self.valueChangedD50)
|
||||
self.spinBox_sigma.valueChanged.connect(self.valueChangedSigma)
|
||||
|
||||
def set_d50(self, d50):
|
||||
self.spinBox_d50.valueChanged.disconnect(self.valueChangedD50)
|
||||
self.spinBox_d50.setValue(float(d50))
|
||||
self.spinBox_d50.valueChanged.connect(self.valueChangedD50)
|
||||
|
||||
def get_d50(self):
|
||||
return float(self.spinBox_d50.value())
|
||||
|
||||
def set_sigma(self, sigma):
|
||||
self.spinBox_sigma.valueChanged.disconnect(self.valueChangedSigma)
|
||||
self.spinBox_sigma.setValue(float(sigma))
|
||||
self.spinBox_sigma.valueChanged.connect(self.valueChangedSigma)
|
||||
|
||||
def get_sigma(self):
|
||||
return float(self.spinBox_sigma.value())
|
||||
|
||||
@QtCore.pyqtSlot(float)
|
||||
def valueChangedD50(self, value):
|
||||
self.d50Changed.emit(value)
|
||||
|
||||
@QtCore.pyqtSlot(float)
|
||||
def valueChangedSigma(self, value):
|
||||
self.sigmaChanged.emit(value)
|
||||
|
||||
|
||||
class EditBoundaryConditionWindow(PamhyrWindow):
|
||||
_pamhyr_ui = "EditBoundaryConditions"
|
||||
_pamhyr_name = "Edit Boundary Conditions"
|
||||
_pamhyr_ui = "EditBoundaryConditionsAdisTS"
|
||||
_pamhyr_name = "Edit Boundary Conditions AdisTS"
|
||||
|
||||
def __init__(self, data=None, study=None, config=None, parent=None):
|
||||
self._data = data
|
||||
trad = BCETranslate()
|
||||
self._long_types = trad.get_dict("long_types")
|
||||
|
||||
name = trad[self._pamhyr_name]
|
||||
if self._data is not None:
|
||||
node_name = (self._data.node.name if self._data.node is not None
|
||||
else trad['not_associated'])
|
||||
name += (
|
||||
f" - {study.name} " +
|
||||
f" - {self._data.name} ({self._data.id}) " +
|
||||
f"({self._long_types[self._data.bctype]} - {node_name})"
|
||||
)
|
||||
|
||||
super(EditBoundaryConditionWindow, self).__init__(
|
||||
title=name,
|
||||
|
|
@ -123,25 +70,26 @@ class EditBoundaryConditionWindow(PamhyrWindow):
|
|||
parent=parent
|
||||
)
|
||||
|
||||
if self._data is not None:
|
||||
n = self._data.node
|
||||
node_name = next(filter(lambda x: x.id == n, self._study.river._nodes)).name
|
||||
name += (
|
||||
f" - {study.name} " +
|
||||
f"({node_name})"
|
||||
)
|
||||
|
||||
self._hash_data.append(data)
|
||||
|
||||
self.setup_table()
|
||||
self.setup_plot()
|
||||
self.setup_data()
|
||||
self.setup_connections()
|
||||
|
||||
def setup_data(self):
|
||||
self._is_solid = self._data.bctype == "SL"
|
||||
|
||||
if self._is_solid:
|
||||
layout = self.find(QVBoxLayout, "verticalLayout_table")
|
||||
self._d50sigma = WD50Sigma(parent=self)
|
||||
layout.addWidget(self._d50sigma)
|
||||
|
||||
self._d50sigma.set_d50(self._data.d50)
|
||||
self._d50sigma.set_sigma(self._data.sigma)
|
||||
|
||||
def setup_table(self):
|
||||
if self._data.type == "Concentration":
|
||||
self._data.header = ["time", "concentration"]
|
||||
else:
|
||||
self._data.header = ["time", "rate"]
|
||||
|
||||
headers = {}
|
||||
table_headers = self._trad.get_dict("table_headers")
|
||||
for h in self._data.header:
|
||||
|
|
@ -192,35 +140,9 @@ class EditBoundaryConditionWindow(PamhyrWindow):
|
|||
def setup_connections(self):
|
||||
self.find(QAction, "action_add").triggered.connect(self.add)
|
||||
self.find(QAction, "action_del").triggered.connect(self.delete)
|
||||
self.find(QAction, "action_sort").triggered.connect(self.sort)
|
||||
|
||||
self._table.dataChanged.connect(self.update)
|
||||
|
||||
if self._is_solid:
|
||||
self._d50sigma.d50Changed.connect(self.d50_changed)
|
||||
self._d50sigma.sigmaChanged.connect(self.sigma_changed)
|
||||
|
||||
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 update(self):
|
||||
self.plot.update()
|
||||
|
||||
|
|
@ -263,16 +185,6 @@ class EditBoundaryConditionWindow(PamhyrWindow):
|
|||
self._table.sort(False)
|
||||
self.plot.update()
|
||||
|
||||
def move_up(self):
|
||||
row = self.index_selected_row()
|
||||
self._table.move_up(row)
|
||||
self.plot.update()
|
||||
|
||||
def move_down(self):
|
||||
row = self.index_selected_row()
|
||||
self._table.move_down(row)
|
||||
self.plot.update()
|
||||
|
||||
def _copy(self):
|
||||
rows = self.index_selected_rows()
|
||||
|
||||
|
|
@ -285,28 +197,10 @@ class EditBoundaryConditionWindow(PamhyrWindow):
|
|||
|
||||
self.copyTableIntoClipboard(table)
|
||||
|
||||
def _paste(self):
|
||||
header, data = self.parseClipboardTable()
|
||||
|
||||
logger.debug(f"paste: h:{header}, d:{data}")
|
||||
|
||||
if len(data) == 0:
|
||||
return
|
||||
|
||||
row = 0
|
||||
rows = self.index_selected_rows()
|
||||
if len(rows) != 0:
|
||||
row = rows[0]
|
||||
|
||||
self._table.paste(row, header, data)
|
||||
self.plot.update()
|
||||
|
||||
def _undo(self):
|
||||
self._table.undo()
|
||||
self.plot.update()
|
||||
self.widget_update()
|
||||
|
||||
def _redo(self):
|
||||
self._table.redo()
|
||||
self.plot.update()
|
||||
self.widget_update()
|
||||
|
|
|
|||
|
|
@ -29,16 +29,13 @@ class BCETranslate(BCTranslate):
|
|||
def __init__(self):
|
||||
super(BCETranslate, self).__init__()
|
||||
|
||||
self._dict["Edit Boundary Conditions"] = _translate(
|
||||
"BoundaryCondition", "Edit boundary conditions"
|
||||
self._dict["Edit Boundary Conditions AdisTS"] = _translate(
|
||||
"BoundaryConditionAdisTS", "Edit boundary conditions AdisTS"
|
||||
)
|
||||
|
||||
self._sub_dict["table_headers"] = {
|
||||
"x": _translate("BoundaryCondition", "X"),
|
||||
"y": _translate("BoundaryCondition", "Y"),
|
||||
"time": self._dict["time"],
|
||||
"date": self._dict["date"],
|
||||
"discharge": self._dict["unit_discharge"],
|
||||
"z": self._dict["unit_elevation"],
|
||||
"solid": _translate("BoundaryCondition", "Solid (kg/s)"),
|
||||
"rate": _translate("BoundaryConditionAdisTS", "Rate"),
|
||||
"concentration": _translate("BoundaryConditionAdisTS", "Concentration"),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,8 +43,7 @@ from View.Tools.PamhyrTable import PamhyrTableModel
|
|||
|
||||
from View.BoundaryConditionsAdisTS.UndoCommand import (
|
||||
SetNodeCommand, SetTypeCommand,
|
||||
AddCommand, DelCommand, SortCommand,
|
||||
MoveCommand, PasteCommand,
|
||||
AddCommand, DelCommand,
|
||||
)
|
||||
from View.BoundaryCondition.translate import BC_types
|
||||
|
||||
|
|
@ -111,7 +110,6 @@ class TableModel(PamhyrTableModel):
|
|||
self._trad = trad
|
||||
self._bc_list = bc_list
|
||||
self._pollutant = pollutant
|
||||
print("pollutant : ", self._pollutant)
|
||||
|
||||
super(TableModel, self).__init__(trad=trad, **kwargs)
|
||||
|
||||
|
|
@ -135,17 +133,15 @@ class TableModel(PamhyrTableModel):
|
|||
column = index.column()
|
||||
|
||||
if self._headers[column] == "type":
|
||||
#n = self._lst[row].type
|
||||
n = data[row].type
|
||||
if n is None or n == "":
|
||||
return self._trad["not_associated"]
|
||||
return n
|
||||
elif self._headers[column] == "node":
|
||||
#n = self._lst[row].node
|
||||
n = data[row].node
|
||||
if n is None:
|
||||
return self._trad["not_associated"]
|
||||
return n
|
||||
return next(filter(lambda x: x.id == n, self._data._nodes)).name
|
||||
|
||||
return QVariant()
|
||||
|
||||
|
|
@ -169,6 +165,7 @@ class TableModel(PamhyrTableModel):
|
|||
self._lst, row, self._data.node(value)
|
||||
)
|
||||
)
|
||||
print(value, self._data.node(value).id)
|
||||
except Exception as e:
|
||||
logger.info(e)
|
||||
logger.debug(traceback.format_exc())
|
||||
|
|
|
|||
|
|
@ -56,7 +56,6 @@ class SetTypeCommand(QUndoCommand):
|
|||
|
||||
def redo(self):
|
||||
self._bcs[self._index].type = self._new
|
||||
print("type : ", self._old, self._new, self._bcs[self._index].type)
|
||||
|
||||
class AddCommand(QUndoCommand):
|
||||
def __init__(self, pollutant, bcs_list, bcs, index):
|
||||
|
|
@ -74,106 +73,27 @@ class AddCommand(QUndoCommand):
|
|||
def redo(self):
|
||||
if self._new is None:
|
||||
self._new = self._bc_list.new(self._index, self._pollutant)
|
||||
print(self._new.pollutant)
|
||||
print(len(self._bc_list))
|
||||
print(len(self._bcs))
|
||||
else:
|
||||
self._bcs.insert(self._index, self._new)
|
||||
|
||||
|
||||
class DelCommand(QUndoCommand):
|
||||
def __init__(self, bcs, tab, rows):
|
||||
def __init__(self, bcs, rows):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._bcs = bcs
|
||||
self._tab = tab
|
||||
self._rows = rows
|
||||
|
||||
self._bc = []
|
||||
for row in rows:
|
||||
self._bc.append((row, self._bcs.get(self._tab, row)))
|
||||
self._bc.append((row, self._bcs[row]))
|
||||
self._bc.sort()
|
||||
|
||||
def undo(self):
|
||||
for row, el in self._bc:
|
||||
self._bcs.insert(self._tab, row, el)
|
||||
self._bcs.insert(row, el)
|
||||
|
||||
def redo(self):
|
||||
self._bcs.delete_i(self._tab, self._rows)
|
||||
for row in self._rows:
|
||||
del self._bcs[row]
|
||||
|
||||
|
||||
class SortCommand(QUndoCommand):
|
||||
def __init__(self, bcs, tab, _reverse):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._bcs = bcs
|
||||
self._tab = tab
|
||||
self._reverse = _reverse
|
||||
|
||||
self._old = self._bcs.get_tab(self._tab)
|
||||
self._indexes = None
|
||||
|
||||
def undo(self):
|
||||
ll = self._bcs.get_tab(self._tab)
|
||||
self._bcs.sort(
|
||||
self._tab,
|
||||
key=lambda x: self._indexes[ll.index(x)]
|
||||
)
|
||||
|
||||
def redo(self):
|
||||
self._bcs.sort(
|
||||
self._tab,
|
||||
reverse=self._reverse,
|
||||
key=lambda x: x.name
|
||||
)
|
||||
if self._indexes is None:
|
||||
self._indexes = list(
|
||||
map(
|
||||
lambda p: self._old.index(p),
|
||||
self._bcs.get_tab(self._tab)
|
||||
)
|
||||
)
|
||||
self._old = None
|
||||
|
||||
|
||||
class MoveCommand(QUndoCommand):
|
||||
def __init__(self, bcs, tab, up, i):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._bcs = bcs
|
||||
self._tab = tab
|
||||
self._up = up == "up"
|
||||
self._i = i
|
||||
|
||||
def undo(self):
|
||||
if self._up:
|
||||
self._bcs.move_up(self._tab, self._i)
|
||||
else:
|
||||
self._bcs.move_down(self._tab, self._i)
|
||||
|
||||
def redo(self):
|
||||
if self._up:
|
||||
self._bcs.move_up(self._tab, self._i)
|
||||
else:
|
||||
self._bcs.move_down(self._tab, self._i)
|
||||
|
||||
|
||||
class PasteCommand(QUndoCommand):
|
||||
def __init__(self, bcs, tab, row, bc):
|
||||
QUndoCommand.__init__(self)
|
||||
|
||||
self._bcs = bcs
|
||||
self._tab = tab
|
||||
self._row = row
|
||||
self._bc = deepcopy(bc)
|
||||
self._bc.reverse()
|
||||
|
||||
def undo(self):
|
||||
self._bcs.delete_i(
|
||||
self._tab,
|
||||
range(self._row, self._row + len(self._bc))
|
||||
)
|
||||
|
||||
def redo(self):
|
||||
for bc in self._bc:
|
||||
self._bcs.insert(self._tab, self._row, bc)
|
||||
|
|
|
|||
|
|
@ -40,17 +40,6 @@ from PyQt5.QtWidgets import (
|
|||
QWidget,
|
||||
)
|
||||
|
||||
from Model.BoundaryCondition.BoundaryConditionTypes import (
|
||||
NotDefined, PonctualContribution,
|
||||
TimeOverZ, TimeOverDischarge, ZOverDischarge
|
||||
)
|
||||
|
||||
from View.BoundaryCondition.UndoCommand import (
|
||||
SetNameCommand, SetNodeCommand, SetTypeCommand,
|
||||
AddCommand, DelCommand, SortCommand,
|
||||
MoveCommand, PasteCommand,
|
||||
)
|
||||
|
||||
from View.BoundaryConditionsAdisTS.Table import (
|
||||
TableModel, ComboBoxDelegate
|
||||
)
|
||||
|
|
@ -119,7 +108,8 @@ class BoundaryConditionAdisTSWindow(PamhyrWindow):
|
|||
trad=self._trad,
|
||||
bc_list = self._study.river.boundary_conditions_adists,
|
||||
undo=self._undo_stack,
|
||||
pollutant=self._pollutant
|
||||
pollutant=self._pollutant,
|
||||
data=self._study.river
|
||||
)
|
||||
table.setModel(self._table)
|
||||
table.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||
|
|
@ -140,7 +130,6 @@ class BoundaryConditionAdisTSWindow(PamhyrWindow):
|
|||
self.find(QAction, "action_add").triggered.connect(self.add)
|
||||
self.find(QAction, "action_del").triggered.connect(self.delete)
|
||||
self.find(QAction, "action_edit").triggered.connect(self.edit)
|
||||
self.find(QAction, "action_sort").triggered.connect(self.sort)
|
||||
|
||||
def index_selected_row(self):
|
||||
tab = "liquid"
|
||||
|
|
@ -169,27 +158,12 @@ class BoundaryConditionAdisTSWindow(PamhyrWindow):
|
|||
self._table.add(rows[0])
|
||||
|
||||
def delete(self):
|
||||
tab = "liquid"
|
||||
rows = self.index_selected_rows()
|
||||
if len(rows) == 0:
|
||||
return
|
||||
|
||||
self._table.delete(rows)
|
||||
|
||||
def sort(self):
|
||||
tab = "liquid"
|
||||
self._table.sort(False)
|
||||
|
||||
def move_up(self):
|
||||
tab = "liquid"
|
||||
row = self.index_selected_row()
|
||||
self._table.move_up(row)
|
||||
|
||||
def move_down(self):
|
||||
tab = "liquid"
|
||||
row = self.index_selected_row()
|
||||
self._table.move_down(row)
|
||||
|
||||
def _copy(self):
|
||||
logger.info("TODO: copy")
|
||||
|
||||
|
|
@ -197,18 +171,15 @@ class BoundaryConditionAdisTSWindow(PamhyrWindow):
|
|||
logger.info("TODO: paste")
|
||||
|
||||
def _undo(self):
|
||||
tab = "liquid"
|
||||
self._table.undo()
|
||||
|
||||
def _redo(self):
|
||||
tab = "liquid"
|
||||
self._table.redo()
|
||||
|
||||
def edit(self):
|
||||
tab = "liquid"
|
||||
rows = self.index_selected_rows()
|
||||
for row in rows:
|
||||
data = self._bcs.get(tab, row)
|
||||
data = self._bcs.lst[row]
|
||||
|
||||
if self.sub_window_exists(
|
||||
EditBoundaryConditionWindow,
|
||||
|
|
|
|||
|
|
@ -23,29 +23,25 @@
|
|||
<locale language="English" country="Europe"/>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>20</x>
|
||||
<y>10</y>
|
||||
<width>811</width>
|
||||
<height>421</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="verticalLayoutWidget_2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QTableView" name="tableView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout"/>
|
||||
</widget>
|
||||
</widget>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="verticalLayoutWidget_2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QTableView" name="tableView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout"/>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
|
|
@ -70,7 +66,6 @@
|
|||
<addaction name="action_add"/>
|
||||
<addaction name="action_del"/>
|
||||
<addaction name="action_edit"/>
|
||||
<addaction name="action_sort"/>
|
||||
</widget>
|
||||
<action name="action_add">
|
||||
<property name="checkable">
|
||||
|
|
@ -120,18 +115,6 @@
|
|||
<string>Ctrl+E</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_sort">
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>ressources/sort_A-Z.png</normaloff>ressources/sort_A-Z.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Sort</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Sort boundary condition by name</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,112 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>450</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<property name="locale">
|
||||
<locale language="English" country="Europe"/>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="verticalLayoutWidget_2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_table">
|
||||
<item>
|
||||
<widget class="QTableView" name="tableView">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>200</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout"/>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="windowTitle">
|
||||
<string>toolBar</string>
|
||||
</property>
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<addaction name="action_add"/>
|
||||
<addaction name="action_del"/>
|
||||
</widget>
|
||||
<action name="action_add">
|
||||
<property name="checkable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>ressources/add.png</normaloff>ressources/add.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Add a new point in boundary condition or punctual contribution</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+N</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_del">
|
||||
<property name="icon">
|
||||
<iconset>
|
||||
<normaloff>ressources/del.png</normaloff>ressources/del.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Delete</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Delete current selected rows</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+D</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
Binary file not shown.
Loading…
Reference in New Issue