Files
nmreval/src/gui_qt/io/gracereader.py
2023-10-30 19:34:18 +01:00

119 lines
4.4 KiB
Python

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()