Viewing contents of file '../idllib/astron/contrib/varosi/vlib/allpro/cursor_scale.pro'
;+
; NAME:
; cursor_scale
; PURPOSE:
; Interactively select min-max on a color bar using mouse-cursor,
; or input range/levels by typing.
; CALLING:
; range = cursor_scale( minval, maxval, scaling )
; INPUTS:
; minval, maxval, scaling
; KEYWORDS:
; MAXLIM=
; MINLIM=
; INITIAL_MARKS=
; LOGMIN=
; /INCREMENT
; OUTPUTS:
; mosaic_spec, NLev, Levels
; EXTERNAL CALLS:
; pro color_scale
; pro window_set_show
; PROCEDURE:
; HISTORY:
; Written, Frank Varosi NASA/GSFC 1990.
; F.V. 1991, added keyword /INCREM to enter Min & Increment.
; F.V. 1993, modified /INCREM option to get & return sequece of Levels.
; F.V. 1997, added 0.3 sec wait before cursor query.
; F.V. 1997, added option to read contours from a file (*.levels).
;-
function cursor_scale, minval, maxval, scaling, MAXLIM=maxlim, MINLIM=minlim, $
INITIAL_MARKS=init_mark, $
LOGMIN=minLog, INCREMENT=increm
common color_scale, xpos, ypos, scale_window, colorbar, region
common cursor_scale, cmin_y, cmax_y
if N_elements( scaling ) NE 1 then scaling = "Linear"
topval = !D.table_size-2
if N_elements( scale_window ) NE 1 then $
color_scale,minval,maxval,topval,scaling,"",POS=[470,100],/LA $
else if (scale_window LT 0) then $
color_scale,minval,maxval,topval,scaling,"",POS=[470,100],/LA $
else begin
device,WIN=win_flags
if (win_flags(scale_window) NE 1) then $
color_scale,minval,maxval,topval,scaling,"",POS=[470,100],/LARG
endelse
CASE strupcase( scaling ) OF
"LOG10": BEGIN
if N_elements( minLog ) NE 1 then minLog=1
minv = aLog10( minval > (minLog > 1.e-37) )
maxv = aLog10( maxval > (minLog > 1.e-37) )
END
else: BEGIN
minv = minval
maxv = maxval
END
ENDCASE
window_set_show, scale_window,/CURSOR_IN_CENTER
LF = string( byte( 10 ) )
BELL = string( byte( 7 ) )
print, LF + " LEFT button to set MIN, MIDDLE button to set MAX, " $
+ "RIGHT to finish"
xmin = region(0)
xmax = region(1)
xran = xmax-xmin
ymin = region(2)
ybot = ymin-!D.y_ch_size
ymax = region(3)
ytop = ymax+!D.y_ch_size
yran = ymax-ymin
topval = region(4)
range = maxv - minv
yenter= fix( !D.y_ch_size*2.5 )
tv, replicate( !D.table_size-1, !D.x_vsize, yenter )
printw,["CLICK HERE to","ENTER on KEYB"],LINE=0,COL=0
printw,["LEFT = MIN","MIDDLE = MAX","RIGHT = finish"],LINE=3
if N_elements( minlim ) EQ 1 then printw,"original MIN",LINE=7
if N_elements( maxlim ) EQ 1 then printw,"original MAX",LINE=-3
if N_elements( init_mark ) EQ 2 then begin
cmax_y = yran*(init_mark(1) - minv)/range
cmin_y = yran*(init_mark(0) - minv)/range
endif
if N_elements( cmin_y ) NE 1 then cmin_y = 0
if N_elements( cmax_y ) NE 1 then cmax_y = yran
cmin_y = (cmin_y > 0) < yran
cmax_y = (cmax_y > 0) < yran
cmin_v = range * cmin_y/yran + minv
cmax_v = range * cmax_y/yran + minv
markmin = replicate( byte( cmin_y ), xran,3 )
markmax = replicate( byte( cmax_y ), xran,3 )
tv, (markmin + topval/2) MOD topval, xmin, cmin_y + ymin-1
tv, (markmax + topval/2) MOD topval, xmin, cmax_y + ymin-1
print," Thresholds: MIN=" + string( cmin_v, FORM="(G10.3)" ) $
+" MAX=" + string( cmax_v, FORM="(G10.3)" )
!mouse.button = 0
while (!mouse.button LE 2) do begin
wait,0.3
cursor,/DEV,x,y
if (y LE yenter ) AND (!mouse.button LE 2) then begin
tv,colorbar,xmin,ymin
print," "
text = ""
if keyword_set( increm ) then begin
INPUT: print," enter Minimum, Increment, and # intervals,"
print," or enter 4 or more contour Levels,"
print," or enter filename (*.levels assumed)" + BELL
read,text
words = get_words( text )
if N_elements( words ) eq 1 then begin
if strlen( words(0) ) LE 0 then goto,INPUT
print," reading Contour Levels from file: " $
+ words(0) + ".levels"
on_ioerror,ERROR
openr,Lun,/GET_LUN, words(0) + ".levels"
Line = ""
readf,Lun,Line
Levels = float( get_words( Line ) )
if !DEBUG then begin
help,Line,Levels
print,Levels
endif
while NOT eof( Lun ) do begin
readf,Lun,Line
if strlen( Line ) gt 0 then $
Levels = [ Levels, $
float( get_words( Line ) ) ]
if !DEBUG then begin
help,Line,Levels
print,Levels
endif
endwhile
free_Lun,Lun
help,Levels
print,Levels
return, Levels
ERROR:
if N_elements( Lun ) eq 1 then free_Lun,Lun
print," "
print, !ERR_STRING + string( 7b )
print,"...try again..."
wait,1
goto,INPUT
endif
if N_elements( words ) LT 3 then goto,INPUT
if N_elements( words ) GT 3 then return, float( words )
com = "vec = [" + strconcat( words + "," ) + " 0 ]"
if NOT execute( com ) then goto,INPUT
cmin_v = vec(0)
inc = vec(1)
Ninc = round_off( vec(2) ) > 1
print,[cmin_v,inc,Ninc]
if (inc LE 0) then begin
print," must enter positive increment!"
goto,INPUT
endif
cmax_v = cmin_v + Ninc * inc
cmax_y = yran*(cmax_v - minv)/range
cmin_y = yran*(cmin_v - minv)/range
return,[ cmin_v, inc, Ninc ]
endif else begin
!mouse.button = 3
RT: read," enter MIN, MAX for Thresholds: ",cmin_v,cmax_v
if (cmax_v LE cmin_v) then begin
print," must enter MIN < MAX"
goto,RT
endif
cmax_y = yran*(cmax_v - minv)/range
cmin_y = yran*(cmin_v - minv)/range
endelse
endif
CASE !mouse.button OF
1: BEGIN
tv, markmin, xmin, cmin_y + ymin-1
if (y LT ybot) AND (N_elements( minlim )) then begin
y = ymin
cmin_v = minlim
if strupcase( scaling ) eq "LOG10" then $
cmin_v = aLog10( cmin_v > 1e-37 )
print," MIN reset to:",cmin_v,FORM="(/,A,G10.3)"
cmin_y = y-ymin
endif else begin
y = ( (y > ymin) < ymax ) < (cmax_y + ymin-2)
cmin_y = y-ymin
cmin_v = range * cmin_y/yran + minv
endelse
markmin = replicate( byte( cmin_y ), xran,3 )
tv, (markmin + topval/2) MOD topval, xmin, y-1
END
2: BEGIN
tv, markmax, xmin, cmax_y + ymin-1
if (y GT ytop) AND (N_elements( maxlim )) then begin
y = ymax
cmax_v = maxlim
if strupcase( scaling ) eq "LOG10" then $
cmax_v = aLog10( cmax_v > 1e-37 )
print," MAX reset to:",cmax_v,FORM="(/,A,G10.3)"
cmax_y = y-ymin
endif else begin
y = ( (y > ymin) < ymax ) > (cmin_y + ymin+2)
cmax_y = y-ymin
cmax_v = range * cmax_y/yran + minv
endelse
markmax = replicate( byte( cmax_y ), xran,3 )
tv, (markmax + topval/2) MOD topval, xmin, y-1
END
else:
ENDCASE
print, " new Thresholds: MIN=" + $
string( cmin_v, FORM="(G10.3)" ) + " MAX=" + $
string( cmax_v, FORM="(G10.3)" )
endwhile
printw,replicate(" ",6),LINE=0,XOFF=0,/ERASE
return, [ cmin_v, cmax_v ]
end