Newer
Older
Martin Drechsler
committed
"""
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.parametertree.parameterTypes as pTypes
Martin Drechsler
committed
from pyqtgraph.parametertree import Parameter, ParameterTree
from PyQt5.QtCore import QSettings
Martin Drechsler
committed
from PyQt5.QtWidgets import QFileDialog
class BasicAcquisitonParameters(pTypes.GroupParameter):
def __init__(self, **opts):
super().__init__(**opts)
self.addChild({'name': 'Camera name', 'type': 'str', 'value': ' ', 'readonly': True})
self.addChild({'name': 'Acquisition mode', 'type': 'list', 'values': ['acq1', 'acq2']})
self.addChild({'name': 'Pixel Binning', 'type': 'list', 'values': ['1x1', '2x2', '4x4', '8x8']})
self.addChild({'name': 'Image Area', 'type': 'list', 'values': ['2048x2048', '1024x1024', '512x512', '256x256'], 'readonly': True})
self.addChild({'name': 'Exposure Time', 'type': 'float', 'value': .1, 'suffix': 's', 'siPrefix': True, 'step': 0.05})
self.addChild({'name': 'Frame Rate', 'type': 'float', 'value': 0, 'readonly': True})
self.addChild({'name': 'Pixel Readout Rate', 'type': 'list', 'values': ['100 MHz', '270 MHz']})
self.addChild({'name': 'Dynamic Range', 'type': 'list', 'values':
['12-bit (high well capacity)', '12-bit (low noise)', '16-bit (low noise & high well capacity)']}
)
self.addChild({'name': 'Readout Time', 'type': 'float', 'value': 0, 'readonly': True})
self.addChild({'name': 'Spurious Noise Filter', 'type': 'list', 'values': [True, False]})
self.addChild({'name': 'Sensor Temperature', 'type': 'float', 'value': 25, 'readonly': True})
self.addChild({'name': 'Temperature Status', 'type': 'str', 'value': '?', 'readonly': True})
Martin Drechsler
committed
self.param('Pixel Binning').sigValueChanged.connect(self.binningChanged)
def binningChanged(self):
if self.param('Pixel Binning').value() == '1x1':
self.param('Image Area').setValue('2048x2048')
if self.param('Pixel Binning').value() == '2x2':
self.param('Image Area').setValue('1024x1024')
if self.param('Pixel Binning').value() == '4x4':
self.param('Image Area').setValue('512x512')
if self.param('Pixel Binning').value() == '8x8':
self.param('Image Area').setValue('256x256')
class BasicActionParameters(pTypes.GroupParameter):
def __init__(self, **opts):
super().__init__(**opts)
Martin Drechsler
committed
self.addChild({'name': 'Update State', 'type': 'action'})
self.addChild({'name': 'Save State', 'type': 'action'})
Martin Drechsler
committed
self.addChild({'name': 'Load State', 'type': 'action'})
self.addChild({'name': 'Load State From', 'type': 'action'})
self.addChild({'name': 'Save State To', 'type': 'action'})
class CameraParameterTree(ParameterTree):
def __init__(self):
super().__init__()
self.params = [
BasicAcquisitonParameters(name = 'Basic acq parameters')]
self.p = Parameter.create(name='params', type='group', children=self.params)
Martin Drechsler
committed
#self.p.sigTreeStateChanged.connect(self.change)
self.t = ParameterTree()
self.t.setParameters(self.p, showTop=False)
self.t.setWindowTitle('Parameter Tree')
# self.p.param('Actions', 'Save State').sigActivated.connect(lambda: self.save())
# self.p.param('Actions', 'Load State').sigActivated.connect(lambda: self.load())
# self.p.param('Actions', 'Save State To').sigActivated.connect(lambda: self.save_to())
# self.p.param('Actions', 'Load State From').sigActivated.connect(lambda: self.load_from())
# self.p.param('Actions', 'Update State').sigActivated.connect(self.print_params)
# # self.save()
def change(self, param, changes):
print("tree changes:")
for param, change, data in changes:
path = self.p.childPath(param)
if path is not None:
childName = '.'.join(path)
else:
childName = param.name()
print(' parameter: %s'% childName)
print(' change: %s'% change)
print(' data: %s'% str(data))
print(' ----------')
Martin Drechsler
committed
def print_params(self):
for p in self.p.child('Basic acq parameters').children():
print(p.name(), p.value())
Martin Drechsler
committed
def save(self, location = 'config.ini'):
settings = QSettings(str(location), QSettings.IniFormat)
settings.beginGroup('Camera')
for parameter in self.p.child('Basic acq parameters').children():
settings.setValue(parameter.name(), parameter.value())
settings.endGroup()
Martin Drechsler
committed
Martin Drechsler
committed
def load(self, location = 'config.ini'):
settings = QSettings(str(location), QSettings.IniFormat)
settings.beginGroup('Camera')
for parameter in self.p.child('Basic acq parameters').children():
saved_value = settings.value(parameter.name())
Martin Drechsler
committed
if saved_value:
if not parameter.readonly():
if parameter.type() == 'str' or parameter.type() == 'list':
parameter.setValue(saved_value)
if parameter.type() == 'float':
parameter.setValue(float(saved_value))
Martin Drechsler
committed
settings.endGroup()
Martin Drechsler
committed
def save_to(self):
name = QFileDialog.getSaveFileName(self, 'Save File')
Martin Drechsler
committed
if not name[0]:
print('Saving was canceled')
return 0
filename = name[0]+'.ini'
file = open(filename, 'w+')
file.close()
self.save( filename )
def load_from(self):
name = QFileDialog.getOpenFileName(self, 'Open File')
Martin Drechsler
committed
if not name[0]:
print('Opening was canceled')
return 0
self.load(name[0])
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
win = QtGui.QWidget()
layout = QtGui.QGridLayout()
win.setLayout(layout)
param_tree = CameraParameterTree()
layout.addWidget(QtGui.QLabel("Explanation of parameter tree."), 0, 0, 1, 2)
layout.addWidget(param_tree.t)
win.show()
win.resize(400,800)
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()