;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME:tracecote ; ; PURPOSE: dessine les cotes ds plt ; ; CATEGORY: pour faire un joli dessin ; ; CALLING SEQUENCE:tracecote,mask ; ; INPUTS:mask le tableau mask sur la zone consideree pour le dessin ; ; KEYWORD PARAMETERS: ; ; CONT_THICK: l''epaisseur du trait pour tracer les ; continents. par defaut c''est 1. ; ; XSEUIL: pour eliminer les segments de cote qui sont trop ; grand (qui relient des points qui peuvent etre tres proches ; sur la sphere mais tres eloignes sur le dessin) on supprime ; tous les egments dot la taille depasse: ; taille de la fenetre suivant X/ xseuil. ; Par defaut xseuil est egale a 5. masi peut etre trop grand si ; on fait un fort zoom ou trout petit pour certaines ; projections... le specifier alors a l''aide de ce mot cle! ; ; YSEUIL: cf. xseuil ; ; OUTPUTS: rien ; ; COMMON BLOCKS:common.pro ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr) ; 30/9/1999 ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ; PRO tracecote, CONT_THICK = cont_thick, YSEUIL = yseuil, XSEUIL = xseuil, _extra = ex PRO tracecote, _extra = ex @common tempsun = systime(1) ; pour key_performance if n_elements(key_gridtype) EQ 0 then key_gridtype = 'c' ; ; on agrandi un peu le cadre definit par les premier..., dernier... de ; facon a bien recuperer les bords de cote qui sont en bordure du ; domaine a tracer ; tempdeux = systime(1) ; pour key_performance =2 premierx = 0 > (min([premierxt, premierxu])-1) dernierx = (max([dernierxt, dernierxu])+1) < (jpi-1) premiery = 0 > (min([premieryt, premieryv])-1) derniery = (max([dernieryt, dernieryv])+1) < (jpj-1) nx = dernierx-premierx+1 ny = derniery-premiery+1 ; quel niveau vertical choisir ? IF strupcase(vargrid) eq 'W' THEN BEGIN nz = nzw & premierz = premierzw & dernierz = dernierzw ENDIF ELSE BEGIN nz = nzt & premierz = premierzt & dernierz = dernierzt ENDELSE if nz eq jpk then nivz = niveau-1 ELSE nivz = nz-1 ; attribution du masque et des coordonnes delimitant les limites de la ; terre (coordonnees f) mask = tmask[premierx:dernierx, premiery:derniery, niveau-1] xf = glamf[premierx:dernierx, premiery:derniery] yf = gphif[premierx:dernierx, premiery:derniery] ; IF testvar(var = key_performance) EQ 2 THEN $ print, 'temps tracecote: determiner mask xf yf', systime(1)-tempdeux ; if key_gridtype EQ 'e' then onemore = xf[0, 0] gT xf[0, 1] ; on passe en coordonnee normaliser pour pouvoir s'affranchir du type ; de projection choisie et du suport surlequel on fait le dessin ; (ecran ou postscript) z = convert_coord(xf(*),yf(*),/data,/to_normal) xf = reform(z[0, *], nx, ny) yf = reform(z[1, *], nx, ny) tempvar = SIZE(TEMPORARY(z)) ; ; attention, suivant la projection certains points x ou y peuvent ; devenir NaN (cf. points deriere la terre ds une projection ; orthographique) ; ; on met les points a eliminer a une tres gande valeur comme ca il ne ; passerons pas le test avec distanceseuil (cf. plus bas) ; if (!map.projection LE 7 AND !map.projection NE 0) $ OR !map.projection EQ 14 OR !map.projection EQ 15 OR !map.projection EQ 18 then begin ind = where(finite(xf*yf) EQ 0) IF ind[0] NE -1 THEN BEGIN xf[ind] = 1e5 yf[ind] = 1e5 ENDIF ENDIF ind = where(xf LT !p.position[0] OR xf GT !p.position[2]) IF ind[0] NE -1 THEN xf[ind] = 1e5 ind = where(yf LT !p.position[1] OR yf GT !p.position[3]) IF ind[0] NE -1 THEN yf[ind] = 1e5 tempvar = SIZE(TEMPORARY(ind)) ; on efface ind ; ; pour eviter d'avoir des traits de cotes qui travessent tout l''ecran ; (qui peuvent etre tres proches sur la sphere mais tres eloignes sur ; le dessin suivant la projection) on va selectionner uniquements les ; segments de trait de cote qui ne sont pas trop grand, cad qui ne ; depassent pas la taille de la fenetre/seuil et pour lesquel le ; maskque change de valeur entre les extremites du segment. ; ; on trace les segments verticaux: ; ; if NOT keyword_set(xseuil) then xseuil = 5. ; distanceseuil = (!p.position[2]-!p.position[0])/xseuil ; ; liste: liste des points i pourlesquels on va tracer un segment entre ; ; le point i,j-1 et i,j ; tempdeux = systime(1) ; pour key_performance =2 ; liste = where(mask+shift(mask, -1, 0) EQ 1 $ ; AND (xf-shift(xf, 0, 1))^2+(yf-shift(yf, 0, 1))^2 LE distanceseuil) ; IF liste[0] NE -1 THEN BEGIN ; ; on recupere lx et ly qui sont les indices ds un tableau 2d des ; ; points donnes par liste ; ly = liste/nx & lx = temporary(liste)-nx*ly ; indice = where(ly NE 0) ; on ne prend pas les points concernant ; if indice[0] NE -1 then begin ; ; la premiere ligne car ds ce cas le pt j-1 n''est pas definit ; lx = lx[indice] & ly = ly[temporary(indice)] ; ; boucle sur les points concernes et trace du segment ; ; rq: on utilise plost au lieu de plot car plots est bcp plus rapide. ; IF testvar(var = key_performance) EQ 2 THEN $ ; print, 'temps tracecote: determiner liste des points concernes par un trait vertical', systime(1)-tempdeux ; tempdeux = systime(1) ; pour key_performance =2 ; for pt = 0, n_elements(lx)-1 do BEGIN ; i = lx[pt] & j = ly[pt] ; plots, [xf[i, j-1], xf[i, j]], [yf[i, j-1], yf[i, j]] $ ; , color=c_cote,thick=cont_thick, /normal, _extra = ex ; endfor ; IF testvar(var = key_performance) EQ 2 THEN $ ; print, 'temps tracecote: trace des traits verticaux', systime(1)-tempdeux ; endif ; ENDIF ; ; ; ; pour le trace des segments horizontaux, c''est la meme chose sauf ; ; qu'il faut faire attention si on est periodique: ; ; ; ; si on est periodique on duplique la premiere colonne et on la met a ; ; la fin. (ceci est fait non pas pour le shift qui est par defaut ; ; periodique mais pour le plots ; tempdeux = systime(1) ; pour key_performance =2 ; if keyword_set(key_periodique) AND nx EQ jpi then begin ; mask = [mask, mask[0, *]] ; xf = [xf, xf[0, *]] ; yf = [yf, yf[0, *]] ; nx = nx+1 ; ENDIF ; if NOT keyword_set(yseuil) then yseuil = 5. ; distanceseuil = (!p.position[3]-!p.position[1])/yseuil ; liste = where(mask+shift(mask, 0, -1) EQ 1 $ ; AND (xf-shift(xf, 1, 0))^2+(yf-shift(yf, 1, 0))^2 LE distanceseuil) ; IF liste[0] NE -1 THEN BEGIN ; ly = liste/nx & lx = temporary(liste)-nx*ly ; indice = where(ly NE ny-1 AND lx NE 0) ; if indice[0] NE -1 then begin ; ; on ne prend pas les points de la ; ; premiere colonne et de la derniere ligne (car on l''a rajoute artificiellement!)) ; lx = lx[indice] & ly = ly[temporary(indice)] ; IF testvar(var = key_performance) EQ 2 THEN $ ; print, 'temps tracecote: determiner liste des points concernes par un trait horizontal', systime(1)-tempdeux ; tempdeux = systime(1) ; pour key_performance =2 ; for pt = 0, n_elements(lx)-1 do BEGIN ; i = lx[pt] & j = ly[pt] ; plots, [xf[i-1, j], xf[i, j]], [yf[i-1, j], yf[i, j]] $ ; , color=c_cote,thick=cont_thick, /normal, _extra = ex ; endfor ; IF testvar(var = key_performance) EQ 2 THEN $ ; print, 'temps tracecote: trace des traits horizontaux', systime(1)-tempdeux ; endif ; endif if n_elements(key_gridtype) EQ 0 then key_gridtype = 'c' case key_gridtype of 'c':drawcoast_c, mask, xf, yf, nx, ny, _extra = ex 'e':drawcoast_e, mask, xf, yf, nx, ny, onemore = onemore, _extra = ex endcase if keyword_set(key_performance) THEN print, 'temps tracecote', systime(1)-tempsun return end