diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py index b18f2ade5860d865bcc7ddcd57ae6c8c0893ba9f..728cf2db7d42fc00d27207b97f7d4e2bbc10aaf2 100644 --- a/src/Model/Geometry/Reach.py +++ b/src/Model/Geometry/Reach.py @@ -260,6 +260,39 @@ class Reach(SQLSubModel): return max(self.get_kp()) + # Sediment Layers + + def get_sl(self): + """Get sediment layer height of profile + + Get sediment layer of profile (without spesific point sl) + + Returns: + List of sediment layers height + """ + res = [] + psl = [profile.sl for profile in self.profiles] + + # Compute max number of layers + sl_max = 0 + for sl in psl: + n = 0 if sl is None else len(sl) + sl_max = max(n, sl_max) + + # Create list of height for each sl and each layer + for i in range(0, sl_max): + cur = [] + # Compute new layer line for each sl + for sl in psl: + if sl is not None and i < len(sl): + cur.append(sl.get(i).height) + else: + cur.append(0) + # Add layer line to result + res.append(cur) + + return res + # Guidelines @timer diff --git a/src/Model/SedimentLayer/SedimentLayer.py b/src/Model/SedimentLayer/SedimentLayer.py index c0c34abc7a64f51e82840d1cae9796cc8ea8fb50..f1b8a88a77172529bb69e270e0040fd4db4d0c81 100644 --- a/src/Model/SedimentLayer/SedimentLayer.py +++ b/src/Model/SedimentLayer/SedimentLayer.py @@ -50,7 +50,7 @@ class Layer(SQLSubModel): @height.setter def height(self, height): - self._height = height + self._height = float(height) @classmethod def _sql_create(cls, execute): @@ -60,7 +60,7 @@ class Layer(SQLSubModel): ind INTEGER NOT NULL, name TEXT NOT NULL, type TEXT NOT NULL, - height INTEGER NOT NULL, + height REAL NOT NULL, sl INTEGER, FOREIGN KEY(sl) REFERENCES sedimentary_layer(id) ) diff --git a/src/View/SedimentLayers/Reach/Plot.py b/src/View/SedimentLayers/Reach/Plot.py new file mode 100644 index 0000000000000000000000000000000000000000..af7a54ed0acedf2e1aa55221cfd00e3413ecf5b9 --- /dev/null +++ b/src/View/SedimentLayers/Reach/Plot.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- + +import logging + +from functools import reduce + +from tools import timer +from View.Plot.APlot import APlot + +from PyQt5.QtCore import ( + QCoreApplication +) + +_translate = QCoreApplication.translate + +logger = logging.getLogger() + +class Plot(APlot): + def __init__(self, canvas=None, data=None, toolbar=None, + display_current=True): + super(Plot, self).__init__( + canvas=canvas, + data=data, + toolbar=toolbar + ) + + self._display_current = display_current + + self.line_kp_zmin = None + self.line_kp_sl = [] + + @timer + def draw(self): + self.canvas.axes.cla() + self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) + + if self.data is None: + return + + if self.data.number_profiles == 0: + return + + self.canvas.axes.set_xlabel( + _translate("MainWindow_reach", "Kp (m)"), + color='green', fontsize=12 + ) + self.canvas.axes.set_ylabel( + _translate("MainWindow_reach", "Height (m)"), + color='green', fontsize=12 + ) + + kp = self.data.get_kp() + sl = self.data.get_sl() + z_min = self.data.get_z_min() + z_max = self.data.get_z_max() + + self.canvas.axes.set_xlim( + left = min(kp), right = max(kp) + ) + + z_sl = reduce( + lambda acc, v: acc + [ + list( + map(lambda x, y: y - x, v, acc[-1]) + ) + ], + sl, + [z_min] + ) + + for i, z in enumerate(z_sl): + self.line_kp_sl.append(None) + self.line_kp_sl[i], = self.canvas.axes.plot( + kp, z, + linestyle="solid" if i == 0 else "--", + lw=1.8, + color='grey' if i == 0 else None + ) + + self.canvas.figure.tight_layout() + self.canvas.figure.canvas.draw_idle() + if self.toolbar is not None: + self.toolbar.update() + + self._init = True + + @timer + def update(self, ind=None): + if self._init == False: + self.draw() + return + + if ind is None: + kp = self.data.get_kp() + z_min = self.data.get_z_min() + z_max = self.data.get_z_max() + + self.line_kp_zmin.set_data(kp, z_min) + + self.canvas.axes.autoscale_view(True, True, True) + self.canvas.figure.canvas.draw_idle() diff --git a/src/View/SedimentLayers/Reach/Window.py b/src/View/SedimentLayers/Reach/Window.py index 711a04fc49639a637e21a6d9dfd6a9652cf1a194..4d155cec80f726cf5ef84d9519e12723f4e379aa 100644 --- a/src/View/SedimentLayers/Reach/Window.py +++ b/src/View/SedimentLayers/Reach/Window.py @@ -26,6 +26,7 @@ from PyQt5.QtWidgets import ( from View.SedimentLayers.Reach.UndoCommand import * from View.SedimentLayers.Reach.Table import * +from View.SedimentLayers.Reach.Plot import Plot from View.Plot.MplCanvas import MplCanvas from View.SedimentLayers.Reach.translate import * @@ -98,13 +99,13 @@ class ReachSedimentLayersWindow(ASubMainWindow, ListedSubWindow): self.plot_layout = self.find(QVBoxLayout, "verticalLayout_2") self.plot_layout.addWidget(self.canvas) - # self.plot = PlotKPC( - # canvas = self.canvas, - # data = self._reach.reach, - # toolbar = None, - # display_current = False - # ) - # self.plot.draw() + self.plot = Plot( + canvas = self.canvas, + data = self._reach, + toolbar = None, + display_current = False + ) + self.plot.draw() def setup_connections(self):