Skip to content
cameraParameterTree.py 6.36 KiB
Newer Older
# -*- coding: utf-8 -*-
"""

"""
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.parametertree.parameterTypes as pTypes
from pyqtgraph.parametertree import Parameter, ParameterTree
from PyQt5.QtCore import QSettings
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})
        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)
        self.addChild({'name': 'Update State', 'type': 'action'})
        self.addChild({'name': 'Save State', 'type': 'action'})
        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):
        super().__init__()
        self.params = [
                BasicAcquisitonParameters(name = 'Basic acq parameters')]
        self.p = Parameter.create(name='params', type='group', children=self.params)
        #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('  ----------')

    def print_params(self):
        for p in self.p.child('Basic acq parameters').children():
            print(p.name(), p.value())
    
Martin Drechsler's avatar
Martin Drechsler committed
    @QtCore.pyqtSlot()
    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's avatar
Martin Drechsler committed
        print('Tree saved')
Martin Drechsler's avatar
Martin Drechsler committed
    @QtCore.pyqtSlot()
    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())
            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))
        name = QFileDialog.getSaveFileName(self, 'Save File')
        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')
        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__':
    app = QtGui.QApplication([])

    import sys
    win = QtGui.QWidget()
    layout = QtGui.QGridLayout()
    win.setLayout(layout)
    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_()