def __init__(self, parent, mtitle, msize): super(MFrame, self).__init__(parent, title = mtitle, size = msize) # class variables self.panel = None self.notebook = None self.globalSession = GlobalSession() self.globalSession.statusCallback = self.setSBText self.InitUI()
def __init__(self, countSubplot, aiSubplot, canvas): """ plot should be the subplot bound to the canvas """ from mallard.core.session import GlobalSession self.countSubplot = countSubplot self.aiSubplot = aiSubplot self.canvas = canvas # in case the initialisation from datamanager fails self.globalSession = GlobalSession() # the line style parameters self.countLineStyle = None self.voltLineStyle = None
class GraphManager: """ Handles graph on a given CapturePane Note (as with all gui modules) this is essentially dumb, it is up to DataManager to tell GraphManager what to plot and when """ def __init__(self, countSubplot, aiSubplot, canvas): """ plot should be the subplot bound to the canvas """ from mallard.core.session import GlobalSession self.countSubplot = countSubplot self.aiSubplot = aiSubplot self.canvas = canvas # in case the initialisation from datamanager fails self.globalSession = GlobalSession() # the line style parameters self.countLineStyle = None self.voltLineStyle = None def plot(self, voltage, counts, ai, oldCounts, oldAi ): """ Plots counts & ai against voltage """ self.calcLineStyles() self.clearPlot() # set labels (again) self.countSubplot.set_xlabel("Volts (V)") self.countSubplot.set_ylabel("Count") self.aiSubplot.set_xlabel("Volts (V)") self.aiSubplot.set_ylabel("Measured Volts (V)") if self.countLineStyle == 'hist': self.countSubplot.step(voltage[:len(counts)], counts,'r', voltage, oldCounts, 'k') else: if self.countLineStyle == 'o': self.countSubplot.errorbar(voltage[:len(counts)], counts, yerr=np.sqrt(counts), fmt='r' + self.countLineStyle) self.countSubplot.errorbar(voltage, oldCounts, yerr=np.sqrt(oldCounts), fmt='k' + self.countLineStyle) else: self.countSubplot.plot(voltage[:len(counts)], counts, 'r' + self.countLineStyle, voltage, oldCounts, 'k' + self.countLineStyle) if self.voltLineStyle == 'hist': self.aiSubplot.step(voltage[:len(ai)], ai,'r', voltage, oldAi, 'k') else: self.aiSubplot.plot(voltage[:len(ai)], ai, 'r' + self.voltLineStyle, voltage, oldAi, 'k' + self.voltLineStyle) self.canvas.draw() def calcLineStyles(self): """ Creates the correct text lines from the globalSession settings """ settings = self.globalSession.getSettings() self.countLineStyle = '' if settings.countGraphStyle == settings._GRAPH_DOT: self.countLineStyle = 'o' if settings.countGraphStyle == settings._GRAPH_HIST: self.countLineStyle = 'hist' if settings.voltGraphStyle == settings._GRAPH_DOT: self.voltLineStyle = 'o' if settings.voltGraphStyle == settings._GRAPH_HIST: self.voltLineStyle = 'hist' def clearPlot(self): self.countSubplot.clear() self.aiSubplot.clear()
class MFrame(wx.Frame): """ Main frame class for the Mallard data acquisition project [email protected] """ def __init__(self, parent, mtitle, msize): super(MFrame, self).__init__(parent, title = mtitle, size = msize) # class variables self.panel = None self.notebook = None self.globalSession = GlobalSession() self.globalSession.statusCallback = self.setSBText self.InitUI() def InitUI(self): """ UI initialisation """ self.createMenu() self.createPanel() self.sb = self.CreateStatusBar() self.Centre() self.Show() def createMenu(self): """ Add top menubar """ # menu stuff menubar = wx.MenuBar() # File menu fileMenu = wx.Menu() fileNewCapture = fileMenu.Append(wx.ID_NEW, "New Capture", "New Capture") fileSaveCapture = fileMenu.Append(wx.ID_SAVE, "Save Capture", "Save Capture") fileSaveCaptureAs = fileMenu.Append(wx.ID_SAVE, "Save Capture As...", "Save Capture As") fileCloseCapture = fileMenu.Append(wx.ID_ANY, 'Close Capture', 'Close current capture') fileLoadData = fileMenu.Append(wx.ID_ANY, 'Load Data', 'Display existing data') fileLoadSettings = fileMenu.Append(wx.ID_ANY, 'Load Settings from Existing Capture', 'Load settings into capture') fileMenu.AppendSeparator() filePreferences = fileMenu.Append(wx.ID_ANY, "Preferences", "Global Settings") fileMenu.AppendSeparator() fileQuitItem = fileMenu.Append(wx.ID_EXIT, 'Quit', 'Quit Application') menubar.Append(fileMenu, '&File') # capture menu captureMenu = wx.Menu() captureSettings = captureMenu.Append(wx.ID_ANY, "Settings", "Current Capture Settings") captureKill = captureMenu.Append(wx.ID_ANY, "Kill Capture", "Kill Running Capture") captureStop = captureMenu.Append(wx.ID_ANY, "Stop Capture", "Stop capture at end of scan") changeName = captureMenu.Append(wx.ID_ANY, "Rename Session", "Rename current session") menubar.Append(captureMenu, '&Capture') self.SetMenuBar(menubar) # Graph menu graphMenu = wx.Menu() clearGraph = graphMenu.Append(wx.ID_ANY, "Clear all", "Clear all") menubar.Append(graphMenu, '&Graph') # Help menu helpMenu = wx.Menu() docMenu = helpMenu.Append(wx.ID_ANY, "Documentation", "Show documentation") aboutMenu = helpMenu.Append(wx.ID_ANY, "About", "About") menubar.Append(helpMenu, '&Help') # file events self.Bind(wx.EVT_MENU, self.onNew, fileNewCapture) self.Bind(wx.EVT_MENU, self.onSave, fileSaveCapture) self.Bind(wx.EVT_MENU, self.onSaveAs, fileSaveCaptureAs) self.Bind(wx.EVT_MENU, self.onClose, fileCloseCapture) self.Bind(wx.EVT_MENU, self.onLoadData, fileLoadData) self.Bind(wx.EVT_MENU, self.onLoadSettings, fileLoadSettings) self.Bind(wx.EVT_MENU, self.onPreferences, filePreferences) self.Bind(wx.EVT_MENU, self.onQuit, fileQuitItem) # capture menu events self.Bind(wx.EVT_MENU, self.onCaptureSettings, captureSettings) self.Bind(wx.EVT_MENU, self.onChangeName, changeName) self.Bind(wx.EVT_MENU, self.onKillCapture, captureKill) self.Bind(wx.EVT_MENU, self.onStopCapture, captureStop) # graph events self.Bind(wx.EVT_MENU, self.onClearGraph, clearGraph) # help events self.Bind(wx.EVT_MENU, self.onDocumentation, docMenu) self.Bind(wx.EVT_MENU, self.onAbout, aboutMenu) def createPanel(self): """ Creates main notebook """ self.panel = wx.Panel(self) self.notebook = CaptureNotebook(self.panel) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.notebook, 1, flag = wx.ALL | wx.EXPAND, border=5) self.panel.SetSizer(sizer) self.Layout() # begin event functions def onNew(self, event): """ User has indicated new capture """ self.notebook.addTab(self.globalSession) def onSave(self, event): """ User has indicated capture save """ if self.assertOpenCapture(): if self.notebook.getOpenSession().settings.filename \ is "": self.onSaveAs(event) else: self.notebook.getOpenSession().saveSession() def onSaveAs(self, event): """ Save capture as specific name """ if self.assertOpenCapture(): name = self.notebook.getOpenSession().settings.name saveFileDialog = wx.FileDialog(self, "Save As", "", name + '.csv', "CSV files (*.csv)|*.csv", wx.FD_SAVE) if saveFileDialog.ShowModal() == wx.ID_OK: path = saveFileDialog.GetPath() self.notebook.getOpenSession().saveSessionAs(path) name = self.notebook.getOpenSession().settings.name self.notebook.SetPageText( self.notebook.GetSelection(), name ) def onClose(self, event): """ Called to close an open capture """ if self.assertOpenCapture(): self.notebook.closeTab() def onLoadSettings(self, event): """ Loads settings only from open file """ openFileDialog = wx.FileDialog(self, "Open", "", "", "CSV files (*.csv)|*.csv", wx.FD_OPEN) if openFileDialog.ShowModal() == wx.ID_OK: path = openFileDialog.GetPath() self.notebook.addTab(self.globalSession) self.notebook.getLastTab().loadSettingsFromFile(path) self.notebook.SetPageText( self.notebook.GetSelection(), self.notebook.getLastTab().session.getName() ) def onLoadData(self, event): """ Displays existing data from capture """ openFileDialog = wx.FileDialog(self, "Open", "", "", "CSV files (*.csv)|*.csv", wx.FD_OPEN) if openFileDialog.ShowModal() == wx.ID_OK: path = openFileDialog.GetPath() self.notebook.addTab(self.globalSession) self.notebook.getLastTab().loadSessionFromFile(path) self.notebook.SetPageText( self.notebook.GetSelection(), self.notebook.getLastTab().session.getName() ) self.notebook.getLastTab().session.readOnly = True def onPreferences(self, event): """ User selects to edit global preferences """ sdlg = GlobalSettingsDialog(None) sdlg.setSettings(self.globalSession.getSettings()) sdlg.ShowModal() self.globalSession.setSettings(sdlg.getSettings()) def onQuit(self, event): """ Called to exit program """ self.Close() def onCaptureSettings(self, event): """ Called to edit a given capture's settings """ if self.assertOpenCapture(): self.notebook.getOpenTab().changeSettings() def onClearGraph(self, event): self.notebook.getOpenSession().clearGraph() def onChangeName(self, event): if self.assertOpenCapture(): name = self.notebook.getOpenSession().getName() dlg = wx.TextEntryDialog( self, 'Enter new name', 'Rename', name) if dlg.ShowModal() == wx.ID_OK: name = dlg.GetValue() self.notebook.getOpenSession().setName(name) self.notebook.SetPageText( self.notebook.GetSelection(), name ) def onKillCapture(self, event): if self.assertOpenCapture(): if self.notebook.getOpenSession().isCapturing(): self.notebook.getOpenSession().killCapture() else: wx.MessageBox('No capture in progress', 'Error', wx.OK | wx.ICON_INFORMATION) def onStopCapture(self, event): if self.assertOpenCapture(): if self.notebook.getOpenSession().isCapturing(): self.notebook.getOpenSession().stopCapture() else: wx.MessageBox('No capture in progress', 'Error', wx.OK | wx.ICON_INFORMATION) def onAbout(self, event): """ When user clicks help -> about """ description = "Data Acquisition for CRIS. Created as part of the \n Cern summer student programme 2013." info = wx.AboutDialogInfo() info.SetName('Mallard for CRIS') info.SetVersion('1.0') info.SetDescription(description) info.SetWebSite('http://kieranrcampbell.github.io/mallard/') info.AddDeveloper('Kieran R Campbell') wx.AboutBox(info) def onDocumentation(self, event): """ When user clicks help -> documentation """ import os os.startfile(os.path.join('doc','report.pdf')) def assertOpenCapture(self): """ Makes sure there exists a CapturePane to perform action on """ if len(self.notebook.getTabList()) == 0: wx.MessageBox('No open captures', 'Error', wx.OK | wx.ICON_INFORMATION) return False return True def setSBText(self, text): """ Sets the text on the status bar """ self.sb.SetStatusText(text) def displayError(self, msg): """ Displays msg as an error message in a pop up box """ wx.MessageBox(str(msg), 'Error', wx.OK | wx.ICON_INFORMATION) def guiExceptHook(self, type, value, tb): """ Exception hook for main program """ self.displayError(type + value)