faef56c3e7
* py3k: Remove reduce calls. * py3k: Remove compatibility sortList function. Sorting by key has existed since Python 2.4. * Remove unnecessary sys.path manipulation. This file doesn't have any __main__ code to run anyway. * Use context manager
85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
from ..Qt import QtGui, QtCore
|
|
from .Exporter import Exporter
|
|
from ..parametertree import Parameter
|
|
from .. import PlotItem
|
|
|
|
__all__ = ['CSVExporter']
|
|
|
|
|
|
class CSVExporter(Exporter):
|
|
Name = "CSV from plot data"
|
|
windows = []
|
|
def __init__(self, item):
|
|
Exporter.__init__(self, item)
|
|
self.params = Parameter(name='params', type='group', children=[
|
|
{'name': 'separator', 'type': 'list', 'value': 'comma', 'values': ['comma', 'tab']},
|
|
{'name': 'precision', 'type': 'int', 'value': 10, 'limits': [0, None]},
|
|
{'name': 'columnMode', 'type': 'list', 'values': ['(x,y) per plot', '(x,y,y,y) for all plots']}
|
|
])
|
|
|
|
def parameters(self):
|
|
return self.params
|
|
|
|
def export(self, fileName=None):
|
|
|
|
if not isinstance(self.item, PlotItem):
|
|
raise Exception("Must have a PlotItem selected for CSV export.")
|
|
|
|
if fileName is None:
|
|
self.fileSaveDialog(filter=["*.csv", "*.tsv"])
|
|
return
|
|
|
|
data = []
|
|
header = []
|
|
|
|
appendAllX = self.params['columnMode'] == '(x,y) per plot'
|
|
|
|
for i, c in enumerate(self.item.curves):
|
|
cd = c.getData()
|
|
if cd[0] is None:
|
|
continue
|
|
data.append(cd)
|
|
if hasattr(c, 'implements') and c.implements('plotData') and c.name() is not None:
|
|
name = c.name().replace('"', '""') + '_'
|
|
xName, yName = '"'+name+'x"', '"'+name+'y"'
|
|
else:
|
|
xName = 'x%04d' % i
|
|
yName = 'y%04d' % i
|
|
if appendAllX or i == 0:
|
|
header.extend([xName, yName])
|
|
else:
|
|
header.extend([yName])
|
|
|
|
if self.params['separator'] == 'comma':
|
|
sep = ','
|
|
else:
|
|
sep = '\t'
|
|
|
|
with open(fileName, 'w') as fd:
|
|
fd.write(sep.join(header) + '\n')
|
|
i = 0
|
|
numFormat = '%%0.%dg' % self.params['precision']
|
|
numRows = max([len(d[0]) for d in data])
|
|
for i in range(numRows):
|
|
for j, d in enumerate(data):
|
|
# write x value if this is the first column, or if we want
|
|
# x for all rows
|
|
if appendAllX or j == 0:
|
|
if d is not None and i < len(d[0]):
|
|
fd.write(numFormat % d[0][i] + sep)
|
|
else:
|
|
fd.write(' %s' % sep)
|
|
|
|
# write y value
|
|
if d is not None and i < len(d[1]):
|
|
fd.write(numFormat % d[1][i] + sep)
|
|
else:
|
|
fd.write(' %s' % sep)
|
|
fd.write('\n')
|
|
|
|
|
|
CSVExporter.register()
|
|
|
|
|