From 3a0f2bd0d60b0567b466af2433e93be2220e757b Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Wed, 25 Jan 2023 21:59:14 +0100 Subject: [PATCH] added first try for dumping the data to hdf5 files --- grum/io.py | 23 +++++++++++++++++++++++ grum/mainwin.py | 27 ++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 grum/io.py diff --git a/grum/io.py b/grum/io.py new file mode 100644 index 0000000..2ebb8d7 --- /dev/null +++ b/grum/io.py @@ -0,0 +1,23 @@ +import h5py + + +def write_dict(fn, d): + d = flatten_dict(d) + with h5py.File(fn, "w") as f: + for k, v in d.items(): + f[k] = v + + +def flatten_dict(d, parent="", sep="/"): + res = {} + for key, value in d.items(): + abs_key = parent + sep + key + if isinstance(value, dict): + deeper = flatten_dict(value, parent=abs_key, sep=sep) + res.update(deeper) + else: + res[abs_key] = value + return res + + + diff --git a/grum/mainwin.py b/grum/mainwin.py index f5cfcd7..c38f9a9 100644 --- a/grum/mainwin.py +++ b/grum/mainwin.py @@ -1,9 +1,10 @@ from PyQt5.QtCore import Qt, pyqtSignal -from PyQt5.QtWidgets import QMainWindow, QSplitter +from PyQt5.QtWidgets import QMainWindow, QSplitter, QFileDialog from . import assets from .dictlist import DictList from .exampledata import exampledata +from .io import write_dict from .mdi import MDIArea, MDISubMultiPlot, MDISubPlot, MDIWindowMode from .menus import BarMenu from .plotdesc import PlotDescription @@ -42,6 +43,11 @@ class MainWindow(QMainWindow): bar = self.menuBar() + self.menu_file = menu = BarMenu(bar, "&File") + menu.addAction("Save as...", self.on_save) + + shortcut(self, "Ctrl+S", self.on_save) + self.menu_settings = menu = BarMenu(bar, "&Settings") menu.addCheckbox("Open new plots", state=True) @@ -114,6 +120,25 @@ class MainWindow(QMainWindow): self.lst.set_alarm_for_selected(True) + def on_save(self): + filters = [ + "HDF5 files (*.h5)", + "All files (*)" + ] + filters = ";;".join(filters) + + fn, _chosen_filter = QFileDialog.getSaveFileName(self, filter=filters) + if not fn: + return + + data = {} + for name, item in self.lst.items.items(): + desc = item.value + data[name] = dict(xs=desc.xs, ys=desc.ys) + + write_dict(fn, data) + + # Plumbing def plot_single_item(self, item):