mirror of https://gitlab.com/pamhyr/pamhyr2
geometry: Profile: Fix table station display.
parent
c59c924f58
commit
c6fd041e0c
|
|
@ -1,7 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from math import dist
|
from math import dist
|
||||||
from pandas import isna
|
import numpy as np
|
||||||
|
|
||||||
from Model.Geometry.Point import Point
|
from Model.Geometry.Point import Point
|
||||||
|
|
||||||
|
|
@ -46,9 +46,9 @@ class PointXYZ(Point):
|
||||||
Returns:
|
Returns:
|
||||||
True if at least one coordinate is as np.nan
|
True if at least one coordinate is as np.nan
|
||||||
"""
|
"""
|
||||||
return (isna(self.x) or
|
return (np.isnan(self.x) or
|
||||||
isna(self.y) or
|
np.isnan(self.y) or
|
||||||
isna(self.z))
|
np.isnan(self.z))
|
||||||
|
|
||||||
def dist(self, p2):
|
def dist(self, p2):
|
||||||
return PointXYZ.distance(self, p2)
|
return PointXYZ.distance(self, p2)
|
||||||
|
|
|
||||||
|
|
@ -40,17 +40,6 @@ class ProfileXYZ(Profile):
|
||||||
data=[[p.x, p.y, p.z, p.name] for p in self._points])
|
data=[[p.x, p.y, p.z, p.name] for p in self._points])
|
||||||
return f"\nProfileXYZ : {self.name}\n{df}"
|
return f"\nProfileXYZ : {self.name}\n{df}"
|
||||||
|
|
||||||
@property
|
|
||||||
def header(self):
|
|
||||||
"""
|
|
||||||
Returns:
|
|
||||||
Profile header.
|
|
||||||
"""
|
|
||||||
return np.array(
|
|
||||||
[self._num, self._code1, self._code2,
|
|
||||||
self.nb_points(), self._kp, self._name]
|
|
||||||
)
|
|
||||||
|
|
||||||
def x(self):
|
def x(self):
|
||||||
return [point.x for point in self._points]
|
return [point.x for point in self._points]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ from View.Geometry.PlotAC import PlotAC
|
||||||
|
|
||||||
from View.ASubWindow import WindowToolKit
|
from View.ASubWindow import WindowToolKit
|
||||||
from View.Geometry.mainwindow_ui_reach import Ui_MainWindow
|
from View.Geometry.mainwindow_ui_reach import Ui_MainWindow
|
||||||
from View.Geometry import qtableview_reach
|
from View.Geometry.qtableview_reach import *
|
||||||
from View.Geometry.Profile.ProfileWindow import ProfileWindow
|
from View.Geometry.Profile.ProfileWindow import ProfileWindow
|
||||||
|
|
||||||
_translate = QCoreApplication.translate
|
_translate = QCoreApplication.translate
|
||||||
|
|
@ -71,13 +71,13 @@ class GeometryWindow(QMainWindow, WindowToolKit):
|
||||||
self.paste_sc = QShortcut(QKeySequence.Paste, self)
|
self.paste_sc = QShortcut(QKeySequence.Paste, self)
|
||||||
|
|
||||||
def setup_model(self):
|
def setup_model(self):
|
||||||
self._tablemodel = qtableview_reach.PandasModelEditable(
|
self._tablemodel = PandasModelEditable(
|
||||||
headers = self.ui.tableView_header,
|
headers = self.ui.tableView_header,
|
||||||
reach = self._reach,
|
reach = self._reach,
|
||||||
undo = self._undo_stack
|
undo = self._undo_stack
|
||||||
)
|
)
|
||||||
self.tableView.setModel(self._tablemodel)
|
self.tableView.setModel(self._tablemodel)
|
||||||
self.tableView.setItemDelegate(qtableview_reach.Delegate())
|
self.tableView.setItemDelegate(Delegate())
|
||||||
|
|
||||||
def setup_plots(self):
|
def setup_plots(self):
|
||||||
if self._reach.number_profiles != 0:
|
if self._reach.number_profiles != 0:
|
||||||
|
|
@ -435,6 +435,6 @@ class GeometryWindow(QMainWindow, WindowToolKit):
|
||||||
buf.append(row)
|
buf.append(row)
|
||||||
|
|
||||||
self._tablemodel = None
|
self._tablemodel = None
|
||||||
self._tablemodel = qtableview_reach.PandasModelEditable(buf)
|
self._tablemodel = PandasModelEditable(buf)
|
||||||
self.tableView.setModel(self._tablemodel)
|
self.tableView.setModel(self._tablemodel)
|
||||||
filename = ''
|
filename = ''
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,16 @@ from time import time
|
||||||
|
|
||||||
from tools import trace, timer
|
from tools import trace, timer
|
||||||
|
|
||||||
from PyQt5 import QtWidgets, QtGui
|
from PyQt5.QtGui import (
|
||||||
from PyQt5.QtCore import QModelIndex, Qt, QEvent, QCoreApplication
|
QKeySequence,
|
||||||
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QCheckBox
|
)
|
||||||
|
from PyQt5.QtCore import (
|
||||||
|
QModelIndex, Qt, QEvent, QCoreApplication
|
||||||
|
)
|
||||||
|
from PyQt5.QtWidgets import (
|
||||||
|
QApplication, QMainWindow, QFileDialog, QCheckBox,
|
||||||
|
QUndoStack, QShortcut,
|
||||||
|
)
|
||||||
|
|
||||||
from View.Geometry.Profile.mainwindow_ui_profile import Ui_MainWindow
|
from View.Geometry.Profile.mainwindow_ui_profile import Ui_MainWindow
|
||||||
|
|
||||||
|
|
@ -34,6 +41,7 @@ class ProfileWindow(QMainWindow):
|
||||||
self._model = None
|
self._model = None
|
||||||
|
|
||||||
self.setup_window()
|
self.setup_window()
|
||||||
|
self.setup_sc()
|
||||||
self.setup_model()
|
self.setup_model()
|
||||||
self.setup_connections()
|
self.setup_connections()
|
||||||
self.plot()
|
self.plot()
|
||||||
|
|
@ -64,6 +72,23 @@ class ProfileWindow(QMainWindow):
|
||||||
f"{name} ({self._profile.kp})"
|
f"{name} ({self._profile.kp})"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def setup_sc(self):
|
||||||
|
self._undo_stack = QUndoStack()
|
||||||
|
|
||||||
|
self.undo_sc = QShortcut(QKeySequence.Undo, self)
|
||||||
|
self.redo_sc = QShortcut(QKeySequence.Redo, self)
|
||||||
|
self.copy_sc = QShortcut(QKeySequence.Copy, self)
|
||||||
|
self.paste_sc = QShortcut(QKeySequence.Paste, self)
|
||||||
|
|
||||||
|
def setup_model(self):
|
||||||
|
self._model = PandasModelEditable(
|
||||||
|
profile = self._profile,
|
||||||
|
undo = self._undo_stack
|
||||||
|
)
|
||||||
|
|
||||||
|
self.ui.tableView.setModel(self._model)
|
||||||
|
self.ui.tableView.setItemDelegate(Delegate())
|
||||||
|
|
||||||
def setup_connections(self):
|
def setup_connections(self):
|
||||||
self.ui.btn_sort_asc_x.clicked.connect(self.sort_X_ascending)
|
self.ui.btn_sort_asc_x.clicked.connect(self.sort_X_ascending)
|
||||||
self.ui.btn_sort_desc_x.clicked.connect(self.sort_X_descending)
|
self.ui.btn_sort_desc_x.clicked.connect(self.sort_X_descending)
|
||||||
|
|
@ -80,11 +105,10 @@ class ProfileWindow(QMainWindow):
|
||||||
# self.ui.btn_go_back.clicked.connect(self.cancel_validate_changes)
|
# self.ui.btn_go_back.clicked.connect(self.cancel_validate_changes)
|
||||||
# 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):
|
self.undo_sc.activated.connect(self.undo)
|
||||||
self._model = PandasModelEditable(self._profile)
|
self.redo_sc.activated.connect(self.redo)
|
||||||
|
self.copy_sc.activated.connect(self.copy)
|
||||||
self.ui.tableView.setModel(self._model)
|
self.paste_sc.activated.connect(self.paste)
|
||||||
self.ui.tableView.setItemDelegate(Delegate())
|
|
||||||
|
|
||||||
def plot(self):
|
def plot(self):
|
||||||
self.ui.tableView.model().blockSignals(True)
|
self.ui.tableView.model().blockSignals(True)
|
||||||
|
|
@ -169,6 +193,37 @@ class ProfileWindow(QMainWindow):
|
||||||
|
|
||||||
self.update_plot()
|
self.update_plot()
|
||||||
|
|
||||||
|
def copy(self):
|
||||||
|
rows = self.tableView\
|
||||||
|
.selectionModel()\
|
||||||
|
.selectedRows()
|
||||||
|
|
||||||
|
self._clipboard = []
|
||||||
|
|
||||||
|
for row in rows:
|
||||||
|
self._clipboard.append(
|
||||||
|
deepcopy(
|
||||||
|
self._reach.profile(row.row())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def paste(self):
|
||||||
|
row = self.index_selected_row()
|
||||||
|
self._tablemodel.paste(row, self._clipboard)
|
||||||
|
self.select_current_profile()
|
||||||
|
|
||||||
|
def undo(self):
|
||||||
|
self._tablemodel.undo()
|
||||||
|
self.select_current_profile()
|
||||||
|
self.update_plot_xy()
|
||||||
|
self.update_plot_kpc()
|
||||||
|
|
||||||
|
def redo(self):
|
||||||
|
self._tablemodel.redo()
|
||||||
|
self.select_current_profile()
|
||||||
|
self.update_plot_xy()
|
||||||
|
self.update_plot_kpc()
|
||||||
|
|
||||||
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(
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
|
||||||
from PyQt5.QtGui import QFont
|
from PyQt5.QtGui import QFont
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QMessageBox
|
from PyQt5.QtWidgets import QMessageBox
|
||||||
|
|
@ -16,20 +15,20 @@ _translate = QCoreApplication.translate
|
||||||
|
|
||||||
|
|
||||||
class PandasModelEditable(QAbstractTableModel):
|
class PandasModelEditable(QAbstractTableModel):
|
||||||
def __init__(self, profile: ProfileXYZ, table_header=None, undo=None):
|
def __init__(self, profile: ProfileXYZ, header=None, undo=None):
|
||||||
QAbstractTableModel.__init__(self)
|
QAbstractTableModel.__init__(self)
|
||||||
|
|
||||||
self._undo_stack = undo
|
self._undo_stack = undo
|
||||||
self._profile = profile
|
self._profile = profile
|
||||||
|
|
||||||
if table_header is None:
|
if header is None:
|
||||||
self._header = [
|
self._header = [
|
||||||
"X (m)", "Y (m)", "Z (m)",
|
"X (m)", "Y (m)", "Z (m)",
|
||||||
_translate("MainWindowProfile", "Nom"),
|
_translate("MainWindowProfile", "Nom"),
|
||||||
_translate("MainWindowProfile", "Abs en travers (m)")
|
_translate("MainWindowProfile", "Abs en travers (m)")
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
self._header = table_header
|
self._header = header
|
||||||
|
|
||||||
def rowCount(self, parent=QModelIndex()):
|
def rowCount(self, parent=QModelIndex()):
|
||||||
return self._profile.number_points
|
return self._profile.number_points
|
||||||
|
|
@ -51,11 +50,13 @@ class PandasModelEditable(QAbstractTableModel):
|
||||||
elif index.column() == 3:
|
elif index.column() == 3:
|
||||||
value = self._profile.point(index.row()).name
|
value = self._profile.point(index.row()).name
|
||||||
elif index.column() == 4:
|
elif index.column() == 4:
|
||||||
value = self._profile.get_station()
|
value = self._profile.get_station()[index.row()]
|
||||||
|
|
||||||
if 0 <= index.column() < 3:
|
if 0 <= index.column() < 3:
|
||||||
return f"{value:.4f}"
|
return f"{value:.4f}"
|
||||||
elif index.column() == 4:
|
elif index.column() == 4:
|
||||||
|
if np.isnan(value):
|
||||||
|
return "-"
|
||||||
return f"{value:.3f}"
|
return f"{value:.3f}"
|
||||||
|
|
||||||
return f"{value}"
|
return f"{value}"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue