[2] | 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 | ;------------------------------------------------------------ |
---|
| 283 | pro 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 n_elements(ex) NE 0 then BEGIN |
---|
| 492 | if (where(tag_names(ex) EQ 'TITLE'))[0] NE -1 then BEGIN |
---|
| 493 | titre = ex.title |
---|
| 494 | ex.title = '' |
---|
| 495 | endif |
---|
| 496 | ENDIF |
---|
| 497 | map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $ |
---|
| 498 | ,limit = [lat1, lon1, lat2, lon2], /noborder |
---|
| 499 | if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex) |
---|
| 500 | if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk,glammsk,gphimsk,_EXTRA=ex) |
---|
| 501 | if n_elements(trinan) GE 2 then BEGIN |
---|
| 502 | trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex) |
---|
| 503 | if trinan[0] EQ -1 then undefine, trinan |
---|
| 504 | endif |
---|
| 505 | ENDIF ELSE BEGIN |
---|
| 506 | ;pour que les axes de coordonees soient pris en compte |
---|
| 507 | if !x.type EQ 0 AND n_elements(contour) LE 4 then $ |
---|
| 508 | plot, [0], [0], xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase |
---|
| 509 | if keyword_set(key_periodique) then BEGIN |
---|
| 510 | ; ds ce cas la triangulation est refermee en x et couvre toute la |
---|
| 511 | ; sphere. il faut dont la couper au niveau ou l''on coupe la sphere |
---|
| 512 | ; pour faire le dessin |
---|
| 513 | if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex) |
---|
| 514 | if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk,_EXTRA=ex) |
---|
| 515 | if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex) |
---|
| 516 | endif |
---|
| 517 | endelse |
---|
| 518 | ;------------------------------------------------------------ |
---|
| 519 | ; IV2) coutours et coloriages |
---|
| 520 | ;------------------------------------------------------------ |
---|
| 521 | if keyword_set(duplicate) then BEGIN |
---|
| 522 | ; pour marina uniquement ATTENTION C'EST TRES MAL CODE |
---|
| 523 | lon = glam[*, 0] |
---|
| 524 | decalage = max(lon)-min(lon)+(lon-shift(lon, 1))[n_elements(lon)-1] |
---|
| 525 | !x.range[1] = !x.range[1]+(duplicate-1)*decalage |
---|
| 526 | for i = 1,duplicate-1 do BEGIN |
---|
| 527 | z2d = [z2d, z2d] |
---|
| 528 | gphi = [gphi, gphi] |
---|
| 529 | mask = [mask, mask] |
---|
| 530 | gphimsk = [gphimsk, gphimsk] |
---|
| 531 | glam = [glam, glam+i*decalage] |
---|
| 532 | glammsk = [glammsk, glammsk] |
---|
| 533 | ENDFOR |
---|
| 534 | endif |
---|
| 535 | pltbase, z2d,glam,gphi $ |
---|
| 536 | , mask,glammsk,gphimsk,trichamp=tri,trimsk=trimsk, /forplt $ |
---|
| 537 | , level_z2d, couleur, contour = contour, carte = carte $ |
---|
| 538 | , overplot = keyword_set(overplot)+keyword_set(map) $ |
---|
| 539 | , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $ |
---|
| 540 | , c_thick=thick, cont_nofill = cont_nofill, nan = nan $ |
---|
| 541 | , coinmontemask = coinmontemask, coindescendmask = coindescendmask $ |
---|
| 542 | , coinmontenan = coinmontenan, coindescendnan = coindescendnan $ |
---|
| 543 | , indicezoommask = indicezoommask, indicezoomnan = indicezoomnan $ |
---|
| 544 | , masknan = masknan, trinan = trinan, xnan = xnan, ynan = ynan, _extra = ex |
---|
| 545 | ;------------------------------------------------------------ |
---|
| 546 | ; IV3) rappelle de plt en boucle qd contour est active |
---|
| 547 | ;------------------------------------------------------------ |
---|
| 548 | if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt |
---|
| 549 | contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite |
---|
| 550 | return |
---|
| 551 | endif |
---|
| 552 | if keyword_set(contour) THEN BEGIN |
---|
| 553 | pourlegende = [1, 1, 1, 1] |
---|
| 554 | oldattributs = saveatt() |
---|
| 555 | oldcouleur = couleur |
---|
| 556 | plt,contour,contmin,contmax,CONTOUR=pourlegende, /noerase, NOTRI = notri $ |
---|
| 557 | ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style $ |
---|
| 558 | ,NLEVEL=contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill, _extra = ex |
---|
| 559 | restoreatt, oldattributs |
---|
| 560 | couleur = oldcouleur |
---|
| 561 | ENDIF |
---|
| 562 | ;------------------------------------------------------------ |
---|
| 563 | ;------------------------------------------------------------ |
---|
| 564 | ; V) petites finitions |
---|
| 565 | ;------------------------------------------------------------ |
---|
| 566 | ;------------------------------------------------------------ |
---|
| 567 | ; |
---|
| 568 | ;------------------------------------------------------------ |
---|
| 569 | ; V1) ajout eventuel de vecteurs en surimpression |
---|
| 570 | ;------------------------------------------------------------ |
---|
| 571 | if keyword_set(vecteur) then BEGIN |
---|
| 572 | oldattributs = saveatt() |
---|
| 573 | ajoutvect,vecteur,vectlegende, _extra = ex |
---|
| 574 | restoreatt, oldattributs |
---|
| 575 | ENDIF |
---|
| 576 | ; |
---|
| 577 | if keyword_set(overplot) then GOTO, fini |
---|
| 578 | ;------------------------------------------------------------ |
---|
| 579 | ; V2) Trace de la ligne de changement de date,l'equateur et |
---|
| 580 | ; le meridien de greenwich, ... |
---|
| 581 | ;------------------------------------------------------------ |
---|
| 582 | if NOT keyword_set(map) then meridienparallele, 'xy' |
---|
| 583 | ;------------------------------------------------------------ |
---|
| 584 | ; V3) pour tracer les continents d'IDL |
---|
| 585 | ;------------------------------------------------------------ |
---|
| 586 | if keyword_set(carte) then BEGIN |
---|
| 587 | ; si noease est passe de _extra, on s''assure qu''il est a 1 |
---|
| 588 | if chkstru(ex, 'NOERASE') then begin |
---|
| 589 | oldnoerase = ex.noerase |
---|
| 590 | ex.noerase = 1 |
---|
| 591 | ENDIF |
---|
| 592 | if chkstru(ex, 'cont_thick') then mlinethick = ex.cont_thick ELSE mlinethick = 1 |
---|
| 593 | IF NOT keyword_set(map) THEN $ |
---|
| 594 | map_set,0,((lon1+lon2)/2.) MOD 360,0, _extra = ex, position = posfenetre $ |
---|
| 595 | , limit =[lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0 |
---|
| 596 | if carte NE 2 AND NOT keyword_set(cont_nofill) then $ |
---|
| 597 | map_continents, /fill_continents, color = c_cont, _extra = ex, /noerase |
---|
| 598 | map_continents, /continents, color = c_cote, MLINETHICK = mlinethick, /noerase, _extra = ex |
---|
| 599 | if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase |
---|
| 600 | ENDIF |
---|
| 601 | ;------------------------------------------------------------ |
---|
| 602 | ; V4) legendes + affichage de celles-ci |
---|
| 603 | ;------------------------------------------------------------ |
---|
| 604 | legende,mi,ma,'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex |
---|
| 605 | if n_elements(ex) NE 0 then BEGIN |
---|
| 606 | ; pour garder les axes du cadre en noir |
---|
| 607 | if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote |
---|
| 608 | endif |
---|
| 609 | ; |
---|
| 610 | case typetrace of |
---|
| 611 | 'classique': $ |
---|
| 612 | plot, [0], [0],/noerase,color=0,xtickformat='lonaxe',ytickformat='lataxe' $ |
---|
| 613 | , xstyle = 1, ystyle = 1, _extra = ex |
---|
| 614 | 'projection': BEGIN |
---|
| 615 | if chkstru(ex, 'NOERASE') then begin |
---|
| 616 | oldnoerase = ex.noerase |
---|
| 617 | ex.noerase = 1 |
---|
| 618 | endif |
---|
| 619 | map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$ |
---|
| 620 | , /NOERASE, /noborder, title = !p.title, color = 0 |
---|
| 621 | ; map_proj_info, numproj, /current |
---|
| 622 | ; map_proj_info, numproj, name = nomproj |
---|
| 623 | ; if nomproj EQ 'Mercator' OR nomproj EQ 'Cylindrical' OR nomproj EQ 'LambertConic'$ |
---|
| 624 | ; OR nomproj EQ 'Gnomic' OR nomproj EQ 'AlbersEqualAreaConic' $ |
---|
| 625 | ; OR nomproj EQ 'TransverseMercator' OR nomproj EQ 'MillerCylindrical' $ |
---|
| 626 | ; OR nomproj EQ 'LambertConicEllipsoid' then map_grid, box_axes=1,latdel=10,londel=10 $ |
---|
| 627 | ; ELSE map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30 |
---|
| 628 | map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30, color = 0, _extra = ex |
---|
| 629 | if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase |
---|
| 630 | end |
---|
| 631 | endcase |
---|
| 632 | ;------------------------------------------------------------ |
---|
| 633 | ; V5) barre de couleur |
---|
| 634 | ;------------------------------------------------------------ |
---|
| 635 | couleur = couleur[0:ncontour-1-keyword_set(strictfill)] |
---|
| 636 | barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $ |
---|
| 637 | , max=max,discret=couleur,_extra = ex |
---|
| 638 | ;------------------------------------------------------------ |
---|
| 639 | ;------------------------------------------------------------ |
---|
| 640 | ; VI) impression eventuelle |
---|
| 641 | ;------------------------------------------------------------ |
---|
| 642 | ;------------------------------------------------------------ |
---|
| 643 | fini: |
---|
| 644 | terminedessin, _extra = ex |
---|
| 645 | if keyword_set(vecteur) then grillechoice = [vargrid, 'T', 'U', 'V'] ELSE grillechoice = ['T', vargrid] |
---|
| 646 | if keyword_set(oldboite) then domdef, oldboite, GRILLE = grillechoice |
---|
| 647 | ;------------------------------------------------------------ |
---|
| 648 | ;------------------------------------------------------------ |
---|
| 649 | sortie: |
---|
| 650 | if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun |
---|
| 651 | ;------------------------------------------------------------ |
---|
| 652 | ;------------------------------------------------------------ |
---|
| 653 | return |
---|
| 654 | end |
---|
| 655 | |
---|
| 656 | |
---|