Friction: Rename 'Section' to 'Friction'.

results
Pierre-Antoine Rouby 2023-07-17 11:03:56 +02:00
parent 1d3cf8bd94
commit 956a0714a2
16 changed files with 362 additions and 348 deletions

View File

@ -29,7 +29,6 @@ class SQLModel(SQL):
self._create() # Create db self._create() # Create db
# self._save() # Save # self._save() # Save
else: else:
logger.info("Update database")
self._update() # Update db scheme if necessary self._update() # Update db scheme if necessary
# self._load() # Load data # self._load() # Load data

View File

@ -4,9 +4,9 @@ from tools import trace, timer
from Model.DB import SQLSubModel from Model.DB import SQLSubModel
class Section(SQLSubModel): class Friction(SQLSubModel):
def __init__(self, name:str = "", status = None): def __init__(self, name:str = "", status = None):
super(Section, self).__init__() super(Friction, self).__init__()
self._status = status self._status = status
@ -20,7 +20,7 @@ class Section(SQLSubModel):
@classmethod @classmethod
def _sql_create(cls, execute): def _sql_create(cls, execute):
execute(""" execute("""
CREATE TABLE section( CREATE TABLE friction(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
ind INTERGER NOT NULL, ind INTERGER NOT NULL,
begin_kp REAL NOT NULL, begin_kp REAL NOT NULL,
@ -49,7 +49,7 @@ class Section(SQLSubModel):
table = execute( table = execute(
"SELECT ind, begin_kp, end_kp, begin_strickler, end_strickler " + "SELECT ind, begin_kp, end_kp, begin_strickler, end_strickler " +
f"FROM section WHERE reach = {reach.id}" f"FROM friction WHERE reach = {reach.id}"
) )
for _ in table: for _ in table:
@ -61,7 +61,7 @@ class Section(SQLSubModel):
bs = next(filter(lambda s: s.id == row[3], stricklers)) bs = next(filter(lambda s: s.id == row[3], stricklers))
es = next(filter(lambda s: s.id == row[4], stricklers)) es = next(filter(lambda s: s.id == row[4], stricklers))
# Create section # Create friction
sec = cls(status = status) sec = cls(status = status)
sec.edge = reach sec.edge = reach
sec.begin_kp = row[1] sec.begin_kp = row[1]
@ -77,7 +77,7 @@ class Section(SQLSubModel):
ind = data["ind"] ind = data["ind"]
execute( execute(
"INSERT INTO " + "INSERT INTO " +
"section(ind, begin_kp, end_kp, reach, begin_strickler, end_strickler) " + "friction(ind, begin_kp, end_kp, reach, begin_strickler, end_strickler) " +
"VALUES (" + "VALUES (" +
f"{ind}, {self._begin_kp}, {self._end_kp}, " + f"{ind}, {self._begin_kp}, {self._end_kp}, " +
f"{self._edge.id}, " + f"{self._edge.id}, " +

View File

@ -1,35 +1,47 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import logging
from copy import copy from copy import copy
from tools import trace, timer from tools import trace, timer
from Model.DB import SQLSubModel from Model.DB import SQLSubModel
from Model.Section.Section import Section from Model.Friction.Friction import Friction
class SectionList(SQLSubModel): logger = logging.getLogger()
class FrictionList(SQLSubModel):
_sub_classes = [ _sub_classes = [
Section Friction
] ]
def __init__(self, status = None): def __init__(self, status = None):
super(SectionList, self).__init__() super(FrictionList, self).__init__()
self._status = status self._status = status
self._sections = [] self._frictions = []
@classmethod @classmethod
def _sql_create(cls, execute): def _sql_create(cls, execute):
return cls._create_submodel(execute) return cls._create_submodel(execute)
@classmethod
def _sql_update_0_0_1(cls, execute, version):
execute("ALTER TABLE `section` RENAME TO `friction`")
@classmethod @classmethod
def _sql_update(cls, execute, version): def _sql_update(cls, execute, version):
if version == "0.0.0":
logger.info(f"Update friction TABLE from {version}")
cls._sql_update_0_0_1(execute, version)
return True return True
@classmethod @classmethod
def _sql_load(cls, execute, data = None): def _sql_load(cls, execute, data = None):
new = cls(status = data['status']) new = cls(status = data['status'])
new._sections = Section._sql_load( new._frictions = Friction._sql_load(
execute, data execute, data
) )
@ -37,67 +49,67 @@ class SectionList(SQLSubModel):
def _sql_save(self, execute, data = None): def _sql_save(self, execute, data = None):
reach = data["reach"] reach = data["reach"]
execute(f"DELETE FROM section WHERE reach = {reach.id}") execute(f"DELETE FROM friction WHERE reach = {reach.id}")
ok = True ok = True
ind = 0 ind = 0
for section in self._sections: for friction in self._frictions:
data["ind"] = ind data["ind"] = ind
ok &= section._sql_save(execute, data = data) ok &= friction._sql_save(execute, data = data)
ind += 1 ind += 1
return ok return ok
def __len__(self): def __len__(self):
return len(self._sections) return len(self._frictions)
@property @property
def sections(self): def frictions(self):
return self._sections.copy() return self._frictions.copy()
def get(self, row): def get(self, row):
return self._sections[row] return self._frictions[row]
def set(self, row, new): def set(self, row, new):
self._sections[row] = new self._frictions[row] = new
self._status.modified() self._status.modified()
def new(self, index): def new(self, index):
n = Section(status = self._status) n = Friction(status = self._status)
self._sections.insert(index, n) self._frictions.insert(index, n)
self._status.modified() self._status.modified()
return n return n
def insert(self, index, new): def insert(self, index, new):
self._sections.insert(index, new) self._frictions.insert(index, new)
self._status.modified() self._status.modified()
def delete(self, sections): def delete(self, frictions):
for section in sections: for friction in frictions:
self._sections.remove(section) self._frictions.remove(friction)
self._status.modified() self._status.modified()
def delete_i(self, indexes): def delete_i(self, indexes):
sections = list( frictions = list(
map( map(
lambda x: x[1], lambda x: x[1],
filter( filter(
lambda x: x[0] in indexes, lambda x: x[0] in indexes,
enumerate(self._sections) enumerate(self._frictions)
) )
) )
) )
self.delete(sections) self.delete(frictions)
def sort(self, reverse=False, key=None): def sort(self, reverse=False, key=None):
self._sections.sort(reverse=reverse, key=key) self._frictions.sort(reverse=reverse, key=key)
self._status.modified() self._status.modified()
def move_up(self, index): def move_up(self, index):
if index < len(self._sections): if index < len(self._frictions):
next = index - 1 next = index - 1
l = self._sections l = self._frictions
l[index], l[next] = l[next], l[index] l[index], l[next] = l[next], l[index]
self._status.modified() self._status.modified()
@ -105,6 +117,6 @@ class SectionList(SQLSubModel):
if index >= 0: if index >= 0:
prev = index + 1 prev = index + 1
l = self._sections l = self._frictions
l[index], l[prev] = l[prev], l[index] l[index], l[prev] = l[prev], l[index]
self._status.modified() self._status.modified()

View File

@ -13,7 +13,7 @@ from Model.BoundaryCondition.BoundaryConditionList import BoundaryConditionList
from Model.LateralContribution.LateralContributionList import LateralContributionList from Model.LateralContribution.LateralContributionList import LateralContributionList
from Model.InitialConditions.InitialConditionsDict import InitialConditionsDict from Model.InitialConditions.InitialConditionsDict import InitialConditionsDict
from Model.Stricklers.StricklersList import StricklersList from Model.Stricklers.StricklersList import StricklersList
from Model.Section.SectionList import SectionList from Model.Friction.FrictionList import FrictionList
from Model.SolverParameters.SolverParametersList import SolverParametersList from Model.SolverParameters.SolverParametersList import SolverParametersList
from Solver.Solvers import solver_type_list from Solver.Solvers import solver_type_list
@ -86,7 +86,7 @@ class RiverNode(Node, SQLSubModel):
class RiverReach(Edge, SQLSubModel): class RiverReach(Edge, SQLSubModel):
_sub_classes = [ _sub_classes = [
Reach, Reach,
SectionList, FrictionList,
] ]
def __init__(self, id:str, name:str, def __init__(self, id:str, name:str,
@ -100,7 +100,7 @@ class RiverReach(Edge, SQLSubModel):
) )
self._reach = Reach(status=self._status, parent=self) self._reach = Reach(status=self._status, parent=self)
self._sections = SectionList(status = self._status) self._frictions = FrictionList(status = self._status)
@classmethod @classmethod
def _sql_create(cls, execute): def _sql_create(cls, execute):
@ -121,7 +121,7 @@ class RiverReach(Edge, SQLSubModel):
@classmethod @classmethod
def _sql_update(cls, execute, version): def _sql_update(cls, execute, version):
return True return cls._update_submodel(execute, version)
@classmethod @classmethod
def _sql_load(cls, execute, data = None): def _sql_load(cls, execute, data = None):
@ -149,7 +149,7 @@ class RiverReach(Edge, SQLSubModel):
data["parent"] = new data["parent"] = new
new._reach = Reach._sql_load(execute, data) new._reach = Reach._sql_load(execute, data)
new._sections = SectionList._sql_load(execute, data) new._frictions = FrictionList._sql_load(execute, data)
reachs.append(new) reachs.append(new)
@ -172,7 +172,7 @@ class RiverReach(Edge, SQLSubModel):
data["reach"] = self data["reach"] = self
objs = [self._reach, self._sections] objs = [self._reach, self._frictions]
return self._save_submodel(execute, objs, data) return self._save_submodel(execute, objs, data)
@property @property
@ -180,8 +180,8 @@ class RiverReach(Edge, SQLSubModel):
return self._reach return self._reach
@property @property
def sections(self): def frictions(self):
return self._sections return self._frictions
class River(Graph, SQLSubModel): class River(Graph, SQLSubModel):
_sub_classes = [ _sub_classes = [
@ -286,8 +286,8 @@ class River(Graph, SQLSubModel):
return self._reach return self._reach
@property @property
def sections(self): def frictions(self):
return self._sections return self._frictions
@property @property
def boundary_condition(self): def boundary_condition(self):

View File

@ -24,7 +24,7 @@ class Study(SQLModel):
def __init__(self, filename = None, init_new = True): def __init__(self, filename = None, init_new = True):
# Metadata # Metadata
self._version = "0.0.0" self._version = "0.0.1"
self.creation_date = datetime.now() self.creation_date = datetime.now()
self.last_modification_date = datetime.now() self.last_modification_date = datetime.now()
self.last_save_date = datetime.now() self.last_save_date = datetime.now()
@ -194,7 +194,9 @@ class Study(SQLModel):
if version[0] == self._version: if version[0] == self._version:
return True return True
if self._update_submodel(version): logger.info("Update database")
if self._update_submodel(version[0]):
self.execute(f"UPDATE info SET value='{self._version}' WHERE key='version'") self.execute(f"UPDATE info SET value='{self._version}' WHERE key='version'")
return True return True

View File

@ -225,17 +225,17 @@ class Mage(AbstractSolver):
id = 1 id = 1
for edge in edges: for edge in edges:
sections = edge.sections frictions = edge.frictions
for section in sections.sections: for friction in frictions.frictions:
num = f"{id:>3}" num = f"{id:>3}"
bkp = f"{section.begin_kp:>10.3f}" bkp = f"{friction.begin_kp:>10.3f}"
ekp = f"{section.end_kp:>10.3f}" ekp = f"{friction.end_kp:>10.3f}"
# if section.begin_kp != section.end_kp: # if friction.begin_kp != friction.end_kp:
# print("TODO") # print("TODO")
strickler = section.begin_strickler strickler = friction.begin_strickler
coef_1 = f"{strickler.minor:>10.3f}" coef_1 = f"{strickler.minor:>10.3f}"
coef_2 = f"{strickler.medium:>10.3f}" coef_2 = f"{strickler.medium:>10.3f}"

View File

@ -17,8 +17,8 @@ class PlotStricklers(APlot):
toolbar=toolbar toolbar=toolbar
) )
def draw_sections(self, sections, color="r"): def draw_frictions(self, frictions, color="r"):
lst = sections lst = frictions
lst.sort(key = lambda s: s.begin_kp) lst.sort(key = lambda s: s.begin_kp)
coef = flatten( coef = flatten(
@ -71,10 +71,10 @@ class PlotStricklers(APlot):
left = min(kp), right = max(kp) left = min(kp), right = max(kp)
) )
sections = self.data.sections frictions = self.data.frictions
if len(sections) != 0: if len(frictions) != 0:
lst = sections.sections lst = frictions.frictions
self.draw_sections(lst) self.draw_frictions(lst)
# HightLight # HightLight
kp_min, kp_max = (-1, -1) kp_min, kp_max = (-1, -1)
@ -85,10 +85,10 @@ class PlotStricklers(APlot):
filter( filter(
lambda s: (s.begin_kp == kp_min and lambda s: (s.begin_kp == kp_min and
s.end_kp == kp_max), s.end_kp == kp_max),
sections.sections frictions.frictions
) )
) )
self.draw_sections(lst, color="b") self.draw_frictions(lst, color="b")
self.canvas.figure.tight_layout() self.canvas.figure.tight_layout()
self.canvas.figure.canvas.draw_idle() self.canvas.figure.canvas.draw_idle()

View File

@ -15,14 +15,14 @@ from PyQt5.QtWidgets import (
QComboBox, QComboBox,
) )
from View.Sections.UndoCommand import ( from View.Frictions.UndoCommand import (
SetNameCommand, SetBeginCommand, SetEndCommand, SetNameCommand, SetBeginCommand, SetEndCommand,
SetBeginStricklerCommand, SetEndStricklerCommand, SetBeginStricklerCommand, SetEndStricklerCommand,
AddCommand, DelCommand, SortCommand, AddCommand, DelCommand, SortCommand,
MoveCommand, PasteCommand, DuplicateCommand, MoveCommand, PasteCommand, DuplicateCommand,
) )
from View.Sections.translate import * from View.Frictions.translate import *
_translate = QCoreApplication.translate _translate = QCoreApplication.translate
@ -39,7 +39,7 @@ class ComboBoxDelegate(QItemDelegate):
if self._mode == "stricklers": if self._mode == "stricklers":
self.editor.addItems( self.editor.addItems(
[_translate("Sections", "Not defined")] + [_translate("Frictions", "Not defined")] +
list( list(
map( map(
lambda s: str(s), lambda s: str(s),
@ -79,7 +79,7 @@ class TableModel(QAbstractTableModel):
self._data = data self._data = data
self._study = study self._study = study
self._undo = undo self._undo = undo
self._sections = self._data.sections self._frictions = self._data.frictions
def flags(self, index): def flags(self, index):
options = Qt.ItemIsEnabled | Qt.ItemIsSelectable options = Qt.ItemIsEnabled | Qt.ItemIsSelectable
@ -88,7 +88,7 @@ class TableModel(QAbstractTableModel):
return options return options
def rowCount(self, parent): def rowCount(self, parent):
return len(self._sections) return len(self._frictions)
def columnCount(self, parent): def columnCount(self, parent):
return len(self._headers) return len(self._headers)
@ -101,27 +101,27 @@ class TableModel(QAbstractTableModel):
column = index.column() column = index.column()
if self._headers[column] == "name": if self._headers[column] == "name":
return self._sections.get(row).name return self._frictions.get(row).name
elif self._headers[column] == "begin_kp": elif self._headers[column] == "begin_kp":
return self._sections.get(row).begin_kp return self._frictions.get(row).begin_kp
elif self._headers[column] == "end_kp": elif self._headers[column] == "end_kp":
return self._sections.get(row).end_kp return self._frictions.get(row).end_kp
elif self._headers[column] == "begin_strickler": elif self._headers[column] == "begin_strickler":
value = self._sections.get(row).begin_strickler value = self._frictions.get(row).begin_strickler
if value == None: if value == None:
return _translate("Sections", "Not defined") return _translate("Frictions", "Not defined")
return str(value) return str(value)
elif self._headers[column] == "end_strickler": elif self._headers[column] == "end_strickler":
value = self._sections.get(row).end_strickler value = self._frictions.get(row).end_strickler
if value == None: if value == None:
return _translate("Sections", "Not defined") return _translate("Frictions", "Not defined")
return str(value) return str(value)
return QVariant() return QVariant()
def headerData(self, section, orientation, role): def headerData(self, friction, orientation, role):
if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal: if role == Qt.ItemDataRole.DisplayRole and orientation == Qt.Orientation.Horizontal:
return table_headers[self._headers[section]] return table_headers[self._headers[friction]]
return QVariant() return QVariant()
@ -135,31 +135,31 @@ class TableModel(QAbstractTableModel):
if self._headers[column] == "name": if self._headers[column] == "name":
self._undo.push( self._undo.push(
SetNameCommand( SetNameCommand(
self._sections, row, value self._frictions, row, value
) )
) )
elif self._headers[column] == "begin_kp": elif self._headers[column] == "begin_kp":
self._undo.push( self._undo.push(
SetBeginCommand( SetBeginCommand(
self._sections, row, value self._frictions, row, value
) )
) )
elif self._headers[column] == "end_kp": elif self._headers[column] == "end_kp":
self._undo.push( self._undo.push(
SetEndCommand( SetEndCommand(
self._sections, row, value self._frictions, row, value
) )
) )
elif self._headers[column] == "begin_strickler": elif self._headers[column] == "begin_strickler":
self._undo.push( self._undo.push(
SetBeginStricklerCommand( SetBeginStricklerCommand(
self._sections, row, self._study.river.strickler(value) self._frictions, row, self._study.river.strickler(value)
) )
) )
elif self._headers[column] == "end_strickler": elif self._headers[column] == "end_strickler":
self._undo.push( self._undo.push(
SetEndStricklerCommand( SetEndStricklerCommand(
self._sections, row, self._study.river.strickler(value) self._frictions, row, self._study.river.strickler(value)
) )
) )
@ -171,7 +171,7 @@ class TableModel(QAbstractTableModel):
self._undo.push( self._undo.push(
AddCommand( AddCommand(
self._sections, row, self._data self._frictions, row, self._data
) )
) )
@ -183,7 +183,7 @@ class TableModel(QAbstractTableModel):
self._undo.push( self._undo.push(
DelCommand( DelCommand(
self._sections, rows self._frictions, rows
) )
) )
@ -195,7 +195,7 @@ class TableModel(QAbstractTableModel):
self._undo.push( self._undo.push(
SortCommand( SortCommand(
self._sections, False self._frictions, False
) )
) )
@ -212,7 +212,7 @@ class TableModel(QAbstractTableModel):
self._undo_stack.push( self._undo_stack.push(
MoveCommand( MoveCommand(
self._sections, "up", row self._frictions, "up", row
) )
) )
@ -220,7 +220,7 @@ class TableModel(QAbstractTableModel):
self.layoutChanged.emit() self.layoutChanged.emit()
def move_down(self, index, parent=QModelIndex()): def move_down(self, index, parent=QModelIndex()):
if row > len(self._sections): if row > len(self._frictions):
return return
target = row target = row
@ -229,7 +229,7 @@ class TableModel(QAbstractTableModel):
self._undo_stack.push( self._undo_stack.push(
MoveCommand( MoveCommand(
self._sections, "down", row self._frictions, "down", row
) )
) )

View File

@ -0,0 +1,226 @@
# -*- coding: utf-8 -*-
from copy import deepcopy
from tools import trace, timer
from PyQt5.QtWidgets import (
QMessageBox, QUndoCommand, QUndoStack,
)
from Model.Friction.Friction import Friction
from Model.Friction.FrictionList import FrictionList
class SetNameCommand(QUndoCommand):
def __init__(self, frictions, index, new_value):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._old = self._frictions.get(self._index).name
self._new = new_value
def undo(self):
self._frictions.get(self._index).name = self._old
def redo(self):
self._frictions.get(self._index).name = self._new
class SetBeginCommand(QUndoCommand):
def __init__(self, frictions, index, new_value):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._old = self._frictions.get(self._index).begin_kp
self._new = new_value
def undo(self):
self._frictions.get(self._index).begin_kp = float(self._old)
def redo(self):
self._frictions.get(self._index).begin_kp = float(self._new)
class SetEndCommand(QUndoCommand):
def __init__(self, frictions, index, new_value):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._old = self._frictions.get(self._index).end_kp
self._new = new_value
def undo(self):
self._frictions.get(self._index).end_kp = float(self._old)
def redo(self):
self._frictions.get(self._index).end_kp = float(self._new)
class SetBeginStricklerCommand(QUndoCommand):
def __init__(self, frictions, index, new_value):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._old = self._frictions.get(self._index).begin_strickler
self._new = new_value
def undo(self):
self._frictions.get(self._index).begin_strickler = self._old
def redo(self):
self._frictions.get(self._index).begin_strickler = self._new
class SetEndStricklerCommand(QUndoCommand):
def __init__(self, frictions, index, new_value):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._old = self._frictions.get(self._index).end_strickler
self._new = new_value
def undo(self):
self._frictions.get(self._index).end_strickler = self._old
def redo(self):
self._frictions.get(self._index).end_strickler = self._new
class SetEdgeCommand(QUndoCommand):
def __init__(self, frictions, index, edge):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._old = self._frictions.get(self._index).edge
self._new = edge
def undo(self):
self._frictions.get(self._index).edge = self._old
def redo(self):
self._frictions.get(self._index).edge = self._new
class AddCommand(QUndoCommand):
def __init__(self, frictions, index, reach):
QUndoCommand.__init__(self)
self._frictions = frictions
self._index = index
self._reach = reach
self._new = None
def undo(self):
self._frictions.delete_i([self._index])
def redo(self):
if self._new is None:
self._new = self._frictions.new(self._index)
self._new.edge = self._reach
else:
self._frictions.insert(self._index, self._new)
class DelCommand(QUndoCommand):
def __init__(self, frictions, rows):
QUndoCommand.__init__(self)
self._frictions = frictions
self._rows = rows
self._friction = []
for row in rows:
self._friction.append((row, self._frictions.get(row)))
self._friction.sort()
def undo(self):
for row, el in self._friction:
self._frictions.insert(row, el)
def redo(self):
self._frictions.delete_i(self._rows)
class SortCommand(QUndoCommand):
def __init__(self, frictions, _reverse):
QUndoCommand.__init__(self)
self._frictions = frictions
self._reverse = _reverse
self._old = self._frictions.frictions
self._indexes = None
def undo(self):
ll = self._frictions.frictions
self._frictions.sort(
key=lambda x: self._indexes[ll.index(x)]
)
def redo(self):
self._frictions.sort(
reverse=self._reverse,
key=lambda x: x.name
)
if self._indexes is None:
self._indexes = list(
map(
lambda p: self._old.index(p),
self._frictions.frictions
)
)
self._old = None
class MoveCommand(QUndoCommand):
def __init__(self, frictions, up, i):
QUndoCommand.__init__(self)
self._frictions = frictions
self._up = up == "up"
self._i = i
def undo(self):
if self._up:
self._frictions.move_up(self._i)
else:
self._frictions.move_down(self._i)
def redo(self):
if self._up:
self._frictions.move_up(self._i)
else:
self._frictions.move_down(self._i)
class PasteCommand(QUndoCommand):
def __init__(self, frictions, row, friction):
QUndoCommand.__init__(self)
self._frictions = frictions
self._row = row
self._friction = deepcopy(friction)
self._friction.reverse()
def undo(self):
self._frictions.delete(self._friction)
def redo(self):
for friction in self._friction:
self._frictions.insert(self._row, friction)
class DuplicateCommand(QUndoCommand):
def __init__(self, frictions, rows, friction):
QUndoCommand.__init__(self)
self._frictions = frictions
self._rows = rows
self._friction = deepcopy(friction)
self._friction.reverse()
def undo(self):
self._frictions.delete(self._friction)
def redo(self):
for friction in self._frictions:
self._frictions.insert(self._rows[0], friction)

View File

@ -24,18 +24,18 @@ from PyQt5.QtWidgets import (
QComboBox, QVBoxLayout, QHeaderView, QTabWidget, QComboBox, QVBoxLayout, QHeaderView, QTabWidget,
) )
from View.Sections.UndoCommand import ( from View.Frictions.UndoCommand import (
PasteCommand, DuplicateCommand, PasteCommand, DuplicateCommand,
) )
from View.Sections.Table import ( from View.Frictions.Table import (
TableModel, ComboBoxDelegate TableModel, ComboBoxDelegate
) )
from View.Plot.MplCanvas import MplCanvas from View.Plot.MplCanvas import MplCanvas
from View.Geometry.PlotKPC import PlotKPC from View.Geometry.PlotKPC import PlotKPC
from View.Sections.PlotStricklers import PlotStricklers from View.Frictions.PlotStricklers import PlotStricklers
from View.Sections.translate import * from View.Frictions.translate import *
from View.Stricklers.Window import StricklersWindow from View.Stricklers.Window import StricklersWindow
@ -43,16 +43,16 @@ _translate = QCoreApplication.translate
logger = logging.getLogger() logger = logging.getLogger()
class SectionsWindow(ASubMainWindow, ListedSubWindow): class FrictionsWindow(ASubMainWindow, ListedSubWindow):
def __init__(self, title="Sections", study=None, parent=None): def __init__(self, title="Frictions", study=None, parent=None):
self._study = study self._study = study
self._reach = self._study.river._current_reach self._reach = self._study.river.current_reach()
self._sections = self._reach.sections self._frictions = self._reach.frictions
self.setup_title(title) self.setup_title(title)
super(SectionsWindow, self).__init__( super(FrictionsWindow, self).__init__(
name=self._title, ui="Sections", parent=parent name=self._title, ui="Frictions", parent=parent
) )
self.setup_sc() self.setup_sc()
@ -174,7 +174,7 @@ class SectionsWindow(ASubMainWindow, ListedSubWindow):
if len(rows) > 0: if len(rows) > 0:
data = self._reach data = self._reach
reach = self._reach.reach reach = self._reach.reach
sec = self._sections.get(rows[0]) sec = self._frictions.get(rows[0])
highlight = (sec.begin_kp, sec.end_kp) highlight = (sec.begin_kp, sec.end_kp)
self.plot = PlotKPC( self.plot = PlotKPC(
@ -194,7 +194,7 @@ class SectionsWindow(ASubMainWindow, ListedSubWindow):
def add(self): def add(self):
rows = self.index_selected_rows() rows = self.index_selected_rows()
if len(self._sections) == 0 or len(rows) == 0: if len(self._frictions) == 0 or len(rows) == 0:
self._table.add(0) self._table.add(0)
else: else:
self._table.add(rows[0]) self._table.add(rows[0])

View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
from PyQt5.QtCore import QCoreApplication
_translate = QCoreApplication.translate
table_headers = {
"name": _translate("Frictions", "Name"),
# "edge": _translate("Frictions", "Reach"),
"begin_kp": _translate("Frictions", "Begin kp (m)"),
"end_kp": _translate("Frictions", "End kp (m)"),
"begin_strickler": _translate("Frictions", "Begin strickler"),
"end_strickler": _translate("Frictions", "End strickler"),
}

View File

@ -32,7 +32,7 @@ from View.BoundaryCondition.Window import BoundaryConditionWindow
from View.LateralContribution.Window import LateralContributionWindow from View.LateralContribution.Window import LateralContributionWindow
from View.InitialConditions.Window import InitialConditionsWindow from View.InitialConditions.Window import InitialConditionsWindow
from View.Stricklers.Window import StricklersWindow from View.Stricklers.Window import StricklersWindow
from View.Sections.Window import SectionsWindow from View.Frictions.Window import FrictionsWindow
from View.SolverParameters.Window import SolverParametersWindow from View.SolverParameters.Window import SolverParametersWindow
from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow
from View.CheckList.Window import CheckListWindow from View.CheckList.Window import CheckListWindow
@ -62,7 +62,7 @@ define_model_action = [
"action_toolBar_network", "action_toolBar_geometry", "action_toolBar_network", "action_toolBar_geometry",
"action_toolBar_mesh", "action_toolBar_run_meshing_tool", "action_toolBar_mesh", "action_toolBar_run_meshing_tool",
"action_toolBar_boundary_cond", "action_toolBar_lateral_contrib", "action_toolBar_boundary_cond", "action_toolBar_lateral_contrib",
"action_toolBar_spills", "action_toolBar_sections", "action_toolBar_spills", "action_toolBar_frictions",
"action_toolBar_stricklers", "action_toolBar_building", "action_toolBar_stricklers", "action_toolBar_building",
"action_toolBar_initial_cond", "action_toolBar_initial_cond",
# Menu # Menu
@ -144,7 +144,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
"action_menu_edit_geometry": self.open_geometry, "action_menu_edit_geometry": self.open_geometry,
"action_menu_boundary_conditions": self.open_boundary_cond, "action_menu_boundary_conditions": self.open_boundary_cond,
"action_menu_initial_conditions": self.open_initial_conditions, "action_menu_initial_conditions": self.open_initial_conditions,
"action_menu_edit_friction": self.open_sections, "action_menu_edit_friction": self.open_frictions,
"action_menu_edit_lateral_contribution": self.open_lateral_contrib, "action_menu_edit_lateral_contribution": self.open_lateral_contrib,
"action_menu_run_solver": self.run_solver, "action_menu_run_solver": self.run_solver,
## Help ## Help
@ -164,12 +164,13 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
"action_toolBar_lateral_contrib": self.open_lateral_contrib, "action_toolBar_lateral_contrib": self.open_lateral_contrib,
"action_toolBar_spills": lambda: self.open_dummy("Deversement"), "action_toolBar_spills": lambda: self.open_dummy("Deversement"),
"action_toolBar_stricklers": self.open_stricklers, "action_toolBar_stricklers": self.open_stricklers,
"action_toolBar_sections": self.open_sections, "action_toolBar_frictions": self.open_frictions,
"action_toolBar_building": lambda: self.open_dummy("Ouvrages"), "action_toolBar_building": lambda: self.open_dummy("Ouvrages"),
"action_toolBar_initial_cond": self.open_initial_conditions, "action_toolBar_initial_cond": self.open_initial_conditions,
} }
for action in actions: for action in actions:
logger.debug("Setup connection : " + action)
self.findChild(QAction, action)\ self.findChild(QAction, action)\
.triggered.connect(actions[action]) .triggered.connect(actions[action])
# action.triggered.connect(actions[action]) # action.triggered.connect(actions[action])
@ -461,14 +462,14 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
) )
strick.show() strick.show()
def open_sections(self): def open_frictions(self):
if (self.model is not None and if (self.model is not None and
self.model.river.has_current_reach()): self.model.river.has_current_reach()):
sections = SectionsWindow( frictions = FrictionsWindow(
study = self.model, study = self.model,
parent = self parent = self
) )
sections.show() frictions.show()
else: else:
self.msg_select_reach() self.msg_select_reach()

View File

@ -1,226 +0,0 @@
# -*- coding: utf-8 -*-
from copy import deepcopy
from tools import trace, timer
from PyQt5.QtWidgets import (
QMessageBox, QUndoCommand, QUndoStack,
)
from Model.Section.Section import Section
from Model.Section.SectionList import SectionList
class SetNameCommand(QUndoCommand):
def __init__(self, sections, index, new_value):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._old = self._sections.get(self._index).name
self._new = new_value
def undo(self):
self._sections.get(self._index).name = self._old
def redo(self):
self._sections.get(self._index).name = self._new
class SetBeginCommand(QUndoCommand):
def __init__(self, sections, index, new_value):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._old = self._sections.get(self._index).begin_kp
self._new = new_value
def undo(self):
self._sections.get(self._index).begin_kp = float(self._old)
def redo(self):
self._sections.get(self._index).begin_kp = float(self._new)
class SetEndCommand(QUndoCommand):
def __init__(self, sections, index, new_value):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._old = self._sections.get(self._index).end_kp
self._new = new_value
def undo(self):
self._sections.get(self._index).end_kp = float(self._old)
def redo(self):
self._sections.get(self._index).end_kp = float(self._new)
class SetBeginStricklerCommand(QUndoCommand):
def __init__(self, sections, index, new_value):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._old = self._sections.get(self._index).begin_strickler
self._new = new_value
def undo(self):
self._sections.get(self._index).begin_strickler = self._old
def redo(self):
self._sections.get(self._index).begin_strickler = self._new
class SetEndStricklerCommand(QUndoCommand):
def __init__(self, sections, index, new_value):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._old = self._sections.get(self._index).end_strickler
self._new = new_value
def undo(self):
self._sections.get(self._index).end_strickler = self._old
def redo(self):
self._sections.get(self._index).end_strickler = self._new
class SetEdgeCommand(QUndoCommand):
def __init__(self, sections, index, edge):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._old = self._sections.get(self._index).edge
self._new = edge
def undo(self):
self._sections.get(self._index).edge = self._old
def redo(self):
self._sections.get(self._index).edge = self._new
class AddCommand(QUndoCommand):
def __init__(self, sections, index, reach):
QUndoCommand.__init__(self)
self._sections = sections
self._index = index
self._reach = reach
self._new = None
def undo(self):
self._sections.delete_i([self._index])
def redo(self):
if self._new is None:
self._new = self._sections.new(self._index)
self._new.edge = self._reach
else:
self._sections.insert(self._index, self._new)
class DelCommand(QUndoCommand):
def __init__(self, sections, rows):
QUndoCommand.__init__(self)
self._sections = sections
self._rows = rows
self._section = []
for row in rows:
self._section.append((row, self._sections.get(row)))
self._section.sort()
def undo(self):
for row, el in self._section:
self._sections.insert(row, el)
def redo(self):
self._sections.delete_i(self._rows)
class SortCommand(QUndoCommand):
def __init__(self, sections, _reverse):
QUndoCommand.__init__(self)
self._sections = sections
self._reverse = _reverse
self._old = self._sections.sections
self._indexes = None
def undo(self):
ll = self._sections.sections
self._sections.sort(
key=lambda x: self._indexes[ll.index(x)]
)
def redo(self):
self._sections.sort(
reverse=self._reverse,
key=lambda x: x.name
)
if self._indexes is None:
self._indexes = list(
map(
lambda p: self._old.index(p),
self._sections.sections
)
)
self._old = None
class MoveCommand(QUndoCommand):
def __init__(self, sections, up, i):
QUndoCommand.__init__(self)
self._sections = sections
self._up = up == "up"
self._i = i
def undo(self):
if self._up:
self._sections.move_up(self._i)
else:
self._sections.move_down(self._i)
def redo(self):
if self._up:
self._sections.move_up(self._i)
else:
self._sections.move_down(self._i)
class PasteCommand(QUndoCommand):
def __init__(self, sections, row, section):
QUndoCommand.__init__(self)
self._sections = sections
self._row = row
self._section = deepcopy(section)
self._section.reverse()
def undo(self):
self._sections.delete(self._section)
def redo(self):
for section in self._section:
self._sections.insert(self._row, section)
class DuplicateCommand(QUndoCommand):
def __init__(self, sections, rows, section):
QUndoCommand.__init__(self)
self._sections = sections
self._rows = rows
self._section = deepcopy(section)
self._section.reverse()
def undo(self):
self._sections.delete(self._section)
def redo(self):
for section in self._sections:
self._sections.insert(self._rows[0], section)

View File

@ -1,14 +0,0 @@
# -*- coding: utf-8 -*-
from PyQt5.QtCore import QCoreApplication
_translate = QCoreApplication.translate
table_headers = {
"name": _translate("Sections", "Name"),
# "edge": _translate("Sections", "Reach"),
"begin_kp": _translate("Sections", "Begin kp (m)"),
"end_kp": _translate("Sections", "End kp (m)"),
"begin_strickler": _translate("Sections", "Begin strickler"),
"end_strickler": _translate("Sections", "End strickler"),
}

View File

@ -292,7 +292,7 @@
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_toolBar_spills"/> <addaction name="action_toolBar_spills"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_toolBar_sections"/> <addaction name="action_toolBar_frictions"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_toolBar_building"/> <addaction name="action_toolBar_building"/>
<addaction name="separator"/> <addaction name="separator"/>
@ -858,12 +858,12 @@
<string>Edit lateral spills</string> <string>Edit lateral spills</string>
</property> </property>
</action> </action>
<action name="action_toolBar_sections"> <action name="action_toolBar_frictions">
<property name="text"> <property name="text">
<string>Sections</string> <string>Friction</string>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Edit section frictions and lateral contributions</string> <string>Edit friction frictions and lateral contributions</string>
</property> </property>
</action> </action>
<action name="action_toolBar_stricklers"> <action name="action_toolBar_stricklers">