def __update_grid(self, level=None): self.gridLog.ClearGrid() fontCell = self.gridLog.GetDefaultCellFont() fontSize = fontCell.GetPointSize() fontStyle = fontCell.GetStyle() fontWeight = fontCell.GetWeight() font = wx.Font(fontSize, wx.FONTFAMILY_MODERN, fontStyle, fontWeight) i = 0 for event in self.log.get(level): self.gridLog.SetCellValue(i, 0, format_time(event[0], True)) self.gridLog.SetCellValue(i, 1, self.log.TEXT_LEVEL[event[1]]) eventText = '\n'.join(textwrap.wrap(event[2], width=70)) self.gridLog.SetCellValue(i, 2, eventText) self.gridLog.SetCellFont(i, 0, font) self.gridLog.SetCellFont(i, 1, font) self.gridLog.SetCellFont(i, 2, font) self.gridLog.SetCellAlignment(i, 0, wx.ALIGN_LEFT, wx.ALIGN_CENTRE) self.gridLog.SetCellAlignment(i, 1, wx.ALIGN_LEFT, wx.ALIGN_CENTRE) i += 1 self.gridLog.AppendRows() self.gridLog.SetCellValue(i, 0, '#' * 18) self.gridLog.SetCellValue(i, 1, '#' * 5) self.gridLog.SetCellValue(i, 2, '#' * 80) self.gridLog.AutoSize() self.gridLog.DeleteRows(i) size = self.gridLog.GetBestSize() size.width += wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X) + 10 size.height = 400 self.sizer.Layout() self.SetClientSize(size)
def __plot_peak(self, peakF, peakL, peakT): when = format_time(peakT) tPos = utc_to_mpl(peakT) text = '{}\n{}\n{when}'.format(*format_precision(self.settings, peakF, peakL, fancyUnits=True), when=when) if matplotlib.__version__ < '1.3': self.axes.text(peakF, tPos, peakL, text, ha='left', va='bottom', size='x-small', gid='peakText') self.axes.plot([peakF], [tPos], [peakL], marker='x', markersize=10, mew=3, color='w', gid='peak') self.axes.plot([peakF], [tPos], [peakL], marker='x', markersize=10, color='r', gid='peakShadow') else: effect = patheffects.withStroke(linewidth=2, foreground="w", alpha=0.75) self.axes.text(peakF, tPos, peakL, text, ha='left', va='bottom', size='x-small', gid='peakText', path_effects=[effect]) self.axes.plot([peakF], [tPos], [peakL], marker='x', markersize=10, color='r', gid='peak', path_effects=[effect])
def __plot_peak(self, peakF, peakL, peakT): self.__clear_markers() y = utc_to_mpl(peakT) start, stop = self.axes.get_xlim() textX = ((stop - start) / 50.0) + peakF when = format_time(peakT) text = '{}\n{}\n{when}'.format(*format_precision(self.settings, peakF, peakL, fancyUnits=True), when=when) if matplotlib.__version__ < '1.3': self.axes.annotate(text, xy=(peakF, y), xytext=(textX, y), ha='left', va='bottom', size='x-small', color='w', gid='peakText') self.axes.plot(peakF, y, marker='x', markersize=10, color='w', mew=3, gid='peakShadow') self.axes.plot(peakF, y, marker='x', markersize=10, color='r', gid='peak') else: effect = patheffects.withStroke(linewidth=2, foreground="w", alpha=0.75) self.axes.annotate(text, xy=(peakF, y), xytext=(textX, y), ha='left', va='bottom', size='x-small', path_effects=[effect], gid='peakText') self.axes.plot(peakF, y, marker='x', markersize=10, color='r', path_effects=[effect], gid='peak')
def __create_last(self): loc = self.server.currentLoc if loc[0] is None: return '' last = ('\t\t<Placemark>\n' '\t\t\t<name>Last Location</name>\n' '\t\t\t<description>{}</description>\n' '\t\t\t<styleUrl>#last</styleUrl>\n' '\t\t\t<altitudeMode>clampToGround</altitudeMode>\n' '\t\t\t<Point>\n').format(format_time(loc[3])) if loc[2] is None: last += '\t\t\t\t<coordinates>{},{}</coordinates>\n'.\ format(loc[1], loc[0]) else: last += '\t\t\t\t<coordinates>{},{},{}</coordinates>\n'.\ format(loc[1], loc[0], loc[2]) last += ('\t\t\t</Point>\n' '\t\t</Placemark>\n') return last
def __init__(self, parent, scanInfo): wx.Dialog.__init__(self, parent, title="Scan Properties") self.scanInfo = scanInfo box = wx.BoxSizer(wx.VERTICAL) m_grid = wx.GridBagSizer(0, 0) boxScan = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, "Scan"), wx.HORIZONTAL) gridScan = wx.GridBagSizer(0, 0) textDesc = wx.StaticText(self, label="Description") gridScan.Add(textDesc, (0, 0), (1, 1), wx.ALL, 5) self.textCtrlDesc = wx.TextCtrl(self, value=scanInfo.desc, style=wx.TE_MULTILINE) gridScan.Add(self.textCtrlDesc, (0, 1), (2, 2), wx.ALL | wx.EXPAND, 5) textStart = wx.StaticText(self, label="Start") gridScan.Add(textStart, (2, 0), (1, 1), wx.ALL, 5) textCtrlStart = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.start is not None: textCtrlStart.SetValue(str(scanInfo.start)) gridScan.Add(textCtrlStart, (2, 1), (1, 1), wx.ALL, 5) textMHz1 = wx.StaticText(self, wx.ID_ANY, label="MHz") gridScan.Add(textMHz1, (2, 2), (1, 1), wx.ALL, 5) textStop = wx.StaticText(self, label="Stop") gridScan.Add(textStop, (3, 0), (1, 1), wx.ALL, 5) textCtrlStop = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.stop is not None: textCtrlStop.SetValue(str(scanInfo.stop)) gridScan.Add(textCtrlStop, (3, 1), (1, 1), wx.ALL, 5) textMHz2 = wx.StaticText(self, label="MHz") gridScan.Add(textMHz2, (3, 2), (1, 1), wx.ALL, 5) textDwell = wx.StaticText(self, label="Dwell") gridScan.Add(textDwell, (4, 0), (1, 1), wx.ALL, 5) textCtrlDwell = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.dwell is not None: textCtrlDwell.SetValue(str(scanInfo.dwell)) gridScan.Add(textCtrlDwell, (4, 1), (1, 1), wx.ALL, 5) textSeconds = wx.StaticText(self, label="seconds") gridScan.Add(textSeconds, (4, 2), (1, 1), wx.ALL, 5) textNfft = wx.StaticText(self, label="FFT Size") gridScan.Add(textNfft, (5, 0), (1, 1), wx.ALL, 5) textCtrlNfft = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.nfft is not None: textCtrlNfft.SetValue(str(scanInfo.nfft)) gridScan.Add(textCtrlNfft, (5, 1), (1, 1), wx.ALL, 5) textRbw = wx.StaticText(self, label="RBW") gridScan.Add(textRbw, (6, 0), (1, 1), wx.ALL, 5) rbw = ((SAMPLE_RATE / scanInfo.nfft) / 1000.0) * 2.0 textCtrlStop = wx.TextCtrl(self, value="{0:.3f}".format(rbw), style=wx.TE_READONLY) gridScan.Add(textCtrlStop, (6, 1), (1, 1), wx.ALL, 5) textKHz = wx.StaticText(self, label="kHz") gridScan.Add(textKHz, (6, 2), (1, 1), wx.ALL, 5) textTime = wx.StaticText(self, label="First scan") gridScan.Add(textTime, (7, 0), (1, 1), wx.ALL, 5) textCtrlTime = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.timeFirst is not None: textCtrlTime.SetValue(format_time(scanInfo.timeFirst, True)) gridScan.Add(textCtrlTime, (7, 1), (1, 1), wx.ALL, 5) textTime = wx.StaticText(self, label="Last scan") gridScan.Add(textTime, (8, 0), (1, 1), wx.ALL, 5) textCtrlTime = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.timeLast is not None: textCtrlTime.SetValue(format_time(scanInfo.timeLast, True)) gridScan.Add(textCtrlTime, (8, 1), (1, 1), wx.ALL, 5) textLat = wx.StaticText(self, label="Latitude") gridScan.Add(textLat, (9, 0), (1, 1), wx.ALL, 5) self.textCtrlLat = wx.TextCtrl(self, value="Unknown") self.textCtrlLat.SetValidator(ValidatorCoord(True)) if scanInfo.lat is not None: self.textCtrlLat.SetValue(str(scanInfo.lat)) gridScan.Add(self.textCtrlLat, (9, 1), (1, 1), wx.ALL, 5) textLon = wx.StaticText(self, label="Longitude") gridScan.Add(textLon, (10, 0), (1, 1), wx.ALL, 5) self.textCtrlLon = wx.TextCtrl(self, value="Unknown") self.textCtrlLon.SetValidator(ValidatorCoord(False)) if scanInfo.lon is not None: self.textCtrlLon.SetValue(str(scanInfo.lon)) gridScan.Add(self.textCtrlLon, (10, 1), (1, 1), wx.ALL, 5) boxScan.Add(gridScan, 0, 0, 5) m_grid.Add(boxScan, (0, 0), (1, 1), wx.ALL | wx.EXPAND, 5) boxDevice = wx.StaticBoxSizer(wx.StaticBox(self, label="Device"), wx.VERTICAL) gridDevice = wx.GridBagSizer(0, 0) textName = wx.StaticText(self, label="Name") gridDevice.Add(textName, (0, 0), (1, 1), wx.ALL, 5) textCtrlName = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.name is not None: textCtrlName.SetValue(scanInfo.name) gridDevice.Add(textCtrlName, (0, 1), (1, 2), wx.ALL | wx.EXPAND, 5) textTuner = wx.StaticText(self, label="Tuner") gridDevice.Add(textTuner, (1, 0), (1, 1), wx.ALL, 5) textCtrlTuner = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.tuner != -1: textCtrlTuner.SetValue(TUNER[scanInfo.tuner]) gridDevice.Add(textCtrlTuner, (1, 1), (1, 2), wx.ALL | wx.EXPAND, 5) testGain = wx.StaticText(self, label="Gain") gridDevice.Add(testGain, (2, 0), (1, 1), wx.ALL, 5) textCtrlGain = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.gain is not None: textCtrlGain.SetValue(str(scanInfo.gain)) gridDevice.Add(textCtrlGain, (2, 1), (1, 1), wx.ALL, 5) textDb = wx.StaticText(self, label="dB") gridDevice.Add(textDb, (2, 2), (1, 1), wx.ALL, 5) textLo = wx.StaticText(self, label="LO") gridDevice.Add(textLo, (3, 0), (1, 1), wx.ALL, 5) textCtrlLo = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.lo is not None: textCtrlLo.SetValue(str(scanInfo.lo)) gridDevice.Add(textCtrlLo, (3, 1), (1, 1), wx.ALL, 5) textMHz3 = wx.StaticText(self, label="MHz") gridDevice.Add(textMHz3, (3, 2), (1, 1), wx.ALL, 5) textCal = wx.StaticText(self, label="Calibration") gridDevice.Add(textCal, (4, 0), (1, 1), wx.ALL, 5) textCtrlCal = wx.TextCtrl(self, value="Unknown", style=wx.TE_READONLY) if scanInfo.calibration is not None: textCtrlCal.SetValue(str(scanInfo.calibration)) gridDevice.Add(textCtrlCal, (4, 1), (1, 1), wx.ALL, 5) testPpm = wx.StaticText(self, label="ppm") gridDevice.Add(testPpm, (4, 2), (1, 1), wx.ALL, 5) boxDevice.Add(gridDevice, 1, wx.EXPAND, 5) m_grid.Add(boxDevice, (1, 0), (1, 1), wx.ALL | wx.EXPAND, 5) box.Add(m_grid, 1, wx.ALL | wx.EXPAND, 5) sizerButtons = wx.StdDialogButtonSizer() buttonOk = wx.Button(self, wx.ID_OK) buttonCancel = wx.Button(self, wx.ID_CANCEL) sizerButtons.AddButton(buttonOk) sizerButtons.AddButton(buttonCancel) sizerButtons.Realize() self.Bind(wx.EVT_BUTTON, self.__on_ok, buttonOk) box.Add(sizerButtons, 0, wx.ALIGN_RIGHT | wx.ALL, 5) self.SetSizerAndFit(box)
def __init__(self, parent, spectrum, settings): self.spectrum = spectrum self.settings = settings self.sweeps = None self.isExporting = False wx.Dialog.__init__(self, parent=parent, title='Export Plot Sequence') self.queue = Queue() self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.__on_timer, self.timer) self.timer.Start(self.POLL) self.figure = Figure(facecolor='white') self.canvas = FigureCanvas(self, -1, self.figure) self.plot = Plotter(self.queue, self.figure, settings) textPlot = wx.StaticText(self, label='Plot') self.checkAxes = wx.CheckBox(self, label='Axes') self.checkAxes.SetValue(True) self.Bind(wx.EVT_CHECKBOX, self.__on_axes, self.checkAxes) self.checkGrid = wx.CheckBox(self, label='Grid') self.checkGrid.SetValue(True) self.Bind(wx.EVT_CHECKBOX, self.__on_grid, self.checkGrid) self.checkBar = wx.CheckBox(self, label='Bar') self.checkBar.SetValue(True) self.Bind(wx.EVT_CHECKBOX, self.__on_bar, self.checkBar) sizerCheck = wx.BoxSizer(wx.HORIZONTAL) sizerCheck.Add(self.checkAxes, flag=wx.ALL, border=5) sizerCheck.Add(self.checkGrid, flag=wx.ALL, border=5) sizerCheck.Add(self.checkBar, flag=wx.ALL, border=5) textRange = wx.StaticText(self, label='Range') self.sweepTimeStamps = sorted( [timeStamp for timeStamp in spectrum.keys()]) sweepChoices = [ format_time(timeStamp, True) for timeStamp in self.sweepTimeStamps ] textStart = wx.StaticText(self, label="Start") self.choiceStart = wx.Choice(self, choices=sweepChoices) self.choiceStart.SetSelection(0) self.Bind(wx.EVT_CHOICE, self.__on_choice, self.choiceStart) textEnd = wx.StaticText(self, label="End") self.choiceEnd = wx.Choice(self, choices=sweepChoices) self.choiceEnd.SetSelection(len(self.sweepTimeStamps) - 1) self.Bind(wx.EVT_CHOICE, self.__on_choice, self.choiceEnd) textSweeps = wx.StaticText(self, label='Sweeps') self.textSweeps = wx.StaticText(self, label="") textOutput = wx.StaticText(self, label='Output') self.textSize = wx.StaticText(self) buttonSize = wx.Button(self, label='Change...') buttonSize.SetToolTip('Change exported image size') self.Bind(wx.EVT_BUTTON, self.__on_imagesize, buttonSize) self.__show_image_size() buttonBrowse = wx.Button(self, label='Browse...') self.Bind(wx.EVT_BUTTON, self.__on_browse, buttonBrowse) self.editDir = wx.TextCtrl(self) self.editDir.SetValue(settings.dirExport) font = textPlot.GetFont() fontSize = font.GetPointSize() font.SetPointSize(fontSize + 4) textPlot.SetFont(font) textRange.SetFont(font) textOutput.SetFont(font) sizerButtons = wx.StdDialogButtonSizer() buttonOk = wx.Button(self, wx.ID_OK) buttonCancel = wx.Button(self, wx.ID_CANCEL) sizerButtons.AddButton(buttonOk) sizerButtons.AddButton(buttonCancel) sizerButtons.Realize() self.Bind(wx.EVT_BUTTON, self.__on_ok, buttonOk) sizerGrid = wx.GridBagSizer(5, 5) sizerGrid.Add(self.canvas, pos=(0, 0), span=(10, 6), flag=wx.EXPAND | wx.ALL, border=5) sizerGrid.Add(textPlot, pos=(0, 7), flag=wx.TOP | wx.BOTTOM, border=5) sizerGrid.Add(sizerCheck, pos=(1, 7), span=(1, 2), flag=wx.ALL, border=5) sizerGrid.Add(textRange, pos=(2, 7), flag=wx.TOP | wx.BOTTOM, border=5) sizerGrid.Add(textStart, pos=(3, 7), flag=wx.ALIGN_CENTRE_VERTICAL | wx.ALL, border=5) sizerGrid.Add(self.choiceStart, pos=(3, 8), flag=wx.ALL, border=5) sizerGrid.Add(textEnd, pos=(4, 7), flag=wx.ALIGN_CENTRE_VERTICAL | wx.ALL, border=5) sizerGrid.Add(self.choiceEnd, pos=(4, 8), flag=wx.ALL, border=5) sizerGrid.Add(textSweeps, pos=(5, 7), flag=wx.ALIGN_CENTRE_VERTICAL | wx.ALL, border=5) sizerGrid.Add(self.textSweeps, pos=(5, 8), flag=wx.ALIGN_CENTRE_VERTICAL | wx.ALL, border=5) sizerGrid.Add(textOutput, pos=(6, 7), flag=wx.TOP | wx.BOTTOM, border=5) sizerGrid.Add(self.textSize, pos=(7, 7), flag=wx.ALIGN_CENTRE_VERTICAL | wx.ALL, border=5) sizerGrid.Add(buttonSize, pos=(7, 8), flag=wx.ALL, border=5) sizerGrid.Add(self.editDir, pos=(8, 7), span=(1, 2), flag=wx.ALL | wx.EXPAND, border=5) sizerGrid.Add(buttonBrowse, pos=(9, 7), flag=wx.ALL, border=5) sizerGrid.Add(sizerButtons, pos=(10, 7), span=(1, 2), flag=wx.ALIGN_RIGHT | wx.ALL, border=5) self.SetSizerAndFit(sizerGrid) self.__draw_plot()
def run(self): self.parent.clear_plots() if self.data is None: length, tMin, tMax, fMin, fMax, lMin, lMax, peakF, peakL, peakT = ( '-', ) * 10 else: length = len(self.data) tMin = format_time(self.extent.tMin, True) tMax = format_time(self.extent.tMax, True) fMin = format_precision(self.settings, freq=self.extent.fMin, fancyUnits=True) fMax = format_precision(self.settings, freq=self.extent.fMax, fancyUnits=True) lMin = format_precision(self.settings, level=self.extent.lMin, fancyUnits=True) lMax = format_precision(self.settings, level=self.extent.lMax, fancyUnits=True) peak = self.extent.get_peak_flt() peakF = format_precision(self.settings, freq=peak[0], fancyUnits=True) peakL = format_precision(self.settings, level=peak[1], fancyUnits=True) peakT = format_time(peak[2], True) text = [ ['Sweeps', '', length], ['Extent', '', ''], ['', 'Start', tMin], ['', 'End', tMax], ['', 'Min frequency', fMin], ['', 'Max frequency', fMax], ['', 'Min level', lMin], ['', 'Max level', lMax], ['Peak', '', ''], ['', 'Level', peakL], ['', 'Frequency', peakF], ['', 'Time', peakT], ] table = Table(self.axes, loc='center') table.set_gid('table') rows = len(text) cols = len(text[0]) fontProperties = FontProperties() fontProperties.set_weight('semibold') for row in xrange(rows): for col in xrange(cols): fp = fontProperties if col == 0 else None table.add_cell(row, col, text=text[row][col], fontproperties=fp, width=1.0 / cols, height=1.0 / rows) if self.settings.grid: colour = 'LightGray' else: colour = 'w' set_table_colour(table, colour) for i in range(2): table.auto_set_column_width(i) self.axes.add_table(table) self.parent.redraw_plot() self.parent.threadPlot = None