source: trunk/POSTSCRIPT/calibre.pro @ 2

Last change on this file since 2 was 2, checked in by opalod, 22 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 10.2 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME: calibre
6;
7; PURPOSE:a partir d''un rapport d''aspect et des valeurs (en ligne de
8; characteres) des differentes marges, calcul posfenetre et posbar qui
9; servent a placer le dessin et la barre de couleur grace a
10; !p.position sur une feuille petitfeuille*grandfeuille (21*29.7) ou
11; sur une sortie ecran dont la fenetre a les memes proportions
12;
13; CATEGORY: positionnement du graphe
14;
15; CALLING SEQUENCE:
16;     calibre, rapportyx,marge,margebar, petitdessin,posfenetre, posbar
17;
18; INPUTS:
19;       rapportyx: rapport d''echelle entre la longueur de l''axe des
20;       y et celle des x. par ex pour une carte xy,
21;       rapportyx=(lat2-lat1)/(lon2-lon1)
22;
23;       marge: vecteur de 4 elements contenant la taille des marges a gauche,
24; a droite, en bas et en haut devant entourer le graphe. tout est
25; mesure en lignes de characteres
26;
27;       margebar: vecteur de 4 elements contenant la taille des marges a gauche,
28; a droite, en bas et -ATTENTION- le dernier element est cette fois-ci
29; la position de coin en haut a droite, devant entourer la barre de
30; couleur. tout est mesure en lignes de characteres
31;
32;       petitdessin: 2 possiblites
33;             un vecteur de 4 elements donnant (en portrait ou
34; en landscape) la position de cadre ds lequel doit rentrer le
35; dessin. cette position est donne par les coordonnes des 2 coins du
36; cadre: en bas a gauche et en haut a droite. elle s''exprime tjs
37; (pour un postscript ou une sortie ecran) en cm, l''origine etant le
38; coin en bas a gauche.
39;             un vecteur de 3 elements donnant le nombre de colonnes a
40; faire de le dessin, le nombre de lignes et enfin le numero de la
41; case que doit occuper le dessin (cf matlab). par ex pour faire 6
42; dessin en 2 colonnes et 3 lignes et occuper la 4 eme case, petit=[2,3,4]
43;
44; KEYWORD PARAMETERS:
45;
46;       /REMPLI:oblige le dessin a occuper l'espace maximum definit
47; par petitdessin sans resperter le rapport y sur x.
48;
49;       YSURX: force le rapport y sur x a prendre la valeur
50; rapportyx*ysurx. ce mot cle est utile ds deux cas:
51;   1) ysurx=1 : oblige rapportyx a etre bien respecte sinon
52;         calibre se reserve le droit de changer un peu celui-ci dans
53;         le cas ou le rapport d''aspect de petit dessin est trop
54;         different de celui de petitdessin.
55;   2) ysurx=n : multiplie par n le rapport d''aspect donne par
56;         defaut.par ex ds plt, rapportyx est calcule pour que le
57;         repere soit orthonorme, pour avoir un repere ou l''axe des y
58;         est 2 fois plus dilate que celui des y YSURX=2
59;       
60;       PORTRAIT et LANDSCAPE: mots cles plus utilises mais tjs fonctionnels
61;
62; OUTPUTS:
63;       posfenetre: un vecteur de 4 elements contenant la position de
64;       cadre contenant les legendes + le graphe en coordonnes
65;       normalises. Rq: pour positionner le dessin il faut apres
66;       l''appelle de calibre faire !p.position=posfenetre
67;
68;       posbar: cf posfentre mais pour la barre de couleur. meme
69;       remarque pour positionner la barre de couleur, !p.position=posbar
70;
71; COMMON BLOCKS:
72;       common.pro             
73;
74; SIDE EFFECTS:
75;
76; RESTRICTIONS:
77;
78; EXAMPLE:
79;
80; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
81;                       11/12/98
82;-
83;------------------------------------------------------------
84;------------------------------------------------------------
85;------------------------------------------------------------
86pro calibre, rapportyx,marge,margebar, petitdessin,posfenetre, posbar $
87             ,REMPLI=rempli,YSURX=ysurx,PORTAIT=portrait,LANDSCAPE=lanscape
88;------------------------------------------------------------
89@common
90   tempsun = systime(1)         ; pour key_performance
91;-------------------------------------------------------------
92   if keyword_set(portrait) then key_portrait=1
93   if keyword_set(landscape) then key_portrait=0
94   if keyword_set(ysurx) then begin
95      rapportyx=rapportyx*ysurx
96      test2=0
97   endif else begin
98      ysurx=1.
99      test2=1
100   endelse
101;------------------------------------------------------------
102; choix de Landscape ou Portrait
103;------------------------------------------------------------
104   if n_elements(key_portrait) eq 0  then begin
105      if rapportyx ge 1 then key_portrait=1
106      if rapportyx lt 1 then key_portrait=0
107   endif
108;-------------------------------------------------------------
109; si petitdessin est compte comme ds matlab
110;-------------------------------------------------------------
111   if n_elements(petitdessin) EQ 3  then begin
112      if n_elements(margescadre) EQ 0 then margescadre = [1, 1, 1, 1]
113      petitdessin = long(petitdessin)
114      nbrecol = petitdessin[0]
115      nbrelig = petitdessin[1]
116      numero = petitdessin[2]-1
117      numlig = numero/nbrecol
118      numcol = numero-numlig*nbrecol
119      bas = petitfeuille*key_portrait+grandfeuille*(1-key_portrait)
120      cote = grandfeuille*key_portrait+petitfeuille*(1-key_portrait)
121      poscol = margescadre[0]+findgen(nbrecol+1)*(1.*(bas-(margescadre[0]+margescadre[1]))/nbrecol)
122      poslig = cote-margescadre[3]-findgen(nbrelig+1)*(1.*(cote-(margescadre[2]+margescadre[3]))/nbrelig)
123      petitdessin = [poscol[numcol], poslig[numlig+1], poscol[numcol+1], poslig[numlig]]
124   endif
125;------------------------------------------------------------
126; determination de la taille des characteres (!p.charsize)
127;------------------------------------------------------------
128   nombre_de_mots_ds_titre = 60.
129   !p.charsize=1.*(petitdessin[2]-petitdessin[0])*!d.x_px_cm / $
130    (nombre_de_mots_ds_titre* !d.y_ch_size)
131   if !p.charsize gt 1 then !p.charsize=1
132;------------------------------------------------------------
133; transfert de marge en cm
134;------------------------------------------------------------
135   cm=1.*!d.x_px_cm
136   marge=1.* marge * !d.y_ch_size * !p.charsize / cm
137   margebar=1.* margebar * !d.y_ch_size * !p.charsize / cm
138;------------------------------------------------------------
139; definition de la portion de feuille ou on dessine
140;------------------------------------------------------------
141   if key_portrait eq 0 then begin
142      grand=petitdessin[2]-petitdessin[0]
143      petit=petitdessin[3]-petitdessin[1]
144   endif else begin
145      petit=petitdessin[2]-petitdessin[0]
146      grand=petitdessin[3]-petitdessin[1]
147   endelse
148   if key_portrait eq 0 then $
149    rapportmax=1.*(petit-marge[3]-marge[1])/(grand-marge[2]-marge[0]) $
150   else rapportmax=1.*(petit-marge[2]-marge[0])/(grand-marge[3]-marge[1])
151;------------------------------------------------------------
152; si ysurx n'est pas specifie on modifie la valeur de rapportyx pour que
153; ca colle un peu plus aux proportions de la feuille
154;------------------------------------------------------------
155   if rapportyx le rapportmax then begin
156      if test2 then begin
157         rap=1.*rapportmax/rapportyx
158         if rap ge 5. and rap lt 6. then rapportyx=rapportyx*1.5
159         if rap ge 6. and rap lt 7. then rapportyx=rapportyx*2.
160         if rap ge 7. and rap lt 8. then rapportyx=rapportyx*2.5
161         if rap ge 8. then rapportyx=rapportyx*3.
162      endif
163   endif else begin
164      if test2 then begin
165         rap=1.*rapportmax/rapportyx
166         if rap lt 1./5. and rap ge 1./6. then rapportyx=rapportyx/1.5
167         if rap lt 1./6. and rap ge 1./7. then rapportyx=rapportyx/2.
168         if rap lt 1./7. and rap ge 1./8. then rapportyx=rapportyx/2.5
169         if rap lt 1./8. then rapportyx=rapportyx*3.
170      endif
171   endelse
172;------------------------------------------------------------
173; dans le cas ou on fait un Landscape:
174;------------------------------------------------------------
175   if key_portrait eq 0 then begin       
176      if keyword_set(rempli) then begin
177         xs=grand
178         ys=petit
179      endif else begin
180         if rapportyx le rapportmax then begin
181            xs=grand
182            ys=1.*(grand-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
183            if ys gt petit then begin
184               xs=1.*(petit-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
185               ys=petit
186            endif
187         endif else begin
188            xs=1.*(petit-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
189            ys=petit
190            if xs gt grand then begin
191               xs=grand
192               ys=1.*(grand-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
193            endif
194         endelse
195      endelse
196      xoff=1.*(petit-ys)/2.+petitdessin[1]
197      yoff=1.*(grand-xs)/2.+xs+grandfeuille-petitdessin[2]
198      a=1.*(grandfeuille-yoff)/grandfeuille
199      b=1.*xoff/petitfeuille
200      c=a+1.*xs/grandfeuille
201      d=b+1.*ys/petitfeuille
202   endif $
203;------------------------------------------------------------
204; dans le cas ou on fait un portrait:
205;------------------------------------------------------------
206   else begin       
207      if keyword_set(rempli) then begin
208         xs=petit
209         ys=grand
210      endif else begin
211         if rapportyx le rapportmax then begin
212            xs=petit
213            ys=1.*(petit-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
214            if ys gt grand then begin
215               xs=1.*(grand-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
216               ys=grand
217            endif
218         endif else begin
219            xs=1.*(grand-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
220            ys=grand
221            if xs gt petit then begin
222               xs=petit
223               ys=1.*(petit-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
224            endif
225         endelse
226      endelse
227      xoff=1.*(petit-xs)/2.+petitdessin[0]
228      yoff=1.*(grand-ys)/2.+petitdessin[1]
229      a=1.*xoff/petitfeuille
230      b=1.*yoff/grandfeuille
231      c=a+1.*xs/petitfeuille
232      d=b+1.*ys/grandfeuille
233      xset = xoff
234      yset = yoff
235   endelse
236;------------------------------------------------------------
237   bas=grandfeuille*(1-key_portrait)+petitfeuille*key_portrait
238   cote=petitfeuille*(1-key_portrait)+grandfeuille*key_portrait
239   posfenetre=[a,b,c,d]+[ marge[0]/bas, marge[2]/cote $
240                          ,-marge[1]/bas,-marge[3]/cote ]
241   posbar=[a,b,c,d]+[ margebar[0]/bas, margebar[2]/cote $
242                      ,-margebar[1]/bas,(-ys+margebar[3])/cote ]
243;------------------------------------------------------------
244   if keyword_set(key_performance) THEN print, 'temps calibre', systime(1)-tempsun
245   return
246end
Note: See TracBrowser for help on using the repository browser.