import numpy as np from nmreval.lib.lines import LineStyle from nmreval.lib.symbols import SymbolStyle from nmreval.data.points import Points from nmreval.io.graceeditor import GraceEditor from nmreval.utils.text import convert from ..Qt import QtCore, QtWidgets, QtGui from .._py.gracereader import Ui_Dialog class QGraceReader(QtWidgets.QDialog, Ui_Dialog): data_read = QtCore.pyqtSignal(list) file_ext = ['.agr'] def __init__(self, parent=None): super().__init__(parent=parent) self.setupUi(self) self._reader = GraceEditor() self.treeWidget.itemClicked.connect(self.show_property) self.treeWidget.installEventFilter(self) def __call__(self, fname, *args, **kwargs): self.treeWidget.clear() self.show_property(self.treeWidget.invisibleRootItem(), 0) self.read(fname) return self def eventFilter(self, src: QtCore.QObject, evt: QtCore.QEvent): if evt.type() == QtCore.QEvent.KeyPress: if evt.key() == QtCore.Qt.Key_Space: iterator = QtWidgets.QTreeWidgetItemIterator(self.treeWidget) while iterator.value(): item = iterator.value() if item.parent() is not None and item.isSelected(): item.setCheckState(0, QtCore.Qt.Checked if item.checkState(0) == QtCore.Qt.Unchecked else QtCore.Qt.Unchecked) iterator += 1 return True return super().eventFilter(src, evt) def read(self, fname): self._reader.parse(fname) for graphs in self._reader.graphs: item = QtWidgets.QTreeWidgetItem([f'Graph {graphs.idx} (Title "{graphs.get_property("title")}")']) for gset in graphs.set: ds = self._reader.dataset(graphs.idx, gset.idx) if ds is None: continue legend = gset.get_property('legend') legend_str = convert(legend, old='agr', new='str') if legend is not None else '' item_2 = QtWidgets.QTreeWidgetItem([f'Set {gset.idx} (Label: {legend_str}, ' f'shape: {ds.shape})']) item_2.setCheckState(0, QtCore.Qt.Checked) item_2.setData(0, QtCore.Qt.UserRole, (graphs.idx, gset.idx)) item.addChild(item_2) self.treeWidget.addTopLevelItem(item) self.treeWidget.expandAll() @QtCore.pyqtSlot(QtWidgets.QTreeWidgetItem, int) def show_property(self, item: QtWidgets.QTreeWidgetItem, col: int): keys = item.data(col, QtCore.Qt.UserRole) if keys is not None: cols = self._reader.colors self.tableWidget.item(0, 1).setText(SymbolStyle(self._reader.get_property(*keys, 'symbol')).name) sym_col = cols[self._reader.get_property(*keys, 'symbol fill color')][1] self.tableWidget.item(1, 1).setBackground(QtGui.QBrush(QtGui.QColor(*sym_col))) self.tableWidget.item(2, 1).setText(LineStyle(self._reader.get_property(*keys, 'line linestyle')).name) line_col = cols[self._reader.get_property(*keys, 'line color')][1] self.tableWidget.item(3, 1).setBackground(QtGui.QBrush(QtGui.QColor(*line_col))) def accept(self): data = [] iterator = QtWidgets.QTreeWidgetItemIterator(self.treeWidget, QtWidgets.QTreeWidgetItemIterator.NoChildren | QtWidgets.QTreeWidgetItemIterator.Checked) while iterator.value(): item = iterator.value() key = (item.data(0, QtCore.Qt.UserRole)) s = self._reader.dataset(*key) label = self._reader.get_property(*key, 'legend') if label is None: label = '' else: label = label.replace('"', '') label = convert(label, old='agr', new='str') sd = s.data sd = np.atleast_2d(sd) if s.type == 'xydy': data.append(Points(x=sd[:, 0], y=sd[:, 1], y_err=sd[:, 2], name=label)) else: data.append(Points(x=sd[:, 0], y=sd[:, 1], name=label)) iterator += 1 self.data_read.emit(data) self.close() def close(self): self._reader.clear() super().close()