;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME: ; PLT ; ; PURPOSE: ; trace des graphes horizontaux (cartes) ; ; CATEGORY: ; Graphics, trace des graphes horizontaux ; ; CALLING SEQUENCE: ; plt, champ [,min[, max]] ; ; INPUTS: ; champ: le champ dont on veut faire la carte horizontale champ ; peut etre de 2 types: ; 1) un tableau 2d ou 3d. Si le champ est un tableau 3d on en ; extrait un tableau 2d au niveau stipule par l''utilisateur ; qui repond a une question. ; 2) une structure repondant aux critaire specifies par ; litchamp.pro. cf. IDL> xhelp,'litchamp' ; ; ces ARGUMENTS ne sont pas obligatoires: ; ; MAX: valeur maximum que l''on veut prendre en compte dans le trace ; des contours. Par defaut on prend le max de tab1 (sur les pts mer) ; ; MIN: valeur minimum que l''on veut prendre en compte dans le trace ; des contours. Par defaut on prend le min de tab1 (sur les pts mer) ; ; KEYWORD PARAMETERS: ; ; BOITE:vecteur indiquant la zone geographique sur laquelle doit etre ; faite la coupe. Si BOITE a : ; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]] ; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]] ; 4 elements: l''extraction est faite sur [Boite, 0, max([gdept, gdepw])] ; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]] ; 6 elements: l''extraction est faite sur Boite ; ; Ou lon1, lon2,lat1,lat2 sont les variables globales ; definies lors du dernier domdef! ; ; CARTE:Permet de dessiner les continents definits ds IDL. CARTE ; peut prendre deux formes: ; /CARTE: on dessine les continents a la place du mask ; CARTE=2 on dessine le contours des continents par ; dessus le dessin masque (ceci permet de voir si le masque ; correspond bien aux continents reels). ; ; CB_TITLE: le titre de la colorbar ; ; CB_SUBTITLE: le soustitre de la colorbar ; ; CB_CHARSIZE: The character size of the color bar annotations ; ; CMREF: la longeur en cm sur le papier que doit faire la fleche ; de norme normeref. par defaut ajuste au dessin et compris entre ; .5 et 1.5 cm ; ; /CONT_NOFILL: activer pour ne pas remplir les points masques ; a la couleur c_cont mais pour les laisser en transparent! Rq ; on trace qd meme le contour du mask de la couleur c_cote ; ; CONTINTERVALLE: lorsque CONTOUR est active, valeur d'un ; intervalle entre deux isolignes traces par un trait ds la couleur ; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE ; qui, cas ce cas, ne controle que les isolignes coloriees en ; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va ; bien avec l''intervalle specifie!. Si ce mot cle n''est pas ; specifie, on trace 20 isolignes du min au max. ; ; CONTLABEL: un entier n. lorsque CONTOUR est active, si n ; different de 0, choisit le type de label correspondant aux cas n ; pour les isolignes tracees par un trait. Pour specifier le type de ; label du contour en couleur, utiliser LABEL ; ; CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on ; veut prendre en compte dans le trace des isolignes traces par un ; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer) ; du tableau passe ds le mot cle CONTOUR. ; ; CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on ; veut prendre en compte dans le trace des isolignes traces par un ; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer) ; du tableau passe ds le mot cle CONTOUR. ; ; CONTNLEVEL: lorsque CONTOUR est active, nombre de contours ; trace par un trait de couleur c_lab a dessiner (actif si ; CONTLABEL=0) par defaut =20. ; ; CONTOUR: si on veut tracer les contours d'un champ different que celui ; que l''on dessin en couleur (par ex E-P en couleur et QSR en ; contours). Doit etre un champ repondant aux meme caracteristiques ; que l''argument numero 1 de plt ; ; GRILLE:'U','T','V','W' ou 'F' pour specifer eventuellement la ; grille a laquelle est rattache le champ. Rq: il afaut mieux ; utiliser ds ce cas une structure comme champ ; ; INTERVALLE: valeur d''un intervalle entre deux isolignes. Si ; aucun min n''est specifie, on choisit un contour min qui va bien ; avec l'intervalle specifie!. Si ce mot cle n''est pas specifie, on ; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active ; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en ; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait ; de couleur c_lab utiliser CONTINTERVALLE. ; ; /INV: inverse le vecteur couleur utilise pour colorier le graphe ; (sans toucher au noir, au blanc et a la palette utilisee) ; ; LABEL: un entier n. si n different de 0, choisit le type de ; label correspondant aux cas n. cf label.pro ; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les ; isolignes coloriees en couleur. Pour celles tracees par un trait de ; couleur c_lab utiliser CONTLABEL. ; ; /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre ; en position "allongee". ; ; LCT: entier designant le numero de la palette de couleur que ; l''on veut utiliser pour le plot. ; ; MAP:Mot cle a actine losque l''on veut faire une projection. ; Ce mot cle peut etre de 2 formes: ; MAP=[P0lat,P0lon,Rot]. Pour la description de ces 3 valeurs cf. ; l''aide en ligne de MAP_SET. ; /MAP: dans ce cas map est calcule tout seul et vaut: ; map = [0, (lon1+lon2)/2., 0] ; Rq: Un bon moyen de choisir sa projection est la valeur du vecteur ; MAP est d''utiliser la demo d''IDL5.2: ; IDL> demo ; Puis choisir earth sciences et mapping. ; Rq2: Par defaut c''est une projection cylindrique qui est effectuee ; (avec ou sans le mot cle map). Si on veut une autre projection MAP ; doit etre active et il faut rajouter le mot cle: /nom_projection. ; par ex pour une projection polaire centree sur le pole sud: ; IDL> domdef,-180,180,-90,-45 ; IDL> plt, tab, /stereo,map=[-90,0,0] ; ; MAXIN: permet de specifier la valeur maximum que l''on veut ; prendre en compte dans le trace des contours a l''aide d''un ; mot cle plutot que par l''argument max. Si l''argument et le ; mot cle sont specifies en meme temps, c''est la valeur ; specifiee par le mot cle qui est retenue. ; ; MININ: permet de specifier la valeur minimum que l''on veut ; prendre en compte dans le trace des contours a l''aide d''un ; mot cle plutot que par l''argument min. Si l''argument et le ; mot cle sont specifies en meme temps, c''est la valeur ; specifiee par le mot cle qui est retenue. ; ; NLEVEL: nombre de contours a dessiner. par defaut =20. actif si ; LABEL=0 ou n'est pas specifie. ; ; /NOCOLORBAR: activer si on ne veut pas de colorbar ; ; /NOCONTOUR: activer si on ne veut pas de contour mais juste ; les couleurs ; ; /NOCOULEUR: activer si on veut juste les contours en noir et ; blanc sur fond blanc ; ; /NOERASE: activer pour faire un dessin a l''ecran sans creer ; une nouvelle fenetre ; ; NORMEREF: la norme de la fleche de reference. par defaut on ; essaie de faire qqch qui colle pas trop mal! ; ; /NOTRI: pour forcer a ne pas utiliser de ; triangulation. Attention dans ce cas le trace ne marchera que ; si la grille est non deformee (cad, chaque pts d''une ; longitude donnee a la meme latitude et chaque pts d''une ; latitude donnee a la meme longitude) sauf si on utilise le mot ; clef CELL_FILL=2. Rq si le champ contient des points a ; !values.f_nan alors on fait qd meme une triangulation. ; ; OVERPLOT: pour faire un plt par dessus un autre. Rq: ; contrairemnet a l''utilisation de CONTOUR ou de VECTEUR, ; l''utilisation de ce mot clef ne modifie pas la legende ou/et ; la barre de couleur. ; ; PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un ; dessin sur une petite portion de feuille ou d''ecran. il delimite ; la zone ds laquelle va etre fait le dessin ; si il a 4 elements: ; il est alors constitute des coordonnees -exprime en cm reperes par ; rapport au coin en bas a gauche de la feuille ou de la fenetre ; (en portrait comme en landscape)- du coin en bas a ; gauche et du coin en haut a droite de la zone de dessin. ; si il a 3 elements: ; Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0] ; colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la ; case numero PETITDESSIN[2].La numerotation commencant en haut ; a gauche par le numero 1 et suivant apres dans le sens de ; l''ecriture. ; Par defaut on fait un dessin occupant la plus grande place possible ; tout en concervant le rapport d''aspect (sauf qd REMPLI est active) ; ; /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout". ; ; /POST: faire une sortie postscript. Ne marche que si on fait ; un seul dessin sur la feuille. Si on fait plusieurs dessins, ; utiliser @ps ou plein2dessins ; ; /REMPLI:oblige le dessin a occuper l'espace maximum definit ; par petitdessin ; ; /REVERSE_X: pour inverser l''axe des x (et aussi le dessin) ; ; /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin) ; ; /STRICTFILL: activer ce mot clef pour que le remplissage des ; contours ce fasse precisement entre le min et le max specifie ; en laissant en banc les valeurs inferieurs au min specifie et ; superieurs au max specifie. ; ; STYLE: style de tracer a adopter pour dessiner les isolignes par ; defaut style=0. cf style.pro ; ; /TRANS: fait un postscript (active /post automatiquement) et l''imprime ; -si on le desire- sur un transparant ; ; UNLABSUR: entier n. specifant qu''on ne labelle qu''un ; contour sur n. Par defaut unlabsur=2 ; ; /UNSUR2: si on veut tracer un countour sur deux. par defaut trace ; tous les contours ; ; /UNVECTSUR:un scalaire n on un tableau a 2 elements [n1,n2]. ; dans le premier cas, on tracera un vecteur sur n suivant les ; x et les y. ; dans le second cas on tracera un vecteur sur n1 suivant x ; et un vecteur sur n2 suivant y ; Rq; pour tracer tous les vecteurs suivant y et 1 sur 2 suivant ; x mettre unvectsur=[2,1] ; Rq: ce mot cle est passe ds _extra ; ; VECTCOLOR: la couleur de la fleche. Par defaut noir (couleur 0) ; ; VECTEUR: une structure a 2 elements contenant les 2 champs U ; et V des valeurs de la composante zonale et meridienne du ; champ de vecteurs a tracer. Ces champs peuvent etre un tableau ; ou une structure ; par ex: vecteur={matriceu:lec('unsurface'),matricev:lec('vnsurface')} ; rq:le nom des elements de vecteur n''a aucune importance. ; vecteur={u:lec('unsurface'),v:lec('vnsurface')} convient aussi ; ; VECTMIN=norme minimum des vecteurs a tracer ; ; VECTMAX=norme maximum des vecteurs a tracer ; ; VECTTHICK; l''epaissuer de la fleche. par defaut 1. ; ; WINDOW: numero de la fenetre ou l'on veut faire le graphe (permet ; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0' ; ; YSURX: rapport d'echelle entre y et x (par ex: =1 pour un repere ; orthonorme, =2 si l'axe des y est deux fois plus dilate que celui des x). ; Par defaut on adapte pour occupe une grande partie de la feuille en sortie ; postScript ou pour cree une fenetre pas trop etiree ; ; COMMON BLOCKS: ; common.pro ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) ; 7/1999 ; Sebastien Masson 08/02/2000 checkfield and ; notri keyword (or triangule = -1) . ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ pro plt,tab1, giventype,givenmin,givenmax,CARTE=carte,CONTOUR=contour $ ,INTERVALLE=intervalle,INV=inv, GRILLE = grille, BOITE = boite $ ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $ ,STYLE=style,CONTMAX=contmax,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $ , VECTEUR=vecteur,MAP = map, MININ = minin, MAXIN = maxin $ , CONT_NOFILL = cont_nofill, NIVEAUDESSIN = niveaudessin, NOTRI = notri $ , DUPLICATE = duplicate, STRICTFILL = strictfill, OVERPLOT = overplot, _extra = ex @common ;-------------------------------------------------------------- tempsun = systime(1) ; pour key_performance ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; I) preparation de l''environnement graphique et petites verifications ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; I1) verification du type de grille associe a tab1 ;-------------------------------------------------------------- if keyword_set(grille) then vargrid = grille if keyword_set(vecteur) AND (NOT keyword_set(grille)) then BEGIN vargrid = litchamp(tab1, /grid) if vargrid eq '' then BEGIN vargrid = xquestion('Quelle est la grille a laquelle le champ a tracer se rapporte?', 'T', /chkwidget) vargrid = strupcase(vargrid) endif ENDIF ;-------------------------------------------------------------- ; I2) lecture du champ et checkup. ;-------------------------------------------------------------- if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2] if n_elements(giventype) NE 0 then type = giventype if n_elements(givenmin) NE 0 then min = givenmin if n_elements(givenmax) NE 0 then max = givenmax if n_elements(minin) NE 0 then min = minin if n_elements(maxin) NE 0 then max = maxin checktypeminmax, 'plt', TYPE = type, MIN = min, MAX = max z2d = checkfield(tab1, 'plt', TYPE = type, BOITE = boite, DIREC = direc, VECTEUR = vecteur, _extra = ex) if z2d[0] EQ -1 then BEGIN if keyword_set(boite) then domdef, oldboite,GRILLE=vargrid return endif ;-------------------------------------------------------------- ; I3) reinitialisation. !p.,!x.,!y. ; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour ;-------------------------------------------------------------- if n_elements(contour) ne 4 AND NOT keyword_set(overplot) then reinitplt, /z,/invert ;--------------------------------------------------------------- ; I4) attribution du mask et des tableaux de longitude et latitude ;--------------------------------------------------------------- if keyword_set(niveaudessin) then niveau = niveaudessin if n_elements(gdept) GE 2 then begin IF gdept[0] LT gdept[1] THEN profond = niveau NE 1 ELSE profond = niveau NE jpk ENDIF ELSE profond = niveau NE 1 if keyword_set(profond) then $ ; si on fait un plt en profondeur, il faudra recalculer la ; triangulation, ca ne sert donc a rien de calculer tri maintenant ; (surtout que c''est assez couteux!) grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $ , dernierz, /forplt, _extra = ex ELSE $ grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $ , dernierz, TRI = tri, /forplt, _extra = ex if keyword_set(notri) then tri = -1 if keyword_set(profond) AND triangles[0] EQ -1 then tri = -1 ;---------------------------------------------------------------------------- ; I5 determination du mi:min et du ma:max de z2d ainsi que de max: max et ; min: min pour le dessin. ;----------------------------------------------------------------------------- nan = total(finite(z2d,/nan)) < 1 ; faudra-t-il faire un autoscale ??? autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle) determineminmax, z2d, mask, mi, ma, glam, gphi, MININ = min, MAXIN = max, nan = nan,INTERVALLE=intervalle if z2d[0] EQ -1 THEN GOTO, sortie ; on fait un autoscale si besoin if autoscale then autoscale, min, max, intervalle ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; II) mise en place du dessin sur la fenetre ou la page et ouverture ; eventuelle de la fenetre et de la page ;-------------------------------------------------------------- if n_elements(contour) NE 4 AND NOT keyword_set(overplot) THEN $ placedessin, 'plt',posfenetre, posbar $ , CONTOUR = contour, VECTEUR = vecteur, MAP = map, DIREC = direc, _extra = ex ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; III) habillage du dessin (labels,style,axe) ;------------------------------------------------------------ ;-------------------------------------------------------------- ; ;-------------------------------------------------------------- ; III1) choix des labels ;----------------------------------------------------------- if keyword_set(intervalle) AND NOT keyword_set(label) then label=1 if keyword_set(label) eq 0 then cas=0 else cas=label label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill ;-------------------------------------------------------------- ; III2)choix de style ;----------------------------------------------------------- if not keyword_set(style) then style=0 style,style,level_z2d,linestyle,thick if keyword_set(inv) then couleur=reverse(couleur) ;----------------------------------------------------------- ; III3) definition des axes ;---------------------------------------------------------- if NOT keyword_set(overplot) THEN axe, 'xy', _EXTRA = ex ; IF NOT(keyword_set(map)) then axe, 'xy' ;-------------------------------------------------------------- ;-------------------------------------------------------------- ;------------------------------------------------------------ ; IV) dessin ;-------------------------------------------------------------- ;-------------------------------------------------------------- mask = mask[*, *,niveau-1-premierz] if keyword_set(nan) then begin notanumber = where(finite(z2d, /nan) EQ 1) z2d[notanumber] = max masknan = replicate(1, nx, ny) masknan[notanumber] = 0 ENDIF ELSE masknan = 1 z2d = remplit(z2d,nite=(1+(vargrid NE 'T' AND vargrid NE 'W')+keyword_set(nan)) $ *(1-keyword_set(cont_nofill)) $ , mask = mask*masknan, _extra=ex) if NOT keyword_set(strictfill) then z2d = min > z2d < max ; if vargrid EQ 'T' OR vargrid EQ 'W' then BEGIN ; ds ce cas, le masque utilise pour le champ est le meme que celui ; utilise pour la terre. ; si on fait un dessin en profondeur ou qu''il y a des pts a nan on ; redefinit une triangulation sur le zoom if keyword_set(profond) OR keyword_set(nan) then BEGIN if ( (testvar(var = tri))[0] NE -1 OR keyword_set(nan) ) $ AND NOT keyword_set(notri) then BEGIN IF keyword_set(cont_nofill) then BEGIN if keyword_set(nan) then begin tri = triangule(masknan, coinmonte = coinmontemask, coindescend = coindescendmask $ , periodique = keyword_set(key_periodique)*(nx EQ jpi)) ENDIF ELSE BEGIN tri = definetri(nx, ny) coinmontemask = -1 coindescendmask = -1 ENDELSE ENDIF ELSE BEGIN mask = temporary(masknan*mask) tri = triangule(mask, coinmonte = coinmontemask, coindescend = coindescendmask $ , periodique = keyword_set(key_periodique)*(nx EQ jpi)) ENDELSE ENDIF indicezoommask = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery] ENDIF ELSE BEGIN if keyword_set(cont_nofill) AND (testvar(var = tri))[0] NE -1 then BEGIN tri = definetri(nx, ny) coinmontemask = -1 coindescendmask = -1 endif ENDELSE glammsk = glam gphimsk = gphi ENDIF ELSE BEGIN ; ds ce cas, le masque utilise pour le champ n''est pas le meme que celui ; utilise pour la terre (grille T); ; ; si on fait un dessin en profondeur on redefinit une triangulation ; sur le zoom, cette triangulation sera utilisee pour tracer le ; champ. on utilise tmask pour que les trous de cette triangulation ; soient bien les memes que ceux utilises pour tracer le ; masque et correspondent bien au trous qu''il y a a cette nouvelle ; profondeur. if keyword_set(profond) AND (testvar(var = tri))[0] NE -1 then BEGIN if keyword_set(cont_nofill) then BEGIN tri = definetri(nx, ny) coinmontemask = -1 coindescendmask = -1 ENDIF ELSE $ tri = triangule(tmask[premierx:dernierx, premiery:derniery, niveau-1] $ , coinmonte = coinmontemask, coindescend = coindescendmask $ , periodique = keyword_set(key_periodique)*(nx EQ jpi)) ENDIF ; si on a des pts a nan, comme la grille du mask est differente de ; celui du mask il faudra les tracer a part. on definit donc pour cela ; trinan, coinmontenan, coindescendnan, indicezoomnan, xnan et ynan ; qui permettront de tracer masknan independemment du mask terre. ; Rq: on utilise xnan, ynan au lieu de glam et gphi car pour ces 2 ; derniers tableaux calcules par grille on a active /forplt donc leur ; valeur sur les points terre est celle de glamt et gphit. if keyword_set(nan) AND NOT keyword_set(notri) then BEGIN trinan = triangule(1-masknan $ , coinmonte = coinmontenan, coindescend = coindescendnan $ , periodique = keyword_set(key_periodique)*(nx EQ jpi)) indicezoomnan = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery] grille, rien, xnan, ynan undefine, rien ENDIF ; decoupe terre: pour que le tarce des cotes soient propres on essaye de ; prenddre des points en + pour la terre comme ca on ne voit pas le ; decalage des grilles. c''est ce que fait decoupeterre. au passage on ; redefinit trimsk. decoupeterre, mask, glammsk, gphimsk, TRI = trimsk, indicezoom = indicezoommask $ , coinmonte = coinmontemask, coindescend = coindescendmask, _EXTRA = ex ENDELSE ;------------------------------------------------------------ ; IV1) choix du type de dessin ;------------------------------------------------------------ typetrace = 'classique' if keyword_set(map) then BEGIN ; appelle de mapset qd on veut faire des projections IF n_elements(map) NE 3 THEN map = [0, ((lon1+lon2)/2.) MOD 360, 0] typetrace = 'projection' map_lat = map[0] map_lon = map[1] map_rot = map[2] if n_elements(ex) NE 0 then BEGIN if (where(tag_names(ex) EQ 'TITLE'))[0] NE -1 then BEGIN titre = ex.title ex.title = '' endif ENDIF map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $ ,limit = [lat1, lon1, lat2, lon2], /noborder if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex) if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk,glammsk,gphimsk,_EXTRA=ex) if n_elements(trinan) GE 2 then BEGIN trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex) if trinan[0] EQ -1 then undefine, trinan endif ENDIF ELSE BEGIN ;pour que les axes de coordonees soient pris en compte if !x.type EQ 0 AND n_elements(contour) LE 4 then $ plot, [0], [0], xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase if keyword_set(key_periodique) then BEGIN ; ds ce cas la triangulation est refermee en x et couvre toute la ; sphere. il faut dont la couper au niveau ou l''on coupe la sphere ; pour faire le dessin if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex) if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk,_EXTRA=ex) if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex) endif endelse ;------------------------------------------------------------ ; IV2) coutours et coloriages ;------------------------------------------------------------ if keyword_set(duplicate) then BEGIN ; pour marina uniquement ATTENTION C'EST TRES MAL CODE lon = glam[*, 0] decalage = max(lon)-min(lon)+(lon-shift(lon, 1))[n_elements(lon)-1] !x.range[1] = !x.range[1]+(duplicate-1)*decalage for i = 1,duplicate-1 do BEGIN z2d = [z2d, z2d] gphi = [gphi, gphi] mask = [mask, mask] gphimsk = [gphimsk, gphimsk] glam = [glam, glam+i*decalage] glammsk = [glammsk, glammsk] ENDFOR endif pltbase, z2d,glam,gphi $ , mask,glammsk,gphimsk,trichamp=tri,trimsk=trimsk, /forplt $ , level_z2d, couleur, contour = contour, carte = carte $ , overplot = keyword_set(overplot)+keyword_set(map) $ , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $ , c_thick=thick, cont_nofill = cont_nofill, nan = nan $ , coinmontemask = coinmontemask, coindescendmask = coindescendmask $ , coinmontenan = coinmontenan, coindescendnan = coindescendnan $ , indicezoommask = indicezoommask, indicezoomnan = indicezoomnan $ , masknan = masknan, trinan = trinan, xnan = xnan, ynan = ynan, _extra = ex ;------------------------------------------------------------ ; IV3) rappelle de plt en boucle qd contour est active ;------------------------------------------------------------ if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite return endif if keyword_set(contour) THEN BEGIN pourlegende = [1, 1, 1, 1] oldattributs = saveatt() oldcouleur = couleur plt,contour,contmin,contmax,CONTOUR=pourlegende, /noerase, NOTRI = notri $ ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style $ ,NLEVEL=contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill, _extra = ex restoreatt, oldattributs couleur = oldcouleur ENDIF ;------------------------------------------------------------ ;------------------------------------------------------------ ; V) petites finitions ;------------------------------------------------------------ ;------------------------------------------------------------ ; ;------------------------------------------------------------ ; V1) ajout eventuel de vecteurs en surimpression ;------------------------------------------------------------ if keyword_set(vecteur) then BEGIN oldattributs = saveatt() ajoutvect,vecteur,vectlegende, _extra = ex restoreatt, oldattributs ENDIF ; if keyword_set(overplot) then GOTO, fini ;------------------------------------------------------------ ; V2) Trace de la ligne de changement de date,l'equateur et ; le meridien de greenwich, ... ;------------------------------------------------------------ if NOT keyword_set(map) then meridienparallele, 'xy' ;------------------------------------------------------------ ; V3) pour tracer les continents d'IDL ;------------------------------------------------------------ if keyword_set(carte) then BEGIN ; si noease est passe de _extra, on s''assure qu''il est a 1 if chkstru(ex, 'NOERASE') then begin oldnoerase = ex.noerase ex.noerase = 1 ENDIF if chkstru(ex, 'cont_thick') then mlinethick = ex.cont_thick ELSE mlinethick = 1 IF NOT keyword_set(map) THEN $ map_set,0,((lon1+lon2)/2.) MOD 360,0, _extra = ex, position = posfenetre $ , limit =[lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0 if carte NE 2 AND NOT keyword_set(cont_nofill) then $ map_continents, /fill_continents, color = c_cont, _extra = ex, /noerase map_continents, /continents, color = c_cote, MLINETHICK = mlinethick, /noerase, _extra = ex if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase ENDIF ;------------------------------------------------------------ ; V4) legendes + affichage de celles-ci ;------------------------------------------------------------ legende,mi,ma,'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex if n_elements(ex) NE 0 then BEGIN ; pour garder les axes du cadre en noir if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote endif ; case typetrace of 'classique': $ plot, [0], [0],/noerase,color=0,xtickformat='lonaxe',ytickformat='lataxe' $ , xstyle = 1, ystyle = 1, _extra = ex 'projection': BEGIN if chkstru(ex, 'NOERASE') then begin oldnoerase = ex.noerase ex.noerase = 1 endif map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$ , /NOERASE, /noborder, title = !p.title, color = 0 ; map_proj_info, numproj, /current ; map_proj_info, numproj, name = nomproj ; if nomproj EQ 'Mercator' OR nomproj EQ 'Cylindrical' OR nomproj EQ 'LambertConic'$ ; OR nomproj EQ 'Gnomic' OR nomproj EQ 'AlbersEqualAreaConic' $ ; OR nomproj EQ 'TransverseMercator' OR nomproj EQ 'MillerCylindrical' $ ; OR nomproj EQ 'LambertConicEllipsoid' then map_grid, box_axes=1,latdel=10,londel=10 $ ; ELSE map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30 map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30, color = 0, _extra = ex if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase end endcase ;------------------------------------------------------------ ; V5) barre de couleur ;------------------------------------------------------------ couleur = couleur[0:ncontour-1-keyword_set(strictfill)] barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $ , max=max,discret=couleur,_extra = ex ;------------------------------------------------------------ ;------------------------------------------------------------ ; VI) impression eventuelle ;------------------------------------------------------------ ;------------------------------------------------------------ fini: terminedessin, _extra = ex if keyword_set(vecteur) then grillechoice = [vargrid, 'T', 'U', 'V'] ELSE grillechoice = ['T', vargrid] if keyword_set(oldboite) then domdef, oldboite, GRILLE = grillechoice ;------------------------------------------------------------ ;------------------------------------------------------------ sortie: if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun ;------------------------------------------------------------ ;------------------------------------------------------------ return end