Viewing contents of file '../idllib/contrib/tappin/graffer/gr_as_xr.pro'
pro Gr_as_xr, data, yrange, ytype, range

;+
; GR_AS_XR
;	Autoscale graffer data (X-Axis, rectangular plot)
;
; Usage:
;	gr_as_xr, data, range
;
; Arguments:
;	data	struct	input	The Graffer data structure (extracted
;				from PDEFS)
;	yrange	float	input	The Y- range for functions (x=f(y))
;	ytype	int	input	log or linear Y (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: if (xydata.range(0) ne xydata.range(1)) then begin ;Y = F(x)
        range(0) = range(0) < xydata.range(0)
        range(1) = range(1) > xydata.range(1)
    endif
    
    -2: begin                   ; X = f(y)
        if (xydata.range(0) ne xydata.range(1)) then begin
            amin = yrange(0) > xydata.range(0)
            amax = yrange(1) < xydata.range(1)
        endif else begin
            amin = yrange(0)
            amax = yrange(1)
        endelse
        if (ytype) then begin
            amin = alog10(amin)
            amax = alog10(amax)
            y = 10^(findgen(data.ndata) * (amax-amin) $
                    /  float(data.ndata-1) + amin)
        endif else y = 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
    
    -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(0))
        
        range(0) = range(0) < min(fv, max = fvmx)
        range(1) = range(1) > fvmx
    end
    
    -4: if (xydata.range(0, 0) ne xydata.range(1, 0)) then $
      begin                     ; z = f(x,y)
        range(0) = range(0) < xydata.range(0, 0)
        range(1) = range(1) > xydata.range(1, 0)
    endif
    
    9: begin                    ; Surface data 
        handle_value, xydata.x, x, /no_copy
        range(0) = range(0) < min(x, max = mx)
        range(1) = range(1) > mx
        handle_value, xydata.x, x, /no_copy, /set
    end
    
    Else: begin                 ; XY data, much easier (or it was)
        if (data.type le 2) then begin
            xp = xydata(0, 0:data.ndata-1)
            xm = xydata(0, 0:data.ndata-1)
        endif else if (data.type eq 3 or $
                       data.type eq 5 or $
                       data.type eq 6) then begin
            xp = xydata(0, 0:data.ndata-1) +  $
              (finite(xydata(2, 0:data.ndata-1)) and $
               xydata(2, 0:data.ndata-1))
            xm = xydata(0, 0:data.ndata-1) - $
              (finite(xydata(2, 0:data.ndata-1)) and $
               xydata(2, 0:data.ndata-1))
        endif else begin
            xp = xydata(0, 0:data.ndata-1) +  $
              (finite(xydata(3, 0:data.ndata-1)) and $
               xydata(3, 0:data.ndata-1))
            xm = xydata(0, 0:data.ndata-1) - $
              (finite(xydata(2, 0:data.ndata-1)) and $
               xydata(2, 0:data.ndata-1))
        endelse
        
        locs = where(finite(xm), nf)
        if (nf gt 0) then range(0) = range(0) < min(xm(locs))
        locs = where(finite(xp), nf)
        if (nf gt 0) then range(1) = range(1) > max(xp(locs))
        
    end
endcase

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

end