source: trunk/SRC/ToBeReviewed/PLOTS/DESSINE/pltbase.pro @ 419

Last change on this file since 419 was 419, checked in by smasson, 14 years ago

add CONTSTRIDE keyword in pltbase

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 14.2 KB
RevLine 
[2]1;+
2;
[142]3; @file_comments
[226]4; Overlayer contour to trace a field which can be mask.
[296]5; Elementary brick of <pro>plt</pro>, <pro>pltz</pro> and <pro>pltt</pro>.
[2]6;
[226]7; @categories
[157]8; Graphics
[2]9;
[142]10; @param Z2D {in}{required}
11; The table to trace
[2]12;
[142]13; @param X {in}{required}
14; Axis. Vector or array of the same size that z2d. This is the coordinate of z2d on x.
[2]15;
[142]16; @param Y {in}{required}
17; Axis. Vector or array of the same size that z2d. This is the coordinate of z2d on y.
[2]18;
[163]19; @param MASK {in}{required}{type=array}
[226]20; It is the array who mask z2d (with 0s on points we want to mask and 1s on others).
[142]21; If z2d is not masked, put this argument equal to 1.
[2]22;
[142]23; @param XM {in}{required}
[226]24; Axis of the mask. Vector or array of the same size that mask.
[142]25; This is the coordinate of mask on x.
[2]26;
[142]27; @param YM {in}{required}
[226]28; Axis of the mask. Vector or array of the same size that mask.
[142]29; This is the coordinate of mask on y.
[2]30;
[163]31; @param LEVELS {in}{optional}{type=vector}
[226]32; Vectors which contain levels needed at the contour.
[142]33; If it is not given, we take 20 levels between the min and the max.
[226]34;
[163]35; @param COLORS {in}{optional}{type=vector}
[226]36; Vectors which contain colors needed at the contour.
[142]37; If it is not given, we take 20 levels between the min and the max.
[2]38;
[226]39; @keyword COLORTRICHAMP
[142]40; The color we want to use to draw the triangulation which is used to make contours of the field.
[2]41;
[226]42; @keyword COLORTRIMASK
[142]43; The color we want to use to draw the triangulation which is used to make contours of the mask.
[2]44;
[226]45; @keyword COLOR_C
[142]46; To draw the contour in color instead of in black
[226]47; with filling in color
[67]48;
[226]49; @keyword CONT_NOFILL
50; Activate it not to fill the point mask to let them transparent!
[142]51; Comment: Nevertheless, we trace mask's contour.
[67]52;
[163]53; @keyword CONT_COLOR {default= (!d.n_colors - 1) < 255 =>white}
54; The color of the continent.
[2]55;
[226]56; @keyword DESSTRICHAMP
57; To draw the triangulation which is used to make field's contours.
[2]58;
[226]59; @keyword DESSTRIMASK
[142]60; To draw the triangulation which is used to make mask's contours.
[226]61;
62; @keyword FORPLT
[296]63; To activate if we want that the drawing of coast be realized by <pro>tracecote</pro> rather than <pro>tracemask</pro>.
[2]64;
[163]65; @keyword I_COLORS {type=vector}
[226]66; It is a vector specifying the colors to use to trace contours.
[142]67; It is the same thing that c_colors which act on contours.
[2]68;
[163]69; @keyword MORE {default=10}
[142]70; Number to give to avoid style's bugs:
[2]71;  % Out of range subscript encountered: <LONG      Array[38911]>.
72;  % Execution halted at:  PLTBASE           151
[226]73;             If the bug still exist, increase the value of more!
[142]74; (The explanation and the justification of this method do not have scientific bases yet...).
[2]75;
[163]76; @keyword NOFILL
[246]77; To make just isolines with no filling
[2]78;
[163]79; @keyword NOCONTOUR
[142]80; To make just colors.
[2]81;
[419]82; @keyword CONTSTRIDE {type=integer} {default=1}
83; To trace one isoline every contstride.
84;
[163]85; @keyword UNSUR2
[419]86; Obsolete. use CONTSTRIDE = 2
[2]87;
[163]88; @keyword UNLABSUR {type=integer}
89; I specify we only label one contour on two.
[2]90;
[226]91; @keyword CONTOUR
[296]92; To be used since <pro>plt</pro>, <pro>pltz</pro> or <pro>pltt</pro>. (Have a look on these routines).
[2]93;
[226]94; @keyword _EXTRA
[231]95; Used to pass keywords
[2]96;
[142]97; @uses
[370]98; <pro>common</pro>
[2]99;
[142]100; @restrictions
[296]101; In the case of z2d, x and y are arrays of same size, we have to put them as vectors: z2d[*], x[*], y[*].
[2]102;
[142]103; @history
[157]104;  Sebastien Masson (smasson\@lodyc.jussieu.fr)
[142]105; ????
106; 8/2/2000 check if the tri array is not equal to
[296]107; -1. allow contour without using a triangulation.
[226]108;
[142]109; @version
110; $Id$
[2]111;
[142]112; @todo seb L.172 à 173
[2]113;
114;-
[327]115PRO pltbase, z2d, x, y, mask, xm, ym, levels, colors $
[419]116           , UNSUR2=unsur2, CONTSTRIDE = contstride, CONTOUR=contour $
[327]117           , NOCONTOUR=nocontour, NOFILL=nofill $
118           , TRICHAMP=trichamp, TRIMSK=trimsk $
119           , REALCONT=realcont, NAN=nan, USETRI=usetri $
120           , COLORTRICHAMP=colortrichamp, COLORTRIMASK=colortrimask $
121           , COLORTRINAN=colortrinan $
122           , COLORPOINTS=colorpoints, DRAWPOINTS=drawpoints $
123           , TH_TRICHAMP=th_trichamp, TH_TRIMASK=th_trimask $
124           , DESSTRICHAMP=desstrichamp, DESSTRIMASK=desstrimask $
125           , DESSTRINAN=desstrinan, COLOR_C=color_c $
126           , I_COLORS=i_colors,  CONT_COLOR=CONT_COLOR $
127           , CONT_NOFILL=cont_nofill, UNLABSUR=unlabsur $
128           , COINMONTEMASK=coinmontemask, COINDESCENDMASK=coindescendmask $
129           , COINMONTENAN=coinmontenan, COINDESCENDNAN=coindescendnan $
130           , INDICEZOOMMASK=indicezoommask, INDICEZOOMNAN=indicezoomnan $
131           , MASKORG=maskorg, MASKNAN=masknan, TRINAN=trinan $
132           , FORPLT=forplt, REALSECTION=realsection $
133           , MORE=more, EXCHANGE_XY=exchange_xy $
134           , _EXTRA=ex
[114]135;
136  compile_opt idl2, strictarrsubs
137;
[67]138@cm_4mesh
139  IF NOT keyword_set(key_forgetold) THEN BEGIN
140@updatenew
141@updatekwd
142  ENDIF
143;---------------------------------------------------------
[2]144;
[226]145; Explanation concerning contour. This keyword is activated when we trace a
[142]146; colored contour different from the one with black trait.
147; If it is activated (case n_elements(contour) NE 0), we pass 2 time in pltbase:
148;   1) We trace colors then we leave, it is the case:
[2]149;         n_elements(contour) NE 0 AND n_elements(contour) NE 4)
[226]150;   2) We trace contours in traits then continents, it is the case:
[2]151;         n_elements(contour) NE 0 AND n_elements(contour) EQ 4)
152;
153;------------------------------------------------------------
[142]154  tempsun = systime(1)          ; To key_performance
[67]155  if n_elements(mask) EQ 0 then mask = 1b
156  if n_elements(masknan) EQ 0 then masknan = 1b
157  IF total(mask) EQ n_elements(z2d) THEN mask = 1b
[2]158;----------------------------------------------------------------------
[142]159; If levels and colors aren't given
[2]160;----------------------------------------------------------------------
[226]161  if n_params() EQ 4 then $
[67]162    label, 0, min(z2d*mask), max(z2d*mask), ncontour, levels, colors
[2]163; attention bidouille inexplicable pour que tout se passe bien avec les
164; postcript ds pltz!!!
[67]165  if n_elements(contour) LE 4 AND !x.type EQ 0 THEN $
166    plot, [0], [0], xstyle = 5, ystyle = 5, /nodata, /noerase, title = '', subtitle = ''
[2]167;----------------------------------------------------------------------
[142]168; Is cell_fill is a part of _extra, we desactive it if it is nt equal to 2
[2]169;----------------------------------------------------------------------
[226]170  IF chkstru(ex, 'CELL_FILL') THEN BEGIN
[67]171    cell_fill = ex.CELL_FILL
172    if ex.CELL_FILL NE 2 then ex.CELL_FILL = 0
173  ENDIF ELSE cell_fill = 0      ;
[2]174;----------------------------------------------------------------------
[390]175; I) Filling contours with colors
[2]176;----------------------------------------------------------------------
[67]177  if NOT keyword_set(more) then more = 10
178  if NOT keyword_set(nofill) AND NOT keyword_set(color_c) then begin
[226]179    if n_elements(contour) NE 4 THEN BEGIN
[67]180      if usetri EQ 2 then BEGIN
181        IF size(x, /n_dimensions) EQ 1 THEN x = x#replicate(1, (size(z2d))[2])
182        IF size(y, /n_dimensions) EQ 1 THEN y = replicate(1, (size(z2d))[1])#y
183        contour, [z2d[*], fltarr(more)], [x[*], fltarr(more)] $
184          , [y[*], fltarr(more)], levels = levels, c_color = colors $
185          , /noerase, /fill, TRIANGULATION = trichamp, _extra = ex
186        ENDIF ELSE BEGIN
187        IF size(x, /n_dimensions) EQ 2 THEN x = x[*, 0]
188        IF size(y, /n_dimensions) EQ 2 THEN y = reform(y[0, *])
189        contour, z2d, x, y, levels = levels, c_color = colors, /noerase $
[226]190          , /fill, _extra = ex
[67]191      ENDELSE
192    ENDIF
193  ENDIF
[226]194  if n_elements(contour) NE 0 AND n_elements(contour) NE 4 THEN GOTO, fini
[67]195  IF chkstru(ex, 'C_ORIENTATION') THEN ex = extractstru(ex, 'C_ORIENTATION')
196  IF chkstru(ex, 'C_SPACING') THEN ex = extractstru(ex, 'C_SPACING')
197  IF chkstru(ex, 'C_COLORS') THEN ex = extractstru(ex, 'C_COLORS')
[2]198;------------------------------------------------------------
[390]199; II) Drawing contours with lines
[2]200;------------------------------------------------------------
[67]201  if n_elements(contour) EQ 4 OR n_elements(contour) EQ 0 THEN BEGIN
202;
203; we put the masked values to NaN
204;
205    IF (n_elements(mask) GT 1 OR n_elements(masknan) GT 1) $
[226]206      AND NOT keyword_set(cont_nofill) THEN BEGIN
207      IF keyword_set(maskorg) THEN tonan = maskorg*masknan ELSE tonan = mask*masknan
[171]208      tonan = where(remplit(tonan, nite = 1, mask = tonan $
[67]209                            , /basique, fillval = 0 $
210                            , fillxdir = keyword_set(realsection)) EQ 0, count)
211      IF count NE 0 THEN z2d[temporary(tonan)] = !values.f_nan
[226]212    ENDIF
[67]213;
[142]214; We do not pass if we have to make differents contours...
215; In the case of unsur2 is activated, we reduce levels
[67]216    if NOT keyword_set(nocontour) then begin
[114]217      IF keyword_set(unsur2) THEN levels = levels[where(zeroun(n_elements(levels) ) eq 1)]
[419]218      IF keyword_set(contstride) THEN levels = levels[where((indgen(n_elements(levels)) MOD contstride) eq 0)]
[142]219; Is unlabsur activated?  Does C_LABEL passed via _EXTRA?
[67]220      if keyword_set(unlabsur) THEN IF chkstru(ex, 'C_LABELS') THEN $
221        ex.C_LABELS = 1-((indgen(n_elements(ex.C_LABELS)) MOD unlabsur) < 1)
[2]222;
[142]223; Not to fill when cell_fill is imposed...
[67]224      IF chkstru(ex, 'CELL_FILL') THEN ex.CELL_FILL = 0
[2]225;
[67]226      CASE 1 OF
227        keyword_set(color_c):c_colors = colors
228        keyword_set(i_colors):c_colors = i_colors
229        ELSE:
230      ENDCASE
[2]231;
[226]232      IF usetri EQ 2 THEN BEGIN
[67]233        IF size(x, /n_dimensions) EQ 1 THEN x = x#replicate(1, (size(z2d))[2])
234        IF size(y, /n_dimensions) EQ 1 THEN y = replicate(1, (size(z2d))[1])#y
235        contour, [z2d[*], fltarr(more)], [x[*], fltarr(more)] $
236          , [y[*], fltarr(more)], levels = levels $
237          , overplot = 1-keyword_set(nofill), noerase = keyword_set(nofill) $
238          , c_colors = c_colors, TRIANGULATION = trichamp, _extra = ex
239      ENDIF ELSE BEGIN
240        IF size(x, /n_dimensions) EQ 2 THEN x = x[*, 0]
241        IF size(y, /n_dimensions) EQ 2 THEN y = reform(y[0, *])
242        contour, z2d, x, y, levels = levels $
243          , overplot = 1-keyword_set(nofill), noerase = keyword_set(nofill) $
244          , c_colors = c_colors, _extra = ex
245      ENDELSE
246    ENDIF
[2]247;----------------------------------------------------------------------
[390]248; III) Filling continents with color
[2]249;----------------------------------------------------------------------
[67]250    IF chkstru(ex, 'CELL_FILL') THEN ex.CELL_FILL = cell_fill < 1
251    IF chkstru(ex, 'LEVELS') THEN ex = extractstru(ex, 'LEVELS')
252    IF chkstru(ex, 'NODATA') THEN ex = extractstru(ex, 'NODATA')
[226]253    IF NOT keyword_set(cont_color) THEN cont_color = (!d.n_colors-1) <  255
[2]254;
[226]255; If there is points at NaN
256; We trace points in white at NaN before drawing coasts with a trait.
[2]257;
[246]258    if keyword_set(trinan) AND NOT keyword_set(nofill) THEN BEGIN
[67]259      IF size(x, /n_dimensions) EQ 1 THEN x = x#replicate(1, (size(masknan))[2])
260      IF size(y, /n_dimensions) EQ 1 THEN y = replicate(1, (size(masknan))[1])#y
261      contour, [1b-masknan[*], fltarr(more)], [x[*], fltarr(more)] $
262        , [y[*], fltarr(more)], levels = 0.5, /overplot, /fill $
263        , c_colors = cont_color, TRIANGULATION = trinan, _extra = ex
264      IF keyword_set(forplt) THEN $
265        completecointerre, COINMONTE = coinmontenan $
266        , COINDESCEND = coindescendnan, INDICEZOOM = indicezoomnan $
267        , CONT_COLOR = cont_color, _EXTRA = ex $
268      ELSE fillcornermask, x[*, 0], y[0, *], COINMONTE = coinmontenan $
269        , COINDESCEND = coindescendnan, CONT_COLOR = cont_color, _extra = ex
270    ENDIF
[2]271;
[390]272; Filling continents
[2]273;
[67]274    if keyword_set(realcont) then if realcont EQ 1 then mask = 1b
[142]275    if n_elements(mask) NE 1 then BEGIN ; If mask=1 we gap it.
[67]276;
277      if NOT keyword_set(cont_nofill) then BEGIN
278;
279; mask filling
280;
281        case 1 of
282          keyword_set(realsection):drawsectionbottom, mask, xm, ym $
283            , CONT_NOFILL = cont_nofill, CONT_COLOR = cont_color, _EXTRA = ex
284          usetri GE 1:BEGIN
285            if n_elements(trimsk) eq 0 then trimsk = trichamp
286            IF size(xm, /N_DIMENSIONS) EQ 1 THEN xm = xm#replicate(1, (size(mask))[2])
287            IF size(ym, /N_DIMENSIONS) EQ 1 THEN ym = replicate(1, (size(mask))[1])#ym
288            contour, [1b-mask[*], fltarr(more)], [xm[*], fltarr(more)] $
289              , [ym[*], fltarr(more)], LEVELS = 0.5, /OVERPLOT, /FILL $
290              , C_COLORS = cont_color, TRIANGULATION = trimsk, _extra = ex
291            IF keyword_set(forplt) THEN $
292              completecointerre, COINMONTE = coinmontemask $
293              , COINDESCEND = coindescendmask, INDICEZOOM = indicezoommask $
294              , CONT_COLOR = cont_color, _EXTRA = ex $
295            ELSE fillcornermask, xm[*, 0], ym[0, *], COINMONTE = coinmontemask $
296              , COINDESCEND = coindescendmask, CONT_COLOR = cont_color, _extra = ex
297          END
[226]298          ELSE:BEGIN
[67]299            IF size(xm, /n_dimensions) EQ 2 THEN xm = xm[*, 0]
300            IF size(ym, /n_dimensions) EQ 2 THEN ym = reform(ym[0, *])
301            contour, 1b-mask, xm, ym, LEVELS = 0.5, /OVERPLOT $
302              , /FILL, C_COLORS = cont_color, _EXTRA = ex
303          END
304        ENDCASE
305      ENDIF                     ; NOT keyword_set(cont_nofill)
[2]306;------------------------------------------------------------
[390]307; IV) Trace coast with line
[67]308;------------------------------------------------------------
309      case 1 of
[226]310        keyword_set(realsection) AND NOT keyword_set(cont_nofill):
[67]311        keyword_set(realsection) AND keyword_set(cont_nofill): $
312          drawsectionbottom, mask, xm, ym $
313          , CONT_NOFILL = cont_nofill, _extra = ex
314        (keyword_set(forplt) AND (!map.projection GT 0 OR key_irregular)) $
315          OR keyword_set(nan):tracecote, _extra = ex
316        ELSE:tracemask, mask, xm, ym, _extra = ex
317      endcase                   ;
318    ENDIF                       ; n_elements(mask) NE 1
319  ENDIF
320;------------------------------------------------------------
321; draw the triangulations
322;------------------------------------------------------------
323  if keyword_set(desstrichamp) then $
324    dessinetri, trichamp, x, y, color = colortrichamp, thick = th_trichamp
325  if keyword_set(desstrimask) then $
326    dessinetri, trimsk, xm, ym, color = colortrimask, thick = th_trimask
327  if keyword_set(desstrinan) then $
328    dessinetri, trinan, x, y, color = colortrinan
329  if keyword_set(drawpoints) then $
330    tracegrille, x, y, color = colorpoints
331;------------------------------------------------------------
332;
[2]333fini:
[226]334  IF keyword_set(key_performance) THEN print, 'temps pltbase', systime(1)-tempsun
[2]335
[67]336  return
[2]337end
Note: See TracBrowser for help on using the repository browser.