Index: trunk/ToBeReviewed/PLOTS/DESSINE/plt.pro
===================================================================
--- trunk/ToBeReviewed/PLOTS/DESSINE/plt.pro	(revision 42)
+++ trunk/ToBeReviewed/PLOTS/DESSINE/plt.pro	(revision 67)
@@ -18,7 +18,6 @@
 ;	champ: le champ dont on veut faire la carte horizontale champ
 ;	peut etre de 2 types:
-;         1) un tableau 2d ou 3d. Si le champ est un tableau 3d on en
-;         extrait un tableau 2d au niveau stipule par l''utilisateur
-;         qui repond a une question.
+;         1) an array. if needed, its mean along the z and t direction
+;         will be automatically performed.
 ;         2) une structure repondant aux critaire specifies par
 ;         litchamp.pro. cf. IDL> xhelp,'litchamp'
@@ -34,19 +33,19 @@
 ; KEYWORD PARAMETERS:
 ;
-;	BOITE:vecteur indiquant la zone geographique sur laquelle doit etre
-; faite la coupe. Si BOITE a :
-; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
-; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
-; 4 elements: l''extraction est faite sur [Boite, 0, max([gdept, gdepw])]
-; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
-; 6 elements: l''extraction est faite sur Boite
+;	BOXZOOM:vecteur indiquant la zone geographique sur laquelle doit etre
+; faite la coupe. Si BOXZOOM a :
+; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boxzoom[0]]
+; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boxzoom[0],boxzoom[1]]
+; 4 elements: l''extraction est faite sur [Boxzoom, 0, max([gdept, gdepw])]
+; 5 elements: l''extraction est faite sur [Boxzoom[0:3], 0, Boxzoom[4]]
+; 6 elements: l''extraction est faite sur Boxzoom
 ;
 ; Ou lon1, lon2,lat1,lat2 sont les variables globales
 ; definies lors du dernier domdef!
 ;
-;	CARTE:Permet de dessiner les continents definits ds IDL. CARTE
+;	REALCONT:Permet de dessiner les continents definits ds IDL. REALCONT
 ;	peut prendre deux formes:
-;           /CARTE: on dessine les continents a la place du mask
-;           CARTE=2 on dessine le contours des continents par
+;           /REALCONT: on dessine les continents a la place du mask
+;           REALCONT=2 on dessine le contours des continents par
 ;           dessus le dessin masque (ceci permet de voir si le masque
 ;           correspond bien aux continents reels).
@@ -62,11 +61,20 @@
 ;      .5 et 1.5 cm
 ;
+;        COAST_COLOR: the color of the coastline.
+;                     defaut value is 0 => black
+;
+;        COAST_THICK: the thickness of the coastline.
+;                     defaut value is 1
+;
 ;        /CONT_NOFILL: activer pour ne pas remplir les points masques
-;        a la couleur c_cont mais pour les laisser en transparent! Rq
-;        on trace qd meme le contour du mask de la couleur c_cote
+;        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
 ;
 ;	CONTINTERVALLE: lorsque CONTOUR est active, valeur d'un
-; intervalle entre deux isolignes traces par un trait ds la couleur
-; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE
+; intervalle entre deux isolignes traces par un trait. Il peut ainsi
+; etre different de celui specifie par INTERVALLE 
 ; qui, cas ce cas, ne controle que les isolignes coloriees en
 ; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
@@ -81,14 +89,14 @@
 ;	CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on
 ; veut prendre en compte dans le trace des isolignes traces par un
-; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
+; trait. Par defaut on prend le max (sur les pts mer)
 ; du tableau passe ds le mot cle CONTOUR. 
 ;
 ;	CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on
 ; veut prendre en compte dans le trace des isolignes traces par un
-; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
+; trait. Par defaut on prend le max (sur les pts mer)
 ; du tableau passe ds le mot cle CONTOUR. 
 ;
 ;	CONTNLEVEL: lorsque CONTOUR est active, nombre de contours
-; trace par un trait de couleur c_lab a dessiner (actif si
+; trace par un trait a dessiner (actif si
 ; CONTLABEL=0) par defaut =20.
 ;
@@ -98,5 +106,5 @@
 ; que l''argument numero 1 de plt
 ;
-;       GRILLE:'U','T','V','W' ou 'F' pour specifer eventuellement la
+;       GRIDTYPE:'U','T','V','W' ou 'F' pour specifer eventuellement la
 ;       grille a laquelle est rattache le champ. Rq: il afaut mieux
 ;       utiliser ds ce cas une structure comme champ
@@ -108,5 +116,5 @@
 ; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
 ; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
-; de couleur c_lab utiliser CONTINTERVALLE.
+; utiliser CONTINTERVALLE.
 ;
 ;	/INV: inverse le vecteur couleur utilise pour colorier le graphe
@@ -116,6 +124,6 @@
 ; label correspondant aux cas n. cf label.pro
 ; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les
-; isolignes coloriees en couleur. Pour celles tracees par un trait de
-; couleur c_lab utiliser CONTLABEL.
+; isolignes coloriees en couleur. Pour celles tracees par un trait
+; utiliser CONTLABEL. 
 ;
 ;	/LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
@@ -142,4 +150,8 @@
 ; IDL> plt, tab, /stereo,map=[-90,0,0]
 ;
+;       labmap: corresponds to label keywords of map_set. Defaut
+;       definition is labmap=1
+;
+;
 ;       MAXIN: permet de specifier la valeur maximum que l''on veut
 ;       prendre en compte dans le trace des contours a l''aide d''un
@@ -162,5 +174,5 @@
 ;	les couleurs
 ;
-;	/NOCOULEUR: activer si on veut juste les contours en noir et
+;	/NOFILL: activer si on veut juste les contours en noir et
 ;	blanc sur fond blanc
 ;
@@ -222,7 +234,4 @@
 ; defaut style=0. cf style.pro
 ;
-;	/TRANS: fait un postscript (active /post automatiquement) et l''imprime
-; -si on le desire- sur un transparant
-;
 ;        UNLABSUR: entier n. specifant qu''on ne labelle qu''un
 ;        contour sur n. Par defaut unlabsur=2
@@ -259,8 +268,11 @@
 ; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
 ;
-;	YSURX: rapport d'echelle entre y et x (par ex: =1 pour un repere
+;	YXASPECT: rapport d'echelle entre y et x (par ex: =1 pour un repere
 ; orthonorme, =2 si l'axe des y est deux fois plus dilate que celui des x).
 ; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
 ; postScript ou pour cree une fenetre pas trop etiree
+;
+;       /ZEROMIDDLE: fo force the middle of the colorbar to be equal
+;       to 0 (force max=max(abs([min,max])) and min=-max)
 ;
 ; COMMON BLOCKS:
@@ -281,14 +293,23 @@
 ;------------------------------------------------------------
 ;------------------------------------------------------------
-pro plt,tab1, giventype,givenmin,givenmax,CARTE=carte,CONTOUR=contour $
-        ,INTERVALLE=intervalle,INV=inv, GRILLE = grille, BOITE = boite $
-        ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $
-        ,STYLE=style,CONTMAX=contmax,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $
-        , VECTEUR=vecteur,MAP = map, MININ = minin, MAXIN = maxin $
-        , CONT_NOFILL = cont_nofill, NIVEAUDESSIN = niveaudessin, NOTRI = notri $
-        , DUPLICATE = duplicate, STRICTFILL = strictfill, OVERPLOT = overplot, _extra = ex
-@common
-;--------------------------------------------------------------
-   tempsun = systime(1)         ; pour key_performance
+pro plt, tab1, giventype, givenmin, givenmax, REALCONT = realcont, CONTOUR = contour $
+         , INTERVALLE = intervalle, INV = inv, GRIDTYPE = gridtype, BOXZOOM = boxzoom $
+         , CONTINTERVALLE = contintervalle, LABEL = label, CONTLABEL = contlabel $
+         , STYLE = style, CONTMAX = contmax, CONTMIN = contmin, NLEVEL = nlevel, CONTNLEVEL = contnlevel $
+         , VECTEUR = vecteur, MAP = map, MININ = minin, MAXIN = maxin $
+         , CONT_NOFILL = cont_nofill $
+         , USETRI = usetri, NOTRI = notri, MASKFILL = maskfill $
+         , DUPLICATE = duplicate, STRICTFILL = strictfill, OVERPLOT = overplot $
+         , DECIMATETRI = decimatetri,  LABMAP = labmap, _extra = ex
+;---------------------------------------------------------
+; include common
+@cm_4mesh
+@cm_4data
+  IF NOT keyword_set(key_forgetold) THEN BEGIN
+@updatenew
+@updatekwd
+  ENDIF
+;--------------------------------------------------------------
+  tempsun = systime(1)          ; pour key_performance
 ;--------------------------------------------------------------
 ;--------------------------------------------------------------
@@ -298,60 +319,83 @@
 ; I1) verification du type de grille associe a tab1
 ;--------------------------------------------------------------
-   if keyword_set(grille) then vargrid = grille
-   if keyword_set(vecteur) AND (NOT keyword_set(grille)) then BEGIN
-      vargrid = litchamp(tab1, /grid)
-      if vargrid eq '' then BEGIN
-         vargrid = xquestion('Quelle est la grille a laquelle le champ a tracer se rapporte?', 'T', /chkwidget)
-         vargrid = strupcase(vargrid)
-      endif
-   ENDIF
+  if keyword_set(gridtype) then vargrid = gridtype
+  if keyword_set(vecteur) AND (NOT keyword_set(gridtype)) then BEGIN
+    vargrid = litchamp(tab1, /grid)
+    if vargrid eq '' then BEGIN
+      vargrid = xquestion('What is the grid associated to the data to contour?', 'T', /chkwidget)
+      vargrid = strupcase(vargrid)
+    endif
+  ENDIF
 ;--------------------------------------------------------------
 ; I2) lecture du champ et checkup.
 ;--------------------------------------------------------------
-   if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
-   if n_elements(giventype) NE 0 then type = giventype
-   if n_elements(givenmin) NE 0 then min = givenmin
-   if n_elements(givenmax) NE 0 then max = givenmax
-   if n_elements(minin) NE 0 then min = minin
-   if n_elements(maxin) NE 0 then max = maxin
-   checktypeminmax, 'plt', TYPE = type, MIN = min, MAX = max
-   z2d = checkfield(tab1, 'plt', TYPE = type, BOITE = boite, DIREC = direc, VECTEUR = vecteur, _extra = ex)
-   if z2d[0] EQ -1 then BEGIN 
-      if keyword_set(boite) then domdef, oldboite,GRILLE=vargrid
-      return
-   endif
+  if keyword_set(boxzoom) AND n_elements(contour) ne 4  then BEGIN
+    savedbox = 1b
+    saveboxparam, 'boxparam4plt.dat'
+  END
+  if n_elements(giventype) NE 0 then type = giventype
+  if n_elements(givenmin) NE 0 then min = givenmin
+  if n_elements(givenmax) NE 0 then max = givenmax
+  if n_elements(minin) NE 0 then min = minin 
+  if n_elements(maxin) NE 0 then max = maxin
+  checktypeminmax, 'plt', TYPE = type, MIN = min, MAX = max, _extra = ex
+  z2d = checkfield(tab1, 'plt', TYPE = type, BOXZOOM = boxzoom, DIREC = direc, VECTEUR = vecteur, _extra = ex) 
+  if z2d[0] EQ -1 then BEGIN 
+    IF keyword_set(savedbox) THEN restoreboxparam, 'boxparam4plt.dat'
+    return
+  ENDIF
+  IF n_elements(usetri) EQ 0 THEN BEGIN
+; do we have holes in the triangulation?
+    holeintri = n_elements(triangles_list)/3 LT (jpi-1+keyword_set(key_periodic))*(jpj-1)*2 ; -> the triangulation must be used to draw the data 
+; do we have a triangulation?
+    wehavetri = triangles_list[0] NE -1 ; -> the triangulation must be used to draw the continents
+; if we make a map, are we periodic and nx=jpi ?
+    CASE strupcase(vargrid) OF
+      'T':nx = nxt
+      'W':nx = nxt
+      'U':nx = nxu
+      'V':nx = nxv
+      'F':nx = nxf
+    ENDCASE
+    mapperio = keyword_set(map)*keyword_set(key_periodic)*(nx eq jpi) 
+    usetri = (wehavetri*(wehavetri+holeintri+mapperio+keyword_set(key_irregular))) < 2
+    IF n_elements(notri) NE 0 THEN usetri = 0 > (2-notri)
+  ENDIF
 ;--------------------------------------------------------------
 ; I3) reinitialisation. !p.,!x.,!y.
 ; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
 ;--------------------------------------------------------------
-   if n_elements(contour) ne 4 AND NOT keyword_set(overplot) then reinitplt, /z,/invert
+  if n_elements(contour) ne 4 AND NOT keyword_set(overplot) then reinitplt, /z, /invert
 ;---------------------------------------------------------------
 ; I4) attribution du mask et des tableaux de longitude et latitude
 ;---------------------------------------------------------------
-   if keyword_set(niveaudessin) then niveau = niveaudessin
-   if n_elements(gdept) GE 2 then begin
-      IF gdept[0] LT gdept[1] THEN profond = niveau NE 1 ELSE profond = niveau NE jpk
-   ENDIF ELSE profond = niveau NE 1
-   if keyword_set(profond) then $
-; si on fait un plt en profondeur, il faudra recalculer la
-; triangulation, ca ne sert donc a rien de calculer tri maintenant
-; (surtout que c''est assez couteux!)
-   grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $
-    , dernierz, /forplt, _extra = ex ELSE $
-    grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $
-    , dernierz, TRI = tri, /forplt, _extra = ex
-   if keyword_set(notri) then tri = -1
-   if keyword_set(profond) AND triangles[0] EQ -1 then tri = -1
+  IF  strupcase(vargrid) EQ 'W' THEN profond = firstzw NE 0 $
+  ELSE profond = firstzt NE 0 
+; do we need to extract now the triangulation that will be use for
+; contouring the data?
+  if keyword_set(profond) $
+    OR (usetri EQ 0 AND (vargrid EQ 'T' OR vargrid EQ 'W')) $
+    OR (usetri NE 2 AND (vargrid NE 'T' AND vargrid NE 'W')) THEN BEGIN
+    grille, mask, glam, gphi, gdep, nx, ny, nz $
+      , firstx, firsty, firstz, lastx $
+      , lasty, lastz, /forplt, _extra = ex
+  ENDIF ELSE BEGIN
+    grille, mask, glam, gphi, gdep, nx, ny, nz $
+      , firstx, firsty, firstz, lastx, lasty $
+      , lastz, TRI = trifield, /forplt, _extra = ex
+  ENDELSE
 ;----------------------------------------------------------------------------
 ; I5 determination du mi:min et du ma:max de z2d ainsi que de max: max et
 ;    min: min pour le dessin.
 ;-----------------------------------------------------------------------------
-   nan = total(finite(z2d,/nan)) < 1
+  masknan = finite(z2d)
+  nan = total(masknan) NE n_elements(z2d) 
 ; faudra-t-il faire un autoscale ???
-   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
-   determineminmax, z2d, mask, mi, ma, glam, gphi, MININ = min, MAXIN = max, nan = nan,INTERVALLE=intervalle
-   if z2d[0] EQ -1 THEN GOTO, sortie
+  autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
+  determineminmax, z2d, mask, mi, ma, glam, gphi, MININ = min, MAXIN = max $
+    , nan = nan, INTERVALLE = intervalle, usetri = usetri, _extra = ex
+  if z2d[0] EQ -1 THEN GOTO, sortie
 ; on fait un autoscale si besoin
-   if autoscale then autoscale, min, max, intervalle
+  if autoscale then autoscale, min, max, intervalle
 ;--------------------------------------------------------------
 ;--------------------------------------------------------------
@@ -359,6 +403,6 @@
 ; eventuelle de la fenetre et de la page
 ;--------------------------------------------------------------
-   if n_elements(contour) NE 4 AND NOT keyword_set(overplot) THEN $
-    placedessin, 'plt',posfenetre, posbar $
+  if n_elements(contour) NE 4 AND NOT keyword_set(overplot) THEN $
+    placedessin, 'plt', posfenetre, posbar $
     , CONTOUR = contour, VECTEUR = vecteur, MAP = map, DIREC = direc, _extra = ex
 ;--------------------------------------------------------------
@@ -371,18 +415,18 @@
 ; III1) choix des labels
 ;-----------------------------------------------------------
-   if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
-   if keyword_set(label) eq 0 then cas=0 else cas=label
-   label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill
+  if keyword_set(intervalle) AND NOT keyword_set(label) then label = 1
+  if keyword_set(label) eq 0 then cas = 0 else cas = label
+  label, cas, min, max, ncontour, level_z2d, colnumb, NLEVEL = nlevel $
+    , INTERVALLE = intervalle, strictfill = strictfill
 ;--------------------------------------------------------------
 ; III2)choix de style
 ;-----------------------------------------------------------
-   if not keyword_set(style) then style=0
-   style,style,level_z2d,linestyle,thick
-   if keyword_set(inv) then couleur=reverse(couleur)
+  if not keyword_set(style) then style = 0
+  style, style, level_z2d, linestyle, thick
+  if keyword_set(inv) then colnumb = reverse(colnumb)
 ;-----------------------------------------------------------
 ; III3) definition des axes
 ;----------------------------------------------------------
-   if NOT keyword_set(overplot) THEN axe, 'xy', _EXTRA = ex
-;   IF NOT(keyword_set(map)) then axe, 'xy'
+  if NOT keyword_set(overplot) THEN axe, 'xy', _EXTRA = ex
 ;--------------------------------------------------------------
 ;--------------------------------------------------------------
@@ -391,53 +435,30 @@
 ;--------------------------------------------------------------
 ;--------------------------------------------------------------
-   mask = mask[*, *,niveau-1-premierz]
-   if keyword_set(nan) then begin
-      notanumber = where(finite(z2d, /nan) EQ 1)
-      z2d[notanumber] = max
-      masknan = replicate(1, nx, ny)
-      masknan[notanumber] = 0
-   ENDIF ELSE masknan = 1
-   z2d = remplit(z2d,nite=(1+(vargrid NE 'T' AND vargrid NE 'W')+keyword_set(nan)) $
-                 *(1-keyword_set(cont_nofill)) $
-                 , mask = mask*masknan, _extra=ex)
-   if NOT keyword_set(strictfill) then z2d = min > z2d <  max
-;
-   if vargrid EQ 'T' OR vargrid EQ 'W' then BEGIN 
-; ds ce cas, le masque utilise pour le champ est le meme que celui
-; utilise pour la terre.
-; si on fait un dessin en profondeur ou qu''il y a des pts a nan on
-; redefinit une triangulation sur le zoom
-      if keyword_set(profond) OR keyword_set(nan) then BEGIN
-         if ( (testvar(var = tri))[0] NE -1 OR keyword_set(nan) ) $
-          AND NOT keyword_set(notri) then BEGIN
-            IF keyword_set(cont_nofill) then BEGIN
-               if keyword_set(nan) then begin
-                  tri = triangule(masknan, coinmonte = coinmontemask, coindescend = coindescendmask $
-                                  , periodique = keyword_set(key_periodique)*(nx EQ jpi))
-               ENDIF ELSE BEGIN
-                  tri = definetri(nx, ny)
-                  coinmontemask = -1
-                  coindescendmask = -1
-               ENDELSE
-            ENDIF ELSE BEGIN
-               mask = temporary(masknan*mask)
-               tri = triangule(mask, coinmonte = coinmontemask, coindescend = coindescendmask $
-                               , periodique = keyword_set(key_periodique)*(nx EQ jpi))
-            ENDELSE 
-         ENDIF
-         indicezoommask = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery]
-      ENDIF ELSE BEGIN
-         if keyword_set(cont_nofill) AND (testvar(var = tri))[0] NE -1 then BEGIN
-            tri = definetri(nx, ny)
-            coinmontemask = -1
-            coindescendmask = -1
-         endif
-      ENDELSE
-      glammsk = glam
-      gphimsk = gphi
-   ENDIF ELSE BEGIN 
-; ds ce cas, le masque utilise pour le champ n''est pas le meme que celui
-; utilise pour la terre (grille T);
-;
+;--------------------------------------------------------------
+; extrapolation des donnees sur les terres et seuillage
+;--------------------------------------------------------------
+  if keyword_set(nan) then begin
+    z2d[where(masknan EQ 0)] = max
+  ENDIF ELSE masknan = 1
+; filling the mask values
+; we fill only masknan or we fill mask*masknan?
+  IF keyword_set(nan) AND keyword_set(cont_nofill) THEN $
+    z2d = remplit(z2d, nite = 1+(vargrid NE 'T' AND vargrid NE 'W') $
+                  , mask = masknan, _extra = ex) $
+   ELSE z2d = remplit(z2d, nite = (1 + (vargrid NE 'T' AND vargrid NE 'W') $
+                                   + keyword_set(nan)) $
+                      *(1-keyword_set(cont_nofill)) $
+                      *(1-(n_elements(maskfill) NE 0)) $
+                , mask = mask*masknan, _extra = ex)
+  IF keyword_set(strictfill) EQ 0 AND n_elements(maskfill) EQ 0 then $
+    z2d = min > z2d <  max
+  if n_elements(maskfill) NE 0 then BEGIN
+    z2d = temporary(z2d)*mask*masknan
+    if maskfill NE 0 then z2d = temporary(z2d) + maskfill*(1-mask*masknan)
+  ENDIF
+;----------------------------------------------------------
+; check the mask and the triangulation according to the grid type and 
+; nan values.
+;---------------------------------------------------------- 
 ; si on fait un dessin en profondeur on redefinit une triangulation
 ; sur le zoom, cette triangulation sera utilisee pour tracer le
@@ -446,117 +467,136 @@
 ; masque et correspondent bien au trous qu''il y a a cette nouvelle
 ; profondeur.
-      if keyword_set(profond) AND (testvar(var = tri))[0] NE -1 then BEGIN
-         if keyword_set(cont_nofill) then BEGIN
-            tri = definetri(nx, ny)
-            coinmontemask = -1
-            coindescendmask = -1
-         ENDIF ELSE $
-          tri = triangule(tmask[premierx:dernierx, premiery:derniery, niveau-1] $
-                          , coinmonte = coinmontemask, coindescend = coindescendmask $
-                          , periodique = keyword_set(key_periodique)*(nx EQ jpi))
-      ENDIF
-; si on a des pts a nan, comme la grille du mask est differente de
-; celui du mask il faudra les tracer a part. on definit donc pour cela
-; trinan, coinmontenan, coindescendnan, indicezoomnan, xnan et ynan
-; qui permettront de tracer masknan independemment du mask terre.
-; Rq: on utilise xnan, ynan au lieu de glam et gphi car pour ces 2
-; derniers tableaux calcules par grille on a active /forplt donc leur
-; valeur sur les points terre est celle de glamt et gphit.
-      if keyword_set(nan) AND NOT keyword_set(notri) then BEGIN
-         trinan = triangule(1-masknan $
-                            , coinmonte = coinmontenan, coindescend = coindescendnan $
-                            , periodique = keyword_set(key_periodique)*(nx EQ jpi))
-         indicezoomnan = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery]
-         grille, rien, xnan, ynan
-         undefine, rien
-      ENDIF
-; decoupe terre: pour que le tarce des cotes soient propres on essaye de
-; prenddre des points en + pour la terre comme ca on ne voit pas le
+  if (keyword_set(profond) OR keyword_set(cont_nofill)) $
+    AND ((usetri GE 1 AND (vargrid EQ 'T' OR vargrid EQ 'W')) $
+         OR (usetri EQ 2 AND (vargrid NE 'T' AND vargrid NE 'W'))) then BEGIN
+    trifield = triangule(tmask[firstx:lastx, firsty:lasty, firstz] $
+                         , coinmonte = coinmontemask $
+                         , coindescend = coindescendmask $
+                         , keep_cont = cont_nofill, _extra = ex)
+    indicezoommask = (lindgen(jpi, jpj))[firstx:lastx, firsty:lasty]
+  ENDIF
+; triangulation for nan mask
+  if keyword_set(nan) then BEGIN
+    trinan = triangule(masknan, /keep_cont $
+                       , coinmonte = coinmontenan $
+                       , coindescend = coindescendnan)
+    indicezoomnan = (lindgen(jpi, jpj))[firstx:lastx, firsty:lasty]
+  ENDIF
+;  IF n_elements(twin_corners_up) EQ 0 THEN coinmontemask = -1 ELSE coinmontemask = twin_corners_up
+;  IF n_elements(twin_corners_dn) EQ 0 THEN coindescendmask =  -1 ELSE coindescendmask = twin_corners_dn
+  if vargrid EQ 'T' OR vargrid EQ 'W' then BEGIN 
+    glammsk = glam
+    gphimsk = gphi
+  ENDIF ELSE begin
+; decoupe terre: pour que le trace des cotes soit propre on essaye de
+; prendre des points en + pour la terre comme ca on ne voit pas le
 ; decalage des grilles. c''est ce que fait decoupeterre. au passage on
 ; redefinit trimsk.
-      decoupeterre, mask, glammsk, gphimsk, TRI = trimsk, indicezoom = indicezoommask $
-       , coinmonte = coinmontemask, coindescend = coindescendmask, _EXTRA = ex
-   ENDELSE 
+    decoupeterre, mask, glammsk, gphimsk, type = 'xy'$
+      , TRI = trimsk, usetri = usetri, indicezoom = indicezoommask $
+      , coinmonte = coinmontemask, coindescend = coindescendmask $
+      , _EXTRA = ex
+  ENDELSE
 ;------------------------------------------------------------
 ; IV1) choix du type de dessin
 ;------------------------------------------------------------
-   typetrace = 'classique'
-   if keyword_set(map) then BEGIN 
+  typetrace = 'classique'
+  if keyword_set(map) AND key_onearth then BEGIN 
 ; appelle de mapset qd on veut faire des projections
-      IF n_elements(map) NE 3 THEN map = [0, ((lon1+lon2)/2.) MOD 360, 0]
-      typetrace = 'projection'
-      map_lat = map[0]
-      map_lon = map[1]
-      map_rot = map[2]
-      if chkstru(ex, 'TITLE') then begin
-         maptitre = ex.title 
-         ex.title = ''
-      endif
-      map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $
-       ,limit = [lat1, lon1, lat2, lon2], /noborder
-      if n_elements(maptitre) ne 0 then ex.title = maptitre
-      if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex)
-      if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk,glammsk,gphimsk,_EXTRA=ex)
-      if n_elements(trinan) GE 2 then BEGIN 
-         trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex)
-         if trinan[0] EQ -1 then undefine, trinan
-      endif
-   ENDIF ELSE BEGIN 
+    IF n_elements(map) NE 3 THEN map = [0, ((lon1+lon2)/2.) MOD 360, 0]
+    typetrace = 'projection'
+    map_lat = map[0]
+    map_lon = map[1]
+    map_rot = map[2]
+    if chkstru(ex, 'TITLE') then begin
+      maptitre = ex.title 
+      ex.title = ''
+    endif
+    map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $
+      , limit = [lat1, lon1, lat2, lon2], /noborder
+    if n_elements(maptitre) ne 0 then ex.title = maptitre
+    if n_elements(trifield) GE 2 then trifield = ciseauxtri(trifield, glam, gphi, _EXTRA = ex)
+    if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk, _EXTRA = ex)
+    if n_elements(trinan) GE 2 then BEGIN 
+      trinan = ciseauxtri(trinan, glam, gphi, _EXTRA = ex)
+      if trinan[0] EQ -1 then undefine, trinan
+    endif
+  ENDIF ELSE BEGIN 
 ;pour que les axes de coordonees soient pris en compte
-      if !x.type EQ 0 AND n_elements(contour) LE 4 then $
-       plot, [0], [0], xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase 
-      if keyword_set(key_periodique) then BEGIN
+    if !x.type EQ 0 AND n_elements(contour) LE 4 then $
+      plot, [0], [0], /nodata, xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase 
+    if keyword_set(key_periodic) then BEGIN
 ; ds ce cas la triangulation est refermee en x et couvre toute la
 ; sphere. il faut dont la couper au niveau ou l''on coupe la sphere
 ; pour faire le dessin
-         if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex)
-         if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk,_EXTRA=ex)
-         if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex)
-      endif
-   endelse
+      if n_elements(trifield) GE 2 then trifield = ciseauxtri(trifield, glam, gphi, _EXTRA = ex)
+      if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk, _EXTRA = ex)
+      if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan, glam, gphi, _EXTRA = ex)
+    ENDIF
+  endelse
 ;------------------------------------------------------------
 ; IV2) coutours et coloriages
 ;------------------------------------------------------------
-   if keyword_set(duplicate)  then BEGIN
+  if keyword_set(duplicate)  then BEGIN
 ; pour marina uniquement ATTENTION C'EST TRES MAL CODE
-      lon = glam[*, 0]
-      decalage = max(lon)-min(lon)+(lon-shift(lon, 1))[n_elements(lon)-1]
-      !x.range[1] = !x.range[1]+(duplicate-1)*decalage
-      for i = 1,duplicate-1 do BEGIN
-         z2d = [z2d, z2d]
-         gphi = [gphi, gphi]
-         mask = [mask, mask]
-         gphimsk = [gphimsk, gphimsk]
-         glam = [glam, glam+i*decalage]
-         glammsk = [glammsk, glammsk]
-      ENDFOR
-   endif
-   pltbase, z2d,glam,gphi $
-    , mask,glammsk,gphimsk,trichamp=tri,trimsk=trimsk, /forplt $
-    , level_z2d, couleur, contour = contour, carte = carte $
+    lon = glam[*, 0]
+    decalage = max(lon)-min(lon)+(lon-shift(lon, 1))[n_elements(lon)-1]
+    !x.range[1] = !x.range[1]+(duplicate-1)*decalage
+    for i = 1, duplicate-1 do BEGIN
+      z2d = [z2d, z2d]
+      gphi = [gphi, gphi]
+      mask = [mask, mask]
+      gphimsk = [gphimsk, gphimsk]
+      glam = [glam, glam+i*decalage]
+      glammsk = [glammsk, glammsk]
+    ENDFOR
+  endif
+; save, glam, gphi, trifield, file = 'tri.dat'
+  if keyword_set(decimatetri) then BEGIN
+    tempsdeux = systime(1)      ; pour key_performance
+    IF n_elements(trimsk) EQ 0 THEN trimsk = trifield
+    Verts = transpose([[(temporary(glam))[*]], [(temporary(gphi))[*]] $
+                       , [(temporary(z2d))[*]]])
+    Conn = [replicate(3, 1, n_elements(trifield)/3), trifield]
+    Result = mesh_decimate(temporary(verts), (temporary(Conn))[*] $
+                           , Connout, vertices = Vertsout $
+                           , percent_vertices = decimatetri)
+    connout = reform(connout, 4,  n_elements(connout)/4, /over) 
+    trifield = (temporary(connout))[1:3, *]
+    glam = reform(Vertsout[0, *])
+    gphi = reform(Vertsout[1, *])
+    z2d = reform(Vertsout[2, *])
+    undefine, Vertsout
+    print, 'temps decimatetri', systime(1)-tempsdeux 
+  ENDIF
+  pltbase, z2d, glam, gphi $
+    , mask, glammsk, gphimsk, trichamp = trifield, trimsk = trimsk, /forplt $
+    , level_z2d, colnumb, contour = contour, usetri = usetri, realcont = realcont $
     , overplot = keyword_set(overplot)+keyword_set(map) $
-    , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
-    , c_thick=thick, cont_nofill = cont_nofill, nan = nan $
+    , c_linestyle = linestyle, c_labels = 1-(indgen(n_elements(level_z2d)) MOD 2) $
+    , c_thick = thick, cont_nofill = cont_nofill, nan = nan $
     , coinmontemask = coinmontemask, coindescendmask = coindescendmask $
     , coinmontenan = coinmontenan, coindescendnan = coindescendnan $
     , indicezoommask = indicezoommask, indicezoomnan = indicezoomnan $
-    , masknan = masknan, trinan = trinan, xnan = xnan, ynan = ynan, _extra = ex
+    , masknan = masknan, trinan = trinan, _extra = ex
 ;------------------------------------------------------------
 ; IV3) rappelle de plt en boucle qd contour est active
 ;------------------------------------------------------------
-   if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
-      contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
-      return
-   endif
-   if keyword_set(contour) THEN BEGIN 
-      pourlegende = [1, 1, 1, 1]
-      oldattributs = saveatt()
-      oldcouleur = couleur
-      plt,contour,contmin,contmax,CONTOUR=pourlegende, /noerase, NOTRI = notri $
-       ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style $
-       ,NLEVEL=contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill, _extra = ex
-      restoreatt, oldattributs
-      couleur = oldcouleur
-   ENDIF
+  if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
+    contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
+    return
+  endif
+  if keyword_set(contour) THEN BEGIN 
+    pourlegende = [1, 1, 1, 1]
+    oldattributs = saveatt()
+    oldcolnumb = colnumb
+    plt, contour, contmin, contmax, CONTOUR = pourlegende, /NOERASE $
+      , USETRI = usetri $
+      , INTERVALLE = contintervalle, LABEL = contlabel, STYLE = style $
+      , NLEVEL = contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill $
+      , MASKFILL = maskfill, _extra = ex
+    restoreatt, oldattributs
+    colnumb = oldcolnumb
+  ENDIF
 ;------------------------------------------------------------
 ;------------------------------------------------------------
@@ -568,56 +608,60 @@
 ; V1) ajout eventuel de vecteurs en surimpression
 ;------------------------------------------------------------
-   if keyword_set(vecteur) then BEGIN 
-      oldattributs = saveatt()
-      ajoutvect,vecteur,vectlegende, _extra = ex
-      restoreatt, oldattributs
-   ENDIF
-;
-   if keyword_set(overplot) then GOTO, fini
+  if keyword_set(vecteur) then BEGIN 
+    oldattributs = saveatt()
+    ajoutvect, vecteur, vectlegende, _extra = ex
+    restoreatt, oldattributs
+  ENDIF
+;
+  if keyword_set(overplot) then GOTO, fini
 ;------------------------------------------------------------
 ; V2) Trace de la ligne de changement de date,l'equateur et
 ; le meridien de greenwich, ...
 ;------------------------------------------------------------
-   if NOT keyword_set(map) then meridienparallele, 'xy'
+  if NOT keyword_set(map) AND key_onearth then meridienparallele, 'xy'
 ;------------------------------------------------------------
 ; V3) pour tracer les continents d'IDL
 ;------------------------------------------------------------
-   if keyword_set(carte) then BEGIN
+  if keyword_set(realcont) then BEGIN
 ; si noease est passe de _extra, on s''assure qu''il est a 1
+    if chkstru(ex, 'NOERASE') then begin
+      oldnoerase = ex.noerase
+      ex.noerase = 1
+    ENDIF
+    if chkstru(ex, 'coast_thick') then mlinethick = ex.coast_thick ELSE mlinethick = 1
+    if chkstru(ex, 'coast_color') then mcolor = ex.coast_color ELSE mcolor = 0
+    IF NOT keyword_set(map) THEN $
+      map_set, 0, ((lon1+lon2)/2.) MOD 360, 0, position = posfenetre $
+      ,  limit = [lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0 $
+      , _extra = ex
+    if realcont NE 2 AND NOT keyword_set(cont_nofill) then BEGIN
+      if chkstru(ex, 'cont_color') then cntcol = ex.coast_color $
+      ELSE cntcol = (!d.n_colors - 1) <  255
+      map_continents, /fill_continents, color = cntcol, _extra = ex, /noerase
+    ENDIF
+    map_continents, /continents, color = mcolor, MLINETHICK = mlinethick, /noerase, _extra = ex
+    if chkstru(ex, 'NOERASE') THEN  ex.noerase = oldnoerase
+  ENDIF
+;------------------------------------------------------------
+; V4) legendes + affichage de celles-ci
+;------------------------------------------------------------
+  legende, mi, ma, 'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex
+  if n_elements(ex) NE 0 then BEGIN 
+; pour garder les axes du cadre en noir
+    if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = coast_color
+  endif
+;
+  case typetrace of
+    'classique': $
+      plot, [0], [0], /nodata, /noerase, color = 0, xstyle = 1, ystyle = 1, _extra = ex
+    'projection': BEGIN 
       if chkstru(ex, 'NOERASE') then begin
-         oldnoerase = ex.noerase
-         ex.noerase = 1
-      ENDIF
-      if chkstru(ex, 'cont_thick') then mlinethick = ex.cont_thick ELSE mlinethick = 1
-      IF NOT keyword_set(map) THEN $
-       map_set,0,((lon1+lon2)/2.) MOD 360,0, _extra = ex, position = posfenetre $
-       ,  limit =[lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0
-      if carte NE 2 AND NOT keyword_set(cont_nofill) then $
-       map_continents, /fill_continents, color = c_cont, _extra = ex, /noerase
-      map_continents, /continents, color = c_cote, MLINETHICK = mlinethick, /noerase, _extra = ex
-      if chkstru(ex, 'NOERASE') THEN  ex.noerase = oldnoerase
-   ENDIF 
-;------------------------------------------------------------
-; V4) legendes + affichage de celles-ci
-;------------------------------------------------------------
-   legende,mi,ma,'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex
-   if n_elements(ex) NE 0 then BEGIN 
-; pour garder les axes du cadre en noir
-      if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote
-   endif
-;
-   case typetrace of
-      'classique': $
-       plot, [0], [0],/noerase,color=0,xtickformat='lonaxe',ytickformat='lataxe' $
-       , xstyle = 1, ystyle = 1, _extra = ex
-      'projection': BEGIN 
-         if chkstru(ex, 'NOERASE') then begin
-            oldnoerase = ex.noerase
-            ex.noerase = 1
-         endif
-         if chkstru(ex, 'SUBTITLE') then !p.subtitle = ex.SUBTITLE
-         if n_elements(maptitre) ne 0 then ex.title = maptitre
-         map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$
-          , /NOERASE, /noborder, title = !p.title, color = 0
+        oldnoerase = ex.noerase
+        ex.noerase = 1
+      endif
+      if chkstru(ex, 'SUBTITLE') then !p.subtitle = ex.SUBTITLE
+      if n_elements(maptitre) ne 0 then ex.title = maptitre
+      map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$
+        , /NOERASE, /noborder, title = !p.title, color = 0
 ;         map_proj_info, numproj, /current
 ;         map_proj_info, numproj, name = nomproj
@@ -626,15 +670,17 @@
 ;          OR nomproj EQ 'TransverseMercator' OR nomproj EQ 'MillerCylindrical' $
 ;          OR nomproj EQ 'LambertConicEllipsoid' then map_grid, box_axes=1,latdel=10,londel=10 $
-;         ELSE map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30
-         map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30, color = 0, _extra = ex
-         if chkstru(ex, 'NOERASE') THEN  ex.noerase = oldnoerase
-      end
-   endcase
+;         ELSE map_grid, charsize = 0.75, /label,latalign = 1,lonalign
+;         = 1,latdel = 10,londel = 30
+      IF n_elements(labmap) EQ 0 THEN labmap = 1
+      map_grid, charsize = 0.75, label = labmap, latalign = 1, lonalign = 1, latdel = 10, londel = 30, color = 0, _extra = ex
+      if chkstru(ex, 'NOERASE') THEN  ex.noerase = oldnoerase
+    end
+  endcase
 ;------------------------------------------------------------
 ; V5) barre de couleur
 ;------------------------------------------------------------
-   couleur = couleur[0:ncontour-1-keyword_set(strictfill)]
-   barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $
-    , max=max,discret=couleur,_extra = ex
+  colnumb = colnumb[0:ncontour-1-keyword_set(strictfill)]
+  barrecouleur, colnumb, min,  max, (ncontour-keyword_set(strictfill))/2 $
+                , position = posbar, _extra = ex
 ;------------------------------------------------------------
 ;------------------------------------------------------------
@@ -643,14 +689,13 @@
 ;------------------------------------------------------------
 fini:
-   terminedessin, _extra = ex
-   if keyword_set(vecteur) then grillechoice = [vargrid, 'T', 'U', 'V'] ELSE grillechoice = ['T', vargrid]
-   if keyword_set(oldboite) then domdef, oldboite, GRILLE = grillechoice
+  terminedessin, _extra = ex
 ;------------------------------------------------------------
 ;------------------------------------------------------------
 sortie:
-   if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun 
-;------------------------------------------------------------
-;------------------------------------------------------------
-   return
+  if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4plt.dat'
+  if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun 
+;------------------------------------------------------------
+;------------------------------------------------------------
+  return
 end
 
Index: trunk/ToBeReviewed/PLOTS/DESSINE/pltbase.pro
===================================================================
--- trunk/ToBeReviewed/PLOTS/DESSINE/pltbase.pro	(revision 42)
+++ trunk/ToBeReviewed/PLOTS/DESSINE/pltbase.pro	(revision 67)
@@ -39,10 +39,19 @@
 ;        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
-;        a la couleur c_cont mais pour les laisser en transparent! Rq
-;        on trace qd meme le contour du mask de la couleur c_cote
-;
-;        CONT_THICK: l''epaisseur du trait pour tracer les
-;        continents. par defaut c''est 1.
+;        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
@@ -69,5 +78,5 @@
 ;
 ;
-;        /NOCOULEUR: pour faire juste les isolignes
+;        /NOFILL: pour faire juste les isolignes
 ;
 ;        /NOCONTOUR: pour faire juste les couleurs
@@ -106,20 +115,30 @@
 ;------------------------------------------------------------
 ;------------------------------------------------------------
-PRO pltbase, z2d, x, y, mask,xm, ym, levels, colors,UNSUR2 = unsur2, CONTOUR = contour $
-             , NOCONTOUR = nocontour, NOCOULEUR = nocouleur, TRICHAMP = trichamp, TRIMSK = trimsk $
-             , CARTE = carte, NAN = nan $
+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 $
-             , I_COLORS = i_colors $
-             , CONT_THICK = cont_thick,CONT_NOFILL = cont_nofill, UNLABSUR = unlabsur $
+             , 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, XNAN = xnan, YNAN = ynan, FORPLT = forplt $
-             , MORE = more, _EXTRA = ex
-@common
+             , 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
@@ -132,130 +151,187 @@
 ;
 ;------------------------------------------------------------
-   tempsun = systime(1)         ; pour key_performance
-   if n_elements(masknan) EQ 0 then masknan = 1
+  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 BEGIN 
-      label,0,min(z2d*mask),max(z2d*mask),ncontour,levels
-      colors = couleur
-   endif
+  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,/noerase, title = '',  subtitle = ''
+  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     ;
-; do we use the triangulation??
-   usetri = n_elements(trichamp) NE 0 AND (testvar(var = trichamp))[0] NE -1
+  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(nocouleur) then begin
-      if n_elements(contour) NE 4 THEN BEGIN 
-         if usetri then $
-          contour,[z2d[*], fltarr(more)],[x[*], fltarr(more)],[y[*], fltarr(more)],levels=levels,c_color=colors,/noerase,/fill,/closed $
-          ,TRIANGULATION=trichamp, _extra = ex $
-         else $
-          contour,z2d,x,y,levels=levels,c_color=colors,/noerase,/fill,/closed, _extra = ex 
-      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')
-;------------------------------------------------------------
-; II) trace des contours en trait de couleur c_lab
-;------------------------------------------------------------
-   if n_elements(contour) EQ 4 OR n_elements(contour) EQ 0 THEN BEGIN
+  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))
+    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)
+      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
-         IF chkstru(ex, 'C_COLORS') THEN ex = extractstru(ex, 'C_COLORS')
-;
-         if usetri then $
-          contour, [z2d[*], fltarr(more)], [x[*], fltarr(more)],[y[*], fltarr(more)],levels=levels, overplot = 1-keyword_set(nocouleur) $
-          ,noerase = keyword_set(nocouleur), c_color=c_lab*(1-keyword_set(i_colors))+testvar(var = i_colors),TRIANGULATION=trichamp, _extra = ex $
-         else $
-          contour, z2d, x,y,levels=levels, overplot = 1-keyword_set(nocouleur) $
-          ,noerase = keyword_set(nocouleur), c_color=c_lab*(1-keyword_set(i_colors))+testvar(var = i_colors), _extra = ex
-;
-      endif
-;
-      if keyword_set(carte) then if carte EQ 1 then mask = 1
-      if n_elements(mask) NE 1 then BEGIN ; si mask=1 on saute.
-;----------------------------------------------------------------------
-; III) remplissage des continents de couleur c_cont
-;----------------------------------------------------------------------
-         if NOT keyword_set(cont_nofill) then BEGIN
-            IF chkstru(ex, 'CELL_FILL') THEN ex.CELL_FILL = cell_fill < 1
-            IF chkstru(ex, 'LEVELS') THEN ex = extractstru(ex, 'LEVELS')
-            if n_elements(trimsk) eq 0 and usetri then trimsk = trichamp
-;
-            usetri = n_elements(trimsk) NE 0 AND (testvar(var = trimsk))[0] NE -1
-            if usetri then BEGIN
-               if keyword_set(forplt) then $
-                contour, -1*[mask[*], fltarr(more)], [xm[*], fltarr(more)], [ym[*], fltarr(more)], levels=-0.5, /overplot, /fill ,c_color=c_cont $
-                ,TRIANGULATION=trimsk, _extra=ex ELSE $
-                contour, -1*[(mask*masknan)[*], fltarr(more)], [xm[*], fltarr(more)], [ym[*], fltarr(more)], levels=-0.5, /overplot, /fill $
-                ,c_color=c_cont,TRIANGULATION=trimsk, _extra=ex ;
-               completecointerre, coinmonte=coinmontemask, coindescend=coindescendmask $
-                , indicezoom = indicezoommask, _extra = ex
-            ENDIF ELSE BEGIN
-               if keyword_set(forplt) then $
-                contour, -1*mask, xm, ym, levels=-0.5, /overplot, /fill ,c_color=c_cont $
-                , _extra=ex ELSE $
-                contour, -1*(mask*masknan), xm, ym, levels=-0.5, /overplot, /fill $
-                ,c_color=c_cont, _extra=ex ;
-            ENDELSE
-;
-
-; si il y a des points a nan et que le champ n''est pas sur la grille T
+      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
-               contour, [-masknan[*], fltarr(more)],[xnan[*], fltarr(more)],[ynan[*], fltarr(more)],levels=-0.5,/overplot,/fill,c_color=c_cont $
-                , TRIANGULATION=trinan, _extra = ex
-               completecointerre, coinmonte=coinmontenan, coindescend=coindescendnan $
-                , indicezoom = indicezoomnan, _extra = ex
-               if keyword_set(desstrinan) then dessinetri, trinan, xnan, ynan, color = colortrinan
-            endif
-         endif
-;------------------------------------------------------------
-; IV) trace les cotes en trait de couleur c_cote
-;------------------------------------------------------------
+;
+    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 
 
-         if NOT keyword_set(cont_thick) then cont_thick = 1
-         IF chkstru(ex, 'C_THICK') THEN ex.C_THICK = cont_thick
-;
-         if n_elements(key_stride) LE 2 then key_stride = [1, 1, 1]
-         key_stride = 1l > long(key_stride)
-;
-         if (keyword_set(forplt) AND (!map.projection GT 0 OR key_irregular)) $
-          OR keyword_set(nan) then $
-          tracecote, CONT_THICK = cont_thick, _extra = ex $
-         ELSE tracemask, mask, xm, ym, CONT_THICK = cont_thick, _extra = ex
-;
-      endif
-   ENDIF
-;------------------------------------------------------------
-fini:
-   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(key_performance) THEN print, 'temps pltbase', systime(1)-tempsun 
-
-   return
+  return
 end
Index: trunk/ToBeReviewed/PLOTS/DESSINE/pltt.pro
===================================================================
--- trunk/ToBeReviewed/PLOTS/DESSINE/pltt.pro	(revision 42)
+++ trunk/ToBeReviewed/PLOTS/DESSINE/pltt.pro	(revision 67)
@@ -24,9 +24,9 @@
 ;            valmask) et type doit qd meme etre specifie pour qu''on
 ;            sache de quel trace il sagit. Pour avoir une legende
-;            correcte, respecifier la zone d''extraction via BOITE
+;            correcte, respecifier la zone d''extraction via BOXZOOM
 ;          * 1d: uniquement pour les traces de type 't'. Type doit qd
 ;            meme etre specifie pour qu''on sache de quel trace il
 ;            sagit. Pour avoir une legende correcte, respecifier la zone
-;            d''extraction via BOITE
+;            d''extraction via BOXZOOM
 ;       2) une structure repondant aux critaire specifies par
 ;       litchamp.pro. cf. IDL> xhelp,'litchamp'. Le tableau contennu ds
@@ -53,14 +53,14 @@
 ; KEYWORD PARAMETERS:
 ;
-;	BOITE:vecteur indiquant la zone geographique (3d) sur laquelle doit
+;	BOXZOOM:vecteur indiquant la zone geographique (3d) sur laquelle doit
 ; etre fait l''extraction du champ pour faire le hovmoeller.
-; Si BOITE a :
-; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
-; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
-; 4 elements: l''extraction est faite sur [Boite, prof1, prof2]
-; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
-; 6 elements: l''extraction est faite sur Boite
-;
-; Ou lon1, lon2,lat1,lat2,prof1,prof2 sont les variables globales
+; Si BOXZOOM a :
+; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boxzoom[0]]
+; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boxzoom[0],boxzoom[1]]
+; 4 elements: l''extraction est faite sur [Boxzoom, vert1, vert2]
+; 5 elements: l''extraction est faite sur [Boxzoom[0:3], 0, Boxzoom[4]]
+; 6 elements: l''extraction est faite sur Boxzoom
+;
+; Ou lon1, lon2,lat1,lat2,vert1,vert2 sont les variables globales
 ; definies lors du dernier domdef!
 ;
@@ -71,7 +71,20 @@
 ;      CB_CHARSIZE: The character size of the color bar annotations
 ;
+;        COAST_COLOR: the color of the coastline.
+;                     defaut value is 0 => black
+;
+;        COAST_THICK: the thickness of the coastline.
+;                     defaut value is 1
+;
+;        /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
+;
 ;	CONTINTERVALLE: lorsque CONTOUR est active, valeur d''un
-; intervalle entre deux isolignes traces par un trait ds la couleur
-; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE
+; intervalle entre deux isolignes traces par un trait. Il peut ainsi
+; etre different de celui specifie par INTERVALLE 
 ; qui, cas ce cas, ne controle que les isolignes coloriees en
 ; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
@@ -86,14 +99,14 @@
 ;	CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on
 ; veut prendre en compte dans le trace des isolignes traces par un
-; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
+; trait. Par defaut on prend le max (sur les pts mer)
 ; du tableau passe ds le mot cle CONTOUR. 
 ;
 ;	CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on
 ; veut prendre en compte dans le trace des isolignes traces par un
-; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
+; trait. Par defaut on prend le max (sur les pts mer)
 ; du tableau passe ds le mot cle CONTOUR. 
 ;
 ;	CONTNLEVEL: lorsque CONTOUR est active, nombre de contours
-; trace par un trait de couleur c_lab a dessiner (actif si
+; trace par un trait a dessiner (actif si
 ; CONTLABEL=0) par defaut =20.
 ;
@@ -118,5 +131,5 @@
 ; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
 ; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
-; de couleur c_lab utiliser CONTINTERVALLE.
+; utiliser CONTINTERVALLE.
 ;
 ;	/INV: inverse le vecteur couleur utilise pour colorier le graphe
@@ -126,6 +139,6 @@
 ; label correspondant aux cas n. cf label.pro
 ; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les
-; isolignes coloriees en couleur. Pour celles tracees par un trait de
-; couleur c_lab utiliser CONTLABEL.
+; isolignes coloriees en couleur. Pour celles tracees par un trait
+; utiliser CONTLABEL. 
 ;
 ;	/LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
@@ -162,5 +175,5 @@
 ;	les couleurs
 ;
-;	/NOCOULEUR: activer si on veut juste les contours en noir et
+;	/NOFILL: activer si on veut juste les contours en noir et
 ;	blanc sur fond blanc
 ;
@@ -246,7 +259,10 @@
 ; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
 ;
-;	YSURX: rapport d'echelle entre y et x. Par defaut=1
+;	YXASPECT: rapport d'echelle entre y et x. Par defaut=1
 ; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
 ; postScript ou pour cree une fenetre pas trop etiree
+;
+;       /ZEROMIDDLE: fo force the middle of the colorbar to be equal
+;       to 0 (force max=max(abs([min,max])) and min=-max)
 ;
 ; COMMON BLOCKS:
@@ -277,15 +293,25 @@
 ;------------------------------------------------------------
 ;------------------------------------------------------------
-pro pltt,tab,giventype,givenmin,givenmax,datmin,datmax,BOITE = boite, CONTOUR=contour $
+pro pltt,tab,giventype,givenmin,givenmax,datmin,datmax,BOXZOOM = boxzoom, CONTOUR=contour $
          ,ENDPOINTS=endpoints,INTERVALLE=intervalle,INV=inv  $
          ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $
-         ,STYLE=style, CONTMAX=contmax, USETRI = usetri $
+         ,STYLE=style, CONTMAX=contmax $
          ,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $
          ,COL1D=col1d,STY1D=sty1d, MININ = minin, MAXIN = maxin $
          ,OV1D=ov1d, FILTER = filter, TREND_TYPE = trend_type $
          ,REPEAT_C = repeat_c, TYPEIN = typein, XT = XT, YT = YT, ZT = zt $
-         , TT = tt, STRICTFILL = strictfill, OVERPLOT = overplot, EXCHANGE_XY = exchange_xy $
+         , TT = tt, STRICTFILL = strictfill, OVERPLOT = overplot $
+         , EXCHANGE_XY = exchange_xy $
          , _extra = ex
-@common
+;---------------------------------------------------------
+; include common
+@cm_4mesh
+@cm_4data
+@cm_4cal
+  IF NOT keyword_set(key_forgetold) THEN BEGIN
+@updatenew
+@updatekwd
+  ENDIF
+;--------------------------------------------------------------
 ;------------------------------------------------------------
    tempsun = systime(1)         ; pour key_performance
@@ -299,5 +325,9 @@
 ; I1) lecture du champ
 ;--------------------------------------------------------------
-   if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
+   if (keyword_set(boxzoom) OR keyword_set(endpoints)) $
+     AND n_elements(contour) ne 4 THEN BEGIN
+     savedbox = 1b
+     saveboxparam, 'boxparam4pltt.dat'
+   ENDIF
    if n_elements(giventype) NE 0 then type = giventype
    if n_elements(givenmin) NE 0 then min = givenmin
@@ -311,22 +341,27 @@
       endif
       type = typein
-   endif
-   checktypeminmax, 'pltt', TYPE = type, MIN = min, MAX = max, XT = XT, YT = YT, ZT = zt, TT = tt, ENDPOINTS=endpoints, BOITE = boite, _extra = ex
+    ENDIF
+;
+   checktypeminmax, 'pltt', TYPE = type, MIN = min, MAX = max $
+     , XT = XT, YT = YT, ZT = zt, TT = tt, ENDPOINTS = endpoints, _extra = ex
+;
    if keyword_set(endpoints) then begin
-      section, tab, z2d, glam, gphi, ENDPOINTS = endpoints, TYPE = type, BOITE = boite, DIREC = direc
+      section, tab, z2d, glam, gphi, ENDPOINTS = endpoints, TYPE = type $
+        , BOXZOOM = boxzoom, DIREC = direc
       nx = n_elements(glam) 
       ny = nx
       if strupcase(vargrid) EQ 'W' then begin
-         z = gdepw[premierzw:dernierzw]
+         z = gdepw[firstzw:lastzw]
          nz = nzw
       ENDIF ELSE BEGIN
-         z = gdept[premierzt:dernierzt]
+         z = gdept[firstzt:lastzt]
          nz = nzt
       ENDELSE
    ENDIF ELSE BEGIN 
-      z2d = checkfield(tab, 'pltt', TYPE = type, BOITE = boite, direc = direc, _extra = ex)
+      z2d = checkfield(tab, 'pltt', TYPE = type, BOXZOOM = boxzoom $
+                       , direc = direc, _extra = ex)
       if z2d[0] EQ -1 then BEGIN 
-         if keyword_set(boite) AND n_elements(oldboite) NE 0 then domdef, oldboite,GRILLE=vargrid
-         return
+        IF keyword_set(savedbox) THEN restoreboxparam, 'boxparam4pltt.dat'
+        return
       endif
       grille, mask, glam, gphi, gdep, nx, ny,nz
@@ -371,5 +406,4 @@
    ENDIF 
 
-
 ;---------------------------------------------------------------
 ; selection du type de graphique. 
@@ -377,8 +411,5 @@
    taille=size(z2d)
    case taille[0] of
-      2 : begin
-         niveau=1
-         typdes='2d'
-      end
+      2 : typdes='2d'
       1 : begin
          z1d=z2d
@@ -401,5 +432,4 @@
 ; on construit le mask pour cela le tableau doit etre masque (fait
 ; automatiquement a la valeur valmask si on passe ds moyenne ou grossemoyenne)
-   mask = fltarr(taille[1], taille[2])
    nan = total(finite(z2d,/nan)) < 1
    if n_elements(valmask) EQ 0 then valmask = 1e20
@@ -407,7 +437,7 @@
       notanum = where(finite(z2d) EQ 0)
       z2d[notanum] = 0.
-      mask(where(z2d LT valmask/10.)) = 1
+      mask = z2d LT valmask/10.
       z2d[notanum] = !values.f_nan
-   ENDIF ELSE mask(where(z2d LT valmask/10)) = 1
+   ENDIF ELSE mask = z2d LT valmask/10.
 ;----------------------------------------------------------------------------
 ;   determination du mi:min et du ma:max de z2d ainsi que de max: max et
@@ -416,5 +446,5 @@
 ; faudra-t-il faire un autoscale ???
    autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
-   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle
+   determineminmax, z2d, mask, mi, ma, MININ = min, MAXIN = max, nan = nan, INTERVALLE = intervalle, _extra = ex
    if z2d[0] EQ -1 THEN return
 ; on fait un autoscale si besoin
@@ -505,5 +535,6 @@
       if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
       if keyword_set(label) eq 0 then cas=0 else cas=label
-      label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill
+      label, cas, min, max, ncontour, level_z2d, colnumb, NLEVEL = nlevel $
+             , INTERVALLE = intervalle, strictfill = strictfill
 ;--------------------------------------------------------------
 ; choix de style
@@ -511,32 +542,28 @@
       if not keyword_set(style) then style=0
       style,style,level_z2d,linestyle,thick
-      if keyword_set(inv) then couleur=reverse(couleur)
+      if keyword_set(inv) then colnumb=reverse(colnumb)
 ;----------------------------------------------------------------------
       nby = n_elements(yy)
       nbx = n_elements(xx)
-      xx = xx#replicate(1, nby) ; on passe les axes en tableaux 2d
-      yy = replicate(1, nbx)#yy
-;
-      if keyword_set(nan) then begin
-         notanumber = where(finite(z2d, /nan) EQ 1)
-         z2d[notanumber] = max
-         case type of
-            'xt':masknan = replicate(1, nx, jpt)
-            'yt':masknan = replicate(1, ny, jpt)
-            'zt':masknan = replicate(1, nz, jpt)
-         endcase
-         masknan[notanumber] = 0
-      ENDIF ELSE masknan = 1
-      z2d = remplit(z2d,nite=2+keyword_set(nan), mask = mask*masknan, /basique, _extra=ex)
+;
+      if keyword_set(nan) then BEGIN
+;         xx = xx#replicate(1, nby) ; on passe les axes en tableaux 2d
+;         yy = replicate(1, nbx)#yy
+         masknan = finite(z2d)
+         z2d[where(masknan EQ 0)] = max
+         mask = temporary(mask)*temporary(masknan)
+      ENDIF
+      z2d = remplit(z2d,nite=2+keyword_set(nan), mask = mask, /basique, _extra=ex)
       if NOT keyword_set(strictfill) then z2d = min > z2d <  max
-      if NOT keyword_set(usetri) then triangulation = -1 ELSE $
-       triangulation = triangule(mask*masknan,/regulier,coinmonte=coinmontemask,coindescend=coindescendmask)
-;
+      if keyword_set(nan) then $
+       triangulation = triangule(mask,/basic,coinmonte=coinmontemask $
+                                 ,coindescend=coindescendmask) $
+       ELSE triangulation = -1 
 ;----------------------------------------------------------------------
-      pltbase,z2d, xx, yy, mask,xx, yy, level_z2d,couleur, contour = contour,/noerase $
+      pltbase,z2d, xx, yy, mask,xx, yy, level_z2d,colnumb, contour = contour,/noerase $
        , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
        , trichamp = triangulation, trimsk = triangulation, overplot = overplot $
-       , c_thick=thick, performance = key_performance $
-       , coinmontemask=-1, coindescendmask=-1, masknan = masknan, _extra = ex
+       , c_thick=thick, performance = key_performance, usetri = keyword_set(nan) $
+       , coinmontemask=coinmontemask, coindescendmask=coindescendmask, _extra = ex
 ;------------------------------------------------------------
       if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
@@ -548,9 +575,9 @@
          pourlegende = [1, 1, 1, 1]
          oldattributs = saveatt()
-         oldcouleur = couleur
+         oldcolnumb = colnumb
          pltt,contour,type, contmin,contmax,CONTOUR=pourlegende, /noerase, USETRI = usetri $
           ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style, ENDPOINTS = endpoints $
-          ,NLEVEL=contnlevel,YSURX=ysurx, BOITE = boite, STRICTFILL = strictfill, _extra = ex
-         couleur = oldcouleur
+           , NLEVEL = contnlevel, BOXZOOM = boxzoom, STRICTFILL = strictfill, _extra = ex
+         colnumb = oldcolnumb
          restoreatt, oldattributs
       endif
@@ -559,8 +586,13 @@
       if keyword_set(overplot) then GOTO, fini
 ;------------------------------------------------------------
-; Trace de la ligne de changement de date
-;------------------------------------------------------------
-      if (type eq 'xt') then $ 
-       plot, [180,180],[tempsmin,tempsmax],/noerase,color=c_cote
+; Trace de la ligne de changement de date or the equator
+;------------------------------------------------------------
+      IF key_onearth THEN BEGIN
+        CASE type OF
+          'xt':oplot, [180, 180] - 360*(!x.range[1] LT 180), !y.range 
+          'yt':oplot, !x.range, [0, 0]
+          ELSE:
+        ENDCASE
+      ENDIF
 ;------------------------------------------------------------
 ; legendes + affichage de celles-ci
@@ -569,6 +601,33 @@
        , ENDPOINTS = endpoints, _extra = ex
 ;
-      plot,[0],[0],/noerase,color=c_cote, xstyle = 1+4*(keyword_set(endpoints) AND type EQ 'xt' AND lat1 NE lat2) $
-       , ystyle = 1+4*(keyword_set(endpoints) AND type EQ 'yt'), _extra = ex
+; we want to draw the time axis with tick length = 1. if we simply
+; use [xy]style=1 then each axis (up and down or left and right) have
+; majorticks with a length of 1 (-> not very nice when xgridstyle=2),
+; same if xticklen=0.5 (not very nice in the middle). => so we draw
+; the top (right) axis by hand using axis.
+;
+      if n_elements(ex) NE 0 then BEGIN 
+; pour avoir un cadre de la couleur noire
+        if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
+      ENDIF
+;
+      plot, [0], [0], /nodata, /noerase, _extra = ex $
+        , xstyle = 1+4*(keyword_set(endpoints) AND type EQ 'xt' AND lat1 NE lat2)+8*(type EQ 'yt' OR type EQ 'zt') $
+        , ystyle = 1+4*(keyword_set(endpoints) AND type EQ 'yt')+8*(type EQ 'xt')
+; call axis for the missing axis.
+      IF type EQ 'xt' AND NOT keyword_set(endpoints) THEN BEGIN
+        if n_elements(ex) NE 0 then $ 
+          if (where(tag_names(ex) EQ 'YTICKNAME'))[0] NE -1 then $
+          ex.YTICKNAME = replicate(' ', n_elements(ex.YTICKNAME))
+        axis, yaxis = 1, ystyle = 1, yticklen = 0 $
+          , ytickname = replicate(' ', !y.ticks+1), _extra = ex
+      ENDIF
+      IF (type EQ 'yt' OR type EQ 'zt') AND NOT keyword_set(endpoints) THEN BEGIN
+        if n_elements(ex) NE 0 then $ 
+          if (where(tag_names(ex) EQ 'XTICKNAME'))[0] NE -1 then $
+          ex.XTICKNAME = replicate(' ', n_elements(ex.XTICKNAME))
+       axis, xaxis = 1, xstyle = 1, xticklen = 0 $
+        , xtickname = replicate(' ', !x.ticks+1), _extra = ex
+      ENDIF
 ; ajout d'un axe ds le cas ou l'on utilise endpoints
       if keyword_set(endpoints) then addaxe, endpoints, type, posfenetre, _EXTRA = ex
@@ -576,7 +635,7 @@
 ; barre de couleur
 ;------------------------------------------------------------
-      couleur = couleur[0:ncontour-1-keyword_set(strictfill)]
-      barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $
-       , max=max,discret=couleur,_extra = ex
+      colnumb = colnumb[0:ncontour-1-keyword_set(strictfill)]
+      barrecouleur, colnumb, min,  max, (ncontour-keyword_set(strictfill))/2 $
+                    , position = posbar, _extra = ex
 ;------------------------------------------------------------
    endif
@@ -592,6 +651,10 @@
             bar_plot, yy, background = (!d.n_colors-1) < 255,  $
              baselines = replicate(!y.range[0], n_elements(yy)), barnames = ['', ''], $
-             colors    = replicate(col1d      , n_elements(yy)), /outline
-            plot, [0], [0],/noerase,color=c_cote, _extra = ex
+             colors    = replicate(col1d, n_elements(yy)), /outline
+            if n_elements(ex) NE 0 then BEGIN 
+; pour avoir un cadre de la couleur noire
+              if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
+            ENDIF
+            plot, [0], [0], /nodata, /noerase, _extra = ex
             GOTO, fini
          ENDIF 
@@ -609,13 +672,32 @@
             yy = rien
          endif
-         plot,xx,yy,color=col1d,linestyle=sty1d,thick=2, title = '', subtitle = '', _extra = ex
+         plot, xx, yy, color = col1d, linestyle = sty1d, thick = 2 $
+           , title = '', subtitle = '', _extra = ex
+; draw 0 line
+         if keyword_set(exchange_xy) then $
+           oplot, [0, 0], !y.range ELSE oplot, !x.range, [0, 0]
+; we want to draw the axis with the time axis length = 1. if we simply
+; use xstyle=1 then each axis (up and down) have majorticks with a
+; length of 1 (-> not very nice when xgridstyle=2), same if
+; xticklen=0.5 (not very nice in the middle). 
+; => so we draw the top axis by hand using axis.
          if n_elements(ex) NE 0 then BEGIN 
-; pour avoir un cadre de la couleur c_cote
-            if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote
+; pour avoir un cadre de la couleur noire
+            if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = 0
          ENDIF
-         if keyword_set(exchange_xy) then $
-          plot, [0, 0],!y.range ,/noerase,color=c_cote, xstyle = 1, ystyle = 1, _extra = ex $
-         ELSE plot, !x.range, [0, 0],/noerase,color=c_cote, xstyle = 1, ystyle = 1, _extra = ex
-      ENDIF ELSE oplot,xx,yy,color=col1d,linestyle=sty1d,thick=2, _extra = ex
+         plot, [0], [0], /nodata, /noerase $
+           , xstyle = 1+8*(1-keyword_set(exchange_xy)) $
+           , ystyle = 1+8*keyword_set(exchange_xy), _extra = ex
+; call axis for the missing axis.
+         if n_elements(ex) NE 0 then BEGIN 
+; force tickname to blank array
+            if (where(tag_names(ex) EQ 'YTICKNAME'))[0] NE -1 AND keyword_set(exchange_xy) then ex.YTICKNAME = replicate(' ', n_elements(ex.YTICKNAME))
+            if (where(tag_names(ex) EQ 'XTICKNAME'))[0] NE -1 AND NOT keyword_set(exchange_xy) then ex.XTICKNAME = replicate(' ', n_elements(ex.XTICKNAME))
+         ENDIF
+         if keyword_set(exchange_xy) then  axis, yaxis = 1, ystyle = 1 $
+           , yticklen = 0, ytickname = replicate(' ', !y.ticks+1), _extra = ex $
+         ELSE axis, xaxis = 1, xstyle = 1, xticklen = 0 $
+           , xtickname = replicate(' ', !x.ticks+1), _extra = ex
+       ENDIF ELSE oplot, xx, yy, color = col1d, linestyle = sty1d, thick = 2, _extra = ex
    endif
 fini:
@@ -633,5 +715,6 @@
 ; on fait un faut plot pour que ces valeurs soient prises en
 ; consideration
-   plot,[0], [0], /noerase,xstyle=5, ystyle = 5, title = '', subtitle = '', ytitle = '', xtitle = ''
+   plot, [0], [0], /nodata, /noerase, xstyle = 5, ystyle = 5 $
+     , title = '', subtitle = '', ytitle = '', xtitle = ''
 ;------------------------------------------------------------
 ;------------------------------------------------------------
@@ -640,5 +723,5 @@
 ;------------------------------------------------------------
    terminedessin, _extra = ex
-   if keyword_set(oldboite) then domdef, oldboite,GRILLE=[vargrid, 'T']
+   if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4pltt.dat'
 ;------------------------------------------------------------
    if n_elements(key_performance) NE 0 then $
Index: trunk/ToBeReviewed/PLOTS/DESSINE/sbar_plot.pro
===================================================================
--- trunk/ToBeReviewed/PLOTS/DESSINE/sbar_plot.pro	(revision 42)
+++ trunk/ToBeReviewed/PLOTS/DESSINE/sbar_plot.pro	(revision 67)
@@ -39,6 +39,6 @@
 ; EXAMPLE:
 ;
-;      IDL> sbar_plot, indgen(10),petit=[2,2,2],/rempli
-;      IDL> sbar_plot, indgen(10),petit=[2,2,3],/noerase
+;      IDL> sbar_plot, indgen(10),small = [2,2,2],/rempli
+;      IDL> sbar_plot, indgen(10),small = [2,2,3],/noerase
 ;      IDL> @ps
 ;
@@ -62,5 +62,6 @@
    ENDIF ELSE colors = congrid(indgen(!d.n_colors < 256), n_elements(Values))
 ;
-   bar_plot, Values, background = !p.background, colors = colors, _extra = ex
+   bar_plot, Values, background = !p.background, colors = colors $
+             , xstyle = 1, ystyle = 1, _extra = ex
 ; 4) je termine le dessin 
    terminedessin, _extra=ex 
Index: trunk/ToBeReviewed/PLOTS/DESSINE/splot.pro
===================================================================
--- trunk/ToBeReviewed/PLOTS/DESSINE/splot.pro	(revision 42)
+++ trunk/ToBeReviewed/PLOTS/DESSINE/splot.pro	(revision 67)
@@ -35,6 +35,6 @@
 ; EXAMPLE:
 ;
-;      IDL> splot, indgen(10),ystyle=1,petit=[1,2,1],/portrait
-;      IDL> splot, -indgen(10),ystyle=1,petit=[1,2,2],/noerase
+;      IDL> splot, indgen(10),ystyle=1,small=[1,2,1],/portrait
+;      IDL> splot, -indgen(10),ystyle=1,small=[1,2,2],/noerase
 ;      IDL> @ps
 ;
@@ -52,5 +52,6 @@
    placedessin, 'autre', _extra = ex
 ; 3) je fais mon joli dessin 
-   if n_elements(y) EQ 0 then plot,  x, _EXTRA = ex ELSE plot,  x, y, _EXTRA = ex
+   if n_elements(y) EQ 0 then plot,  x, xstyle = 1, ystyle = 1, _EXTRA = ex $
+   ELSE plot,  x, y, xstyle = 1, ystyle = 1, _EXTRA = ex
 ; 4) je termine le dessin 
    terminedessin, _extra=ex 
