Viewing contents of file '../idllib/contrib/tappin/graffer/graff_tlv.pro'
;+
; GRAFF_TLV
; Construct a graffer data set from top-level variables
;
; Usage:
; ichange = graff_tlv(pdefs)
;
; Return value
; ichange int 1 if changed, 0 if not
;
; Argument:
; pdefs struct in/out The graffer control/data structure
;
; WARNING:
; This routine uses the undocumented IDL internal ROUTINE_NAMES
; to recover values -- it is possible that this could cease to
; work in later IDL releases - though I hope it won't.
;
; History:
; Original: 21/9/95; SJT
; Add x=findgen(ny) when no X variable given: 28/10/96; SJT
; MOve GRF_TLV_GET to a separate file: 6/12/96; SJT
; Made to function returning "cancel" state: 18/12/96; SJT
; Add CAPTURE key to entry boxes: 6/2/97; SJT
;-
function Grf_tlv_event, event
common Gr_tlvs_masks, exlm, exhm, eylm, eyhm
base = widget_info(event.top, /child)
widget_control, base, get_uvalue = uvs, /no_copy
widget_control, event.id, get_uvalue = object
iexit = 0
case object of
'POP': begin
widget_control, event.top, /show
widget_control, event.id, timer = 2
end
'ACTION': if (event.value eq -1) then begin
iexit = -1
endif else begin
iexit = 1
widget_control, uvs.yid, get_value = yvar
y = grf_tlv_get(yvar, ny)
if (ny eq 0) then begin
widget_control, uvs.mid, set_value = 'Y: '+yvar+ $
' Undefined or non-numeric'
iexit = 0
goto, donefor
endif else y = float(y)
widget_control, uvs.xid, get_value = xvar
if (xvar eq '') then begin
x = findgen(ny)
nx = ny
endif else begin
x = grf_tlv_get(xvar, nx)
if (nx eq 0) then begin
widget_control, uvs.mid, set_value = 'X: '+xvar+ $
' Undefined or non-numeric'
iexit = 0
goto, donefor
endif else x = float(x)
endelse
if (nx ne ny) then begin
widget_control, uvs.mid, set_value = 'Length of X and Y must ' + $
'be equal'
iexit = 0
goto, donefor
endif
if (uvs.type ne 0) then begin
nce = ([0, 1, 2, 1, 2, 2, 3, 3, 4])(uvs.type)
errs = fltarr(nce, nx)
irr = 0
if (exlm(uvs.type)) then begin
widget_control, uvs.eloxid, get_value = elvar
if (elvar eq '') then begin
widget_control, uvs.mid, set_value = 'Requested ' + $
'data type needs a lower X error'
iexit = 0
goto, donefor
endif
errtmp = grf_tlv_get(elvar, nerl)
if (nerl ne nx) then begin
widget_control, uvs.mid, set_value = $
'Errors and data must be same length'
iexit = 0
goto, donefor
endif else errs(irr, *) = errtmp
irr = irr+1
endif
if (exhm(uvs.type)) then begin
widget_control, uvs.ehixid, get_value = elvar
if (elvar eq '') then begin
widget_control, uvs.mid, set_value = 'Requested ' + $
'data type needs a upper X error'
iexit = 0
goto, donefor
endif
errtmp = grf_tlv_get(elvar, nerl)
if (nerl ne nx) then begin
widget_control, uvs.mid, set_value = $
'Errors and data must be same length'
iexit = 0
goto, donefor
endif else errs(irr, *) = errtmp
irr = irr+1
endif
if (eylm(uvs.type)) then begin
widget_control, uvs.eloyid, get_value = elvar
if (elvar eq '') then begin
widget_control, uvs.mid, set_value = 'Requested ' + $
'data type needs a lower Y error'
iexit = 0
goto, donefor
endif
errtmp = grf_tlv_get(elvar, nerl)
if (nerl ne nx) then begin
widget_control, uvs.mid, set_value = $
'Errors and data must be same length'
iexit = 0
goto, donefor
endif else errs(irr, *) = errtmp
irr = irr+1
endif
if (eyhm(uvs.type)) then begin
widget_control, uvs.ehiyid, get_value = elvar
if (elvar eq '') then begin
widget_control, uvs.mid, set_value = 'Requested ' + $
'data type needs a upper Y error'
iexit = 0
goto, donefor
endif
errtmp = grf_tlv_get(elvar, nerl)
if (nerl ne nx) then begin
widget_control, uvs.mid, set_value = $
'Errors and data must be same length'
iexit = 0
goto, donefor
endif else errs(irr, *) = errtmp
irr = irr+1
endif
endif
endelse
'X': grf_focus_enter, uvs.yid
'Y': grf_focus_enter, uvs.eloxid
'ELOX': grf_focus_enter, uvs.ehixid
'EHIX': grf_focus_enter, uvs.eloyid
'ELOY': grf_focus_enter, uvs.ehiyid
'EHIY': grf_focus_enter, uvs.xid
'ERRS': begin
uvs.type = event.value
widget_control, uvs.eloxid, sensitive = exlm(uvs.type)
widget_control, uvs.ehixid, sensitive = exhm(uvs.type)
widget_control, uvs.eloyid, sensitive = eylm(uvs.type)
widget_control, uvs.ehiyid, sensitive = eyhm(uvs.type)
end
endcase
Donefor:
if (iexit eq 1) then begin
uvs.x = handle_create()
uvs.y = handle_create()
handle_value, uvs.x, x, /set, /no_copy
handle_value, uvs.y, y, /set, /no_copy
if (uvs.type ge 1) then begin
uvs.err = handle_create()
handle_value, uvs.err, errs, /set, /no_copy
endif
endif
widget_control, base, set_uvalue = uvs, /no_copy
return, {id:event.handler, top:event.top, handler:0l, exited:iexit}
end
function Graff_tlv, pdefs
common Gr_tlvs_masks, exlm, exhm, eylm, eyhm
uvs = { $
Xid: 0l, $
Yid: 0l, $
Eloxid:0l, $
Ehixid:0l, $
Eloyid:0l, $
Ehiyid:0l, $
Errid: 0l, $
Errids:0l, $
Mid: 0l, $
X: 0l, $
Y: 0l, $
Err: 0l, $
Type: 0 $
}
; Check out the type of the current ds
handle_value, pdefs.data, data, /no_copy
fflag = (data(pdefs.cset).type lt 0)
exlm = [0, 0, 0, 1, 1, 1, 1, 1, 1]
exhm = [0, 0, 0, 0, 1, 0, 0, 1, 1]
eylm = [0, 1, 1, 0, 0, 1, 1, 1, 1]
eyhm = [0, 0, 1, 0, 0, 0, 1, 0, 1]
; desensitize the main graffer panel and define the bases for
; this one.
widget_control, pdefs.ids.graffer, sensitive = 0
tlb = widget_base(title = 'Graffer from Variables', $
group_leader = pdefs.ids.graffer, resource = $
'Graffer')
base = widget_base(tlb, /column)
if (fflag) then $
junk = widget_text(base, xsize = 30, ysize = 3, value = $
['CURRENT DATA SET IS A FUNCTION', $
'ENTERING DATA WILL OVERWRITE IT', $
'USE "CANCEL" NOW TO KEEP IT' $
] $
)
; The entry boxes for X & Y
uvs.xid = graff_enter(base, value = '', /text, uvalue = 'X', $
label = 'X Variable:', xsize = 12, /capture)
uvs.yid = graff_enter(base, value = '', /text, uvalue = 'Y', $
label = 'Y Variable:', xsize = 12, /capture)
uvs.eloxid = graff_enter(base, value = '', /text, uvalue = 'ELOX', $
label = 'Lower X error:', xsize = 12, /capture)
widget_control, uvs.eloxid, sensitive = exlm(data(pdefs.cset).type > 0)
uvs.ehixid = graff_enter(base, value = '', /text, uvalue = 'EHIX', $
label = 'Upper X error:', xsize = 12, /capture)
widget_control, uvs.ehixid, sensitive = exhm(data(pdefs.cset).type > 0)
uvs.eloyid = graff_enter(base, value = '', /text, uvalue = 'ELOY', $
label = 'Lower Y error:', xsize = 12, /capture)
widget_control, uvs.eloyid, sensitive = eylm(data(pdefs.cset).type > 0)
uvs.ehiyid = graff_enter(base, value = '', /text, uvalue = 'EHIY', $
label = 'Upper Y error:', xsize = 12, /capture)
widget_control, uvs.ehiyid, sensitive = eyhm(data(pdefs.cset).type > 0)
if (data(pdefs.cset).mode eq 0) then emds = ['None', $
'±Y', $
'-Y +Y', $
'±X', $
'-X +X', $
'±X ±Y', $
'±X -Y +Y', $
'-X +X ±Y', $
'-X +X -Y +Y'] $
else emds = ['None', $
'±Theta', $
'-Theta +Theta', $
'±R', $
'-R +R', $
'±R ±Theta', $
'±R -Theta +Theta', $
'-R +R ±Theta', $
'-R +R -Theta +Theta']
errid = cw_bbselector(base, emds, ids = errids, $
/return_index, set_value = data(pdefs.cset).type $
> 0, label_left = 'Errors present : ', uvalue = 'ERRS')
uvs.mid = graff_enter(base, value = '', ysize = 2, xsize = 30, $
/column, /display, label = 'Messages', uvalue = $
'POP') ; Needs a UVALUE as we use this one
; for the timer events.
; Control
junk = cw_bgroup(base, ['Do it', 'Cancel'], button_uvalue = [1, -1], $
uvalue = 'ACTION', /row)
; Realise and do RYO event handling
widget_control, tlb, /real
grf_focus_enter, uvs.xid
if (pdefs.popflag) then widget_control, uvs.mid, timer = 2.
widget_control, base, event_func = 'grf_tlv_event', set_uvalue = $
uvs, /no_copy
repeat begin
ev = widget_event(base)
endrep until (ev.exited ne 0)
widget_control, base, get_uvalue = uvs, /no_copy
widget_control, tlb, /destroy
widget_control, pdefs.ids.graffer, /sensitive
if (ev.exited eq -1) then begin ; Restore the data set and return
handle_value, pdefs.data, data, /no_copy, /set
return, 0
endif
handle_value, uvs.x, x, /no_copy
handle_value, uvs.y, y, /no_copy
handle_free, uvs.x
handle_free, uvs.y
xydata = fltarr(([2, 3, 4, 3, 4, 4, 5, 5, 6])(uvs.type), n_elements(x))
xydata(0, *) = x
xydata(1, *) = y
if (uvs.type ge 1) then begin
handle_value, uvs.err, err, /no_copy
handle_free, uvs.err
xydata(2, 0) = err
endif
handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
data(pdefs.cset).ndata = n_elements(x)
data(pdefs.cset).type = uvs.type
handle_value, pdefs.data, data, /no_copy, /set
return, 1
end