;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; 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 ou ; sur une sortie ecran dont la fenetre a les memes proportions ; ; CATEGORY: positionnement du graphe ; ; CALLING SEQUENCE: ; calibre, rapportyx,marge,margebar, smalldraw,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 ; ; smalldraw: 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, small=[2,3,4] ; ; KEYWORD PARAMETERS: ; ; /REMPLI:oblige le dessin a occuper l'espace maximum definit ; par smalldraw sans resperter le rapport y sur x. ; ; YXASPECT: force le rapport y sur x a prendre la valeur ; rapportyx*yxaspect. ce mot cle est utile ds deux cas: ; 1) yxaspect=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 small dessin est trop ; different de celui de smalldraw. ; 2) yxaspect=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 YXASPECT=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, smalldraw, posfenetre, posbar $ , REMPLI = rempli, YXASPECT = yxaspect, PORTRAIT = portrait $ , LANDSCAPE = lanscape, _extra = ex ;--------------------------------------------------------- ; compile_opt idl2, strictarrsubs ; @cm_4ps IF NOT keyword_set(key_forgetold) THEN BEGIN @updatenew @updatekwd ENDIF ;--------------------------------------------------------- ;------------------------------------------------------------ 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(yxaspect) then begin rapportyx=rapportyx*yxaspect test2=0 endif else begin yxaspect=1. test2=1 ENDELSE ; mipgsz = min(page_size, max = mapgsz) ;------------------------------------------------------------ ; 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 smalldraw est compte comme ds matlab ;------------------------------------------------------------- if n_elements(smalldraw) EQ 3 then begin if n_elements(page_margins) EQ 0 then page_margins = [1, 1, 1, 1] smalldraw = long(smalldraw) nbrecol = smalldraw[0] nbrelig = smalldraw[1] numero = smalldraw[2]-1 numlig = numero/nbrecol numcol = numero-numlig*nbrecol bas = mipgsz*key_portrait+mapgsz*(1-key_portrait) cote = mapgsz*key_portrait+mipgsz*(1-key_portrait) poscol = page_margins[0]+findgen(nbrecol+1)*(1.*(bas-(page_margins[0]+page_margins[1]))/nbrecol) poslig = cote-page_margins[3]-findgen(nbrelig+1)*(1.*(cote-(page_margins[2]+page_margins[3]))/nbrelig) smalldraw = [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.*(smalldraw[2]-smalldraw[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 big=smalldraw[2]-smalldraw[0] small=smalldraw[3]-smalldraw[1] endif else begin small=smalldraw[2]-smalldraw[0] big=smalldraw[3]-smalldraw[1] endelse if key_portrait eq 0 then $ rapportmax=1.*(small-marge[3]-marge[1])/(big-marge[2]-marge[0]) $ else rapportmax=1.*(small-marge[2]-marge[0])/(big-marge[3]-marge[1]) ;------------------------------------------------------------ ; si yxaspect 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=big ys=small endif else begin if rapportyx le rapportmax then begin xs=big ys=1.*(big-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] if ys gt small then begin xs=1.*(small-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=small endif endif else begin xs=1.*(small-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=small if xs gt big then begin xs=big ys=1.*(big-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] endif endelse endelse xoff=1.*(small-ys)/2.+smalldraw[1] yoff=1.*(big-xs)/2.+xs+mapgsz-smalldraw[2] a=1.*(mapgsz-yoff)/mapgsz b=1.*xoff/mipgsz c=a+1.*xs/mapgsz d=b+1.*ys/mipgsz endif $ ;------------------------------------------------------------ ; dans le cas ou on fait un portrait: ;------------------------------------------------------------ else begin if keyword_set(rempli) then begin xs=small ys=big endif else begin if rapportyx le rapportmax then begin xs=small ys=1.*(small-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] if ys gt big then begin xs=1.*(big-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=big endif endif else begin xs=1.*(big-marge[2]-marge[3])/rapportyx+marge[0]+marge[1] ys=big if xs gt small then begin xs=small ys=1.*(small-marge[0]-marge[1])*rapportyx+marge[2]+marge[3] endif endelse endelse xoff=1.*(small-xs)/2.+smalldraw[0] yoff=1.*(big-ys)/2.+smalldraw[1] a=1.*xoff/mipgsz b=1.*yoff/mapgsz c=a+1.*xs/mipgsz d=b+1.*ys/mapgsz xset = xoff yset = yoff endelse ;------------------------------------------------------------ bas=mapgsz*(1-key_portrait)+mipgsz*key_portrait cote=mipgsz*(1-key_portrait)+mapgsz*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 IF NOT keyword_set(key_forgetold) THEN BEGIN @updateold ENDIF return end