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 updateLegend(self, legend, enable=False): """ Framework hook to update plot legend with this curve. @param legend QwtLegend instance @param enable=False must be true to include this curve in legend @return None """ if self.isVisible() and enable: QwtPlotCurve.updateLegend(self, legend)
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)
def mkline(self, xdata, ydata, style=('black', '-'), title=''): line = QwtPlotCurve(title) if title is '': # don't display it in the legend # kind of ugly, that the title variable is doing double duty line.setItemAttribute(QwtPlotItem.Legend, False) pen = self.getPen(*style) line.setPen(pen) line.setRenderHint(QwtPlotItem.RenderAntialiased) line.setData(xdata, ydata) return line
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 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 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 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 mkline(self, xdata, ydata, style=('black','-'), title=''): line = QwtPlotCurve(title) if title is '': # don't display it in the legend # kind of ugly, that the title variable is doing double duty line.setItemAttribute(QwtPlotItem.Legend, False) pen = self.getPen(*style) line.setPen(pen) line.setRenderHint(QwtPlotItem.RenderAntialiased) line.setData(xdata, ydata) return line
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 __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 QwtPlotCurve.make( xdata, ydata * idx, style=style, symbol=symbol, linecolor=get_curve_color(), antialiased=True, plot=self, ) self.replot()
def __init__(self, parent=None): super(TestPlot, self).__init__(parent) self.setWindowTitle("PyQwt" if USE_PYQWT5 else "PythonQwt") self.enableAxis(self.xTop, True) self.enableAxis(self.yRight, True) y = np.linspace(0, 10, 500) curve1 = QwtPlotCurve('Test Curve 1') curve1.setData(np.sin(y), y) curve2 = QwtPlotCurve('Test Curve 2') curve2.setData(y**3, y) if USE_PYQWT5: curve2.setAxis(self.xTop, self.yRight) else: # PythonQwt curve2.setAxes(self.xTop, self.yRight) for item, col, xa, ya in ((curve1, Qt.green, self.xBottom, self.yLeft), (curve2, Qt.red, self.xTop, self.yRight)): if not USE_PYQWT5: # PythonQwt item.setOrientation(Qt.Vertical) item.attach(self) item.setPen(QPen(col)) for axis_id in xa, ya: palette = self.axisWidget(axis_id).palette() palette.setColor(QPalette.WindowText, QColor(col)) palette.setColor(QPalette.Text, QColor(col)) self.axisWidget(axis_id).setPalette(palette) ticks_font = self.axisFont(axis_id) self.setAxisFont(axis_id, ticks_font) self.canvas().setFrameStyle(0)#QFrame.Panel|QFrame.Sunken) self.plotLayout().setCanvasMargin(0) self.axisWidget(QwtPlot.yLeft).setMargin(0) self.axisWidget(QwtPlot.xTop).setMargin(0) self.axisWidget(QwtPlot.yRight).setMargin(0) self.axisWidget(QwtPlot.xBottom).setMargin(0) self.marker = QwtPlotMarker() self.marker.setValue(0, 5) self.marker.attach(self)
def draw(self, painter, xMap, yMap, rect): # When the array indices contains the indices of all valid data points, # a chunks of valid data is indexed by # indices[first], indices[first+1], .., indices[last]. # The first index of a chunk of valid data is calculated by: # 1. indices[i] - indices[i-1] > 1 # 2. indices[0] is always OK # The last index of a chunk of valid data is calculated by: # 1. index[i] - index[i+1] < -1 # 2. index[-1] is always OK indices = arange(self.data().size())[self.data().mask()] fs = array(indices) fs[1:] -= indices[:-1] fs[0] = 2 fs = indices[fs > 1] ls = array(indices) ls[:-1] -= indices[1:] ls[-1] = -2 ls = indices[ls < -1] for first, last in zip(fs, ls): QwtPlotCurve.drawFromTo(self, painter, xMap, yMap, first, last)
def __init__(self, parent=None): super(VerticalPlot, self).__init__(parent) self.setWindowTitle("PyQwt" if USE_PYQWT5 else "PythonQwt") self.enableAxis(self.xTop, True) self.enableAxis(self.yRight, True) y = np.linspace(0, 10, 500) curve1 = QwtPlotCurve.make(np.sin(y), y, title="Test Curve 1") curve2 = QwtPlotCurve.make(y**3, y, title="Test Curve 2") if USE_PYQWT5: # PyQwt curve2.setAxis(self.xTop, self.yRight) self.canvas().setFrameStyle(0) self.plotLayout().setCanvasMargin(0) self.axisWidget(QwtPlot.yLeft).setMargin(0) self.axisWidget(QwtPlot.xTop).setMargin(0) self.axisWidget(QwtPlot.yRight).setMargin(0) self.axisWidget(QwtPlot.xBottom).setMargin(0) else: # PythonQwt curve2.setAxes(self.xTop, self.yRight) for item, col, xa, ya in ( (curve1, Qt.green, self.xBottom, self.yLeft), (curve2, Qt.red, self.xTop, self.yRight), ): if not USE_PYQWT5: # PythonQwt item.setOrientation(Qt.Vertical) item.attach(self) item.setPen(QPen(col)) for axis_id in xa, ya: palette = self.axisWidget(axis_id).palette() palette.setColor(QPalette.WindowText, QColor(col)) palette.setColor(QPalette.Text, QColor(col)) self.axisWidget(axis_id).setPalette(palette) ticks_font = self.axisFont(axis_id) self.setAxisFont(axis_id, ticks_font) self.marker = QwtPlotMarker.make(0, 5, plot=self)
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()
def plot_curve(title=None, pen=None, brush=None, style=QwtPlotCurve.Lines, symbol=QwtSymbol.Ellipse, legend=True, antialias=True, auto_scale=True, xaxis=QwtPlot.xBottom, yaxis=QwtPlot.yLeft): curve = QwtPlotCurve(title or "") return configure_curve(curve, pen=pen, brush=brush, style=style, symbol=symbol, legend=legend, antialias=antialias, auto_scale=auto_scale, xaxis=xaxis, yaxis=yaxis)
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
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()
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()
class ImageController(QFrame): """An ImageController is a widget for controlling the display of one image. It can emit the following signals from the image: raise raise button was clicked center center-on-image option was selected unload unload option was selected slice image slice has changed, need to redraw (emitted by SkyImage automatically) repaint image display range or colormap has changed, need to redraw (emitted by SkyImage automatically) """ def __init__(self, image, parent, imgman, name=None, save=False): QFrame.__init__(self, parent) self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) # init state self.image = image self._imgman = imgman self._currier = PersistentCurrier() self._control_dialog = None # create widgets self._lo = lo = QHBoxLayout(self) lo.setContentsMargins(0, 0, 0, 0) lo.setSpacing(2) # raise button self._wraise = QToolButton(self) lo.addWidget(self._wraise) self._wraise.setIcon(pixmaps.raise_up.icon()) self._wraise.setAutoRaise(True) self._can_raise = False QObject.connect(self._wraise, SIGNAL("clicked()"), self._raiseButtonPressed) self._wraise.setToolTip("""<P>Click here to raise this image above other images. Hold the button down briefly to show a menu of image operations.</P>""") # center label self._wcenter = QLabel(self) self._wcenter.setPixmap(pixmaps.center_image.pm()) self._wcenter.setToolTip( "<P>The plot is currently centered on (the reference pixel %d,%d) of this image.</P>" % self.image.referencePixel()) lo.addWidget(self._wcenter) # name/filename label self.name = image.name self._wlabel = QLabel(self.name, self) self._number = 0 self.setName(self.name) self._wlabel.setToolTip("%s %s" % (image.filename, "\u00D7".join(map(str, image.data().shape)))) lo.addWidget(self._wlabel, 1) # if 'save' is specified, create a "save" button if save: self._wsave = QToolButton(self) lo.addWidget(self._wsave) self._wsave.setText("save") self._wsave.setAutoRaise(True) self._save_dir = save if isinstance(save, str) else "." QObject.connect(self._wsave, SIGNAL("clicked()"), self._saveImage) self._wsave.setToolTip("""<P>Click here to write this image to a FITS file.</P>""") # render control dprint(2, "creating RenderControl") self._rc = RenderControl(image, self) dprint(2, "done") # selectors for extra axes self._wslicers = [] curslice = self._rc.currentSlice(); # this may be loaded from config, so not necessarily 0 for iextra, axisname, labels in self._rc.slicedAxes(): if axisname.upper() not in ["STOKES", "COMPLEX"]: lbl = QLabel("%s:" % axisname, self) lo.addWidget(lbl) else: lbl = None slicer = QComboBox(self) self._wslicers.append(slicer) lo.addWidget(slicer) slicer.addItems(labels) slicer.setToolTip("""<P>Selects current slice along the %s axis.</P>""" % axisname) slicer.setCurrentIndex(curslice[iextra]) QObject.connect(slicer, SIGNAL("activated(int)"), self._currier.curry(self._rc.changeSlice, iextra)) # min/max display ranges lo.addSpacing(5) self._wrangelbl = QLabel(self) lo.addWidget(self._wrangelbl) self._minmaxvalidator = FloatValidator(self) self._wmin = QLineEdit(self) self._wmax = QLineEdit(self) width = self._wmin.fontMetrics().width("1.234567e-05") for w in self._wmin, self._wmax: lo.addWidget(w, 0) w.setValidator(self._minmaxvalidator) w.setMaximumWidth(width) w.setMinimumWidth(width) QObject.connect(w, SIGNAL("editingFinished()"), self._changeDisplayRange) # full-range button self._wfullrange = QToolButton(self) lo.addWidget(self._wfullrange, 0) self._wfullrange.setIcon(pixmaps.zoom_range.icon()) self._wfullrange.setAutoRaise(True) QObject.connect(self._wfullrange, SIGNAL("clicked()"), self.renderControl().resetSubsetDisplayRange) rangemenu = QMenu(self) rangemenu.addAction(pixmaps.full_range.icon(), "Full subset", self.renderControl().resetSubsetDisplayRange) for percent in (99.99, 99.9, 99.5, 99, 98, 95): rangemenu.addAction("%g%%" % percent, self._currier.curry(self._changeDisplayRangeToPercent, percent)) self._wfullrange.setPopupMode(QToolButton.DelayedPopup) self._wfullrange.setMenu(rangemenu) # update widgets from current display range self._updateDisplayRange(*self._rc.displayRange()) # lock button self._wlock = QToolButton(self) self._wlock.setIcon(pixmaps.unlocked.icon()) self._wlock.setAutoRaise(True) self._wlock.setToolTip("""<P>Click to lock or unlock the intensity range. When the intensity range is locked across multiple images, any changes in the intensity range of one are propagated to the others. Hold the button down briefly for additional options.</P>""") lo.addWidget(self._wlock) QObject.connect(self._wlock, SIGNAL("clicked()"), self._toggleDisplayRangeLock) QObject.connect(self.renderControl(), SIGNAL("displayRangeLocked"), self._setDisplayRangeLock) QObject.connect(self.renderControl(), SIGNAL("dataSubsetChanged"), self._dataSubsetChanged) lockmenu = QMenu(self) lockmenu.addAction(pixmaps.locked.icon(), "Lock all to this", self._currier.curry(imgman.lockAllDisplayRanges, self.renderControl())) lockmenu.addAction(pixmaps.unlocked.icon(), "Unlock all", imgman.unlockAllDisplayRanges) self._wlock.setPopupMode(QToolButton.DelayedPopup) self._wlock.setMenu(lockmenu) self._setDisplayRangeLock(self.renderControl().isDisplayRangeLocked()) # dialog button self._wshowdialog = QToolButton(self) lo.addWidget(self._wshowdialog) self._wshowdialog.setIcon(pixmaps.colours.icon()) self._wshowdialog.setAutoRaise(True) self._wshowdialog.setToolTip("""<P>Click for colourmap and intensity policy options.</P>""") QObject.connect(self._wshowdialog, SIGNAL("clicked()"), self.showRenderControls) tooltip = """<P>You can change the currently displayed intensity range by entering low and high limits here.</P> <TABLE> <TR><TD><NOBR>Image min:</NOBR></TD><TD>%g</TD><TD>max:</TD><TD>%g</TD></TR> </TABLE>""" % self.image.imageMinMax() for w in self._wmin, self._wmax, self._wrangelbl: w.setToolTip(tooltip) # create image operations menu self._menu = QMenu(self.name, self) self._qa_raise = self._menu.addAction(pixmaps.raise_up.icon(), "Raise image", self._currier.curry(self.image.emit, SIGNAL("raise"))) self._qa_center = self._menu.addAction(pixmaps.center_image.icon(), "Center plot on image", self._currier.curry(self.image.emit, SIGNAL("center"))) self._qa_show_rc = self._menu.addAction(pixmaps.colours.icon(), "Colours && Intensities...", self.showRenderControls) if save: self._qa_save = self._menu.addAction("Save image...", self._saveImage) self._menu.addAction("Export image to PNG file...", self._exportImageToPNG) self._export_png_dialog = None self._menu.addAction("Unload image", self._currier.curry(self.image.emit, SIGNAL("unload"))) self._wraise.setMenu(self._menu) self._wraise.setPopupMode(QToolButton.DelayedPopup) # connect updates from renderControl and image self.image.connect(SIGNAL("slice"), self._updateImageSlice) QObject.connect(self._rc, SIGNAL("displayRangeChanged"), self._updateDisplayRange) # default plot depth of image markers self._z_markers = None # and the markers themselves self._image_border = QwtPlotCurve() self._image_label = QwtPlotMarker() # subset markers self._subset_pen = QPen(QColor("Light Blue")) self._subset_border = QwtPlotCurve() self._subset_border.setPen(self._subset_pen) self._subset_border.setVisible(False) self._subset_label = QwtPlotMarker() text = QwtText("subset") text.setColor(self._subset_pen.color()) self._subset_label.setLabel(text) self._subset_label.setLabelAlignment(Qt.AlignRight | Qt.AlignBottom) self._subset_label.setVisible(False) self._setting_lmrect = False self._all_markers = [self._image_border, self._image_label, self._subset_border, self._subset_label] def close(self): if self._control_dialog: self._control_dialog.close() self._control_dialog = None def __del__(self): self.close() def __eq__(self, other): return self is other def renderControl(self): return self._rc def getMenu(self): return self._menu def getFilename(self): return self.image.filename def setName(self, name): self.name = name self._wlabel.setText("%s: %s" % (chr(ord('a') + self._number), self.name)) def setNumber(self, num): self._number = num self._menu.menuAction().setText("%s: %s" % (chr(ord('a') + self._number), self.name)) self._qa_raise.setShortcut(QKeySequence("Alt+" + chr(ord('A') + num))) self.setName(self.name) def getNumber(self): return self._number def setPlotProjection(self, proj): self.image.setPlotProjection(proj) sameproj = proj == self.image.projection self._wcenter.setVisible(sameproj) self._qa_center.setVisible(not sameproj) if self._image_border: (l0, l1), (m0, m1) = self.image.getExtents() path = numpy.array([l0, l0, l1, l1, l0]), numpy.array([m0, m1, m1, m0, m0]) self._image_border.setData(*path) if self._image_label: self._image_label.setValue(path[0][2], path[1][2]) def addPlotBorder(self, border_pen, label, label_color=None, bg_brush=None): # make plot items for image frame # make curve for image borders (l0, l1), (m0, m1) = self.image.getExtents() self._border_pen = QPen(border_pen) self._image_border.show() self._image_border.setData([l0, l0, l1, l1, l0], [m0, m1, m1, m0, m0]) self._image_border.setPen(self._border_pen) self._image_border.setZ(self.image.z() + 1 if self._z_markers is None else self._z_markers) if label: self._image_label.show() self._image_label_text = text = QwtText(" %s " % label) text.setColor(label_color) text.setBackgroundBrush(bg_brush) self._image_label.setValue(l1, m1) self._image_label.setLabel(text) self._image_label.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter) self._image_label.setZ(self.image.z() + 2 if self._z_markers is None else self._z_markers) def setPlotBorderStyle(self, border_color=None, label_color=None): if border_color: self._border_pen.setColor(border_color) self._image_border.setPen(self._border_pen) if label_color: self._image_label_text.setColor(label_color) self._image_label.setLabel(self._image_label_text) def showPlotBorder(self, show=True): self._image_border.setVisible(show) self._image_label.setVisible(show) def attachToPlot(self, plot, z_markers=None): for item in [self.image] + self._all_markers: if item.plot() != plot: item.attach(plot) def setImageVisible(self, visible): self.image.setVisible(visible) def showRenderControls(self): if not self._control_dialog: dprint(1, "creating control dialog") self._control_dialog = ImageControlDialog(self, self._rc, self._imgman) dprint(1, "done") if not self._control_dialog.isVisible(): dprint(1, "showing control dialog") self._control_dialog.show() else: self._control_dialog.hide() def _changeDisplayRangeToPercent(self, percent): if not self._control_dialog: self._control_dialog = ImageControlDialog(self, self._rc, self._imgman) self._control_dialog._changeDisplayRangeToPercent(percent) def _updateDisplayRange(self, dmin, dmax): """Updates display range widgets.""" self._wmin.setText("%.4g" % dmin) self._wmax.setText("%.4g" % dmax) self._updateFullRangeIcon() def _changeDisplayRange(self): """Gets display range from widgets and updates the image with it.""" try: newrange = float(str(self._wmin.text())), float(str(self._wmax.text())) except ValueError: return self._rc.setDisplayRange(*newrange) def _dataSubsetChanged(self, subset, minmax, desc, subset_type): """Called when the data subset changes (or is reset)""" # hide the subset indicator -- unless we're invoked while we're actually setting the subset itself if not self._setting_lmrect: self._subset = None self._subset_border.setVisible(False) self._subset_label.setVisible(False) def setLMRectSubset(self, rect): self._subset = rect l0, m0, l1, m1 = rect.getCoords() self._subset_border.setData([l0, l0, l1, l1, l0], [m0, m1, m1, m0, m0]) self._subset_border.setVisible(True) self._subset_label.setValue(max(l0, l1), max(m0, m1)) self._subset_label.setVisible(True) self._setting_lmrect = True self.renderControl().setLMRectSubset(rect) self._setting_lmrect = False def currentSlice(self): return self._rc.currentSlice() def _updateImageSlice(self, slice): dprint(2, slice) for i, (iextra, name, labels) in enumerate(self._rc.slicedAxes()): slicer = self._wslicers[i] if slicer.currentIndex() != slice[iextra]: dprint(3, "setting widget", i, "to", slice[iextra]) slicer.setCurrentIndex(slice[iextra]) def setMarkersZ(self, z): self._z_markers = z for i, elem in enumerate(self._all_markers): elem.setZ(z + i) def setZ(self, z, top=False, depthlabel=None, can_raise=True): self.image.setZ(z) if self._z_markers is None: for i, elem in enumerate(self._all_markers): elem.setZ(z + i + i) # set the depth label, if any label = "%s: %s" % (chr(ord('a') + self._number), self.name) # label = "%s %s"%(depthlabel,self.name) if depthlabel else self.name if top: label = "%s: <B>%s</B>" % (chr(ord('a') + self._number), self.name) self._wlabel.setText(label) # set hotkey self._qa_show_rc.setShortcut(Qt.Key_F9 if top else QKeySequence()) # set raise control self._can_raise = can_raise self._qa_raise.setVisible(can_raise) self._wlock.setVisible(can_raise) if can_raise: self._wraise.setToolTip( "<P>Click here to raise this image to the top. Click on the down-arrow to access the image menu.</P>") else: self._wraise.setToolTip("<P>Click to access the image menu.</P>") def _raiseButtonPressed(self): if self._can_raise: self.image.emit(SIGNAL("raise")) else: self._wraise.showMenu() def _saveImage(self): filename = QFileDialog.getSaveFileName(self, "Save FITS file", self._save_dir, "FITS files(*.fits *.FITS *fts *FTS)") filename = str(filename) if not filename: return busy = BusyIndicator() self._imgman.showMessage("""Writing FITS image %s""" % filename, 3000) QApplication.flush() try: self.image.save(filename) except Exception as exc: busy = None traceback.print_exc() self._imgman.showErrorMessage("""Error writing FITS image %s: %s""" % (filename, str(sys.exc_info()[1]))) return None self.renderControl().startSavingConfig(filename) self.setName(self.image.name) self._qa_save.setVisible(False) self._wsave.hide() busy = None def _exportImageToPNG(self, filename=None): if not filename: if not self._export_png_dialog: dialog = self._export_png_dialog = QFileDialog(self, "Export image to PNG", ".", "*.png") dialog.setDefaultSuffix("png") dialog.setFileMode(QFileDialog.AnyFile) dialog.setAcceptMode(QFileDialog.AcceptSave) dialog.setModal(True) QObject.connect(dialog, SIGNAL("filesSelected(const QStringList &)"), self._exportImageToPNG) return self._export_png_dialog.exec_() == QDialog.Accepted busy = BusyIndicator() if isinstance(filename, QStringList): filename = filename[0] filename = str(filename) # make QPixmap nx, ny = self.image.imageDims() (l0, l1), (m0, m1) = self.image.getExtents() pixmap = QPixmap(nx, ny) painter = QPainter(pixmap) # use QwtPlot implementation of draw canvas, since we want to avoid caching xmap = QwtScaleMap() xmap.setPaintInterval(0, nx) xmap.setScaleInterval(l1, l0) ymap = QwtScaleMap() ymap.setPaintInterval(ny, 0) ymap.setScaleInterval(m0, m1) self.image.draw(painter, xmap, ymap, pixmap.rect()) painter.end() # save to file try: pixmap.save(filename, "PNG") except Exception as exc: self.emit(SIGNAL("showErrorMessage"), "Error writing %s: %s" % (filename, str(exc))) return self.emit(SIGNAL("showMessage"), "Exported image to file %s" % filename) def _toggleDisplayRangeLock(self): self.renderControl().lockDisplayRange(not self.renderControl().isDisplayRangeLocked()) def _setDisplayRangeLock(self, locked): self._wlock.setIcon(pixmaps.locked.icon() if locked else pixmaps.unlocked.icon()) def _updateFullRangeIcon(self): if self._rc.isSubsetDisplayRange(): self._wfullrange.setIcon(pixmaps.zoom_range.icon()) self._wfullrange.setToolTip( """<P>The current intensity range is the full range. Hold this button down briefly for additional options.</P>""") else: self._wfullrange.setIcon(pixmaps.full_range.icon()) self._wfullrange.setToolTip( """<P>Click to reset to a full intensity range. Hold the button down briefly for additional options.</P>""")
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()
def __init__(self, image, parent, imgman, name=None, save=False): QFrame.__init__(self, parent) self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised) # init state self.image = image self._imgman = imgman self._currier = PersistentCurrier() self._control_dialog = None # create widgets self._lo = lo = QHBoxLayout(self) lo.setContentsMargins(0, 0, 0, 0) lo.setSpacing(2) # raise button self._wraise = QToolButton(self) lo.addWidget(self._wraise) self._wraise.setIcon(pixmaps.raise_up.icon()) self._wraise.setAutoRaise(True) self._can_raise = False QObject.connect(self._wraise, SIGNAL("clicked()"), self._raiseButtonPressed) self._wraise.setToolTip("""<P>Click here to raise this image above other images. Hold the button down briefly to show a menu of image operations.</P>""") # center label self._wcenter = QLabel(self) self._wcenter.setPixmap(pixmaps.center_image.pm()) self._wcenter.setToolTip( "<P>The plot is currently centered on (the reference pixel %d,%d) of this image.</P>" % self.image.referencePixel()) lo.addWidget(self._wcenter) # name/filename label self.name = image.name self._wlabel = QLabel(self.name, self) self._number = 0 self.setName(self.name) self._wlabel.setToolTip("%s %s" % (image.filename, "\u00D7".join(map(str, image.data().shape)))) lo.addWidget(self._wlabel, 1) # if 'save' is specified, create a "save" button if save: self._wsave = QToolButton(self) lo.addWidget(self._wsave) self._wsave.setText("save") self._wsave.setAutoRaise(True) self._save_dir = save if isinstance(save, str) else "." QObject.connect(self._wsave, SIGNAL("clicked()"), self._saveImage) self._wsave.setToolTip("""<P>Click here to write this image to a FITS file.</P>""") # render control dprint(2, "creating RenderControl") self._rc = RenderControl(image, self) dprint(2, "done") # selectors for extra axes self._wslicers = [] curslice = self._rc.currentSlice(); # this may be loaded from config, so not necessarily 0 for iextra, axisname, labels in self._rc.slicedAxes(): if axisname.upper() not in ["STOKES", "COMPLEX"]: lbl = QLabel("%s:" % axisname, self) lo.addWidget(lbl) else: lbl = None slicer = QComboBox(self) self._wslicers.append(slicer) lo.addWidget(slicer) slicer.addItems(labels) slicer.setToolTip("""<P>Selects current slice along the %s axis.</P>""" % axisname) slicer.setCurrentIndex(curslice[iextra]) QObject.connect(slicer, SIGNAL("activated(int)"), self._currier.curry(self._rc.changeSlice, iextra)) # min/max display ranges lo.addSpacing(5) self._wrangelbl = QLabel(self) lo.addWidget(self._wrangelbl) self._minmaxvalidator = FloatValidator(self) self._wmin = QLineEdit(self) self._wmax = QLineEdit(self) width = self._wmin.fontMetrics().width("1.234567e-05") for w in self._wmin, self._wmax: lo.addWidget(w, 0) w.setValidator(self._minmaxvalidator) w.setMaximumWidth(width) w.setMinimumWidth(width) QObject.connect(w, SIGNAL("editingFinished()"), self._changeDisplayRange) # full-range button self._wfullrange = QToolButton(self) lo.addWidget(self._wfullrange, 0) self._wfullrange.setIcon(pixmaps.zoom_range.icon()) self._wfullrange.setAutoRaise(True) QObject.connect(self._wfullrange, SIGNAL("clicked()"), self.renderControl().resetSubsetDisplayRange) rangemenu = QMenu(self) rangemenu.addAction(pixmaps.full_range.icon(), "Full subset", self.renderControl().resetSubsetDisplayRange) for percent in (99.99, 99.9, 99.5, 99, 98, 95): rangemenu.addAction("%g%%" % percent, self._currier.curry(self._changeDisplayRangeToPercent, percent)) self._wfullrange.setPopupMode(QToolButton.DelayedPopup) self._wfullrange.setMenu(rangemenu) # update widgets from current display range self._updateDisplayRange(*self._rc.displayRange()) # lock button self._wlock = QToolButton(self) self._wlock.setIcon(pixmaps.unlocked.icon()) self._wlock.setAutoRaise(True) self._wlock.setToolTip("""<P>Click to lock or unlock the intensity range. When the intensity range is locked across multiple images, any changes in the intensity range of one are propagated to the others. Hold the button down briefly for additional options.</P>""") lo.addWidget(self._wlock) QObject.connect(self._wlock, SIGNAL("clicked()"), self._toggleDisplayRangeLock) QObject.connect(self.renderControl(), SIGNAL("displayRangeLocked"), self._setDisplayRangeLock) QObject.connect(self.renderControl(), SIGNAL("dataSubsetChanged"), self._dataSubsetChanged) lockmenu = QMenu(self) lockmenu.addAction(pixmaps.locked.icon(), "Lock all to this", self._currier.curry(imgman.lockAllDisplayRanges, self.renderControl())) lockmenu.addAction(pixmaps.unlocked.icon(), "Unlock all", imgman.unlockAllDisplayRanges) self._wlock.setPopupMode(QToolButton.DelayedPopup) self._wlock.setMenu(lockmenu) self._setDisplayRangeLock(self.renderControl().isDisplayRangeLocked()) # dialog button self._wshowdialog = QToolButton(self) lo.addWidget(self._wshowdialog) self._wshowdialog.setIcon(pixmaps.colours.icon()) self._wshowdialog.setAutoRaise(True) self._wshowdialog.setToolTip("""<P>Click for colourmap and intensity policy options.</P>""") QObject.connect(self._wshowdialog, SIGNAL("clicked()"), self.showRenderControls) tooltip = """<P>You can change the currently displayed intensity range by entering low and high limits here.</P> <TABLE> <TR><TD><NOBR>Image min:</NOBR></TD><TD>%g</TD><TD>max:</TD><TD>%g</TD></TR> </TABLE>""" % self.image.imageMinMax() for w in self._wmin, self._wmax, self._wrangelbl: w.setToolTip(tooltip) # create image operations menu self._menu = QMenu(self.name, self) self._qa_raise = self._menu.addAction(pixmaps.raise_up.icon(), "Raise image", self._currier.curry(self.image.emit, SIGNAL("raise"))) self._qa_center = self._menu.addAction(pixmaps.center_image.icon(), "Center plot on image", self._currier.curry(self.image.emit, SIGNAL("center"))) self._qa_show_rc = self._menu.addAction(pixmaps.colours.icon(), "Colours && Intensities...", self.showRenderControls) if save: self._qa_save = self._menu.addAction("Save image...", self._saveImage) self._menu.addAction("Export image to PNG file...", self._exportImageToPNG) self._export_png_dialog = None self._menu.addAction("Unload image", self._currier.curry(self.image.emit, SIGNAL("unload"))) self._wraise.setMenu(self._menu) self._wraise.setPopupMode(QToolButton.DelayedPopup) # connect updates from renderControl and image self.image.connect(SIGNAL("slice"), self._updateImageSlice) QObject.connect(self._rc, SIGNAL("displayRangeChanged"), self._updateDisplayRange) # default plot depth of image markers self._z_markers = None # and the markers themselves self._image_border = QwtPlotCurve() self._image_label = QwtPlotMarker() # subset markers self._subset_pen = QPen(QColor("Light Blue")) self._subset_border = QwtPlotCurve() self._subset_border.setPen(self._subset_pen) self._subset_border.setVisible(False) self._subset_label = QwtPlotMarker() text = QwtText("subset") text.setColor(self._subset_pen.color()) self._subset_label.setLabel(text) self._subset_label.setLabelAlignment(Qt.AlignRight | Qt.AlignBottom) self._subset_label.setVisible(False) self._setting_lmrect = False self._all_markers = [self._image_border, self._image_label, self._subset_border, self._subset_label]
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)
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 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()
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()
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 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)
print 'You must specify the date as a parameter' 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()
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()
def setData(self, x, y): return QwtPlotCurve.setData(self, list(map(float, x)), list(map(float, y)))
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 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 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 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 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 setData(self, x, y): QwtPlotCurve.setData(self, MaskedData(x, y))
def __init__(self, name=''): QwtPlotCurve.__init__(self, name)
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 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()
if len(sys.argv) < 2: print 'You must specify the date as a parameter' 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()
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()
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 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)