class PanelGraph(wx.Panel): def __init__(self, panel, notify, settings, callbackMotion): self.panel = panel self.notify = notify self.plot = None self.settings = settings self.spectrum = None self.isLimited = None self.limit = None self.extent = None self.mouseSelect = None self.mouseZoom = None self.measureTable = None self.background = None self.selectStart = None self.selectEnd = None self.menuClearSelect = [] self.measure = None self.show = None self.doDraw = False wx.Panel.__init__(self, panel) self.figure = matplotlib.figure.Figure(facecolor='white') self.canvas = FigureCanvas(self, -1, self.figure) self.measureTable = PanelMeasure(self) self.toolbar = NavigationToolbar(self.canvas, self, settings, self.hide_overlay) self.toolbar.Realize() vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.canvas, 1, wx.EXPAND) vbox.Add(self.measureTable, 0, wx.EXPAND) vbox.Add(self.toolbar, 0, wx.EXPAND) self.SetSizer(vbox) vbox.Fit(self) self.create_plot() self.canvas.mpl_connect('motion_notify_event', callbackMotion) self.canvas.mpl_connect('draw_event', self.on_draw) self.canvas.mpl_connect('idle_event', self.on_idle) self.Bind(wx.EVT_SIZE, self.on_size) self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.on_timer, self.timer) def create_plot(self): if self.plot is not None: self.plot.close() self.toolbar.set_auto(True) if self.settings.display == Display.PLOT: self.plot = Plotter(self.notify, self.figure, self.settings) elif self.settings.display == Display.SPECT: self.plot = Spectrogram(self.notify, self.figure, self.settings) else: self.plot = Plotter3d(self.notify, self.figure, self.settings) self.set_fonts() self.toolbar.set_plot(self.plot) self.toolbar.set_type(self.settings.display) self.measureTable.set_type(self.settings.display) self.set_plot_title() self.figure.tight_layout() self.figure.subplots_adjust(top=0.85) self.redraw_plot() self.plot.scale_plot(True) self.mouseZoom = MouseZoom(self.plot, self.toolbar, self.hide_overlay) self.mouseSelect = MouseSelect(self.plot, self.on_select, self.on_selected) self.measureTable.show(self.settings.showMeasure) self.panel.SetFocus() def set_fonts(self): axes = self.plot.get_axes() axes.xaxis.label.set_size('small') axes.yaxis.label.set_size('small') if self.settings.display == Display.SURFACE: axes.zaxis.label.set_size('small') axes.tick_params(axis='both', which='major', labelsize='small') axes = self.plot.get_axes_bar() axes.tick_params(axis='both', which='major', labelsize='small') def add_menu_clear_select(self, menu): self.menuClearSelect.append(menu) menu.Enable(False) def enable_menu(self, state): for menu in self.menuClearSelect: menu.Enable(state) def on_size(self, event): ppi = wx.ScreenDC().GetPPI() size = [float(v) for v in self.canvas.GetSize()] width = size[0] / ppi[0] height = size[1] / ppi[1] self.figure.set_figwidth(width) self.figure.set_figheight(height) self.figure.set_dpi(ppi[0]) event.Skip() def on_draw(self, _event): axes = self.plot.get_axes() self.background = self.canvas.copy_from_bbox(axes.bbox) self.draw_overlay() def on_select(self): self.hide_measure() def on_selected(self, start, end): self.enable_menu(True) self.selectStart = start self.selectEnd = end self.measureTable.set_selected(self.spectrum, start, end) def on_idle(self, _event): if self.doDraw and self.plot.get_plot_thread() is None: self.hide_overlay() self.canvas.draw() self.doDraw = False def on_timer(self, _event): self.timer.Stop() self.set_plot(None, None, None, None, self.annotate) def draw(self): self.doDraw = True def show_measureTable(self, show): self.measureTable.show(show) self.Layout() def set_plot(self, spectrum, isLimited, limit, extent, annotate=False): if spectrum is not None and extent is not None: if isLimited is not None and limit is not None: self.spectrum = copy.copy(spectrum) self.extent = extent self.annotate = annotate self.isLimited = isLimited self.limit = limit if self.plot.get_plot_thread() is None: self.timer.Stop() self.measureTable.set_selected(self.spectrum, self.selectStart, self.selectEnd) if isLimited: spectrum = reduce_points(spectrum, limit) self.plot.set_plot(self.spectrum, self.extent, annotate) else: self.timer.Start(200, oneShot=True) def set_plot_title(self): if len(self.settings.devices) > 0: gain = self.settings.devices[self.settings.index].gain else: gain = 0 self.figure.suptitle("Frequency Spectrogram\n{0} - {1} MHz," " gain = {2}dB".format(self.settings.start, self.settings.stop, gain)) def redraw_plot(self): if self.spectrum is not None: self.set_plot(self.spectrum, self.settings.pointsLimit, self.settings.pointsMax, self.extent, self.settings.annotate) def set_grid(self, on): self.plot.set_grid(on) def draw_overlay(self): if self.background is not None: self.canvas.restore_region(self.background) self.draw_select() self.draw_measure() self.canvas.blit(self.plot.get_axes().bbox) def draw_select(self): if self.selectStart is not None and self.selectEnd is not None: self.mouseSelect.draw(self.selectStart, self.selectEnd) def hide_overlay(self): if self.plot is not None: self.plot.hide_measure() self.hide_select() def hide_measure(self): if self.plot is not None: self.plot.hide_measure() def hide_select(self): if self.mouseSelect is not None: self.mouseSelect.hide() def draw_measure(self): if self.measure is not None and self.measure.is_valid(): self.plot.draw_measure(self.measure, self.show) def update_measure(self, measure, show): self.measure = measure self.show = show self.draw_overlay() def get_figure(self): return self.figure def get_axes(self): return self.plot.get_axes() def get_canvas(self): return self.canvas def get_toolbar(self): return self.toolbar def scale_plot(self, force=False): self.plot.scale_plot(force) def clear_plots(self): self.plot.clear_plots() def clear_selection(self): self.measure = None self.measureTable.clear_measurement() self.selectStart = None self.selectEnd = None self.mouseSelect.clear() self.enable_menu(False) def close(self): close_modeless()
class PanelGraph(wx.Panel): def __init__(self, panel, notify, settings, callbackMotion): self.panel = panel self.notify = notify self.plot = None self.settings = settings self.spectrum = None self.isLimited = None self.limit = None self.extent = None self.background = None self.selectStart = None self.selectEnd = None self.menuClearSelect = [] self.measure = None self.show = None self.doDraw = False wx.Panel.__init__(self, panel) self.figure = matplotlib.figure.Figure(facecolor='white') self.canvas = FigureCanvas(self, -1, self.figure) self.measureTable = PanelMeasure(self) self.toolbar = NavigationToolbar(self.canvas, self, settings, self.on_nav_changed) self.toolbar.Realize() vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.canvas, 1, wx.EXPAND) vbox.Add(self.measureTable, 0, wx.EXPAND) vbox.Add(self.toolbar, 0, wx.EXPAND) self.SetSizer(vbox) vbox.Fit(self) self.create_plot() self.canvas.mpl_connect('motion_notify_event', callbackMotion) self.canvas.mpl_connect('draw_event', self.on_draw) self.canvas.mpl_connect('idle_event', self.on_idle) self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.on_timer, self.timer) def create_plot(self): if self.plot is not None: self.plot.close() if self.settings.display == Display.PLOT: self.plot = Plotter(self.notify, self.figure, self.settings) elif self.settings.display == Display.SPECT: self.plot = Spectrogram(self.notify, self.figure, self.settings) else: self.plot = Plotter3d(self.notify, self.figure, self.settings) self.toolbar.set_plot(self.plot) self.toolbar.set_type(self.settings.display) self.measureTable.set_type(self.settings.display) self.set_plot_title() self.redraw_plot() self.plot.scale_plot(True) self.mouseZoom = MouseZoom(self.plot, self.toolbar, self.hide_measure, self.draw_measure) self.mouseSelect = MouseSelect(self.plot, self.on_select, self.on_selected) self.draw_select() self.measureTable.show(self.settings.showMeasure) self.panel.SetFocus() def add_menu_clear_select(self, menu): self.menuClearSelect.append(menu) menu.Enable(False) def enable_menu(self, state): for menu in self.menuClearSelect: menu.Enable(state) def on_draw(self, _event): axes = self.plot.get_axes() self.background = self.canvas.copy_from_bbox(axes.bbox) self.mouseSelect.set_background(self.background) self.draw_measure() def on_nav_changed(self, _event): self.draw_measure() def on_select(self): self.hide_measure() def on_selected(self, start, end): self.enable_menu(True) self.on_draw(None) self.selectStart = start self.selectEnd = end self.measureTable.set_selected(self.spectrum, start, end) self.draw_measure() def on_idle(self, _event): if self.doDraw and self.plot.get_plot_thread() is None: self.canvas.draw() self.doDraw = False def on_timer(self, _event): self.timer.Stop() self.set_plot(None, None, None, None, self.annotate) def draw(self): self.doDraw = True def show_measureTable(self, show): self.measureTable.show(show) self.Layout() def set_plot(self, spectrum, isLimited, limit, extent, annotate=False): if spectrum is not None and extent is not None: if isLimited is not None and limit is not None: self.spectrum = copy.copy(spectrum) self.extent = extent self.annotate = annotate self.isLimited = isLimited self.limit = limit if self.plot.get_plot_thread() is None: self.timer.Stop() self.measureTable.set_selected(spectrum, self.selectStart, self.selectEnd) if isLimited: spectrum = reduce_points(spectrum, limit) self.plot.set_plot(spectrum, extent, annotate) self.draw_select() else: self.timer.Start(200, oneShot=True) def set_plot_title(self): if len(self.settings.devices) > 0: gain = self.settings.devices[self.settings.index].gain else: gain = 0 self.plot.set_title("Frequency Spectrogram\n{0} - {1} MHz," " gain = {2}dB".format(self.settings.start, self.settings.stop, gain)) def redraw_plot(self): if self.spectrum is not None: self.set_plot(self.spectrum, self.settings.pointsLimit, self.settings.pointsMax, self.extent, self.settings.annotate) def draw_select(self): if self.selectStart is not None and self.selectEnd is not None: self.mouseSelect.draw(self.selectStart, self.selectEnd) def hide_measure(self): self.plot.hide_measure() def draw_measure(self): if self.measure is not None and self.background is not None: self.plot.draw_measure(self.background, self.measure, self.show) def update_measure(self, measure, show): self.measure = measure self.show = show self.draw_measure() def get_figure(self): return self.figure def get_axes(self): return self.plot.get_axes() def get_canvas(self): return self.canvas def get_toolbar(self): return self.toolbar def scale_plot(self, force=False): self.plot.scale_plot(force) def clear_plots(self): self.plot.clear_plots() def clear_selection(self): self.measure = None self.measureTable.clear_measurement() self.selectStart = None self.selectEnd = None self.mouseSelect.clear() self.enable_menu(False) def close(self): close_modeless()