source: branches/alma/python/casatoolbar.py @ 1765

Last change on this file since 1765 was 1765, checked in by Kana Sugimoto, 14 years ago

New Development: No

JIRA Issue: No (bug fixes)

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: Quit plotter with buttons and replot

Put in Release Notes: No

Module(s): sdplot

Description: fixed bugs for the plotter to work fine for replotting once after quitted


File size: 8.3 KB
Line 
1import os
2import matplotlib
3######################################
4##    Add CASA custom toolbar       ##
5######################################
6class CustomToolbarCommon:
7    def __init__(self,parent):
8        self.plotter=parent
9        #self.figmgr=self.plotter._plotter.figmgr
10
11    ### select the nearest spectrum in pick radius
12    ###    and display spectral value on the toolbar.
13    def _select_spectrum(self,event):
14        # Do not fire event when in zooming/panning mode
15        mode = self.figmgr.toolbar.mode
16        if not mode =='':
17                return
18        # When selected point is out of panels
19        if event.inaxes == None:
20                return
21        # If not left button
22        if event.button != 1:
23                return
24
25        xclick=event.xdata
26        yclick=event.ydata
27        dist2=1000.
28        pickline=None
29        # If the pannel has picable objects
30        pflag=False
31        for lin in event.inaxes.lines:
32                if not lin.pickable(): continue
33                pflag=True
34                flag,pind = lin.contains(event)
35                if not flag: continue
36                # Get nearest point
37                inds = pind['ind']
38                xlin = lin.get_xdata()
39                ylin = lin.get_ydata()
40                for i in inds:
41                        d2=(xlin[i]-xclick)**2+(ylin[i]-yclick)**2
42                        if dist2 >= d2:
43                                dist2 = d2
44                                pickline = lin
45        # No pickcable line in the pannel
46        if not pflag: return
47        # Pickable but too far from mouse position
48        elif pickline is None:
49                picked='No line selected.'
50                self.figmgr.toolbar.set_message(picked)
51                return
52        del pind, inds, xlin, ylin
53        # Spectra are Picked
54        theplot = self.plotter._plotter
55        thetoolbar = self.figmgr.toolbar
56        thecanvas = self.figmgr.canvas
57        # Disconnect the default motion notify event
58        # Notice! the other buttons are also diabled!!!
59        thecanvas.mpl_disconnect(thetoolbar._idDrag)
60        # Get picked spectrum
61        xdata = pickline.get_xdata()
62        ydata = pickline.get_ydata()
63        titl=pickline.get_label()
64        titp=event.inaxes.title.get_text()
65        panel0=event.inaxes
66        picked="Selected: '"+titl+"' in panel '"+titp+"'."
67        thetoolbar.set_message(picked)
68        # Generate a navigation window
69        #naviwin=Navigationwindow(titp,titl)
70        #------------------------------------------------------#
71        # Show spectrum data at mouse position
72        def spec_data(event):
73                # Getting spectrum data of neiboring point
74                xclick=event.xdata
75                if event.inaxes != panel0:
76                        return
77                ipoint=len(xdata)-1
78                for i in range(len(xdata)-1):
79                        xl=xclick-xdata[i]
80                        xr=xclick-xdata[i+1]
81                        if xl*xr <= 0.:
82                                ipoint = i
83                                break
84                # Output spectral value on the navigation window
85                posi='[ %s, %s ]:  x = %.2f   value = %.2f'\
86                      %(titl,titp,xdata[ipoint],ydata[ipoint])
87                #naviwin.posi.set(posi)
88                thetoolbar.set_message(posi)
89        #------------------------------------------------------#
90        # Disconnect from mouse events
91        def discon(event):
92                #naviwin.window.destroy()
93                theplot.register('motion_notify',None)
94                # Re-activate the default motion_notify_event
95                thetoolbar._idDrag=thecanvas.mpl_connect('motion_notify_event', thetoolbar.mouse_move)
96                theplot.register('button_release',None)
97                return
98        #------------------------------------------------------#
99        # Show data value along with mouse movement
100        theplot.register('motion_notify',spec_data)
101        # Finish events when mouse button is released
102        theplot.register('button_release',discon)
103
104
105    ### Calculate statistics of the selected area.
106    def _single_mask(self,event):
107        # Do not fire event when in zooming/panning mode
108        if not self.figmgr.toolbar.mode == '': return
109        # When selected point is out of panels
110        if event.inaxes == None:
111                return
112        if event.button ==1: baseinv=True
113        elif event.button == 3: baseinv=False
114        else: return
115
116        def _calc_stats():
117                msk=mymask.get_mask()
118                mymask.scan.stats(stat='max',mask=msk)
119                mymask.scan.stats(stat='min',mask=msk)
120                mymask.scan.stats(stat='sum',mask=msk)
121                mymask.scan.stats(stat='mean',mask=msk)
122                mymask.scan.stats(stat='median',mask=msk)
123                mymask.scan.stats(stat='rms',mask=msk)
124                mymask.scan.stats(stat='stddev',mask=msk)
125
126        # Interactive mask definition
127        from asap.interactivemask import interactivemask
128        mymask=interactivemask(plotter=self.plotter,scan=self.plotter._data)
129        # Create initial mask
130        mymask.set_basemask(invert=baseinv)
131        # Inherit event
132        mymask.set_startevent(event)
133        # Set callback func
134        mymask.set_callback(_calc_stats)
135        # Selected mask
136        mymask.select_mask(once=True,showmask=False)
137
138#####################################
139##    Backend dependent Classes    ##
140#####################################
141### TkAgg
142if matplotlib.get_backend() == 'TkAgg': import Tkinter as Tk
143class CustomToolbarTkAgg(CustomToolbarCommon):
144    def __init__(self,parent):
145        from asap.asapplotter import asapplotter
146        if not isinstance(parent,asapplotter): return False
147        if not parent._plotter: return False
148        self._p=parent._plotter
149        self.figmgr=self._p.figmgr
150        self.canvas=self.figmgr.canvas
151        self.custombar=None
152        self.mode=''
153        self.button=True
154        self._add_custom_toolbar()
155        CustomToolbarCommon.__init__(self,parent)
156
157    def _add_custom_toolbar(self):
158        self.custombar=Tk.Frame(master=self.figmgr.window)
159        self.bSpec=self._NewButton(master=self.custombar,
160                                   text='spec value',
161                                   command=self.spec_show)
162        self.bStat=self._NewButton(master=self.custombar,
163                                   text='statistics',
164                                   command=self.stat_cal)
165        self.bQuit=self._NewButton(master=self.custombar,
166                                   text='Quit',
167                                   command=self.quit,
168                                   side=Tk.RIGHT)
169        self.custombar.pack(side=Tk.BOTTOM,fill=Tk.BOTH)
170       
171        ### temporary added
172        #self.bStat.config(state=Tk.DISABLED)
173        ###
174        #self.bSpec.config(relief='sunken')
175        #self.bStat.config(relief='raised')
176        #self.button=True
177        #self.spec_show()
178        self.disable_button()
179        return self
180
181    def _NewButton(self, master, text, command, side=Tk.LEFT):
182        if(os.uname()[0] == 'Darwin'):
183            b = Tk.Button(master=master, text=text, command=command)
184        else:
185            b = Tk.Button(master=master, text=text, padx=2, pady=2, command=command)
186        b.pack(side=side)
187        return b
188       
189    def spec_show(self):
190        if not self.figmgr.toolbar.mode == '' or not self.button: return
191        self.figmgr.toolbar.set_message('spec value: drag on a spec')
192        if self.mode == 'spec': return
193        self.bStat.config(relief='raised')
194        self.bSpec.config(relief='sunken')
195        self.mode='spec'
196        self.__disconnect_event()
197        #self.canvas.mpl_connect('button_press_event',self._select_spectrum)
198        self._p.register('button_press',self._select_spectrum)
199
200    def stat_cal(self):
201        if not self.figmgr.toolbar.mode == '' or not self.button: return
202        self.figmgr.toolbar.set_message('statistics: select a region')
203        if self.mode == 'stat': return
204        self.bSpec.config(relief='raised')
205        self.bStat.config(relief='sunken')
206        self.mode='stat'
207        self.__disconnect_event()
208        self._p.register('button_press',self._single_mask)
209
210    def quit(self):
211        self.__disconnect_event()
212        #self.delete_bar()
213        self.disable_button()
214        self.figmgr.window.wm_withdraw()
215
216    def enable_button(self):
217        if self.button: return
218        self.bSpec.config(state=Tk.NORMAL)
219        self.bStat.config(state=Tk.NORMAL)
220        self.button=True
221        self.spec_show()
222       
223    def disable_button(self):
224        if not self.button: return
225        self.bStat.config(relief='raised',state=Tk.DISABLED)
226        self.bSpec.config(relief='raised',state=Tk.DISABLED)
227        self.button=False
228        self.mode=''
229        self.__disconnect_event()
230
231    def delete_bar(self):
232        self.__disconnect_event()
233        self.custombar.destroy()
234        self.custombar=None
235
236    def __disconnect_event(self):
237        #idP=self.figmgr.toolbar._idPress
238        #idR=self.figmgr.toolbar._idRelease
239        #if idP is not None:
240        #    self.canvas.mpl_disconnect(idP)
241        #    self.figmgr.toolbar._idPress=None
242        #if idR is not None:
243        #    self.canvas.mpl_disconnect(idR)
244        #    self.figmgr.toolbar._idRelease=None
245        self._p.register('button_press',None)
246        self._p.register('button_release',None)
Note: See TracBrowser for help on using the repository browser.