source: trunk/SRC/ToBeReviewed/POSTSCRIPT/calibre.pro @ 114

Last change on this file since 114 was 114, checked in by smasson, 18 years ago

new compilation options (compile_opt idl2, strictarrsubs) in each routine

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 10.4 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 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, smalldraw,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;       smalldraw: 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, small=[2,3,4]
43;
44; KEYWORD PARAMETERS:
45;
46;       /REMPLI:oblige le dessin a occuper l'espace maximum definit
47; par smalldraw sans resperter le rapport y sur x.
48;
49;       YXASPECT: force le rapport y sur x a prendre la valeur
50; rapportyx*yxaspect. ce mot cle est utile ds deux cas:
51;   1) yxaspect=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 small dessin est trop
54;         different de celui de smalldraw.
55;   2) yxaspect=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 YXASPECT=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, smalldraw, posfenetre, posbar $
87             , REMPLI = rempli, YXASPECT = yxaspect, PORTRAIT = portrait $
88             , LANDSCAPE = lanscape, _extra = ex
89;---------------------------------------------------------
90;
91  compile_opt idl2, strictarrsubs
92;
93@cm_4ps
94  IF NOT keyword_set(key_forgetold) THEN BEGIN
95@updatenew
96@updatekwd
97  ENDIF
98;---------------------------------------------------------
99;------------------------------------------------------------
100   tempsun = systime(1)         ; pour key_performance
101;-------------------------------------------------------------
102   if keyword_set(portrait) then key_portrait=1
103   if keyword_set(landscape) then key_portrait=0
104   if keyword_set(yxaspect) then begin
105      rapportyx=rapportyx*yxaspect
106      test2=0
107   endif else begin
108      yxaspect=1.
109      test2=1
110    ENDELSE
111;
112    mipgsz = min(page_size, max = mapgsz)
113;------------------------------------------------------------
114; choix de Landscape ou Portrait
115;------------------------------------------------------------
116   if n_elements(key_portrait) eq 0  then begin
117      if rapportyx ge 1 then key_portrait=1
118      if rapportyx lt 1 then key_portrait=0
119   endif
120;-------------------------------------------------------------
121; si smalldraw est compte comme ds matlab
122;-------------------------------------------------------------
123   if n_elements(smalldraw) EQ 3  then begin
124      if n_elements(page_margins) EQ 0 then page_margins = [1, 1, 1, 1]
125      smalldraw = long(smalldraw)
126      nbrecol = smalldraw[0]
127      nbrelig = smalldraw[1]
128      numero = smalldraw[2]-1
129      numlig = numero/nbrecol
130      numcol = numero-numlig*nbrecol
131      bas = mipgsz*key_portrait+mapgsz*(1-key_portrait)
132      cote = mapgsz*key_portrait+mipgsz*(1-key_portrait)
133      poscol = page_margins[0]+findgen(nbrecol+1)*(1.*(bas-(page_margins[0]+page_margins[1]))/nbrecol)
134      poslig = cote-page_margins[3]-findgen(nbrelig+1)*(1.*(cote-(page_margins[2]+page_margins[3]))/nbrelig)
135      smalldraw = [poscol[numcol], poslig[numlig+1], poscol[numcol+1], poslig[numlig]]
136   endif
137;------------------------------------------------------------
138; determination de la taille des characteres (!p.charsize)
139;------------------------------------------------------------
140   nombre_de_mots_ds_titre = 60.
141   !p.charsize=1.*(smalldraw[2]-smalldraw[0])*!d.x_px_cm / $
142    (nombre_de_mots_ds_titre* !d.y_ch_size)
143   if !p.charsize gt 1 then !p.charsize=1
144;------------------------------------------------------------
145; transfert de marge en cm
146;------------------------------------------------------------
147   cm=1.*!d.x_px_cm
148   marge=1.* marge * !d.y_ch_size * !p.charsize / cm
149   margebar=1.* margebar * !d.y_ch_size * !p.charsize / cm
150;------------------------------------------------------------
151; definition de la portion de feuille ou on dessine
152;------------------------------------------------------------
153   if key_portrait eq 0 then begin
154      big=smalldraw[2]-smalldraw[0]
155      small=smalldraw[3]-smalldraw[1]
156   endif else begin
157      small=smalldraw[2]-smalldraw[0]
158      big=smalldraw[3]-smalldraw[1]
159   endelse
160   if key_portrait eq 0 then $
161    rapportmax=1.*(small-marge[3]-marge[1])/(big-marge[2]-marge[0]) $
162   else rapportmax=1.*(small-marge[2]-marge[0])/(big-marge[3]-marge[1])
163;------------------------------------------------------------
164; si yxaspect n'est pas specifie on modifie la valeur de rapportyx pour que
165; ca colle un peu plus aux proportions de la feuille
166;------------------------------------------------------------
167   if rapportyx le rapportmax then begin
168      if test2 then begin
169         rap=1.*rapportmax/rapportyx
170         if rap ge 5. and rap lt 6. then rapportyx=rapportyx*1.5
171         if rap ge 6. and rap lt 7. then rapportyx=rapportyx*2.
172         if rap ge 7. and rap lt 8. then rapportyx=rapportyx*2.5
173         if rap ge 8. then rapportyx=rapportyx*3.
174      endif
175   endif else begin
176      if test2 then begin
177         rap=1.*rapportmax/rapportyx
178         if rap lt 1./5. and rap ge 1./6. then rapportyx=rapportyx/1.5
179         if rap lt 1./6. and rap ge 1./7. then rapportyx=rapportyx/2.
180         if rap lt 1./7. and rap ge 1./8. then rapportyx=rapportyx/2.5
181         if rap lt 1./8. then rapportyx=rapportyx*3.
182      endif
183   endelse
184;------------------------------------------------------------
185; dans le cas ou on fait un Landscape:
186;------------------------------------------------------------
187   if key_portrait eq 0 then begin       
188      if keyword_set(rempli) then begin
189         xs=big
190         ys=small
191      endif else begin
192         if rapportyx le rapportmax then begin
193            xs=big
194            ys=1.*(big-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
195            if ys gt small then begin
196               xs=1.*(small-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
197               ys=small
198            endif
199         endif else begin
200            xs=1.*(small-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
201            ys=small
202            if xs gt big then begin
203               xs=big
204               ys=1.*(big-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
205            endif
206         endelse
207      endelse
208      xoff=1.*(small-ys)/2.+smalldraw[1]
209      yoff=1.*(big-xs)/2.+xs+mapgsz-smalldraw[2]
210      a=1.*(mapgsz-yoff)/mapgsz
211      b=1.*xoff/mipgsz
212      c=a+1.*xs/mapgsz
213      d=b+1.*ys/mipgsz
214   endif $
215;------------------------------------------------------------
216; dans le cas ou on fait un portrait:
217;------------------------------------------------------------
218   else begin       
219      if keyword_set(rempli) then begin
220         xs=small
221         ys=big
222      endif else begin
223         if rapportyx le rapportmax then begin
224            xs=small
225            ys=1.*(small-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
226            if ys gt big then begin
227               xs=1.*(big-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
228               ys=big
229            endif
230         endif else begin
231            xs=1.*(big-marge[2]-marge[3])/rapportyx+marge[0]+marge[1]
232            ys=big
233            if xs gt small then begin
234               xs=small
235               ys=1.*(small-marge[0]-marge[1])*rapportyx+marge[2]+marge[3]
236            endif
237         endelse
238      endelse
239      xoff=1.*(small-xs)/2.+smalldraw[0]
240      yoff=1.*(big-ys)/2.+smalldraw[1]
241      a=1.*xoff/mipgsz
242      b=1.*yoff/mapgsz
243      c=a+1.*xs/mipgsz
244      d=b+1.*ys/mapgsz
245      xset = xoff
246      yset = yoff
247   endelse
248;------------------------------------------------------------
249   bas=mapgsz*(1-key_portrait)+mipgsz*key_portrait
250   cote=mipgsz*(1-key_portrait)+mapgsz*key_portrait
251   posfenetre=[a,b,c,d]+[ marge[0]/bas, marge[2]/cote $
252                          ,-marge[1]/bas,-marge[3]/cote ]
253   posbar=[a,b,c,d]+[ margebar[0]/bas, margebar[2]/cote $
254                      ,-margebar[1]/bas,(-ys+margebar[3])/cote ]
255;------------------------------------------------------------
256   if keyword_set(key_performance) THEN print, 'temps calibre', systime(1)-tempsun
257
258  IF NOT keyword_set(key_forgetold) THEN BEGIN
259   @updateold
260  ENDIF
261 
262   return
263end
Note: See TracBrowser for help on using the repository browser.