Exemplo n.º 1
0
    def OnInit(self):
        self.filters = {}
        self.filter_columns = {}
        self.filter_dialog = None

        # Frames.
        self.csv_frame = TabularDisplayFrame(None, title=self.default_title)

        # Menu.
        menuBar = wx.MenuBar()

        ## File.
        menu = wx.Menu()
        menuBar.Append(menu, '&File')

        item = menu.Append(wx.ID_OPEN, '&Open...')
        self.Bind(wx.EVT_MENU, self.OnMenuFileOpen, item)

        item = menu.Append(wx.ID_CLOSE, '&Close')
        self.Bind(wx.EVT_MENU, self.OnMenuFileClose, item)

        menu.AppendSeparator()

        self.filter_menu_item = menu.Append(wx.ID_ANY, '&Filters...')
        self.filter_menu_item.Enable(False)
        self.Bind(wx.EVT_MENU, self.OnMenuFileFilters, self.filter_menu_item)

        menu.AppendSeparator()

        item = menu.Append(wx.ID_EXIT, 'E&xit')
        self.Bind(wx.EVT_MENU, self.OnMenuFileExit, item)

        ## Plot.
        menu = wx.Menu()
        menuBar.Append(menu, '&Plot')

        menu.Append(wx.ID_ANY, ' 2D:').Enable(False)

        self.two_dimensional_menu = menu.Append(wx.ID_ANY, '&Curve...')
        self.Bind(wx.EVT_MENU,
                  partial(self.create_plot, formats.two_dimensional),
                  self.two_dimensional_menu)

        menu.AppendSeparator()

        menu.Append(wx.ID_ANY, ' 3D:').Enable(False)

        self.colormapped_menu = menu.Append(wx.ID_ANY, '&Colormapped...')
        self.Bind(wx.EVT_MENU, partial(self.create_plot, formats.colormapped),
                  self.colormapped_menu)

        self.surface_menu = menu.Append(wx.ID_ANY, '&Surface...')
        self.Bind(wx.EVT_MENU, partial(self.create_plot, formats.surface),
                  self.surface_menu)

        menu.AppendSeparator()

        menu.Append(wx.ID_ANY, ' List:').Enable(False)

        self.waveforms_menu = menu.Append(wx.ID_ANY, '&Waveforms...')
        self.Bind(wx.EVT_MENU,
                  partial(self.create_plot, formats.waveforms, type='list'),
                  self.waveforms_menu)

        ## Math.
        menu = wx.Menu()
        menuBar.Append(menu, '&Math')

        item = menu.Append(wx.ID_ANY, '&Derivative...')
        self.Bind(wx.EVT_MENU, self.OnMenuMathDerivative, item)

        item = menu.Append(wx.ID_ANY, '&Function f: y=f(X)...')
        self.Bind(wx.EVT_MENU, self.OnMenuMathFunction, item)

        item = menu.Append(wx.ID_ANY, '&Function f: z=f(X,Y)...')
        self.Bind(wx.EVT_MENU, self.OnMenuMathFunction2arg, item)

        ## Help.
        menu = wx.Menu()
        menuBar.Append(menu, '&Help')

        ### About.
        item = menu.Append(wx.ID_ABOUT, '&About...')
        self.Bind(wx.EVT_MENU, self.OnMenuHelpAbout, item)

        self.csv_frame.SetMenuBar(menuBar)

        self.update_plot_menus(False)

        # Display.
        self.csv_frame.Show()
        self.csv_frame.SetSize((800, 600))

        self.SetTopWindow(self.csv_frame)
        self.csv_frame.Raise()

        return True
Exemplo n.º 2
0
class DataExplorerApp(wx.App):
    default_title = 'Data Explorer'

    def OnInit(self):
        self.filters = {}
        self.filter_columns = {}
        self.filter_dialog = None

        # Frames.
        self.csv_frame = TabularDisplayFrame(None, title=self.default_title)

        # Menu.
        menuBar = wx.MenuBar()

        ## File.
        menu = wx.Menu()
        menuBar.Append(menu, '&File')

        item = menu.Append(wx.ID_OPEN, '&Open...')
        self.Bind(wx.EVT_MENU, self.OnMenuFileOpen, item)

        item = menu.Append(wx.ID_CLOSE, '&Close')
        self.Bind(wx.EVT_MENU, self.OnMenuFileClose, item)

        menu.AppendSeparator()

        self.filter_menu_item = menu.Append(wx.ID_ANY, '&Filters...')
        self.filter_menu_item.Enable(False)
        self.Bind(wx.EVT_MENU, self.OnMenuFileFilters, self.filter_menu_item)

        menu.AppendSeparator()

        item = menu.Append(wx.ID_EXIT, 'E&xit')
        self.Bind(wx.EVT_MENU, self.OnMenuFileExit, item)

        ## Plot.
        menu = wx.Menu()
        menuBar.Append(menu, '&Plot')

        menu.Append(wx.ID_ANY, ' 2D:').Enable(False)

        self.two_dimensional_menu = menu.Append(wx.ID_ANY, '&Curve...')
        self.Bind(wx.EVT_MENU,
                  partial(self.create_plot, formats.two_dimensional),
                  self.two_dimensional_menu)

        menu.AppendSeparator()

        menu.Append(wx.ID_ANY, ' 3D:').Enable(False)

        self.colormapped_menu = menu.Append(wx.ID_ANY, '&Colormapped...')
        self.Bind(wx.EVT_MENU, partial(self.create_plot, formats.colormapped),
                  self.colormapped_menu)

        self.surface_menu = menu.Append(wx.ID_ANY, '&Surface...')
        self.Bind(wx.EVT_MENU, partial(self.create_plot, formats.surface),
                  self.surface_menu)

        menu.AppendSeparator()

        menu.Append(wx.ID_ANY, ' List:').Enable(False)

        self.waveforms_menu = menu.Append(wx.ID_ANY, '&Waveforms...')
        self.Bind(wx.EVT_MENU,
                  partial(self.create_plot, formats.waveforms, type='list'),
                  self.waveforms_menu)

        ## Math.
        menu = wx.Menu()
        menuBar.Append(menu, '&Math')

        item = menu.Append(wx.ID_ANY, '&Derivative...')
        self.Bind(wx.EVT_MENU, self.OnMenuMathDerivative, item)

        item = menu.Append(wx.ID_ANY, '&Function f: y=f(X)...')
        self.Bind(wx.EVT_MENU, self.OnMenuMathFunction, item)

        item = menu.Append(wx.ID_ANY, '&Function f: z=f(X,Y)...')
        self.Bind(wx.EVT_MENU, self.OnMenuMathFunction2arg, item)

        ## Help.
        menu = wx.Menu()
        menuBar.Append(menu, '&Help')

        ### About.
        item = menu.Append(wx.ID_ABOUT, '&About...')
        self.Bind(wx.EVT_MENU, self.OnMenuHelpAbout, item)

        self.csv_frame.SetMenuBar(menuBar)

        self.update_plot_menus(False)

        # Display.
        self.csv_frame.Show()
        self.csv_frame.SetSize((800, 600))

        self.SetTopWindow(self.csv_frame)
        self.csv_frame.Raise()

        return True

    def update_plot_menus(self, status):
        """
		If status is True, enable the plot menus corresponding to the available formats. Otherwise, disable all.
		"""

        pairs = [
            (formats.two_dimensional, self.two_dimensional_menu),
            (formats.colormapped, self.colormapped_menu),
            (formats.surface, self.surface_menu),
            (formats.waveforms, self.waveforms_menu),
        ]

        for format, menu in pairs:
            if not status or format in available_formats:
                menu.Enable(status)

    def create_plot(self, format, evt=None, type='scalar'):
        """
		Open up a dialog to configure the selected plot format.
		"""

        headings, rows, types = self.csv_frame.display_panel.GetValue(
            types=[type])
        available_formats[format](self.csv_frame, headings, rows).Show()

    def OnMenuFileOpen(self, evt=None):
        try:
            result = load_csv(self.csv_frame)
        except IOError as e:
            MessageDialog(self.csv_frame, str(e), 'Could not load data').Show()
            return

        if result is None:
            return
        else:
            self.OnMenuFileClose()

        has_header, values, filename = result

        self.csv_frame.display_panel.from_csv_data(has_header, values)
        self.csv_frame.Title = '{0} - {1}'.format(filename, self.default_title)

        self.update_plot_menus(len(self.csv_frame.display_panel) > 0)

        self.filter_menu_item.Enable(True)

    def OnMenuFileClose(self, evt=None):
        self.csv_frame.display_panel.SetValue([], [])
        self.csv_frame.Title = self.default_title

        self.update_plot_menus(False)

        self.filter_menu_item.Enable(False)

        if self.filter_dialog is not None:
            self.filter_dialog.Close()

        self.filters = {}
        self.filter_columns = {}

    def OnMenuFileFilters(self, evt=None):
        def close_callback(dlg):
            self.filters = dlg.filters
            self.filter_columns = dlg.filter_columns

            self.filter_dialog = None

        if self.filter_dialog is None:
            self.filter_dialog = FilterListDialog(
                self.csv_frame, self.csv_frame.display_panel.table,
                close_callback, self.filters, self.filter_columns)
            self.filter_dialog.Show()

        self.filter_dialog.Raise()

    def OnMenuFileExit(self, evt=None):
        if self.csv_frame:
            self.csv_frame.Close()

    def OnMenuMathDerivative(self, format, evt=None, type='scalar'):
        """
		Open up a dialog to calculate derivative
		"""
        headings, rows, types = self.csv_frame.display_panel.GetValue(
            types=[type])
        dmath = DerivativeMathSetupDialog(self.csv_frame, headings, rows)
        dmath_open = dmath.ShowModal()

        new_headings = headings
        new_headings.append(dmath.dheading)
        new_rows = concatenate([rows.astype(float), dmath.ddata], 1)

        self.csv_frame.display_panel.SetValue(new_headings, new_rows)

    def OnMenuMathFunction(self, format, evt=None, type='scalar'):
        """
		Open up a dialog to apply a scalar function of one variable
		"""
        headings, rows, types = self.csv_frame.display_panel.GetValue(
            types=[type])
        dmath = FunctionMathSetupDialog(self.csv_frame, headings, rows)
        dmath_open = dmath.ShowModal()

        new_headings = headings
        new_headings.append(dmath.dheading)
        new_rows = concatenate([rows.astype(float), dmath.ddata], 1)

        self.csv_frame.display_panel.SetValue(new_headings, new_rows)

    def OnMenuMathFunction2arg(self, format, evt=None, type='scalar'):
        """
		Open up a dialog to apply a scalar function of two variables
		"""
        headings, rows, types = self.csv_frame.display_panel.GetValue(
            types=[type])
        dmath = FunctionMathSetupDialog2arg(self.csv_frame, headings, rows)
        dmath_open = dmath.ShowModal()

        new_headings = headings
        new_headings.append(dmath.dheading)
        new_rows = concatenate([rows.astype(float), dmath.ddata], 1)

        self.csv_frame.display_panel.SetValue(new_headings, new_rows)

    def OnMenuHelpAbout(self, evt=None):
        info = wx.AboutDialogInfo()
        info.SetName('Data Explorer')
        info.SetDescription(
            'An application for displaying data in tabular and graphical form.\n'
            '\n'
            'Using Spanish Acquisition version {0}.'.format(VERSION))

        wx.AboutBox(info)