source: trunk/ToBeReviewed/PLOTS/DESSINE/plt.pro @ 35

Last change on this file since 35 was 35, checked in by pinsard, 18 years ago

upgrade of PLOTS/DESSINE according to cerbere.lodyc.jussieu.fr: /usr/home/smasson/SAXO_RD/ : files

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 30.8 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME:
6;       PLT
7;
8; PURPOSE:
9;       trace des graphes horizontaux (cartes)
10;
11; CATEGORY:
12;       Graphics, trace des graphes horizontaux
13;
14; CALLING SEQUENCE:
15;       plt, champ [,min[, max]]
16;
17; INPUTS:
18;       champ: le champ dont on veut faire la carte horizontale champ
19;       peut etre de 2 types:
20;         1) un tableau 2d ou 3d. Si le champ est un tableau 3d on en
21;         extrait un tableau 2d au niveau stipule par l''utilisateur
22;         qui repond a une question.
23;         2) une structure repondant aux critaire specifies par
24;         litchamp.pro. cf. IDL> xhelp,'litchamp'
25;
26; ces ARGUMENTS ne sont pas obligatoires:
27
28;       MAX: valeur maximum que l''on veut prendre en compte dans le trace
29; des contours. Par defaut on prend le max de tab1 (sur les pts mer)
30;
31;       MIN: valeur minimum que l''on veut prendre en compte dans le trace
32; des contours. Par defaut on prend le min de tab1 (sur les pts mer)
33;
34; KEYWORD PARAMETERS:
35;
36;       BOITE:vecteur indiquant la zone geographique sur laquelle doit etre
37; faite la coupe. Si BOITE a :
38; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]]
39; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]]
40; 4 elements: l''extraction est faite sur [Boite, 0, max([gdept, gdepw])]
41; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]]
42; 6 elements: l''extraction est faite sur Boite
43;
44; Ou lon1, lon2,lat1,lat2 sont les variables globales
45; definies lors du dernier domdef!
46;
47;       CARTE:Permet de dessiner les continents definits ds IDL. CARTE
48;       peut prendre deux formes:
49;           /CARTE: on dessine les continents a la place du mask
50;           CARTE=2 on dessine le contours des continents par
51;           dessus le dessin masque (ceci permet de voir si le masque
52;           correspond bien aux continents reels).
53;
54;      CB_TITLE: le titre de la colorbar
55;
56;      CB_SUBTITLE: le soustitre de la colorbar
57;
58;      CB_CHARSIZE: The character size of the color bar annotations
59;
60;      CMREF: la longeur en cm sur le papier que doit faire la fleche
61;      de norme normeref. par defaut ajuste au dessin et compris entre
62;      .5 et 1.5 cm
63;
64;        /CONT_NOFILL: activer pour ne pas remplir les points masques
65;        a la couleur c_cont mais pour les laisser en transparent! Rq
66;        on trace qd meme le contour du mask de la couleur c_cote
67;
68;       CONTINTERVALLE: lorsque CONTOUR est active, valeur d'un
69; intervalle entre deux isolignes traces par un trait ds la couleur
70; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE
71; qui, cas ce cas, ne controle que les isolignes coloriees en
72; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va
73; bien avec l''intervalle specifie!. Si ce mot cle n''est pas
74; specifie, on trace 20 isolignes du min au max.
75;
76;       CONTLABEL: un entier n. lorsque CONTOUR est active, si n
77; different de 0, choisit le type de label correspondant aux cas n
78; pour les isolignes tracees par un trait. Pour specifier le type de
79; label du contour en couleur, utiliser LABEL
80;
81;       CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on
82; veut prendre en compte dans le trace des isolignes traces par un
83; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
84; du tableau passe ds le mot cle CONTOUR.
85;
86;       CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on
87; veut prendre en compte dans le trace des isolignes traces par un
88; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer)
89; du tableau passe ds le mot cle CONTOUR.
90;
91;       CONTNLEVEL: lorsque CONTOUR est active, nombre de contours
92; trace par un trait de couleur c_lab a dessiner (actif si
93; CONTLABEL=0) par defaut =20.
94;
95;       CONTOUR: si on veut tracer les contours d'un champ different que celui
96; que l''on dessin en couleur (par ex E-P en couleur et QSR en
97; contours). Doit etre un champ repondant aux meme caracteristiques
98; que l''argument numero 1 de plt
99;
100;       GRILLE:'U','T','V','W' ou 'F' pour specifer eventuellement la
101;       grille a laquelle est rattache le champ. Rq: il afaut mieux
102;       utiliser ds ce cas une structure comme champ
103;
104;       INTERVALLE: valeur d''un intervalle entre deux isolignes. Si
105; aucun min n''est specifie, on choisit un contour min qui va bien
106; avec l'intervalle specifie!. Si ce mot cle n''est pas specifie, on
107; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active
108; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en
109; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait
110; de couleur c_lab utiliser CONTINTERVALLE.
111;
112;       /INV: inverse le vecteur couleur utilise pour colorier le graphe
113;             (sans toucher au noir, au blanc et a la palette utilisee)
114;
115;       LABEL: un entier n. si n different de 0, choisit le type de
116; label correspondant aux cas n. cf label.pro
117; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les
118; isolignes coloriees en couleur. Pour celles tracees par un trait de
119; couleur c_lab utiliser CONTLABEL.
120;
121;       /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre
122;       en position "allongee".
123;
124;       LCT: entier designant le numero de la palette de couleur que
125;       l''on veut utiliser pour le plot.
126;       
127;       MAP:Mot cle a actine losque l''on veut faire une projection.
128; Ce mot cle peut etre de 2 formes:
129;     MAP=[P0lat,P0lon,Rot]. Pour la description de ces 3 valeurs cf.
130;         l''aide en ligne de MAP_SET.
131;     /MAP: dans ce cas map est calcule tout seul et vaut:
132;          map = [0, (lon1+lon2)/2., 0]
133; Rq: Un bon moyen de choisir sa projection est la valeur du vecteur
134; MAP est d''utiliser la demo d''IDL5.2:
135; IDL> demo
136; Puis choisir earth sciences et mapping.
137; Rq2: Par defaut c''est une projection cylindrique qui est effectuee
138; (avec ou sans le mot cle map). Si on veut une autre projection MAP
139; doit etre active et il faut rajouter le mot cle: /nom_projection.
140; par ex pour une projection polaire centree sur le pole sud:
141; IDL> domdef,-180,180,-90,-45
142; IDL> plt, tab, /stereo,map=[-90,0,0]
143;
144;       MAXIN: permet de specifier la valeur maximum que l''on veut
145;       prendre en compte dans le trace des contours a l''aide d''un
146;       mot cle plutot que par l''argument max. Si l''argument et le
147;       mot cle sont specifies en meme temps, c''est la valeur
148;       specifiee par le mot cle qui est retenue.
149;
150;       MININ: permet de specifier la valeur minimum que l''on veut
151;       prendre en compte dans le trace des contours a l''aide d''un
152;       mot cle plutot que par l''argument min. Si l''argument et le
153;       mot cle sont specifies en meme temps, c''est la valeur
154;       specifiee par le mot cle qui est retenue.
155;
156;       NLEVEL: nombre de contours a dessiner. par defaut =20. actif si
157; LABEL=0 ou n'est pas specifie.
158;
159;       /NOCOLORBAR: activer si on ne veut pas de colorbar
160;
161;       /NOCONTOUR: activer si on ne veut pas de contour mais juste
162;       les couleurs
163;
164;       /NOCOULEUR: activer si on veut juste les contours en noir et
165;       blanc sur fond blanc
166;
167;       /NOERASE: activer pour faire un dessin a l''ecran sans creer
168;       une nouvelle fenetre
169;
170;      NORMEREF: la norme de la fleche de reference. par defaut on
171;      essaie de faire qqch qui colle pas trop mal!
172;
173;       /NOTRI: pour forcer a ne pas utiliser de
174;       triangulation. Attention dans ce cas le trace ne marchera que
175;       si la grille est non deformee (cad, chaque pts d''une
176;       longitude donnee a la meme latitude et chaque pts d''une
177;       latitude donnee a la meme longitude) sauf si on utilise le mot
178;       clef CELL_FILL=2. Rq si le champ contient des points a
179;       !values.f_nan alors on fait qd meme une triangulation.
180;
181;       OVERPLOT: pour faire un plt par dessus un autre. Rq:
182;       contrairemnet a l''utilisation de CONTOUR ou de VECTEUR,
183;       l''utilisation de ce mot clef ne modifie pas la legende ou/et
184;       la barre de couleur.
185;
186;       PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un
187; dessin sur une petite portion de feuille ou d''ecran. il delimite
188; la zone ds laquelle va etre fait le dessin
189; si il a 4 elements:
190;       il est alors constitute des coordonnees -exprime en cm reperes par
191;       rapport au coin en bas a gauche de la feuille ou de la fenetre
192;       (en portrait comme en landscape)- du coin en bas a
193;       gauche et du coin en haut a droite  de la zone de dessin.
194; si il a 3 elements:
195;       Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0]
196;       colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la
197;       case numero PETITDESSIN[2].La numerotation commencant en haut
198;       a gauche par le numero 1 et suivant apres dans le sens de
199;       l''ecriture.
200; Par defaut on fait un dessin occupant la plus grande place possible
201; tout en concervant le rapport d''aspect (sauf qd REMPLI est active)
202;
203;       /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout".
204;
205;       /POST: faire une sortie postscript. Ne marche que si on fait
206;       un seul dessin sur la feuille. Si on fait plusieurs dessins,
207;       utiliser @ps ou plein2dessins
208;
209;       /REMPLI:oblige le dessin a occuper l'espace maximum definit
210;       par petitdessin
211;
212;       /REVERSE_X: pour inverser l''axe des x (et aussi le dessin)
213;
214;       /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin)
215;
216;       /STRICTFILL: activer ce mot clef pour que le remplissage des
217;       contours ce fasse precisement entre le min et le max specifie
218;       en laissant en banc les valeurs inferieurs au min specifie et
219;       superieurs au max specifie.
220;
221;       STYLE: style de tracer a adopter pour dessiner les isolignes par
222; defaut style=0. cf style.pro
223;
224;       /TRANS: fait un postscript (active /post automatiquement) et l''imprime
225; -si on le desire- sur un transparant
226;
227;        UNLABSUR: entier n. specifant qu''on ne labelle qu''un
228;        contour sur n. Par defaut unlabsur=2
229;
230;       /UNSUR2: si on veut tracer un countour sur deux. par  defaut trace
231; tous les contours
232;
233;       /UNVECTSUR:un scalaire n on un tableau a 2 elements [n1,n2].
234;         dans le premier cas, on tracera un vecteur sur n suivant les
235;         x et les y.
236;         dans le second cas on tracera un vecteur sur n1 suivant x
237;         et un vecteur sur n2 suivant y
238;       Rq; pour tracer tous les vecteurs suivant y et 1 sur 2 suivant
239;       x mettre unvectsur=[2,1]
240;       Rq: ce mot cle est passe ds _extra
241;
242;       VECTCOLOR: la couleur de la fleche. Par defaut noir (couleur 0)
243;
244;       VECTEUR: une structure a 2 elements contenant les 2 champs U
245;       et V des valeurs de la composante zonale et meridienne du
246;       champ de vecteurs a tracer. Ces champs peuvent etre un tableau
247;       ou une structure
248;       par ex: vecteur={matriceu:lec('unsurface'),matricev:lec('vnsurface')}
249;       rq:le nom des elements de vecteur n''a aucune importance.
250;       vecteur={u:lec('unsurface'),v:lec('vnsurface')} convient aussi
251;
252;       VECTMIN=norme minimum des vecteurs a tracer
253;
254;       VECTMAX=norme maximum des vecteurs a tracer
255;
256;       VECTTHICK; l''epaissuer de la fleche. par defaut 1.
257;
258;       WINDOW: numero de la fenetre ou l'on veut faire le graphe (permet
259; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0'
260;
261;       YSURX: rapport d'echelle entre y et x (par ex: =1 pour un repere
262; orthonorme, =2 si l'axe des y est deux fois plus dilate que celui des x).
263; Par defaut on adapte pour occupe une grande partie de la feuille en sortie
264; postScript ou pour cree une fenetre pas trop etiree
265;
266; COMMON BLOCKS:
267;       common.pro
268;
269; SIDE EFFECTS:
270;
271; RESTRICTIONS:
272;
273; EXAMPLE:
274;
275; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
276;                       7/1999
277;                       Sebastien Masson 08/02/2000 checkfield and
278;                       notri keyword (or triangule = -1) .
279;-
280;------------------------------------------------------------
281;------------------------------------------------------------
282;------------------------------------------------------------
283pro plt,tab1, giventype,givenmin,givenmax,CARTE=carte,CONTOUR=contour $
284        ,INTERVALLE=intervalle,INV=inv, GRILLE = grille, BOITE = boite $
285        ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $
286        ,STYLE=style,CONTMAX=contmax,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $
287        , VECTEUR=vecteur,MAP = map, MININ = minin, MAXIN = maxin $
288        , CONT_NOFILL = cont_nofill, NIVEAUDESSIN = niveaudessin, NOTRI = notri $
289        , DUPLICATE = duplicate, STRICTFILL = strictfill, OVERPLOT = overplot, _extra = ex
290@common
291;--------------------------------------------------------------
292   tempsun = systime(1)         ; pour key_performance
293;--------------------------------------------------------------
294;--------------------------------------------------------------
295; I) preparation de l''environnement graphique et petites verifications
296;--------------------------------------------------------------
297;--------------------------------------------------------------
298; I1) verification du type de grille associe a tab1
299;--------------------------------------------------------------
300   if keyword_set(grille) then vargrid = grille
301   if keyword_set(vecteur) AND (NOT keyword_set(grille)) then BEGIN
302      vargrid = litchamp(tab1, /grid)
303      if vargrid eq '' then BEGIN
304         vargrid = xquestion('Quelle est la grille a laquelle le champ a tracer se rapporte?', 'T', /chkwidget)
305         vargrid = strupcase(vargrid)
306      endif
307   ENDIF
308;--------------------------------------------------------------
309; I2) lecture du champ et checkup.
310;--------------------------------------------------------------
311   if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
312   if n_elements(giventype) NE 0 then type = giventype
313   if n_elements(givenmin) NE 0 then min = givenmin
314   if n_elements(givenmax) NE 0 then max = givenmax
315   if n_elements(minin) NE 0 then min = minin
316   if n_elements(maxin) NE 0 then max = maxin
317   checktypeminmax, 'plt', TYPE = type, MIN = min, MAX = max
318   z2d = checkfield(tab1, 'plt', TYPE = type, BOITE = boite, DIREC = direc, VECTEUR = vecteur, _extra = ex)
319   if z2d[0] EQ -1 then BEGIN
320      if keyword_set(boite) then domdef, oldboite,GRILLE=vargrid
321      return
322   endif
323;--------------------------------------------------------------
324; I3) reinitialisation. !p.,!x.,!y.
325; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour
326;--------------------------------------------------------------
327   if n_elements(contour) ne 4 AND NOT keyword_set(overplot) then reinitplt, /z,/invert
328;---------------------------------------------------------------
329; I4) attribution du mask et des tableaux de longitude et latitude
330;---------------------------------------------------------------
331   if keyword_set(niveaudessin) then niveau = niveaudessin
332   if n_elements(gdept) GE 2 then begin
333      IF gdept[0] LT gdept[1] THEN profond = niveau NE 1 ELSE profond = niveau NE jpk
334   ENDIF ELSE profond = niveau NE 1
335   if keyword_set(profond) then $
336; si on fait un plt en profondeur, il faudra recalculer la
337; triangulation, ca ne sert donc a rien de calculer tri maintenant
338; (surtout que c''est assez couteux!)
339   grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $
340    , dernierz, /forplt, _extra = ex ELSE $
341    grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $
342    , dernierz, TRI = tri, /forplt, _extra = ex
343   if keyword_set(notri) then tri = -1
344   if keyword_set(profond) AND triangles[0] EQ -1 then tri = -1
345;----------------------------------------------------------------------------
346; I5 determination du mi:min et du ma:max de z2d ainsi que de max: max et
347;    min: min pour le dessin.
348;-----------------------------------------------------------------------------
349   nan = total(finite(z2d,/nan)) < 1
350; faudra-t-il faire un autoscale ???
351   autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle)
352   determineminmax, z2d, mask, mi, ma, glam, gphi, MININ = min, MAXIN = max, nan = nan,INTERVALLE=intervalle
353   if z2d[0] EQ -1 THEN GOTO, sortie
354; on fait un autoscale si besoin
355   if autoscale then autoscale, min, max, intervalle
356;--------------------------------------------------------------
357;--------------------------------------------------------------
358; II) mise en place du dessin sur la fenetre ou la page et ouverture
359; eventuelle de la fenetre et de la page
360;--------------------------------------------------------------
361   if n_elements(contour) NE 4 AND NOT keyword_set(overplot) THEN $
362    placedessin, 'plt',posfenetre, posbar $
363    , CONTOUR = contour, VECTEUR = vecteur, MAP = map, DIREC = direc, _extra = ex
364;--------------------------------------------------------------
365;--------------------------------------------------------------
366; III) habillage du dessin (labels,style,axe)
367;------------------------------------------------------------
368;--------------------------------------------------------------
369;
370;--------------------------------------------------------------
371; III1) choix des labels
372;-----------------------------------------------------------
373   if keyword_set(intervalle) AND NOT keyword_set(label) then label=1
374   if keyword_set(label) eq 0 then cas=0 else cas=label
375   label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill
376;--------------------------------------------------------------
377; III2)choix de style
378;-----------------------------------------------------------
379   if not keyword_set(style) then style=0
380   style,style,level_z2d,linestyle,thick
381   if keyword_set(inv) then couleur=reverse(couleur)
382;-----------------------------------------------------------
383; III3) definition des axes
384;----------------------------------------------------------
385   if NOT keyword_set(overplot) THEN axe, 'xy', _EXTRA = ex
386;   IF NOT(keyword_set(map)) then axe, 'xy'
387;--------------------------------------------------------------
388;--------------------------------------------------------------
389;------------------------------------------------------------
390; IV) dessin
391;--------------------------------------------------------------
392;--------------------------------------------------------------
393   mask = mask[*, *,niveau-1-premierz]
394   if keyword_set(nan) then begin
395      notanumber = where(finite(z2d, /nan) EQ 1)
396      z2d[notanumber] = max
397      masknan = replicate(1, nx, ny)
398      masknan[notanumber] = 0
399   ENDIF ELSE masknan = 1
400   z2d = remplit(z2d,nite=(1+(vargrid NE 'T' AND vargrid NE 'W')+keyword_set(nan)) $
401                 *(1-keyword_set(cont_nofill)) $
402                 , mask = mask*masknan, _extra=ex)
403   if NOT keyword_set(strictfill) then z2d = min > z2d <  max
404;
405   if vargrid EQ 'T' OR vargrid EQ 'W' then BEGIN
406; ds ce cas, le masque utilise pour le champ est le meme que celui
407; utilise pour la terre.
408; si on fait un dessin en profondeur ou qu''il y a des pts a nan on
409; redefinit une triangulation sur le zoom
410      if keyword_set(profond) OR keyword_set(nan) then BEGIN
411         if ( (testvar(var = tri))[0] NE -1 OR keyword_set(nan) ) $
412          AND NOT keyword_set(notri) then BEGIN
413            IF keyword_set(cont_nofill) then BEGIN
414               if keyword_set(nan) then begin
415                  tri = triangule(masknan, coinmonte = coinmontemask, coindescend = coindescendmask $
416                                  , periodique = keyword_set(key_periodique)*(nx EQ jpi))
417               ENDIF ELSE BEGIN
418                  tri = definetri(nx, ny)
419                  coinmontemask = -1
420                  coindescendmask = -1
421               ENDELSE
422            ENDIF ELSE BEGIN
423               mask = temporary(masknan*mask)
424               tri = triangule(mask, coinmonte = coinmontemask, coindescend = coindescendmask $
425                               , periodique = keyword_set(key_periodique)*(nx EQ jpi))
426            ENDELSE
427         ENDIF
428         indicezoommask = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery]
429      ENDIF ELSE BEGIN
430         if keyword_set(cont_nofill) AND (testvar(var = tri))[0] NE -1 then BEGIN
431            tri = definetri(nx, ny)
432            coinmontemask = -1
433            coindescendmask = -1
434         endif
435      ENDELSE
436      glammsk = glam
437      gphimsk = gphi
438   ENDIF ELSE BEGIN
439; ds ce cas, le masque utilise pour le champ n''est pas le meme que celui
440; utilise pour la terre (grille T);
441;
442; si on fait un dessin en profondeur on redefinit une triangulation
443; sur le zoom, cette triangulation sera utilisee pour tracer le
444; champ. on utilise tmask pour que les trous de cette triangulation
445; soient bien les memes que ceux utilises pour tracer le
446; masque et correspondent bien au trous qu''il y a a cette nouvelle
447; profondeur.
448      if keyword_set(profond) AND (testvar(var = tri))[0] NE -1 then BEGIN
449         if keyword_set(cont_nofill) then BEGIN
450            tri = definetri(nx, ny)
451            coinmontemask = -1
452            coindescendmask = -1
453         ENDIF ELSE $
454          tri = triangule(tmask[premierx:dernierx, premiery:derniery, niveau-1] $
455                          , coinmonte = coinmontemask, coindescend = coindescendmask $
456                          , periodique = keyword_set(key_periodique)*(nx EQ jpi))
457      ENDIF
458; si on a des pts a nan, comme la grille du mask est differente de
459; celui du mask il faudra les tracer a part. on definit donc pour cela
460; trinan, coinmontenan, coindescendnan, indicezoomnan, xnan et ynan
461; qui permettront de tracer masknan independemment du mask terre.
462; Rq: on utilise xnan, ynan au lieu de glam et gphi car pour ces 2
463; derniers tableaux calcules par grille on a active /forplt donc leur
464; valeur sur les points terre est celle de glamt et gphit.
465      if keyword_set(nan) AND NOT keyword_set(notri) then BEGIN
466         trinan = triangule(1-masknan $
467                            , coinmonte = coinmontenan, coindescend = coindescendnan $
468                            , periodique = keyword_set(key_periodique)*(nx EQ jpi))
469         indicezoomnan = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery]
470         grille, rien, xnan, ynan
471         undefine, rien
472      ENDIF
473; decoupe terre: pour que le tarce des cotes soient propres on essaye de
474; prenddre des points en + pour la terre comme ca on ne voit pas le
475; decalage des grilles. c''est ce que fait decoupeterre. au passage on
476; redefinit trimsk.
477      decoupeterre, mask, glammsk, gphimsk, TRI = trimsk, indicezoom = indicezoommask $
478       , coinmonte = coinmontemask, coindescend = coindescendmask, _EXTRA = ex
479   ENDELSE
480;------------------------------------------------------------
481; IV1) choix du type de dessin
482;------------------------------------------------------------
483   typetrace = 'classique'
484   if keyword_set(map) then BEGIN
485; appelle de mapset qd on veut faire des projections
486      IF n_elements(map) NE 3 THEN map = [0, ((lon1+lon2)/2.) MOD 360, 0]
487      typetrace = 'projection'
488      map_lat = map[0]
489      map_lon = map[1]
490      map_rot = map[2]
491      if chkstru(ex, 'TITLE') then begin
492         maptitre = ex.title
493         ex.title = ''
494      endif
495      map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $
496       ,limit = [lat1, lon1, lat2, lon2], /noborder
497      if n_elements(maptitre) ne 0 then ex.title = maptitre
498      if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex)
499      if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk,glammsk,gphimsk,_EXTRA=ex)
500      if n_elements(trinan) GE 2 then BEGIN
501         trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex)
502         if trinan[0] EQ -1 then undefine, trinan
503      endif
504   ENDIF ELSE BEGIN
505;pour que les axes de coordonees soient pris en compte
506      if !x.type EQ 0 AND n_elements(contour) LE 4 then $
507       plot, [0], [0], xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase
508      if keyword_set(key_periodique) then BEGIN
509; ds ce cas la triangulation est refermee en x et couvre toute la
510; sphere. il faut dont la couper au niveau ou l''on coupe la sphere
511; pour faire le dessin
512         if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex)
513         if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk,_EXTRA=ex)
514         if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex)
515      endif
516   endelse
517;------------------------------------------------------------
518; IV2) coutours et coloriages
519;------------------------------------------------------------
520   if keyword_set(duplicate)  then BEGIN
521; pour marina uniquement ATTENTION C'EST TRES MAL CODE
522      lon = glam[*, 0]
523      decalage = max(lon)-min(lon)+(lon-shift(lon, 1))[n_elements(lon)-1]
524      !x.range[1] = !x.range[1]+(duplicate-1)*decalage
525      for i = 1,duplicate-1 do BEGIN
526         z2d = [z2d, z2d]
527         gphi = [gphi, gphi]
528         mask = [mask, mask]
529         gphimsk = [gphimsk, gphimsk]
530         glam = [glam, glam+i*decalage]
531         glammsk = [glammsk, glammsk]
532      ENDFOR
533   endif
534   pltbase, z2d,glam,gphi $
535    , mask,glammsk,gphimsk,trichamp=tri,trimsk=trimsk, /forplt $
536    , level_z2d, couleur, contour = contour, carte = carte $
537    , overplot = keyword_set(overplot)+keyword_set(map) $
538    , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $
539    , c_thick=thick, cont_nofill = cont_nofill, nan = nan $
540    , coinmontemask = coinmontemask, coindescendmask = coindescendmask $
541    , coinmontenan = coinmontenan, coindescendnan = coindescendnan $
542    , indicezoommask = indicezoommask, indicezoomnan = indicezoomnan $
543    , masknan = masknan, trinan = trinan, xnan = xnan, ynan = ynan, _extra = ex
544;------------------------------------------------------------
545; IV3) rappelle de plt en boucle qd contour est active
546;------------------------------------------------------------
547   if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt
548      contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite
549      return
550   endif
551   if keyword_set(contour) THEN BEGIN
552      pourlegende = [1, 1, 1, 1]
553      oldattributs = saveatt()
554      oldcouleur = couleur
555      plt,contour,contmin,contmax,CONTOUR=pourlegende, /noerase, NOTRI = notri $
556       ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style $
557       ,NLEVEL=contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill, _extra = ex
558      restoreatt, oldattributs
559      couleur = oldcouleur
560   ENDIF
561;------------------------------------------------------------
562;------------------------------------------------------------
563; V) petites finitions
564;------------------------------------------------------------
565;------------------------------------------------------------
566;
567;------------------------------------------------------------
568; V1) ajout eventuel de vecteurs en surimpression
569;------------------------------------------------------------
570   if keyword_set(vecteur) then BEGIN
571      oldattributs = saveatt()
572      ajoutvect,vecteur,vectlegende, _extra = ex
573      restoreatt, oldattributs
574   ENDIF
575;
576   if keyword_set(overplot) then GOTO, fini
577;------------------------------------------------------------
578; V2) Trace de la ligne de changement de date,l'equateur et
579; le meridien de greenwich, ...
580;------------------------------------------------------------
581   if NOT keyword_set(map) then meridienparallele, 'xy'
582;------------------------------------------------------------
583; V3) pour tracer les continents d'IDL
584;------------------------------------------------------------
585   if keyword_set(carte) then BEGIN
586; si noease est passe de _extra, on s''assure qu''il est a 1
587      if chkstru(ex, 'NOERASE') then begin
588         oldnoerase = ex.noerase
589         ex.noerase = 1
590      ENDIF
591      if chkstru(ex, 'cont_thick') then mlinethick = ex.cont_thick ELSE mlinethick = 1
592      IF NOT keyword_set(map) THEN $
593       map_set,0,((lon1+lon2)/2.) MOD 360,0, _extra = ex, position = posfenetre $
594       ,  limit =[lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0
595      if carte NE 2 AND NOT keyword_set(cont_nofill) then $
596       map_continents, /fill_continents, color = c_cont, _extra = ex, /noerase
597      map_continents, /continents, color = c_cote, MLINETHICK = mlinethick, /noerase, _extra = ex
598      if chkstru(ex, 'NOERASE') THEN  ex.noerase = oldnoerase
599   ENDIF
600;------------------------------------------------------------
601; V4) legendes + affichage de celles-ci
602;------------------------------------------------------------
603   legende,mi,ma,'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex
604   if n_elements(ex) NE 0 then BEGIN
605; pour garder les axes du cadre en noir
606      if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote
607   endif
608;
609   case typetrace of
610      'classique': $
611       plot, [0], [0],/noerase,color=0,xtickformat='lonaxe',ytickformat='lataxe' $
612       , xstyle = 1, ystyle = 1, _extra = ex
613      'projection': BEGIN
614         if chkstru(ex, 'NOERASE') then begin
615            oldnoerase = ex.noerase
616            ex.noerase = 1
617         endif
618         if chkstru(ex, 'SUBTITLE') then !p.subtitle = ex.SUBTITLE
619         if n_elements(maptitre) ne 0 then ex.title = maptitre
620         map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$
621          , /NOERASE, /noborder, title = !p.title, color = 0
622;         map_proj_info, numproj, /current
623;         map_proj_info, numproj, name = nomproj
624;         if nomproj EQ 'Mercator' OR nomproj EQ 'Cylindrical' OR nomproj EQ 'LambertConic'$
625;          OR nomproj EQ 'Gnomic' OR nomproj EQ 'AlbersEqualAreaConic' $
626;          OR nomproj EQ 'TransverseMercator' OR nomproj EQ 'MillerCylindrical' $
627;          OR nomproj EQ 'LambertConicEllipsoid' then map_grid, box_axes=1,latdel=10,londel=10 $
628;         ELSE map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30
629         map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30, color = 0, _extra = ex
630         if chkstru(ex, 'NOERASE') THEN  ex.noerase = oldnoerase
631      end
632   endcase
633;------------------------------------------------------------
634; V5) barre de couleur
635;------------------------------------------------------------
636   couleur = couleur[0:ncontour-1-keyword_set(strictfill)]
637   barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $
638    , max=max,discret=couleur,_extra = ex
639;------------------------------------------------------------
640;------------------------------------------------------------
641; VI) impression eventuelle
642;------------------------------------------------------------
643;------------------------------------------------------------
644fini:
645   terminedessin, _extra = ex
646   if keyword_set(vecteur) then grillechoice = [vargrid, 'T', 'U', 'V'] ELSE grillechoice = ['T', vargrid]
647   if keyword_set(oldboite) then domdef, oldboite, GRILLE = grillechoice
648;------------------------------------------------------------
649;------------------------------------------------------------
650sortie:
651   if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun
652;------------------------------------------------------------
653;------------------------------------------------------------
654   return
655end
656
657
Note: See TracBrowser for help on using the repository browser.