;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME: calibre ; ; PURPOSE:a partir d''un rapport d''aspect et des valeurs (en ligne de ; characteres) des differentes marges, calcul posfenetre et posbar qui ; servent a placer le dessin et la barre de couleur grace a ; !p.position sur une feuille petitfeuille*grandfeuille (21*29.7) ou ; sur une sortie ecran dont la fenetre a les memes proportions ; ; CATEGORY: positionnement du graphe ; ; CALLING SEQUENCE: ; calibre, rapportyx,marge,margebar, petitdessin,posfenetre, posbar ; ; INPUTS: ; rapportyx: rapport d''echelle entre la longueur de l''axe des ; y et celle des x. par ex pour une carte xy, ; rapportyx=(lat2-lat1)/(lon2-lon1) ; ; marge: vecteur de 4 elements contenant la taille des marges a gauche, ; a droite, en bas et en haut devant entourer le graphe. tout est ; mesure en lignes de characteres ; ; margebar: vecteur de 4 elements contenant la taille des marges a gauche, ; a droite, en bas et -ATTENTION- le dernier element est cette fois-ci ; la position de coin en haut a droite, devant entourer la barre de ; couleur. tout est mesure en lignes de characteres ; ; petitdessin: 2 possiblites ; un vecteur de 4 elements donnant (en portrait ou ; en landscape) la position de cadre ds lequel doit rentrer le ; dessin. cette position est donne par les coordonnes des 2 coins du ; cadre: en bas a gauche et en haut a droite. elle s''exprime tjs ; (pour un postscript ou une sortie ecran) en cm, l''origine etant le ; coin en bas a gauche. ; un vecteur de 3 elements donnant le nombre de colonnes a ; faire de le dessin, le nombre de lignes et enfin le numero de la ; case que doit occuper le dessin (cf matlab). par ex pour faire 6 ; dessin en 2 colonnes et 3 lignes et occuper la 4 eme case, petit=[2,3,4] ; ; KEYWORD PARAMETERS: ; ; /REMPLI:oblige le dessin a occuper l'espace maximum definit ; par petitdessin sans resperter le rapport y sur x. ; ; YSURX: force le rapport y sur x a prendre la valeur ; rapportyx*ysurx. ce mot cle est utile ds deux cas: ; 1) ysurx=1 : oblige rapportyx a etre bien respecte sinon ; calibre se reserve le droit de changer un peu celui-ci dans ; le cas ou le rapport d''aspect de petit dessin est trop ; different de celui de petitdessin. ; 2) ysurx=n : multiplie par n le rapport d''aspect donne par ; defaut.par ex ds plt, rapportyx est calcule pour que le ; repere soit orthonorme, pour avoir un repere ou l''axe des y ; est 2 fois plus dilate que celui des y YSURX=2 ; ; PORTRAIT et LANDSCAPE: mots cles plus utilises mais tjs fonctionnels ; ; OUTPUTS: ; posfenetre: un vecteur de 4 elements contenant la position de ; cadre contenant les legendes + le graphe en coordonnes ; normalises. Rq: pour positionner le dessin il faut apres ; l''appelle de calibre faire !p.position=posfenetre ; ; posbar: cf posfentre mais pour la barre de couleur. meme ; remarque pour positionner la barre de couleur, !p.position=posbar ; ; COMMON BLOCKS: ; common.pro ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) ; 11/12/98 ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ pro calibre, rapportyx,marge,margebar, petitdessin,posfenetre, posbar $ ,REMPLI=rempli,YSURX=ysurx,PORTAIT=portrait,LANDSCAPE=lanscape ;------------------------------------------------------------ @common tempsun = systime(1) ; pour key_performance ;------------------------------------------------------------- if keyword_set(portrait) then key_portrait=1 if keyword_set(landscape) then key_portrait=0 if keyword_set(ysurx) then begin rapportyx=rapportyx*ysurx test2=0 endif else begin ysurx=1. test2=1 endelse ;------------------------------------------------------------ ; choix de Landscape ou Portrait ;------------------------------------------------------------ if n_elements(key_portrait) eq 0 then begin if rapportyx ge 1 then key_portrait=1 if rapportyx lt 1 then key_portrait=0 endif ;------------------------------------------------------------- ; si petitdessin est compte comme ds matlab ;------------------------------------------------------------- if n_elements(petitdessin) EQ 3 then begin if n_elements(margescadre) EQ 0 then margescadre = [1, 1, 1, 1] petitdessin = long(petitdessin) nbrecol = petitdessin[0] nbrelig = petitdessin[1] numero = petitdessin[2]-1 numlig = numero/nbrecol numcol = numero-numlig*nbrecol bas = petitfeuille*key_portrait+grandfeuille*(1-key_portrait) cote = grandfeuille*key_portrait+petitfeuille*(1-key_portrait) poscol = margescadre[0]+findgen(nbrecol+1)*(1.*(bas-(margescadre[0]+margescadre[1]))/nbrecol) poslig = cote-margescadre[3]-findgen(nbrelig+1)*(1.*(cote-(margescadre[2]+margescadre[3]))/nbrelig) petitdessin = [poscol[numcol], poslig[numlig+1], poscol[numcol+1], poslig[numlig]] endif ;------------------------------------------------------------ ; determination de la taille des characteres (!p.charsize) ;------------------------------------------------------------ nombre_de_mots_ds_titre = 60. !p.charsize=1.*(petitdessin[2]-petitdessin[0])*!d.x_px_cm / $ (nombre_de_mots_ds_titre* !d.y_ch_size) if !p.charsize gt 1 then !p.charsize=1 ;------------------------------------------------------------ ; transfert de marge en cm ;------------------------------------------------------------ cm=1.*!d.x_px_cm marge=1.* marge * !d.y_ch_size * !p.charsize / cm margebar=1.* margebar * !d.y_ch_size * !p.charsize / cm ;------------------------------------------------------------ ; definition de la portion de feuille ou on dessine ;------------------------------------------------------------ if key_portrait eq 0 then begin grand=petitdessin[2]-petitdessin[0] petit=petitdessin[3]-petitdessin[1] endif else begin petit=petitdessin[2]-petitdessin[0] grand=petitdessin[3]-petitdessin[1] endelse if key_portrait eq 0 then $ rapportmax=1.*(petit-marge[3]-marge[1])/(grand-marge[2]-marge[0]) $ else rapportmax=1.*(petit-marge[2]-marge[0])/(grand-marge[3]-marge[1]) ;------------------------------------------------------------ ; si ysurx n'est pas specifie on modifie la valeur de rapportyx pour que ; ca colle un peu plus aux proportions de la feuille ;------------------------------------------------------------ if rapportyx le rapportmax then begin if test2 then begin rap=1.*rapportmax/rapportyx if rap ge 5. and rap lt 6. then rapportyx=rapportyx*1.5 if rap ge 6. and rap lt 7. then rapportyx=rapportyx*2. if rap ge 7. and rap lt 8. then rapportyx=rapportyx*2.5 if rap ge 8. then rapportyx=rapportyx*3. endif endif else begin if test2 then begin rap=1.*rapportmax/rapportyx if rap lt 1./5. and rap ge 1./6. then rapportyx=rapportyx/1.5 if rap lt 1./6. and rap ge 1./7. then rapportyx=rapportyx/2. if rap lt 1./7. and rap ge 1./8. then rapportyx=rapportyx/2.5 if rap lt 1./8. then rapportyx=rapportyx*3. endif endelse ;------------------------------------------------------------ ; dans le cas ou on fait un Landscape: ;------------------------------------------------------------ if key_portrait eq 0 then begin if keyword_set(rempli) then begin xs=grand ys=petit endif else begin if rapportyx le rapportmax then begin xs=grand ys=1.*(grand-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] if ys gt petit then begin xs=1.*(petit-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=petit endif endif else begin xs=1.*(petit-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=petit if xs gt grand then begin xs=grand ys=1.*(grand-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] endif endelse endelse xoff=1.*(petit-ys)/2.+petitdessin[1] yoff=1.*(grand-xs)/2.+xs+grandfeuille-petitdessin[2] a=1.*(grandfeuille-yoff)/grandfeuille b=1.*xoff/petitfeuille c=a+1.*xs/grandfeuille d=b+1.*ys/petitfeuille endif $ ;------------------------------------------------------------ ; dans le cas ou on fait un portrait: ;------------------------------------------------------------ else begin if keyword_set(rempli) then begin xs=petit ys=grand endif else begin if rapportyx le rapportmax then begin xs=petit ys=1.*(petit-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] if ys gt grand then begin xs=1.*(grand-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=grand endif endif else begin xs=1.*(grand-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=grand if xs gt petit then begin xs=petit ys=1.*(petit-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] endif endelse endelse xoff=1.*(petit-xs)/2.+petitdessin[0] yoff=1.*(grand-ys)/2.+petitdessin[1] a=1.*xoff/petitfeuille b=1.*yoff/grandfeuille c=a+1.*xs/petitfeuille d=b+1.*ys/grandfeuille xset = xoff yset = yoff endelse ;------------------------------------------------------------ bas=grandfeuille*(1-key_portrait)+petitfeuille*key_portrait cote=petitfeuille*(1-key_portrait)+grandfeuille*key_portrait posfenetre=[a,b,c,d]+[ marge[0]/bas, marge[2]/cote $ ,-marge[1]/bas,-marge[3]/cote ] posbar=[a,b,c,d]+[ margebar[0]/bas, margebar[2]/cote $ ,-margebar[1]/bas,(-ys+margebar[3])/cote ] ;------------------------------------------------------------ if keyword_set(key_performance) THEN print, 'temps calibre', systime(1)-tempsun return end