;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; 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) an array. if needed, its mean along the z and t direction ; will be automatically performed. ; 2) une structure repondant aux critaire specifies par ; litchamp.pro. cf. IDL> xhelp,'litchamp' ; ; 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: ; ; BOXZOOM:vecteur indiquant la zone geographique sur laquelle doit etre ; faite la coupe. Si BOXZOOM a : ; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boxzoom[0]] ; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boxzoom[0],boxzoom[1]] ; 4 elements: l''extraction est faite sur [Boxzoom, 0, max([gdept, gdepw])] ; 5 elements: l''extraction est faite sur [Boxzoom[0:3], 0, Boxzoom[4]] ; 6 elements: l''extraction est faite sur Boxzoom ; ; Ou lon1, lon2,lat1,lat2 sont les variables globales ; definies lors du dernier domdef! ; ; REALCONT:Permet de dessiner les continents definits ds IDL. REALCONT ; peut prendre deux formes: ; /REALCONT: on dessine les continents a la place du mask ; REALCONT=2 on dessine le contours des continents par ; dessus le dessin masque (ceci permet de voir si le masque ; correspond bien aux continents reels). ; ; 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 ; ; COAST_COLOR: the color of the coastline. ; defaut value is 0 => black ; ; COAST_THICK: the thickness of the coastline. ; defaut value is 1 ; ; /CONT_NOFILL: activer pour ne pas remplir les points masques ; pour les laisser en transparent! ; Rq: on trace qd meme le contour du mask ; ; CONT_COLOR: the color of the continent. defaut value is ; (!d.n_colors - 1) < 255 => white ; ; CONTINTERVALLE: lorsque CONTOUR est active, valeur d'un ; intervalle entre deux isolignes traces par un trait. 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. 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. 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 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 ; ; GRIDTYPE:'U','T','V','W' ou 'F' pour specifer eventuellement la ; grille a laquelle est rattache le champ. Rq: il afaut mieux ; utiliser ds ce cas une structure comme champ ; ; 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 ; 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 ; 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] ; ; labmap: corresponds to label keywords of map_set. Defaut ; definition is labmap=1 ; ; ; MAXIN: permet de specifier la valeur maximum que l''on veut ; prendre en compte dans le trace des contours a l''aide d''un ; 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 ; ; /NOFILL: 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 ; ; 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' ; ; YXASPECT: rapport d'echelle entre y et x (par ex: =1 pour un repere ; orthonorme, =2 si l'axe des y est deux fois plus dilate que celui des x). ; Par defaut on adapte pour occupe une grande partie de la feuille en sortie ; postScript ou pour cree une fenetre pas trop etiree ; ; /ZEROMIDDLE: fo force the middle of the colorbar to be equal ; to 0 (force max=max(abs([min,max])) and min=-max) ; ; COMMON BLOCKS: ; 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, REALCONT = realcont, CONTOUR = contour $ , INTERVALLE = intervalle, INV = inv, GRIDTYPE = gridtype, BOXZOOM = boxzoom $ , CONTINTERVALLE = contintervalle, LABEL = label, CONTLABEL = contlabel $ , STYLE = style, CONTMAX = contmax, CONTMIN = contmin, NLEVEL = nlevel, CONTNLEVEL = contnlevel $ , VECTEUR = vecteur, MAP = map, MININ = minin, MAXIN = maxin $ , CONT_NOFILL = cont_nofill $ , USETRI = usetri, NOTRI = notri, MASKFILL = maskfill $ , DUPLICATE = duplicate, STRICTFILL = strictfill, OVERPLOT = overplot $ , DECIMATETRI = decimatetri, LABMAP = labmap, _extra = ex ;--------------------------------------------------------- ; include common @cm_4mesh @cm_4data IF NOT keyword_set(key_forgetold) THEN BEGIN @updatenew @updatekwd ENDIF ;-------------------------------------------------------------- tempsun = systime(1) ; pour key_performance ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; I) preparation de l''environnement graphique et petites verifications ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; I1) verification du type de grille associe a tab1 ;-------------------------------------------------------------- if keyword_set(gridtype) then vargrid = gridtype if keyword_set(vecteur) AND (NOT keyword_set(gridtype)) then BEGIN vargrid = litchamp(tab1, /grid) if vargrid eq '' then BEGIN vargrid = xquestion('What is the grid associated to the data to contour?', 'T', /chkwidget) vargrid = strupcase(vargrid) endif ENDIF ;-------------------------------------------------------------- ; I2) lecture du champ et checkup. ;-------------------------------------------------------------- if keyword_set(boxzoom) AND n_elements(contour) ne 4 then BEGIN savedbox = 1b saveboxparam, 'boxparam4plt.dat' END if n_elements(giventype) NE 0 then type = giventype if n_elements(givenmin) NE 0 then min = givenmin if n_elements(givenmax) NE 0 then max = givenmax if n_elements(minin) NE 0 then min = minin if n_elements(maxin) NE 0 then max = maxin checktypeminmax, 'plt', TYPE = type, MIN = min, MAX = max, _extra = ex z2d = checkfield(tab1, 'plt', TYPE = type, BOXZOOM = boxzoom, DIREC = direc, VECTEUR = vecteur, _extra = ex) if z2d[0] EQ -1 then BEGIN IF keyword_set(savedbox) THEN restoreboxparam, 'boxparam4plt.dat' return ENDIF IF n_elements(usetri) EQ 0 THEN BEGIN ; do we have holes in the triangulation? holeintri = n_elements(triangles_list)/3 LT (jpi-1+keyword_set(key_periodic))*(jpj-1)*2 ; -> the triangulation must be used to draw the data ; do we have a triangulation? wehavetri = triangles_list[0] NE -1 ; -> the triangulation must be used to draw the continents ; if we make a map, are we periodic and nx=jpi ? CASE strupcase(vargrid) OF 'T':nx = nxt 'W':nx = nxt 'U':nx = nxu 'V':nx = nxv 'F':nx = nxf ENDCASE mapperio = keyword_set(map)*keyword_set(key_periodic)*(nx eq jpi) usetri = (wehavetri*(wehavetri+holeintri+mapperio+keyword_set(key_irregular))) < 2 IF n_elements(notri) NE 0 THEN usetri = 0 > (2-notri) ENDIF ;-------------------------------------------------------------- ; I3) reinitialisation. !p.,!x.,!y. ; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour ;-------------------------------------------------------------- if n_elements(contour) ne 4 AND NOT keyword_set(overplot) then reinitplt, /z, /invert ;--------------------------------------------------------------- ; I4) attribution du mask et des tableaux de longitude et latitude ;--------------------------------------------------------------- IF strupcase(vargrid) EQ 'W' THEN profond = firstzw NE 0 $ ELSE profond = firstzt NE 0 ; do we need to extract now the triangulation that will be use for ; contouring the data? if keyword_set(profond) $ OR (usetri EQ 0 AND (vargrid EQ 'T' OR vargrid EQ 'W')) $ OR (usetri NE 2 AND (vargrid NE 'T' AND vargrid NE 'W')) THEN BEGIN grille, mask, glam, gphi, gdep, nx, ny, nz $ , firstx, firsty, firstz, lastx $ , lasty, lastz, /forplt, _extra = ex ENDIF ELSE BEGIN grille, mask, glam, gphi, gdep, nx, ny, nz $ , firstx, firsty, firstz, lastx, lasty $ , lastz, TRI = trifield, /forplt, _extra = ex ENDELSE ;---------------------------------------------------------------------------- ; I5 determination du mi:min et du ma:max de z2d ainsi que de max: max et ; min: min pour le dessin. ;----------------------------------------------------------------------------- masknan = finite(z2d) nan = total(masknan) NE n_elements(z2d) ; faudra-t-il faire un autoscale ??? autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle) determineminmax, z2d, mask, mi, ma, glam, gphi, MININ = min, MAXIN = max $ , nan = nan, INTERVALLE = intervalle, usetri = usetri, _extra = ex if z2d[0] EQ -1 THEN GOTO, sortie ; on fait un autoscale si besoin if autoscale then autoscale, min, max, intervalle ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; 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, colnumb, NLEVEL = nlevel $ , INTERVALLE = intervalle, strictfill = strictfill ;-------------------------------------------------------------- ; III2)choix de style ;----------------------------------------------------------- if not keyword_set(style) then style = 0 style, style, level_z2d, linestyle, thick if keyword_set(inv) then colnumb = reverse(colnumb) ;----------------------------------------------------------- ; III3) definition des axes ;---------------------------------------------------------- if NOT keyword_set(overplot) THEN axe, 'xy', _EXTRA = ex ;-------------------------------------------------------------- ;-------------------------------------------------------------- ;------------------------------------------------------------ ; IV) dessin ;-------------------------------------------------------------- ;-------------------------------------------------------------- ;-------------------------------------------------------------- ; extrapolation des donnees sur les terres et seuillage ;-------------------------------------------------------------- if keyword_set(nan) then begin z2d[where(masknan EQ 0)] = max ENDIF ELSE masknan = 1 ; filling the mask values ; we fill only masknan or we fill mask*masknan? IF keyword_set(nan) AND keyword_set(cont_nofill) THEN $ z2d = remplit(z2d, nite = 1+(vargrid NE 'T' AND vargrid NE 'W') $ , mask = masknan, _extra = ex) $ ELSE z2d = remplit(z2d, nite = (1 + (vargrid NE 'T' AND vargrid NE 'W') $ + keyword_set(nan)) $ *(1-keyword_set(cont_nofill)) $ *(1-(n_elements(maskfill) NE 0)) $ , mask = mask*masknan, _extra = ex) IF keyword_set(strictfill) EQ 0 AND n_elements(maskfill) EQ 0 then $ z2d = min > z2d < max if n_elements(maskfill) NE 0 then BEGIN z2d = temporary(z2d)*mask*masknan if maskfill NE 0 then z2d = temporary(z2d) + maskfill*(1-mask*masknan) ENDIF ;---------------------------------------------------------- ; check the mask and the triangulation according to the grid type and ; nan values. ;---------------------------------------------------------- ; si on fait un dessin en profondeur on redefinit une triangulation ; sur le zoom, cette triangulation sera utilisee pour tracer le ; 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) OR keyword_set(cont_nofill)) $ AND ((usetri GE 1 AND (vargrid EQ 'T' OR vargrid EQ 'W')) $ OR (usetri EQ 2 AND (vargrid NE 'T' AND vargrid NE 'W'))) then BEGIN trifield = triangule(tmask[firstx:lastx, firsty:lasty, firstz] $ , coinmonte = coinmontemask $ , coindescend = coindescendmask $ , keep_cont = cont_nofill, _extra = ex) indicezoommask = (lindgen(jpi, jpj))[firstx:lastx, firsty:lasty] ENDIF ; triangulation for nan mask if keyword_set(nan) then BEGIN trinan = triangule(masknan, /keep_cont $ , coinmonte = coinmontenan $ , coindescend = coindescendnan) indicezoomnan = (lindgen(jpi, jpj))[firstx:lastx, firsty:lasty] ENDIF ; IF n_elements(twin_corners_up) EQ 0 THEN coinmontemask = -1 ELSE coinmontemask = twin_corners_up ; IF n_elements(twin_corners_dn) EQ 0 THEN coindescendmask = -1 ELSE coindescendmask = twin_corners_dn if vargrid EQ 'T' OR vargrid EQ 'W' then BEGIN glammsk = glam gphimsk = gphi ENDIF ELSE begin ; decoupe terre: pour que le trace des cotes soit propre on essaye de ; prendre des points en + pour la terre comme ca on ne voit pas le ; decalage des grilles. c''est ce que fait decoupeterre. au passage on ; redefinit trimsk. decoupeterre, mask, glammsk, gphimsk, type = 'xy'$ , TRI = trimsk, usetri = usetri, indicezoom = indicezoommask $ , coinmonte = coinmontemask, coindescend = coindescendmask $ , _EXTRA = ex ENDELSE ;------------------------------------------------------------ ; IV1) choix du type de dessin ;------------------------------------------------------------ typetrace = 'classique' if keyword_set(map) AND key_onearth then BEGIN ; appelle de mapset qd on veut faire des projections IF n_elements(map) NE 3 THEN map = [0, ((lon1+lon2)/2.) MOD 360, 0] typetrace = 'projection' map_lat = map[0] map_lon = map[1] map_rot = map[2] if chkstru(ex, 'TITLE') then begin maptitre = ex.title ex.title = '' endif map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $ , limit = [lat1, lon1, lat2, lon2], /noborder if n_elements(maptitre) ne 0 then ex.title = maptitre if n_elements(trifield) GE 2 then trifield = ciseauxtri(trifield, glam, gphi, _EXTRA = ex) if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk, _EXTRA = ex) if n_elements(trinan) GE 2 then BEGIN trinan = ciseauxtri(trinan, glam, gphi, _EXTRA = ex) if trinan[0] EQ -1 then undefine, trinan endif ENDIF ELSE BEGIN ;pour que les axes de coordonees soient pris en compte if !x.type EQ 0 AND n_elements(contour) LE 4 then $ plot, [0], [0], /nodata, xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase if keyword_set(key_periodic) then BEGIN ; ds ce cas la triangulation est refermee en x et couvre toute la ; sphere. il faut dont la couper au niveau ou l''on coupe la sphere ; pour faire le dessin if n_elements(trifield) GE 2 then trifield = ciseauxtri(trifield, glam, gphi, _EXTRA = ex) if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk, _EXTRA = ex) if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan, glam, gphi, _EXTRA = ex) ENDIF endelse ;------------------------------------------------------------ ; IV2) coutours et coloriages ;------------------------------------------------------------ if keyword_set(duplicate) then BEGIN ; 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 ; save, glam, gphi, trifield, file = 'tri.dat' if keyword_set(decimatetri) then BEGIN tempsdeux = systime(1) ; pour key_performance IF n_elements(trimsk) EQ 0 THEN trimsk = trifield Verts = transpose([[(temporary(glam))[*]], [(temporary(gphi))[*]] $ , [(temporary(z2d))[*]]]) Conn = [replicate(3, 1, n_elements(trifield)/3), trifield] Result = mesh_decimate(temporary(verts), (temporary(Conn))[*] $ , Connout, vertices = Vertsout $ , percent_vertices = decimatetri) connout = reform(connout, 4, n_elements(connout)/4, /over) trifield = (temporary(connout))[1:3, *] glam = reform(Vertsout[0, *]) gphi = reform(Vertsout[1, *]) z2d = reform(Vertsout[2, *]) undefine, Vertsout print, 'temps decimatetri', systime(1)-tempsdeux ENDIF pltbase, z2d, glam, gphi $ , mask, glammsk, gphimsk, trichamp = trifield, trimsk = trimsk, /forplt $ , level_z2d, colnumb, contour = contour, usetri = usetri, realcont = realcont $ , overplot = keyword_set(overplot)+keyword_set(map) $ , c_linestyle = linestyle, c_labels = 1-(indgen(n_elements(level_z2d)) MOD 2) $ , c_thick = thick, cont_nofill = cont_nofill, nan = nan $ , coinmontemask = coinmontemask, coindescendmask = coindescendmask $ , coinmontenan = coinmontenan, coindescendnan = coindescendnan $ , indicezoommask = indicezoommask, indicezoomnan = indicezoomnan $ , masknan = masknan, trinan = trinan, _extra = ex ;------------------------------------------------------------ ; IV3) rappelle de plt en boucle qd contour est active ;------------------------------------------------------------ if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite return endif if keyword_set(contour) THEN BEGIN pourlegende = [1, 1, 1, 1] oldattributs = saveatt() oldcolnumb = colnumb plt, contour, contmin, contmax, CONTOUR = pourlegende, /NOERASE $ , USETRI = usetri $ , INTERVALLE = contintervalle, LABEL = contlabel, STYLE = style $ , NLEVEL = contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill $ , MASKFILL = maskfill, _extra = ex restoreatt, oldattributs colnumb = oldcolnumb ENDIF ;------------------------------------------------------------ ;------------------------------------------------------------ ; 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) AND key_onearth then meridienparallele, 'xy' ;------------------------------------------------------------ ; V3) pour tracer les continents d'IDL ;------------------------------------------------------------ if keyword_set(realcont) then BEGIN ; si noease est passe de _extra, on s''assure qu''il est a 1 if chkstru(ex, 'NOERASE') then begin oldnoerase = ex.noerase ex.noerase = 1 ENDIF if chkstru(ex, 'coast_thick') then mlinethick = ex.coast_thick ELSE mlinethick = 1 if chkstru(ex, 'coast_color') then mcolor = ex.coast_color ELSE mcolor = 0 IF NOT keyword_set(map) THEN $ map_set, 0, ((lon1+lon2)/2.) MOD 360, 0, position = posfenetre $ , limit = [lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0 $ , _extra = ex if realcont NE 2 AND NOT keyword_set(cont_nofill) then BEGIN if chkstru(ex, 'cont_color') then cntcol = ex.coast_color $ ELSE cntcol = (!d.n_colors - 1) < 255 map_continents, /fill_continents, color = cntcol, _extra = ex, /noerase ENDIF map_continents, /continents, color = mcolor, MLINETHICK = mlinethick, /noerase, _extra = ex if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase ENDIF ;------------------------------------------------------------ ; V4) legendes + affichage de celles-ci ;------------------------------------------------------------ legende, mi, ma, 'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex if n_elements(ex) NE 0 then BEGIN ; pour garder les axes du cadre en noir if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = coast_color endif ; case typetrace of 'classique': $ plot, [0], [0], /nodata, /noerase, color = 0, xstyle = 1, ystyle = 1, _extra = ex 'projection': BEGIN if chkstru(ex, 'NOERASE') then begin oldnoerase = ex.noerase ex.noerase = 1 endif if chkstru(ex, 'SUBTITLE') then !p.subtitle = ex.SUBTITLE if n_elements(maptitre) ne 0 then ex.title = maptitre map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$ , /NOERASE, /noborder, title = !p.title, color = 0 ; map_proj_info, numproj, /current ; map_proj_info, numproj, name = nomproj ; 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 IF n_elements(labmap) EQ 0 THEN labmap = 1 map_grid, charsize = 0.75, label = labmap, latalign = 1, lonalign = 1, latdel = 10, londel = 30, color = 0, _extra = ex if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase end endcase ;------------------------------------------------------------ ; V5) barre de couleur ;------------------------------------------------------------ colnumb = colnumb[0:ncontour-1-keyword_set(strictfill)] barrecouleur, colnumb, min, max, (ncontour-keyword_set(strictfill))/2 $ , position = posbar, _extra = ex ;------------------------------------------------------------ ;------------------------------------------------------------ ; VI) impression eventuelle ;------------------------------------------------------------ ;------------------------------------------------------------ fini: terminedessin, _extra = ex ;------------------------------------------------------------ ;------------------------------------------------------------ sortie: if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4plt.dat' if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun ;------------------------------------------------------------ ;------------------------------------------------------------ return end