def __init__(self, sourceMeter): QWidget.__init__(self) self.setWindowTitle('Power Sensor') self.sourceMeter = sourceMeter self.setupUi(self) self.workerThread = None plot = self.temperaturePlot plot.setAxisTitle(QwtPlot.yLeft, 'T [K]') plot.setAxisTitle(QwtPlot.xBottom, 't [s]') plot.setCanvasBackground(Qt.black) plot.setTitle('Sensor temperature') curve = QwtPlotCurve('Temperature') curve.setPen(QPen(Qt.white)) curve.attach(plot) self.temperatureCurve = curve plot = self.powerPlot plot.setAxisTitle(QwtPlot.yLeft, 'P [mW]') plot.setAxisTitle(QwtPlot.xBottom, 't [s]') plot.setCanvasBackground(Qt.black) plot.setTitle('Sensor power') curve = QwtPlotCurve('Power') curve.setPen(QPen(Qt.white)) curve.attach(plot) self.powerCurve = curve self.clearData() # self.timer = QTimer() # self.timer.setInterval(500) # self.timer.timeout.connect(self.measure) self.loadSettings()
def add_plot(self, name, units): # legend legend = QwtLegend() legend.setFrameStyle(Qt.QFrame.Box | Qt.QFrame.Sunken) legend.setItemMode(QwtLegend.ClickableItem) # plot plot = QwtPlot(self) plot.setTitle(name.upper()) plot.setObjectName(name) plot.setCanvasBackground(Qt.Qt.white) plot.setAxisTitle(QwtPlot.xBottom, "time [s]") plot.insertLegend(legend, QwtPlot.RightLegend) plot.time = deque(maxlen=MAX_LENGTH) plot.data = [] plot.curves = [] for i, unit in enumerate(units): position = QwtPlot.yLeft if i == 0 else QwtPlot.yRight curve = QwtPlotCurve(LEGENDS[unit]) curve.setPen(Qt.QPen(self.next_color(), 2)) curve.setYAxis(position) curve.attach(plot) plot.enableAxis(position) plot.setAxisTitle(position, unit) plot.curves.append(curve) plot.data.append(deque(maxlen=MAX_LENGTH)) self.vertical_layout.addWidget(plot) self._plots[name] = plot
def test(self): from math import sin, cos from PyQt4.Qwt5 import QwtPlotCurve w = self.winManager.newWindow() plt = w.plot xx = [0.05*x for x in range(100)] y1 = [sin(x) for x in xx] y2 = [cos(x) for x in xx] curve1 = QwtPlotCurve('sin(x)') curve1.attach(plt) curve1.setData(xx, y1) curve2 = QwtPlotCurve('cos(x)') curve2.attach(plt) curve2.setData(xx, y2)
def attachCurves(self, wdg, profiles): for i in range(0, len(profiles)): tmp_name = ("%s") % (profiles[i]["layer"].name()) # As QwtPlotCurve doesn't support nodata, split the data into # single lines # with breaks wherever data is None. # Prepare two lists of coordinates (xx and yy). Make x=None # whenever y is None. xx = profiles[i]["l"] yy = profiles[i]["z"] for j in range(len(yy)): if yy[j] is None: xx[j] = None # Split xx and yy into single lines at None values xx = [ list(g) for k, g in itertools.groupby(xx, lambda x: x is None) if not k ] yy = [ list(g) for k, g in itertools.groupby(yy, lambda x: x is None) if not k ] Cstyle = profiles[i]["style"] # Create & attach one QwtPlotCurve per one single line for j in range(len(xx)): curve = QwtPlotCurve(tmp_name) curve.setData(xx[j], yy[j]) curve.setPen(Cstyle) curve.attach(wdg) # scaling this try: wdg.setAxisScale(2, 0, max(profiles[len(profiles) - 1]["l"]), 0) self.resetScale(wdg, profiles) except: pass # self.iface.mainWindow().statusBar().showMessage( # "Problem with setting scale of plotting") # self.resetScale(wdg, profiles) wdg.replot()
class PlotVariable: """ A plot variable corresponds to one curve on the plot. It keeps track of the generating expression and of the values of the expression over time. """ def __init__(self, label, expression, plot, color=None): self.expression = expression self.data = ExpandableQwtData() self.curve = QwtPlotCurve(label) self.curve.setData(self.data) self.curve.setPen(QtGui.QPen(get_color(color))) self.curve.attach(plot) def add_point(self, x, y): self.data.add_point(x, y) def clear_data(self): self.data.clear_data()
def __init__(self, mwHandle): self.mw = mwHandle self.curves = list() self.data = list() self.bars = list() for i in xrange(0, 6): self.bars.append( { "group": eval("self.mw.gbAnalog%d" % (i)), "bar": eval("self.mw.analogBar%d" % (i)), "label": eval("self.mw.lbAnalog%d" % (i)), "active": eval("self.mw.analogShow%d" % (i)), } ) eval("self.mw.analogShow%d" % (i)).stateChanged.connect(partial(self._channelVisible, i)) self.mw.analogPlot.setAutoReplot(False) self.mw.analogPlot.plotLayout().setAlignCanvasToScales(True) grid = QwtPlotGrid() grid.enableXMin(True) grid.enableYMin(True) grid.attach(self.mw.analogPlot) grid.setPen(QPen(Qt.black, 0, Qt.DotLine)) grid.setMinPen(QPen(Qt.lightGray, 0, Qt.DotLine)) self.mw.analogPlot.setAxisScale(QwtPlot.xBottom, 0, HISTORY) self.mw.analogPlot.setAxisScale(QwtPlot.yLeft, 0, 5) self.mw.analogUnits.insertItems(0, ("Voltios", "Cuentas")) self.mw.board.updateAnalog.connect(self._newSample) self.mw.analogUnits.currentIndexChanged.connect(self._changedUnits) self.mw.analogUnitsTime.currentIndexChanged.connect(self._changedUnitsTime) self.mw.analogTime.valueChanged[int].connect(self._changedTime) colors = (Qt.blue, Qt.red, Qt.black, Qt.darkGreen, Qt.darkCyan, Qt.magenta) for i in xrange(0, 6): curve = QwtPlotCurve() curve.setPen(QPen(colors[i], 2)) curve.attach(self.mw.analogPlot) self.curves.append(curve) self.data.append(self._zeros(HISTORY + 1)) self.bars[i]["bar"].setFillBrush(colors[i]) self.mw.analogPlot.replot()
def __init__(self, title, xdata, ydata, style, symbol=None, *args): super(BMPlot, self).__init__(*args) self.setMinimumSize(200, 200) self.setTitle(title) self.setAxisTitle(QwtPlot.xBottom, 'x') self.setAxisTitle(QwtPlot.yLeft, 'y') self.curve_nb = 0 for idx in range(1, 11): self.curve_nb += 1 curve = QwtPlotCurve() curve.setPen(QPen(get_curve_color())) curve.setStyle(style) curve.setRenderHint(QwtPlotCurve.RenderAntialiased) if symbol is not None: curve.setSymbol(symbol) curve.attach(self) curve.setData(xdata, ydata*idx, finite=False) # self.setAxisScale(self.yLeft, -1.5, 1.5) # self.setAxisScale(self.xBottom, 9.9, 10.) self.replot()
class PlotVariable: """ A plot variable corresponds to one curve on the plot. It keeps track of the generating expression and of the values of the expression over time. """ def __init__(self,label,expression,plot,color = None): self.expression = expression self.data = ExpandableQwtData() self.curve = QwtPlotCurve(label) self.curve.setData(self.data) self.curve.setPen(QtGui.QPen(get_color(color))) self.curve.attach(plot) def add_point(self,x,y): self.data.add_point(x,y) def clear_data(self): self.data.clear_data()
def __init__(self, title, xdata, ydata, style, symbol=None, *args): super(BMPlot, self).__init__(*args) self.setMinimumSize(200, 200) self.setTitle(title) self.setAxisTitle(QwtPlot.xBottom, 'x') self.setAxisTitle(QwtPlot.yLeft, 'y') self.curve_nb = 0 for idx in range(1, 11): self.curve_nb += 1 curve = QwtPlotCurve() curve.setPen(QPen(get_curve_color())) curve.setStyle(style) curve.setRenderHint(QwtPlotCurve.RenderAntialiased) if symbol is not None: curve.setSymbol(symbol) curve.attach(self) curve.setData(xdata, ydata * idx, finite=False) # self.setAxisScale(self.yLeft, -1.5, 1.5) # self.setAxisScale(self.xBottom, 9.9, 10.) self.replot()
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(847, 480) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.centralwidget) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) #Tworzenie zakładek self.tabs = QtGui.QTabWidget(self.centralwidget) #Główny wykre self.plot = QwtPlot(self.centralwidget) self.plot.setObjectName(_fromUtf8("plot")) self.plot.setAxisScale(self.plot.yLeft, -20, 80) self.plot.setAutoFillBackground(True) #self.plot.setPalette(Qt.Qt.black) self.plot.setCanvasBackground(Qt.Qt.black) self.grid = QwtPlotGrid() '''self.Yscale = QwtScaleDiv() self.Yscale.setInterval(10) self.Xscale = QwtScaleDiv() self.Xscale.setInterval(10) self.grid.setYDiv(self.YScale) self.grid.setXDiv(self.Xscale)''' self.grid.setMajPen(Qt.Qt.gray) self.grid.attach(self.plot) self.tabs.addTab(self.plot, "Spectrum") self.curve = QwtPlotCurve('') self.curve.setPen(Qt.Qt.yellow) self.curve.attach(self.plot) self.hold_curve = QwtPlotCurve('') self.hold_curve.setPen(Qt.Qt.red) self.peak_marker = QwtPlotMarker() self.symbol = QwtSymbol(QwtSymbol.DTriangle, QtGui.QBrush(Qt.Qt.red), QtGui.QPen(Qt.Qt.red), QtCore.QSize(10,10)) self.peak_marker.setSymbol(self.symbol) self.peak_marker.setLabelAlignment(Qt.Qt.AlignTop) self.sybmol_2 = QwtSymbol(QwtSymbol.DTriangle, QtGui.QBrush(Qt.Qt.red), QtGui.QPen(Qt.Qt.white), QtCore.QSize(10,10)) self.marker_1 = QwtPlotMarker() self.marker_1.setSymbol(self.sybmol_2) self.marker_1.setLabelAlignment(Qt.Qt.AlignTop) self.marker_2 = QwtPlotMarker() self.marker_2.setSymbol(self.sybmol_2) self.marker_2.setLabelAlignment(Qt.Qt.AlignTop) self.marker_3 = QwtPlotMarker() self.marker_3.setSymbol(self.sybmol_2) self.marker_3.setLabelAlignment(Qt.Qt.AlignTop) self.marker_4 = QwtPlotMarker() self.marker_4.setSymbol(self.sybmol_2) self.marker_4.setLabelAlignment(Qt.Qt.AlignTop) self.delta_marker = QwtPlotMarker() self.delta_marker.setSymbol(self.sybmol_2) self.delta_marker.setLabelAlignment(Qt.Qt.AlignTop) self.markers = [self.marker_1, self.marker_2, self.marker_3, self.marker_4] self.save_curve_1 = QwtPlotCurve('') self.save_curve_1.setPen(Qt.Qt.green) self.save_curve_2 = QwtPlotCurve('') self.save_curve_2.setPen(Qt.Qt.cyan) self.save_curve_3 = QwtPlotCurve('') self.save_curve_3.setPen(Qt.Qt.magenta) self.saved_curves = [self.save_curve_1, self.save_curve_2, self.save_curve_3] #Wykres waterfall '''self.plot_2 = QwtPlot(self.centralwidget) self.plot_2.setObjectName(_fromUtf8("plot_2")) self.waterfall = QwtPlotSpectrogram() self.waterfall.attach(self.plot_2) self.colorMap = QwtLinearColorMap(Qt.Qt.darkCyan, Qt.Qt.red) self.scaleColors(80) self.waterfall.setColorMap(self.colorMap) #self.waterfallData = QwtRasterData() #self.tabs.addTab(self.plot_2, "Waterfall")''' self.verticalLayout.addWidget(self.tabs) self.picker = QwtPlotPicker(QwtPlot.xBottom, QwtPlot.yLeft, QwtPicker.PointSelection | QwtPicker.DragSelection, QwtPlotPicker.CrossRubberBand, QwtPicker.AlwaysOn, self.plot.canvas()) self.picker.setTrackerPen(Qt.Qt.white) self.picker.setRubberBandPen(Qt.Qt.gray) self.freqBox = QtGui.QGroupBox(self.centralwidget) self.freqBox.setObjectName(_fromUtf8("freqBox")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.freqBox) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.formLayout_3 = QtGui.QFormLayout() self.formLayout_3.setObjectName(_fromUtf8("formLayout_3")) self.label = QtGui.QLabel(self.freqBox) self.label.setObjectName(_fromUtf8("label")) self.formLayout_3.setWidget(0, QtGui.QFormLayout.LabelRole, self.label) self.startEdit = QtGui.QDoubleSpinBox(self.freqBox) self.startEdit.setObjectName(_fromUtf8("startEdit")) self.startEdit.setDecimals(2) self.startEdit.setRange(1, 1280) self.startEdit.setKeyboardTracking(False) self.formLayout_3.setWidget(0, QtGui.QFormLayout.FieldRole, self.startEdit) self.horizontalLayout.addLayout(self.formLayout_3) self.formLayout_4 = QtGui.QFormLayout() self.formLayout_4.setObjectName(_fromUtf8("formLayout_4")) self.label_2 = QtGui.QLabel(self.freqBox) self.label_2.setObjectName(_fromUtf8("label_2")) self.formLayout_4.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_2) self.stopEdit = QtGui.QDoubleSpinBox(self.freqBox) self.stopEdit.setObjectName(_fromUtf8("stopEdit")) self.stopEdit.setDecimals(2) self.stopEdit.setRange(1, 1280) self.stopEdit.setKeyboardTracking(False) self.formLayout_4.setWidget(0, QtGui.QFormLayout.FieldRole, self.stopEdit) self.horizontalLayout.addLayout(self.formLayout_4) self.formLayout_5 = QtGui.QFormLayout() self.formLayout_5.setObjectName(_fromUtf8("formLayout_5")) self.label_3 = QtGui.QLabel(self.freqBox) self.label_3.setObjectName(_fromUtf8("label_3")) self.formLayout_5.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_3) self.rbwEdit = QtGui.QComboBox(self.freqBox) self.rbwEdit.setObjectName(_fromUtf8("rbwEdit")) self.rbwEdit.addItem('0,21 kHz', 16384) self.rbwEdit.addItem('0,42 kHz', 8192) self.rbwEdit.addItem('0,84 kHz', 4096) self.rbwEdit.addItem('1,69 kHz', 2048) self.rbwEdit.addItem('3,38 kHz', 1024) self.rbwEdit.addItem('6,75 kHz', 512) self.rbwEdit.addItem('13,5 kHz', 256) self.rbwEdit.addItem('27 kHz', 128) self.rbwEdit.addItem('54 kHz', 64) self.rbwEdit.addItem('108 kHz', 32) self.rbwEdit.addItem('216 kHz', 16) self.rbwEdit.addItem('432 kHz', 8) self.rbwEdit.setCurrentIndex(4) self.formLayout_5.setWidget(0, QtGui.QFormLayout.FieldRole, self.rbwEdit) self.horizontalLayout.addLayout(self.formLayout_5) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout_3.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.formLayout_7 = QtGui.QFormLayout() self.formLayout_7.setObjectName(_fromUtf8("formLayout_7")) self.centerLabel = QtGui.QLabel(self.freqBox) self.centerLabel.setObjectName(_fromUtf8("centerLabel")) self.formLayout_7.setWidget(0, QtGui.QFormLayout.LabelRole, self.centerLabel) self.centerEdit = QtGui.QDoubleSpinBox(self.freqBox) self.centerEdit.setObjectName(_fromUtf8("centerEdit")) self.centerEdit.setDecimals(2) self.centerEdit.setRange(1, 1280) self.centerEdit.setKeyboardTracking(False) self.formLayout_7.setWidget(0, QtGui.QFormLayout.FieldRole, self.centerEdit) self.horizontalLayout_3.addLayout(self.formLayout_7) self.formLayout_8 = QtGui.QFormLayout() self.formLayout_8.setObjectName(_fromUtf8("formLayout_8")) self.spanLabel = QtGui.QLabel(self.freqBox) self.spanLabel.setObjectName(_fromUtf8("spanLabel")) self.formLayout_8.setWidget(0, QtGui.QFormLayout.LabelRole, self.spanLabel) self.spanEdit = QtGui.QDoubleSpinBox(self.freqBox) self.spanEdit.setObjectName(_fromUtf8("spanEdit")) self.spanEdit.setDecimals(2) self.spanEdit.setRange(0.1, 1280) self.spanEdit.setKeyboardTracking(False) self.formLayout_8.setWidget(0, QtGui.QFormLayout.FieldRole, self.spanEdit) self.horizontalLayout_3.addLayout(self.formLayout_8) self.horizontalLayout_3.addItem(spacerItem) self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.verticalLayout.addWidget(self.freqBox) self.horizontalLayout_2.addLayout(self.verticalLayout) self.settingsBox = QtGui.QGroupBox(self.centralwidget) self.settingsBox.setMaximumSize(QtCore.QSize(250, 16777215)) self.settingsBox.setObjectName(_fromUtf8("settingsBox")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.settingsBox) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.formLayout = QtGui.QFormLayout() self.formLayout.setObjectName(_fromUtf8("formLayout")) self.gainLabel = QtGui.QLabel(self.settingsBox) self.gainLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.gainLabel.setObjectName(_fromUtf8("gainLabel")) self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.gainLabel) self.gainSlider = QtGui.QSlider(self.settingsBox) self.gainSlider.setMaximum(49) self.gainSlider.setSingleStep(1) self.gainSlider.setProperty("value", 20) self.gainSlider.setOrientation(QtCore.Qt.Horizontal) self.gainSlider.setObjectName(_fromUtf8("gainSlider")) self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.gainSlider) self.verticalLayout_2.addLayout(self.formLayout) self.gainDisp = QtGui.QLCDNumber(self.settingsBox) self.gainDisp.setSegmentStyle(QtGui.QLCDNumber.Flat) self.verticalLayout_2.addWidget(self.gainDisp) '''self.offsetButton = QtGui.QPushButton(self.settingsBox) self.offsetButton.setText("Remove DC offset") self.verticalLayout_2.addWidget(self.offsetButton) ''' self.formLayout_2 = QtGui.QFormLayout() self.formLayout_2.setObjectName(_fromUtf8("formLayout_2")) self.refLabel = QtGui.QLabel(self.settingsBox) self.refLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.refLabel.setObjectName(_fromUtf8("refLabel")) self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.refLabel) self.refEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.refEdit.setObjectName(_fromUtf8("refEdit")) self.refEdit.setDecimals(0) self.refEdit.setKeyboardTracking(False) self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.refEdit) self.verticalLayout_2.addLayout(self.formLayout_2) spacerItem1 = QtGui.QSpacerItem(158, 304, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem1) #Settings tabs self.settings_tabs = QtGui.QTabWidget(self.settingsBox) self.verticalLayout_2.addWidget(self.settings_tabs) self.verticalLayout_4 = QtGui.QVBoxLayout() self.saveButton = QtGui.QPushButton(self.settingsBox) self.saveButton.setText("Save plot") self.verticalLayout_4.addWidget(self.saveButton) self.formLayout_9 = QtGui.QFormLayout() self.formLayout_9.setObjectName(_fromUtf8("formLayout_9")) self.avgLabel = QtGui.QLabel(self.settingsBox) self.avgLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.avgLabel.setObjectName(_fromUtf8("avgLabel")) self.formLayout_9.setWidget(0, QtGui.QFormLayout.LabelRole, self.avgLabel) self.avgCheck = QtGui.QCheckBox(self.settingsBox) self.formLayout_9.setWidget(0, QtGui.QFormLayout.FieldRole, self.avgCheck) self.verticalLayout_4.addLayout(self.formLayout_9) self.formLayout_10 = QtGui.QFormLayout() self.avgLabel_2 = QtGui.QLabel(self.settingsBox) self.avgLabel_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.avgLabel_2.setObjectName(_fromUtf8("avgLabel_2")) self.formLayout_10.setWidget(0, QtGui.QFormLayout.LabelRole, self.avgLabel_2) self.avgEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.avgEdit.setDecimals(0) self.avgEdit.setRange(1, 100) self.avgEdit.setKeyboardTracking(False) self.avgEdit.setValue(10) self.formLayout_10.setWidget(0, QtGui.QFormLayout.FieldRole, self.avgEdit) self.verticalLayout_4.addLayout(self.formLayout_10) self.formLayout_6 = QtGui.QFormLayout() self.formLayout_6.setObjectName(_fromUtf8("formLayout_6")) self.holdLabel = QtGui.QLabel(self.settingsBox) self.holdLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.holdLabel.setObjectName(_fromUtf8("holdLabel")) self.formLayout_6.setWidget(0, QtGui.QFormLayout.LabelRole, self.holdLabel) self.holdCheck = QtGui.QCheckBox(self.settingsBox) self.formLayout_6.setWidget(0, QtGui.QFormLayout.FieldRole, self.holdCheck) self.verticalLayout_4.addLayout(self.formLayout_6) self.formLayout_11 = QtGui.QFormLayout() self.formLayout_11.setObjectName(_fromUtf8("formLayout_11")) self.peakLabel = QtGui.QLabel(self.settingsBox) self.peakLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.peakLabel.setObjectName(_fromUtf8("peakLabel")) self.formLayout_11.setWidget(0, QtGui.QFormLayout.LabelRole, self.peakLabel) self.peakCheck = QtGui.QCheckBox(self.settingsBox) self.formLayout_11.setWidget(0, QtGui.QFormLayout.FieldRole, self.peakCheck) self.verticalLayout_4.addLayout(self.formLayout_11) self.peakStatus = QtGui.QLabel("Peak: ") self.correctButton = QtGui.QPushButton(self.settingsBox) self.correctButton.setText("Correction") self.verticalLayout_4.addWidget(self.correctButton) self.verticalLayout_5 = QtGui.QVBoxLayout() self.traceButton = QtGui.QPushButton(self.settingsBox) self.traceButton.setText("Save trace 1") self.verticalLayout_5.addWidget(self.traceButton) self.traceButton_2 = QtGui.QPushButton(self.settingsBox) self.traceButton_2.setText("Save trace 2") self.verticalLayout_5.addWidget(self.traceButton_2) self.traceButton_3 = QtGui.QPushButton(self.settingsBox) self.traceButton_3.setText("Save trace 3") self.verticalLayout_5.addWidget(self.traceButton_3) self.traces = [self.traceButton, self.traceButton_2, self.traceButton_3] #MARKERS self.gridLayout = QtGui.QGridLayout() self.markerLabel = QtGui.QLabel(self.settingsBox) self.markerLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel, 0,0) self.markerCheck = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck, 0,1) self.markerEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit.setDecimals(2) self.markerEdit.setKeyboardTracking(False) self.markerEdit.setDisabled(True) self.markerEdit.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit, 0,2) self.markerLabel_2 = QtGui.QLabel(self.settingsBox) self.markerLabel_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel_2, 2,0) self.markerCheck_2 = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck_2, 2,1) self.markerEdit_2 = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit_2.setDecimals(2) self.markerEdit_2.setKeyboardTracking(False) self.markerEdit_2.setDisabled(True) self.markerEdit_2.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit_2, 2,2) self.markerLabel_3 = QtGui.QLabel(self.settingsBox) self.markerLabel_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel_3, 3,0) self.markerCheck_3 = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck_3, 3,1) self.markerEdit_3 = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit_3.setDecimals(2) self.markerEdit_3.setKeyboardTracking(False) self.markerEdit_3.setDisabled(True) self.markerEdit_3.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit_3, 3,2) self.markerLabel_4 = QtGui.QLabel(self.settingsBox) self.markerLabel_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel_4, 4,0) self.markerCheck_4 = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck_4, 4,1) self.markerEdit_4 = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit_4.setDecimals(2) self.markerEdit_4.setKeyboardTracking(False) self.markerEdit_4.setDisabled(True) self.markerEdit_4.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit_4, 4,2) self.deltaLabel = QtGui.QLabel(self.settingsBox) self.deltaLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.deltaLabel, 1,0) self.deltaCheck = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.deltaCheck, 1,1) self.deltaEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.deltaEdit.setDecimals(2) self.deltaEdit.setSingleStep(0.1) self.deltaEdit.setKeyboardTracking(False) self.deltaEdit.setDisabled(True) self.gridLayout.addWidget(self.deltaEdit, 1,2) self.deltaCheck.setDisabled(True) self.tab1 = QtGui.QWidget() self.settings_tabs.addTab(self.tab1, "Misc.") self.settings_tabs.widget(0).setLayout(self.verticalLayout_4) self.tab2 = QtGui.QWidget() self.settings_tabs.addTab(self.tab2, "Traces") self.settings_tabs.widget(1).setLayout(self.verticalLayout_5) self.tab3 = QtGui.QWidget() self.settings_tabs.addTab(self.tab3, "Markers") self.settings_tabs.widget(2).setLayout(self.gridLayout) self.horizontalLayout_2.addWidget(self.settingsBox) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 847, 21)) self.menubar.setObjectName(_fromUtf8("menubar")) MainWindow.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.statusbar.addWidget(self.peakStatus) self.statusbar.setVisible(False) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.gainSlider.valueChanged.connect(self.gainDisp.display) self.saveButton.clicked.connect(self.savePlot) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "Analizator 0.4", None)) self.freqBox.setTitle(_translate("MainWindow", "Częstotliwość", None)) self.label.setText(_translate("MainWindow", "START [MHz]:", None)) self.label_2.setText(_translate("MainWindow", "STOP [MHz]:", None)) self.label_3.setText(_translate("MainWindow", "RBW:", None)) self.settingsBox.setTitle(_translate("MainWindow", "Ustawienia", None)) self.gainLabel.setText(_translate("MainWindow", "Gain:", None)) self.refLabel.setText(_translate("MainWindow", "REF:", None)) self.holdLabel.setText(_translate("MainWindow", "Max HOLD:", None)) self.centerLabel.setText(_translate("MainWindow", "Center [MHz]:", None)) self.spanLabel.setText(_translate("MainWindow", "Span [MHz]:", None)) self.avgLabel.setText(_translate("MainWindow", "Average:", None)) self.avgLabel_2.setText(_translate("MainWindow", "Avg traces:", None)) self.peakLabel.setText(_translate("MainWindow", "Peak search:", None)) self.markerLabel.setText(_translate("MainWindow", "Marker 1:", None)) self.markerLabel_2.setText(_translate("MainWindow", "Marker 2:", None)) self.markerLabel_3.setText(_translate("MainWindow", "Marker 3:", None)) self.markerLabel_4.setText(_translate("MainWindow", "Marker 4:", None)) self.deltaLabel.setText(_translate("MainWindow", "Delta 1:", None)) def savePlot(self): dialog = QtGui.QFileDialog() pixmap = QtGui.QPixmap() pixmap = pixmap.grabWidget(self.plot) fileName = dialog.getSaveFileName() print pixmap.save(fileName, format="PNG", quality = -1) print pixmap.isNull() print "Plot saved" def scaleColors(self, ref): self.colorMap.addColorStop(ref-60, Qt.Qt.cyan) self.colorMap.addColorStop(ref-40, Qt.Qt.green) self.colorMap.addColorStop(ref-20, Qt.Qt.yellow)
class RTTView(QtGui.QWidget, Ui_RTTView): def __init__(self, parent=None): super(RTTView, self).__init__(parent) self.setupUi(self) self.initSetting() self.initQwtPlot() self.daplink = None self.tmrDAP = QtCore.QTimer() self.tmrDAP.setInterval(10) self.tmrDAP.timeout.connect(self.on_tmrDAP_timeout) self.tmrDAP.start() self.tmrCntr = 0 # tmrDAP超时一次,tmrCntr加一 def initSetting(self): if not os.path.exists('setting.ini'): open('setting.ini', 'w') self.conf = ConfigParser.ConfigParser() self.conf.read('setting.ini') if not self.conf.has_section('globals'): self.conf.add_section('globals') self.conf.set('globals', 'mappath', '[]') for path in eval(self.conf.get('globals', 'mappath')): self.cmbMap.insertItem(10, path) def initQwtPlot(self): self.PlotBuff = '' self.PlotData = [0] * 1000 self.qwtPlot = QwtPlot(self) self.vLayout0.insertWidget(0, self.qwtPlot) self.PlotCurve = QwtPlotCurve() self.PlotCurve.attach(self.qwtPlot) self.PlotCurve.setData(range(1, len(self.PlotData) + 1), self.PlotData) self.on_cmbMode_currentIndexChanged(u'文本') def parseRTTAddr(self): with open(self.cmbMap.currentText(), 'r') as f: for line in f: match = re.match( '\s+_SEGGER_RTT\s+(0x[0-9a-fA-F]{8})\s+Data.+', line) if match: return int(match.group(1), 16) else: raise Exception('Can not found _SEGGER_RTT') @QtCore.pyqtSlot() def on_btnOpen_clicked(self): if self.btnOpen.text() == u'打开连接': try: self.daplink.open() self.dp = coresight.dap.DebugPort(self.daplink) self.dp.init() self.dp.power_up_debug() self.ap = coresight.ap.AHB_AP(self.dp, 0) self.ap.init() self.RTTAddr = self.parseRTTAddr() except Exception as e: print e else: self.btnOpen.setText(u'关闭连接') self.lblOpen.setPixmap(QtGui.QPixmap("./Image/inopening.png")) else: try: self.daplink.close() except Exception as e: print e finally: self.btnOpen.setText(u'打开连接') self.lblOpen.setPixmap(QtGui.QPixmap("./Image/inclosing.png")) def aUpEmpty(self): LEN = (16 + 4 * 2) + (4 * 6) * 4 buf = self.ap.readBlockMemoryUnaligned8(self.RTTAddr, LEN) arr = struct.unpack('16sLLLLLLLL24xLLLLLL24x', ''.join([chr(x) for x in buf])) self.aUp = RingBuffer(arr[3:9]) print 'WrOff=%d, RdOff=%d' % (self.aUp.WrOff, self.aUp.RdOff) self.aDown = RingBuffer(arr[9:15]) return (self.aUp.RdOff == self.aUp.WrOff) def aUpRead(self): if self.aUp.RdOff < self.aUp.WrOff: len_ = self.aUp.WrOff - self.aUp.RdOff arr = self.ap.readBlockMemoryUnaligned8( self.aUp.pBuffer + self.aUp.RdOff, len_) self.aUp.RdOff += len_ self.ap.write32(self.RTTAddr + (16 + 4 * 2) + 4 * 4, self.aUp.RdOff) else: len_ = self.aUp.SizeOfBuffer - self.aUp.RdOff + 1 arr = self.ap.readBlockMemoryUnaligned8( self.aUp.pBuffer + self.aUp.RdOff, len_) self.aUp.RdOff = 0 #这样下次再读就会进入执行上个条件 self.ap.write32(self.RTTAddr + (16 + 4 * 2) + 4 * 4, self.aUp.RdOff) return ''.join([chr(x) for x in arr]) def on_tmrDAP_timeout(self): if self.btnOpen.text() == u'关闭连接': ss = '' try: if not self.aUpEmpty(): ss = self.aUpRead() except Exception as e: pass if ss: if self.mode == u'文本': if len(self.txtMain.toPlainText()) > 50000: self.txtMain.clear() self.txtMain.moveCursor(QtGui.QTextCursor.End) self.txtMain.insertPlainText(ss) elif self.mode == u'波形': self.PlotBuff += ss if self.PlotBuff.rfind(',') == -1: return try: d = [ int(x) for x in self. PlotBuff[0:self.PlotBuff.rfind(',')].split(',') ] for x in d: self.PlotData.pop(0) self.PlotData.append(x) except: self.PlotBuff = '' else: self.PlotBuff = self.PlotBuff[self.PlotBuff. rfind(',') + 1:] self.PlotCurve.setData(range(1, len(self.PlotData) + 1), self.PlotData) self.qwtPlot.replot() self.detect_daplink() # 自动检测 DAPLink 的热插拔 def detect_daplink(self): daplinks = pyDAPAccess.DAPAccess.get_connected_devices() if self.daplink and (daplinks == []): # daplink被拔下 try: self.daplink.close() except Exception as e: print e finally: self.daplink = None self.linDAP.clear() self.btnOpen.setText(u'打开连接') self.lblOpen.setPixmap(QtGui.QPixmap("./Image/inclosing.png")) if not self.daplink and daplinks != []: self.daplink = daplinks[0] self.linDAP.clear() self.linDAP.setText(self.daplink._product_name) @QtCore.pyqtSlot() def on_btnMap_clicked(self): path = QtGui.QFileDialog.getOpenFileName( caption=u'项目.map文件路径', filter=u'MDK .map file (*.map)', directory=self.cmbMap.currentText()) if path != '': self.cmbMap.insertItem(0, path) self.cmbMap.setCurrentIndex(0) @QtCore.pyqtSlot(str) def on_cmbMode_currentIndexChanged(self, str): self.mode = str self.txtMain.setVisible(self.mode == u'文本') self.qwtPlot.setVisible(self.mode == u'波形') @QtCore.pyqtSlot() def on_btnClear_clicked(self): self.txtMain.clear() def closeEvent(self, evt): paths = [] for i in range(min(10, self.cmbMap.count())): paths.append(self.cmbMap.itemText(i)) self.conf.set('globals', 'mappath', repr(paths)) self.conf.write(open('setting.ini', 'w'))
class ToftofProfileWindow(DlgUtils, QMainWindow): def __init__(self, parent): QMainWindow.__init__(self, parent) DlgUtils.__init__(self, 'Live data') self.panel = parent layout1 = QVBoxLayout() self.plot = QwtPlot(self) layout1.addWidget(self.plot) self.curve = QwtPlotCurve() self.curve.setRenderHint(QwtPlotCurve.RenderAntialiased) self.curve.attach(self.plot) self.marker = QwtPlotMarker() self.marker.attach(self.plot) self.markerpen = QPen(Qt.red) self.marker.setSymbol( QwtSymbol(QwtSymbol.Ellipse, QBrush(), self.markerpen, QSize(7, 7))) self.zoomer = QwtPlotZoomer(self.plot.canvas()) self.zoomer.setMousePattern(QwtPlotZoomer.MouseSelect3, Qt.NoButton) self.picker = QwtPlotPicker(self.plot.canvas()) self.picker.setSelectionFlags(QwtPlotPicker.PointSelection | QwtPlotPicker.ClickSelection) self.picker.setMousePattern(QwtPlotPicker.MouseSelect1, Qt.MidButton) self.picker.selected.connect(self.pickerSelected) layout2 = QHBoxLayout() layout2.addWidget(QLabel('Scale:', self)) self.scale = QComboBox(self) self.scale.addItems([ 'Single detectors, sorted by angle', 'Scattering angle 2theta (deg)', 'Q value (A-1)' ]) self.scale.currentIndexChanged[int].connect(self.scaleChanged) layout2.addWidget(self.scale) layout2.addStretch() self.scaleframe = QFrame(self) self.scaleframe.setLayout(layout2) self.scaleframe.setVisible(False) layout1.addWidget(self.scaleframe) mainframe = QFrame(self) mainframe.setLayout(layout1) self.setCentralWidget(mainframe) self.setContentsMargins(6, 6, 6, 6) plotfont = scaledFont(self.font(), 0.7) self.plot.setAxisFont(QwtPlot.xBottom, plotfont) self.plot.setAxisFont(QwtPlot.yLeft, plotfont) self.plot.setCanvasBackground(Qt.white) self.resize(800, 200) self._detinfo = None self._anglemap = None self._infowindow = None self._infolabel = None self._xs = self._ys = None self._type = None def _retrieve_detinfo(self): if self._detinfo is None: info = self.panel.client.eval( 'det._detinfo_parsed, ' 'det._anglemap', None) if not info: return self.showError('Cannot retrieve detector info.') self._lambda = self.panel.client.eval('chWL()', None) if not self._lambda: return self.showError('Cannot retrieve wavelength.') self._detinfo, self._anglemap = info self._inverse_anglemap = 0 self._infowindow = QMainWindow(self) self._infolabel = QLabel(self._infowindow) self._infolabel.setTextFormat(Qt.RichText) self._infowindow.setCentralWidget(self._infolabel) self._infowindow.setContentsMargins(10, 10, 10, 10) self._inv_anglemap = [[ entry for entry in self._detinfo[1:] if entry[12] == self._anglemap[detnr] + 1 ][0] for detnr in range(len(self._xs))] def scaleChanged(self, scale): self.update(self._type, self._orig_nbins, self._orig_x, self._orig_y) def update(self, proftype, nbins, x, y): self._orig_x = x self._orig_y = y self._orig_nbins = nbins x.setsize(8 * nbins) y.setsize(8 * nbins) xs = struct.unpack('d' * nbins, x) ys = struct.unpack('d' * nbins, y) if proftype == 0: if self.scale.currentIndex() == 0: xs = xs elif self.scale.currentIndex() == 1: self._retrieve_detinfo() xs = [self._inv_anglemap[int(xi)][5] for xi in xs] else: self._retrieve_detinfo() if self._lambda is None: self.showError('Could not determine wavelength.') self.scale.setCurrentIndex(1) return xs = [ 4 * pi / self._lambda * sin(radians(self._inv_anglemap[int(xi)][5] / 2.)) for xi in xs ] self._xs = xs self._ys = ys self.curve.setData(xs, ys) self.plot.setAxisAutoScale(QwtPlot.xBottom) self.plot.setAxisAutoScale(QwtPlot.yLeft) self.marker.setVisible(False) self.zoomer.setZoomBase(True) self._type = proftype if proftype == 0: self.setWindowTitle( 'Single detector view (time-channel integrated)') self.scaleframe.setVisible(True) elif proftype == 1: self.setWindowTitle('Time channel view (detector integrated)') self.scaleframe.setVisible(False) else: self.scaleframe.setVisible(False) def pickerSelected(self, point): if self._type != 0: return self._retrieve_detinfo() index = self.curve.closestPoint(self.picker.transform(point))[0] detentry = self._inv_anglemap[index][:] detentry.append(self._xs[index]) detentry.append(self._ys[index]) self.marker.setXValue(self._xs[index]) self.marker.setYValue(self._ys[index]) self.marker.setVisible(True) self.plot.replot() self._infowindow.show() entrynames = [ 'EntryNr', 'Rack', 'Plate', 'Pos', 'RPos', '2Theta', 'CableNr', 'CableType', 'CableLen', 'CableEmpty', 'Card', 'Chan', 'Total', 'DetName', 'BoxNr', 'BoxChan', 'XValue', 'Counts' ] formats = [ '%s', '%d', '%d', '%d', '%d', '%.3f', '%d', '%d', '%.2f', '%d', '%d', '%d', '%d', '%r', '%d', '%d', '%s', '%d' ] empties = [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0] self._infolabel.setText('Detector info:<br><table>' + ''.join( '<tr><td>%s</td><td></td><td>%s</td></tr>%s' % (name, format % value, '<tr></tr>' if empty else '') for (name, format, empty, value) in zip(entrynames, formats, empties, detentry)) + '</table>') def closeEvent(self, event): if self._infowindow: self._infowindow.close()
app = QtGui.QApplication(sys.argv) p = QwtPlot() curve = QwtPlotCurve("Segon i tal") fn = resDir + '/' + data f = file(fn) v = pickle.load(f) y = v x = range(len(y)) curve.setData(x, y) curve.attach(p) p.replot() p.show() sys.exit(app.exec_())
class ValueWidget(QWidget, Ui_Widget): def __init__(self, iface): self.hasqwt=hasqwt self.hasmpl=hasmpl self.layerMap=dict() self.statsChecked=False self.ymin=0 self.ymax=250 self.isActive=False # Statistics (>=1.9) self.statsSampleSize = 2500000 self.stats = {} # stats per layer self.layersSelected=[] self.layerBands=dict() self.iface=iface self.canvas=self.iface.mapCanvas self.legend=self.iface.legendInterface() self.logger = logging.getLogger('.'.join((__name__, self.__class__.__name__))) QWidget.__init__(self) self.setupUi(self) self.tabWidget.setEnabled(False) self.cbxClick.setChecked( QSettings().value('plugins/valuetool/mouseClick', False, type=bool ) ) #self.setupUi_plot() #don't setup plot until Plot tab is clicked - workaround for bug #7450 #qgis will still crash in some cases, but at least the tool can be used in Table mode self.qwtPlot = None self.mplPlot = None self.mplLine = None QObject.connect(self.plotSelector, SIGNAL( "currentIndexChanged ( int )" ), self.changePlot ) QObject.connect(self.tabWidget, SIGNAL( "currentChanged ( int )" ), self.tabWidgetChanged ) QObject.connect(self.cbxLayers, SIGNAL( "currentIndexChanged ( int )" ), self.updateLayers ) QObject.connect(self.cbxBands, SIGNAL( "currentIndexChanged ( int )" ), self.updateLayers ) QObject.connect(self.tableWidget2, SIGNAL("cellChanged ( int , int )"), self.layerSelected) def setupUi_plot(self): # plot self.plotSelector.setVisible( False ) self.cbxStats.setVisible( False ) # stats by default because estimated are fast self.cbxStats.setChecked( True ) self.plotSelector.addItem( 'Qwt' ) self.plotSelector.addItem( 'mpl' ) # Page 2 - qwt if self.hasqwt: self.qwtPlot = QwtPlot(self.stackedWidget) self.qwtPlot.setAutoFillBackground(False) self.qwtPlot.setObjectName("qwtPlot") self.curve = QwtPlotCurve() self.curve.setSymbol( QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.white), QPen(Qt.red, 2), QSize(9, 9))) self.curve.attach(self.qwtPlot) else: self.qwtPlot = QtGui.QLabel("Need Qwt >= 5.0 or matplotlib >= 1.0 !") sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.qwtPlot.sizePolicy().hasHeightForWidth()) self.qwtPlot.setSizePolicy(sizePolicy) self.qwtPlot.updateGeometry() self.stackedWidget.addWidget(self.qwtPlot) #Page 3 - matplotlib self.mplLine = None #make sure to invalidate when layers change if self.hasmpl: # mpl stuff # should make figure light gray self.mplBackground = None #http://www.scipy.org/Cookbook/Matplotlib/Animations self.mplFig = plt.Figure(facecolor='w', edgecolor='w') self.mplFig.subplots_adjust(left=0.1, right=0.975, bottom=0.13, top=0.95) self.mplPlt = self.mplFig.add_subplot(111) self.mplPlt.tick_params(axis='both', which='major', labelsize=12) self.mplPlt.tick_params(axis='both', which='minor', labelsize=10) # qt stuff self.pltCanvas = FigureCanvasQTAgg(self.mplFig) self.pltCanvas.setParent(self.stackedWidget) self.pltCanvas.setAutoFillBackground(False) self.pltCanvas.setObjectName("mplPlot") self.mplPlot = self.pltCanvas else: self.mplPlot = QtGui.QLabel("Need Qwt >= 5.0 or matplotlib >= 1.0 !") sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mplPlot.sizePolicy().hasHeightForWidth()) self.mplPlot.setSizePolicy(sizePolicy) self.mplPlot.updateGeometry() self.stackedWidget.addWidget(self.mplPlot) if (self.hasqwt and self.hasmpl): self.plotSelector.setEnabled(True) self.plotSelector.setVisible(True) self.plotSelector.setCurrentIndex(0); else: if self.hasqwt: self.plotSelector.setCurrentIndex(0); else: self.plotSelector.setCurrentIndex(1); self.changePlot() def keyPressEvent( self, e ): if ( e.modifiers() == Qt.ControlModifier or e.modifiers() == Qt.MetaModifier ) and e.key() == Qt.Key_C: items = '' for rec in range( self.tableWidget.rowCount() ): items += '"' + self.tableWidget.item( rec, 0 ).text() + '",' + self.tableWidget.item( rec, 1 ).text() + "\n" if not items == '': clipboard = QApplication.clipboard() clipboard.setText( items ) else: QWidget.keyPressEvent( self, e ) def changePlot(self): if (self.plotSelector.currentText()=='mpl'): self.stackedWidget.setCurrentIndex(1) else: self.stackedWidget.setCurrentIndex(0) def changeActive(self,active,gui=True): self.isActive=active if (active): self.cbxEnable.setCheckState(Qt.Checked) QObject.connect(self.canvas, SIGNAL( "layersChanged ()" ), self.invalidatePlot ) if not self.cbxClick.isChecked(): QObject.connect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) else: self.cbxEnable.setCheckState(Qt.Unchecked) QObject.disconnect(self.canvas, SIGNAL( "layersChanged ()" ), self.invalidatePlot ) QObject.disconnect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) if gui: self.tabWidget.setEnabled(active) if active: self.labelStatus.setText(self.tr("Value tool is enabled")) if self.tabWidget.currentIndex()==2: self.updateLayers() else: self.labelStatus.setText(self.tr("")) #use this to clear plot when deactivated #self.values=[] #self.showValues() def activeRasterLayers(self, index=None): layers=[] allLayers=[] if not index: index=self.cbxLayers.currentIndex() if index == 0: allLayers=self.canvas.layers() elif index == 1: allLayers=self.legend.getLayers() elif index == 2: for layer in self.legend.getLayers(): if layer.id() in self.layersSelected: allLayers.append(layer) for layer in allLayers: if layer!=None and layer.isValid() and \ layer.type()==QgsMapLayer.RasterLayer and \ layer.dataProvider() and \ (layer.dataProvider().capabilities() & QgsRasterDataProvider.IdentifyValue): layers.append(layer) return layers def activeBandsForRaster(self,layer): activeBands=[] if self.cbxBands.currentIndex() == 1 and layer.renderer(): activeBands = layer.renderer().usesBands() elif self.cbxBands.currentIndex() == 2: if layer.bandCount()==1: activeBands=[1] else: activeBands = self.layerBands[layer.id()] if (layer.id() in self.layerBands) else [] else: activeBands = range(1,layer.bandCount()+1) return activeBands def printValue(self,position): if debug > 0: print(position) if not position: return if self.tabWidget.currentIndex()==2: return if debug > 0: print("%d active rasters, %d canvas layers" %(len(self.activeRasterLayers()),self.canvas.layerCount())) layers = self.activeRasterLayers() if len(layers) == 0: if self.canvas.layerCount() > 0: self.labelStatus.setText(self.tr("No valid layers to display - change layers in options")) else: self.labelStatus.setText(self.tr("No valid layers to display")) self.values=[] self.showValues() return self.labelStatus.setText(self.tr('Coordinate:') + ' (%f, %f)' % (position.x(), position.y())) needextremum = (self.tabWidget.currentIndex()==1) # if plot is shown # count the number of requires rows and remember the raster layers nrow=0 rasterlayers=[] layersWOStatistics=[] for layer in layers: nrow+=layer.bandCount() rasterlayers.append(layer) # check statistics for each band if needextremum: for i in range( 1,layer.bandCount()+1 ): has_stats = self.getStats ( layer, i ) is not None if not layer.id() in self.layerMap and not has_stats\ and not layer in layersWOStatistics: layersWOStatistics.append(layer) if layersWOStatistics and not self.statsChecked: self.calculateStatistics(layersWOStatistics) irow=0 self.values=[] self.ymin=1e38 self.ymax=-1e38 mapCanvasSrs = self.iface.mapCanvas.mapRenderer().destinationCrs() # TODO - calculate the min/max values only once, instead of every time!!! # keep them in a dict() with key=layer.id() #pull out wavelength if it exists in metadata #piece to pull out wavelength information if present in metadata rasterMeta=rasterlayers[0].metadata() self.wavelengths={} self.wavelength_units='' if('wavelength' in rasterMeta): mdSplit=rasterMeta.split('</p>') for d in mdSplit: if ('Band_' in d and 'glossy' not in d and '=' in d): variableName,valueWavelength=d.split('=') bandNumber=int(variableName.split('_')[1]) self.wavelengths[bandNumber]=float(valueWavelength.split(' ')[-2].replace('(','')) elif('wavelength_units' in d): variableName,v=d.split('=') self.wavelength_units=v #### for layer in rasterlayers: layername=unicode(layer.name()) layerSrs = layer.crs() pos = position # if given no position, get dummy values if position is None: pos = QgsPoint(0,0) # transform points if needed elif not mapCanvasSrs == layerSrs and self.iface.mapCanvas.hasCrsTransformEnabled(): srsTransform = QgsCoordinateTransform(mapCanvasSrs, layerSrs) try: pos = srsTransform.transform(position) except QgsCsException, err: # ignore transformation errors continue if True: # for QGIS >= 1.9 if not layer.dataProvider(): continue ident = None if position is not None: canvas = self.iface.mapCanvas # first test if point is within map layer extent # maintain same behaviour as in 1.8 and print out of extent if not layer.dataProvider().extent().contains( pos ): ident = dict() for iband in range(1,layer.bandCount()+1): ident[iband] = QVariant(self.tr('out of extent')) # we can only use context if layer is not projected elif canvas.hasCrsTransformEnabled() and layer.dataProvider().crs() != canvas.mapRenderer().destinationCrs(): ident = layer.dataProvider().identify(pos, QgsRaster.IdentifyFormatValue ).results() else: extent = canvas.extent() width = round(extent.width() / canvas.mapUnitsPerPixel()); height = round(extent.height() / canvas.mapUnitsPerPixel()); extent = canvas.mapRenderer().mapToLayerCoordinates( layer, extent ); ident = layer.dataProvider().identify(pos, QgsRaster.IdentifyFormatValue, canvas.extent(), width, height ).results() if not len( ident ) > 0: continue # if given no position, set values to 0 if position is None and ident is not None and ident.iterkeys() is not None: for key in ident.iterkeys(): ident[key] = layer.dataProvider().noDataValue(key) # bands displayed depends on cbxBands (all / active / selected) activeBands = self.activeBandsForRaster(layer) for iband in activeBands: # loop over the active bands layernamewithband=layername if ident is not None and len(ident)>1: layernamewithband+=' '+layer.bandName(iband) if not ident or not ident.has_key( iband ): # should not happen bandvalue = "?" else: bandvalue = ident[iband].toString() if bandvalue is None: bandvalue = "no data" self.values.append((layernamewithband,str(bandvalue))) if needextremum: # estimated statistics stats = self.getStats ( layer, iband ) if stats: self.ymin=min(self.ymin,stats.minimumValue) self.ymax=max(self.ymax,stats.maximumValue) if len(self.values) == 0: self.labelStatus.setText(self.tr("No valid bands to display")) self.showValues()
sys.exit(-1) from PyQt4 import QtCore, QtGui from PyQt4.Qwt5 import QwtPlot, QwtPlotCurve import pickle data = sys.argv[1] app = QtGui.QApplication(sys.argv) p = QwtPlot() curve = QwtPlotCurve("Segon i tal") fn = resDir + '/' + data f = file(fn) v = pickle.load(f) y = v x = range(len(y)) curve.setData(x, y) curve.attach(p) p.replot() p.show() sys.exit(app.exec_())
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(847, 480) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.centralwidget) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) #Tworzenie zakładek self.tabs = QtGui.QTabWidget(self.centralwidget) #Główny wykre self.plot = QwtPlot(self.centralwidget) self.plot.setObjectName(_fromUtf8("plot")) self.plot.setAxisScale(self.plot.yLeft, -20, 80) self.plot.setAutoFillBackground(True) #self.plot.setPalette(Qt.Qt.black) self.plot.setCanvasBackground(Qt.Qt.black) self.grid = QwtPlotGrid() '''self.Yscale = QwtScaleDiv() self.Yscale.setInterval(10) self.Xscale = QwtScaleDiv() self.Xscale.setInterval(10) self.grid.setYDiv(self.YScale) self.grid.setXDiv(self.Xscale)''' self.grid.setMajPen(Qt.Qt.gray) self.grid.attach(self.plot) self.tabs.addTab(self.plot, "Spectrum") self.curve = QwtPlotCurve('') self.curve.setPen(Qt.Qt.yellow) self.curve.attach(self.plot) self.hold_curve = QwtPlotCurve('') self.hold_curve.setPen(Qt.Qt.red) self.peak_marker = QwtPlotMarker() self.symbol = QwtSymbol(QwtSymbol.DTriangle, QtGui.QBrush(Qt.Qt.red), QtGui.QPen(Qt.Qt.red), QtCore.QSize(10, 10)) self.peak_marker.setSymbol(self.symbol) self.peak_marker.setLabelAlignment(Qt.Qt.AlignTop) self.sybmol_2 = QwtSymbol(QwtSymbol.DTriangle, QtGui.QBrush(Qt.Qt.red), QtGui.QPen(Qt.Qt.white), QtCore.QSize(10, 10)) self.marker_1 = QwtPlotMarker() self.marker_1.setSymbol(self.sybmol_2) self.marker_1.setLabelAlignment(Qt.Qt.AlignTop) self.marker_2 = QwtPlotMarker() self.marker_2.setSymbol(self.sybmol_2) self.marker_2.setLabelAlignment(Qt.Qt.AlignTop) self.marker_3 = QwtPlotMarker() self.marker_3.setSymbol(self.sybmol_2) self.marker_3.setLabelAlignment(Qt.Qt.AlignTop) self.marker_4 = QwtPlotMarker() self.marker_4.setSymbol(self.sybmol_2) self.marker_4.setLabelAlignment(Qt.Qt.AlignTop) self.delta_marker = QwtPlotMarker() self.delta_marker.setSymbol(self.sybmol_2) self.delta_marker.setLabelAlignment(Qt.Qt.AlignTop) self.markers = [ self.marker_1, self.marker_2, self.marker_3, self.marker_4 ] self.save_curve_1 = QwtPlotCurve('') self.save_curve_1.setPen(Qt.Qt.green) self.save_curve_2 = QwtPlotCurve('') self.save_curve_2.setPen(Qt.Qt.cyan) self.save_curve_3 = QwtPlotCurve('') self.save_curve_3.setPen(Qt.Qt.magenta) self.saved_curves = [ self.save_curve_1, self.save_curve_2, self.save_curve_3 ] #Wykres waterfall '''self.plot_2 = QwtPlot(self.centralwidget) self.plot_2.setObjectName(_fromUtf8("plot_2")) self.waterfall = QwtPlotSpectrogram() self.waterfall.attach(self.plot_2) self.colorMap = QwtLinearColorMap(Qt.Qt.darkCyan, Qt.Qt.red) self.scaleColors(80) self.waterfall.setColorMap(self.colorMap) #self.waterfallData = QwtRasterData() #self.tabs.addTab(self.plot_2, "Waterfall")''' self.verticalLayout.addWidget(self.tabs) self.picker = QwtPlotPicker( QwtPlot.xBottom, QwtPlot.yLeft, QwtPicker.PointSelection | QwtPicker.DragSelection, QwtPlotPicker.CrossRubberBand, QwtPicker.AlwaysOn, self.plot.canvas()) self.picker.setTrackerPen(Qt.Qt.white) self.picker.setRubberBandPen(Qt.Qt.gray) self.freqBox = QtGui.QGroupBox(self.centralwidget) self.freqBox.setObjectName(_fromUtf8("freqBox")) self.verticalLayout_3 = QtGui.QVBoxLayout(self.freqBox) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.formLayout_3 = QtGui.QFormLayout() self.formLayout_3.setObjectName(_fromUtf8("formLayout_3")) self.label = QtGui.QLabel(self.freqBox) self.label.setObjectName(_fromUtf8("label")) self.formLayout_3.setWidget(0, QtGui.QFormLayout.LabelRole, self.label) self.startEdit = QtGui.QDoubleSpinBox(self.freqBox) self.startEdit.setObjectName(_fromUtf8("startEdit")) self.startEdit.setDecimals(2) self.startEdit.setRange(1, 1280) self.startEdit.setKeyboardTracking(False) self.formLayout_3.setWidget(0, QtGui.QFormLayout.FieldRole, self.startEdit) self.horizontalLayout.addLayout(self.formLayout_3) self.formLayout_4 = QtGui.QFormLayout() self.formLayout_4.setObjectName(_fromUtf8("formLayout_4")) self.label_2 = QtGui.QLabel(self.freqBox) self.label_2.setObjectName(_fromUtf8("label_2")) self.formLayout_4.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_2) self.stopEdit = QtGui.QDoubleSpinBox(self.freqBox) self.stopEdit.setObjectName(_fromUtf8("stopEdit")) self.stopEdit.setDecimals(2) self.stopEdit.setRange(1, 1280) self.stopEdit.setKeyboardTracking(False) self.formLayout_4.setWidget(0, QtGui.QFormLayout.FieldRole, self.stopEdit) self.horizontalLayout.addLayout(self.formLayout_4) self.formLayout_5 = QtGui.QFormLayout() self.formLayout_5.setObjectName(_fromUtf8("formLayout_5")) self.label_3 = QtGui.QLabel(self.freqBox) self.label_3.setObjectName(_fromUtf8("label_3")) self.formLayout_5.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_3) self.rbwEdit = QtGui.QComboBox(self.freqBox) self.rbwEdit.setObjectName(_fromUtf8("rbwEdit")) self.rbwEdit.addItem('0,21 kHz', 16384) self.rbwEdit.addItem('0,42 kHz', 8192) self.rbwEdit.addItem('0,84 kHz', 4096) self.rbwEdit.addItem('1,69 kHz', 2048) self.rbwEdit.addItem('3,38 kHz', 1024) self.rbwEdit.addItem('6,75 kHz', 512) self.rbwEdit.addItem('13,5 kHz', 256) self.rbwEdit.addItem('27 kHz', 128) self.rbwEdit.addItem('54 kHz', 64) self.rbwEdit.addItem('108 kHz', 32) self.rbwEdit.addItem('216 kHz', 16) self.rbwEdit.addItem('432 kHz', 8) self.rbwEdit.setCurrentIndex(4) self.formLayout_5.setWidget(0, QtGui.QFormLayout.FieldRole, self.rbwEdit) self.horizontalLayout.addLayout(self.formLayout_5) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout_3.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.formLayout_7 = QtGui.QFormLayout() self.formLayout_7.setObjectName(_fromUtf8("formLayout_7")) self.centerLabel = QtGui.QLabel(self.freqBox) self.centerLabel.setObjectName(_fromUtf8("centerLabel")) self.formLayout_7.setWidget(0, QtGui.QFormLayout.LabelRole, self.centerLabel) self.centerEdit = QtGui.QDoubleSpinBox(self.freqBox) self.centerEdit.setObjectName(_fromUtf8("centerEdit")) self.centerEdit.setDecimals(2) self.centerEdit.setRange(1, 1280) self.centerEdit.setKeyboardTracking(False) self.formLayout_7.setWidget(0, QtGui.QFormLayout.FieldRole, self.centerEdit) self.horizontalLayout_3.addLayout(self.formLayout_7) self.formLayout_8 = QtGui.QFormLayout() self.formLayout_8.setObjectName(_fromUtf8("formLayout_8")) self.spanLabel = QtGui.QLabel(self.freqBox) self.spanLabel.setObjectName(_fromUtf8("spanLabel")) self.formLayout_8.setWidget(0, QtGui.QFormLayout.LabelRole, self.spanLabel) self.spanEdit = QtGui.QDoubleSpinBox(self.freqBox) self.spanEdit.setObjectName(_fromUtf8("spanEdit")) self.spanEdit.setDecimals(2) self.spanEdit.setRange(0.1, 1280) self.spanEdit.setKeyboardTracking(False) self.formLayout_8.setWidget(0, QtGui.QFormLayout.FieldRole, self.spanEdit) self.horizontalLayout_3.addLayout(self.formLayout_8) self.horizontalLayout_3.addItem(spacerItem) self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.verticalLayout.addWidget(self.freqBox) self.horizontalLayout_2.addLayout(self.verticalLayout) self.settingsBox = QtGui.QGroupBox(self.centralwidget) self.settingsBox.setMaximumSize(QtCore.QSize(250, 16777215)) self.settingsBox.setObjectName(_fromUtf8("settingsBox")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.settingsBox) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.formLayout = QtGui.QFormLayout() self.formLayout.setObjectName(_fromUtf8("formLayout")) self.gainLabel = QtGui.QLabel(self.settingsBox) self.gainLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.gainLabel.setObjectName(_fromUtf8("gainLabel")) self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.gainLabel) self.gainSlider = QtGui.QSlider(self.settingsBox) self.gainSlider.setMaximum(49) self.gainSlider.setSingleStep(1) self.gainSlider.setProperty("value", 20) self.gainSlider.setOrientation(QtCore.Qt.Horizontal) self.gainSlider.setObjectName(_fromUtf8("gainSlider")) self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.gainSlider) self.verticalLayout_2.addLayout(self.formLayout) self.gainDisp = QtGui.QLCDNumber(self.settingsBox) self.gainDisp.setSegmentStyle(QtGui.QLCDNumber.Flat) self.verticalLayout_2.addWidget(self.gainDisp) '''self.offsetButton = QtGui.QPushButton(self.settingsBox) self.offsetButton.setText("Remove DC offset") self.verticalLayout_2.addWidget(self.offsetButton) ''' self.formLayout_2 = QtGui.QFormLayout() self.formLayout_2.setObjectName(_fromUtf8("formLayout_2")) self.refLabel = QtGui.QLabel(self.settingsBox) self.refLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.refLabel.setObjectName(_fromUtf8("refLabel")) self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.refLabel) self.refEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.refEdit.setObjectName(_fromUtf8("refEdit")) self.refEdit.setDecimals(0) self.refEdit.setKeyboardTracking(False) self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.refEdit) self.verticalLayout_2.addLayout(self.formLayout_2) spacerItem1 = QtGui.QSpacerItem(158, 304, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem1) #Settings tabs self.settings_tabs = QtGui.QTabWidget(self.settingsBox) self.verticalLayout_2.addWidget(self.settings_tabs) self.verticalLayout_4 = QtGui.QVBoxLayout() self.saveButton = QtGui.QPushButton(self.settingsBox) self.saveButton.setText("Save plot") self.verticalLayout_4.addWidget(self.saveButton) self.formLayout_9 = QtGui.QFormLayout() self.formLayout_9.setObjectName(_fromUtf8("formLayout_9")) self.avgLabel = QtGui.QLabel(self.settingsBox) self.avgLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.avgLabel.setObjectName(_fromUtf8("avgLabel")) self.formLayout_9.setWidget(0, QtGui.QFormLayout.LabelRole, self.avgLabel) self.avgCheck = QtGui.QCheckBox(self.settingsBox) self.formLayout_9.setWidget(0, QtGui.QFormLayout.FieldRole, self.avgCheck) self.verticalLayout_4.addLayout(self.formLayout_9) self.formLayout_10 = QtGui.QFormLayout() self.avgLabel_2 = QtGui.QLabel(self.settingsBox) self.avgLabel_2.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.avgLabel_2.setObjectName(_fromUtf8("avgLabel_2")) self.formLayout_10.setWidget(0, QtGui.QFormLayout.LabelRole, self.avgLabel_2) self.avgEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.avgEdit.setDecimals(0) self.avgEdit.setRange(1, 100) self.avgEdit.setKeyboardTracking(False) self.avgEdit.setValue(10) self.formLayout_10.setWidget(0, QtGui.QFormLayout.FieldRole, self.avgEdit) self.verticalLayout_4.addLayout(self.formLayout_10) self.formLayout_6 = QtGui.QFormLayout() self.formLayout_6.setObjectName(_fromUtf8("formLayout_6")) self.holdLabel = QtGui.QLabel(self.settingsBox) self.holdLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.holdLabel.setObjectName(_fromUtf8("holdLabel")) self.formLayout_6.setWidget(0, QtGui.QFormLayout.LabelRole, self.holdLabel) self.holdCheck = QtGui.QCheckBox(self.settingsBox) self.formLayout_6.setWidget(0, QtGui.QFormLayout.FieldRole, self.holdCheck) self.verticalLayout_4.addLayout(self.formLayout_6) self.formLayout_11 = QtGui.QFormLayout() self.formLayout_11.setObjectName(_fromUtf8("formLayout_11")) self.peakLabel = QtGui.QLabel(self.settingsBox) self.peakLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.peakLabel.setObjectName(_fromUtf8("peakLabel")) self.formLayout_11.setWidget(0, QtGui.QFormLayout.LabelRole, self.peakLabel) self.peakCheck = QtGui.QCheckBox(self.settingsBox) self.formLayout_11.setWidget(0, QtGui.QFormLayout.FieldRole, self.peakCheck) self.verticalLayout_4.addLayout(self.formLayout_11) self.peakStatus = QtGui.QLabel("Peak: ") self.correctButton = QtGui.QPushButton(self.settingsBox) self.correctButton.setText("Correction") self.verticalLayout_4.addWidget(self.correctButton) self.verticalLayout_5 = QtGui.QVBoxLayout() self.traceButton = QtGui.QPushButton(self.settingsBox) self.traceButton.setText("Save trace 1") self.verticalLayout_5.addWidget(self.traceButton) self.traceButton_2 = QtGui.QPushButton(self.settingsBox) self.traceButton_2.setText("Save trace 2") self.verticalLayout_5.addWidget(self.traceButton_2) self.traceButton_3 = QtGui.QPushButton(self.settingsBox) self.traceButton_3.setText("Save trace 3") self.verticalLayout_5.addWidget(self.traceButton_3) self.traces = [ self.traceButton, self.traceButton_2, self.traceButton_3 ] #MARKERS self.gridLayout = QtGui.QGridLayout() self.markerLabel = QtGui.QLabel(self.settingsBox) self.markerLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel, 0, 0) self.markerCheck = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck, 0, 1) self.markerEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit.setDecimals(2) self.markerEdit.setKeyboardTracking(False) self.markerEdit.setDisabled(True) self.markerEdit.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit, 0, 2) self.markerLabel_2 = QtGui.QLabel(self.settingsBox) self.markerLabel_2.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel_2, 2, 0) self.markerCheck_2 = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck_2, 2, 1) self.markerEdit_2 = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit_2.setDecimals(2) self.markerEdit_2.setKeyboardTracking(False) self.markerEdit_2.setDisabled(True) self.markerEdit_2.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit_2, 2, 2) self.markerLabel_3 = QtGui.QLabel(self.settingsBox) self.markerLabel_3.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel_3, 3, 0) self.markerCheck_3 = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck_3, 3, 1) self.markerEdit_3 = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit_3.setDecimals(2) self.markerEdit_3.setKeyboardTracking(False) self.markerEdit_3.setDisabled(True) self.markerEdit_3.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit_3, 3, 2) self.markerLabel_4 = QtGui.QLabel(self.settingsBox) self.markerLabel_4.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.markerLabel_4, 4, 0) self.markerCheck_4 = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.markerCheck_4, 4, 1) self.markerEdit_4 = QtGui.QDoubleSpinBox(self.settingsBox) self.markerEdit_4.setDecimals(2) self.markerEdit_4.setKeyboardTracking(False) self.markerEdit_4.setDisabled(True) self.markerEdit_4.setSingleStep(0.1) self.gridLayout.addWidget(self.markerEdit_4, 4, 2) self.deltaLabel = QtGui.QLabel(self.settingsBox) self.deltaLabel.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.gridLayout.addWidget(self.deltaLabel, 1, 0) self.deltaCheck = QtGui.QCheckBox(self.settingsBox) self.gridLayout.addWidget(self.deltaCheck, 1, 1) self.deltaEdit = QtGui.QDoubleSpinBox(self.settingsBox) self.deltaEdit.setDecimals(2) self.deltaEdit.setSingleStep(0.1) self.deltaEdit.setKeyboardTracking(False) self.deltaEdit.setDisabled(True) self.gridLayout.addWidget(self.deltaEdit, 1, 2) self.deltaCheck.setDisabled(True) self.tab1 = QtGui.QWidget() self.settings_tabs.addTab(self.tab1, "Misc.") self.settings_tabs.widget(0).setLayout(self.verticalLayout_4) self.tab2 = QtGui.QWidget() self.settings_tabs.addTab(self.tab2, "Traces") self.settings_tabs.widget(1).setLayout(self.verticalLayout_5) self.tab3 = QtGui.QWidget() self.settings_tabs.addTab(self.tab3, "Markers") self.settings_tabs.widget(2).setLayout(self.gridLayout) self.horizontalLayout_2.addWidget(self.settingsBox) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 847, 21)) self.menubar.setObjectName(_fromUtf8("menubar")) MainWindow.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(MainWindow) self.statusbar.setObjectName(_fromUtf8("statusbar")) MainWindow.setStatusBar(self.statusbar) self.statusbar.addWidget(self.peakStatus) self.statusbar.setVisible(False) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.gainSlider.valueChanged.connect(self.gainDisp.display) self.saveButton.clicked.connect(self.savePlot) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle( _translate("MainWindow", "Analizator 0.4", None)) self.freqBox.setTitle(_translate("MainWindow", "Częstotliwość", None)) self.label.setText(_translate("MainWindow", "START [MHz]:", None)) self.label_2.setText(_translate("MainWindow", "STOP [MHz]:", None)) self.label_3.setText(_translate("MainWindow", "RBW:", None)) self.settingsBox.setTitle(_translate("MainWindow", "Ustawienia", None)) self.gainLabel.setText(_translate("MainWindow", "Gain:", None)) self.refLabel.setText(_translate("MainWindow", "REF:", None)) self.holdLabel.setText(_translate("MainWindow", "Max HOLD:", None)) self.centerLabel.setText( _translate("MainWindow", "Center [MHz]:", None)) self.spanLabel.setText(_translate("MainWindow", "Span [MHz]:", None)) self.avgLabel.setText(_translate("MainWindow", "Average:", None)) self.avgLabel_2.setText(_translate("MainWindow", "Avg traces:", None)) self.peakLabel.setText(_translate("MainWindow", "Peak search:", None)) self.markerLabel.setText(_translate("MainWindow", "Marker 1:", None)) self.markerLabel_2.setText(_translate("MainWindow", "Marker 2:", None)) self.markerLabel_3.setText(_translate("MainWindow", "Marker 3:", None)) self.markerLabel_4.setText(_translate("MainWindow", "Marker 4:", None)) self.deltaLabel.setText(_translate("MainWindow", "Delta 1:", None)) def savePlot(self): dialog = QtGui.QFileDialog() pixmap = QtGui.QPixmap() pixmap = pixmap.grabWidget(self.plot) fileName = dialog.getSaveFileName() print pixmap.save(fileName, format="PNG", quality=-1) print pixmap.isNull() print "Plot saved" def scaleColors(self, ref): self.colorMap.addColorStop(ref - 60, Qt.Qt.cyan) self.colorMap.addColorStop(ref - 40, Qt.Qt.green) self.colorMap.addColorStop(ref - 20, Qt.Qt.yellow)
class RTTView(QtGui.QWidget): def __init__(self, parent=None): super(RTTView, self).__init__(parent) uic.loadUi('RTTView.ui', self) self.initSetting() self.initQwtPlot() self.rcvbuff = b'' self.tmrRTT = QtCore.QTimer() self.tmrRTT.setInterval(10) self.tmrRTT.timeout.connect(self.on_tmrRTT_timeout) self.tmrRTT.start() def initSetting(self): if not os.path.exists('setting.ini'): open('setting.ini', 'w') self.conf = ConfigParser.ConfigParser() self.conf.read('setting.ini') if not self.conf.has_section('J-Link'): self.conf.add_section('J-Link') self.conf.set('J-Link', 'dllpath', '') self.conf.add_section('Memory') self.conf.set('Memory', 'StartAddr', '0x20000000') self.linDLL.setText(self.conf.get('J-Link', 'dllpath').decode('gbk')) def initQwtPlot(self): self.PlotData = [0]*1000 self.qwtPlot = QwtPlot(self) self.qwtPlot.setVisible(False) self.vLayout.insertWidget(0, self.qwtPlot) self.PlotCurve = QwtPlotCurve() self.PlotCurve.attach(self.qwtPlot) self.PlotCurve.setData(range(1, len(self.PlotData)+1), self.PlotData) @QtCore.pyqtSlot() def on_btnOpen_clicked(self): if self.btnOpen.text() == u'打开连接': try: self.jlink = ctypes.cdll.LoadLibrary(self.linDLL.text()) err_buf = (ctypes.c_char * 64)() self.jlink.JLINKARM_ExecCommand('Device = Cortex-M0', err_buf, 64) self.jlink.JLINKARM_TIF_Select(1) self.jlink.JLINKARM_SetSpeed(8000) buff = ctypes.create_string_buffer(1024) Addr = int(self.conf.get('Memory', 'StartAddr'), 16) for i in range(256): self.jlink.JLINKARM_ReadMem(Addr + 1024*i, 1024, buff) index = buff.raw.find('SEGGER RTT') if index != -1: self.RTTAddr = Addr + 1024*i + index buff = ctypes.create_string_buffer(ctypes.sizeof(SEGGER_RTT_CB)) self.jlink.JLINKARM_ReadMem(self.RTTAddr, ctypes.sizeof(SEGGER_RTT_CB), buff) rtt_cb = SEGGER_RTT_CB.from_buffer(buff) self.aUpAddr = self.RTTAddr + 16 + 4 + 4 self.aDownAddr = self.aUpAddr + ctypes.sizeof(RingBuffer) * rtt_cb.MaxNumUpBuffers self.txtMain.append('\n_SEGGER_RTT @ 0x%08X with %d aUp and %d aDown\n' %(self.RTTAddr, rtt_cb.MaxNumUpBuffers, rtt_cb.MaxNumDownBuffers)) break else: raise Exception('Can not find _SEGGER_RTT') except Exception as e: self.txtMain.append('\n%s\n' %str(e)) else: self.linDLL.setEnabled(False) self.btnDLL.setEnabled(False) self.btnOpen.setText(u'关闭连接') else: self.linDLL.setEnabled(True) self.btnDLL.setEnabled(True) self.btnOpen.setText(u'打开连接') def aUpRead(self): buf = ctypes.create_string_buffer(ctypes.sizeof(RingBuffer)) self.jlink.JLINKARM_ReadMem(self.aUpAddr, ctypes.sizeof(RingBuffer), buf) aUp = RingBuffer.from_buffer(buf) if aUp.RdOff == aUp.WrOff: str = ctypes.create_string_buffer(0) elif aUp.RdOff < aUp.WrOff: cnt = aUp.WrOff - aUp.RdOff str = ctypes.create_string_buffer(cnt) self.jlink.JLINKARM_ReadMem(ctypes.cast(aUp.pBuffer, ctypes.c_void_p).value + aUp.RdOff, cnt, str) aUp.RdOff += cnt self.jlink.JLINKARM_WriteU32(self.aUpAddr + 4*4, aUp.RdOff) else: cnt = aUp.SizeOfBuffer - aUp.RdOff str = ctypes.create_string_buffer(cnt) self.jlink.JLINKARM_ReadMem(ctypes.cast(aUp.pBuffer, ctypes.c_void_p).value + aUp.RdOff, cnt, str) aUp.RdOff = 0 #这样下次再读就会进入执行上个条件 self.jlink.JLINKARM_WriteU32(self.aUpAddr + 4*4, aUp.RdOff) return str.raw def on_tmrRTT_timeout(self): if self.btnOpen.text() == u'关闭连接': try: self.rcvbuff += self.aUpRead() if self.txtMain.isVisible(): if self.chkHEXShow.isChecked(): text = ''.join('%02X ' %ord(c) for c in self.rcvbuff) else: text = self.rcvbuff if len(self.txtMain.toPlainText()) > 25000: self.txtMain.clear() self.txtMain.moveCursor(QtGui.QTextCursor.End) self.txtMain.insertPlainText(text) self.rcvbuff = b'' else: if self.rcvbuff.rfind(',') == -1: return d = [int(x) for x in self.rcvbuff[0:self.rcvbuff.rfind(',')].split(',')] for x in d: self.PlotData.pop(0) self.PlotData.append(x) self.PlotCurve.setData(range(1, len(self.PlotData)+1), self.PlotData) self.qwtPlot.replot() self.rcvbuff = self.rcvbuff[self.rcvbuff.rfind(',')+1:] except Exception as e: self.rcvbuff = b'' self.txtMain.append('\n%s\n' %str(e)) def aDownWrite(self, bytes): buf = ctypes.create_string_buffer(ctypes.sizeof(RingBuffer)) self.jlink.JLINKARM_ReadMem(self.aDownAddr, ctypes.sizeof(RingBuffer), buf) aDown = RingBuffer.from_buffer(buf) if aDown.WrOff >= aDown.RdOff: if aDown.RdOff != 0: cnt = min(aDown.SizeOfBuffer - aDown.WrOff, len(bytes)) else: cnt = min(aDown.SizeOfBuffer - 1 - aDown.WrOff, len(bytes)) # 写入操作不能使得 aDown.WrOff == aDown.RdOff,以区分满和空 str = ctypes.create_string_buffer(bytes[:cnt]) self.jlink.JLINKARM_WriteMem(ctypes.cast(aDown.pBuffer, ctypes.c_void_p).value + aDown.WrOff, cnt, str) aDown.WrOff += cnt if aDown.WrOff == aDown.SizeOfBuffer: aDown.WrOff = 0 bytes = bytes[cnt:] if bytes and aDown.RdOff != 0 and aDown.RdOff != 1: # != 0 确保 aDown.WrOff 折返回 0,!= 1 确保有空间可写入 cnt = min(aDown.RdOff - 1 - aDown.WrOff, len(bytes)) # - 1 确保写入操作不导致WrOff与RdOff指向同一位置 str = ctypes.create_string_buffer(bytes[:cnt]) self.jlink.JLINKARM_WriteMem(ctypes.cast(aDown.pBuffer, ctypes.c_void_p).value + aDown.WrOff, cnt, str) aDown.WrOff += cnt self.jlink.JLINKARM_WriteU32(self.aDownAddr + 4*3, aDown.WrOff) @QtCore.pyqtSlot() def on_btnSend_clicked(self): if self.btnOpen.text() == u'关闭连接': text = self.txtSend.toPlainText() try: if self.chkHEXSend.isChecked(): bytes = ''.join([chr(int(x, 16)) for x in text.split()]) else: bytes = text self.aDownWrite(bytes) except Exception as e: self.txtMain.append('\n%s\n' %str(e)) @QtCore.pyqtSlot() def on_btnDLL_clicked(self): path = QtGui.QFileDialog.getOpenFileName(caption=u'JLinkARM.dll路径', filter=u'动态链接库文件 (*.dll)', directory=self.linDLL.text()) if path != '': self.linDLL.setText(path) @QtCore.pyqtSlot(int) def on_chkWavShow_stateChanged(self, state): self.qwtPlot.setVisible(state == QtCore.Qt.Checked) self.txtMain.setVisible(state == QtCore.Qt.Unchecked) @QtCore.pyqtSlot() def on_btnClear_clicked(self): self.txtMain.clear() def closeEvent(self, evt): self.conf.set('J-Link', 'dllpath', self.linDLL.text().encode('gbk')) self.conf.write(open('setting.ini', 'w'))
class ExampleApp(QtGui.QMainWindow, gui.Ui_MainWindow): def __init__(self): super(self.__class__, self).__init__() self.setupUi(self) self.label_current_state.installEventFilter(self) self.label_sensor.installEventFilter(self) self.label_sensor_1.installEventFilter(self) self.label_sensor_2.installEventFilter(self) self.label_sensor_3.installEventFilter(self) self.label_sensor_4.installEventFilter(self) self.label_humidity.installEventFilter(self) self.label_humidity_1.installEventFilter(self) self.label_humidity_2.installEventFilter(self) self.label_humidity_3.installEventFilter(self) self.label_humidity_4.installEventFilter(self) self.label_temperature.installEventFilter(self) self.label_temperature_1.installEventFilter(self) self.label_temperature_2.installEventFilter(self) self.label_temperature_3.installEventFilter(self) self.label_temperature_4.installEventFilter(self) """self.doubleSpinBox_humidity.installEventFilter(self) self.doubleSpinBox_humidity1.installEventFilter(self) self.doubleSpinBox_humidity2.installEventFilter(self) self.doubleSpinBox_humidity3.installEventFilter(self) self.doubleSpinBox_humidity4.installEventFilter(self) self.doubleSpinBox_temperature.installEventFilter(self) self.doubleSpinBox_temperature1.installEventFilter(self) self.doubleSpinBox_temperature2.installEventFilter(self) self.doubleSpinBox_temperature3.installEventFilter(self) self.doubleSpinBox_temperature4.installEventFilter(self)""" self.stateOfCurvers = [True, True, True, True, True] self.sensors = [ "p11/raspberry/sht75.01", "p11/raspberry/sht75.02", "p11/raspberry/sht75.03", "p11/raspberry/sht75.04", "p11/raspberry/sht75.05" ] cwd = os.getcwd() self.filePath = cwd + "/data/" if not os.path.exists(self.filePath): os.makedirs(self.filePath) #print self.cwd self.filename = 'hum_data%s.csv' % time.strftime('%Y%m%d-%H%M%S') self.file = open(self.filePath + self.filename, 'wb') self.writer = csv.writer(self.file, delimiter=';', quotechar="", quoting=csv.QUOTE_NONE, escapechar=';') self.writer.writerow([ '#Time', '#Temperature_1', 'Humidity_1', 'Temperature_2', 'Humidity_2', 'Temperature_3', 'Humidity_3', 'Temperature_4', 'Humidity_4', 'Temperature_5', 'Humidity_5', ]) self.label_sensor.setStyleSheet( "background-color: rgb(153,0,0); color: rgb(255,255,255);") self.label_sensor_1.setStyleSheet( "background-color: rgb(153,153,0); color: rgb(255,255,255);") self.label_sensor_2.setStyleSheet( "background-color: rgb(0,0,0); color: rgb(255,255,255);") self.label_sensor_3.setStyleSheet( "background-color: rgb(0,0,153); color: rgb(255,255,255);") self.label_sensor_4.setStyleSheet( "background-color: rgb(0,153,0); color: rgb(255,255,255);") #self.humidity = [] #self.temperature = [] self.humidity1 = "---" self.humidity2 = "---" self.humidity3 = "---" self.humidity4 = "---" self.humidity5 = "---" self.temperature1 = "---" self.temperature2 = "---" self.temperature3 = "---" self.temperature4 = "---" self.temperature5 = "---" self.doubleSpinBox_temperature.setValue(0.00) self.doubleSpinBox_humidity.setValue(0.00) self.doubleSpinBox_temperature1.setValue(0.00) self.doubleSpinBox_humidity1.setValue(0.00) self.doubleSpinBox_temperature2.setValue(0.00) self.doubleSpinBox_humidity2.setValue(0.00) self.doubleSpinBox_temperature3.setValue(0.00) self.doubleSpinBox_humidity3.setValue(0.00) self.doubleSpinBox_temperature4.setValue(0.00) self.doubleSpinBox_humidity4.setValue(0.00) self.containers = [] for i in range(len(self.sensors)): #self.containers.append(deque(maxlen = 2250)) self.containers.append(deque(maxlen=111)) #self.times = deque(maxlen = 2250) self.times = deque(maxlen=111) self.qwtPlot.insertLegend(Qwt.QwtLegend(), Qwt.QwtPlot.BottomLegend) self.curve1 = QwtPlotCurve("Sensor1") #self.curve1.setPen(Qt.QPen(Qt.Qt.red, 3, Qt.Qt.SolidLine)) self.curve1.setPen(Qt.QPen(QColor(153, 0, 0), 3, Qt.Qt.SolidLine)) self.curve2 = QwtPlotCurve("Sensor2") #self.curve2.setPen(Qt.QPen(Qt.Qt.yellow, 3, Qt.Qt.SolidLine)) self.curve2.setPen(Qt.QPen(QColor(153, 153, 0), 3, Qt.Qt.SolidLine)) self.curve3 = QwtPlotCurve("Sensor3") #self.curve3.setPen(Qt.QPen(Qt.Qt.black, 3, Qt.Qt.SolidLine)) self.curve3.setPen(Qt.QPen(QColor(0, 0, 0), 3, Qt.Qt.SolidLine)) self.curve4 = QwtPlotCurve("Sensor4") #self.curve4.setPen(Qt.QPen(Qt.Qt.blue, 3, Qt.Qt.SolidLine)) self.curve4.setPen(Qt.QPen(QColor(0, 0, 153), 3, Qt.Qt.SolidLine)) #self.curve5 = QwtPlotCurve("Sensor5") #self.curve5.setPen(Qt.QPen(Qt.Qt.green, 3, Qt.Qt.SolidLine)) #self.curve5.setPen(Qt.QPen(QColor(0,153,0), 3, Qt.Qt.SolidLine)) self.curve1.attach(self.qwtPlot) self.curve2.attach(self.qwtPlot) self.curve3.attach(self.qwtPlot) self.curve4.attach(self.qwtPlot) #self.curve5.attach(self.qwtPlot) #print self.qwtPlot.axisAutoScale(0) #print self.qwtPlot.axisAutoScale(1) #print self.qwtPlot.axisAutoScale(2) #print self.qwtPlot.axisAutoScale(3) #self.qwtPlot.setAxisAutoScale(0) #self.qwtPlot.setAxisScale(2, 0, 0.3) self.data_thread1 = read_rasp_Thread(self.sensors[0]) self.connect(self.data_thread1, SIGNAL("newData"), self.updateData1) self.connect(self.data_thread1, SIGNAL("connectionFailed()"), self.connectionFailed1) self.data_thread2 = read_rasp_Thread(self.sensors[1]) self.connect(self.data_thread2, SIGNAL("newData"), self.updateData2) self.connect(self.data_thread2, SIGNAL("connectionFailed()"), self.connectionFailed2) self.data_thread3 = read_rasp_Thread(self.sensors[2]) self.connect(self.data_thread3, SIGNAL("newData"), self.updateData3) self.connect(self.data_thread3, SIGNAL("connectionFailed()"), self.connectionFailed3) self.data_thread4 = read_rasp_Thread(self.sensors[3]) self.connect(self.data_thread4, SIGNAL("newData"), self.updateData4) self.connect(self.data_thread4, SIGNAL("connectionFailed()"), self.connectionFailed4) self.data_thread5 = read_rasp_Thread(self.sensors[4]) self.connect(self.data_thread5, SIGNAL("newData"), self.updateData5) self.connect(self.data_thread5, SIGNAL("connectionFailed()"), self.connectionFailed5) self.data_thread1.start() self.data_thread2.start() self.data_thread3.start() self.data_thread4.start() self.data_thread5.start() self.connections = [True, True, True, True, True] self.signals = [False, False, False, False, False] self.start = time.time() self.TimeToWrite = time.time() def connectionFailed1(self): self.connections[0] = False self.updateData1("-----", "-----", True) def connectionFailed2(self): self.connections[1] = False self.updateData2("-----", "-----", True) def connectionFailed3(self): self.connections[2] = False self.updateData3("-----", "-----", True) def connectionFailed4(self): self.connections[3] = False self.updateData4("-----", "-----", True) def connectionFailed5(self): self.connections[4] = False self.updateData5("-----", "-----", True) def updateData1(self, humidity, temperature, failed=False): self.signals[0] = True if not failed: self.doubleSpinBox_humidity.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_temperature.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_humidity.setValue(humidity) self.doubleSpinBox_temperature.setValue(temperature) self.humidity1 = float("%.2f" % humidity) self.temperature1 = float("%.2f" % temperature) else: self.doubleSpinBox_humidity.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_temperature.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_humidity.setValue(0.00) self.doubleSpinBox_temperature.setValue(0.00) self.humidity1 = "---" self.temperature1 = "---" def updateData2(self, humidity, temperature, failed=False): self.signals[1] = True if not failed: self.doubleSpinBox_humidity1.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_temperature1.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_humidity1.setValue(humidity) self.doubleSpinBox_temperature1.setValue(temperature) self.humidity2 = float("%.2f" % humidity) self.temperature2 = float("%.2f" % temperature) else: self.doubleSpinBox_humidity1.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_temperature1.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_humidity1.setValue(0.00) self.doubleSpinBox_temperature1.setValue(0.00) self.humidity2 = "---" self.temperature2 = "---" def updateData3(self, humidity, temperature, failed=False): self.signals[2] = True if not failed: self.doubleSpinBox_humidity2.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_temperature2.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_humidity2.setValue(humidity) self.doubleSpinBox_temperature2.setValue(temperature) self.humidity3 = float("%.2f" % humidity) self.temperature3 = float("%.2f" % temperature) else: self.doubleSpinBox_humidity2.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_temperature2.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_humidity2.setValue(0.00) self.doubleSpinBox_temperature2.setValue(0.00) self.humidity3 = "---" self.temperature3 = "---" def updateData4(self, humidity, temperature, failed=False): self.signals[3] = True if not failed: self.doubleSpinBox_humidity3.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_temperature3.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_humidity3.setValue(humidity) self.doubleSpinBox_temperature3.setValue(temperature) self.humidity4 = float("%.2f" % humidity) self.temperature4 = float("%.2f" % temperature) else: self.doubleSpinBox_humidity3.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_temperature3.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_humidity3.setValue(0.00) self.doubleSpinBox_temperature3.setValue(0.00) self.humidity4 = "---" self.temperature4 = "---" def updateData5(self, humidity, temperature, failed=False): self.signals[4] = True if not failed: self.doubleSpinBox_humidity4.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_temperature4.setStyleSheet( "background-color: rgb(255,255,255);") self.doubleSpinBox_humidity4.setValue(humidity) self.doubleSpinBox_temperature4.setValue(temperature) self.humidity5 = float("%.2f" % humidity) self.temperature5 = float("%.2f" % temperature) else: self.doubleSpinBox_humidity4.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_temperature4.setStyleSheet( "background-color: rgb(255,0,0);") self.doubleSpinBox_humidity4.setValue(0.00) self.doubleSpinBox_temperature4.setValue(0.00) self.humidity5 = "---" self.temperature5 = "---" if self.signals[0] and self.signals[1] and self.signals[ 2] and self.signals[3] and self.signals[4]: for i in range(len(self.signals)): self.signals[i] = False if self.humidity1 == "---": self.containers[0].append(0) else: self.containers[0].append(self.humidity1) if self.humidity2 == "---": self.containers[1].append(0) else: self.containers[1].append(self.humidity2) if self.humidity3 == "---": self.containers[2].append(0) else: self.containers[2].append(self.humidity3) if self.humidity4 == "---": self.containers[3].append(0) else: self.containers[3].append(self.humidity4) if self.humidity5 == "---": self.containers[4].append(0) else: self.containers[4].append(self.humidity5) elapsedTime = (time.time() - self.start) / 60. self.times.append(elapsedTime) self.xdata = np.array(self.times) self.ydata1 = np.array(self.containers[0]) self.ydata2 = np.array(self.containers[1]) self.ydata3 = np.array(self.containers[2]) self.ydata4 = np.array(self.containers[3]) self.ydata5 = np.array(self.containers[4]) self.plotData() a = "" for i in range(len(self.connections)): if not self.connections[i]: a += str(i + 1) + " " if a == "": self.label_current_state.setStyleSheet("color: rgb(50,150,0);") self.label_current_state.setText("Current state: ON") else: self.label_current_state.setStyleSheet("color: rgb(255,0,0);") self.label_current_state.setText( "Connection to sensor N %s failed!!!\nTry properly make the connection" % a[0:-1]) for i in range(len(self.connections)): self.connections[i] = True row = [] timeToWrite = '%s' % time.strftime('%Y%m%d-%H%M%S') row.append(timeToWrite) if self.temperature1 == "---": row.append(self.temperature1) else: row.append("%.2f" % self.temperature1) if self.humidity1 == "---": row.append(self.humidity1) else: row.append("%.2f" % self.humidity1) if self.temperature2 == "---": row.append(self.temperature2) else: row.append("%.2f" % self.temperature2) if self.humidity2 == "---": row.append(self.humidity2) else: row.append("%.2f" % self.humidity2) if self.temperature3 == "---": row.append(self.temperature3) else: row.append("%.2f" % self.temperature3) if self.humidity3 == "---": row.append(self.humidity3) else: row.append("%.2f" % self.humidity3) if self.temperature4 == "---": row.append(self.temperature4) else: row.append("%.2f" % self.temperature4) if self.humidity4 == "---": row.append(self.humidity4) else: row.append("%.2f" % self.humidity4) if self.temperature5 == "---": row.append(self.temperature5) else: row.append("%.2f" % self.temperature5) if self.humidity5 == "---": row.append(self.humidity5) else: row.append("%.2f" % self.humidity5) self.writer.writerow(row) if ((time.time() - self.TimeToWrite) / 60.) > 5: self.file.close() self.file = open(self.filePath + self.filename, 'a') self.writer = csv.writer(self.file, delimiter=';', quotechar="", quoting=csv.QUOTE_NONE, escapechar=';') self.TimeToWrite = time.time() def plotData(self): #print time.time() self.curve1.setData(self.xdata, self.ydata1) self.curve2.setData(self.xdata, self.ydata2) self.curve3.setData(self.xdata, self.ydata3) self.curve4.setData(self.xdata, self.ydata4) #self.curve5.setData(self.xdata, self.ydata5) self.qwtPlot.replot() def eventFilter(self, obj, event): if (event.type() == Qt.QEvent.MouseButtonRelease) and ( obj == self.label_current_state): self.blackScreen = black_screen_Thread() self.blackScreen.start() if (event.type() == Qt.QEvent.MouseButtonRelease) and ( obj == self.label_sensor or obj == self.label_humidity or obj == self.label_temperature): if not self.stateOfCurvers[0]: self.curve1.attach(self.qwtPlot) self.curve2.attach(self.qwtPlot) self.curve3.attach(self.qwtPlot) self.curve4.attach(self.qwtPlot) #self.curve5.attach(self.qwtPlot) self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, True, True] else: self.curve1.attach(self.qwtPlot) self.curve2.detach() self.curve3.detach() self.curve4.detach() #self.curve5.detach() self.qwtPlot.replot() self.stateOfCurvers = [False, True, True, True, True] if (event.type() == Qt.QEvent.MouseButtonRelease) and ( obj == self.label_sensor_1 or obj == self.label_humidity_1 or obj == self.label_temperature_1): if not self.stateOfCurvers[1]: self.curve2.detach() self.curve1.attach(self.qwtPlot) self.curve2.attach(self.qwtPlot) self.curve3.attach(self.qwtPlot) self.curve4.attach(self.qwtPlot) #self.curve5.attach(self.qwtPlot) self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, True, True] else: self.curve2.attach(self.qwtPlot) self.curve1.detach() self.curve3.detach() self.curve4.detach() #self.curve5.detach() self.qwtPlot.replot() self.stateOfCurvers = [True, False, True, True, True] if (event.type() == Qt.QEvent.MouseButtonRelease) and ( obj == self.label_sensor_2 or obj == self.label_humidity_2 or obj == self.label_temperature_2): if not self.stateOfCurvers[2]: self.curve3.detach() self.curve1.attach(self.qwtPlot) self.curve2.attach(self.qwtPlot) self.curve3.attach(self.qwtPlot) self.curve4.attach(self.qwtPlot) #self.curve5.attach(self.qwtPlot) self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, True, True] else: self.curve3.attach(self.qwtPlot) self.curve1.detach() self.curve2.detach() self.curve4.detach() #self.curve5.detach() self.qwtPlot.replot() self.stateOfCurvers = [True, True, False, True, True] if (event.type() == Qt.QEvent.MouseButtonRelease) and ( obj == self.label_sensor_3 or obj == self.label_humidity_3 or obj == self.label_temperature_3): if not self.stateOfCurvers[3]: self.curve4.detach() self.curve1.attach(self.qwtPlot) self.curve2.attach(self.qwtPlot) self.curve3.attach(self.qwtPlot) self.curve4.attach(self.qwtPlot) #self.curve5.attach(self.qwtPlot) self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, True, True] else: self.curve4.attach(self.qwtPlot) self.curve1.detach() self.curve2.detach() self.curve3.detach() #self.curve5.detach() self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, False, True] if (event.type() == Qt.QEvent.MouseButtonRelease) and ( obj == self.label_sensor_4 or obj == self.label_humidity_4 or obj == self.label_temperature_4): if not self.stateOfCurvers[4]: #self.curve5.detach() self.curve1.attach(self.qwtPlot) self.curve2.attach(self.qwtPlot) self.curve3.attach(self.qwtPlot) self.curve4.attach(self.qwtPlot) #self.curve5.attach(self.qwtPlot) self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, True, True] else: #self.curve5.attach(self.qwtPlot) self.curve1.detach() self.curve2.detach() self.curve3.detach() self.curve4.detach() self.qwtPlot.replot() self.stateOfCurvers = [True, True, True, True, False] return QtGui.QMainWindow.eventFilter(self, obj, event) def stopMeasure(self): if self.data_thread1 is not None: self.data_thread1.stop() if self.data_thread2 is not None: self.data_thread2.stop() if self.data_thread3 is not None: self.data_thread3.stop() if self.data_thread4 is not None: self.data_thread4.stop() if self.data_thread5 is not None: self.data_thread5.stop() self.file.close() def __del__(self): self.stopMeasure()
class IVSweepDaqWidget(IVSweepsDaqUi.Ui_Form, QWidget): def __init__(self, parent=None): super(IVSweepDaqWidget, self).__init__(parent) self.setupUi(self) self.aoDeviceCombo.currentIndexChanged.connect( self.updateDaqChannelsAo) self.aiDeviceCombo.currentIndexChanged.connect( self.updateDaqChannelsAi) self.populateDaqCombos() self.restoreSettings() self.msmThread = None self.startPb.clicked.connect(self.startPbClicked) self.hkSub = HousekeepingSubscriber(self) self.hkSub.adrTemperatureReceived.connect(self.temperatureSb.setValue) self.hkSub.start() self.rawPlot.setAxisTitle(QwtPlot.yLeft, 'Vmeas') self.rawPlot.setAxisTitle(QwtPlot.xBottom, 'Vdrive') self.rawCurve = QwtPlotCurve('') self.rawCurve.attach(self.rawPlot) self.criticalCurve1 = QwtPlotCurve('+') self.criticalCurve1.setSymbol( Qwt.QwtSymbol(Qwt.QwtSymbol.Cross, Qt.QBrush(), Qt.QPen(Qt.Qt.red), Qt.QSize(5, 5))) self.criticalCurve1.attach(self.criticalPlot) self.criticalCurve2 = QwtPlotCurve('-') self.criticalCurve2.setSymbol( Qwt.QwtSymbol(Qwt.QwtSymbol.Cross, Qt.QBrush(), Qt.QPen(Qt.Qt.blue), Qt.QSize(5, 5))) self.criticalCurve2.attach(self.criticalPlot) self.criticalPlot.setAxisTitle(QwtPlot.yLeft, 'Vcrit') self.clearData() self.clearCriticalData() self.clearPb.clicked.connect(self.clearData) self.coilSweepCb.toggled.connect(self.toggleCoilSweep) self.clearCriticalPb.clicked.connect(self.clearCriticalData) self.samplesPerPointSb.valueChanged.connect( lambda value: self.discardSamplesSb.setMaximum(value - 1)) self.coilEnableCb.toggled.connect(self.toggleCoil) self.coilVoltageSb.valueChanged.connect(self.updateCoilVoltage) self.toggleCoil(self.coilEnableCb.isChecked()) self.coilDriverCombo.currentIndexChanged.connect( self.coilDriverChanged) self.Vcoil = np.nan def coilDriverChanged(self): text = self.coilDriverCombo.currentText() self.coilVisaLabel.setText('%s VISA' % text) self.coilVisaCombo.clear() if text == 'SR830': suffix = ' V' maxDrive = 10 self.coilVisaCombo.addItem('GPIB0::12') self.auxOutChannelSb.setEnabled(True) elif text == 'Keithley 6430': suffix = ' mA' maxDrive = 50 self.coilVisaCombo.addItem('GPIB0::24') self.auxOutChannelSb.setEnabled(False) controls = [ self.coilVoltageSb, self.coilSweepMinSb, self.coilSweepMaxSb ] for control in controls: control.setSuffix(suffix) control.setMinimum(-maxDrive) control.setMaximum(+maxDrive) def toggleCoil(self, enabled): self.coilDriverCombo.setEnabled(not enabled) if enabled: driver = self.coilDriverCombo.currentText() if driver == 'SR830': self.sr830 = SR830(str(self.coilVisaCombo.currentText())) self.coilAo = VoltageSourceSR830(self.sr830, self.auxOutChannelSb.value()) elif driver == 'Keithley 6430': self.coilAo = CurrentSourceKeithley(str( self.coilVisaCombo.currentText()), currentRange=10E-3) self.Vcoil = self.coilAo.dcDrive() self.coilVoltageSb.setValue(self.Vcoil) self.auxOutChannelSb.setEnabled(False) self.coilVisaCombo.setEnabled(False) else: self.coilAo = None self.auxOutChannelSb.setEnabled(True) self.coilVisaCombo.setEnabled(True) def updateCoilVoltage(self, V): if self.coilAo is not None: self.coilAo.setDcDrive(V) self.Vcoil = self.coilAo.dcDrive() def updateDaqChannelsAi(self): dev = str(self.aiDeviceCombo.currentText()) self.aiChannelCombo.clear() if len(dev): device = daq.Device(dev) aiChannels = device.findAiChannels() for channel in aiChannels: self.aiChannelCombo.addItem(channel) def updateDaqChannelsAo(self): dev = str(self.aoDeviceCombo.currentText()) self.aoChannelCombo.clear() if len(dev): device = daq.Device(dev) aoChannels = device.findAoChannels() for channel in aoChannels: self.aoChannelCombo.addItem(channel) def populateDaqCombos(self): system = daq.System() devices = system.findDevices() for devName in devices: dev = daq.Device(devName) if len(dev.findAiChannels()): self.aiDeviceCombo.addItem(devName) if len(dev.findAoChannels()): self.aoDeviceCombo.addItem(devName) def clearData(self): self.Vdrive = [] self.Vmeas = [] self.rawCurve.setData(self.Vdrive, self.Vmeas) self.rawPlot.replot() def clearCriticalData(self): self.Vcrit1 = [] self.Vcrit2 = [] self.Tcrit1 = [] self.Tcrit2 = [] self.VcoilCrit1 = [] self.VcoilCrit2 = [] self.updateCriticalPlot() def updateRawData(self, t, Vsource, Vmeas, Vo, T): string = "%.3f\t%.6f\t%.6f\t%.6f\t%.6f\t%.3f\n" % (t, Vsource, Vmeas, Vo, T, self.Vcoil) self.outputFile.write(string) self.Vdrive.append(Vsource) self.Vmeas.append(Vmeas - Vo) maxLength = 10000 if len(self.Vdrive) > int( maxLength * 1.1): # Automatically expire old data self.Vdrive = self.Vdrive[-maxLength:] self.Vmeas = self.Vmeas[-maxLength:] self.rawCurve.setData(self.Vdrive, self.Vmeas) self.rawPlot.replot() def toggleCoilSweep(self, checked): if checked: self.coilVoltages = np.linspace(self.coilSweepMinSb.value(), self.coilSweepMaxSb.value(), self.coilSweepStepsSb.value()) self.coilVoltages = np.append(self.coilVoltages, self.coilVoltages[::-1]) self.currentCoilStep = 0 self.stepCoil() else: self.coilVoltages = [] self.currentCoilStep = 0 def stepCoil(self): if self.coilAo is not None: self.coilVoltageSb.setValue( self.coilVoltages[self.currentCoilStep]) self.currentCoilStep += 1 if self.currentCoilStep >= len(self.coilVoltages): # Start over self.currentCoilStep = 0 def collectSweep(self, T, Vc): if Vc >= 0: self.Tcrit1.append(T) self.Vcrit1.append(Vc) self.VcoilCrit1.append(self.Vcoil) else: self.Tcrit2.append(T) self.Vcrit2.append(-Vc) self.VcoilCrit2.append(self.Vcoil) self.updateCriticalPlot() if self.coilSweepCb.isChecked(): # Move on to next coil voltage if self.bipolarCb.isChecked(): if not len(self.Tcrit2) == len(self.Tcrit1): print "Still need to do negative" return self.stepCoil() def updateCriticalPlot(self): xAxis = self.plotAxisCombo.currentText() if xAxis == 'T': x1 = self.Tcrit1 x2 = self.Tcrit2 self.criticalPlot.setAxisTitle(QwtPlot.xBottom, 'T') elif xAxis == 'Coil V': x1 = self.VcoilCrit1 x2 = self.VcoilCrit2 self.criticalPlot.setAxisTitle(QwtPlot.xBottom, 'Coil V') self.criticalCurve1.setData(x1, self.Vcrit1) self.criticalCurve2.setData(x2, self.Vcrit2) self.criticalPlot.replot() def startPbClicked(self): timeString = time.strftime('%Y%m%d-%H%M%S') fileName = self.sampleLineEdit.text() + '_%s_IV.dat' % timeString self.outputFile = open(fileName, 'a+') self.outputFile.write('#Program=IVSweepsDaq.py\n') self.outputFile.write('#Date=%s\n' % timeString) self.outputFile.write('#Sample=%s\n' % self.sampleLineEdit.text()) self.outputFile.write('#Source=%s\n' % self.sourceCombo.currentText()) self.outputFile.write('#Pre-amp gain=%.5g\n' % self.preampGainSb.value()) self.outputFile.write('#Drive impedance=%.6g\n' % self.dcDriveImpedanceSb.value()) self.outputFile.write('#Inter-sweep delay=%d\n' % self.interSweepDelaySb.value()) self.outputFile.write('#Samples per point=%d\n' % self.samplesPerPointSb.value()) self.outputFile.write('#Discard samples=%d\n' % self.discardSamplesSb.value()) self.outputFile.write('#Threshold=%.5g\n' % self.thresholdVoltageSb.value()) self.outputFile.write('#Bipolar=%d\n' % int(self.bipolarCb.isChecked())) if self.coilAo is not None: self.outputFile.write('#Coil enabled=1\n') self.outputFile.write('#Coil driver=%s\n' % self.coilAo.name()) self.outputFile.write('#Coil drive=%.3g\n' % self.coilAo.dcDrive()) else: self.outputFile.write('#Coil enabled=0\n') if self.coilSweepCb.isChecked(): self.outputFile.write('#Coil sweep=1\n') self.outputFile.write('#Coil min=%.3f\n' % self.coilSweepMinSb.value()) self.outputFile.write('#Coil max=%.3f\n' % self.coilSweepMaxSb.value()) self.outputFile.write('#Coil steps=%d\n' % self.coilSweepStepsSb.value()) else: self.outputFile.write('#Coil sweep=0\n') self.ao = VoltageSourceDaq(str(self.aoDeviceCombo.currentText()), str(self.aoChannelCombo.currentText())) self.ai = VoltmeterDaq(str(self.aiDeviceCombo.currentText()), str(self.aiChannelCombo.currentText()), -10, 10, samples=self.samplesPerPointSb.value(), drop=self.discardSamplesSb.value()) self.msmThread = IVSweepMeasurement(self.ao, self.ai, self) self.msmThread.setFileName(fileName) self.msmThread.setThreshold(self.thresholdVoltageSb.value()) self.msmThread.readingAvailable.connect(self.updateRawData) self.msmThread.setMinimumVoltage(self.startVSb.value()) self.msmThread.setMaximumVoltage(self.stopVSb.value()) self.msmThread.setSteps(self.stepsSb.value()) self.msmThread.setInterSweepDelay(self.interSweepDelaySb.value()) self.msmThread.sweepComplete.connect(self.collectSweep) self.msmThread.enableBipolar(self.bipolarCb.isChecked()) self.hkSub.adrTemperatureReceived.connect( self.msmThread.updateTemperature) self.msmThread.finished.connect(self.finished) self.stopPb.clicked.connect(self.msmThread.stop) self.thresholdVoltageSb.valueChanged.connect( self.msmThread.setThreshold) self.outputFile.write( '#' + '\t'.join(['time', 'Vdrive', 'Vmeas', 'Vo', 'T', 'Vcoil']) + '\n') self.enableWidgets(False) self.msmThread.start() print "Thread started" def finished(self): self.ai.clear() self.ao.clear() self.outputFile.close() self.enableWidgets(True) self.msmThread.deleteLater() # self.updateStatus('Completed') def enableWidgets(self, enable=True): self.sampleLineEdit.setEnabled(enable) self.startPb.setEnabled(enable) self.dcDriveImpedanceSb.setEnabled(enable) self.aiChannelCombo.setEnabled(enable) self.aiDeviceCombo.setEnabled(enable) self.aoChannelCombo.setEnabled(enable) self.aoDeviceCombo.setEnabled(enable) self.startVSb.setEnabled(enable) self.stopVSb.setEnabled(enable) self.stepsSb.setEnabled(enable) self.interSweepDelaySb.setEnabled(enable) self.bipolarCb.setEnabled(enable) self.stopPb.setEnabled(not enable) def closeEvent(self, e): if self.msmThread: self.msmThread.stop() if self.hkSub: self.hkSub.stop() self.saveSettings() super(IVSweepDaqWidget, self).closeEvent(e) def saveSettings(self): s = QSettings() s.setValue('sampleId', self.sampleLineEdit.text()) s.setValue('dcDriveImpedance', self.dcDriveImpedanceSb.value()) s.setValue('bipolar', self.bipolarCb.isChecked()) s.setValue('startV', self.startVSb.value()) s.setValue('stopV', self.stopVSb.value()) s.setValue('steps', self.stepsSb.value()) s.setValue('interSweepDelay', self.interSweepDelaySb.value()) s.setValue('thresholdVoltage', self.thresholdVoltageSb.value()) s.setValue('samplesPerPoint', self.samplesPerPointSb.value()) s.setValue('discardSamples', self.discardSamplesSb.value()) s.setValue('preampGain', self.preampGainSb.value()) s.setValue('geometry', self.saveGeometry()) s.setValue('AI_Device', self.aiDeviceCombo.currentText()) s.setValue('AO_Device', self.aoDeviceCombo.currentText()) s.setValue('AI_Channel', self.aiChannelCombo.currentText()) s.setValue('AO_Channel', self.aoChannelCombo.currentText()) s.setValue('SourceType', self.sourceCombo.currentText()) s.setValue('coilVisa', self.coilVisaCombo.currentText()) s.setValue('CoilAuxOut', self.auxOutChannelSb.value()) s.setValue('CoilVoltage', self.coilVoltageSb.value()) def restoreSettings(self): s = QSettings() self.sampleLineEdit.setText(s.value('sampleId', '', type=QString)) self.dcDriveImpedanceSb.setValue( s.value('dcDriveImpedance', 10E3, type=float)) self.bipolarCb.setChecked(s.value('bipolar', False, type=bool)) self.startVSb.setValue(s.value('startV', 0, type=float)) self.stopVSb.setValue(s.value('stopV', 3, type=float)) self.stepsSb.setValue(s.value('steps', 10, type=int)) self.preampGainSb.setValue(s.value('preampGain', 1., type=float)) self.interSweepDelaySb.setValue(s.value('interSweepDelay', 0, type=int)) self.thresholdVoltageSb.setValue( s.value('thresholdVoltage', 0.010, type=float)) self.samplesPerPointSb.setValue(s.value('samplesPerPoint', 1, type=int)) self.discardSamplesSb.setValue(s.value('discardSamples', 0, type=int)) self.aiDeviceCombo.setCurrentIndex( self.aiDeviceCombo.findText(s.value('AI_Device', '', type=str))) self.aoDeviceCombo.setCurrentIndex( self.aoDeviceCombo.findText(s.value('AO_Device', '', type=str))) self.aiChannelCombo.setCurrentIndex( self.aiChannelCombo.findText(s.value('AI_Channel', '', type=str))) self.aoChannelCombo.setCurrentIndex( self.aoChannelCombo.findText(s.value('AO_Channel', '', type=str))) self.sourceCombo.setCurrentIndex( self.sourceCombo.findText(s.value('SourceType', '', type=str))) self.coilVisaCombo.setCurrentIndex( self.coilVisaCombo.findText(s.value('coilVisa', '', type=str))) self.auxOutChannelSb.setValue(s.value('CoilAuxOut', 1, type=int)) self.coilVoltageSb.setValue(s.value('CoilVoltage', 0.0, type=float)) geometry = s.value('geometry', QByteArray(), type=QByteArray) self.restoreGeometry(geometry)
class IVSweepWidget(IVSweepsUi.Ui_Form, QWidget): def __init__(self, parent=None): super(IVSweepWidget, self).__init__(parent) self.setupUi(self) self.restoreSettings() self.msmThread = None self.startPb.clicked.connect(self.startPbClicked) self.adrTemp = TemperatureSubscriber(self) self.adrTemp.adrTemperature.connect(self.temperatureSb.setValue) self.adrTemp.start() self.plot.setAxisTitle(QwtPlot.yLeft, 'Vmeas') self.plot.setAxisTitle(QwtPlot.xBottom, 'Vdrive') self.curve = QwtPlotCurve('') self.curve.attach(self.plot) self.clearData() self.clearPb.clicked.connect(self.clearData) def clearData(self): self.Vdrive = [] self.Vmeas = [] self.curve.setData(self.Vdrive, self.Vmeas) self.plot.replot() def updateData(self, t, Vsource, Vmeas, T): self.Vdrive.append(Vsource) self.Vmeas.append(Vmeas) self.curve.setData(self.Vdrive, self.Vmeas) self.plot.replot() def startPbClicked(self): self.dmm = Agilent34401A(str(self.dmmCombo.currentText())) if not '34401A' in self.dmm.visaId(): print 'Agilent DMM not found.' return self.sr830 = SR830(str(self.sr830Combo.currentText())) if not 'SR830' in self.sr830.visaId(): print 'SR830 not found.' return self.enableWidgets(False) fileName = self.sampleLineEdit.text() + '_IV.dat' self.msmThread = IVSweepMeasurement(self.sr830, self.dmm, self) self.msmThread.setFileName(fileName) self.msmThread.readingAvailable.connect(self.updateData) Vs1 = np.linspace(self.startVSb.value(), self.stopVSb.value(), self.stepsSb.value()) Vs2 = np.linspace(self.stopVSb.value(), self.stop2VSb.value(), self.steps2Sb.value()) Vs = np.append(Vs1, Vs2[1:]) Vs = np.append(Vs, Vs[-2::-1]) print Vs self.msmThread.setVoltages(Vs) self.adrTemp.adrTemperature.connect(self.msmThread.updateTemperature) self.msmThread.finished.connect(self.finished) self.stopPb.clicked.connect(self.msmThread.stop) self.msmThread.start() print "Thread started" def finished(self): self.enableWidgets(True) # self.updateStatus('Completed') def enableWidgets(self, enable=True): self.sampleLineEdit.setEnabled(enable) self.startPb.setEnabled(enable) self.stopPb.setEnabled(~enable) self.dcDriveImpedanceSb.setEnabled(enable) def closeEvent(self, e): if self.msmThread: self.msmThread.stop() if self.adrTemp: self.adrTemp.stop() self.saveSettings() super(IVSweepWidget, self).closeEvent(e) def saveSettings(self): s = QSettings() s.setValue('sampleId', self.sampleLineEdit.text()) s.setValue('dcDriveImpedance', self.dcDriveImpedanceSb.value()) s.setValue('startV', self.startVSb.value()) s.setValue('stopV', self.stopVSb.value()) s.setValue('step', self.stepsSb.value()) s.setValue('stop2V', self.stop2VSb.value()) s.setValue('step2', self.steps2Sb.value()) s.setValue('preampGain', self.preampGainSb.value()) s.setValue('geometry', self.saveGeometry()) s.setValue('sr830Visa', self.sr830Combo.currentText()) s.setValue('dmmVisa', self.dmmCombo.currentText()) def restoreSettings(self): s = QSettings() self.sampleLineEdit.setText(s.value('sampleId', '', type=QString)) self.dcDriveImpedanceSb.setValue( s.value('dcDriveImpedance', 10E3, type=float)) self.startVSb.setValue(s.value('startV', 0, type=float)) self.stopVSb.setValue(s.value('stopV', 3, type=float)) self.stepsSb.setValue(s.value('steps', 10, type=int)) self.stop2VSb.setValue(s.value('stop2V', 6, type=float)) self.steps2Sb.setValue(s.value('steps2', 10, type=int)) self.preampGainSb.setValue(s.value('preamGain', 1., type=float)) i = self.sr830Combo.findText(s.value('sr830Visa', '', type=str)) self.sr830Combo.setCurrentIndex(i) i = self.dmmCombo.findText(s.value('dmmVisa', '', type=str)) self.dmmCombo.setCurrentIndex(i) geometry = s.value('geometry', QByteArray(), type=QByteArray) self.restoreGeometry(geometry)
class ValueWidget(QWidget, Ui_Widget): def __init__(self, iface): self.hasqwt = hasqwt self.hasmpl = hasmpl self.layerMap = dict() self.statsChecked = False self.ymin = 0 self.ymax = 250 self.isActive = False # Statistics (>=1.9) self.statsSampleSize = 2500000 self.stats = {} # stats per layer self.layersSelected = [] self.layerBands = dict() self.iface = iface self.canvas = self.iface.mapCanvas self.legend = self.iface.legendInterface() self.logger = logging.getLogger('.'.join( (__name__, self.__class__.__name__))) QWidget.__init__(self) self.setupUi(self) self.tabWidget.setEnabled(False) self.cbxClick.setChecked(QSettings().value( 'plugins/valuetool/mouseClick', False, type=bool)) #self.setupUi_plot() #don't setup plot until Plot tab is clicked - workaround for bug #7450 #qgis will still crash in some cases, but at least the tool can be used in Table mode self.qwtPlot = None self.mplPlot = None self.mplLine = None QObject.connect(self.plotSelector, SIGNAL("currentIndexChanged ( int )"), self.changePlot) QObject.connect(self.tabWidget, SIGNAL("currentChanged ( int )"), self.tabWidgetChanged) QObject.connect(self.cbxLayers, SIGNAL("currentIndexChanged ( int )"), self.updateLayers) QObject.connect(self.cbxBands, SIGNAL("currentIndexChanged ( int )"), self.updateLayers) QObject.connect(self.tableWidget2, SIGNAL("cellChanged ( int , int )"), self.layerSelected) def setupUi_plot(self): # plot self.plotSelector.setVisible(False) self.cbxStats.setVisible(False) # stats by default because estimated are fast self.cbxStats.setChecked(True) self.plotSelector.addItem('Qwt') self.plotSelector.addItem('mpl') # Page 2 - qwt if self.hasqwt: self.qwtPlot = QwtPlot(self.stackedWidget) self.qwtPlot.setAutoFillBackground(False) self.qwtPlot.setObjectName("qwtPlot") self.curve = QwtPlotCurve() self.curve.setSymbol( QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.white), QPen(Qt.red, 2), QSize(9, 9))) self.curve.attach(self.qwtPlot) else: self.qwtPlot = QtGui.QLabel( "Need Qwt >= 5.0 or matplotlib >= 1.0 !") sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.qwtPlot.sizePolicy().hasHeightForWidth()) self.qwtPlot.setSizePolicy(sizePolicy) self.qwtPlot.updateGeometry() self.stackedWidget.addWidget(self.qwtPlot) #Page 3 - matplotlib self.mplLine = None #make sure to invalidate when layers change if self.hasmpl: # mpl stuff # should make figure light gray self.mplBackground = None #http://www.scipy.org/Cookbook/Matplotlib/Animations self.mplFig = plt.Figure(facecolor='w', edgecolor='w') self.mplFig.subplots_adjust(left=0.1, right=0.975, bottom=0.13, top=0.95) self.mplPlt = self.mplFig.add_subplot(111) self.mplPlt.tick_params(axis='both', which='major', labelsize=12) self.mplPlt.tick_params(axis='both', which='minor', labelsize=10) # qt stuff self.pltCanvas = FigureCanvasQTAgg(self.mplFig) self.pltCanvas.setParent(self.stackedWidget) self.pltCanvas.setAutoFillBackground(False) self.pltCanvas.setObjectName("mplPlot") self.mplPlot = self.pltCanvas else: self.mplPlot = QtGui.QLabel( "Need Qwt >= 5.0 or matplotlib >= 1.0 !") sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mplPlot.sizePolicy().hasHeightForWidth()) self.mplPlot.setSizePolicy(sizePolicy) self.mplPlot.updateGeometry() self.stackedWidget.addWidget(self.mplPlot) if (self.hasqwt and self.hasmpl): self.plotSelector.setEnabled(True) self.plotSelector.setVisible(True) self.plotSelector.setCurrentIndex(0) else: if self.hasqwt: self.plotSelector.setCurrentIndex(0) else: self.plotSelector.setCurrentIndex(1) self.changePlot() def keyPressEvent(self, e): if (e.modifiers() == Qt.ControlModifier or e.modifiers() == Qt.MetaModifier) and e.key() == Qt.Key_C: items = '' for rec in range(self.tableWidget.rowCount()): items += '"' + self.tableWidget.item( rec, 0).text() + '",' + self.tableWidget.item( rec, 1).text() + "\n" if not items == '': clipboard = QApplication.clipboard() clipboard.setText(items) else: QWidget.keyPressEvent(self, e) def changePlot(self): if (self.plotSelector.currentText() == 'mpl'): self.stackedWidget.setCurrentIndex(1) else: self.stackedWidget.setCurrentIndex(0) def changeActive(self, active, gui=True): self.isActive = active if (active): self.cbxEnable.setCheckState(Qt.Checked) QObject.connect(self.canvas, SIGNAL("layersChanged ()"), self.invalidatePlot) if not self.cbxClick.isChecked(): QObject.connect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) else: self.cbxEnable.setCheckState(Qt.Unchecked) QObject.disconnect(self.canvas, SIGNAL("layersChanged ()"), self.invalidatePlot) QObject.disconnect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) if gui: self.tabWidget.setEnabled(active) if active: self.labelStatus.setText(self.tr("Value tool is enabled")) if self.tabWidget.currentIndex() == 2: self.updateLayers() else: self.labelStatus.setText(self.tr("")) #use this to clear plot when deactivated #self.values=[] #self.showValues() def activeRasterLayers(self, index=None): layers = [] allLayers = [] if not index: index = self.cbxLayers.currentIndex() if index == 0: allLayers = self.canvas.layers() elif index == 1: allLayers = self.legend.getLayers() elif index == 2: for layer in self.legend.getLayers(): if layer.id() in self.layersSelected: allLayers.append(layer) for layer in allLayers: if layer!=None and layer.isValid() and \ layer.type()==QgsMapLayer.RasterLayer and \ layer.dataProvider() and \ (layer.dataProvider().capabilities() & QgsRasterDataProvider.IdentifyValue): layers.append(layer) return layers def activeBandsForRaster(self, layer): activeBands = [] if self.cbxBands.currentIndex() == 1 and layer.renderer(): activeBands = layer.renderer().usesBands() elif self.cbxBands.currentIndex() == 2: if layer.bandCount() == 1: activeBands = [1] else: activeBands = self.layerBands[layer.id()] if ( layer.id() in self.layerBands) else [] else: activeBands = range(1, layer.bandCount() + 1) return activeBands def printValue(self, position): if debug > 0: print(position) if not position: return if self.tabWidget.currentIndex() == 2: return if debug > 0: print("%d active rasters, %d canvas layers" % (len(self.activeRasterLayers()), self.canvas.layerCount())) layers = self.activeRasterLayers() if len(layers) == 0: if self.canvas.layerCount() > 0: self.labelStatus.setText( self.tr( "No valid layers to display - change layers in options" )) else: self.labelStatus.setText(self.tr("No valid layers to display")) self.values = [] self.showValues() return self.labelStatus.setText( self.tr('Coordinate:') + ' (%f, %f)' % (position.x(), position.y())) needextremum = (self.tabWidget.currentIndex() == 1) # if plot is shown # count the number of requires rows and remember the raster layers nrow = 0 rasterlayers = [] layersWOStatistics = [] for layer in layers: nrow += layer.bandCount() rasterlayers.append(layer) # check statistics for each band if needextremum: for i in range(1, layer.bandCount() + 1): has_stats = self.getStats(layer, i) is not None if not layer.id() in self.layerMap and not has_stats\ and not layer in layersWOStatistics: layersWOStatistics.append(layer) if layersWOStatistics and not self.statsChecked: self.calculateStatistics(layersWOStatistics) irow = 0 self.values = [] self.ymin = 1e38 self.ymax = -1e38 mapCanvasSrs = self.iface.mapCanvas.mapRenderer().destinationCrs() # TODO - calculate the min/max values only once, instead of every time!!! # keep them in a dict() with key=layer.id() #pull out wavelength if it exists in metadata #piece to pull out wavelength information if present in metadata rasterMeta = rasterlayers[0].metadata() self.wavelengths = {} self.wavelength_units = '' if ('wavelength' in rasterMeta): mdSplit = rasterMeta.split('</p>') for d in mdSplit: if ('Band_' in d and 'glossy' not in d and '=' in d): variableName, valueWavelength = d.split('=') bandNumber = int(variableName.split('_')[1]) self.wavelengths[bandNumber] = float( valueWavelength.split(' ')[-2].replace('(', '')) elif ('wavelength_units' in d): variableName, v = d.split('=') self.wavelength_units = v #### for layer in rasterlayers: layername = unicode(layer.name()) layerSrs = layer.crs() pos = position # if given no position, get dummy values if position is None: pos = QgsPoint(0, 0) # transform points if needed elif not mapCanvasSrs == layerSrs and self.iface.mapCanvas.hasCrsTransformEnabled( ): srsTransform = QgsCoordinateTransform(mapCanvasSrs, layerSrs) try: pos = srsTransform.transform(position) except QgsCsException, err: # ignore transformation errors continue if True: # for QGIS >= 1.9 if not layer.dataProvider(): continue ident = None if position is not None: canvas = self.iface.mapCanvas # first test if point is within map layer extent # maintain same behaviour as in 1.8 and print out of extent if not layer.dataProvider().extent().contains(pos): ident = dict() for iband in range(1, layer.bandCount() + 1): ident[iband] = QVariant(self.tr('out of extent')) # we can only use context if layer is not projected elif canvas.hasCrsTransformEnabled( ) and layer.dataProvider().crs() != canvas.mapRenderer( ).destinationCrs(): ident = layer.dataProvider().identify( pos, QgsRaster.IdentifyFormatValue).results() else: extent = canvas.extent() width = round(extent.width() / canvas.mapUnitsPerPixel()) height = round(extent.height() / canvas.mapUnitsPerPixel()) extent = canvas.mapRenderer().mapToLayerCoordinates( layer, extent) ident = layer.dataProvider().identify( pos, QgsRaster.IdentifyFormatValue, canvas.extent(), width, height).results() if not len(ident) > 0: continue # if given no position, set values to 0 if position is None and ident is not None and ident.iterkeys( ) is not None: for key in ident.iterkeys(): ident[key] = layer.dataProvider().noDataValue(key) # bands displayed depends on cbxBands (all / active / selected) activeBands = self.activeBandsForRaster(layer) for iband in activeBands: # loop over the active bands layernamewithband = layername if ident is not None and len(ident) > 1: layernamewithband += ' ' + layer.bandName(iband) if not ident or not ident.has_key( iband): # should not happen bandvalue = "?" else: bandvalue = ident[iband].toString() if bandvalue is None: bandvalue = "no data" self.values.append((layernamewithband, str(bandvalue))) if needextremum: # estimated statistics stats = self.getStats(layer, iband) if stats: self.ymin = min(self.ymin, stats.minimumValue) self.ymax = max(self.ymax, stats.maximumValue) if len(self.values) == 0: self.labelStatus.setText(self.tr("No valid bands to display")) self.showValues()
class MutantWidget(QWidget, Ui_Widget): def __init__(self, iface): self.hasqwt = has_qwt self.hasmpl = has_mpl self.haspqg = has_pyqtgraph self.layerMap = dict() self.statsChecked = False self.ymin = 0 self.ymax = 365 self.isActive = False self.mt_enabled = False # Statistics (>=1.9) self.statsSampleSize = 2500000 self.stats = {} # stats per layer self.layersSelected = [] self.layerBands = dict() self.iface = iface self.canvas = self.iface.mapCanvas() self.legend = self.iface.legendInterface() self.logger = logging.getLogger('.'.join( (__name__, self.__class__.__name__))) QWidget.__init__(self) self.setupUi(self) self.tabWidget.setEnabled(False) self.plotOnMove.setChecked(QSettings().value( 'plugins/mutant/mouseClick', False, type=bool)) self.leYMin.setText(str(self.ymin)) self.leYMax.setText(str(self.ymax)) self.tracker = TimeTracker(self, self.canvas) self.filter = ApplyFilter(self, self.canvas) if has_mpl: self.mpl_cust = MplSettings(self, self.canvas) # self.setupUi_plot() # don't setup plot until Graph(1) tab is clicked - workaround for bug # #7450 # qgis will still crash in some cases, but at least the tool can be # used in Table mode self.qwtPlot = None self.mplPlot = None self.mplLine = None QObject.connect(self.plotLibSelector, SIGNAL("currentIndexChanged ( int )"), self.change_plot) QObject.connect(self.tabWidget, SIGNAL("currentChanged ( int )"), self.tabWidgetChanged) QObject.connect(self.layerSelection, SIGNAL("currentIndexChanged ( int )"), self.update_layers) QObject.connect(self.bandSelection, SIGNAL("currentIndexChanged ( int )"), self.update_layers) QObject.connect(self.selectionTable, SIGNAL("cellChanged ( int , int )"), self.layerSelected) QObject.connect(self.enableMTAnalysesCheckBox, SIGNAL("toggled ( bool )"), self.on_mt_analysis_toggled) QObject.connect(self.selectionStringLineEdit, SIGNAL("textChanged ( QString )"), self.update_layers) QObject.connect(self.yAutoCheckBox, SIGNAL("toggled ( bool )"), self.y_auto_toggle) QObject.connect(self.toggleMutant, SIGNAL("toggled ( bool )"), self.catch_errors) self.exportPushButton.clicked.connect(self.export_values) # TODO Get Export from graph values # self.exportPushButton_2.clicked.connect(self.xxxx) self.registry = QgsMapLayerRegistry.instance() QObject.connect(self.registry, SIGNAL("layersAdded(QList< QgsMapLayer * >)"), self.catch_errors) QObject.connect(self.registry, SIGNAL("layersRemoved(QStringList)"), self.catch_errors) self.setupUi_plot() def catch_errors(self): if self.toggleMutant.isChecked(): layers = self.activeRasterLayers() if len(layers) == 0: if self.canvas.layerCount() > 0: text = self.tr("Mutant: No valid layers to display - " "add Rasterlayers") self.pop_messagebar(text) self.changeActive(False) else: text = self.tr("Mutant: No valid layers to display") self.pop_messagebar(text) self.changeActive(False) self.values = [] return else: return else: return def y_auto_toggle(self, state): # User has toggled automatic (default) y min/max values if state == 1: self.leYMin.setEnabled(False) self.leYMax.setEnabled(False) self.leYMin.setText(str(self.ymin)) self.leYMax.setText(str(self.ymax)) else: self.leYMin.setEnabled(True) self.leYMax.setEnabled(True) def pop_messagebar(self, text, d_time=5): if d_time == 0: self.iface.messageBar().pushWidget( self.iface.messageBar().createMessage(text), QgsMessageBar.WARNING) else: self.iface.messageBar().pushWidget( self.iface.messageBar().createMessage(text), QgsMessageBar.WARNING, d_time) def setupUi_plot(self): # plot self.plotLibSelector.setVisible(False) self.enableStatistics.setVisible(False) # stats by default because estimated are fast self.enableStatistics.setChecked(True) plot_count = 0 self.mplLine = None # make sure to invalidate when layers change if self.hasqwt: # Page 2 - qwt self.plotLibSelector.addItem('Qwt') plot_count += 1 # Setup Qwt Plot Area in Widget self.qwtPlot = QwtPlot(self.stackedWidget) self.qwtPlot.setAutoFillBackground(False) self.qwtPlot.setObjectName("qwtPlot") self.curve = QwtPlotCurve() self.curve.setSymbol( QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.white), QPen(Qt.red, 2), QSize(9, 9))) self.curve.attach(self.qwtPlot) # Size Policy ??? sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.qwtPlot.sizePolicy().hasHeightForWidth()) self.qwtPlot.setSizePolicy(sizePolicy) # Size Policy ??? self.qwtPlot.updateGeometry() self.stackedWidget.addWidget(self.qwtPlot) self.qwt_widgetnumber = self.stackedWidget.indexOf(self.qwtPlot) if self.hasmpl: # Page 3 - setup matplotlib self.plotLibSelector.addItem('matplotlib') # If matplotlib is the only one self.toggleInterpolation.setEnabled(True) self.toggleInterpolation.setVisible(True) plot_count += 1 self.mplBackground = None # http://www.scipy.org/Cookbook/Matplotlib/Animations self.mplFig = plt.Figure(facecolor='w', edgecolor='g', linewidth=0.0) self.mpl_subplot = self.mplFig.add_subplot(111) self.pltCanvas = FigureCanvasQTAgg(self.mplFig) self.pltCanvas.setParent(self.stackedWidget) self.pltCanvas.setAutoFillBackground(False) self.pltCanvas.setObjectName("mplPlot") self.mplPlot = self.pltCanvas self.mplPlot.updateGeometry() self.stackedWidget.addWidget(self.mplPlot) self.mpl_widgetnumber = self.stackedWidget.indexOf(self.mplPlot) if self.haspqg: # Page 3 - setup PyQtGraph self.plotLibSelector.addItem('PyQtGraph') plot_count += 1 # Setup PyQtGraph stuff pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') self.pqg_axis = DateTimeAxis(orientation='bottom') self.pqg_plot_widget = pg.PlotWidget( parent=self.stackedWidget, axisItems={'bottom': self.pqg_axis}) self.pqg_plot_item = self.pqg_plot_widget.getPlotItem() self.pqg_plot_widget.updateGeometry() self.stackedWidget.addWidget(self.pqg_plot_widget) self.pqg_widgetnumber = self.stackedWidget.indexOf( self.pqg_plot_widget) # on zoom change do: self.pqg_plot_item.sigXRangeChanged.connect(self.refresh_ticks) if plot_count > 1: self.plotLibSelector.setEnabled(True) self.plotLibSelector.setVisible(True) self.plotLibSelector.setCurrentIndex(0) if self.hasqwt: self.plotLibSelector.setCurrentIndex(self.qwt_widgetnumber) elif self.hasmpl: self.plotLibSelector.setCurrentIndex(self.mpl_widgetnumber) else: self.plotLibSelector.setCurrentIndex(self.pqg_widgetnumber) self.change_plot() elif plot_count == 1: self.plotLibSelector.setCurrentIndex(0) self.change_plot() else: # can only be 0 if nothing else matched message_text = "Mutant cannot find any graphiclibrary for " \ "creating plots. Please install either Qwt >= 5.0 " \ ",matplotlib >= 1.0 or PyQtGraph >= 0.9.8!" self.plot_message = QtGui.QLabel(message_text) self.plot_message.setWordWrap(True) self.stackedWidget.addWidget(self.plot_message) self.pop_messagebar(message_text) def change_plot(self): if self.stackedWidget.count() > 1: if self.plotLibSelector.currentText() == 'Qwt': self.stackedWidget.setCurrentIndex(self.qwt_widgetnumber) self.toggleInterpolation.setDisabled(True) self.toggleInterpolation.setVisible(False) elif self.plotLibSelector.currentText() == 'matplotlib': self.stackedWidget.setCurrentIndex(self.mpl_widgetnumber) self.toggleInterpolation.setEnabled(True) self.toggleInterpolation.setVisible(True) self.mpl_subplot.clear() elif self.plotLibSelector.currentText() == 'PyQtGraph': self.stackedWidget.setCurrentIndex(self.pqg_widgetnumber) self.toggleInterpolation.setDisabled(True) self.toggleInterpolation.setVisible(False) self.pqg_plot_widget.clear() elif self.stackedWidget.count() == 1: self.stackedWidget.setCurrentIndex(0) else: self.stackedWidget.setCurrentIndex(-1) def keyPressEvent(self, e): if (e.modifiers() == Qt.ControlModifier or e.modifiers() == Qt.MetaModifier) and e.key() == Qt.Key_C: items = '' for rec in range(self.valueTable.rowCount()): items += '"' + self.valueTable.item( rec, 0).text() + '",' + self.valueTable.item( rec, 1).text() + "\n" if not items == '': clipboard = QApplication.clipboard() clipboard.setText(items) else: QWidget.keyPressEvent(self, e) def changeActive(self, active, gui=True): self.isActive = active if active: self.toggleMutant.setCheckState(Qt.Checked) QObject.connect(self.canvas, SIGNAL("layersChanged ()"), self.invalidatePlot) #QObject.connect(self.canvas, # SIGNAL("layersChanged ()"), # self.catch_errors) if not self.plotOnMove.isChecked(): QObject.connect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) else: self.toggleMutant.setCheckState(Qt.Unchecked) QObject.disconnect(self.canvas, SIGNAL("layersChanged ()"), self.invalidatePlot) QObject.disconnect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) if gui: self.tabWidget.setEnabled(active) if active: self.labelStatus.setText(self.tr("Mutant is enabled!")) # FIXME: Only on Options Tab? if self.tabWidget.currentIndex() == 2: self.update_layers() else: self.labelStatus.setText(self.tr("")) #use this to clear plot when deactivated #self.values=[] #self.showValues() def activeRasterLayers(self, index=None): layers = [] allLayers = [] if not index: index = self.layerSelection.currentIndex() if index == 0: allLayers = self.canvas.layers() elif index == 1 or index == 3: allLayers = self.legend.layers() elif index == 2: for layer in self.legend.layers(): if layer.id() in self.layersSelected: allLayers.append(layer) for layer in allLayers: if index == 3: # Check if the layer name matches our filter and skip it if it # doesn't if not self.name_matches_filter(layer.name()): continue if layer is not None and layer.isValid() and \ layer.type() == QgsMapLayer.RasterLayer and \ layer.dataProvider() and \ (layer.dataProvider().capabilities() & QgsRasterDataProvider.IdentifyValue): layers.append(layer) return layers def activeBandsForRaster(self, layer): activeBands = [] if self.bandSelection.currentIndex() == 1 and layer.renderer(): activeBands = layer.renderer().usesBands() elif self.bandSelection.currentIndex() == 2: if layer.bandCount() == 1: activeBands = [1] else: activeBands = self.layerBands[layer.id()] if ( layer.id() in self.layerBands) else [] else: activeBands = range(1, layer.bandCount() + 1) return activeBands def printValue(self, position): if debug > 0: print(position) if not position: return if self.tabWidget.currentIndex() == 2: return if debug > 0: print("%d active rasters, %d canvas layers" % (len(self.activeRasterLayers()), self.canvas.layerCount())) layers = self.activeRasterLayers() self.labelStatus.setText( self.tr('Coordinate:') + ' (%f, %f)' % (position.x(), position.y())) need_extremum = (self.tabWidget.currentIndex() == 1 ) # if plot is shown # count the number of required rows and remember the raster layers nrow = 0 rasterlayers = [] layersWOStatistics = [] for layer in layers: nrow += layer.bandCount() rasterlayers.append(layer) # check statistics for each band if need_extremum: for i in range(1, layer.bandCount() + 1): has_stats = self.get_statistics(layer, i) is not None if not layer.id() in self.layerMap and not has_stats \ and not layer in layersWOStatistics: layersWOStatistics.append(layer) if layersWOStatistics and not self.statsChecked: self.calculateStatistics(layersWOStatistics) irow = 0 self.values = [] self.ymin = 1e38 self.ymax = -1e38 mapCanvasSrs = self.iface.mapCanvas().mapRenderer().destinationCrs() # TODO - calculate the min/max values only once, # instead of every time!!! # And keep them in a dict() with key=layer.id() counter = 0 for layer in rasterlayers: layer_name = unicode(layer.name()) layer_srs = layer.crs() pos = position # if given no position, get dummy values if position is None: pos = QgsPoint(0, 0) # transform points if needed elif not mapCanvasSrs == layer_srs and \ self.iface.mapCanvas().hasCrsTransformEnabled(): srsTransform = QgsCoordinateTransform(mapCanvasSrs, layer_srs) try: pos = srsTransform.transform(position) except QgsCsException, err: # ignore transformation errors continue if True: if not layer.dataProvider(): continue ident = None if position is not None: canvas = self.iface.mapCanvas() # first test if point is within map layer extent # maintain same behaviour as in 1.8 and print out of extent if not layer.dataProvider().extent().contains(pos): ident = dict() for iband in range(1, layer.bandCount() + 1): ident[iband] = str(self.tr('out of extent')) # we can only use context if layer is not projected elif canvas.hasCrsTransformEnabled() and \ layer.dataProvider().crs() != \ canvas.mapRenderer().destinationCrs(): ident = layer.dataProvider().identify( pos, QgsRaster.IdentifyFormatValue).results() else: extent = canvas.extent() width = round(extent.width() / canvas.mapUnitsPerPixel()) height = round(extent.height() / canvas.mapUnitsPerPixel()) extent = canvas.mapRenderer().mapToLayerCoordinates( layer, extent) ident = layer.dataProvider().identify( pos, QgsRaster.IdentifyFormatValue, canvas.extent(), width, height).results() if not len(ident) > 0: continue # if given no position, set values to 0 if position is None and ident is not None and ident.iterkeys( ) is not None: for key in ident.iterkeys(): ident[key] = layer.dataProvider().noDataValue(key) # bands displayed depends on cbxBands (all / active / selected) activeBands = self.activeBandsForRaster(layer) for iband in activeBands: # loop over the active bands layer_name_with_band = layer_name if ident is not None and len(ident) > 1: layer_name_with_band += ' ' + layer.bandName(iband) if not ident or not ident.has_key(iband): bandvalue = "?" else: bandvalue = ident[iband] if bandvalue is None: bandvalue = "no data" # different x-Axis depending on if we want to use time or # not if self.mt_enabled: layer_time = self.tracker.get_time_for_layer(layer) if layer_time is None: continue else: # pyqtgraph enabled convert date to epoch graphlib = self.plotLibSelector.currentText() if graphlib == 'PyQtGraph': layer_time = time.mktime( layer_time.timetuple()) # overwrite tup = (layer_name_with_band, layer_time, str(bandvalue)) else: tup = (layer_name_with_band, counter + 1, str(bandvalue)) self.values.append(tup) if need_extremum: # estimated statistics stats = self.get_statistics(layer, iband) if stats: self.ymin = min(self.ymin, stats.minimumValue) self.ymax = max(self.ymax, stats.maximumValue) counter += 1 # Update the ymin, ymax line edits if required if self.yAutoCheckBox.isChecked(): self.leYMin.setText(str(self.ymin)) self.leYMax.setText(str(self.ymax)) self.values.sort(key=operator.itemgetter(1)) if len(self.values) == 0: self.labelStatus.setText(self.tr("No valid bands to display")) self.showValues(position)
def attachCurves(self, wdg, profiles, model1, library): if library == "Qwt5" and has_qwt: wdg.plotWdg.clear() for i in range(0, model1.rowCount()): profileName = model1.item(i, 4).data(Qt.EditRole) profileId = model1.item(i, 5).data(Qt.EditRole) isVisible = model1.item(i, 0).data(Qt.CheckStateRole) xx = profiles[i]["l"] yy = profiles[i][profileName] if library == "Qwt5" and has_qwt: # As QwtPlotCurve doesn't support nodata, split the data into single lines # with breaks wherever data is None. # Prepare two lists of coordinates (xx and yy). Make x=None whenever y==None. for j in range(len(yy)): if yy[j] is None or isnan(yy[j]): xx[j] = None yy[j] = None # Split xx and yy into single lines at None values xx = [ list(g) for k, g in itertools.groupby(xx, lambda x: x is None) if not k ] yy = [ list(g) for k, g in itertools.groupby(yy, lambda x: x is None) if not k ] # Create & attach one QwtPlotCurve per one single line for j in range(len(xx)): curve = QwtPlotCurve(profileId) curve.setData(xx[j], yy[j]) curve.setPen( QPen(model1.item(i, 1).data(Qt.BackgroundRole), 3)) curve.attach(wdg.plotWdg) curve.setVisible(isVisible) elif library == "Matplotlib" and has_mpl: lines = wdg.plotWdg.figure.get_axes()[0].get_lines() lineIds = [line.get_gid() for line in lines] if profileId in lineIds: # Update existing line line = lines[lineIds.index(profileId)] line.set_data([xx, yy]) else: # Create new line line = wdg.plotWdg.figure.get_axes()[0].plot( xx, yy, gid=profileId)[0] line.set_visible(isVisible) # X-axis have to be set before wdg is redrawn in changeColor, otherwise and # exception is sometimes thrown when time-based axis is used. minimumValueX = min(z for z in profiles[i]["l"]) maximumValueX = max(z for z in profiles[i]["l"]) wdg.plotWdg.figure.get_axes()[0].set_xlim( [minimumValueX, maximumValueX]) self.changeColor(wdg, "Matplotlib", model1.item(i, 1).data(Qt.BackgroundRole), profileId)
class ValueWidget(QWidget, Ui_Widget): def __init__(self, iface): self.hasqwt=hasqwt self.hasmpl=hasmpl self.layerMap=dict() self.statsChecked=False self.ymin=0 self.ymax=250 self.iface=iface self.canvas=self.iface.mapCanvas() self.legend=self.iface.legendInterface() self.logger = logging.getLogger('.'.join((__name__, self.__class__.__name__))) QWidget.__init__(self) self.setupUi(self) self.setupUi_extra() QObject.connect(self.cbxActive,SIGNAL("stateChanged(int)"),self.changeActive) QObject.connect(self.cbxGraph,SIGNAL("stateChanged(int)"),self.changePage) QObject.connect(self.canvas, SIGNAL( "keyPressed( QKeyEvent * )" ), self.pauseDisplay ) QObject.connect(self.plotSelector, SIGNAL( "currentIndexChanged ( int )" ), self.changePlot ) def setupUi_extra(self): # checkboxes #self.changeActive(Qt.Checked) #set inactive by default - should save last state in user config self.cbxActive.setCheckState(Qt.Unchecked) # plot self.plotSelector.setVisible( False ) self.cbxStats.setVisible( False ) self.graphControls.setVisible( False ) if self.hasqwt: self.plotSelector.addItem( 'Qwt' ) if self.hasmpl: self.plotSelector.addItem( 'mpl' ) self.plotSelector.setCurrentIndex( 0 ); if (not self.hasqwt or not self.hasmpl): #self.plotSelector.setVisible(False) self.plotSelector.setEnabled(False) # Page 2 - qwt if self.hasqwt: self.qwtPlot = QwtPlot(self.stackedWidget) self.qwtPlot.setAutoFillBackground(False) self.qwtPlot.setObjectName("qwtPlot") self.curve = QwtPlotCurve() self.curve.setSymbol( QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.white), QPen(Qt.red, 2), QSize(9, 9))) self.curve.attach(self.qwtPlot) self.qwtPlot.setVisible(False) else: self.qwtPlot = QtGui.QLabel("Need Qwt >= 5.0 or matplotlib >= 1.0 !") sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.qwtPlot.sizePolicy().hasHeightForWidth()) self.qwtPlot.setSizePolicy(sizePolicy) self.qwtPlot.setObjectName("qwtPlot") self.qwtPlot.updateGeometry() self.stackedWidget.addWidget(self.qwtPlot) #Page 3 - matplotlib self.mplLine = None #make sure to invalidate when layers change if self.hasmpl: # mpl stuff # should make figure light gray self.mplBackground = None #http://www.scipy.org/Cookbook/Matplotlib/Animations self.mplFig = plt.Figure(facecolor='w', edgecolor='w') self.mplFig.subplots_adjust(left=0.1, right=0.975, bottom=0.13, top=0.95) self.mplPlt = self.mplFig.add_subplot(111) self.mplPlt.tick_params(axis='both', which='major', labelsize=12) self.mplPlt.tick_params(axis='both', which='minor', labelsize=10) # qt stuff self.pltCanvas = FigureCanvasQTAgg(self.mplFig) self.pltCanvas.setParent(self.stackedWidget) self.pltCanvas.setAutoFillBackground(False) self.pltCanvas.setObjectName("mplPlot") self.mplPlot = self.pltCanvas self.mplPlot.setVisible(False) else: self.mplPlot = QtGui.QLabel("Need Qwt >= 5.0 or matplotlib >= 1.0 !") sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mplPlot.sizePolicy().hasHeightForWidth()) self.mplPlot.setSizePolicy(sizePolicy) self.qwtPlot.setObjectName("qwtPlot") self.mplPlot.updateGeometry() self.stackedWidget.addWidget(self.mplPlot) self.stackedWidget.setCurrentIndex(0) def disconnect(self): self.changeActive(False) QObject.disconnect(self.canvas, SIGNAL( "keyPressed( QKeyEvent * )" ), self.pauseDisplay ) def pauseDisplay(self,e): if ( e.modifiers() == Qt.ShiftModifier or e.modifiers() == Qt.MetaModifier ) and e.key() == Qt.Key_A: self.cbxActive.toggle() return True return False def keyPressEvent( self, e ): if ( e.modifiers() == Qt.ControlModifier or e.modifiers() == Qt.MetaModifier ) and e.key() == Qt.Key_C: items = QString() for rec in range( self.tableWidget.rowCount() ): items.append( '"' + self.tableWidget.item( rec, 0 ).text() + '",' + self.tableWidget.item( rec, 1 ).text() + "\n" ) if not items.isEmpty(): clipboard = QApplication.clipboard() clipboard.setText( items ) elif (self.pauseDisplay(e)): pass else: QWidget.keyPressEvent( self, e ) def changePage(self,state): if (state==Qt.Checked): self.plotSelector.setVisible( True ) self.cbxStats.setVisible( True ) self.graphControls.setVisible( True ) if (self.plotSelector.currentText()=='mpl'): self.stackedWidget.setCurrentIndex(2) else: self.stackedWidget.setCurrentIndex(1) else: self.plotSelector.setVisible( False ) self.cbxStats.setVisible( False ) self.graphControls.setVisible( False ) self.stackedWidget.setCurrentIndex(0) def changePlot(self): self.changePage(self.cbxActive.checkState()) def changeActive(self,state): if (state==Qt.Checked): #QObject.connect(self.legend, SIGNAL( "itemAdded ( QModelIndex )" ), self.statsNeedChecked ) #QObject.connect(self.legend, SIGNAL( "itemRemoved ()" ), self.invalidatePlot ) QObject.connect(self.canvas, SIGNAL( "layersChanged ()" ), self.invalidatePlot ) if int(QGis.QGIS_VERSION[2]) > 2: # for QGIS >= 1.3 QObject.connect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) else: QObject.connect(self.canvas, SIGNAL("xyCoordinates(QgsPoint &)"), self.printValue) else: QObject.disconnect(self.canvas, SIGNAL( "layersChanged ()" ), self.invalidatePlot ) if int(QGis.QGIS_VERSION[2]) > 2: # for QGIS >= 1.3 QObject.disconnect(self.canvas, SIGNAL("xyCoordinates(const QgsPoint &)"), self.printValue) else: QObject.disconnect(self.canvas, SIGNAL("xyCoordinates(QgsPoint &)"), self.printValue) def printValue(self,position): if self.canvas.layerCount() == 0: self.values=[] self.showValues() return needextremum = self.cbxGraph.isChecked() # if plot is checked # count the number of requires rows and remember the raster layers nrow=0 rasterlayers=[] layersWOStatistics=[] for i in range(self.canvas.layerCount()): layer = self.canvas.layer(i) if (layer!=None and layer.isValid() and layer.type()==QgsMapLayer.RasterLayer): if QGis.QGIS_VERSION_INT >= 10900: # for QGIS >= 1.9 if not layer.dataProvider(): continue if not layer.dataProvider().capabilities() & QgsRasterDataProvider.IdentifyValue: continue nrow+=layer.bandCount() rasterlayers.append(layer) else: # < 1.9 if layer.providerKey()=="wms": continue if layer.providerKey()=="grassraster": nrow+=1 rasterlayers.append(layer) else: # normal raster layer nrow+=layer.bandCount() rasterlayers.append(layer) # check statistics for each band if needextremum: for i in range( 1,layer.bandCount()+1 ): if int(QGis.QGIS_VERSION[2]) > 8: # for QGIS > 1.8 has_stats=layer.dataProvider().hasStatistics(i) else: has_stats=layer.hasStatistics(i) if not layer.id() in self.layerMap and not has_stats\ and not layer in layersWOStatistics: layersWOStatistics.append(layer) if layersWOStatistics and not self.statsChecked: self.calculateStatistics(layersWOStatistics) # create the row if necessary self.tableWidget.setRowCount(nrow) irow=0 self.values=[] self.ymin=1e38 self.ymax=-1e38 mapCanvasSrs = self.iface.mapCanvas().mapRenderer().destinationSrs() # TODO - calculate the min/max values only once, instead of every time!!! # keep them in a dict() with key=layer.id() for layer in rasterlayers: layername=unicode(layer.name()) layerSrs = layer.srs() pos = position # if given no position, get dummy values if position is None: pos = QgsPoint(0,0) # transform points if needed elif not mapCanvasSrs == layerSrs and self.iface.mapCanvas().hasCrsTransformEnabled(): srsTransform = QgsCoordinateTransform(mapCanvasSrs, layerSrs) try: pos = srsTransform.transform(position) except QgsCsException, err: # ignore transformation errors continue if QGis.QGIS_VERSION_INT >= 10900: # for QGIS >= 1.9 if not layer.dataProvider(): continue ident = None if position is not None: canvas = self.iface.mapCanvas() # we can only use context if layer is not projected if canvas.hasCrsTransformEnabled() and layer.dataProvider().crs() != canvas.mapRenderer().destinationCrs(): ident = layer.dataProvider().identify(pos, QgsRasterDataProvider.IdentifyFormatValue ) else: extent = canvas.extent() width = round(extent.width() / canvas.mapUnitsPerPixel()); height = round(extent.height() / canvas.mapUnitsPerPixel()); extent = canvas.mapRenderer().mapToLayerCoordinates( layer, extent ); ident = layer.dataProvider().identify(pos, QgsRasterDataProvider.IdentifyFormatValue, canvas.extent(), width, height ) if not len( ident ) > 0: continue # if given no position, set values to 0 if position is None: for key in ident.iterkeys(): ident[key] = layer.dataProvider().noDataValue(key) for iband in range(1,layer.bandCount()+1): # loop over the bands layernamewithband=layername if len(ident)>1: layernamewithband+=' '+layer.bandName(iband) if not ident or not ident.has_key( iband ): # should not happen bandvalue = "?" else: doubleValue = ident[iband].toDouble()[0] if layer.dataProvider().isNoDataValue ( iband, doubleValue ): bandvalue = "no data" else: bandvalue = QgsRasterBlock.printValue( doubleValue ) self.values.append((layernamewithband,bandvalue)) if needextremum: has_stats=layer.hasStatistics(i) if has_stats: cstr=layer.bandStatistics(iband) if has_stats: self.ymin=min(self.ymin,cstr.minimumValue) self.ymax=max(self.ymax,cstr.maximumValue) else: self.ymin=min(self.ymin,layer.minimumValue(i)) self.ymax=max(self.ymax,layer.maximumValue(i)) else: # QGIS < 1.9 isok,ident = layer.identify(pos) if not isok: continue # if given no position, set values to 0 if position is None: for key in ident.iterkeys(): ident[key] = 0 if layer.providerKey()=="grassraster": if not ident.has_key(QString("value")): continue cstr = ident[QString("value")] if cstr.isNull(): continue value = cstr.toDouble() if not value[1]: # if this is not a double, it is probably a (GRASS string like # 'out of extent' or 'null (no data)'. Let's just show that: self.values.append((layername, cstr)) continue self.values.append((layername,cstr)) if needextremum: self.ymin = min(self.ymin,value[0]) self.ymax = max(self.ymax,value[0]) else: for iband in range(1,layer.bandCount()+1): # loop over the bands bandvalue=ident[layer.bandName(iband)] layernamewithband=layername if len(ident)>1: layernamewithband+=' '+layer.bandName(iband) self.values.append((layernamewithband,bandvalue)) if needextremum: if int(QGis.QGIS_VERSION[2]) > 8: # for QGIS > 1.8 has_stats=layer.dataProvider().hasStatistics(i) if has_stats: cstr=layer.dataProvider().bandStatistics(iband) else: has_stats=layer.hasStatistics(i) if has_stats: cstr=layer.bandStatistics(iband) if has_stats: self.ymin=min(self.ymin,cstr.minimumValue) self.ymax=max(self.ymax,cstr.maximumValue) else: self.ymin=min(self.ymin,layer.minimumValue(i)) self.ymax=max(self.ymax,layer.maximumValue(i)) self.showValues()
class RTTView(QtGui.QWidget): def __init__(self, parent=None): super(RTTView, self).__init__(parent) uic.loadUi('RTTView.ui', self) self.initSetting() self.initQwtPlot() self.rcvbuff = b'' self.daplink = None self.tmrRTT = QtCore.QTimer() self.tmrRTT.setInterval(10) self.tmrRTT.timeout.connect(self.on_tmrRTT_timeout) self.tmrRTT.start() self.tmrRTT_Cnt = 0 def initSetting(self): if not os.path.exists('setting.ini'): open('setting.ini', 'w') self.conf = ConfigParser.ConfigParser() self.conf.read('setting.ini') if not self.conf.has_section('Memory'): self.conf.add_section('Memory') self.conf.set('Memory', 'StartAddr', '0x20000000') def initQwtPlot(self): self.PlotData = [0] * 1000 self.qwtPlot = QwtPlot(self) self.qwtPlot.setVisible(False) self.vLayout.insertWidget(0, self.qwtPlot) self.PlotCurve = QwtPlotCurve() self.PlotCurve.attach(self.qwtPlot) self.PlotCurve.setData(range(1, len(self.PlotData) + 1), self.PlotData) @QtCore.pyqtSlot() def on_btnOpen_clicked(self): if self.btnOpen.text() == u'打开连接': try: self.daplink = self.daplinks[self.cmbDAP.currentText()] self.daplink.open() dp = coresight.dap.DebugPort(self.daplink, None) dp.init() dp.power_up_debug() ap = coresight.ap.AHB_AP(dp, 0) ap.init() self.dap = coresight.cortex_m.CortexM(None, ap) Addr = int(self.conf.get('Memory', 'StartAddr'), 16) for i in range(256): buff = self.dap.read_memory_block8(Addr + 1024 * i, 1024) buff = ''.join([chr(x) for x in buff]) index = buff.find('SEGGER RTT') if index != -1: self.RTTAddr = Addr + 1024 * i + index buff = self.dap.read_memory_block8( self.RTTAddr, ctypes.sizeof(SEGGER_RTT_CB)) rtt_cb = SEGGER_RTT_CB.from_buffer(bytearray(buff)) self.aUpAddr = self.RTTAddr + 16 + 4 + 4 self.aDownAddr = self.aUpAddr + ctypes.sizeof( RingBuffer) * rtt_cb.MaxNumUpBuffers self.txtMain.append( '\n_SEGGER_RTT @ 0x%08X with %d aUp and %d aDown\n' % (self.RTTAddr, rtt_cb.MaxNumUpBuffers, rtt_cb.MaxNumDownBuffers)) break else: raise Exception('Can not find _SEGGER_RTT') except Exception as e: self.txtMain.append('\n%s\n' % str(e)) else: self.cmbDAP.setEnabled(False) self.btnOpen.setText(u'关闭连接') else: self.daplink.close() self.cmbDAP.setEnabled(True) self.btnOpen.setText(u'打开连接') def aUpRead(self): buf = self.dap.read_memory_block8(self.aUpAddr, ctypes.sizeof(RingBuffer)) aUp = RingBuffer.from_buffer(bytearray(buf)) if aUp.RdOff == aUp.WrOff: buf = [] elif aUp.RdOff < aUp.WrOff: cnt = aUp.WrOff - aUp.RdOff buf = self.dap.read_memory_block8( ctypes.cast(aUp.pBuffer, ctypes.c_void_p).value + aUp.RdOff, cnt) aUp.RdOff += cnt self.dap.write32(self.aUpAddr + 4 * 4, aUp.RdOff) else: cnt = aUp.SizeOfBuffer - aUp.RdOff buf = self.dap.read_memory_block8( ctypes.cast(aUp.pBuffer, ctypes.c_void_p).value + aUp.RdOff, cnt) aUp.RdOff = 0 #这样下次再读就会进入执行上个条件 self.dap.write32(self.aUpAddr + 4 * 4, aUp.RdOff) return ''.join([chr(x) for x in buf]) def on_tmrRTT_timeout(self): if self.btnOpen.text() == u'关闭连接': try: self.rcvbuff += self.aUpRead() if self.txtMain.isVisible(): if self.chkHEXShow.isChecked(): text = ''.join('%02X ' % ord(c) for c in self.rcvbuff) else: text = self.rcvbuff if len(self.txtMain.toPlainText()) > 25000: self.txtMain.clear() self.txtMain.moveCursor(QtGui.QTextCursor.End) self.txtMain.insertPlainText(text) self.rcvbuff = b'' else: if self.rcvbuff.rfind(',') == -1: return d = [ int(x) for x in self.rcvbuff[0:self.rcvbuff.rfind(',')].split(',') ] for x in d: self.PlotData.pop(0) self.PlotData.append(x) self.PlotCurve.setData(range(1, len(self.PlotData) + 1), self.PlotData) self.qwtPlot.replot() self.rcvbuff = self.rcvbuff[self.rcvbuff.rfind(',') + 1:] except Exception as e: self.rcvbuff = b'' self.txtMain.append('\n%s\n' % str(e)) else: self.tmrRTT_Cnt += 1 if self.tmrRTT_Cnt % 20 == 0: self.detect_daplink() # 自动检测 DAPLink 的热插拔 def aDownWrite(self, bytes): buf = self.dap.read_memory_block8(self.aDownAddr, ctypes.sizeof(RingBuffer)) aDown = RingBuffer.from_buffer(bytearray(buf)) if aDown.WrOff >= aDown.RdOff: if aDown.RdOff != 0: cnt = min(aDown.SizeOfBuffer - aDown.WrOff, len(bytes)) else: cnt = min( aDown.SizeOfBuffer - 1 - aDown.WrOff, len(bytes)) # 写入操作不能使得 aDown.WrOff == aDown.RdOff,以区分满和空 self.dap.write_memory_block8( ctypes.cast(aDown.pBuffer, ctypes.c_void_p).value + aDown.WrOff, [ord(x) for x in bytes[:cnt]]) aDown.WrOff += cnt if aDown.WrOff == aDown.SizeOfBuffer: aDown.WrOff = 0 bytes = bytes[cnt:] if bytes and aDown.RdOff != 0 and aDown.RdOff != 1: # != 0 确保 aDown.WrOff 折返回 0,!= 1 确保有空间可写入 cnt = min(aDown.RdOff - 1 - aDown.WrOff, len(bytes)) # - 1 确保写入操作不导致WrOff与RdOff指向同一位置 self.dap.write_memory_block8( ctypes.cast(aDown.pBuffer, ctypes.c_void_p).value + aDown.WrOff, [ord(x) for x in bytes[:cnt]]) aDown.WrOff += cnt self.dap.write32(self.aDownAddr + 4 * 3, aDown.WrOff) @QtCore.pyqtSlot() def on_btnSend_clicked(self): if self.btnOpen.text() == u'关闭连接': text = self.txtSend.toPlainText() try: if self.chkHEXSend.isChecked(): bytes = ''.join([chr(int(x, 16)) for x in text.split()]) else: bytes = text self.aDownWrite(bytes) except Exception as e: self.txtMain.append('\n%s\n' % str(e)) def detect_daplink(self): daplinks = aggregator.DebugProbeAggregator.get_all_connected_probes() if len(daplinks) != self.cmbDAP.count(): self.cmbDAP.clear() for daplink in daplinks: self.cmbDAP.addItem(daplink.product_name) self.daplinks = collections.OrderedDict([ (daplink.product_name, daplink) for daplink in daplinks ]) if self.daplink and self.daplink.product_name in self.daplinks: self.cmbDAP.setCurrentIndex(self.daplinks.keys().index( self.daplink.product_name)) else: # daplink被拔掉 self.btnOpen.setText(u'打开连接') @QtCore.pyqtSlot(int) def on_chkWavShow_stateChanged(self, state): self.qwtPlot.setVisible(state == QtCore.Qt.Checked) self.txtMain.setVisible(state == QtCore.Qt.Unchecked) @QtCore.pyqtSlot() def on_btnClear_clicked(self): self.txtMain.clear() def closeEvent(self, evt): self.conf.write(open('setting.ini', 'w'))