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

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

miscellaneous modifications according to cerbere.lodyc.jussieu.fr: /usr/home/smasson/SAXO_RD/

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