geometry: Profile: Continue to import.

mesh
Pierre-Antoine Rouby 2023-04-24 17:27:57 +02:00
parent a2e1208d42
commit 215b93d6ed
5 changed files with 82 additions and 100 deletions

View File

@ -1,5 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from tools import timer
from Model.Geometry.Point import Point from Model.Geometry.Point import Point
from Model.Except import NotImplementedMethodeError from Model.Except import NotImplementedMethodeError

View File

@ -352,16 +352,16 @@ class GeometryWindow(QMainWindow, WindowToolKit):
self.select_current_profile() self.select_current_profile()
self.changed_slider_value() self.changed_slider_value()
def move_row_down(self):
row = self.index_selected_row()
self._tablemodel.move_row_down(row)
self.select_current_profile()
def move_row_up(self): def move_row_up(self):
row = self.index_selected_row() row = self.index_selected_row()
self._tablemodel.move_row_up(row) self._tablemodel.move_row_up(row)
self.select_current_profile() self.select_current_profile()
def move_row_down(self):
row = self.index_selected_row()
self._tablemodel.move_row_down(row)
self.select_current_profile()
def copy(self): def copy(self):
rows = self.tableView\ rows = self.tableView\
.selectionModel()\ .selectionModel()\

View File

@ -83,7 +83,7 @@ class DelCommand(QUndoCommand):
self._profile.delete(row) self._profile.delete(row)
class SortCommand(QUndoCommand): class SortCommand(QUndoCommand):
def __init__(self, profile, column _reverse): def __init__(self, profile, column, _reverse):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._profile = profile self._profile = profile

View File

@ -5,6 +5,8 @@ import sys
import csv import csv
from time import time from time import time
from tools import trace, timer
from PyQt5 import QtWidgets, QtGui from PyQt5 import QtWidgets, QtGui
from PyQt5.QtCore import QModelIndex, Qt, QEvent, QCoreApplication from PyQt5.QtCore import QModelIndex, Qt, QEvent, QCoreApplication
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QCheckBox from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QCheckBox
@ -37,7 +39,6 @@ class ProfileWindow(QMainWindow):
self.graph() self.graph()
self._model.dataChanged.connect(self.graph) self._model.dataChanged.connect(self.graph)
self.filters = "CSV files (*.csv)"
self.fileName = None self.fileName = None
self.ui.tableView.installEventFilter(self) self.ui.tableView.installEventFilter(self)
@ -86,27 +87,30 @@ class ProfileWindow(QMainWindow):
self.ui.btn_reset.clicked.connect(self.go_back_to_initial_state) self.ui.btn_reset.clicked.connect(self.go_back_to_initial_state)
def setup_model(self): def setup_model(self):
self._model = qtableview_profile.PandasModelEditable(self._profile) self._model = PandasModelEditable(self._profile)
self._last_saved_model_data = copy.deepcopy(self._model.model_data) self._last_saved_model_data = copy.deepcopy(self._model.model_data)
self.__initial_model_data = copy.deepcopy(self._model.model_data) self.__initial_model_data = copy.deepcopy(self._model.model_data)
self.ui.tableView.setModel(self._model) self.ui.tableView.setModel(self._model)
self.ui.tableView.setItemDelegate(qtableview_profile.Delegate()) self.ui.tableView.setItemDelegate(Delegate())
@timer
def graph(self): def graph(self):
""" """
Returns: Le tracé de la cote z en fonction de l'abscisse (calculée). Returns: Le tracé de la cote z en fonction de l'abscisse (calculée).
""" """
x = self._model.station # abscisse en travers x = self._profile.get_station()
y = self._model.z # cote z y = self._profile.z()
ld = self._model.name # nom des points gl = self._profile.name()
x_carto = self._model.x # x 'cartographique' x_carto = self._profile.x()
y_carto = self._model.y # y 'cartographique' y_carto = self._profile.y()
if len(self._model.x) >= 3 and len(self._model.y) >= 3 and len(self._model.station) >= 3: self.ui.canvas.axes.cla()
self.ui.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5)
self.ui.canvas.axes.cla() if (len(x_carto) >= 3 and
self.ui.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5) len(y_carto) >= 3 and
len(x) >= 3):
self.profile_line2D, = self.ui.canvas.axes.plot( self.profile_line2D, = self.ui.canvas.axes.plot(
x, y, color='r', lw=1.5, markersize=7, marker='+', x, y, color='r', lw=1.5, markersize=7, marker='+',
picker=30 picker=30
@ -114,8 +118,7 @@ class ProfileWindow(QMainWindow):
self.ui.canvas.axes.set_xlabel( self.ui.canvas.axes.set_xlabel(
_translate("MainWindowProfile", _translate("MainWindowProfile",
"Abscisse en travers (m)"), "Abscisse en travers (m)"),
color='black', color='black', fontsize=10
fontsize=10
) )
self.ui.canvas.axes.set_ylabel( self.ui.canvas.axes.set_ylabel(
_translate("MainWindowProfile", "Cote (m)"), _translate("MainWindowProfile", "Cote (m)"),
@ -124,7 +127,7 @@ class ProfileWindow(QMainWindow):
# Add label on graph # Add label on graph
self.annotation = [] self.annotation = []
for i, txt in enumerate(list(ld)): for i, txt in enumerate(list(gl)):
annotation = self.ui.canvas.axes.annotate( annotation = self.ui.canvas.axes.annotate(
txt, (x[i], y[i]), txt, (x[i], y[i]),
horizontalalignment='left', horizontalalignment='left',
@ -136,11 +139,10 @@ class ProfileWindow(QMainWindow):
annotation.set_color("black") annotation.set_color("black")
self.annotation.append(annotation) self.annotation.append(annotation)
al = 8. # arrow length in points al = 8.
arrowprops = dict( arrowprops = dict(
clip_on=True, # plotting outside axes on purpose clip_on=True,
# frac=1., # make end arrowhead the whole size of arrow headwidth=5.,
headwidth=5., # in points
facecolor='k' facecolor='k'
) )
kwargs = dict( kwargs = dict(
@ -150,120 +152,100 @@ class ProfileWindow(QMainWindow):
) )
self.ui.canvas.axes.annotate("", (1, 0), xytext=(-al, 0), **kwargs) self.ui.canvas.axes.annotate("", (1, 0), xytext=(-al, 0), **kwargs)
self.ui.canvas.axes.annotate("", (0, 1), xytext=(0, -al), **kwargs) # left spin arrow self.ui.canvas.axes.annotate("", (0, 1), xytext=(0, -al), **kwargs)
self.ui.canvas.axes.spines[['top', 'right']].set_color('none') self.ui.canvas.axes.spines[['top', 'right']].set_color('none')
self.ui.canvas.axes.yaxis.tick_left() self.ui.canvas.axes.yaxis.tick_left()
self.ui.canvas.axes.xaxis.tick_bottom() self.ui.canvas.axes.xaxis.tick_bottom()
self.ui.canvas.axes.set_facecolor('#F9F9F9') # '#E0FFFF') self.ui.canvas.axes.set_facecolor('#F9F9F9')
self.ui.canvas.figure.patch.set_facecolor('white') self.ui.canvas.figure.patch.set_facecolor('white')
try: try:
self.onpick_event = OnpickEvent(self.ui.canvas.axes, x, y, x_carto, y_carto, self.ui.tableView) self.onpick_event = OnpickEvent(
self.ui.canvas.figure.canvas.mpl_connect('pick_event', self.onpick_event.onpick) self.ui.canvas.axes,
x, y, x_carto, y_carto,
self.ui.tableView
)
self.ui.canvas\
.figure\
.canvas\
.mpl_connect('pick_event', self.onpick_event.onpick)
self.onclick_event = OnpickEvent(self.ui.canvas.axes, x, y, x_carto, y_carto, self.ui.tableView) self.onclick_event = OnpickEvent(
self.ui.canvas.figure.canvas.mpl_connect('button_press_event', self.onclick_event.onclick) self.ui.canvas.axes,
x, y, x_carto, y_carto,
self.ui.tableView
)
self.ui.canvas\
.figure\
.canvas\
.mpl_connect('button_press_event', self.onclick_event.onclick)
except: except:
print("TODO") print("TODO")
self.ui.canvas.figure.tight_layout() self.ui.canvas.figure.tight_layout()
self.ui.canvas.figure.canvas.draw_idle() self.ui.canvas.figure.canvas.draw_idle()
else:
self.ui.canvas.axes.cla()
self.ui.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5)
def insert_row(self): def insert_row(self):
if len(self.ui.tableView.selectedIndexes()) == 0: if len(self.tableView.selectedIndexes()) == 0:
self._model.insertRows(self._model.rowCount(), 1) self._tablemodel.insert_row(self._tablemodel.rowCount())
else: else:
rows = list(set([index.row() for index in self.ui.tableView.selectedIndexes()])) row = self.index_selected_row()
for row in rows: # [::-1]: self._tablemodel.insert_row(row + 1)
self._model.insertRows(row + 1, 1)
try:
self.graph()
except:
pass
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def delete_row(self): def delete_row(self):
rows = list(set([index.row() for index in self.ui.tableView.selectedIndexes()])) rows = sorted(
list(
set(
[index.row() for index in self.tableView.selectedIndexes()]
)
)
)
if len(rows) > 0: if len(rows) > 0:
self._model.remove_rows(rows) self._tablemodel.remove_rows(rows)
try:
self.graph()
except:
print("TODO")
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def sort_X_ascending(self): def sort_X_ascending(self):
self._model.sort(0, order=Qt.AscendingOrder) self._model.sort('x', order=Qt.AscendingOrder)
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def sort_X_descending(self): def sort_X_descending(self):
self._model.sort(0, order=Qt.DescendingOrder) self._model.sort('x', order=Qt.DescendingOrder)
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def sort_Y_ascending(self): def sort_Y_ascending(self):
self._model.sort(1, order=Qt.AscendingOrder) self._model.sort('y', order=Qt.AscendingOrder)
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def sort_Y_descending(self): def sort_Y_descending(self):
self._model.sort(1, order=Qt.DescendingOrder) self._model.sort('y', order=Qt.DescendingOrder)
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def move_row_down(self): def move_row_down(self):
rows = list(set([index.row() for index in self.ui.tableView.selectedIndexes()])) rows = list(
set(
[index.row() for index in self.ui.tableView.selectedIndexes()]
)
)
for row in rows: for row in rows:
if row < self._model.rowCount() - 1: if row < self._model.rowCount() - 1:
self._model.moveRowDown(row) self._model.moveRowDown(row)
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def move_row_up(self): def move_row_up(self):
rows = list(set([index.row() for index in self.ui.tableView.selectedIndexes()])) rows = list(
set(
[index.row() for index in self.ui.tableView.selectedIndexes()]
)
)
for row in rows: for row in rows:
if 0 < row: if 0 < row:
self._model.moveRowUp(row) self._model.moveRowUp(row)
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def eventFilter(self, source, event): def eventFilter(self, source, event):
if event.type() == QEvent.KeyPress: if event.type() == QEvent.KeyPress:
@ -302,9 +284,11 @@ class ProfileWindow(QMainWindow):
print(minCol) print(minCol)
print(minRow, columns) print(minRow, columns)
for index in selected: for index in selected:
self.clipboard.append((index.row() - minRow, self.clipboard.append(
index.column() - minCol, (index.row() - minRow,
index.data_frame())) index.column() - minCol,
index.data_frame())
)
def pasteSelection(self): def pasteSelection(self):
if not self.clipboard: if not self.clipboard:
@ -358,15 +342,11 @@ class ProfileWindow(QMainWindow):
print("TODO") print("TODO")
self.graph() self.graph()
self.status_change_tableview = True
self.ui.btn_check.setEnabled(True)
self.ui.btn_go_back.setEnabled(True)
self.ui.btn_reset.setEnabled(True)
def handleSave(self): def handleSave(self):
if self.fileName is None or self.fileName == '': if self.fileName is None or self.fileName == '':
self.fileName, self.filters = QFileDialog.getSaveFileName( self.fileName, self.filters = QFileDialog.getSaveFileName(
self, filter=self.filters self, filter="CSV files (*.csv)"
) )
if self.fileName != '': if self.fileName != '':
@ -405,7 +385,7 @@ class ProfileWindow(QMainWindow):
buf.append(row) buf.append(row)
self._model = None self._model = None
self._model = qtableview_profile.PandasModelEditable(buf) self._model = PandasModelEditable(buf)
self.ui.tableView.setModel(self._model) self.ui.tableView.setModel(self._model)
self.fileName = '' self.fileName = ''

View File

@ -111,7 +111,7 @@ class PandasModelEditable(QAbstractTableModel):
if orientation == Qt.Horizontal and role == Qt.DisplayRole: if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._header[section] return self._header[section]
elif orientation == Qt.Vertical and role == Qt.DisplayRole: elif orientation == Qt.Vertical and role == Qt.DisplayRole:
return return str(section + 1) return str(section + 1)
if role == Qt.ToolTipRole and section == 4: if role == Qt.ToolTipRole and section == 4:
return _translate( return _translate(