Esempio n. 1
0
class dbsElectrodeControlsDialog(QDialog):
    def __init__(self, callback, parent=None):
        QDialog.__init__(self, parent)
        self.callback = callback
        self.create_widgets()
        #self.layout_widgets()
        self.create_connections()
        self.setModal(False)
        self.setWindowTitle('Electrode Controls')
        self.layout().setSizeConstraint(QLayout.SetFixedSize)
        
        self.saved_params = dict()
        
     
    def create_widgets(self):   
        gridLayout = QGridLayout()
        groupBox = QGroupBox( 'Rendering controls' )
        groupBox.setFlat(True)
        groupBox2 = QGroupBox( 'DBSCAN centroids' )
        groupBox2.setFlat(True)
        groupBox3 = QGroupBox( 'Electrode filter' )
        groupBox3.setFlat(True)
        
        gridLayout.addWidget(groupBox)
        gridLayout.addWidget(groupBox3)
        gridLayout.addWidget(groupBox2)
        
        # rendering controls
        self.visi_label = QLabel( 'show electrodes' )
        self.visi = QCheckBox()
        self.visi.setChecked(False)
        
        self.fall_off_label = QLabel( 'fall-off' )
        self.fall_off = QSlider(Qt.Horizontal)
        self.fall_off.setRange(1, 100) # data set dependent
        
        self.thickness_label = QLabel( 'thickness' )
        self.thickness = QSlider(Qt.Horizontal)
        self.thickness.setRange(1, 100) # data set dependent
        
        self.trans_label = QLabel( 'force translucency' )
        self.forced_translucency = QCheckBox()
        self.forced_translucency.setChecked(False)
        
        # dbscan controls
        #self.view_button_grp = QButtonGroup()
        self.all_electrodes = QRadioButton('show all')
        self.only_clusters = QRadioButton('show clusters')
        self.only_noise = QRadioButton('show noise') 
        self.all_electrodes.setEnabled(False)
        self.all_electrodes.setChecked(True)
        self.only_clusters.setEnabled(False)
        self.only_noise.setEnabled(False)
        #self.view_button_grp.addButton( self.all_electrodes )
        #self.view_button_grp.addButton( self.only_clusters )
        #self.view_button_grp.addButton( self.only_noise ) 
        #gridLayout.addWidget(self.view_button_grp)
        
        self.eps_label = QLabel( 'epsilon' )
        self.eps_spinbox = QDoubleSpinBox()
        self.eps_spinbox.setRange(0.1, 10)
        self.eps_spinbox.setSingleStep(0.1)
        
        self.min_points_label = QLabel( 'min points' )
        self.min_spinbox = QSpinBox()
        self.min_spinbox.setRange(1, 20)
        self.min_spinbox.setSingleStep(1)
        
        self.button = QPushButton('Recalculate')
        self.button.setCheckable(True)
        
        self.browser = QTextBrowser()
    
        vbox = QVBoxLayout()
        vbox2 = QVBoxLayout()
        vbox3 = QVBoxLayout()
        
        vbox.addWidget( self.visi_label )
        vbox.addWidget( self.visi )
        vbox.addWidget( self.fall_off_label )
        vbox.addWidget( self.fall_off )
        vbox.addWidget( self.thickness_label )
        vbox.addWidget( self.thickness )
        vbox.addWidget( self.trans_label )
        vbox.addWidget( self.forced_translucency )
        
        vbox2.addWidget( self.eps_label )
        vbox2.addWidget( self.eps_spinbox )
        vbox2.addWidget( self.min_points_label )
        vbox2.addWidget( self.min_spinbox )
        vbox2.addWidget( self.button )
        vbox2.addWidget( self.browser )
        
        vbox3.addWidget( self.all_electrodes )
        vbox3.addWidget( self.only_clusters )
        vbox3.addWidget( self.only_noise )
        
        groupBox.setLayout(vbox)
        groupBox2.setLayout(vbox2)
        groupBox3.setLayout(vbox3)
        
        self.setLayout(gridLayout)
        self.layout().setSizeConstraint( QLayout.SetFixedSize )
               

    def create_connections(self):
        self.visi.stateChanged.connect(self.__toggleVisibility)
        self.fall_off.valueChanged.connect(self.__setOpacityFalloff)
        self.thickness.valueChanged.connect(self.__setLineThickness)
        self.forced_translucency.stateChanged.connect(self.__toggleForceTranslucency)
        self.button.pressed.connect(self.__calculateDBSCANClusters)
        
        self.all_electrodes.toggled.connect(self.__setElectrodeTypeVisible)
        self.only_clusters.toggled.connect(self.__setElectrodeTypeVisible)
        self.only_noise.toggled.connect(self.__setElectrodeTypeVisible)
    
    
    def __setElectrodeTypeVisible(self):
        av = self.parent().active_vol
        vdata = self.parent()._vdata[av]
        
        if self.all_electrodes.isChecked():
            vdata.setAllElectrodesVisible()
        elif self.only_clusters.isChecked():
            vdata.setElectrodeClustersVisible() 
        elif self.only_noise.isChecked():
            vdata.setElectrodeNoiseVisible()
        
        
    def __calculateDBSCANClusters(self):
        av = self.parent().active_vol
        vdata = self.parent()._vdata[av]
        
        vdata.setDBSCANEps( self.eps_spinbox.value() )
        vdata.setDBSCANMinPts( self.min_spinbox.value() )
        vdata.clusterWithDBSCAN()
        
        count = vdata.electrode_centroid_clustering.dbscan_clusters
        labels = vdata.electrode_centroid_clustering.dbscan_results.labels_
        
        out = 'Estimated number of clusters: %d\n' % count
        #self.browser.setText('Estimated number of clusters: %d' % count)
        
        for patnum, score in enumerate(labels):
            out += 'Patient {0}: {1}\n'.format(patnum, score)
            
        self.browser.setText(out)
        
        vdata.setElectrodeClustersVisible() 
        self.only_clusters.setChecked(True)       
        
        
    def __toggleVisibility(self):
        av = self.parent().active_vol
        vdata = self.parent()._vdata[av]._electrodes
        
        on = False
        if self.visi.checkState():
            on = True
            self.all_electrodes.setEnabled(True)
            self.only_clusters.setEnabled(True)
            self.only_noise.setEnabled(True)
        else:
            self.all_electrodes.setEnabled(False)
            self.only_clusters.setEnabled(False)
            self.only_noise.setEnabled(False)
            
        for electrode in vdata:
            electrode.setVis(on)
            
        self.apply()
        
        
    def __toggleForceTranslucency(self):
        av = self.parent().active_vol
        vdata = self.parent()._vdata[av]._electrodes
        
        on = False
        if self.forced_translucency.checkState():
            on = True
            
        for electrode in vdata:
            electrode.forceTranslucency(on)
            
        self.apply()
        
        
    def __setOpacityFalloff(self):
        av = self.parent().active_vol
        vdata = self.parent()._vdata[av]._electrodes
        #self.fall_off.setValue( vdata[-1].fall_off )
        
        for electrode in vdata:
            electrode.setFallOff(self.fall_off.value() / 10.0)
            
        self.apply()
        
        
    def __setLineThickness(self):
        av = self.parent().active_vol
        vdata = self.parent()._vdata[av]._electrodes
        
        for electrode in vdata:
            electrode.setThickness(self.thickness.value() / 10.0)
       
        self.apply()
        
        
    def saveCurrentParams(self, av, fresh_load = False):
        #av = self.parent().active_vol
        #vdata = self.parent()._vdata[av]._electrodes
        
        if av not in self.saved_params.keys():
            self.saved_params[av] = ElectrodeParameters()
        
        self.saved_params[av].electrodes_show = self.visi.isChecked()
        self.saved_params[av].electrodes_all = self.all_electrodes.isChecked()
        self.saved_params[av].electrodes_clusters = self.only_clusters.isChecked()
        self.saved_params[av].electrodes_noise = self.only_noise.isChecked()
        self.saved_params[av].falloff = self.fall_off.value()
        self.saved_params[av].thickness = self.thickness.value()
        self.saved_params[av].transp = self.forced_translucency.isChecked()
        self.saved_params[av].fresh_load = fresh_load
            
            
    def updateWidgetValues(self, av, default = False):
        #av = self.parent().active_vol
        #vdata = self.parent()._vdata[av]._electrodes
        
        if av not in self.saved_params.keys():
            self.saved_params[av] = ElectrodeParameters()
        
        if default: # todo: need to have default values in one place for assignment
            self.visi.setChecked( False ) 
            self.all_electrodes.setChecked( False ) 
            self.only_clusters.setChecked( False ) 
            self.only_noise.setChecked( False ) 
            self.fall_off.setValue( 1 ) 
            self.thickness.setValue( 10 ) 
            self.forced_translucency.setChecked( False )
        else:
            self.visi.setChecked( self.saved_params[av].electrodes_show ) 
            self.all_electrodes.setChecked( self.saved_params[av].electrodes_all ) 
            self.only_clusters.setChecked( self.saved_params[av].electrodes_clusters ) 
            self.only_noise.setChecked( self.saved_params[av].electrodes_noise ) 
            self.fall_off.setValue( self.saved_params[av].falloff ) 
            self.thickness.setValue( self.saved_params[av].thickness ) 
            self.forced_translucency.setChecked( self.saved_params[av].transp )
        
    def apply(self):
        av = self.parent().active_vol
        self.parent().vol_qvtk_widgets[av].update()
Esempio n. 2
0
class dbsPatientSubsetSelectorDialog(QDialog):
    def __init__(self, callback, parent, patnum=50):
        QDialog.__init__(self, parent)
        self.callback = callback
        self.patnum = patnum
        self.pat_widgets_list = list()
        self.create_and_layout_widgets()
        self.create_connections()
        self.setModal(False)
        self.setWindowTitle('Patient Subset Selector')
        #self.pat_sub_group = dict()
        
        #self._patientSelected()
        
    def create_and_layout_widgets(self):
        layout = QHBoxLayout(self)
        self.setLayout(layout)
        
        lab = QLabel(str(self.patnum))
        layout.addWidget(lab)
        self.pat_widgets_list.append(lab)
        
        for pat in range(0, self.patnum):
            cbox = QCheckBox()
            cbox.setChecked(True)
            layout.addWidget(cbox)
            self.pat_widgets_list.append(cbox)
        
        #self.pat_widgets_list[1].setChecked(True)
        self.pushbutton = QPushButton('Recalculate')
        layout.addWidget( self.pushbutton )
        self.pushbutton.setCheckable(True)
        
        self.layout().setSizeConstraint( QLayout.SetFixedSize )
        
        
    def updateWidgetValues(self, patnum, patdict):
        
        self.patnum = patnum
        self.pat_sub_group = patdict
        
        '''
        child = self.layout().takeAt(0)
        while child:
            del child
            child = self.layout().takeAt(0)

        del self.pat_cbox_list[:]
        '''
        
        # make all widgets invisible
        for widget in self.pat_widgets_list:
            widget.setVisible(False)
        
        # test label widget for data set num paitients 
        qstr = QString( str( self.patnum ) )
        self.pat_widgets_list[0].setText(QString( qstr ))
        self.pat_widgets_list[0].setVisible(True)
        
        for pat in range(1, self.patnum + 1):
            #cbox = QCheckBox()
            #self.layout().addWidget(cbox)
            #self.pat_cbox_list.append(cbox)
            self.pat_widgets_list[pat].setVisible(True)
            
        # update checkbox widgets based on state of patient subset dictionary
        # passed from active volume object
        for pat in patdict.keys():
            #self.pat_widgets_list[int(pat)].setVisible(True)
            self.pat_widgets_list[int(pat)].setChecked(patdict[pat])
            
        self.updateGeometry()    
        self.update()
        
        
    def create_connections(self):
        #for cbox in self.pat_widgets_list[1:]:
        #    cbox.stateChanged.connect(self._patientSelected)
            
        self.pushbutton.pressed.connect(self._patientUpdate)
        
    def _patientUpdate(self):
        
        self._patientSelected()
        av_key = self.parent().active_vol
        if av_key is not None:
            active_vol = self.parent()._vdata[av_key] 
            active_vol.updatePatientSubgroup(self.pat_sub_group)
            active_vol.pat_sub_group = self.pat_sub_group
            self.parent()._colorControlsDialog.setTFChart( self.parent()._vdata[av_key].chart )
            
       
        '''
        # update the new volume object
        active_vol.xclip = xclip = cvol.xclip
        active_vol.yclip = cvol.yclip
        active_vol.zclip = cvol.zclip
        active_vol.curr_statistic = cvol.curr_statistic
        active_vol.picking_opacity = 
        '''
       
    
    def _patientSelected(self):
        idx = 1
        for cbox in self.pat_widgets_list[1:]:
            if cbox.checkState():
                self.pat_sub_group[idx] = True
            else:
                self.pat_sub_group[idx] = False
            idx += 1
            
        '''
Esempio n. 3
0
class MainView(QMainWindow):
    
    # Signals
    startPressed = pyqtSignal(bool)
    resetPressed = pyqtSignal()
    broadcastPressed = pyqtSignal(bool)
    
    def __init__(self):
        super(MainView, self).__init__()
        
        self.initUI()
        
        # Private variables
        self._running = False
        
        # ADE7753 instance
        self.meter = ade.ADE7753()
        
        # Connect signals and slots
        self.startPressed.connect(self.meter.startStopSlot)
        self.resetPressed.connect(self.meter.resetSlot)
        self.broadcastPressed.connect(self.meter.broadcastSlot)
        self.meter.varData.connect(self.updateData)
        self.meter.varPower.connect(self.updatePower)
        self.meter.varEnergy.connect(self.updateEnergy)
        
        
    # Slots
    
    # Update Vrms, Irms and Frequency
    
    @pyqtSlot(float, float, float, float)
    def updateData(self, vrms, irms, frequency, period):
        vrms = '{:.2f}'.format(vrms)
        irms = '{:.3f}'.format(irms)
        frequency = '{:.2f}'.format(frequency)
        
        self.voltageLabel.setText(vrms)
        self.currentLabel.setText(irms)
        self.frequencyLabel.setText(frequency)
        
    # Update energy
    
    @pyqtSlot(float, float, float)
    def updateEnergy(self, activeEnergy, apparentEnergy, reactiveEnergy):
        activeEnergy = '{:.3f}'.format(activeEnergy)
        apparentEnergy = '{:.3f}'.format(apparentEnergy)
        reactiveEnergy = '{:.3f}'.format(reactiveEnergy)
        self.activeEnergyLabel.setText(activeEnergy)
        self.apparentEnergyLabel.setText(apparentEnergy)
        self.reactiveEnergyLabel.setText(reactiveEnergy)
    
    # Update power
    
    @pyqtSlot(float, float, float)
    def updatePower(self, activePower, apparentPower, reactivePower):
        activePower = '{:.3f}'.format(activePower)
        apparentPower = '{:.3f}'.format(apparentPower)
        reactivePower = '{:.3f}'.format(reactivePower)
        self.activePowerLabel.setText(activePower)
        self.apparentPowerLabel.setText(apparentPower)
        self.reactivePowerLabel.setText(reactivePower)
    
    def initUI(self):
        # Set central widget
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        
        # Load LCD fonts
        lcdNumbersFontID = QFontDatabase().addApplicationFont("lcdmn.ttf")
        #fontNames = QFontDatabase().applicationFontFamilies(lcdNumbersFontID)
        
        # Change font size and use italic for strings
        #self.lcdNumbersFont = QFont(fontNames[0])
        self.lcdNumbersFont = QFont()
        self.lcdNumbersFont.setPointSize(40)
        #self.lcdStringFont = QFont(fontNames[0])
        self.lcdStringFont = QFont()
        self.lcdStringFont.setPointSize(35)
        self.lcdStringFont.setItalic(True)
        
       # self.lcdBoldFont = QFont(fontNames[0])
        self.lcdBoldFont = QFont()
        self.lcdBoldFont.setPointSize(50)
        self.lcdBoldFont.setBold(True)
        
        # Labels
        dataLabel = QLabel("DATA")
        dataLabel.setStyleSheet("""
           QLabel {color:red}
        """)
        energyLabel = QLabel("ENERGY")
        energyLabel.setStyleSheet("""
           QLabel {color:red}
        """)
        powerLabel = QLabel("POWER")
        powerLabel.setStyleSheet("""
           QLabel {color:red}
        """)
        dataLabel.setFont(self.lcdBoldFont)
        powerLabel.setFont(self.lcdBoldFont)
        energyLabel.setFont(self.lcdBoldFont)
        
        self.voltageLabel = QLabel("0.00")
        self.voltageLabel.setFont(self.lcdNumbersFont)
        self.voltageString = QLabel("V")
        self.voltageString.setFont(self.lcdStringFont)
        
        self.currentLabel = QLabel("0.00")
        self.currentLabel.setFont(self.lcdNumbersFont)
        self.currentString = QLabel("A")
        self.currentString.setFont(self.lcdStringFont)
        
        self.frequencyLabel = QLabel("0.00")
        self.frequencyLabel.setFont(self.lcdNumbersFont)
        self.frequencyString = QLabel("Hz")
        self.frequencyString.setFont(self.lcdStringFont)
        
        self.activeEnergyLabel = QLabel("0.00")
        self.activeEnergyLabel.setFont(self.lcdNumbersFont)
        self.activeEnergyString = QLabel("Wh")
        self.activeEnergyString.setFont(self.lcdStringFont)
        
        self.apparentEnergyLabel = QLabel("0.00")
        self.apparentEnergyLabel.setFont(self.lcdNumbersFont)
        self.apparentEnergyString = QLabel("VAh")
        self.apparentEnergyString.setFont(self.lcdStringFont)
        
        self.reactiveEnergyLabel = QLabel("0.00")
        self.reactiveEnergyLabel.setFont(self.lcdNumbersFont)
        self.reactiveEnergyString = QLabel("VARh")
        self.reactiveEnergyString.setFont(self.lcdStringFont)
        
        self.activePowerLabel = QLabel("0.00")
        self.activePowerLabel.setFont(self.lcdNumbersFont)
        self.activePowerString = QLabel("W")
        self.activePowerString.setFont(self.lcdStringFont)
        
        self.apparentPowerLabel = QLabel("0.00")
        self.apparentPowerLabel.setFont(self.lcdNumbersFont)
        self.apparentPowerString = QLabel("VA")
        self.apparentPowerString.setFont(self.lcdStringFont)
        
        self.reactivePowerLabel = QLabel("0.00")
        self.reactivePowerLabel.setFont(self.lcdNumbersFont)
        self.reactivePowerString = QLabel("VAR")
        self.reactivePowerString.setFont(self.lcdStringFont)
        
        # Horizontal lines
        hline1 = self.HLine()
        hline2 = self.HLine()
        hline3 = self.HLine()
        hline4 = self.HLine()
        # Vertical lines
        vline1 = self.VLine()
        vline2 = self.VLine()
        vline3 = self.VLine()
        
        # Central grid layout for central widget
        self.centralGridLayout = QGridLayout(self.centralWidget())
        self.centralGridLayout.setHorizontalSpacing(20)
        self.centralGridLayout.setVerticalSpacing(5)
        
        # Add labels
        self.centralGridLayout.addWidget(dataLabel,0,0,1,2, QtCore.Qt.AlignCenter)
        self.centralGridLayout.addWidget(energyLabel,0,3,1,2, QtCore.Qt.AlignCenter)
        self.centralGridLayout.addWidget(powerLabel,0,6,1,2, QtCore.Qt.AlignCenter)
        
        self.centralGridLayout.addWidget(hline1, 1, 0, 1, -1)
        
        self.centralGridLayout.addWidget(self.voltageLabel, 2, 0, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.voltageString, 2, 1, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(hline2, 3, 0, 1, -1)
        
        self.centralGridLayout.addWidget(self.currentLabel, 4, 0, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.currentString, 4, 1, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(hline3, 5, 0, 1, -1)
        
        self.centralGridLayout.addWidget(self.frequencyLabel, 6, 0, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.frequencyString, 6, 1, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(hline4, 7, 0, 1, -1)
        
        self.centralGridLayout.addWidget(vline1, 0, 2, -1, 1)
        
        self.centralGridLayout.addWidget(self.activeEnergyLabel, 2, 3, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.activeEnergyString, 2, 4, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(self.apparentEnergyLabel, 4, 3, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.apparentEnergyString, 4, 4, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(self.reactiveEnergyLabel, 6, 3, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.reactiveEnergyString, 6, 4, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(vline2, 0, 5, -1, 1)
        
        self.centralGridLayout.addWidget(self.activePowerLabel, 2, 6, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.activePowerString, 2, 7, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(self.apparentPowerLabel, 4, 6, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.apparentPowerString, 4, 7, 1, 1, QtCore.Qt.AlignLeft)
        
        self.centralGridLayout.addWidget(self.reactivePowerLabel, 6, 6, 1, 1, QtCore.Qt.AlignLeft)
        self.centralGridLayout.addWidget(self.reactivePowerString, 6, 7, 1, 1, QtCore.Qt.AlignLeft)
        
        # self.centralGridLayout.addWidget(vline3, 0, 8, -1, 1)
        
        # Buttons
        self.startStopButton = QPushButton("START")
        self.startStopButton.setFont(self.lcdStringFont)
        buttonPolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        self.startStopButton.setSizePolicy(buttonPolicy)
        self.startStopButton.clicked.connect(self.startStopClicked)
        
        self.resetButton = QPushButton("RESET")
        self.resetButton.setFont(self.lcdStringFont)
        self.resetButton.setSizePolicy(buttonPolicy)
        self.resetButton.clicked.connect(self.resetButtonClicked)
        
        self.broadcastButton = QPushButton("BROADCAST")
        self.broadcastButton.setFont(self.lcdStringFont)
        self.broadcastButton.setSizePolicy(buttonPolicy)
        self.broadcastButton.setCheckable(True)
        self.broadcastButton.toggled.connect(self.broadcastButtonClicked)
        
        self.centralGridLayout.addWidget(self.startStopButton, 8, 0, 1, 2)
        self.centralGridLayout.addWidget(self.resetButton, 8, 3, 1, 2)
        self.centralGridLayout.addWidget(self.broadcastButton, 8, 6, 1, 2)
        
        # Status bar and show window
        self.statusBar().showMessage('Ready')
        self.setWindowTitle("ADE7753 Power Meter")
        self.show()
    
# Button slots    

    def startStopClicked(self):
        if(self._running):
            self._running = False
            self.startStopButton.setText("START")
            self.startPressed.emit(False)
        else:
            self._running = True
            self.startStopButton.setText("STOP")
            self.startPressed.emit(True)
            
    def resetButtonClicked(self):
        self.resetPressed.emit()
        
    def broadcastButtonClicked(self, s):
        self.broadcastPressed.emit(s) 
    
    # Helper functions
    
    def HLine(self):
        line = QFrame()
        line.setFrameStyle(QFrame.HLine)
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        return line
    
    def VLine(self):
        line = QFrame()
        line.setFrameStyle(QFrame.VLine)
        line.setFrameShape(QFrame.VLine)
        line.setFrameShadow(QFrame.Sunken)
        return line