;+
;FUNCTION:   dgen(n)
;PURPOSE:  returns an array of n doubles that are scaled between two limits.
;INPUT:   n:  number of data points.   (uses 100 if no value is passed)
;KEYWORDS:  one of the next 3 keywords should be set:
;   XRANGE:  uses !x.crange (current x limits) for the scaling.
;   YRANGE:  uses !y.crange (current y limits) for the scaling.
;   RANGE:   user selectable range.
;   LOG:     user selectable log scale (Used with RANGE)
;EXAMPLES:
;  x = dgen(/x)  ; Returns 100 element array of points evenly distributed along
;                ; the x-axis.
;-

function dgen,n,range,  $
   LOG  = log,    $
   RESOLUTION  = res,     $
   pixel_res = pixels, $
   RANGE = krange ,  $
   XRANGE = xrange,  $
   YRANGE = yrange

if keyword_set(krange) then range=krange

if keyword_set(xrange) eq 0 and keyword_set(yrange) eq 0  $
    and keyword_set(range) eq 0 then xrange = 1

if keyword_set(xrange) then begin
   r = !x.crange
   log = !x.type
   pixval = !x.window * !d.x_vsize
   if keyword_set(pixels) then n = round((pixval[1]-pixval[0])/pixels+1) 
endif

if keyword_set(yrange) then begin
   r = !y.crange
   log = !y.type
   pixval = !y.window * !d.y_vsize
   if keyword_set(pixels) then n = round((pixval[1]-pixval[0])/pixels+1) 
endif

nr = n_elements(range)
if nr ne 0 then begin
    r = range[[0,nr-1]]
    if keyword_set(log) then r = alog10(r)
endif

if keyword_set(res) then   n = (round(abs((r[1]-r[0])/res)) > 1)+1

if n_elements(n) le 0 then n = 100


if n eq 1 then x = [(r[1]+r[0])/2] $
else x = dindgen(n)*(r(1) - r(0))/(n-1) + r(0)

if keyword_set(log) then x = 10d^x

return, x
end