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()
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 '''
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