source: trunk/SRC/ToBeReviewed/PLOTS/DESSINE/tvplus.pro @ 325

Last change on this file since 325 was 325, checked in by pinsard, 17 years ago

modification of some headers (+some corrections) to prepare usage of the new idldoc

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.0 KB
Line 
1;+
2;
3; @file_comments
4; Enhanced version of <proidl>TVSCL</proidl>
5;
6; @categories
7; quick exploration of 2D arrays
8;
9; @param Z2D {in}{required}
10; 2D array to visualize
11;
12; @param CELLSIZE {in}{optional}
13; This is the size (in pixel) of the square
14; representing 1 array element. By default, this size is computed
15; automatically in order that the size of the plotting window do
16; not exceed the screen size. If the user specify a large value
17; of cellsize that forces tvplus to create a window larger than
18; the screen, a "scrolling window" will be displayed instead of a
19; regular window. Unfortunately the nice functionalities of tvplus
20; are not coded for "scrolling window" case...
21;
22; @keyword BOTTOM {default=1}
23; The lowest color index of the colors to be used
24;
25; @keyword C_NAN {default=!d.n_colors < 255}
26; The color number that should be used for the NaN values.
27;
28; @keyword C_MASK {default=0}
29; The color number that should be used for the mask values.
30;
31; @keyword OFFSET
32; 2 elements vector used by tvplus itself when showing zoom.
33; It is used to shift the ranges of xaxis and yaxis.
34; For example: tvplus,sst[x1:x2,y1:y2],offset=[x1,y1]
35;
36; @keyword MASK
37; The mask value. Note that if abs(mask) < 1.e6, then the
38; exact value of the mask is used to find the maskwd point.
39; if abs(mask) > 1.e6, the test to find the masked value is ge
40; abs(mask)/10. This is necessary to avoid the rounding errors
41;
42; @keyword MIN
43; Scalar used to specify the min value to be drawn.
44;
45; @keyword MAX
46; Scalar used to specify the max value to be drawn.
47;
48; @keyword NCOLORS {default=(d.n_colors < 256) - 1 - bottom}
49; number of colors to be used.
50;
51; @keyword NOINTERP
52; Used this keyword if you don't want that the values
53; are interpolated from BOTTOM using NCOLORS colors.
54; This can be for example useful when working on byte type arrays.
55;
56; @keyword NOUSEINFOS
57; Activate to suppress the printed message explaining how to use tvplus
58;
59; @keyword WINDOW
60; Number of the window used to display the array values.
61; default is window number 0.
62;
63; @keyword _EXTRA
64; Used to pass keywords to <proidl>TV</proidl>,
65; <proidl>PLOT</proidl>,
66; <pro>colorbar</pro>
67;
68; @restrictions
69; use your mouse to scan the array values...
70;     left button  : mouse position and associated array value
71;     middle button: use it twice to define a zoom box
72;     right button : quit
73;
74; the nice functionalities of tvplus are not coded
75; for "scrolling window" case...
76;
77; @examples
78; IDL> tvplus, dist(100)
79;
80; @history
81; Sebastien Masson (smasson\@lodyc.jussieu.fr)
82;                       18/12/98
83; Aug 2005: quick cleaning + english
84;
85; @version
86; $Id$
87;
88;-
89PRO tvplus, z2d, cellsize, BOTTOM = bottom, C_MASK = c_mask, C_NAN = c_nan, WINDOW = window $
90            , MIN = min, MAX = max, MASK = mask, OFFSET = offset, NOUSEINFOS = NOUSEINFOS $
91            , NCOLORS = ncolors, NOINTERP = nointerp, _EXTRA = ex
92;
93  compile_opt idl2, strictarrsubs
94;
95  IF n_elements(z2d) EQ 0 THEN return
96  arr = reform(float(z2d))
97;------------------------------------------------------------
98; check the size of the input array
99;------------------------------------------------------------
100  if (size(arr))[0] NE 2 then begin
101    ras = report('Input array must have only 2 dimensions and not '+ strtrim(size(arr, /n_dimensions), 1))
102    return
103  endif
104;------------------------------------------------------------
105; def of ncolmax, bottom, topcol and ncolors
106;------------------------------------------------------------
107  ncolmax = !d.n_colors < 256
108  IF N_ELEMENTS(bottom) EQ 0 THEN bottom = 1
109  if NOT keyword_set(ncolors) then ncolors = ncolmax - 1 - bottom
110  topcol = (bottom+ncolors-1) < (ncolmax-1)
111;------------------------------------------------------------
112; get default values of !x, !y, !z
113;------------------------------------------------------------
114;   xenvsauve = !x & yenvsauve = !y & penvsauve = !p
115  reinitplt, /z, /invert
116;------------------------------------------------------------
117; Do we have NaN values in arr???
118;------------------------------------------------------------
119  nan = total(finite(z2d, /nan)) < 1
120  if keyword_set(nan) then begin
121    nanindex = where(finite(z2d, /nan) EQ 1)
122    arr[nanindex] = min(arr, /nan)
123  endif
124;------------------------------------------------------------
125; Compute the size (in pixel) of the square representing 1
126; point of the input array
127;------------------------------------------------------------
128  dimensions = GET_SCREEN_SIZE()
129  if n_elements(cellsize) EQ 0 then BEGIN
130    cellsize = min(floor(dimensions/(size(z2d))[1: 2]*.75))
131  ENDIF ELSE $
132; we need to use a scrolling bar window
133  if cellsize GE min(floor(dimensions/(size(z2d))[1: 2]*.75)) then scrolling = 1
134  if cellsize LT 1 then begin
135    cellsize = 1
136    scrolling = 1
137  endif
138;------------------------------------------------------------
139; Change the value of the masked value for the min of the non-masked values
140;------------------------------------------------------------
141  if n_elements(mask) then BEGIN
142    if abs(mask) LT 1e6 then BEGIN
143      masked = where(arr EQ mask)
144      if masked[0] NE -1 then arr[masked] = min(arr[where(arr NE mask)])
145    ENDIF ELSE BEGIN
146      masked = where(abs(arr) GE abs(mask)/10.)
147      if masked[0] NE -1 then arr[masked] = min(arr[where(abs(arr) LT abs(mask)/10.)])
148    ENDELSE
149  ENDIF ELSE masked = -1
150;------------------------------------------------------------
151; apply min/max keywords
152;------------------------------------------------------------
153  if n_elements(min) NE 0 then BEGIN
154    arr = min > arr
155    truemin = min
156  ENDIF ELSE truemin = min(arr)
157  if n_elements(max) NE 0 then BEGIN
158    arr = arr < max
159    truemax = max
160  ENDIF ELSE truemax = max(arr)
161;
162  IF truemin EQ truemax THEN BEGIN
163    dummy = report('constant value everywhere: '+ strtrim(truemin, 1))
164    return
165  ENDIF
166;------------------------------------------------------------
167; apply other keywords (nointerp, c_nan, c_mask)
168;------------------------------------------------------------
169  if NOT keyword_set(nointerp) then BEGIN
170; interpolation between bottom and bottom+ncolors-1
171    m = 1.*(ncolors-1)/(truemax-truemin)
172    p = bottom-1.*truemin*m
173    arr = round(m*temporary(arr)+p)
174  endif
175; set c_nan for NaN values
176  if keyword_set(nan) then begin
177    if n_elements(c_nan) NE 0 THEN arr[nanindex] = c_nan <  (ncolmax -1) $
178    ELSE arr[nanindex] = topcol
179  endif
180; c_mask for masked values
181  if n_elements(c_mask) NE 0 AND masked[0] NE -1 THEN $
182    arr[masked] = c_mask < (ncolmax -1)
183; use byte type to save memory
184  arr = byte(temporary(arr))
185; increase the size of the array in order to be displayed
186; with the suitable size
187  szarr = size(arr, /dimensions)
188  arr = congrid(temporary(arr), szarr[0]*cellsize, szarr[1]*cellsize)
189;------------------------------------------------------------
190; open a window with the correct size
191;------------------------------------------------------------
192  nx = (size(arr))[1]
193  ny = (size(arr))[2]
194; margin size (in pixel)
195  xyaspect = 1.*nx/ny
196  if xyaspect GE 1 THEN marginpix = 1.*[25, 25, 75, 25] ELSE marginpix = 1.*[25, 100, 25, 25]
197;
198  if n_elements(scrolling) EQ 0 then BEGIN ; open the regular window
199    if NOT keyword_set(window) then window = 0
200    window, window, xsize = nx+marginpix[0]+marginpix[1] $
201            , ysize = ny+marginpix[2]+marginpix[3]
202; for 24 bits colors, make sure that the background color is the good one...
203    if !d.n_colors gt 256 then BEGIN
204      device, decomposed = 1
205      !p.background = 'ffffff'x
206      plot, [0], [0], xstyle = 5, ystyle = 5
207      device, decomposed = 0
208    endif
209    tv, arr, marginpix[0], marginpix[2], _EXTRA = ex
210;
211; axis and plot frame
212;
213; get the normalized position of the tv (we just done above)
214; to know where the frame should be drawn
215    poscadre = fltarr(4)
216    poscadre[0] = marginpix[0]/!d.x_size
217    poscadre[2] = 1.-marginpix[1]/!d.x_size
218    poscadre[1] = marginpix[2]/!d.y_size
219    poscadre[3] = 1-marginpix[3]/!d.y_size
220; Use plot to draw the frame
221    if NOT keyword_set(offset) then offset = [0, 0]
222    !p.position = poscadre
223    plot, [0], [0], /nodata, /noerase, position = poscadre, color = 0 $
224          , xstyle = 1, ystyle = 1, xticklen = 1, yticklen = 1 $
225          , xrange = 1.*[0, nx]/cellsize-.5+offset[0] $
226          , yrange = 1.*[0, ny]/cellsize-.5+offset[1], _extra = ex
227    xenvsauve = !x & yenvsauve = !y & penvsauve = !p
228;
229; draw the colorbar
230;
231    IF truemin ne truemax THEN BEGIN
232      if xyaspect ge 1 then $
233        posbar = [25./!d.x_size, 25./!d.y_size, 1-25./!d.x_size, 50./!d.y_size] $
234        ELSE posbar = [1-75./!d.x_size, 25./!d.y_size, 1-50./!d.x_size, 1-25./!d.y_size]
235    if keyword_set(nointerp) then BEGIN & truemin = 0 & truemax = ncolmax & endif
236      colorbar, min = truemin, max = truemax, division = 10, cb_color = 0, position = posbar $
237                , vertical = xyaspect lt 1, /right, BOTTOM = bottom, NCOLORS = ncolors, _EXTRA = ex
238    ENDIF
239;      !p.position = poscadre
240  ENDIF ELSE BEGIN
241;------------------------------------------------------------
242; scrolling bar window case...
243;------------------------------------------------------------
244; for 24 bits colors, make sure that the background color is the good one...
245    if !d.n_colors gt 256 then begin
246      window, /pixmap
247      device, decomposed = 1
248      !p.background = 'ffffff'x
249      plot, [0], [0]
250      device, decomposed = 0
251    endif
252    slide_image, arr $          ; We draw it in a window with a scrolling bar
253                 , xsize = nx, ysize = ny $
254                 , xvisible = round(.7*dimensions[0]) < (size(arr))[1] $
255                 , yvisible = round(.7*dimensions[1]) < (size(arr))[2], /register, congrid = 0, show_full = 0
256    return
257  ENDELSE
258;------------------------------------------------------------
259; Use the mouse to get nice functionalities
260;------------------------------------------------------------
261; format to print the mouse position
262  CASE 1 OF
263    nx LT 10:fmt1 = '(i1)'
264    nx LT 100:fmt1 = '(i2)'
265    nx LT 1000:fmt1 = '(i3)'
266    nx LT 10000:fmt1 = '(i4)'
267    ELSE:fmt1 = ''
268  ENDCASE
269  CASE 1 OF
270    ny LT 10:fmt2 = '(i1)'
271    ny LT 100:fmt2 = '(i2)'
272    ny LT 1000:fmt2 = '(i3)'
273    ny LT 10000:fmt2 = '(i4)'
274    ELSE:fmt2 = ''
275  ENDCASE
276;
277  if NOT keyword_set(nouseinfos) then begin
278    print, 'left button  : mouse position and associated array value'
279    print, 'middle button: use it twice to define a zoom box'
280    print, 'right button : quit'
281  endif
282  cursor, x, y, /device, /down
283  x = x-marginpix[0] & x = 0 > floor(x/cellsize) < ((size(arr))[1]/cellsize-1)
284  y = y-marginpix[2] & y = 0 > floor(y/cellsize) < ((size(arr))[2]/cellsize-1)
285  while (!mouse.button ne 4) do BEGIN
286    case !mouse.button of
287      0:return
288      1:BEGIN                   ; get value
289        if x LE nx/cellsize AND y LE ny/cellsize then begin
290          print, '(x, y) = (' + string(x+offset[0], format = fmt1) $
291                 + ', ' + string(y+offset[1], format = fmt2) $
292                 + '), value = '+strtrim(float((reform(z2d))[x, y]), 1)
293        ENDIF
294        cursor, x, y, /device, /down
295        x = x-marginpix[0] & x = 0 > floor(x/cellsize) < ((size(arr))[1]/cellsize-1)
296        y = y-marginpix[2] & y = 0 > floor(y/cellsize) < ((size(arr))[2]/cellsize-1)
297      END
298      2:BEGIN                   ; zoom
299        cursor, x2, y2, /device, /down
300        x2 = x2-marginpix[0] & x2 =  0 > floor(x2/cellsize) < ((size(arr))[1]/cellsize-1)
301        y2 = y2-marginpix[2] & y2 =  0 > floor(y2/cellsize) < ((size(arr))[2]/cellsize-1)
302        x =  [x, x2] & x =  x[sort(x)]
303        y =  [y, y2] & y =  y[sort(y)]
304        IF keyword_set(OFFSET) THEN offset = [x[0], y[0]]+offset ELSE offset = [x[0], y[0]]
305        tvplus, z2d[x[0]:x[1], y[0]:y[1] ], WINDOW = window, MIN = min, MAX = max $
306                , MASK = mask, C_MASK = c_mask, C_NAN = c_nan, /NOUSEINFOS, OFFSET = OFFSET $
307                , NCOLORS = ncolors, NOINTERP = nointerp, BOTTOM = bottom, _EXTRA = ex
308        return
309      END
310      ELSE:
311    endcase
312  ENDWHILE
313;------------------------------------------------------------
314  !x = xenvsauve & !y = yenvsauve & !p = penvsauve
315  !x.range = 1.*[0, nx]/cellsize-.5+offset[0]
316  !y.range = 1.*[0, ny]/cellsize-.5+offset[1]
317;------------------------------------------------------------
318  return
319end
Note: See TracBrowser for help on using the repository browser.