Viewing contents of file '../idllib/contrib/tappin/graffer/gr_as_yr.pro'
pro Gr_as_yr, data, xrange, xtype, range

;+
; GR_AS_YR
;	Autoscale graffer data (Y-Axis, rectangular plot)
;
; Usage:
;	gr_as_xr, data, range
;
; Arguments:
;	data	struct	input	The Graffer data structure (extracted
;				from PDEFS)
;	xrange	float	input	The X- range for functions (y=f(x))
;	xtype	int	input	log or linear X (ditto)
;	range	float	in/out	The range to use.
;
; History:
;	Extracted from GR_AUTOSCALE: 16/12/96; SJT
;-

handle_value, data.xydata, xydata, /no_copy

fv = 0.                         ; Just create the variable

case (data.type) of
    -1: begin                   ; y = f(x)
        if (xydata.range(0) ne xydata.range(1)) then begin
            amin = xrange(0) > xydata.range(0)
            amax = xrange(1) < xydata.range(1)
        endif else begin
            amin = xrange(0)
            amax = xrange(1)
        endelse
        if (xtype) then begin
            amin = alog10(amin)
            amax = alog10(amax)
            x = 10^(findgen(data.ndata) * (amax-amin) $
                    /  float(data.ndata-1) + amin)
        endif else x = findgen(data.ndata) * (amax-amin) $
          /  float(data.ndata-1) + amin
        
        iexe = execute('fv = '+xydata.funct)
        
        range(0) = range(0) < min(fv, max = fvmx)
        range(1) = range(1) > fvmx
    end
    
    -2: if (xydata.range(0) ne xydata.range(1)) then begin ;x = F(y)
        range(0) = range(0) < xydata.range(0)
        range(1) = range(1) > xydata.range(1)
    endif
    
    -3: begin                   ; x = f(t), y = f(t)
        t = findgen(data.ndata) *  $
          (xydata.range(1)-xydata.range(0)) $
          /  float(data.ndata-1) + xydata.range(0)
        
        iexe = execute('fv = '+xydata.funct(1))
        
        range(0) = range(0) < min(fv, max = fvmx)
        range(1) = range(1) > fvmx
    end
    
    -4: if (xydata.range(0, 1) ne xydata.range(1, 1)) then $
      begin                     ; z = f(x,y)
        range(0) = range(0) < xydata.range(0, 1)
        range(1) = range(1) > xydata.range(1, 1)
    endif
    
    9: begin                    ; Surface data 
        handle_value, xydata.y, y, /no_copy
        range(0) = range(0) < min(y, max = mx)
        range(1) = range(1) > mx
        handle_value, xydata.y, y, /no_copy, /set
    end
    
    Else: begin
        if (data.type eq 0 or $
            data.type eq 3 or $
            data.type eq 4) then begin
            yp = xydata(1, 0:data.ndata-1)
            ym = xydata(1, 0:data.ndata-1)
            
        endif else if (data.type eq 1) then begin
            yp = xydata(1, 0:data.ndata-1) + $
              (finite(xydata(2, 0:data.ndata-1)) and $
               xydata(2, 0:data.ndata-1))
            ym = xydata(1, 0:data.ndata-1) - $
              (finite(xydata(2, 0:data.ndata-1)) and $
               xydata(2, 0:data.ndata-1))
            
        endif else if (data.type eq 2) then begin
            yp = xydata(1, 0:data.ndata-1) + $
              (finite(xydata(3, 0:data.ndata-1)) and $
               xydata(3, 0:data.ndata-1))
            ym = xydata(1, 0:data.ndata-1) - $
              (finite(xydata(2, 0:data.ndata-1)) and $
               xydata(2, 0:data.ndata-1))
            
        endif else if (data.type eq 5) then begin
            yp = xydata(1, 0:data.ndata-1) + $
              (finite(xydata(3, 0:data.ndata-1)) and $
               xydata(3, 0:data.ndata-1))
            ym = xydata(1, 0:data.ndata-1) - $
              (finite(xydata(3, 0:data.ndata-1)) and $
               xydata(3, 0:data.ndata-1))
            
        endif else if (data.type eq 6) then begin
            yp = xydata(1, 0:data.ndata-1) + $
              (finite(xydata(4, 0:data.ndata-1)) and $
               xydata(4, 0:data.ndata-1))
            ym = xydata(1, 0:data.ndata-1) - $
              (finite(xydata(3, 0:data.ndata-1)) and $
               xydata(3, 0:data.ndata-1))
            
        endif else if (data.type eq 7) then begin
            yp = xydata(1, 0:data.ndata-1) + $
              (finite(xydata(4, 0:data.ndata-1)) and $
               xydata(4, 0:data.ndata-1))
            ym = xydata(1, 0:data.ndata-1) - $
              (finite(xydata(4, 0:data.ndata-1)) and $
               xydata(4, 0:data.ndata-1))
            
        endif else  begin
            yp = xydata(1, 0:data.ndata-1) + $
              (finite(xydata(5, 0:data.ndata-1)) and $
               xydata(5, 0:data.ndata-1))
            ym = xydata(1, 0:data.ndata-1) - $
              (finite(xydata(4, 0:data.ndata-1)) and $
               xydata(4, 0:data.ndata-1))
        endelse
        
        locs = where(finite(ym), nf)
        if (nf gt 0) then range(0) = range(0) < min(ym(locs))
        locs = where(finite(yp), nf)
        if (nf gt 0) then range(1) = range(1) > max(yp(locs))
    end
    
endcase

handle_value, data.xydata, xydata, /no_copy, /set


end