source: sasview/sansguiframe/src/sans/guiframe/data_processor.py @ c17760d

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since c17760d was 9c8f3ad, checked in by Gervaise Alina <gervyh@…>, 13 years ago

working on dataprocess

  • Property mode set to 100644
File size: 12.6 KB
Line 
1"""
2Implement grid used to store data
3"""
4import wx
5import numpy
6import sys
7from wx.lib.scrolledpanel import ScrolledPanel
8import  wx.grid as  Grid
9import wx.aui
10from wx.aui import AuiNotebook as nb
11from sans.guiframe.panel_base import PanelBase
12import wx.lib.sheet as sheet
13
14from sans.guiframe.events import NewPlotEvent
15from sans.guiframe.events import StatusEvent 
16from sans.guiframe.dataFitting import Data1D
17
18
19class GridPage(sheet.CSheet):
20    """
21    """
22    def __init__(self, parent, panel=None):
23        """
24        """
25        sheet.CSheet.__init__(self, parent)
26        self.SetLabelBackgroundColour('#DBD4D4')
27        self.AutoSize()
28        self.panel = panel
29        self.col_names = []
30        self._cols = 50
31        self._rows = 51
32        col_with = 30
33        row_height = 20
34        self.SetColMinimalAcceptableWidth(col_with)
35        self.SetRowMinimalAcceptableHeight(row_height)
36        self.SetNumberRows(self._cols)
37        self.SetNumberCols(self._rows)
38        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.on_right_click)
39        self.axis_value = []
40        self.axis_label = ""
41       
42    def on_right_click(self, event):
43        """
44        Catch the right click mouse
45        """
46        col = event.GetCol()
47        if col != -1 and len(self.col_names) > col:
48            label = self.col_names[int(col)]
49            self.axis_label = label
50            if label in self.data.keys():
51                col_val = self.data[label]
52                self.axis_value = col_val
53        # Slicer plot popup menu
54        slicerpop = wx.Menu()
55        id = wx.NewId()
56        slicerpop.Append(id, '&Set X axis', 'Set X axis')
57        wx.EVT_MENU(self, id, self.on_set_x_axis)
58       
59        id = wx.NewId()
60        slicerpop.Append(id, '&Set Y axis', 'Set Y axis')
61        wx.EVT_MENU(self, id, self.on_set_y_axis)
62        pos = event.GetPosition()
63        pos = self.ScreenToClient(pos)
64        self.PopupMenu(slicerpop, pos)
65       
66       
67    def on_set_x_axis(self, event):
68        """
69        """
70        self.panel.set_xaxis(x=self.axis_value, label=self.axis_label)
71   
72    def on_set_y_axis(self, event):
73        """
74        """
75        self.panel.set_yaxis(y=self.axis_value, label=self.axis_label)     
76           
77    def set_data(self, data):
78        """
79        Add data to the grid
80        """
81        if data is None:
82            data = {}
83        if  len(data) > 0:
84           
85            self._cols = self.GetNumberCols()
86            self._rows = self.GetNumberRows()
87            self.data = data
88            self.col_names = data.keys()
89            self.col_names.sort() 
90            nbr_user_cols = len(self.col_names)
91            #Add more columns to the grid if necessary
92            if nbr_user_cols > self._cols:
93                new_col_nbr = nbr_user_cols -  self._cols
94                self.AppendCols(new_col_nbr, True)
95            #Add more rows to the grid if necessary 
96            nbr_user_row = len(self.data.values())
97            if nbr_user_row > self._rows + 1:
98                new_row_nbr =  nbr_user_row - self._rows
99                self.AppendRows(new_row_nbr, True)
100            # add data to the grid   
101            label_row = 0
102            for index  in range(nbr_user_cols):
103                # use the first row of the grid to add user defined labels
104                self.SetCellValue(label_row, index, str(self.col_names[index]))
105            col = 0
106            for value_list in self.data.values():
107                for row in range(1, len(value_list)):
108                    self.SetCellValue(row, col, str(value_list[row]))
109                col += 1
110            self.AutoSize()
111           
112
113class Notebook(nb, PanelBase):
114    """
115    ## Internal name for the AUI manager
116    window_name = "Fit panel"
117    ## Title to appear on top of the window
118    """
119    window_caption = "Notebook "
120   
121    def __init__(self, parent, manager=None, data=None, *args, **kwargs):
122        """
123        """
124        nb.__init__(self, parent, -1,
125                    style= wx.aui.AUI_BUTTON_DOWN|wx.aui.AUI_NB_WINDOWLIST_BUTTON|
126                    wx.aui.AUI_NB_DEFAULT_STYLE|
127                    wx.CLIP_CHILDREN)
128        PanelBase.__init__(self, parent)
129        self.enable_close_button()
130        self.parent = parent
131        self.manager = manager
132        self.data = data
133        self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.on_close_page)
134       
135    def enable_close_button(self):
136        """
137        display the close button on tab for more than 1 tabs else remove the
138        close button
139        """
140        if self.GetPageCount() <= 1:
141            style = self.GetWindowStyleFlag() 
142            flag = wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
143            if style & wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB == flag:
144                style = style & ~wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
145                self.SetWindowStyle(style)
146        else:
147            style = self.GetWindowStyleFlag()
148            flag = wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
149            if style & wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB != flag:
150                style |= wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
151                self.SetWindowStyle(style)
152               
153    def on_close_page(self, event):
154        """
155        close the page
156        """
157        if self.GetPageCount() == 1:
158            event.Veto()
159        self.enable_close_button()
160       
161 
162           
163    def set_data(self, data):
164        if data is None:
165            return
166           
167        grid = GridPage(self, panel=self.parent)
168        grid.set_data(data) 
169        self.AddPage(grid, "")
170        pos = self.GetPageIndex(grid)
171        title = "Batch " + str(self.GetPageCount())
172        self.SetPageText(pos, title)
173       
174    def add_column(self):
175        """
176        Append a new column to the grid
177        """
178        pos = self.GetSelection()
179        grid = self.GetPage(pos)
180        grid.AppendCols(1, True)
181       
182    def on_remove_column(self):
183        """
184        Remove column to the current grid
185        """
186        pos = self.GetSelection()
187        grid = self.GetPage(pos)
188        cols_pos = grid.GetSelectedCols() 
189        for cpos in cols_pos:
190            grid.DeleteCols(cpos)
191         
192         
193class SPanel(ScrolledPanel):
194    def __init__(self, parent, *args, **kwds):
195        ScrolledPanel.__init__(self, parent , *args, **kwds)
196        self.SetupScrolling() 
197
198
199class GridPanel(SPanel):
200    def __init__(self, parent,data=None, *args, **kwds):
201        SPanel.__init__(self, parent , *args, **kwds)
202        self.vbox = wx.BoxSizer(wx.VERTICAL)
203       
204        self.plotting_sizer = wx.FlexGridSizer(3, 5, 10, 5)
205        w, h = self.GetSize()
206        #self.panel_grid = SPanel(self, -1, size=(w, -1))
207        self.grid_sizer = wx.BoxSizer(wx.HORIZONTAL)
208        self.vbox.AddMany([(self.grid_sizer, 1, wx.EXPAND, 0),
209                           (wx.StaticLine(self, -1), 0, wx.EXPAND, 0),
210                           (self.plotting_sizer)])
211        self.parent = parent
212        self._data = data
213        self.x = []
214        self.= []
215       
216        self.x_axis_label = None
217        self.y_axis_label = None
218        self.x_axis_value = None
219        self.y_axis_value = None
220        self.x_axis_unit = None
221        self.y_axis_unit = None
222        self.plot_button = None
223        self.grid = None
224        self.layout_grid()
225        self.layout_plotting_area()
226        self.SetSizer(self.vbox)
227       
228    def set_data(self, data):
229        """
230        """
231        if self.grid is not None:
232            self.grid.set_data(data)
233       
234    def set_xaxis(self, label="", x=None) :
235        if x is None:
236            x = []
237        self.x = x
238        self.x_axis_value.SetValue("%s[:]" % str(label))
239        self.x_axis_label.SetValue(str(label))
240       
241    def set_yaxis(self, label="", y=None) :
242        if y is None:
243            y = []
244        self.y = y
245        self.y_axis_value.SetValue("%s[:]" % str(label))
246        self.y_axis_label.SetValue(str(label))
247       
248 
249           
250    def on_plot(self, event):
251        """
252        plotting
253        """ 
254        new_plot = Data1D(x=self.x, y=self.y)
255        new_plot.id =  wx.NewId()
256        new_plot.group_id = wx.NewId()
257        title = "%s vs %s" % (self.y_axis_label.GetValue(), self.x_axis_label.GetValue())
258        new_plot.xaxis(self.x_axis_label.GetValue(), self.x_axis_unit.GetValue())
259        new_plot.yaxis(self.y_axis_label.GetValue(), self.y_axis_unit.GetValue())
260        wx.PostEvent(self.parent.parent, 
261                             NewPlotEvent(plot=new_plot, group_id=str(new_plot.group_id), title ="batch"))   
262    def layout_grid(self):
263        """
264        Draw the area related to the grid
265        """
266        self.grid = Notebook(parent=self)
267        self.grid.set_data(self._data)
268        #self.grid = Table(parent=self, data=self._data)
269        #vbox = wx.BoxSizer(wx.HORIZONTAL)
270        self.grid_sizer.Add(self.grid, 1, wx.EXPAND, 0)
271        #self.panel_grid.SetSizer(vbox)
272       
273    def layout_grid1(self):
274        """
275        Draw the area related to the grid
276        """
277        self.grid = Table(parent=self.panel_grid, data=self._data)
278        vbox = wx.BoxSizer(wx.HORIZONTAL)
279        vbox.Add(self.grid, 1, wx.EXPAND, 0)
280        self.panel_grid.SetSizer(vbox)
281       
282    def layout_plotting_area(self):
283        """
284        Draw area containing options to plot
285        """
286        self.x_axis_label = wx.TextCtrl(self, -1)
287       
288        self.y_axis_label = wx.TextCtrl(self, -1)
289       
290        self.x_axis_value = wx.TextCtrl(self, -1)
291        self.y_axis_value = wx.TextCtrl(self, -1)
292       
293        self.x_axis_unit = wx.TextCtrl(self, -1)
294        self.y_axis_unit = wx.TextCtrl(self, -1)
295        self.plot_button = wx.Button(self, -1, "Plot")
296        wx.EVT_BUTTON(self, self.plot_button.GetId(), self.on_plot)
297        self.plotting_sizer.AddMany([(wx.StaticText(self, -1, "x"), 1, wx.LEFT, 10),
298                                     (self.x_axis_label,  wx.TOP|wx.BOTTOM|wx.LEFT, 10),
299                                      (self.x_axis_value,  wx.TOP|wx.BOTTOM|wx.LEFT, 10),
300                                     (wx.StaticText(self, -1 , "unit"), 1, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE|wx.EXPAND, 0),
301                                      (self.x_axis_unit),
302                                      (wx.StaticText(self, -1, "y"), 1, wx.LEFT, 10),
303                                       (self.y_axis_label,  wx.TOP|wx.BOTTOM|wx.LEFT, 10),
304                                      (self.y_axis_value, wx.TOP|wx.BOTTOM|wx.LEFT, 10),
305                                     (wx.StaticText(self, -1 , "unit"), 1, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE|wx.EXPAND, 0),
306                                      (self.y_axis_unit),
307                                      (-1, -1),
308                                      (-1, -1),
309                                      (-1, -1),
310                                      (self.plot_button, 1, wx.LEFT, 30)])
311   
312       
313    def add_column(self):
314        """
315        """
316        if self.grid is not None:
317            self.grid.add_column()
318       
319    def on_remove_column(self):
320        """
321        """
322        if self.grid is not None:
323            self.grid.on_remove_column()
324       
325       
326class GridFrame(wx.Frame):
327    def __init__(self, parent=None, data=None, id=-1, title="Batch Results", size=(500, 400)):
328        wx.Frame.__init__(self, parent=parent, id=id, title=title, size=size)
329        self.parent = parent
330        self.panel = GridPanel(self, data)
331        menubar = wx.MenuBar()
332        self.SetMenuBar(menubar)
333        edit = wx.Menu()
334        menubar.Append(edit, "&Edit")
335        self.Bind(wx.EVT_CLOSE, self.on_close)
336       
337        add_col_menu = edit.Append(wx.NewId(), 'Add Column', 'Add column')
338        wx.EVT_MENU(self, add_col_menu.GetId(), self.on_add_column)
339        remove_col_menu = edit.Append(wx.NewId(), 'Remove Column', 
340                                      'Remove Column')
341        wx.EVT_MENU(self, remove_col_menu.GetId(), self.on_remove_column)
342
343    def on_close(self, event):
344        """
345        """
346        self.Hide()
347       
348    def on_remove_column(self, event):
349        """
350        Remove the selected column to the grid
351        """
352        self.panel.on_remove_column()
353       
354    def on_add_column(self, event):
355        """
356        Append a new column to the grid
357        """
358        self.panel.add_column()
359       
360    def set_data(self, data):
361        """
362        """
363        self.panel.set_data(data)
364     
365     
366if __name__ == "__main__":
367    app = wx.App()
368   
369    try:
370        data = {}
371        j = 0
372        for i in range(4):
373            j += 1
374            data["index"+str(i)] = [i/j, i*j, i, i+j]
375           
376        frame = GridFrame(data=data)
377        frame.Show(True)
378    except:
379        print sys.exc_value
380       
381    app.MainLoop()
Note: See TracBrowser for help on using the repository browser.