Viewing contents of file '../idllib/contrib/tappin/graffer/graff_pfunct.pro'
;+
; GRAFF_PFUNCT
; Define a parametric function to graffer.
;
; Usage:
; ichange=graff_pfunct(pdefs)
;
; Return value:
; ichange int 1 if the DO button was used, 0 if cancel
;
; Argument:
; pdefs struct in/out The Graffer plot structure
;
; History:
; Original (after graff_funct): 5/10/95; SJT
; Made to function returning "cancel" state: 18/12/96; SJT
; Add CAPTURE key to text inputs: 6/2/97; SJT
;-
function Pfunct_event, event
widget_control, event.id, get_uvalue = but
iexit = 0
funct = strarr(2)
numpts = 0
range = fltarr(2)
widget_control, event.handler, get_uvalue = uvs, /no_copy
case but of
'ACTION': begin
if (event.value eq 1) then begin
for j = 0, 1 do begin
widget_control, uvs.fid(j), get_value = f
funct(j) = f
endfor
widget_control, uvs.nid, get_value = numpts
widget_control, uvs.minid, get_value = rng
range(0) = rng
widget_control, uvs.maxid, get_value = rng
range(1) = rng
endif
iexit = event.value
end
'MIN': grf_focus_enter, uvs.minid
'MAX': grf_focus_enter, uvs.nid
'NUM': grf_focus_enter, uvs.fid(0)
'FUNX': grf_focus_enter, uvs.fid(1)
'FUNY': grf_focus_enter, uvs.maxid
'POP': begin
widget_control, event.top, /show
widget_control, event.id, timer = 2.
end
endcase
widget_control, event.handler, set_uvalue = uvs, /no_copy
return, {id:event.id, top:event.top, handler:event.handler, $
Exited:iexit, funct:funct, numpts:numpts, range:range}
end
function Graff_pfunct, pdefs
uvs = { $
Fid: lonarr(2), $
Nid: 0l, $
Minid: 0l, $
Maxid: 0l $
}
; Find if the dataset is already defined as a function
handle_value, pdefs.data, data, /no_copy
handle_value, data(pdefs.cset).xydata, xydata, /no_copy
if (data(pdefs.cset).type eq -3) then begin
funct = xydata.funct
range = xydata.range
numpts = data(pdefs.cset).ndata
dflag = 0b
endif else begin
funct = strarr(2)
range = findgen(2)
numpts = 25
dflag = data(pdefs.cset).ndata gt 0
endelse
widget_control, pdefs.ids.graffer, sensitive = 0
tlb = widget_base(title = 'Graffer Function Plot', group_leader = $
pdefs.ids.graffer, resource = 'Graffer')
base = widget_base(tlb, /column)
; The actual function definition
if (dflag) then $
junk = widget_text(base, xsize = 50, ysize = 4, value = $
['CURRENT DATA SET IS XY DATA OR A', $
'SIMPLE FUNCTION, ENTERING A', $
'PARAMETRIC FUNCTION WILL OVERWRITE IT', $
'USE "CANCEL" NOW TO KEEP IT' $
] $
)
uvs.fid(0) = graff_enter(base, xsize = 40, value = $
funct(0), uvalue = 'FUNX', label = 'X = ', $
/capture)
uvs.fid(1) = graff_enter(base, xsize = 40, value = $
funct(1), uvalue = 'FUNY', label = 'Y = ', $
/capture)
; Parameter range
rgb = widget_base(base, /row, uvalue = 'POP')
uvs.minid = graff_enter(rgb, /float, xsize = 10, uvalue = $
'MIN', value = range(0), format = "(g10.3)", $
label = 'T range: Min:', /capture)
uvs.maxid = graff_enter(rgb, /float, xsize = 10, uvalue = $
'MAX', value = range(1), format = "(g10.3)", $
label = ' Max:', /capture)
; Number of points
uvs.nid = graff_enter(base, /int, xsize = 5, uvalue = $
'NUM', value = numpts, format = "(I0)", $
label = 'Number of function evaluations:', $
/capture)
; Control
junk = cw_bgroup(base, ['Do it', 'Cancel'], /row, uvalue = 'ACTION', $
button_uvalue = [1, -1])
; Realise and do RYO event handling
widget_control, tlb, /real
widget_control, base, set_uvalue = uvs, event_func = 'pfunct_event', $
/no_copy
if (pdefs.popflag) then widget_control, rgb, timer = 2.
repeat begin
ev = widget_event(base)
endrep until (ev.exited ne 0)
widget_control, tlb, /destroy
widget_control, pdefs.ids.graffer, sensitive = 1
if (ev.exited eq -1) then begin ; The DONT button
handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
handle_value, pdefs.data, data, /no_copy, /set
return, 0
endif
xydata = {graff_pfunct, $
Range:ev.range, $
Funct:ev.funct}
data(pdefs.cset).ndata = ev.numpts
data(pdefs.cset).type = -3
handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
handle_value, pdefs.data, data, /no_copy, /set
return, 1
end