;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME:pltbase ; ; PURPOSE: surcouche de contour pour tracer un champ eventuellement ; masque. brique elementaire de plt, pltz et pltt. ; ; CATEGORY:un tarce vite fait et/ou delestage de l''ecriture de plt, pltz, pltt ; ; CALLING SEQUENCE: pltbase, z2d, x, y, mask,xm, ym, [, levels, colors], ; ; INPUTS: ; z2d:le tableau a tracer ; ; x et y les axes. vecteurs ou tableaux de meme taille que ; z2d. Ce sont les coordonnees de z2d ; ; mask: le tableau qui masque z2d (avec des 0 sur les points a ; masquer et des 1 sur les autres). si z2d n'est pas masque ; mettre cet argument egale a 1. ; ; xm et ym les axes du mask. vecteurs ou tableaux de meme taille que ; mask. Ce sont les coordonnees de mask ; ; levels et colors: (optionnels) les vecteurs qui contiennent ; les niveaus et les couleurs necessaires au contour. S''il ne ; sont pas donnes on prends 20 niveau entre le min et le max. ; ; KEYWORD PARAMETERS: ; ; COLORTRICHAMP : la couleur que l''on veut utiliser pour ; dessiner la triangulation qui est utilisee pour faire les ; contour du champ ; ; COLORTRIMASK : la couleur que l''on veut utiliser pour ; dessiner la triangulation qui est utilisee pour faire les ; contour du mask ; ; COAST_COLOR: the color of the coastline. ; defaut value is 0 => black ; ; COAST_THICK: the thickness of the coastline. ; defaut value is 1 ; ; COLOR_C: to draw the contour in color instead of in black ; with filling in color ; ; /CONT_NOFILL: activer pour ne pas remplir les points masques ; pour les laisser en transparent! ; Rq: on trace qd meme le contour du mask ; ; CONT_COLOR: the color of the continent. defaut value is ; (!d.n_colors - 1) < 255 => white ; ; /DESSTRICHAMP: pour dessiner la triangulation qui est ; utilisee pour faire les contour du champ. ; ; /DESSTRIMASK: pour dessiner la triangulation qui est ; utilisee pour faire les contour du mask ; ; /FORPLT: a activer si on veut que le trace des cote soit ; realise par tracecote plutot que tracemask. ; ; I_COLORS: un vecteur specifiant la couleur a utiliser pour ; tracer les contours. C''est la meme chose que c_colors qui ; ajit sur les contours. ; ; MORE: chiffre a donner pour eviter les bug du style: ; % Out of range subscript encountered: . ; % Execution halted at: PLTBASE 151 ; par defaut more=10 si le bug existe tjs, augmenter la ; valeur de more! (l''explication et la justification de ; cette methode n''ont pas encore de fondements ; scientifiques)... ; ; ; ; /NOFILL: pour faire juste les isolignes ; ; /NOCONTOUR: pour faire juste les couleurs ; ; /UNSUR2: pour tarcer une isoligne sur 2 ; ; UNLABSUR: entier n. specifant qu''on ne labelle qu''un ; contour sur n ; ; CONTOUR: pour etrte utilise depuis plt, pltz ou pltt. cf ces ; routines. ; ; _EXTRA: mot cle magique d''idl pour faire passer tous lse ; mots cles acceptes par les routines et fonctions utilises ds ; ce programme sans les declarer explicitement. ; ; OUTPUTS: ; ; COMMON BLOCKS: ; common.pro ; ; SIDE EFFECTS: ; ; RESTRICTIONS:ds le cas ou z2d, x et y sont des tableaux de meme ; taille il faut les metre sous forme de vecteur: z2d[*], x[*], y[*]. ; ; EXAMPLE: ; ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) ; ???? ; 8/2/2000 check if the tri array is not equal to ; -1. allow contour with out using a triangulation. ; ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ PRO pltbase, z2d, x, y, mask, xm, ym, levels, colors, UNSUR2 = unsur2, CONTOUR = contour $ , NOCONTOUR = nocontour, NOFILL = nofill $ , TRICHAMP = trichamp, TRIMSK = trimsk $ , REALCONT = realcont, NAN = nan, usetri = usetri $ , COLORTRICHAMP = colortrichamp, COLORTRIMASK = colortrimask $ , COLORTRINAN = colortrinan $ , COLORPOINTS = colorpoints, DRAWPOINTS = drawpoints $ , TH_TRICHAMP = th_trichamp, TH_TRIMASK = th_trimask $ , DESSTRICHAMP = desstrichamp, DESSTRIMASK = desstrimask $ , DESSTRINAN = desstrinan, COLOR_C = color_c $ , I_COLORS = i_colors, CONT_COLOR = CONT_COLOR $ , CONT_NOFILL = cont_nofill, UNLABSUR = unlabsur $ , COINMONTEMASK = coinmontemask, COINDESCENDMASK = coindescendmask $ , COINMONTENAN = coinmontenan, COINDESCENDNAN = coindescendnan $ , INDICEZOOMMASK = indicezoommask, INDICEZOOMNAN = indicezoomnan $ , MASKNAN = masknan, TRINAN = trinan $ , FORPLT = forplt, REALSECTION = realsection $ , MORE = more, EXCHANGE_XY = exchange_xy $ , _EXTRA = ex ;--------------------------------------------------------- @cm_4mesh IF NOT keyword_set(key_forgetold) THEN BEGIN @updatenew @updatekwd ENDIF ;--------------------------------------------------------- ; ; explication concernant contour. Ce mot cle est active qd on on trace ; un contour en couleur different de celui en trait noir. ; si il est active (cas n_elements(contour) NE 0), on passe 2 fois ds pltbase: ; 1) on trace les couleurs puis on sort c''est le cas: ; n_elements(contour) NE 0 AND n_elements(contour) NE 4) ; 2) on trace les contour en trait puis les continents c''est le cas ; n_elements(contour) NE 0 AND n_elements(contour) EQ 4) ; ;------------------------------------------------------------ tempsun = systime(1) ; pour key_performance if n_elements(mask) EQ 0 then mask = 1b if n_elements(masknan) EQ 0 then masknan = 1b IF total(mask) EQ n_elements(z2d) THEN mask = 1b ;---------------------------------------------------------------------- ; si les niveaux et les couleurs ne sont pas donnes ;---------------------------------------------------------------------- if n_params() EQ 4 then $ label, 0, min(z2d*mask), max(z2d*mask), ncontour, levels, colors ; attention bidouille inexplicable pour que tout se passe bien avec les ; postcript ds pltz!!! if n_elements(contour) LE 4 AND !x.type EQ 0 THEN $ plot, [0], [0], xstyle = 5, ystyle = 5, /nodata, /noerase, title = '', subtitle = '' ;---------------------------------------------------------------------- ; si cell_fill fait partit de _extra, on le desactive si il n''est pas ; egale a 2 ;---------------------------------------------------------------------- IF chkstru(ex, 'CELL_FILL') THEN BEGIN cell_fill = ex.CELL_FILL if ex.CELL_FILL NE 2 then ex.CELL_FILL = 0 ENDIF ELSE cell_fill = 0 ; ;---------------------------------------------------------------------- ; I) remplissage des contours en palette de couleur ;---------------------------------------------------------------------- if NOT keyword_set(more) then more = 10 if NOT keyword_set(nofill) AND NOT keyword_set(color_c) then begin if n_elements(contour) NE 4 THEN BEGIN if usetri EQ 2 then BEGIN IF size(x, /n_dimensions) EQ 1 THEN x = x#replicate(1, (size(z2d))[2]) IF size(y, /n_dimensions) EQ 1 THEN y = replicate(1, (size(z2d))[1])#y contour, [z2d[*], fltarr(more)], [x[*], fltarr(more)] $ , [y[*], fltarr(more)], levels = levels, c_color = colors $ , /noerase, /fill, TRIANGULATION = trichamp, _extra = ex ENDIF ELSE BEGIN IF size(x, /n_dimensions) EQ 2 THEN x = x[*, 0] IF size(y, /n_dimensions) EQ 2 THEN y = reform(y[0, *]) contour, z2d, x, y, levels = levels, c_color = colors, /noerase $ , /fill, _extra = ex ENDELSE ENDIF ENDIF if n_elements(contour) NE 0 AND n_elements(contour) NE 4 THEN GOTO, fini IF chkstru(ex, 'C_ORIENTATION') THEN ex = extractstru(ex, 'C_ORIENTATION') IF chkstru(ex, 'C_SPACING') THEN ex = extractstru(ex, 'C_SPACING') IF chkstru(ex, 'C_COLORS') THEN ex = extractstru(ex, 'C_COLORS') ;------------------------------------------------------------ ; II) trace des contours en trait ;------------------------------------------------------------ if n_elements(contour) EQ 4 OR n_elements(contour) EQ 0 THEN BEGIN ; ; we put the masked values to NaN ; IF (n_elements(mask) GT 1 OR n_elements(masknan) GT 1) $ AND NOT keyword_set(cont_nofill) THEN BEGIN ; tonan = where((mask*masknan) EQ 0, count) tonan = where(remplit(mask*masknan, nite = 1, mask = mask*masknan $ , /basique, fillval = 0 $ , fillxdir = keyword_set(realsection)) EQ 0, count) IF count NE 0 THEN z2d[temporary(tonan)] = !values.f_nan ENDIF ; ; on ne passe pas si on doit faire des contours differents... ; ds le cas on unsur2 est active on reduit levels if NOT keyword_set(nocontour) then begin IF keyword_set(unsur2) THEN levels = levels(where(zeroun(n_elements(levels) ) eq 1)) ; unlabsur est active? C_LABEL est passe via _EXTRA? if keyword_set(unlabsur) THEN IF chkstru(ex, 'C_LABELS') THEN $ ex.C_LABELS = 1-((indgen(n_elements(ex.C_LABELS)) MOD unlabsur) < 1) ; ; pour ne pas filler qd cell_fill est impose... IF chkstru(ex, 'CELL_FILL') THEN ex.CELL_FILL = 0 ; CASE 1 OF keyword_set(color_c):c_colors = colors keyword_set(i_colors):c_colors = i_colors ELSE: ENDCASE ; IF usetri EQ 2 THEN BEGIN IF size(x, /n_dimensions) EQ 1 THEN x = x#replicate(1, (size(z2d))[2]) IF size(y, /n_dimensions) EQ 1 THEN y = replicate(1, (size(z2d))[1])#y contour, [z2d[*], fltarr(more)], [x[*], fltarr(more)] $ , [y[*], fltarr(more)], levels = levels $ , overplot = 1-keyword_set(nofill), noerase = keyword_set(nofill) $ , c_colors = c_colors, TRIANGULATION = trichamp, _extra = ex ENDIF ELSE BEGIN IF size(x, /n_dimensions) EQ 2 THEN x = x[*, 0] IF size(y, /n_dimensions) EQ 2 THEN y = reform(y[0, *]) contour, z2d, x, y, levels = levels $ , overplot = 1-keyword_set(nofill), noerase = keyword_set(nofill) $ , c_colors = c_colors, _extra = ex ENDELSE ENDIF ;---------------------------------------------------------------------- ; III) remplissage des continents de couleur ;---------------------------------------------------------------------- IF chkstru(ex, 'CELL_FILL') THEN ex.CELL_FILL = cell_fill < 1 IF chkstru(ex, 'LEVELS') THEN ex = extractstru(ex, 'LEVELS') IF chkstru(ex, 'NODATA') THEN ex = extractstru(ex, 'NODATA') IF NOT keyword_set(cont_color) THEN cont_color = (!d.n_colors-1) < 255 ; ; si il y a des points a nan ; on trace en blanc les points a nan avant de dessiner les cotes avec ; un trait. ; if keyword_set(trinan) THEN BEGIN IF size(x, /n_dimensions) EQ 1 THEN x = x#replicate(1, (size(masknan))[2]) IF size(y, /n_dimensions) EQ 1 THEN y = replicate(1, (size(masknan))[1])#y contour, [1b-masknan[*], fltarr(more)], [x[*], fltarr(more)] $ , [y[*], fltarr(more)], levels = 0.5, /overplot, /fill $ , c_colors = cont_color, TRIANGULATION = trinan, _extra = ex IF keyword_set(forplt) THEN $ completecointerre, COINMONTE = coinmontenan $ , COINDESCEND = coindescendnan, INDICEZOOM = indicezoomnan $ , CONT_COLOR = cont_color, _EXTRA = ex $ ELSE fillcornermask, x[*, 0], y[0, *], COINMONTE = coinmontenan $ , COINDESCEND = coindescendnan, CONT_COLOR = cont_color, _extra = ex ENDIF ; ; remplissage des continents ; if keyword_set(realcont) then if realcont EQ 1 then mask = 1b if n_elements(mask) NE 1 then BEGIN ; si mask=1 on saute. ; if NOT keyword_set(cont_nofill) then BEGIN ; ; mask filling ; case 1 of keyword_set(realsection):drawsectionbottom, mask, xm, ym $ , CONT_NOFILL = cont_nofill, CONT_COLOR = cont_color, _EXTRA = ex usetri GE 1:BEGIN if n_elements(trimsk) eq 0 then trimsk = trichamp IF size(xm, /N_DIMENSIONS) EQ 1 THEN xm = xm#replicate(1, (size(mask))[2]) IF size(ym, /N_DIMENSIONS) EQ 1 THEN ym = replicate(1, (size(mask))[1])#ym contour, [1b-mask[*], fltarr(more)], [xm[*], fltarr(more)] $ , [ym[*], fltarr(more)], LEVELS = 0.5, /OVERPLOT, /FILL $ , C_COLORS = cont_color, TRIANGULATION = trimsk, _extra = ex IF keyword_set(forplt) THEN $ completecointerre, COINMONTE = coinmontemask $ , COINDESCEND = coindescendmask, INDICEZOOM = indicezoommask $ , CONT_COLOR = cont_color, _EXTRA = ex $ ELSE fillcornermask, xm[*, 0], ym[0, *], COINMONTE = coinmontemask $ , COINDESCEND = coindescendmask, CONT_COLOR = cont_color, _extra = ex END ELSE:BEGIN IF size(xm, /n_dimensions) EQ 2 THEN xm = xm[*, 0] IF size(ym, /n_dimensions) EQ 2 THEN ym = reform(ym[0, *]) contour, 1b-mask, xm, ym, LEVELS = 0.5, /OVERPLOT $ , /FILL, C_COLORS = cont_color, _EXTRA = ex END ENDCASE ENDIF ; NOT keyword_set(cont_nofill) ;------------------------------------------------------------ ; IV) trace les cotes en trait ;------------------------------------------------------------ case 1 of keyword_set(realsection) AND NOT keyword_set(cont_nofill): keyword_set(realsection) AND keyword_set(cont_nofill): $ drawsectionbottom, mask, xm, ym $ , CONT_NOFILL = cont_nofill, _extra = ex (keyword_set(forplt) AND (!map.projection GT 0 OR key_irregular)) $ OR keyword_set(nan):tracecote, _extra = ex ELSE:tracemask, mask, xm, ym, _extra = ex endcase ; ENDIF ; n_elements(mask) NE 1 ENDIF ;------------------------------------------------------------ ; draw the triangulations ;------------------------------------------------------------ if keyword_set(desstrichamp) then $ dessinetri, trichamp, x, y, color = colortrichamp, thick = th_trichamp if keyword_set(desstrimask) then $ dessinetri, trimsk, xm, ym, color = colortrimask, thick = th_trimask if keyword_set(desstrinan) then $ dessinetri, trinan, x, y, color = colortrinan if keyword_set(drawpoints) then $ tracegrille, x, y, color = colorpoints ;------------------------------------------------------------ ; fini: IF keyword_set(key_performance) THEN print, 'temps pltbase', systime(1)-tempsun return end