regex for numeric value for data from text files; closes #127

This commit is contained in:
Dominik Demuth
2023-11-05 17:11:28 +01:00
parent cb2bc78a2a
commit f956c111c2
5 changed files with 196 additions and 100 deletions

View File

@ -1,6 +1,6 @@
from __future__ import annotations
from pathlib import Path
import re
from nmreval.io.asciireader import AsciiReader
from nmreval.utils import NUMBER_RE
@ -18,6 +18,9 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
self.setupUi(self)
self.reader = None
self._matches = []
self.regex_input.setText(NUMBER_RE.pattern)
self.custom_input.setValidator(QtGui.QDoubleValidator())
self.comment_textfield = QtWidgets.QPlainTextEdit(self.header_widget)
self.comment_textfield.setReadOnly(True)
@ -46,6 +49,8 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
def __call__(self, fname, *args, **kwargs):
self.reader = AsciiReader(fname)
self.check_filename(self.regex_input.text())
if self.skip:
self.accept()
return
@ -62,8 +67,6 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
self.skippy_checkbox.setCheckState(QtCore.Qt.Unchecked)
self.skippy_checkbox.blockSignals(False)
self.check_filename(fname)
return self
def set_gui(self):
@ -145,7 +148,7 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
staggered_range = 0
except ValueError:
_ = QtWidgets.QMessageBox.information(self, 'No delays',
'Delays cannot be calculated: Not enough or wrong arguments.')
'Delays cannot be calculated: Not enough or wrong arguments.')
return
self.reader.calc_delays(start, stop, num_delays, log=self.log_checkBox.isChecked(),
@ -204,9 +207,14 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
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)
ret_dic = self.reader.export(
x=x,
y=y,
yerr=y_err,
mode=self.buttonGroup.checkedButton().text(),
col_names=col_header,
num_value=self.get_numerical_value(),
)
self.data_read.emit(ret_dic)
except ImportError as e:
@ -223,7 +231,45 @@ class QAsciiReader(QtWidgets.QDialog, Ui_ascii_reader):
def skip_next_dial(self, _: int):
self.skip = self.skippy_checkbox.isChecked()
def check_filename(self, filename: str | Path):
self.label_8.setText(str(filename.stem))
for i in NUMBER_RE.finditer(str(filename.stem)):
print(i)
@QtCore.pyqtSlot(str, name='on_regex_input_textChanged')
def check_filename(self, pattern: str = NUMBER_RE.pattern):
if self.reader is None:
return
try:
pattern = re.compile(pattern)
self.regex_input.setStyleSheet('color: rgb(0, 0, 0)')
self._matches = [m for m in pattern.finditer(str(self.reader.fname.stem))]
except re.error:
self._matches = []
if self._matches:
self.re_match_index.blockSignals(True)
self.re_match_index.setMaximum(len(self._matches))
self.re_match_index.blockSignals(False)
else:
self.regex_input.setStyleSheet('color: rgb(255, 0, 0)')
self.show_match(self.re_match_index.value())
@QtCore.pyqtSlot(int, name='on_re_match_index_valueChanged')
def show_match(self, idx: int = 0):
fname = str(self.reader.fname.stem)
if self._matches:
m = self._matches[idx-1]
self.label_8.setText(f'{fname[:m.start()]}<b>{fname[m.start():m.end()]}</b>{fname[m.end():]}')
else:
self.label_8.setText(fname)
def get_numerical_value(self):
val = 0
if self.re_button.isChecked() and self._matches:
m = self._matches[self.re_match_index.value()-1]
val = float(NUMBER_RE.search(m.group()).group().replace('p', '.'))
elif self.custom_button.isChecked():
val = float(self.custom_input.text())
return val