From 357fa5839b797a5cd9148209768932235143cfb2 Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Thu, 26 Jan 2023 12:52:27 +0100 Subject: [PATCH] added first try on reading back the data from the hdf5 dumps --- grum/io.py | 29 +++++++++++++++++++++++++++++ grum/mainwin.py | 29 +++++++++++++++++++++++++++-- grum/plotdesc.py | 6 +++--- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/grum/io.py b/grum/io.py index 8ebb234..5b67a48 100644 --- a/grum/io.py +++ b/grum/io.py @@ -23,4 +23,33 @@ def flatten_dict(d, parent="", sep="/"): return res +def read_dict(fn): + res = {} + + def visit(name, node): + if isinstance(node, h5py.Dataset): + data = node[()] + if isinstance(data, bytes): + data = data.decode("utf-8") + res[node.name] = data + + with h5py.File(fn, "r") as f: + f.visititems(visit) + + return unflatten_dict(res) + + +def unflatten_dict(d, sep="/"): + res = {} + for k, v in d.items(): + current = res + levels = k.split(sep) + for l in levels[1:-1]: + if l not in current: + current[l] = {} + current = current[l] + current[levels[-1]] = v + return res + + diff --git a/grum/mainwin.py b/grum/mainwin.py index cbb8f31..81de0d8 100644 --- a/grum/mainwin.py +++ b/grum/mainwin.py @@ -4,7 +4,7 @@ from PyQt5.QtWidgets import QMainWindow, QSplitter, QFileDialog from . import assets from .dictlist import DictList from .exampledata import exampledata -from .io import write_dict +from .io import write_dict, read_dict from .mdi import MDIArea, MDISubMultiPlot, MDISubPlot, MDIWindowMode from .menus import BarMenu from .plotdesc import PlotDescription @@ -44,8 +44,10 @@ class MainWindow(QMainWindow): bar = self.menuBar() self.menu_file = menu = BarMenu(bar, "&File") + menu.addAction("Open...", self.on_file_open) menu.addAction("Save as...", self.on_file_save) + shortcut(self, "Ctrl+O", self.on_file_open) shortcut(self, "Ctrl+S", self.on_file_save) self.menu_settings = menu = BarMenu(bar, "&Settings") @@ -134,11 +136,34 @@ class MainWindow(QMainWindow): data = {} for name, item in self.lst.items.items(): desc = item.value - data[name] = {k: v for k, v in desc.__dict__.items() if not k.startswith("_") and v is not None} + data[name] = {k: v for k, v in desc.__dict__.items() if not k.startswith("_") and k != "name" and v is not None} write_dict(fn, data) + def on_file_open(self): + filters = [ + "HDF5 files (*.h5)", + "All files (*)" + ] + filters = ";;".join(filters) + + fns, _chosen_filter = QFileDialog.getOpenFileNames(self, filter=filters) + if not fns: + return + + cb = self.menu_settings.checkboxes["Open new plots"] + state = cb.isChecked() + cb.setChecked(False) + + for fn in fns: + data = read_dict(fn) + for k, v in data.items(): + self.new_plot(k, v) + + cb.setChecked(state) + + # Plumbing def plot_single_item(self, item): diff --git a/grum/plotdesc.py b/grum/plotdesc.py index 0308ad5..55ab22d 100644 --- a/grum/plotdesc.py +++ b/grum/plotdesc.py @@ -1,13 +1,13 @@ class PlotDescription: - def __init__(self, name, title=None, xlabel=None, ylabel=None): + def __init__(self, name, title=None, xlabel=None, ylabel=None, xs=None, ys=None): self.name = name self.title = title self.xlabel = xlabel self.ylabel = ylabel - self.xs = [] - self.ys = [] + self.xs = [] if xs is None else list(xs) + self.ys = [] if ys is None else list(ys) @property