# -*- coding: utf-8 -*- import os import pathlib import sys import csv import time from PyQt5 import QtWidgets from PyQt5.QtCore import ( QModelIndex, Qt, QSettings, pyqtSlot, QItemSelectionModel, QCoreApplication, QSize ) from PyQt5.QtWidgets import ( QApplication, QMainWindow, QFileDialog, QCheckBox ) from View.Geometry.mainwindow_ui_reach import Ui_MainWindow from View.Geometry import qtableview_reach from View.Geometry import window_profileXYZ from View.ASubWindow import WindowToolKit _translate = QCoreApplication.translate class GeometryWindow(QMainWindow, WindowToolKit): def __init__(self, model=None, parent=None): self.parent = parent super(GeometryWindow, self).__init__(parent=parent) self._model = model self._reach = model.river.current_reach().reach self.ui = Ui_MainWindow() self.ui.setupUi(self) self.tableView = self.ui.tableView self.tableView_header = self.ui.tableView_header self.model = None self.setup_window() self.setup_model() self.setup_connections() def setup_window(self): self.setWindowTitle(f"{self.ui.mainwindow_title} - {self._reach.name}") def setup_model(self): self.model = qtableview_reach.PandasModelEditable( headers = self.ui.tableView_header, reach = self._reach ) self.tableView.setModel(self.model) self.tableView.setItemDelegate(qtableview_reach.Delegate()) def setup_connections(self): self.ui.btn_open.clicked.connect(self.open_file_dialog) self.ui.btn_sort_asc.clicked.connect(self.sort_ascending) self.ui.btn_sort_desc.clicked.connect(self.sort_descending) self.ui.btn_move_up.clicked.connect(self.move_row_up) self.ui.btn_move_down.clicked.connect(self.move_row_down) self.ui.btn_end_editing.clicked.connect(self.handleSave) self.ui.btn_add.clicked.connect(self.insert_row) self.ui.btn_delete.clicked.connect(self.delete_row) self.ui.btn_edit.clicked.connect(self.edit_profile) self.ui.verticalSlider.valueChanged.connect(self.changed_slider_value) self.tableView.selectionModel().selectionChanged.connect(self.changed_slider_value) self.ui.btn_slider_up.clicked.connect(self.decrement_value_slider) self.ui.btn_slider_down.clicked.connect(self.increment_value_slider) self.ui.btn_move_up.clicked.connect(self.changed_profile_slot) def open_file_dialog(self): options = QFileDialog.Options() DEFAULT_DIRECTORY = os.getenv("HOME") settings = QSettings(QSettings.IniFormat, QSettings.UserScope, 'MyOrg', ) current_dir = settings.value('current_directory', DEFAULT_DIRECTORY, type=str) options |= QFileDialog.DontUseNativeDialog filename, _ = QtWidgets.QFileDialog.getOpenFileName( self, _translate("MainWindow_reach", "Ouvrir un fichier"), current_dir, _translate("MainWindow_reach", "Fichiers .ST (*.ST)") + ";; " + _translate("MainWindow_reach", "Fichiers textes (*.txt)") + ";; " + _translate("MainWindow_reach", "Tous les fichiers (*)"), options=options ) current_dir = os.path.split(filename)[0] or DEFAULT_DIRECTORY #settings.setValue('current_directory', current_dir) if filename != "": size = os.stat(filename).st_size self._reach.import_geometry(filename) # self.model = qtableview_reach.PandasModelEditable( # , # self.tableView_header # ) # self.tableView.setModel(self.model) self.model.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()\ .selectionChanged\ .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.tableView.selectionModel()\ .selectionChanged\ .connect(self.update_graphic_1) self.tableView.selectionModel()\ .selectionChanged\ .connect(self.update_graphic_2) def messagebox_profile_editing(self): msg_box = QtWidgets.QMessageBox() msg_box.setIcon(QtWidgets.QMessageBox.Information) msg_box.setWindowTitle(_translate("MainWindow_reach", "Édition des profils sélectionnés")) msg_box.setText(_translate("MainWindow_reach", "Vous avez sélectionné plus de 5 profils." " \nSeuls les 5 premiers seront édités.")) msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok) return_value = msg_box.exec() if return_value == QtWidgets.QMessageBox.Ok: print('OK clicked') def edit_profile(self): list_selected_row = list( set([index.row() for index in self.tableView.selectedIndexes()]) ) self.tableView.model().blockSignals(True) if len(list_selected_row) > 5: self.messagebox_profile_editing() for selected_row in list_selected_row[:5]: selected_row = int(selected_row) profile_identifier = self._reach.get_profile_selected_identifier(selected_row) Kp = self._reach.get_kp_i(selected_row) profile_name = self._reach.get_profile_name(selected_row) if len(self.list_second_window) == 0: self.second_window = window_profileXYZ.View( selected_row + 1, self._reach.get_profile_via_identifier(profile_identifier), kp=Kp, profile_name="", parent=self ) self.second_window.window_title( kp=Kp, profile_name=profile_name, profile_selected_num=selected_row ) self.second_window.setWindowFlags(Qt.Window | Qt.WindowStaysOnTopHint) self.list_second_window.append(self.second_window) self.second_window.show() self.list_row.append(profile_identifier) else: if profile_identifier in self.list_row: self.list_second_window[self.list_row.index(profile_identifier)]\ .window_title( kp=Kp, profile_name=profile_name, profile_selected_num=selected_row ) self.list_second_window[ self.list_row.index(profile_identifier) ].setWindowFlags(Qt.Window | Qt.WindowStaysOnTopHint) self.list_second_window[ self.list_row.index(profile_identifier) ].show() else: second_window1 = window_profileXYZ.View( selected_row + 1, self._reach.get_profile_via_identifier(profile_identifier), kp=Kp, profile_name="", parent=self ) second_window1.window_title( kp=Kp, profile_name=profile_name, profile_selected_num=selected_row ) second_window1.setWindowFlags(Qt.Window | Qt.WindowStaysOnTopHint) second_window1.show() self.list_row.append(profile_identifier) self.list_second_window.append(second_window1) widgetList = QApplication.topLevelWidgets() numWindows = len(widgetList) self.tableView.model().blockSignals(False) def wind_profile_changed(self): self.second_window\ .datachanged_signal[bool]\ .connect(self.changed_profile_slot) 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 print_data(self): print(self.model_data.profile) def update_profile_windows(self): self.list_second_window = [] self.list_row = [] def graphic_1(self): self.ui.canvas_1.axes.cla() self.ui.canvas_1.axes.grid(color='grey', linestyle='--', linewidth=0.5) self.ui.canvas_1.axes.set_xlabel( _translate("MainWindow_reach", "X (m)"), color='green', fontsize=12 ) self.ui.canvas_1.axes.set_ylabel( _translate("MainWindow_reach", "Y (m)"), color='green', fontsize=12 ) self.line_xy = [ self.ui.canvas_1.axes.plot(x, y, color='r', lw=1., markersize=3, marker='+') for x, y in zip(self._reach.get_x(), self._reach.get_y()) ] self.line_ld_1 = self.ui.canvas_1.axes.plot( self._reach.get_guidelines_x(), self._reach.get_guidelines_y() ) self.plot_selected_1, = self.ui.canvas_1.axes.plot( self._reach.profile(0).x(), self._reach.profile(0).y(), lw=1., markersize=3, marker='+', color="b" ) self.plot_selected_1.set_visible(False) self.before_plot_selected_1, = self.ui.canvas_1.axes.plot( self._reach.profile(0).x(), self._reach.profile(0).y(), lw=1., markersize=3, marker='+', color="k", linestyle="--" ) self.before_plot_selected_1.set_visible(False) self.after_plot_selected_1, = self.ui.canvas_1.axes.plot( self._reach.profile(0).x(), self._reach.profile(0).y(), lw=1., markersize=3, marker='+', color="m", linestyle='--' ) self.after_plot_selected_1.set_visible(False) self.ui.canvas_1.figure.tight_layout() self.ui.canvas_1.figure.canvas.draw_idle() self.ui.toolbar_1.update() def graphic_2(self): self.tableView.model().blockSignals(True) self.ui.canvas_2.axes.cla() self.ui.canvas_2.axes.grid(color='grey', linestyle='--', linewidth=0.5) self.ui.canvas_2.axes.set_xlabel( _translate("MainWindow_reach", "Kp (m)"), color='green', fontsize=12 ) self.ui.canvas_2.axes.set_ylabel( _translate("MainWindow_reach", "Cote (m)"), color='green', fontsize=12 ) self.get_kp = self._reach.get_kp() self.get_z_min = self._reach.get_z_min() self.get_z_max = self._reach.get_z_max() self.line_kp_zmin_zmax = self.ui.canvas_2.axes.vlines( x=self.get_kp, ymin=self.get_z_min, ymax=self.get_z_max, color='r', lw=1. ) self.plot_selected_2, = self.ui.canvas_2.axes.plot( (self.get_kp[0], self.get_kp[0]), (self.get_z_min[0], self.get_z_max[0]), color='b', lw=1.8 ) self.plot_selected_2.set_visible(False) self.before_plot_selected_2, = self.ui.canvas_2.axes.plot( (self.get_kp[0], self.get_kp[0]), (self.get_z_min[0], self.get_z_max[0]), color='k', lw=1.6, linestyle='--' ) self.before_plot_selected_2.set_visible(False) self.after_plot_selected_2, = self.ui.canvas_2.axes.plot( (self.get_kp[0], self.get_kp[0]), (self.get_z_min[0], self.get_z_max[0]), color='m', lw=1.6, linestyle='--' ) self.after_plot_selected_2.set_visible(False) try: self.line_kp_zld = [ self.ui.canvas_2.axes.plot( self._reach.get_kp(), i, lw=1. ) for i in self.model.z_complete_guideline() ] except: print("TODO") self.line_kp_zmin, = self.ui.canvas_2.axes.plot( self.get_kp, self.get_z_min, linestyle=":", lw=1.8, color='lightgrey' ) self.tableView.model().blockSignals(False) self.ui.canvas_2.figure.tight_layout() self.ui.canvas_2.figure.canvas.draw_idle() self.ui.toolbar_2.update() def update_graphic_1(self): self.tableView.model().blockSignals(True) for ind in range(self.model.rowCount()): self.line_xy[ind][0].set_data( self._reach.get_x_profile_i(ind), self._reach.get_y_profile_i(ind) ) for i in range(len(self.line_ld_1)): self.line_ld_1[i].set_data( [x[i] for x in self.get_x_complete_list_ld], [y[i] for y in self.get_y_complete_list_ld] ) self.tableView.model().blockSignals(False) self.ui.canvas_1.figure.canvas.draw_idle() def update_graphic_2(self): self.tableView.model().blockSignals(True) get_kp = self._reach.get_kp() get_z_min = self._reach.get_z_min() get_z_max = self._reach.get_z_max() self.line_kp_zmin.set_data(get_kp, get_z_min) self.line_kp_zmin_zmax.remove() self.line_kp_zmin_zmax = self.ui.canvas_2.axes.vlines( x=get_kp, ymin=get_z_min, ymax=get_z_max, color='r', lw=1. ) try: for i in range(len(self.line_kp_zld)): self.line_kp_zld[i][0].set_data( get_kp, self.model.z_complete_guideline()[i] ) except: print("TODO") self.tableView.model().blockSignals(False) self.ui.canvas_2.axes.autoscale_view(True, True, True) self.ui.canvas_2.figure.canvas.draw_idle() def graphic_3(self): self.tableView.model().blockSignals(True) selected_profile = 0 station = self._reach.get_station(selected_profile) # L'abscisse en travers station_plus_1 = self._reach.get_station(selected_profile + 1) elevation = self._reach.get_z_profile_i(selected_profile) elevation_i_plus_1 = self._reach.get_z_profile_i(selected_profile + 1) ld = self._reach.get_ld_profile_i(selected_profile) self.ui.canvas_3.axes.cla() self.ui.canvas_3.axes.grid(color='grey', linestyle='--', linewidth=0.5) self.ui.canvas_3.axes.set_xlabel( _translate("MainWindow_reach", "Abscisse en travers (m)"), color='green', fontsize=12 ) self.ui.canvas_3.axes.set_ylabel( _translate("MainWindow_reach", "Cote (m)"), color='green', fontsize=12 ) self.ui.canvas_3.figure.tight_layout() label_profile_i_minus_1 = _translate("MainWindow_reach", "Profil précédent") label_profile_i = _translate("MainWindow_reach", "Profil sélectionné") label_profile_i_plus_1 = _translate("MainWindow_reach", "Profil suivant") color_profile_i_minus_1 = "k" # 'grey' color_profile_i = 'b' color_profile_i_plus_1 = 'm' self.profile_i_minus_1, = self.ui.canvas_3.axes.plot( [], [], label=label_profile_i_minus_1, lw=1.8, linestyle='--', color=color_profile_i_minus_1 ) self.profile_i, = self.ui.canvas_3.axes.plot( station, elevation, label=label_profile_i, color=color_profile_i, lw=1.8 ) self.profile_i_plus_1, = self.ui.canvas_3.axes.plot( station_plus_1, elevation_i_plus_1, label=label_profile_i_plus_1, color=color_profile_i_plus_1, lw=1.6, linestyle='--' ) self.annotation_3 = [] self.complete_list_ld = self._reach.get_complete_list_ld() self.incomplete_list_ld = self._reach.get_incomplete_list_ld() line_2d = [[line_2D] for line_2D in self.line_ld_1] self.color_complete_ld = self.get_line_ld_colors(line_2d) self.color_incomplete_ld = 2 * ["#000000"] x_ld_complete = [] y_ld_complete = [] color_scat_complete_ld = [] x_ld_incomplete = [] y_ld_incomplete = [] color_scat_incomplete_ld = [] for i, txt in enumerate(list(ld)): if txt.strip() in self.complete_list_ld: annotation_3 = self.ui.canvas_3.axes.annotate( txt, (station[i], elevation[i]), horizontalalignment='left', verticalalignment='top', annotation_clip=True, fontsize=10, color=self.color_complete_ld[ self.complete_list_ld.index(txt) ] ) annotation_3.set_position((station[i] + 0., elevation[i] + 0.)) self.annotation_3.append(annotation_3) x_ld_complete.append(station[i]) y_ld_complete.append(elevation[i]) color_scat_complete_ld.append(self.color_complete_ld[self.complete_list_ld.index(txt)]) elif txt.strip() in self.incomplete_list_ld: annotate = self.ui.canvas_3.axes.annotate( txt, (station[i], elevation[i]), horizontalalignment='left', verticalalignment='top', annotation_clip=True, fontsize=11, color=self.color_incomplete_ld[ self.incomplete_list_ld.index(txt) ], size=10 ) self.annotation_3.append(annotate) x_ld_incomplete.append(station[i]) y_ld_incomplete.append(elevation[i]) color_scat_incomplete_ld.append( self.color_incomplete_ld[self.incomplete_list_ld.index(txt)] ) self.tableView.model().blockSignals(False) self.ui.canvas_3.axes.legend(fancybox=True, shadow=True, fontsize=8) self.ui.canvas_3.figure.tight_layout() self.ui.canvas_3.figure.canvas.draw_idle() self.ui.toolbar_3.update() def update_annotate_3(self, ind: int): self.tableView.model().blockSignals(True) for a in self.annotation_3: a.remove() self.annotation_3[:] = [] x = self.get_station(ind) y = self.get_elevation(ind) ld = self._reach.get_ld_profile_i(ind) get_complete_list_ld = self._reach.get_complete_list_ld() get_incomplete_list_ld = self._reach.get_incomplete_list_ld() try: x_ld_complete = [] color_scat_complete_ld = [] x_ld_incomplete = [] color_scat_incomplete_ld = [] for i, txt in enumerate(list(ld)): if txt in get_complete_list_ld: 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_ld[ get_complete_list_ld.index(txt) ], size=10 ) self.annotation_3.append(annotate) x_ld_complete.append([x[i], y[i]]) color_scat_complete_ld.append( self.color_complete_ld[self.complete_list_ld.index(txt)] ) elif txt in get_incomplete_list_ld: 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_ld[ get_incomplete_list_ld.index(txt) ], size=10 ) self.annotation_3.append(annotate) x_ld_incomplete.append([x[i], y[i]]) color_scat_incomplete_ld.append( self.color_incomplete_ld[get_incomplete_list_ld.index(txt)] ) except: print("FIXME") self.tableView.model().blockSignals(False) self.ui.canvas_3.figure.canvas.draw_idle() def get_line_ld_colors(self, line_2d): colors = [] for line in line_2d: colors.append(line[0].get_color()) return colors def get_station(self, ind: int): return self._reach.get_station(ind) def get_elevation(self, ind: int): return self._reach.get_z_profile_i(ind) def update_graphic_3(self, ind: int): self.tableView.model().blockSignals(True) selected_profile = ind print(selected_profile) if selected_profile == 0: self.profile_i_minus_1.set_data([], []) self.profile_i.set_data( self.get_station(selected_profile), self.get_elevation(selected_profile) ) self.profile_i_plus_1.set_data( self.get_station(selected_profile + 1), self.get_elevation(selected_profile + 1) ) elif selected_profile == self.model.rowCount() - 1: self.profile_i_minus_1.set_data( self.get_station(selected_profile - 1), self.get_elevation(selected_profile - 1) ) self.profile_i.set_data( self.get_station(selected_profile), self.get_elevation(selected_profile) ) self.profile_i_plus_1.set_data([], []) elif 0 < selected_profile < self.model.rowCount() - 1: self.profile_i_minus_1.set_data( self.get_station(selected_profile - 1), self.get_elevation(selected_profile - 1) ) self.profile_i.set_data( self.get_station(selected_profile), self.get_elevation(selected_profile) ) self.profile_i_plus_1.set_data( self.get_station(selected_profile + 1), self.get_elevation(selected_profile + 1) ) self.tableView.model().blockSignals(False) self.update_annotate_3(selected_profile) self.ui.canvas_3.axes.relim() self.ui.canvas_3.axes.autoscale_view() self.ui.canvas_3.figure.canvas.draw_idle() 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.get_x_profile_i(ind), self._reach.get_y_profile_i(ind)) self.plot_selected_1.set_visible(True) self.tableView.model().blockSignals(False) def select_plot_graphic_2(self, ind: int): get_kp_i = self.get_kp_i(ind) get_z_min_i = self.get_z_min_i(ind) get_z_max_i = self.get_z_max_i(ind) if 0 <= ind < self.model.rowCount(): self.plot_selected_2.set_data((get_kp_i, get_kp_i), (get_z_min_i, get_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(): t0 = time.time() self.before_plot_selected_1.set_data( self._reach.get_x_profile_i(ind), self._reach.get_y_profile_i(ind) ) 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(): self.after_plot_selected_1.set_data( self._reach.get_x_profile_i(ind), self._reach.get_y_profile_i(ind) ) 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(): t0 = time.time() get_kp_i = self.get_kp_i(ind) get_z_min_i = self.get_z_min_i(ind) get_z_max_i = self.get_z_max_i(ind) self.before_plot_selected_2.set_data( (get_kp_i, get_kp_i), (get_z_min_i, get_z_max_i) ) self.before_plot_selected_2.set_visible(True) self.ui.canvas_2.figure.canvas.draw_idle() def select_after_plot_selected_2(self, ind: int): if 0 <= ind < self.model.rowCount(): t0 = time.time() get_kp_i = self.get_kp_i(ind) get_z_min_i = self.get_z_min_i(ind) get_z_max_i = self.get_z_max_i(ind) self.after_plot_selected_2.set_data( (get_kp_i, get_kp_i), (get_z_min_i, get_z_max_i) ) self.after_plot_selected_2.set_visible(True) self.ui.canvas_2.figure.canvas.draw_idle() def select_row_profile_slider(self, ind: int = 0): if self.tableView is not None: selectionModel = self.tableView.selectionModel() index = self.tableView.model().index(ind, 0) selectionModel.select( index, QItemSelectionModel.Rows | QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Select ) self.tableView.scrollTo(index) def select_current_profile(self): self.tableView.model().blockSignals(True) if len(self.tableView.selectedIndexes()) > 0: row = self.index_selected_row self.ui.verticalSlider.setValue(row) self.select_plot_graphic_1(row) self.select_plot_graphic_2(row) if row == 0: self.before_plot_selected_1.set_visible(False) 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: 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: self.after_plot_selected_1.set_visible(False) self.select_before_plot_selected_1(row - 1) self.after_plot_selected_2.set_visible(False) self.select_before_plot_selected_2(row - 1) self.tableView.model().blockSignals(False) self.update_graphic_3(row) self.ui.canvas_1.figure.canvas.draw_idle() self.ui.canvas_2.figure.canvas.draw_idle() def changed_slider_value(self): self.tableView.model().blockSignals(True) if self.filename is not None: self.ui.verticalSlider.setMaximum(self.model.rowCount() - 1) slider_value = self.ui.verticalSlider.value() kp = self._reach.get_kp_profile_i(slider_value) self.ui.vertical_slider_label.setText( _translate("MainWindow_reach", "Kp : ") + f"{kp}" + "\n" + _translate("MainWindow_reach", "Profil N° : ") + f"{slider_value + 1}" ) self.select_plot_graphic_1(slider_value) self.select_plot_graphic_2(slider_value) self.select_row_profile_slider(slider_value) self.tableView.model().blockSignals(False) def increment_value_slider(self): if 0 <= self.ui.verticalSlider.value() < self.model.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(): 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) else: row = self.index_selected_row self.model.insertRows(row + 1, 1) if self.filename is not None: self.graphic_1() self.graphic_2() self.select_current_profile() def delete_row(self): rows = list(set( [index.row() for index in self.tableView.selectedIndexes()] )) if len(rows) > 0: self.model.remove_rows(rows) self.update_graphic_1() self.select_current_profile() self.graphic_2() self.changed_slider_value() @property def index_selected_row(self): return [index.row() for index in self.tableView.selectedIndexes()][0] def sort_ascending(self): self.model.sort_data(True) self.select_current_profile() self.changed_slider_value() self.update_graphic_2() self.update_graphic_3(self.index_selected_row) def sort_descending(self): self.model.sort_data(False) self.select_current_profile() self.changed_slider_value() self.update_graphic_2() self.update_graphic_3(self.index_selected_row) def move_row_down(self): row = self.index_selected_row if row < self.model.rowCount() - 1: self.model.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: 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) self.after_plot_selected_1.set_visible(False) self.select_before_plot_selected_2(self.model.rowCount() - 2) self.after_plot_selected_2.set_visible(False) self.update_graphic_2() def move_row_up(self): row = self.index_selected_row if 0 < row <= self.model.rowCount() - 1: self.model.moveRowUp(row) if row == 1: self.select_after_plot_selected_1(row) self.before_plot_selected_1.set_visible(False) self.select_after_plot_selected_2(row) self.before_plot_selected_2.set_visible(False) elif row == self.model.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) self.select_after_plot_selected_2(row) else: self.select_before_plot_selected_1(row - 2) self.select_after_plot_selected_1(row) self.select_before_plot_selected_2(row - 2) self.select_after_plot_selected_2(row) self.update_graphic_2() self.update_graphic_3(row - 1) self.ui.canvas_3.axes.relim() self.ui.canvas_3.axes.autoscale_view() def handleSave(self): options = QFileDialog.Options() DEFAULT_DIRECTORY = '/home/' settings = QSettings(QSettings.IniFormat, QSettings.UserScope, 'MyOrg', ) current_dir = settings.value('current_directory', DEFAULT_DIRECTORY, type=str) options |= QFileDialog.DontUseNativeDialog filename, self.filters = QFileDialog.getSaveFileName( self, filter=_translate("MainWindow_reach", "Fichiers .ST(*.ST ou *.st)") + ";; " + _translate("MainWindow_reach", "Tous les fichiers " "(*)"), options=options ) current_dir = os.path.split(filename)[0] or DEFAULT_DIRECTORY if filename != '': self.model.export_reach(filename) def handleOpen(self): self.filename, self.filterName = QFileDialog.getOpenFileName(self) if self.filename != '': with open(self.filename, 'r') as f: reader = csv.reader(f, delimiter='\t') header = next(reader) buf = [] for row in reader: row[0] = QCheckBox("-") buf.append(row) self.model = None self.model = qtableview_reach.PandasModelEditable(buf) self.tableView.setModel(self.model) self.filename = '' def get_lignes_directrices(self): liste_lignes_directrices = [ data[1].iloc[:, 3].tolist() for data in self.model._data ] return liste_lignes_directrices @property def model_data(self): return self.model.model_data()