source: sasview/guiframe/local_perspectives/plotting/plotting.py @ 792d7665

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 792d7665 was 41d466f, checked in by Mathieu Doucet <doucetm@…>, 16 years ago

Initial import.

  • Property mode set to 100644
File size: 7.7 KB
RevLine 
[41d466f]1"""
2This software was developed by the University of Tennessee as part of the
3Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
4project funded by the US National Science Foundation.
5
6See the license text in license.txt
7
8copyright 2008, University of Tennessee
9"""
10
11
12import wx
13import sys
14from sans.guitools.PlotPanel import PlotPanel
15from sans.guitools.plottables import Graph
16from sans.guicomm.events import EVT_NEW_PLOT
17
18class PanelMenu(wx.Menu):
19    plots = None
20   
21    def set_plots(self, plots):
22        self.plots = plots
23   
24
25class View1DPanel(PlotPanel):
26    """
27        Plot panel for use with the GUI manager
28    """
29   
30    ## Internal name for the AUI manager
31    window_name = "plotpanel"
32    ## Title to appear on top of the window
33    window_caption = "Plot Panel"
34    ## Flag to tell the GUI manager that this panel is not
35    #  tied to any perspective
36    ALWAYS_ON = True
37   
38    def __init__(self, parent, id = -1, color = None,\
39        dpi = None, style = wx.NO_FULL_REPAINT_ON_RESIZE, **kwargs):
40        """
41            Initialize the panel
42        """
43        PlotPanel.__init__(self, parent, id = id, style = style, **kwargs)
44       
45        ## Reference to the parent window
46        self.parent = parent
47        ## Plottables
48        self.plots = {}
49       
50        ## Unique ID (from gui_manager)
51        self.uid = None
52       
53        ## Graph       
54        self.graph = Graph()
55        self.graph.xaxis("\\rm{Q}", 'A^{-1}')
56        self.graph.yaxis("\\rm{Intensity} ","cm^{-1}")
57        self.graph.render(self)
58       
59    def _onEVT_1DREPLOT(self, event):
60        """
61            Data is ready to be displayed
62            @param event: data event
63        """
64        #TODO: Check for existence of plot attribute
65       
66        is_new = True
67        if event.plot.name in self.plots.keys():
68            is_new = False
69       
70        if is_new:
71            self.plots[event.plot.name] = event.plot
72            self.graph.add(self.plots[event.plot.name])
73        else:
74            self.plots[event.plot.name].x = event.plot.x   
75            self.plots[event.plot.name].y = event.plot.y   
76            self.plots[event.plot.name].dy = event.plot.dy 
77            if hasattr(event.plot, 'dx') and hasattr(self.plots[event.plot.name], 'dx'):
78                self.plots[event.plot.name].dx = event.plot.dx   
79 
80       
81        # Check axis labels
82        #TODO: Should re-factor this
83        if event.plot._xunit != self.graph.prop["xunit"]:
84            self.graph.xaxis(event.plot._xaxis, event.plot._xunit)
85           
86        if event.plot._yunit != self.graph.prop["yunit"]:
87            self.graph.yaxis(event.plot._yaxis, event.plot._yunit)
88     
89        self.graph.render(self)
90        self.subplot.figure.canvas.draw_idle()
91
92    def onContextMenu(self, event):
93        """
94            1D plot context menu
95            @param event: wx context event
96        """
97        #slicerpop = wx.Menu()
98        slicerpop = PanelMenu()
99        slicerpop.set_plots(self.plots)
100               
101        # Various plot options
102        id = wx.NewId()
103        slicerpop.Append(id,'&Save image', 'Save image as PNG')
104        wx.EVT_MENU(self, id, self.onSaveImage)
105       
106        slicerpop.AppendSeparator()
107        item_list = self.parent.get_context_menu()
108        if not item_list==None:
109            for item in item_list:
110                try:
111                    id = wx.NewId()
112                    slicerpop.Append(id, item[0], item[1])
113                    wx.EVT_MENU(self, id, item[2])
114                except:
115                    print sys.exc_value
116                    print RuntimeError, "View1DPanel.onContextMenu: bad menu item"
117       
118        slicerpop.AppendSeparator()
119       
120        id = wx.NewId()
121        slicerpop.Append(id, '&Toggle Linear/Log scale')
122        wx.EVT_MENU(self, id, self._onToggleScale)
123
124        pos = event.GetPosition()
125        pos = self.ScreenToClient(pos)
126        self.PopupMenu(slicerpop, pos)
127   
128    def _onToggleScale(self, event):
129        if self.get_yscale() == 'log':
130            self.set_yscale('linear')
131        else:
132            self.set_yscale('log')
133        self.subplot.figure.canvas.draw_idle()   
134   
135class Plugin:
136    """
137        Plug-in class to be instantiated by the GUI manager
138    """
139   
140    def __init__(self):
141        """
142            Initialize the plug-in
143        """
144        ## Plug-in name
145        self.sub_menu = "Plotting"
146       
147        ## Reference to the parent window
148        self.parent = None
149       
150        ## List of panels for the simulation perspective (names)
151        self.perspective = []
152       
153        ## Plot panels
154        self.plot_panels = []
155       
156
157    def populate_menu(self, id, parent):
158        """
159            Create a 'Plot' menu to list the panels
160            available for displaying
161            @param id: next available unique ID for wx events
162            @param parent: parent window
163        """
164        self.menu = wx.Menu()
165        return [(id, self.menu, "Plot")]
166   
167       
168    def get_panels(self, parent):
169        """
170            Create and return a list of panel objects
171        """
172        ## Save a reference to the parent
173        self.parent = parent
174        # Connect to plotting events
175        self.parent.Bind(EVT_NEW_PLOT, self._on_plot_event)
176       
177        # We have no initial panels for this plug-in
178        return []
179   
180    def get_perspective(self):
181        """
182            Get the list of panel names for this perspective
183        """
184        return self.perspective
185   
186    def on_perspective(self, event):
187        """
188            Call back function for the perspective menu item.
189            We notify the parent window that the perspective
190            has changed.
191            @param event: menu event
192        """
193        self.parent.set_perspective(self.perspective)
194   
195    def post_init(self):
196        """
197            Post initialization call back to close the loose ends
198            [Somehow openGL needs this call]
199        """
200        pass
201   
202    def _on_show_panel(self, event):
203        print "_on_show_panel"
204   
205    def _on_plot_event(self, event):
206        """
207            A new plottable is being shipped to the plotting plug-in.
208            Check whether we have a panel to put in on, or create
209            a new one
210            @param event: EVT_NEW_PLOT event
211        """
212        # Check whether we already have a graph with the same units
213        # as the plottable we just received.
214        is_available = False
215        for panel in self.plot_panels:
216            if event.plot._xunit == panel.graph.prop["xunit"] \
217            and event.plot._yunit == panel.graph.prop["yunit"]:
218                is_available = True
219                panel._onEVT_1DREPLOT(event)
220                self.parent.show_panel(panel.uid)
221       
222        # Create a new plot panel if none was available       
223        if not is_available:
224            new_panel = View1DPanel(self.parent, -1, style=wx.RAISED_BORDER)
225            if hasattr(event, "title"):
226                new_panel.window_caption = event.title
227                new_panel.window_name = event.title
228           
229            event_id = self.parent.popup_panel(new_panel)
230            self.menu.Append(event_id, new_panel.window_caption, 
231                             "Show %s plot panel" % new_panel.window_caption)
232           
233            # Set UID to allow us to reference the panel later
234            new_panel.uid = event_id
235           
236            # Ship the plottable to its panel
237            new_panel._onEVT_1DREPLOT(event)
238            self.plot_panels.append(new_panel)       
239           
240        return
241       
Note: See TracBrowser for help on using the repository browser.