Source code for pyleecan.GUI.Tools.WImport.WImportSin.WImportSin
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtWidgets import QWidget, QMessageBox, QDialog
from pandas import read_excel, ExcelFile
from .....Classes.ImportMatrixXls import ImportMatrixXls
from .....Classes.ImportMatrixVal import ImportMatrixVal
from .....GUI.Tools.WImport.WImportExcel.Ui_WImportExcel import Ui_WImportExcel
from .....GUI.Tools.WTableData.WTableData import DTableData
from os.path import isfile
import matplotlib.pyplot as plt
[docs]class WImportExcel(Ui_WImportExcel, QWidget):
"""Widget to define an ImportMatrixXls"""
import_name = "Import from Excel"
import_type = ImportMatrixXls
saveNeeded = pyqtSignal()
dataTypeChanged = pyqtSignal()
def __init__(self, parent=None, data=None, verbose_name="", expected_shape=None):
"""Initialization of the widget
Parameters
----------
data : ImportMatrixXls
Data import to define
verbose_name : str
Name of the imported data
expected_shape : list
List to enforce a shape, [None, 2] enforce 2D matrix with 2 columns
"""
QWidget.__init__(self, parent=parent)
self.setupUi(self)
if data is None or not isinstance(data, ImportMatrixXls):
self.data = ImportMatrixXls()
else:
self.data = data
self.verbose_name = verbose_name
self.expected_shape = expected_shape
# Not used yet
self.g_axe1.hide()
self.g_axe2.hide()
# Setup Path selector
self.w_file_path.is_file = True
self.w_file_path.obj = self.data
self.w_file_path.verbose_name = "Excel file path"
self.w_file_path.param_name = "file_path"
self.w_file_path.extension = "Excel File (*.xls *.xlsx)"
# Display current state of ImportMatrixXls
self.update()
# Connect the slot/signal
self.w_file_path.pathChanged.connect(self.set_sheet_list)
self.c_sheet.currentIndexChanged.connect(self.set_sheet)
self.le_range.editingFinished.connect(self.set_range)
self.b_plot.clicked.connect(self.s_plot)
self.b_tab.clicked.connect(self.s_table)
self.b_convert.clicked.connect(self.s_convert)
[docs] def update(self):
"""Fill the widget with the current value of the data"""
self.w_file_path.update()
self.set_sheet_list()
self.le_range.setText(self.data.usecols)
[docs] def set_sheet_list(self):
"""Complete the combobox with the sheet name from the Excel file"""
if is_excel_file(self.data.file_path):
# Get Sheet names
xls_file = ExcelFile(self.data.file_path)
# Disable combobox if only one sheet
if len(xls_file.sheet_names) > 1:
self.c_sheet.setEnabled(True)
else:
self.c_sheet.setEnabled(False)
self.c_sheet.blockSignals(True)
# Fill combobox
self.c_sheet.clear()
for name in xls_file.sheet_names:
self.c_sheet.addItem(name)
# Select current index
if (
self.data.sheet not in ["", None]
and self.data.sheet in xls_file.sheet_names
):
self.c_sheet.setCurrentText(self.data.sheet)
else:
self.data.sheet = xls_file.sheet_names[0]
self.c_sheet.setCurrentIndex(0)
self.c_sheet.blockSignals(False)
[docs] def set_sheet(self):
"""Change the current sheet selected"""
self.data.sheet = self.c_sheet.currentText()
[docs] def set_range(self):
"""Change the range of data selected"""
self.data.usecols = self.le_range.text()
if self.data.usecols == "":
self.data.usecols = None
[docs] def s_table(self):
"""display the data in a table"""
try:
data = self.data.get_data()
except Exception as e:
QMessageBox.critical(self, self.tr("Error"), str(e))
return
tab = DTableData(data=data)
return_code = tab.exec_()
[docs] def s_plot(self):
"""display the data in a plot"""
try:
data = self.data.get_data()
except Exception as e:
QMessageBox.critical(self, self.tr("Error"), str(e))
return
if len(data.shape) == 2 and data.shape[0] == 2:
# Data in line
fig, axes = plt.subplots()
axes.plot(data[0, :], data[1, :])
fig.show()
elif len(data.shape) == 2 and data.shape[1] == 2:
# Data in column
fig, axes = plt.subplots()
axes.plot(data[:, 0], data[:, 1])
fig.show()
[docs] def s_convert(self):
"""Convert data to ImportMatrixVal"""
try:
data = self.data.get_data()
except Exception as e:
QMessageBox.critical(self, self.tr("Error"), str(e))
return
self.data = ImportMatrixVal(value=data)
self.dataTypeChanged.emit()
[docs]def is_excel_file(file_path):
"""Check if the path is correct for an excel file"""
return (
file_path is not None
and isfile(file_path)
and (file_path[-4:] == ".xls" or file_path[-5:] == ".xlsx")
)