Aluode/PerceptionLabPortable
0
1import importlib.util2 3import numpy4 5from .. import PlotItem6from ..parametertree import Parameter7from ..Qt import QtCore8from .Exporter import Exporter9 10HAVE_HDF5 = importlib.util.find_spec("h5py") is not None11 12translate = QtCore.QCoreApplication.translate13 14__all__ = ['HDF5Exporter']15 16 17class HDF5Exporter(Exporter):18 Name = "HDF5 Export: plot (x,y)"19 windows = []20 allowCopy = False21 22 def __init__(self, item):23 Exporter.__init__(self, item)24 self.params = Parameter.create(name='params', type='group', children=[25 {'name': 'Name', 'title': translate("Exporter", 'Name'), 'type': 'str', 'value': 'Export', },26 {'name': 'columnMode', 'title': translate("Exporter", 'columnMode'), 'type': 'list',27 'limits': ['(x,y) per plot', '(x,y,y,y) for all plots'], 'value': '(x,y) per plot'},28 ])29 30 def parameters(self):31 return self.params32 33 def export(self, fileName=None):34 if not HAVE_HDF5:35 raise RuntimeError("This exporter requires the h5py package, "36 "but it was not importable.")37 38 import h5py39 40 if not isinstance(self.item, PlotItem):41 raise Exception("Must have a PlotItem selected for HDF5 export.")42 43 if fileName is None:44 self.fileSaveDialog(filter=["*.h5", "*.hdf", "*.hd5"])45 return46 dsname = self.params['Name']47 fd = h5py.File(fileName, 'a') # forces append to file... 'w' doesn't seem to "delete/overwrite"48 data = []49 50 appendAllX = self.params['columnMode'] == '(x,y) per plot'51 # Check if the arrays are ragged52 len_first = len(self.item.curves[0].getData()[0]) if self.item.curves[0] else None53 ragged = any(len(i.getData()[0]) != len_first for i in self.item.curves)54 55 if ragged:56 dgroup = fd.create_group(dsname)57 for i, c in enumerate(self.item.curves):58 d = c.getData()59 fdata = numpy.array([d[0], d[1]]).astype('double')60 cname = c.name() if c.name() is not None else str(i)61 dgroup.create_dataset(cname, data=fdata)62 else:63 for i, c in enumerate(self.item.curves):64 d = c.getData()65 if appendAllX or i == 0:66 data.append(d[0])67 data.append(d[1])68 69 fdata = numpy.array(data).astype('double')70 fd.create_dataset(dsname, data=fdata)71 72 fd.close()73 74if HAVE_HDF5:75 HDF5Exporter.register()76 