Viewing contents of file '../idllib/contrib/windt/track_plot.pro'
;+
; NAME:
;
; TRACK_PLOT
;
; PURPOSE:
;
; A procedure to plot X vs Y in a widget, track the cursor
; position, and interactively display the Y(X) value.
;
; CALLING SEQUENCE:
;
; TRACK_PLOT,X,Y
;
; INPUTS:
;
; X, Y - 1-D arrays
;
; KEYWORD PARAMETERS:
;
; WXSIZE - Draw widget X size, in pixels. (Default=640)
;
; WYSIZE - Draw widget Y size, in pixels. (Default=480)
;
; CROSSHAIR - Set this to display a crosshair at the current
; Y(X) value.
;
; plus all valid IDL PLOT keywords.
;
; RESTRICTIONS:
;
; Requires widgets. Requires use of the VALUE_TO_INDEX function
; in the windt library.
;
; EXAMPLE:
;
; Create some X,Y data and plot it using TRACK_PLOT:
;
; X=VECTOR(0.,100.,256)
; Y=SIN(X/5.)*EXP(-X/20.)
; TRACK_PLOT,X,Y
;
; MODIFICATION HISTORY:
;
; D. L. Windt, Bell Laboratories, August 1997
; windt@bell-labs.com
;
; March, 1998 - Added crosshair display option and CROSSHAIR
; keyword.
;
;-
pro track_plot_event,event
;
; procedure event handler
;
;; return on errors:
on_error,2
;; get event uvalue:
widget_control,event.id,get_uvalue=uvalue
;; deal with event:
case uvalue of
'done': begin
;; destroy widget
widget_control,event.top,/destroy
end
'draw': begin
;; extract variables from base:
widget_control,event.top,get_uvalue=s,/no_copy
;; convert to data coordinates:
cc=convert_coord(event.x,event.y,/device,/to_data)
;; convert from wavelength/energy value to array index:
i=value_to_index(s.x,cc(0))
x=strtrim(s.x(i),2)
y=strtrim(s.y(i),2)
;; display x,y values:
widget_control,s.label,set_value='y('+x+') = '+y
if s.crosshair then begin
if !x.type then xcrange=10^!x.crange else xcrange=!x.crange
if !y.type then ycrange=10^!y.crange else ycrange=!y.crange
;; draw new crosshair, and erase old ones:
device,set_graphics=6 ; use XOR
if s.nolast eq 0 then $
plots,[s.last_x,s.last_x],ycrange
plots,[x,x],ycrange
if s.nolast eq 0 then $
plots,xcrange,[s.last_y,s.last_y]
plots,xcrange,[y,y]
device,set_graphics=3 ; back to default.
;; set last x and y:
s.last_x=x
s.last_y=y
s.nolast=0
endif
;; restore variables to base:
widget_control,event.top,set_uvalue=s,/no_copy
end
endcase
return
end
pro track_plot,x,y,_extra=_extra,wxsize=wxsize,wysize=wysize, $
crosshair=crosshair
;; return on errors:
on_error,2
;; check for parameters:
if n_params() ne 2 then message,'usage: track_plot,x,y'
;; define draw widget dimensions:
if n_elements(wxsize) eq 0 then wxsize=640
if n_elements(wysize) eq 0 then wysize=480
;; make widget:
base=widget_base(title='Track Plot',/column)
label=widget_label(base,value=string(replicate(50B,60)),/align_left)
draw=widget_draw(base,xsize=wxsize,ysize=wysize,uvalue='draw',/motion_events)
button=widget_button(base,value='Done',uvalue='done',/align_center)
;; save variables in base uvalue:
widget_control,base,set_uvalue={x:x,y:y,label:label, $
last_x:0.,last_y:0., $
nolast:1,crosshair:keyword_set(crosshair)}
;; unmap widget:
widget_control,base,map=0
;; realize widget:
widget_control,base,/realize
;; draw plot:
plot,x,y,_extra=_extra
;; clear label:
widget_control,label,set_value=''
;; map widget:
widget_control,base,map=1
;; manage widget
xmanager,'track_plot',base
return
end