diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py index 8246a1a30865c637c3ab69baa580e8572922b0b8..526716a4e11af09e3ad840b1437bcd56ea01d912 100644 --- a/src/Model/Geometry/Reach.py +++ b/src/Model/Geometry/Reach.py @@ -229,7 +229,7 @@ class Reach: return (complete, incomplete) - def _map_guidelines_points(self, func): + def _map_guidelines_points(self, func, _filter=None): return list( # Map for each guideline map( @@ -240,7 +240,10 @@ class Reach: self._guidelines[k], ) ), - self._guidelines + self._guidelines if not _filter else filter( + _filter, + self._guidelines + ) ) ) diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py index 433b0b40fb56bf14c5da4850b0f994688aa0fee8..b1d0a91db5f5ee3ec635a751440a69636d0dbabf 100644 --- a/src/View/Geometry/GeometryWindow.py +++ b/src/View/Geometry/GeometryWindow.py @@ -36,7 +36,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.tableView = self.ui.tableView self.tableView_header = self.ui.tableView_header - self.model = None + self._tablemodel = None self.setup_window() self.setup_model() @@ -47,11 +47,11 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.setWindowTitle(f"{self.ui.mainwindow_title} - {self._reach.name}") def setup_model(self): - self.model = qtableview_reach.PandasModelEditable( + self._tablemodel = qtableview_reach.PandasModelEditable( headers = self.ui.tableView_header, reach = self._reach ) - self.tableView.setModel(self.model) + self.tableView.setModel(self._tablemodel) self.tableView.setItemDelegate(qtableview_reach.Delegate()) def setup_plot(self): @@ -98,13 +98,12 @@ class GeometryWindow(QMainWindow, WindowToolKit): if filename != "": size = os.stat(filename).st_size self._reach.import_geometry(filename) - self.model.layoutChanged.emit() + self._tablemodel.layoutChanged.emit() self.update_profile_windows() self.graphic_1() self.graphic_2() self.graphic_3() - self.fichier_ouvert = True # Profile selection when line change in table self.tableView.selectionModel()\ @@ -112,8 +111,8 @@ class GeometryWindow(QMainWindow, WindowToolKit): .connect(self.select_current_profile) # Update plot when profile data change - self.model.dataChanged.connect(self.update_graphic_1) - self.model.dataChanged.connect(self.update_graphic_2) + self._tablemodel.dataChanged.connect(self.update_graphic_1) + self._tablemodel.dataChanged.connect(self.update_graphic_2) self.tableView.selectionModel()\ .selectionChanged\ .connect(self.update_graphic_1) @@ -211,14 +210,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): pyqtSlot(bool) def changed_profile_slot(self, status): - print("status du changement ", status) self.update_view1 = status - print(self.update_view1) - - def update_graphic_1_profile(self): - if self.update_view1: - self.update_graphic_1() - print("update_graphic_1_profile") def update_profile_windows(self): self.list_second_window = [] @@ -322,10 +314,10 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.line_kp_zgl = [ self.ui.canvas_2.axes.plot( self._reach.get_kp(), i, lw=1. - ) for i in self.model.z_complete_guideline() + ) for i in self._reach.get_guidelines_z() ] except: - print("TODO") + print("Graphic 2: Z guidelines failed") self.line_kp_zmin, = self.ui.canvas_2.axes.plot( kp, z_min, @@ -342,16 +334,16 @@ class GeometryWindow(QMainWindow, WindowToolKit): def update_graphic_1(self): self.tableView.model().blockSignals(True) - for ind in range(self.model.rowCount()): + for ind in range(self._tablemodel.rowCount()): self.line_xy[ind][0].set_data( - self._reach.profile(ind).x, - self._reach.profile(ind).y + self._reach.profile(ind).x(), + self._reach.profile(ind).y() ) for i in range(len(self.line_gl_1)): self.line_gl_1[i].set_data( - [x[i] for x in self.get_x_complete_list_gl], - [y[i] for y in self.get_y_complete_list_gl] + [x[i] for x in self.x_complete], + [y[i] for y in self.y_complete] ) self.tableView.model().blockSignals(False) @@ -376,10 +368,10 @@ class GeometryWindow(QMainWindow, WindowToolKit): try: for i in range(len(self.line_kp_zgl)): self.line_kp_zgl[i][0].set_data( - kp, self.model.z_complete_guideline()[i] + kp, self._tablemodel.z_complete_guideline()[i] ) except: - print("TODO") + print("Failed to update graphic 2") self.tableView.model().blockSignals(False) self.ui.canvas_2.axes.autoscale_view(True, True, True) @@ -494,47 +486,46 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.annotation_3[:] = [] - x = self.profile(ind).get_station() + x = self._reach.profile(ind).get_station() y = self._reach.profile(ind).z() gl = self._reach.profile(ind).name - get_complete_list_gl = self._reach.get_complete_list_gl() - get_incomplete_list_gl = self._reach.get_incomplete_list_gl() + complete, incomplete = self._reach.compute_guidelines() try: - x_gl_complete = [] - color_scat_complete_gl = [] - x_gl_incomplete = [] - color_scat_incomplete_gl = [] + x_complete = [] + color_scat_complete = [] + x_incomplete = [] + color_scat_incomplete = [] for i, txt in enumerate(list(gl)): - if txt in get_complete_list_gl: + if txt in complete: annotate = self.ui.canvas_3.axes.annotate( txt, (x[i], y[i]), horizontalalignment='left', verticalalignment='top', annotation_clip=True, fontsize=11, - color=self.color_complete_gl[ - get_complete_list_gl.index(txt) + color=self.color_complete[ + complete.index(txt) ], size=10 ) self.annotation_3.append(annotate) - x_gl_complete.append([x[i], y[i]]) - color_scat_complete_gl.append( - self.color_complete_gl[self.complete_gl.index(txt)] + x_complete.append([x[i], y[i]]) + color_scat_complete.append( + self.color_complete[self.complete.index(txt)] ) - elif txt in get_incomplete_list_gl: + elif txt in incomplete: annotate = self.ui.canvas_3.axes.annotate( txt, (x[i], y[i]), horizontalalignment='left', verticalalignment='top', annotation_clip=True, fontsize=11, - color=self.color_incomplete_gl[ - get_incomplete_list_gl.index(txt) + color=self.color_incomplete[ + incomplete.index(txt) ], size=10 ) self.annotation_3.append(annotate) - x_gl_incomplete.append([x[i], y[i]]) - color_scat_incomplete_gl.append( - self.color_incomplete_gl[get_incomplete_list_gl.index(txt)] + x_incomplete.append([x[i], y[i]]) + color_scat_incomplete.append( + self.color_incomplete[incomplete.index(txt)] ) except: print("FIXME") @@ -559,43 +550,34 @@ class GeometryWindow(QMainWindow, WindowToolKit): def update_graphic_3(self, ind: int): self.tableView.model().blockSignals(True) - if ind == 0: - self.profile_i_minus_1.set_data([], []) - self.profile_i.set_data( - self.get_station(ind), - self.get_elevation(ind) - ) - self.profile_i_plus_1.set_data( - self.get_station(ind + 1), - self.get_elevation(ind + 1) - ) - elif ind == self.model.rowCount() - 1: - self.profile_i_minus_1.set_data( - self.get_station(ind - 1), - self.get_elevation(ind - 1) - ) - self.profile_i.set_data( - self.get_station(ind), - self.get_elevation(ind) - ) - self.profile_i_plus_1.set_data([], []) - elif 0 < ind < self.model.rowCount() - 1: + # ind - 1 + if ind != 0: self.profile_i_minus_1.set_data( self.get_station(ind - 1), self.get_elevation(ind - 1) ) - self.profile_i.set_data( - self.get_station(ind), - self.get_elevation(ind) - ) + else: + self.profile_i_minus_1.set_data([], []) + + # ind + self.profile_i.set_data( + self.get_station(ind), + self.get_elevation(ind) + ) + + # ind + 1 + if ind != self._tablemodel.rowCount() - 1: self.profile_i_plus_1.set_data( self.get_station(ind + 1), self.get_elevation(ind + 1) ) + else: + self.profile_i_plus_1.set_data([], []) self.tableView.model().blockSignals(False) - self.update_annotate_3(ind) + # Update graphic 3 + self.update_annotate_3(ind) self.ui.canvas_3.axes.relim() self.ui.canvas_3.axes.autoscale_view() self.ui.canvas_3.figure.canvas.draw_idle() @@ -603,47 +585,48 @@ class GeometryWindow(QMainWindow, WindowToolKit): def select_plot_graphic_1(self, ind: int): self.tableView.model().blockSignals(True) - if 0 <= ind < self.model.rowCount(): - self.plot_selected_1.set_data(self._reach.profile(ind).x, - self._reach.profile(ind).y) + if 0 <= ind < self._tablemodel.rowCount(): + self.plot_selected_1.set_data(self._reach.profile(ind).x(), + self._reach.profile(ind).y()) self.plot_selected_1.set_visible(True) self.tableView.model().blockSignals(False) def select_plot_graphic_2(self, ind: int): kp_i = self._reach.profile(ind).kp - z_min_i = self._reach.profile(ind).z_min - z_max_i = self._reach.profile(ind).z_max + z_min_i = self._reach.profile(ind).z_min() + z_max_i = self._reach.profile(ind).z_max() - if 0 <= ind < self.model.rowCount(): + if 0 <= ind < self._tablemodel.rowCount(): self.plot_selected_2.set_data((kp_i, kp_i), (z_min_i, z_max_i)) self.plot_selected_2.set_visible(True) def select_before_plot_selected_1(self, ind: int): - if 0 <= ind < self.model.rowCount(): + if 0 <= ind < self._tablemodel.rowCount(): self.before_plot_selected_1.set_data( - self._reach.profile(ind).x, - self._reach.profile(ind).y + self._reach.profile(ind).x(), + self._reach.profile(ind).y() ) self.before_plot_selected_1.set_visible(True) self.ui.canvas_1.figure.canvas.draw_idle() def select_after_plot_selected_1(self, ind: int): - if 0 <= ind < self.model.rowCount(): + if 0 <= ind < self._tablemodel.rowCount(): self.after_plot_selected_1.set_data( - self._reach.profile(ind).x, - self._reach.profile(ind).y + self._reach.profile(ind).x(), + self._reach.profile(ind).y() ) + self.after_plot_selected_1.set_visible(True) self.ui.canvas_1.figure.canvas.draw_idle() def select_before_plot_selected_2(self, ind: int): - if 0 <= ind < self.model.rowCount(): + if 0 <= ind < self._tablemodel.rowCount(): kp_i = self._reach.profile(ind).kp - z_min_i = self._reach.profile(ind).z_min - z_max_i = self._reach.profile(ind).z_max + z_min_i = self._reach.profile(ind).z_min() + z_max_i = self._reach.profile(ind).z_max() self.before_plot_selected_2.set_data( (kp_i, kp_i), @@ -654,10 +637,10 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.ui.canvas_2.figure.canvas.draw_idle() def select_after_plot_selected_2(self, ind: int): - if 0 <= ind < self.model.rowCount(): + if 0 <= ind < self._tablemodel.rowCount(): kp_i = self._reach.profile(ind).kp - z_min_i = self._reach.profile(ind).z_min - z_max_i = self._reach.profile(ind).z_max + z_min_i = self._reach.profile(ind).z_min() + z_max_i = self._reach.profile(ind).z_max() self.after_plot_selected_2.set_data( (kp_i, kp_i), @@ -696,12 +679,12 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.select_after_plot_selected_1(row + 1) self.before_plot_selected_2.set_visible(False) self.select_after_plot_selected_2(row + 1) - elif 0 < row < self.model.rowCount() - 1: + elif 0 < row < self._tablemodel.rowCount() - 1: self.select_before_plot_selected_1(row - 1) self.select_after_plot_selected_1(row + 1) self.select_before_plot_selected_2(row - 1) self.select_after_plot_selected_2(row + 1) - elif row == self.model.rowCount() - 1: + elif row == self._tablemodel.rowCount() - 1: self.after_plot_selected_1.set_visible(False) self.select_before_plot_selected_1(row - 1) self.after_plot_selected_2.set_visible(False) @@ -715,8 +698,8 @@ class GeometryWindow(QMainWindow, WindowToolKit): def changed_slider_value(self): self.tableView.model().blockSignals(True) - if self.model.rowCount() != 0: - self.ui.verticalSlider.setMaximum(self.model.rowCount() - 1) + if self._tablemodel.rowCount() != 0: + self.ui.verticalSlider.setMaximum(self._tablemodel.rowCount() - 1) slider_value = self.ui.verticalSlider.value() kp = self._reach.profile(slider_value).kp @@ -735,19 +718,19 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.tableView.model().blockSignals(False) def increment_value_slider(self): - if 0 <= self.ui.verticalSlider.value() < self.model.rowCount() - 1: + if 0 <= self.ui.verticalSlider.value() < self._tablemodel.rowCount() - 1: self.ui.verticalSlider.setValue(self.ui.verticalSlider.value() + 1) def decrement_value_slider(self): - if 0 < self.ui.verticalSlider.value() < self.model.rowCount(): + if 0 < self.ui.verticalSlider.value() < self._tablemodel.rowCount(): self.ui.verticalSlider.setValue(self.ui.verticalSlider.value() - 1) def insert_row(self): if len(self.tableView.selectedIndexes()) == 0: - self.model.insertRows(self.model.rowCount(), 1) + self._tablemodel.insertRows(self._tablemodel.rowCount(), 1) else: row = self.index_selected_row - self.model.insertRows(row + 1, 1) + self._tablemodel.insertRows(row + 1, 1) if self.filename is not None: self.graphic_1() @@ -760,7 +743,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): )) if len(rows) > 0: - self.model.remove_rows(rows) + self._tablemodel.remove_rows(rows) self.update_graphic_1() self.select_current_profile() @@ -770,10 +753,10 @@ class GeometryWindow(QMainWindow, WindowToolKit): @property def index_selected_row(self): - return [index.row() for index in self.tableView.selectedIndexes()][0] + return self.tableView.selectedIndexes()[0].row() def sort_ascending(self): - self.model.sort_profiles(True) + self._tablemodel.sort_profiles(True) self.select_current_profile() self.changed_slider_value() @@ -781,7 +764,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.update_graphic_3(self.index_selected_row) def sort_descending(self): - self.model.sort_profiles(False) + self._tablemodel.sort_profiles(False) self.select_current_profile() self.changed_slider_value() @@ -792,22 +775,22 @@ class GeometryWindow(QMainWindow, WindowToolKit): def move_row_down(self): row = self.index_selected_row - if row < self.model.rowCount() - 1: - self.model.moveRowDown(row) + if row < self._tablemodel.rowCount() - 1: + self._tablemodel.moveRowDown(row) self.update_graphic_3(row + 1) self.ui.canvas_3.axes.relim() self.ui.canvas_3.axes.autoscale_view() - if row < self.model.rowCount() - 2: + if row < self._tablemodel.rowCount() - 2: self.select_before_plot_selected_1(row) self.select_after_plot_selected_1(row + 2) self.select_before_plot_selected_2(row) self.select_after_plot_selected_2(row + 2) - if row == self.model.rowCount() - 2: - self.select_before_plot_selected_1(self.model.rowCount() - 2) + if row == self._tablemodel.rowCount() - 2: + self.select_before_plot_selected_1(self._tablemodel.rowCount() - 2) self.after_plot_selected_1.set_visible(False) - self.select_before_plot_selected_2(self.model.rowCount() - 2) + self.select_before_plot_selected_2(self._tablemodel.rowCount() - 2) self.after_plot_selected_2.set_visible(False) self.update_graphic_2() @@ -815,8 +798,8 @@ class GeometryWindow(QMainWindow, WindowToolKit): def move_row_up(self): row = self.index_selected_row - if 0 < row <= self.model.rowCount() - 1: - self.model.moveRowUp(row) + if 0 < row <= self._tablemodel.rowCount() - 1: + self._tablemodel.moveRowUp(row) if row == 1: self.select_after_plot_selected_1(row) @@ -824,7 +807,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): self.select_after_plot_selected_2(row) self.before_plot_selected_2.set_visible(False) - elif row == self.model.rowCount() - 1: + elif row == self._tablemodel.rowCount() - 1: self.select_before_plot_selected_1(row - 2) self.select_after_plot_selected_1(row) self.select_before_plot_selected_2(row - 2) @@ -851,9 +834,9 @@ class GeometryWindow(QMainWindow, WindowToolKit): filename, filters = QFileDialog.getSaveFileName( self, filter=_translate("MainWindow_reach", - "Fichiers .ST(*.ST ou *.st)") + "Files .ST(*.ST or *.st)") + ";; " + - _translate("MainWindow_reach", "Tous les fichiers " + _translate("MainWindow_reach", "All files " "(*)"), options=options ) @@ -861,7 +844,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): current_dir = os.path.split(filename)[0] or DEFAULT_DIRECTORY if filename != '': - self.model.export_reach(filename) + self._tablemodel.export_reach(filename) def handleOpen(self): filename, filterName = QFileDialog.getOpenFileName(self) @@ -875,7 +858,7 @@ class GeometryWindow(QMainWindow, WindowToolKit): row[0] = QCheckBox("-") buf.append(row) - self.model = None - self.model = qtableview_reach.PandasModelEditable(buf) - self.tableView.setModel(self.model) + self._tablemodel = None + self._tablemodel = qtableview_reach.PandasModelEditable(buf) + self.tableView.setModel(self._tablemodel) filename = '' diff --git a/src/View/Geometry/qtableview_reach.py b/src/View/Geometry/qtableview_reach.py index d6e64f19088d59694aa4877ee3a4b6782f2a2883..fd8e164c20b0a73450e812936c1716a3cf4cc5b0 100644 --- a/src/View/Geometry/qtableview_reach.py +++ b/src/View/Geometry/qtableview_reach.py @@ -46,31 +46,32 @@ class PandasModelEditable(QAbstractTableModel): return len(self.headers) def data(self, index, role=Qt.DisplayRole): - if index.isValid(): - if role == Qt.DisplayRole and index.column() == 0: - return self._reach.profile(index.row()).name - - if role == Qt.DisplayRole and index.column() == 1: - kp = self._reach.profile(index.row()).kp - return f"{kp:.4f}" - - if role == Qt.DisplayRole and index.column() == 2: - return self._reach.profile(index.row()).profile_type - - for column in range(0, self.columnCount()): - if index.column() == column and role == Qt.TextAlignmentRole: - return Qt.AlignHCenter | Qt.AlignVCenter - - if role == Qt.ForegroundRole and index.column() == 0: - name = self._reach.profile(index.row()).name\ - .strip()\ - .lower() - if (name == "upstream" or name == "up" or - name == _translate("Geometry", "upstream")): - return QtGui.QColor("Green") - elif (name == "downstream" or name == "down" or - name == _translate("Geometry", "downstream")): - return QtGui.QColor("Red") + if not index.isValid(): + return QVariant() + + if role == Qt.DisplayRole and index.column() == 0: + return self._reach.profile(index.row()).name + + if role == Qt.DisplayRole and index.column() == 1: + kp = self._reach.profile(index.row()).kp + return f"{kp:.4f}" + + if role == Qt.DisplayRole and index.column() == 2: + return self._reach.profile(index.row()).profile_type + + if role == Qt.TextAlignmentRole: + return Qt.AlignHCenter | Qt.AlignVCenter + + if role == Qt.ForegroundRole and index.column() == 0: + name = self._reach.profile(index.row()).name\ + .strip()\ + .lower() + if (name == "upstream" or name == "up" or + name == _translate("Geometry", "upstream")): + return QtGui.QColor("Green") + elif (name == "downstream" or name == "down" or + name == _translate("Geometry", "downstream")): + return QtGui.QColor("Red") return QVariant() @@ -89,11 +90,11 @@ class PandasModelEditable(QAbstractTableModel): column = index.column() if role == Qt.EditRole and index.column() != 2: - if role == Qt.EditRole and index.column() == 0: + if index.column() == 0: self._reach.profile(index.row()).name = value - if role == Qt.EditRole and index.column() == 1: - self._reach.profile(index.row()).pk = float(value) + if index.column() == 1: + self._reach.profile(index.row()).kp = value self.dataChanged.emit(index, index) self.layoutChanged.emit() @@ -173,27 +174,20 @@ class Delegate(QtWidgets.QStyledItemDelegate): self.setModelDataEvent = setModelDataEvent def createEditor(self, parent, option, index): - """retourne le widget (éditeur) pour éditer l'item se trouvant à l'index index.""" index.model().data(index, Qt.DisplayRole) return QtWidgets.QLineEdit(parent) def setEditorData(self, editor, index): - """permet de transmettre à l'éditeur editor les données à afficher à partir du modèle se trouvant à l'index - index. """ value = index.model().data(index, Qt.DisplayRole) # DisplayRole editor.setText(str(value)) # récupère la valeur de la cellule applique la méthode définie dans setData - print('Donnée éditée dans la case [{},{}] :'.format(index.row(), index.column()), value) def setModelData(self, editor, model, index): - """permet de récupérer les données de l'éditeur et de les stocker à l'intérieur du modèle, à l'index identifié - par le paramètre index """ - model.setData(index, editor.currentItem().text()) + model.setData(index, editor.text()) if not self.setModelDataEvent is None: self.setModelDataEvent() def updateEditorGeometry(self, editor, option, index): - """permet de redimensionner l'éditeur à la bonne taille lorsque la taille de la vue change""" editor.setGeometry(option.rect) class Delegate1(QtWidgets.QStyledItemDelegate): diff --git a/src/pamhyr.py b/src/pamhyr.py index de12d2e177b6adcbb8a4e536802552e3c19a2508..b56d0af9393afab32236b9211787e0c6e1dce032 100755 --- a/src/pamhyr.py +++ b/src/pamhyr.py @@ -39,7 +39,7 @@ def main(): application = ApplicationWindow(conf=conf) application.show() - sys.exit(int(app.exec_())) + sys.exit(app.exec_()) if __name__ == "__main__": main()