source: trunk/python/casatoolbar.py@ 1980

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

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: Yes

What Interface Changed: the "spec value" button is removed from the toolbar.

Test Programs: plot spectra with asap plotter

Put in Release Notes: Yes

Module(s): asapplotter

Description: The "spec value" mode is set to the default status of asap plotter and the button for it is removed.


File size: 12.1 KB
Line 
1import os
2import matplotlib
3
4######################################
5## Add CASA custom toolbar ##
6######################################
7class CustomToolbarCommon:
8 def __init__(self,parent):
9 self.plotter=parent
10 #self.figmgr=self.plotter._plotter.figmgr
11
12 ### select the nearest spectrum in pick radius
13 ### and display spectral value on the toolbar.
14 def _select_spectrum(self,event):
15 # Do not fire event when in zooming/panning mode
16 mode = self.figmgr.toolbar.mode
17 if not mode == '':
18 return
19 # When selected point is out of panels
20 if event.inaxes == None:
21 return
22 # If not left button
23 if event.button != 1:
24 return
25
26 xclick=event.xdata
27 yclick=event.ydata
28 dist2=1000.
29 pickline=None
30 # If the pannel has picable objects
31 pflag=False
32 for lin in event.inaxes.lines:
33 if not lin.pickable():
34 continue
35 pflag=True
36 flag,pind = lin.contains(event)
37 if not flag:
38 continue
39 # Get nearest point
40 inds = pind['ind']
41 xlin = lin.get_xdata()
42 ylin = lin.get_ydata()
43 for i in inds:
44 d2=(xlin[i]-xclick)**2+(ylin[i]-yclick)**2
45 if dist2 >= d2:
46 dist2 = d2
47 pickline = lin
48 # No pickcable line in the pannel
49 if not pflag:
50 return
51 # Pickable but too far from mouse position
52 elif pickline is None:
53 picked='No line selected.'
54 self.figmgr.toolbar.set_message(picked)
55 return
56 del pind, inds, xlin, ylin
57 # Spectra are Picked
58 theplot = self.plotter._plotter
59 thetoolbar = self.figmgr.toolbar
60 thecanvas = self.figmgr.canvas
61 # Disconnect the default motion notify event
62 # Notice! the other buttons are also diabled!!!
63 thecanvas.mpl_disconnect(thetoolbar._idDrag)
64 # Get picked spectrum
65 xdata = pickline.get_xdata()
66 ydata = pickline.get_ydata()
67 titl=pickline.get_label()
68 titp=event.inaxes.title.get_text()
69 panel0=event.inaxes
70 picked="Selected: '"+titl+"' in panel '"+titp+"'."
71 thetoolbar.set_message(picked)
72 # Generate a navigation window
73 #naviwin=Navigationwindow(titp,titl)
74 #------------------------------------------------------#
75 # Show spectrum data at mouse position
76 def spec_data(event):
77 # Getting spectrum data of neiboring point
78 xclick=event.xdata
79 if event.inaxes != panel0:
80 return
81 ipoint=len(xdata)-1
82 for i in range(len(xdata)-1):
83 xl=xclick-xdata[i]
84 xr=xclick-xdata[i+1]
85 if xl*xr <= 0.:
86 ipoint = i
87 break
88 # Output spectral value on the navigation window
89 posi='[ %s, %s ]: x = %.2f value = %.2f'\
90 %(titl,titp,xdata[ipoint],ydata[ipoint])
91 #naviwin.posi.set(posi)
92 thetoolbar.set_message(posi)
93 #------------------------------------------------------#
94 # Disconnect from mouse events
95 def discon(event):
96 #naviwin.window.destroy()
97 theplot.register('motion_notify',None)
98 # Re-activate the default motion_notify_event
99 thetoolbar._idDrag=thecanvas.mpl_connect('motion_notify_event',
100 thetoolbar.mouse_move)
101 theplot.register('button_release',None)
102 return
103 #------------------------------------------------------#
104 # Show data value along with mouse movement
105 theplot.register('motion_notify',spec_data)
106 # Finish events when mouse button is released
107 theplot.register('button_release',discon)
108
109
110 ### Calculate statistics of the selected area.
111 def _single_mask(self,event):
112 # Do not fire event when in zooming/panning mode
113 if not self.figmgr.toolbar.mode == '':
114 return
115 # When selected point is out of panels
116 if event.inaxes == None:
117 return
118 if event.button ==1:
119 baseinv=True
120 elif event.button == 3:
121 baseinv=False
122 else:
123 return
124
125 def _calc_stats():
126 msk=mymask.get_mask()
127 mymask.scan.stats(stat='max',mask=msk)
128 mymask.scan.stats(stat='min',mask=msk)
129 mymask.scan.stats(stat='sum',mask=msk)
130 mymask.scan.stats(stat='mean',mask=msk)
131 mymask.scan.stats(stat='median',mask=msk)
132 mymask.scan.stats(stat='rms',mask=msk)
133 mymask.scan.stats(stat='stddev',mask=msk)
134
135 # Interactive mask definition
136 from asap.interactivemask import interactivemask
137 mymask=interactivemask(plotter=self.plotter,scan=self.plotter._data)
138 # Create initial mask
139 mymask.set_basemask(invert=baseinv)
140 # Inherit event
141 mymask.set_startevent(event)
142 # Set callback func
143 mymask.set_callback(_calc_stats)
144 # Selected mask
145 mymask.select_mask(once=True,showmask=False)
146
147 def _mod_note(self,event):
148 # Do not fire event when in zooming/panning mode
149 if not self.figmgr.toolbar.mode == '':
150 return
151 if event.button ==1:
152 self.notewin.load_textwindow(event)
153 elif event.button == 3 and self._note_picked(event):
154 self.notewin.load_modmenu(event)
155 return
156
157 def _note_picked(self,event):
158 # just briefly check if any texts are picked
159 for textobj in self.canvas.figure.texts:
160 if textobj.contains(event)[0]:
161 return True
162 for ax in self.canvas.figure.axes:
163 for textobj in ax.texts:
164 if textobj.contains(event)[0]:
165 return True
166 #print "No text picked"
167 return False
168
169 def _new_page(self,next=True):
170 self.plotter._plotter.hold()
171 #self.plotter._plotter.clear()
172 self.plotter._plot(self.plotter._data)
173 self.plotter._plotter.release()
174 self.plotter._plotter.tidy()
175 self.plotter._plotter.show(hardrefresh=False)
176
177
178#####################################
179## Backend dependent Classes ##
180#####################################
181### TkAgg
182if matplotlib.get_backend() == 'TkAgg':
183 import Tkinter as Tk
184 from notationwindow import NotationWindowTkAgg
185
186class CustomToolbarTkAgg(CustomToolbarCommon, Tk.Frame):
187 def __init__(self,parent):
188 from asap.asapplotter import asapplotter
189 if not isinstance(parent,asapplotter):
190 return False
191 if not parent._plotter:
192 return False
193 self._p=parent._plotter
194 self.figmgr=self._p.figmgr
195 self.canvas=self.figmgr.canvas
196 self.mode=''
197 self.button=True
198 self._add_custom_toolbar()
199 self.notewin=NotationWindowTkAgg(master=self.canvas)
200 CustomToolbarCommon.__init__(self,parent)
201
202 def _add_custom_toolbar(self):
203 Tk.Frame.__init__(self,master=self.figmgr.window)
204 #self.bSpec=self._NewButton(master=self,
205 # text='spec value',
206 # command=self.spec_show)
207 self.bStat=self._NewButton(master=self,
208 text='statistics',
209 command=self.stat_cal)
210 self.bNote=self._NewButton(master=self,
211 text='notation',
212 command=self.modify_note)
213 #self.bPrev=self._NewButton(master=self,
214 # text='- page',
215 # command=self.prev_page)
216 self.bNext=self._NewButton(master=self,
217 text='+ page',
218 command=self.next_page)
219 if os.uname()[0] != 'Darwin':
220 #self.bPrev.config(padx=5)
221 self.bNext.config(padx=5)
222 self.bQuit=self._NewButton(master=self,
223 text='Quit',
224 command=self.quit,
225 side=Tk.RIGHT)
226 self.pack(side=Tk.BOTTOM,fill=Tk.BOTH)
227
228 self.disable_button()
229 return #self
230
231 def _NewButton(self, master, text, command, side=Tk.LEFT):
232 if os.uname()[0] == 'Darwin':
233 b = Tk.Button(master=master, text=text, command=command)
234 else:
235 b = Tk.Button(master=master, text=text, padx=2, pady=2,
236 command=command)
237 b.pack(side=side)
238 return b
239
240 def spec_show(self):
241 if not self.figmgr.toolbar.mode == '' or not self.button: return
242 self.figmgr.toolbar.set_message('spec value: drag on a spec')
243 if self.mode == 'spec': return
244 #self.bStat.config(relief='raised')
245 #self.bSpec.config(relief='sunken')
246 #self.bNote.config(relief='raised')
247 self.mode='spec'
248 self.notewin.close_widgets()
249 self.__disconnect_event()
250 self._p.register('button_press',self._select_spectrum)
251
252 def stat_cal(self):
253 if not self.figmgr.toolbar.mode == '' or not self.button: return
254 self.figmgr.toolbar.set_message('statistics: select a region')
255 if self.mode == 'stat':
256 # go back to spec mode
257 self.bStat.config(relief='raised')
258 self.spec_show()
259 return
260 #self.bSpec.config(relief='raised')
261 self.bStat.config(relief='sunken')
262 self.bNote.config(relief='raised')
263 self.mode='stat'
264 self.notewin.close_widgets()
265 self.__disconnect_event()
266 self._p.register('button_press',self._single_mask)
267
268 def modify_note(self):
269 if not self.figmgr.toolbar.mode == '': return
270 self.figmgr.toolbar.set_message('text: select a position/text')
271 if self.mode == 'note':
272 self.bNote.config(relief='raised')
273 self.mode='none'
274 self.spec_show()
275 return
276 #self.bSpec.config(relief='raised')
277 self.bStat.config(relief='raised')
278 self.bNote.config(relief='sunken')
279 self.mode='note'
280 self.__disconnect_event()
281 self._p.register('button_press',self._mod_note)
282
283 def prev_page(self):
284 self.figmgr.toolbar.set_message('plotting the previous page')
285 self._new_page(next=False)
286
287 def next_page(self):
288 self.figmgr.toolbar.set_message('plotting the next page')
289 self._new_page(next=True)
290
291 def quit(self):
292 self.__disconnect_event()
293 #self.delete_bar()
294 self.disable_button()
295 self.figmgr.window.wm_withdraw()
296
297 def enable_button(self):
298 if self.button: return
299 #self.bSpec.config(state=Tk.NORMAL)
300 self.bStat.config(state=Tk.NORMAL)
301 self.button=True
302 self.spec_show()
303
304 def disable_button(self):
305 if not self.button: return
306 self.bStat.config(relief='raised', state=Tk.DISABLED)
307 #self.bSpec.config(relief='raised', state=Tk.DISABLED)
308 #self.bPrev.config(state=Tk.DISABLED)
309 #self.bNext.config(state=Tk.DISABLED)
310 self.button=False
311 self.mode=''
312 self.__disconnect_event()
313
314 def enable_next(self):
315 self.bNext.config(state=Tk.NORMAL)
316
317 def disable_next(self):
318 self.bNext.config(state=Tk.DISABLED)
319
320 def enable_prev(self):
321 #self.bPrev.config(state=Tk.NORMAL)
322 pass
323
324 def disable_prev(self):
325 #self.bPrev.config(state=Tk.DISABLED)
326 pass
327
328 def delete_bar(self):
329 self.__disconnect_event()
330 self.destroy()
331
332 def __disconnect_event(self):
333 #idP=self.figmgr.toolbar._idPress
334 #idR=self.figmgr.toolbar._idRelease
335 #if idP is not None:
336 # self.canvas.mpl_disconnect(idP)
337 # self.figmgr.toolbar._idPress=None
338 #if idR is not None:
339 # self.canvas.mpl_disconnect(idR)
340 # self.figmgr.toolbar._idRelease=None
341 self._p.register('button_press',None)
342 self._p.register('button_release',None)
Note: See TracBrowser for help on using the repository browser.