Source code for diaGrabber.plot._preferenceDock

# -*- coding: utf-8 *-*
from diaGrabber import _utils
import sys
from copy import deepcopy

import pyqtgraph.parametertree.parameterTypes as pTypes
from pyqtgraph.parametertree import Parameter, ParameterTree, ParameterItem, registerParameterType
import pyqtgraph.dockarea as pgDock
from pyqtgraph.Qt import QtGui
from pyqtgraph import ViewBox
from pyqtgraph import LineSegmentROI, AxisItem


[docs]class preferenceDock(object): def __init__(self, plotClass): self.plotClass = plotClass self.exist = False
[docs] def build(self,preferences_size): self.exist = True self.size = preferences_size self.tab = QtGui.QTabWidget()#TabWidget() #build main tab self.main = mainTab(self) #add main tab to tab-instance self.tab.addTab(self.main, 'Main') for d in self.plotClass.display_list: self.addPrefTab(d) #create new dock self.pref_dock = pgDock.Dock("Preferences", size=(self.size, 1)) #add tab-instance to dock self.pref_dock.addWidget(self.tab) #add dock to area self.addToArea() #autosave self.main.saveWidgetLayout()
[docs] def createNewDisplay(self): display = self.plotClass._createNewDisplay() self.addPrefTab(display) self.addToArea() #autosave self.main.saveWidgetLayout()
[docs] def addPrefTab(self,display): #add a tab owned by its display display.prefTab = preferenceTab(display, self) self.tab.addTab(display.prefTab, str(display.index))
[docs] def removeTab(self, tab): self.tab.removeTab(self.tab.indexOf(tab)) #autosave self.main.saveWidgetLayout()
[docs] def addToArea(self): ##append parameterTree-instance to dockarea self.plotClass.area.addDock(self.pref_dock, 'left') self.pref_dock.setStretch(x=self.size)
[docs]class mainTab(ParameterTree): def __init__(self, prefDock): self.plotClass = prefDock.plotClass super(mainTab, self).__init__() params = [] params.append({'name': 'Add widget', 'type': 'action'}) params.append( {'name': 'Save/Restore widget-layout', 'type': 'group', 'children': [ {'name': 'Save', 'type': 'action', 'children': [ {'name': 'Save to file', 'type': 'bool', 'value': False}, {'name': 'Filename', 'type': 'str', 'value': 'preferences/my_widget_layout'}, ]}, {'name': 'Restore', 'type': 'action', 'children': [ {'name': 'Restore from file', 'type': 'bool', 'value': False}, {'name': 'Filename', 'type': 'str', 'value': 'preferences/my_widget_layout'}, ]}, ]}) if self.plotClass.interactive: params.append( readoutPlotRates(self.plotClass, name='Readout/Plot-Rates')) ## Create tree of Parameter objects self.p= Parameter.create(name='params', type='group', children=params) self.p.param('Add widget').sigActivated.connect(prefDock.createNewDisplay) self.p.param('Save/Restore widget-layout', 'Save').sigActivated.connect(self.saveWidgetLayout) self.p.param('Save/Restore widget-layout', 'Restore').sigActivated.connect(self.restoreWidgetLayout) self.setParameters(self.p, showTop=False)
[docs] def saveWidgetLayout(self): #global stateWidgetLayout self.stateWidgetLayout = self.plotClass.area.saveState() if self.p['Save/Restore widget-layout', 'Save', 'Save to file']: #write state to file filename = self.p['Save/Restore widget-layout', 'Save', 'Filename'] _utils.prepareFileSystem(filename) saveWidgetFile = open(filename, "w") saveWidgetFile.write(str(self.stateWidgetLayout)) saveWidgetFile.close()
[docs] def restoreWidgetLayout(self): #global stateWidgetLayout if self.p['Save/Restore widget-layout', 'Restore', 'Restore from file']: filename = self.p['Save/Restore widget-layout', 'Restore', 'Filename'] self.stateWidgetLayout = saveWidgetFile = eval(open(filename, "r").read()) self.plotClass.area.restoreState(self.stateWidgetLayout)
[docs]class preferenceTab(ParameterTree): ''' the preference tab that belongs to each Display ''' def __init__(self,display, prefDock): self.plotClass = prefDock.plotClass self.prefDock = prefDock self.display = display super(preferenceTab, self).__init__() params = [] params = [] params.append({'name': 'Remove widget', 'type': 'action'}) self.plot_merge_dims = plotMergeDims(self, self.display, name='Plot merge-dimensions') params.append(self.plot_merge_dims) self.slice_image = sliceImage(self, self.display, name='Slice Image') params.append(self.slice_image) self.plot_basis_dims = plotBasisDims(self, self.display, name='Plot basis-dimensions') params.append(self.plot_basis_dims) params.append( viewOptions(self, self.display, name='View Options')) self.save_restore = saveRestorePrefs(self, name='Save/Restore preferences') params.append(self.save_restore) ## Create tree of Parameter objects self.p = Parameter.create(name='params', type='group', children=params) self.p.param('Remove widget').sigActivated.connect(self.remove) self.p.sigTreeStateChanged.connect(self.printChange) self.setParameters(self.p, showTop=False) #autosave self.statePreferences = self.p.saveState() self.showTabOnClick() ## If anything changes in the tree, print a message
[docs] def printChange(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(' ----------')
[docs] def remove(self): self.plotClass._removeDisplay(self.display.index) self.prefDock.removeTab(self)
[docs] def showTabOnClick(self): def newMouseClickEvent(ev): '''add to normal mouseClickEvent the feature to show the corresponding prefTab when clicking on the display''' self.prefDock.tab.setCurrentWidget(self) ViewBox.mouseClickEvent(self.display.view.vb, ev) self.display.view.mouseClickEvent = newMouseClickEvent
[docs]class saveRestorePrefs(pTypes.GroupParameter): def __init__(self,prefTab, **opts):# self.prefTab = prefTab opts['type'] = 'group' opts['value'] = True opts['children'] = [ {'name': 'Save', 'type': 'action'}, {'name': 'Restore', 'type': 'action', 'children': [ {'name': 'Add missing items', 'type': 'bool', 'value': True}, {'name': 'Remove extra items', 'type': 'bool', 'value': True}, ]}, ] pTypes.GroupParameter.__init__(self, **opts) ##SAVE PREFERENCES self.param('Save').sigActivated.connect(self.savePreferences) self.param('Restore').sigActivated.connect(self.restorePreferences)
[docs] def savePreferences(self): #global statePreferences self.prefTab.statePreferences = self.prefTab.p.saveState()
[docs] def restorePreferences(self, sgn,state = None,add_missing_remove_extra=None): print state,888 if state == None: state = self.prefTab.statePreferences if add_missing_remove_extra == None: #global statePreferences add = self.param('Restore', 'Add missing items') rem = self.param('Restore', 'Remove extra items') else: add,rem = add_missing_remove_extra,add_missing_remove_extra self.prefTab.p.restoreState(state, addChildren=add, removeChildren=rem)
[docs]class plotBasisDims(pTypes.GroupParameter): def __init__(self,prefTab, display, **opts):# self.display = display self.prefTab = prefTab self.concBasisDict = {} #basis_index, concBasis-instance opts['type'] = 'bool' opts['value'] = True pTypes.GroupParameter.__init__(self, **opts) self.basis_opt = [] for n,b in enumerate(self.display._basis_dim): plot_basis = b._basisIndex in self.display.show_basis self.basis_opt.append(self.addChild({'name': b.name, 'type': 'bool', 'value': plot_basis})) if plot_basis: self.addPlotRange(n,b) else: self.addConcentrateOpt(n,b) self.param(b.name).sigValueChanged.connect(self.changePlotStatus) #self.plot_types = self.addChild({'name': 'Available Plot-Types', 'type': 'group'}) #self.setAvailablePlotTypes()
[docs] def addPlotRange(self,n,b): #print self.parentC.nBasis,9999 #if self.parentC.nBasis == 1: self.display._changeTitleOpt(b) self.basis_opt[n].addChild({'name': 'Plot-Range', 'type': 'group', 'children': [ {'name': 'from', 'type': 'int', 'value': 0, 'limits': (0, b.resolution-1)}, {'name': 'to', 'type': 'int', 'value':b.resolution, 'limits': (1, b.resolution-1)}, {'name': 'step', 'type': 'int', 'value': 1, 'limits': (1, b.resolution-1)}, ]}) self.param(b.name,'Plot-Range','from').sigValueChanged.connect(self.changePlotRangeFrom) self.param(b.name,'Plot-Range','to').sigValueChanged.connect(self.changePlotRangeTo) self.param(b.name,'Plot-Range','step').sigValueChanged.connect(self.changePlotRangeStep)
[docs] def addConcentrateOpt(self,n,b): self.concBasisDict[b.name] = self.basis_opt[n].addChild( ConcentrateOpt(n,self.display,b, self.concBasisDict, name='Concentrate-Basis') )
[docs] def changePlotRangeFrom(self): for n,b in enumerate(self.display._basis_dim): try: new = self.param(b.name, 'Plot-Range','from') #if not new.valueIsDefault(): orig=self.display.basis_dim_plot_range[n] self.display.basis_dim_plot_range[n] = slice(new.value(),orig.stop,orig.step) except Exception:#basis-dim isnt active pass self.display.update()
[docs] def changePlotRangeTo(self): for n,b in enumerate(self.display._basis_dim): try: new = self.param(b.name, 'Plot-Range','to') #if not new.valueIsDefault(): orig=self.display.basis_dim_plot_range[n] self.display.basis_dim_plot_range[n] = slice(orig.start,new.value(),orig.step) except Exception:#basis-dim isnt active pass self.display.update()
[docs] def changePlotRangeStep(self): for n,b in enumerate(self.display._basis_dim): try: new = self.param(b.name, 'Plot-Range','step') #if not new.valueIsDefault(): orig=self.display.basis_dim_plot_range[n] self.display.basis_dim_plot_range[n] = slice(orig.start,orig.stop,new.value()) except Exception:#basis-dim isnt active pass self.display.update()
[docs] def changePlotStatus(self): for n,b in enumerate(self.display._basis_dim): pa = self.param(b.name) if (not pa.value() and n in self.display.show_basis and len(self.display.show_basis) ==1): #dont shut down last (active) dimension pa.setValue(True, blockSignal=self.changePlotStatus) else: #remove all children self.basis_opt[n].clearChildren() #max 2 basis-dim to view if ( (pa.value() and pa.defaultValue()) or (pa.value() and len(self.display.show_basis) < 2)): if not pa.value(): pa.setValue(True, blockSignal=self.changePlotStatus) #print n,self.parentC.show_basis if n not in self.display.show_basis: self.display.show_basis.append(n) self.display.show_basis.sort()#show_basis has to be sorted self.display.basis_dim_plot_range[n] = slice(None,None,None) #.parentC.nBasis += 1 self.display.create() self.prefTab.showTabOnClick() self.addPlotRange(n,b) #because 'as-time' will only be shown for2+basis-dims #it has to be reinitialized for i,ba in enumerate(self.display._basis_dim): if i not in self.display.show_basis: # if concentrated if ba != b:#change only other conc. basis self.concBasisDict[ba.name].setPAsTime() else: if pa.value(): pa.setValue(False, blockSignal=self.changePlotStatus) if n in self.display.show_basis: self.display.show_basis.pop(self.display.show_basis.index(n)) #self.display.nBasis -= 1 if len(self.display.show_basis) == 0: #no basis to show self.param(b.name).setValue(True) break#do not create concentrato opts if reset to active basis self.display.create() self.prefTab.showTabOnClick() self.display.concentrate_basis_dim[n] = "sum" self.addConcentrateOpt(n,b) self.display.scale_plot = True self.display.update() #def setAvailablePlotTypes(self): #self.plot_types.clearChildren() ##sys.exit() ##2d-plot ##if len(self.display.show_basis) == 0: ## self.plot_types.addChild({'name': 'Nothing', 'type': 'bool', 'value': True}) ##sys.exit() #if len(self.display.show_basis) == 1: #self.linePlot = self.plot_types.addChild({'name': 'Line-Plot', 'type': 'bool', 'value': True}) #self.linePlot.sigValueChanged.connect(self.changeLinePlot) #self.scatterPlot = self.plot_types.addChild({'name': 'Scatter-Plot', 'type': 'bool', 'value': False}) #self.scatterPlot.sigValueChanged.connect(self.changeScatterPlot) #elif len(self.display.show_basis) == 2: #self.plot_types.addChild({'name': '3D-Plot', 'type': 'bool', 'value': True}) #self.plot_types.addChild({'name': 'Image', 'type': 'bool', 'value': False}) #def changeScatterPlot(self): #if self.scatterPlot.value(): #self.display.plot_type = "scatter" #self.linePlot.setValue(False, blockSignal=self.changeLinePlot) #else: #self.display.plot_type = "line" #self.linePlot.setValue(True, blockSignal=self.changeLinePlot) #self.display.create() #def changeLinePlot(self): #if self.linePlot.value(): #self.display.plot_type = "line" #self.scatterPlot.setValue(False, blockSignal=self.changeScatterPlot) #else: #self.display.plot_type = "scatter" #self.scatterPlot.setValue(True, blockSignal=self.changeScatterPlot) #self.display.create()
[docs]class ConcentrateOpt(pTypes.GroupParameter): def __init__(self, n,display, b, concBasisDict, **opts): self.n = n self.basis = b self.display = display self.concBasisDict = concBasisDict pTypes.GroupParameter.__init__(self, **opts) self.pMean=self.addChild({'name': 'mean', 'type': 'bool', 'value': True}) self.pSum=self.addChild({'name': 'sum', 'type': 'bool', 'value': False}) self.pMax=self.addChild({'name': 'max', 'type': 'bool', 'value': False}) self.pMin=self.addChild({'name': 'min', 'type': 'bool', 'value': False}) self.pAtPosition=self.addChild({'name': 'at position', 'type': 'int', 'value': -1, 'limits': (-1, self.basis.resolution-1)}) self.pValue=self.addChild({'name': ' value', 'type': 'float', 'value': 0, 'readonly': True}) #self.pAsMerge=self.addChild({'name': '*as merge*', 'type': 'bool', 'value': False}) self.setPAsTime() self.pAtPosition.sigValueChanged.connect(self.changePlotRangeToPosition) self.pSum.sigValueChanged.connect(self.concentrateViaSum) #self.param('sum').connect(self.concentrateViaSum) self.pMean.sigValueChanged.connect(self.concentrateViaMean) self.pMin.sigValueChanged.connect(self.concentrateViaMin) self.pMax.sigValueChanged.connect(self.concentrateViaMax) #init default self.concentrateViaMean()
[docs] def setPAsTime(self): if len(self.display.show_basis) == 2: #does pAsTime exist? try: self.pAsTime.setValue(False) # as standard except AttributeError: # no: create it self.pAsTime = self.addChild({'name': 'as time', 'type': 'bool', 'value': False}) self.pAsTime.sigValueChanged.connect(self.changeAsTime)
[docs] def changeAsTime(self): if self.pAsTime.value() == True: #set other options to false/default self.pSum.setValue(False, blockSignal=self.concentrateViaSum) self.pMean.setValue(False, blockSignal=self.concentrateViaMean) self.pMin.setValue(False, blockSignal=self.concentrateViaMin) self.pMax.setValue(False, blockSignal=self.concentrateViaMax) self.pAtPosition.setToDefault() #set 'as-time' values of the other conc. basis to false for i,b in enumerate(self.display._basis_dim): if i not in self.display.show_basis: # if concentrated if b != self.basis:#change only other conc. basis self.concBasisDict[b.name].pAsTime.setValue(False) #restore plot range self.display.basis_dim_plot_range[self.n] = slice(None,None,None) self.display.concentrate_basis_dim[self.n] = "time" self.display._changeTitleOpt(self.basis, "time") else: self.display._changeTitleOpt(self.basis) if self.pMean.value() == False: self.pMean.setValue(True)#, blockSignal=self.concentrateViaMean) self.scale_plot=True self.display.update()
[docs] def concentrateViaSum(self): if self.pSum.value() == True: #set other options to false/default if len(self.display.show_basis) == 2: self.pAsTime.setValue(False, blockSignal=self.changeAsTime) self.pMean.setValue(False, blockSignal=self.concentrateViaMean) self.pMin.setValue(False, blockSignal=self.concentrateViaMin) self.pMax.setValue(False, blockSignal=self.concentrateViaMax) self.pAtPosition.setToDefault() #restore plot range self.display.basis_dim_plot_range[self.n] = slice(None,None,None) self.display.concentrate_basis_dim[self.n] = "sum" self.display._changeTitleOpt(self.basis, "sum") else: self.display._changeTitleOpt(self.basis) if self.pMean.value() == False: self.pMean.setValue(True)#, blockSignal=self.concentrateViaMean) self.scale_plot=True self.display.update()
[docs] def concentrateViaMean(self): if self.pMean.value() == True: #set other options to false/default self.pSum.setValue(False, blockSignal=self.concentrateViaSum) self.pMin.setValue(False, blockSignal=self.concentrateViaMin) self.pMax.setValue(False, blockSignal=self.concentrateViaMax) self.pAtPosition.setToDefault() if len(self.display.show_basis) == 2: self.pAsTime.setValue(False, blockSignal=self.changeAsTime) #restore plot range self.display.basis_dim_plot_range[self.n] = slice(None,None,None) self.display.concentrate_basis_dim[self.n] = "mean" self.display._changeTitleOpt(self.basis, "mean") else: self.display._changeTitleOpt(self.basis) if self.pSum.value() == False: self.pSum.setValue(True)#, blockSignal=self.concentrateViaMean) self.scale_plot=True self.display.update()
[docs] def concentrateViaMin(self): if self.pMin.value() == True: #set other options to false/default self.pSum.setValue(False, blockSignal=self.concentrateViaSum) self.pMean.setValue(False, blockSignal=self.concentrateViaMean) self.pMax.setValue(False, blockSignal=self.concentrateViaMax) self.pAtPosition.setToDefault() if len(self.display.show_basis) == 2: self.pAsTime.setValue(False, blockSignal=self.changeAsTime) #restore plot range self.display.basis_dim_plot_range[self.n] = slice(None,None,None) self.display.concentrate_basis_dim[self.n] = "min" self.display._changeTitleOpt(self.basis, "min") else: self.display._changeTitleOpt(self.basis) if self.pMean.value() == False: self.pMean.setValue(True)#, blockSignal=self.concentrateViaMean) self.scale_plot=True self.display.update()
[docs] def concentrateViaMax(self): if self.pMax.value() == True: #set other options to false/default self.pSum.setValue(False, blockSignal=self.concentrateViaSum) self.pMean.setValue(False, blockSignal=self.concentrateViaMean) self.pMin.setValue(False, blockSignal=self.concentrateViaMin) self.pAtPosition.setToDefault() if len(self.display.show_basis) == 2: self.pAsTime.setValue(False, blockSignal=self.changeAsTime) #restore plot range self.display.basis_dim_plot_range[self.n] = slice(None,None,None) self.display.concentrate_basis_dim[self.n] = "max" self.display._changeTitleOpt(self.basis, "max") else: self.display._changeTitleOpt(self.basis) if self.pMean.value() == False: self.pMean.setValue(True)#, blockSignal=self.concentrateViaMean) self.scale_plot=True self.display.update()
[docs] def changePlotRangeToPosition(self): #for n,b in enumerate(self.display._basis_dim): # if not self.param(b.name).value(): if not self.pAtPosition.valueIsDefault(): position = self.pAtPosition.value() #get value for position value=self.display.basisMatrix[self.n][position] self.pValue.setValue(value) #set other options to false self.pSum.setValue(False, blockSignal=self.concentrateViaSum) self.pMean.setValue(False, blockSignal=self.concentrateViaMean) self.pMin.setValue(False, blockSignal=self.concentrateViaMin) self.pMax.setValue(False, blockSignal=self.concentrateViaMax) if len(self.display.show_basis) == 2: self.pAsTime.setValue(False, blockSignal=self.changeAsTime) #set plot range self.display.basis_dim_plot_range[self.n] = position self.display.concentrate_basis_dim[self.n] = "pos" self.display._changeTitleOpt(self.basis, "%.3f" % value) else:#position is default "-1" self.pValue.setToDefault() self.display._changeTitleOpt(self.basis) if self.pMean.value() == False: self.pMean.setValue(True)#, blockSignal=self.concentrateViaMean) self.display.scale_plot = True self.display.update()
[docs]class sliceImage(pTypes.GroupParameter): def __init__(self, prefTab, display, **opts): #self.parentC = parentC self.display = display self.prefTab = prefTab opts['type'] = 'bool' opts['value'] = False pTypes.GroupParameter.__init__(self, **opts) self.activate = self.addChild({'name': 'activate', 'type': 'bool', 'value': False, 'tip': "activate to slice an image - this only works for 2+ active basisDimensions"}) self.activate.sigValueChanged.connect(self.changeActivate)
[docs] def changeActivate(self): if self.activate.value(): if len(self.display.show_basis) == 1: self.errorMsg = self.addChild({'name': 'Error', 'type': 'str', 'value': "Need at least two active basisDimensions"}) else: av_displays= ["-"] for i in range(1,self.prefTab.prefDock.tab.count()): #exclude own display-pref-tab if str(self.display.index) != self.prefTab.prefDock.tab.tabText(i): av_displays.append(self.prefTab.prefDock.tab.tabText(i) ) if len(av_displays) == 1: self.which_display = self.addChild({'name': 'Error:', 'type': 'str', 'value': "Add another widget!"}) else: #value="-" self.which_display = self.addChild({'name': 'slice to display', 'type': 'list', 'values': av_displays, 'value': av_displays[0]}) self.which_display.sigValueChanged.connect(self.changeWhichDisplay) #self.which_display = self.addChild(chooseWhichDisplay(self, self.display,self.prefTab.prefDock.tab, name="slice to display") ) else: try: self.removeChild(self.errorMsg) except Exception: pass # no eror msg to delete try: self.removeChild(self.which_display) #when i'm the master_display #try: #deslave slave_display self.slave_display.prefTab.save_restore.restorePreferences(True) try: self.slave_display.prefTab.slice_image.removeChild( self.slave_display.prefTab.slice_image.pSlave) except Exception: pass except Exception: #cant remove this child, because it does not exist #this child dont exist because this display is the slice-output(chosendisplay) ##when i'm slave_display: try: self.removeChild(self.pSlave) #show all hidden preferences self.prefTab.save_restore.restorePreferences(True) except Exception: pass try: self.display.plot.removeItem(self.display.plot.lineRoi) except AttributeError: pass # no roi-line generated so far try: self.removeChild(self.which_basis) except Exception: pass # no display chosen, so no basis-dimto choose try: #unblock 'conentrate-opt' of last sliceBasis self.recentSliceBasis.parent().show() except Exception: #no last parameter exist pass
[docs] def changeWhichDisplay(self): #if a display was chosen if self.which_display.value() != self.which_display.defaultValue(): #get tab-index from tab-text self.slave_display = None for i in range(self.prefTab.prefDock.tab.count()): if self.prefTab.prefDock.tab.tabText(i) == str(self.which_display.value()): self.slave_display = self.prefTab.prefDock.tab.widget(i).display break if self.slave_display == None: sys.exit("ERRORsearchcode 23675367") #transfer the parameter-state from active (master)preference tab to # preference tab of the chosen display (slave) masterState = self.prefTab.p.saveState() slaveState = self.slave_display.prefTab.p.saveState() slaveState = _utils.adaptMasterStaticsToSlaveDict(masterState,slaveState) self.slave_display.prefTab.save_restore.restorePreferences(True, slaveState, True) #save last preferences (to restore, when slave_display is not a slave of self.display) self.slave_display.prefTab.save_restore.savePreferences() self.slave_display.prefTab.slice_image.pSlave = self.slave_display.prefTab.slice_image.addChild({'name': 'SLAVE OF Widget', 'type': 'str', 'value': str(self.display.index),'readonly': True}) #hide activate-button - slave can only be unslaved via master self.slave_display.prefTab.slice_image.activate.hide() #self.slave_display.prefTab.slice_image.activate.setValue("True", blockSignal=self.slave_display.prefTab.slice_image.changeActivate) #hide all options which a slave mustn't handle for c in self.slave_display.prefTab.plot_basis_dims.children(): self.slave_display.prefTab.p.param( self.slave_display.prefTab.plot_basis_dims.name(),c.name()).hide() for c in self.slave_display.prefTab.plot_merge_dims.children(): self.slave_display.prefTab.p.param( self.slave_display.prefTab.plot_merge_dims.name(),c.name()).hide() for c in self.slave_display.prefTab.save_restore.children(): self.slave_display.prefTab.p.param( self.slave_display.prefTab.save_restore.name(),c.name()).hide() try: self.removeChild(self.which_basis) except Exception: pass # no chooseWhichConcBasis-instance to remove #generate a which-basis list containing all concentrated basis-dims show_basis = ["-"] self.basis_name_index={} for i,b in enumerate(self.slave_display._basis_dim): if i not in self.slave_display.show_basis: show_basis.append(b.name) self.basis_name_index[b.name]= i if len(show_basis) == 1: self.which_basis = self.addChild({'name': 'Error:', 'type': 'str', 'value': "No conc. basisDim to show!"}) else: #value="-" self.which_basis = self.addChild({'name': "show conc. basis", 'type': 'list', 'values': show_basis, 'value': show_basis[0]}) self.which_basis.sigValueChanged.connect(self.changeWhichBasis)
[docs] def changeWhichBasis(self): #if basis-dim was chosen if self.which_basis.value() != self.which_basis.defaultValue(): ##add slice-ROI: thirdLenX = int( len(self.display.basisMatrix[self.display.show_basis[0]])/3 ) halfLenY = int( len(self.display.basisMatrix[self.display.show_basis[1]])/2 ) startX = self.display.basisMatrix[self.display.show_basis[0]][thirdLenX] startY = self.display.basisMatrix[self.display.show_basis[1]][halfLenY] stopX = self.display.basisMatrix[self.display.show_basis[0]][-thirdLenX] stopY = startY#self.display.basisMatrix[self.display.show_basis[1]][-thirdLenY] #only draw one line - so remove old ones try: self.display.plot.removeItem(self.display.plot.lineRoi) except AttributeError: pass # no line to remove #new roi-line self.display.plot.lineRoi = LineSegmentROI([[startX, startY], [stopX,stopY]], pen='r') #add new roi-line to plot self.display.plot.addItem(self.display.plot.lineRoi) #set chosen concentrated basis to concentrateOption: 'as time' # thats necassary go get a slice-able-3d-array try: #unblock 'conentrate-opt' of last sliceBasis self.recentSliceBasis.parent().show() except Exception: #no last parameter exist pass self.recentSliceBasis = self.prefTab.plot_basis_dims.concBasisDict[ self.which_basis.value()] self.recentSliceBasis.pAsTime.setValue(True) self.recentSliceBasis.parent().hide() #y-axis becoms the new appeared-basis-axis self.slave_display.show_basis[0] = self.basis_name_index[self.which_basis.value()] shown_basis = self.slave_display.show_basis[0] self.slave_display._setAxisLabels() self.firstAutoRange = True def updateROIline(): slicedImg = self.display.plot.lineRoi.getArrayRegion( self.display.merge_extract, self.display.plot.imageItem, axes=(1,2)) y0=0 yscale=1 # doesn't matter because yAxis wont be shown x0=self.slave_display._basis_dim[shown_basis]._include_range[0] x1=self.slave_display._basis_dim[shown_basis]._include_range[1] xscale = (x1-x0) / self.slave_display._basis_dim[shown_basis].resolution if self.slave_display.transpose_axes: p = [y0, x0] s = [yscale, xscale] self.slave_display.view.showAxis("bottom", show=False) else: p =[x0, y0] s = [xscale, yscale] self.slave_display.view.showAxis("left", show=False) self.slave_display.plot.setImage(slicedImg, autoRange = self.firstAutoRange, pos = p,scale=s) self.firstAutoRange = False self.display.plot.lineRoi.sigRegionChanged.connect(updateROIline) #copy title from masterdisplay self.slave_display.title_opt = deepcopy(self.display.title_opt) #change title appear_basis = self.display._basis_dim[ self.basis_name_index[self.which_basis.value()]] self.slave_display._changeTitleOpt(appear_basis) self.slave_display._changeTitleOpt( self.display._basis_dim[self.display.show_basis[0]],"slice") self.slave_display._changeTitleOpt( self.display._basis_dim[self.display.show_basis[1]],"slice") updateROIline()
[docs]class plotMergeDims(pTypes.GroupParameter): def __init__(self, prefTab, display, **opts): #self.parentC = parentC self.display = display self.prefTab = prefTab opts['type'] = 'bool' opts['value'] = True pTypes.GroupParameter.__init__(self, **opts) #self.basis_opt = [] self.mergeToPlot = [] self.asDensity = [] for n,m in enumerate(self.display._merge_dim): is_merge_in_view = n in self.display.show_merge #is_merge_in_view = self.parentC. #plot_basis = b._basisIndex in self.parentC.show_basis self.mergeToPlot.append(self.addChild({'name': m.name, 'type': 'bool', 'value':is_merge_in_view})) self.param(m.name).sigValueChanged.connect(self.changePlotMerge) self.asDensity.append(self.mergeToPlot[-1].addChild({'name': "as density", 'type': 'bool', 'value':False,'enabled':False})) self.asDensity[-1].sigValueChanged.connect(self.changeAsDensity) self.changePlotMerge()
[docs] def changePlotMerge(self): for n,m in enumerate(self.mergeToPlot): if m.value() == True: #show_density = False #if not m.hasChildren(): self.asDensity[n].show() #else: # self.asDensity[n].hide() if n not in self.display.show_merge: #deactivate all other merges in case of imagePlot if len(self.display.show_basis) != 1: for j in self.display.show_merge: if j != n: self.mergeToPlot[j].setValue(False, blockSignal=self.changePlotMerge) self.asDensity[j].hide() #self.mergeToPlot[j].clearChildren() self.display.show_merge.pop(self.display.show_merge.index(j)) self.display.show_merge.append(n) if not m.value(): #if m.hasChildren(): self.asDensity[n].hide() if n in self.display.show_merge: #dont remove the last shown merge if len(self.display.show_merge) == 1: m.setValue(True)#, blockSignal=self.changePlotMerge) else: self.display.show_merge.pop( self.display.show_merge.index(n)) #self.display.create() if len(self.display.show_basis) == 1: self.display._createCurves1D() #self.prefTab.showTabOnClick() else: self.display._setTitle() self.display.update()
[docs] def changeAsDensity(self): for n,m in enumerate(self.display._merge_dim): try: show_as_density = self.param(m.name, "as density").value() self.display.show_merge_as_density[n] = show_as_density if show_as_density: m.use_unit = "PointDensity" #self.display.title_additive.append("PointDensity") else: m.use_unit = m.unit #i=self.display.title_additive.index("PointDensity") #self.display.title_additive.pop(i) except Exception:#merge not in show_merge pass self.display._setTitle() self.display._setAxisLabels() self.display.update()
[docs]class viewOptions(pTypes.GroupParameter): def __init__(self, prefTab, display, **opts): #self.parentC = parentC self.display = display self.prefTab = prefTab opts['type'] = 'bool' opts['value'] = True pTypes.GroupParameter.__init__(self, **opts) self.lockAspect = self.addChild({'name': "lockAspect", 'type': 'bool', 'value':False}) self.crosshair = self.addChild({'name': "Crosshair", 'type': 'bool', 'value':False}) self.plotOverlay = self.addChild({'name': "PlotOverlay", 'type': 'bool', 'value':False}) self.transposeAxes = self.addChild({'name': 'transpose Axes', 'type': 'bool', 'value': False}) #if len(self.display.show_basis) == 1: self.autoRangeX = self.addChild({'name': 'autoRange X', 'type': 'bool', 'value': False}) self.autoRangeY = self.addChild({'name': 'autoRange Y', 'type': 'bool', 'value': False}) self.plotOverlay.sigValueChanged.connect(self.changePlotOverlay) self.transposeAxes.sigValueChanged.connect(self.changeTransposeAxes) self.lockAspect.sigValueChanged.connect(self.changeLockAspect) self.autoRangeX.sigValueChanged.connect(self.changeAutoRangeX) self.autoRangeY.sigValueChanged.connect(self.changeAutoRangeY) self.crosshair.sigValueChanged.connect(self.changeCrosshair)
[docs] def changeCrosshair(self): if self.crosshair.value(): self.display._setCrosshair() else: self.display._unsetCrosshair()
[docs] def changeTransposeAxes(self): #self.display._mirrowAxisLabels() self.display.transpose_axes = self.transposeAxes.value() self.display.scale_plot = True self.display._setAxisLabels() #for n,b in enumerate(self.display._basis_dim): #try: #if self.transposeAxes.value() == True: #self.display.transpose_axes = True #if len(self.display.show_basis) == 1: #self.display._mirrowAxisLabels1D() #else: #self.display._mirrowAxisLabels2D() #else: #self.display.transpose_axes = False #if len(self.display.show_basis) == 1: #self.display._restoreAxisLabels1D() #else: #self.display._restoreAxisLabels2D() #except Exception:#basis-dim isnt active #pass self.display.update()
[docs] def changePlotOverlay(self): if self.plotOverlay.value(): self.display.addPlotOverlay() else: self.display.removePlotOverlay() # self.display.enableAutoRangeX = False self.display.update()
[docs] def changeAutoRangeX(self): if self.autoRangeX.value(): self.display.enableAutoRangeX = True else: self.display.enableAutoRangeX = False self.display.update()
[docs] def changeAutoRangeY(self): if self.autoRangeY.value(): self.display.enableAutoRangeY = True else: self.display.enableAutoRangeY = False self.display.update()
[docs] def changeLockAspect(self): if self.lockAspect.value(): self.display.view.setAspectLocked(True) else: self.display.view.setAspectLocked(False) self.display.scale_plot = True self.display.update()
[docs]class readoutPlotRates(pTypes.GroupParameter): def __init__(self,parentC,**opts):# #self.parentC = parentC self.parentC = parentC opts['type'] = 'bool' opts['value'] = True pTypes.GroupParameter.__init__(self, **opts) #self.merge_opt = [] #mergeTogether(name='Together') self.paramFPS = self.addChild( {'name': 'Plot frames per second', 'type': 'int', 'value': self.parentC.fps, 'limits': (1, 200)}) self.paramLimitLPS = self.addChild( {'name': 'Limit readout-rate', 'type': 'bool', 'value': self.parentC.limitReadoutRate} ) self.changeLimitReadoutRate() self.readoutEveryNLine = self.addChild( {'name': 'Readout every n line (+-)', 'type': 'int', 'value': self.parentC.matrixClass._getReadoutEveryNLine()}) self.paramFPS.sigValueChanged.connect(self.changeFPS) self.paramLimitLPS.sigValueChanged.connect(self.changeLimitReadoutRate) self.readoutEveryNLine.sigValueChanged.connect(self.changeReadoutEveryNLine)
[docs] def changeFPS(self): self.parentC._setFPS(self.paramFPS.value())
[docs] def changeLimitReadoutRate(self): self.parentC.limitReadoutRate = self.paramLimitLPS.value() if self.paramLimitLPS.value(): self.paramLPS = self.paramLimitLPS.addChild({'name': 'lines per second', 'type': 'int', 'value': self.parentC.lps, 'limits': (0, 100000)}) self.paramLPS.sigValueChanged.connect(self.changeLPS) self.changeLPS() else: self.changeLPS() try: self.paramLimitLPS.removeChild(self.paramLPS) except AttributeError:#paramLPS not defined yet pass
[docs] def changeLPS(self): try: self.parentC._setLPS(self.paramLPS.value()) except AttributeError:#paramLPS not defined jet self.parentC._setLPS(0)
[docs] def changeReadoutEveryNLine(self): self.parentC.matrixClass._setReadoutEveryNLine(self.readoutEveryNLine.value())