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 -*-
from tools import timer
from Model.Geometry.Point import Point
from Model.Except import NotImplementedMethodeError

View File

@ -352,16 +352,16 @@ class GeometryWindow(QMainWindow, WindowToolKit):
self.select_current_profile()
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):
row = self.index_selected_row()
self._tablemodel.move_row_up(row)
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):
rows = self.tableView\
.selectionModel()\

View File

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

View File

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

View File

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