reworked import of text files; fixes T249
This commit is contained in:
@ -1,24 +1,27 @@
|
||||
from nmreval.io.asciireader import AsciiReader
|
||||
|
||||
from ..Qt import QtGui, QtCore, QtWidgets
|
||||
from .._py.asciidialog import Ui_ascii_reader
|
||||
from gui_qt.Qt import QtGui, QtCore, QtWidgets
|
||||
from gui_qt._py.asciidialog import Ui_ascii_reader
|
||||
|
||||
|
||||
class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
|
||||
data_read = QtCore.pyqtSignal(list)
|
||||
file_ext = ['.dat', '.txt']
|
||||
skip = False
|
||||
|
||||
def __init__(self, fname=None, parent=None):
|
||||
super().__init__(parent=parent)
|
||||
self.setupUi(self)
|
||||
|
||||
self.reader = AsciiReader(fname)
|
||||
self.reader = None
|
||||
|
||||
self.comment_textfield = QtWidgets.QPlainTextEdit(self.header_widget)
|
||||
self.comment_textfield.setReadOnly(True)
|
||||
pal = QtWidgets.QApplication.instance().palette()
|
||||
rgb = pal.color(pal.Base).getRgb()[:3]
|
||||
rgb2 = pal.color(pal.Text).getRgb()[:3]
|
||||
self.comment_textfield.setStyleSheet(f'Qdelay_textfield {{ background-color: rgb{rgb} ; color: rgb{rgb2}; }}')
|
||||
self.comment_textfield.setStyleSheet(f'background-color: rgb{rgb}; color: rgb{rgb2};')
|
||||
self.header_widget.setText('Header')
|
||||
self.header_widget.addWidget(self.comment_textfield)
|
||||
|
||||
self.ascii_table.horizontalHeader().setStretchLastSection(True)
|
||||
self.buttonbox.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.apply)
|
||||
@ -30,45 +33,42 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
|
||||
self.ascii_table.horizontalHeader().setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
|
||||
self.ascii_table.horizontalHeader().customContextMenuRequested.connect(self.ctx_table)
|
||||
|
||||
self.skip = False
|
||||
|
||||
if fname is not None:
|
||||
self.__call__(fname)
|
||||
|
||||
def __call__(self, fname, *args, **kwargs):
|
||||
self.reader = AsciiReader(fname)
|
||||
|
||||
if self.skip:
|
||||
self.accept()
|
||||
return
|
||||
|
||||
for i in [self.stag_lineEdit, self.start_lineedit, self.end_lineedit,
|
||||
self.comment_textfield, self.ascii_table, self.delay_lineedit]:
|
||||
i.clear()
|
||||
self.staggered_checkBox.setChecked(False)
|
||||
self.log_checkBox.setChecked(False)
|
||||
self.comment_textfield.show()
|
||||
|
||||
self.reader = AsciiReader(fname)
|
||||
self.set_gui()
|
||||
|
||||
if QAsciiReader.skip:
|
||||
self.accept()
|
||||
else:
|
||||
self.skippy_checkbox.blockSignals(True)
|
||||
self.skippy_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
||||
self.skippy_checkbox.blockSignals(False)
|
||||
self.skippy_checkbox.blockSignals(True)
|
||||
self.skippy_checkbox.setCheckState(QtCore.Qt.Unchecked)
|
||||
self.skippy_checkbox.blockSignals(False)
|
||||
|
||||
return self
|
||||
return self
|
||||
|
||||
def set_gui(self):
|
||||
for text in self.reader.header:
|
||||
self.comment_textfield.appendPlainText(text)
|
||||
|
||||
self.ascii_table.setRowCount(self.reader.shape[0])
|
||||
self.ascii_table.setColumnCount(self.reader.shape[1])
|
||||
try:
|
||||
last_header_line = self.reader.header[-1].split()
|
||||
if len(last_header_line) == self.reader.shape[1]:
|
||||
self.ascii_table.setHorizontalHeaderLabels(last_header_line)
|
||||
except IndexError:
|
||||
self.comment_textfield.hide()
|
||||
|
||||
for i, line in enumerate(self.reader.data):
|
||||
for j, field in enumerate(line):
|
||||
it = QtWidgets.QTableWidgetItem(field)
|
||||
self.ascii_table.setItem(i, j, it)
|
||||
|
||||
self.ascii_table.resizeColumnsToContents()
|
||||
if self.reader.header:
|
||||
self.line_spinBox.setMaximum(len(self.reader.header))
|
||||
else:
|
||||
self.line_spinBox.setValue(0)
|
||||
self.line_spinBox.setEnabled(False)
|
||||
self.show_preview(10)
|
||||
|
||||
if self.reader.delays is not None:
|
||||
set_string = ''.join(str(d) + '\n' for d in self.reader.delays)
|
||||
@ -82,13 +82,13 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
|
||||
y_action = QtWidgets.QAction('Set as y', self)
|
||||
y_action.triggered.connect(lambda: self.set_columns('y'))
|
||||
menu.addActions([x_action, y_action])
|
||||
if self.label_5.isVisible():
|
||||
if self.deltay_lineEdit.isEnabled():
|
||||
yerr_action = QtWidgets.QAction('Set as \u0394y', self)
|
||||
yerr_action.triggered.connect(lambda: self.set_columns('yerr'))
|
||||
menu.addAction(yerr_action)
|
||||
menu.popup(QtGui.QCursor.pos())
|
||||
|
||||
def set_columns(self, mode):
|
||||
def set_columns(self, mode: str):
|
||||
cols = ' '.join([str(s.column()+1) for s in self.ascii_table.selectionModel().selectedColumns()])
|
||||
try:
|
||||
lineedit = {'x': self.x_lineedit, 'y': self.y_lineedit, 'yerr': self.deltay_lineEdit}[mode]
|
||||
@ -96,30 +96,56 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
@QtCore.pyqtSlot(int, name='on_checkBox_2_stateChanged')
|
||||
def changestaggeredrange(self, evt):
|
||||
if evt == 2:
|
||||
self.stag_lineEdit.show()
|
||||
self.stag_lineEdit.setEnabled(True)
|
||||
else:
|
||||
self.stag_lineEdit.hide()
|
||||
self.stag_lineEdit.setDisabled(True)
|
||||
@QtCore.pyqtSlot(int, name='on_preview_spinBox_valueChanged')
|
||||
def show_preview(self, line_no: int):
|
||||
preview, width = self.reader.make_preview(line_no)
|
||||
self.ascii_table.setRowCount(min(line_no, len(preview)))
|
||||
self.ascii_table.setColumnCount(width)
|
||||
|
||||
for i, line in enumerate(preview):
|
||||
for j, field in enumerate(line):
|
||||
it = QtWidgets.QTableWidgetItem(field)
|
||||
self.ascii_table.setItem(i, j, it)
|
||||
|
||||
self.ascii_table.resizeColumnsToContents()
|
||||
|
||||
@QtCore.pyqtSlot(int, name='on_column_checkBox_stateChanged')
|
||||
@QtCore.pyqtSlot(int, name='on_line_spinBox_valueChanged')
|
||||
def set_column_names(self, _):
|
||||
self.ascii_table.setHorizontalHeaderLabels(map(str, range(1, self.ascii_table.columnCount() + 1)))
|
||||
if self.column_checkBox.isChecked():
|
||||
header_line = self.reader.header[self.line_spinBox.value()-1]
|
||||
self.ascii_table.setHorizontalHeaderLabels(header_line.split())
|
||||
|
||||
@QtCore.pyqtSlot(int, name='on_staggered_checkBox_stateChanged')
|
||||
def changestaggeredrange(self, state: int):
|
||||
self.stag_lineEdit.setEnabled(state)
|
||||
|
||||
@QtCore.pyqtSlot(name='on_pushButton_clicked')
|
||||
def calc_delays(self):
|
||||
self.reader.calc_delays(float(self.start_lineedit.text()), float(self.end_lineedit.text()),
|
||||
int(self.delay_lineedit.text()), log=self.log_checkBox.isChecked(),
|
||||
stagg=self.staggered_checkBox.isChecked(), stag_size=int(self.stag_lineEdit.text()))
|
||||
try:
|
||||
start = float(self.start_lineedit.text())
|
||||
stop = float(self.end_lineedit.text())
|
||||
num_delays = int(self.delay_lineedit.text())
|
||||
is_staggered = self.staggered_checkBox.isChecked()
|
||||
if is_staggered:
|
||||
staggered_range = int(self.stag_lineEdit.text())
|
||||
else:
|
||||
staggered_range = 0
|
||||
except ValueError:
|
||||
_ = QtWidgets.QMessageBox.information(self, 'No delays',
|
||||
'Delays cannot be calculated: Not enough or wrong arguments.')
|
||||
return
|
||||
|
||||
set_string = ''.join(str(d) + '\n' for d in self.reader.delays)
|
||||
self.delay_textfield.setPlainText(set_string)
|
||||
self.reader.calc_delays(start, stop, num_delays, log=self.log_checkBox.isChecked(),
|
||||
stagg=staggered_range, stag_size=staggered_range)
|
||||
|
||||
def update_header(self, text, comment='#'):
|
||||
text = text.replace(comment, '').lstrip().rstrip()
|
||||
self.comment_textfield.appendPlainText(text)
|
||||
if self.reader.delays is not None:
|
||||
set_string = ''.join(str(d) + '\n' for d in self.reader.delays)
|
||||
self.delay_textfield.setPlainText(set_string)
|
||||
|
||||
@QtCore.pyqtSlot()
|
||||
def on_delay_textfield_textChanged(self):
|
||||
@QtCore.pyqtSlot(name='on_delay_textfield_textChanged')
|
||||
def delays_changed(self):
|
||||
new_delays = str(self.delay_textfield.toPlainText()).rstrip('\n').split('\n')
|
||||
self.delay_lineedit.setText(str(len(new_delays)))
|
||||
if new_delays[0] == '':
|
||||
@ -139,48 +165,57 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
|
||||
|
||||
def apply(self):
|
||||
# default row for x is the first row, it will be superseded if an integer number is given.
|
||||
|
||||
try:
|
||||
x = [int(self.x_lineedit.text())-1]
|
||||
x = int(self.x_lineedit.text())-1
|
||||
print(x)
|
||||
except ValueError:
|
||||
x = None
|
||||
|
||||
try:
|
||||
y = [int(t)-1 for t in str(self.y_lineedit.text()).split(' ')]
|
||||
y = [int(t)-1 for t in self.y_lineedit.text().split(' ')]
|
||||
except ValueError:
|
||||
y = None
|
||||
|
||||
try:
|
||||
y_err = [int(t)-1 for t in str(self.deltay_lineEdit.text()).split(' ')]
|
||||
y_err = [int(t)-1 for t in self.deltay_lineEdit.text().split(' ')]
|
||||
except ValueError:
|
||||
y_err = None
|
||||
|
||||
ret_dic = self.reader.export(xidx=x, yidx=y, yerridx=y_err,
|
||||
mode=self.buttonGroup.checkedButton().text())
|
||||
col_header = None
|
||||
if self.column_checkBox.isChecked():
|
||||
col_header = [self.ascii_table.horizontalHeaderItem(i).text() for i in range(self.ascii_table.columnCount())]
|
||||
|
||||
self.data_read.emit(ret_dic)
|
||||
if y is not None and col_header is not None:
|
||||
col_header = [col_header[i] for i in range(len(col_header)) if i in y]
|
||||
|
||||
try:
|
||||
ret_dic = self.reader.export(x=x, y=y, yerr=y_err,
|
||||
mode=self.buttonGroup.checkedButton().text(),
|
||||
col_names=col_header)
|
||||
self.data_read.emit(ret_dic)
|
||||
|
||||
except Exception as e:
|
||||
_ = QtWidgets.QMessageBox.information(self, 'Reading failed',
|
||||
f'Import data failed with {e.args}')
|
||||
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def _update_dic(key, value, old_dic):
|
||||
old_dic_keys = list(old_dic.keys())
|
||||
if key in old_dic_keys:
|
||||
counter = 0
|
||||
replace_key = key + str(counter)
|
||||
while replace_key in old_dic_keys:
|
||||
counter += 1
|
||||
replace_key = key + str(counter)
|
||||
else:
|
||||
replace_key = key
|
||||
old_dic[replace_key] = value
|
||||
|
||||
@QtCore.pyqtSlot(int, name='on_buttonGroup_buttonClicked')
|
||||
def show_error(self, val):
|
||||
if val == -2:
|
||||
self.widget.show()
|
||||
else:
|
||||
self.deltay_lineEdit.setText('')
|
||||
self.widget.hide()
|
||||
def show_error(self, val: int):
|
||||
self.deltay_lineEdit.setEnabled(val == -3)
|
||||
|
||||
@QtCore.pyqtSlot(int, name='on_skippy_checkbox_stateChanged')
|
||||
def skip_next_dial(self, _):
|
||||
QAsciiReader.skip = self.skippy_checkbox.isChecked()
|
||||
def skip_next_dial(self, _: int):
|
||||
print('skippy das buschkänguru', _)
|
||||
self.skip = self.skippy_checkbox.isChecked()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QtWidgets.QApplication([])
|
||||
# w = QAsciiReader(fname='/autohome/dominik/nmreval/testdata/T_1_omega/250.dat')
|
||||
# w = QAsciiReader(fname='/autohome/dominik/nmreval/testdata/alter_fit_fitparameter.dat')
|
||||
w = QAsciiReader(fname='/autohome/dominik/nmreval/testdata/alter_fit_fitparameter2.dat')
|
||||
# w = QAsciiReader(fname='/autohome/dominik/nmreval/testdata/alter_fit_fit_200.dat')
|
||||
|
||||
w.show()
|
||||
app.exec()
|
||||
|
@ -55,16 +55,15 @@ class QFileReader(QtCore.QObject):
|
||||
else:
|
||||
raise ValueError(f'Unknown type for file {f}')
|
||||
|
||||
if r(f) is not None:
|
||||
try:
|
||||
# If QAsciiReader.skip = True it accepts automatically and returns None
|
||||
r(f).exec()
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
self.data_read.emit(self.data)
|
||||
|
||||
try:
|
||||
self.reader['txt'].skip = False
|
||||
except KeyError:
|
||||
pass
|
||||
self.reader['txt'].skip = False
|
||||
|
||||
return self.data
|
||||
|
||||
|
Reference in New Issue
Block a user