source: trunk/MESOSCALE/PLOT/MINIMAL/fsc/pswindow.pro @ 205

Last change on this file since 205 was 85, checked in by aslmd, 14 years ago

LMD_MM_MARS et LMD_LES_MARS: ajout des routines IDL pour tracer les sorties --> voir mesoscale/PLOT

File size: 11.1 KB
Line 
1;+
2; NAME:
3;    PSWINDOW
4;
5; PURPOSE:
6;
7;    This function is used to calculate the size of a PostScript
8;    window that has the same aspect ratio (ratio of height to
9;    width) as the current display graphics window. It creates
10;    the largest possible PostScript output window with the
11;    desired aspect ratio. This assures that graphics output
12;    looks similar, if not identical, to PostScript output.
13;
14; AUTHOR:
15;
16;   FANNING SOFTWARE CONSULTING
17;   David Fanning, Ph.D.
18;   1645 Sheely Drive
19;   Fort Collins, CO 80526 USA
20;   Phone: 970-221-0438
21;   E-mail: davidf@dfanning.com
22;   Coyote's Guide to IDL Programming: http://www.dfanning.com/
23;
24; CATEGORY:
25;
26;    Graphics.
27;
28; CALLING SEQUENCE:
29;
30;    pageInfo = PSWINDOW()
31;
32; INPUTS:
33;
34;    None.
35;
36; KEYWORD PARAMETERS:
37;
38;    CM: Normally the structure value that is returned from this
39;    function reports its values in inches. Setting this keyword
40;    causes the return values to be in units of centimeters.
41;
42;    FUDGE: A quick way to set symetrical XFUDGE and YFUDGE factors.
43;    If this keyword is set to a value, XFUDGE and YFUDGE keywords are
44;    set to the same value.
45;
46;    LANDSCAPE: Normally this function assumes a PostScript window
47;    in Portrait mode. Setting this keyword assumes you want
48;    the graphic in Landscape mode.
49;
50;    MARGIN:  The margin around the edges of the plot. The value must be
51;    a floating point value between 0.0 and 0.5. It is expressed in
52;    normalized coordinate units. The default margin is 0.05.
53;
54;    PAGESIZE: Set this keyword to a string indicating the type
55;    of PostScript page size you want. Current values are "LETTER",
56;    "LEGAL", and "A4". Default is "LETTER".
57;
58;    PRINTER: Set this keyword if the output will be used to
59;    configure the PRINTER device, rather than the PS device.
60;    (In the PRINTER device, offsets are always calculated from
61;    the lower-left corner of the page and do not rotate in
62;    Landscape mode, as they do with the PS device.) Note that
63;    the PRINTER device is only able to accept these keywords
64;    in IDL 5.1 and higher.
65;
66;    XFUDGE: Printers calculate the offset point from the printable
67;    edge of the paper (sometimes), rather from the corner of the paper.
68;    For example, on my Lexmark printer, both X and Y offsets are
69;    calculated from a point 0.25 inches in from the edge. This keyword
70;    allows you to set a "fudge" factor that will be subtracted from
71;    the XOFFSET that is returned to the user. This allows you to create
72;    output that is centered on the page. The fudge factor should be in
73;    the same units as the returned size and offset values.
74;
75;    YFUDGE: Printers calculate the offset point from the printable
76;    edge of the paper (sometimes), rather from the corner of the paper.
77;    For example, on my Lexmark printer, both X and Y offsets are
78;    calculated from a point 0.25 inches in from the edge. This keyword
79;    allows you to set a "fudge" factor that will be subtracted from
80;    the YOFFSET that is returned to the user. This allows you to create
81;    output that is centered on the page. The fudge factor should be in
82;    the same units as the returned size and offset values.
83;
84; OUTPUTS:
85;
86;    pageInfo: The output value is a named structure defined like
87;    this:
88;
89;      pageInfo = {PSWINDOW_STRUCT, XSIZE:0.0, YSIZE:0.0, $
90;         XOFSET:0.0, YOFFSET:0.0, INCHES:0, PORTRAIT:0, LANDSCAPE:0}
91;
92;    The units of the four size fields are inches unless the CM
93;    keyword is set.
94;
95;    The output can be used to immediately configure the PostScript
96;    or Printer device, like this:
97;
98;       Set_Plot, 'PS' ; or 'PRINTER'
99;       Device, _Extra=pageInfo
100;
101; RESTRICTIONS:
102;
103;    The aspect ratio of the current graphics window is calculated
104;    like this:
105;
106;       aspectRatio = FLOAT(!D.Y_VSIZE) / !D.X_VSIZE
107;
108; EXAMPLE:
109;
110;    To create a PostScript output window with the same aspect
111;    ratio as the curently active display window, type:
112;
113;     pageInfo = PSWINDOW()
114;     SET_PLOT, 'PS'
115;     DEVICE, _Extra=pageInfo
116;
117;     To configure the PRINTER device:
118;
119;     pageInfo = PSWINDOW(/Printer, Fudge=0.25)
120;     SET_PLOT, 'PRINTER'
121;     DEVICE, _Extra=pageInfo
122;
123; MODIFICATION HISTORY:
124;
125;    Written by: David W. Fanning, November 1996.
126;       Fixed a bug in which the YOFFSET was calculated incorrectly
127;          in Landscape mode. 12 Feb 97.
128;       Took out a line of code that wasn't being used. 14 Mar 97.
129;       Added correct units keyword to return structure. 29 JUN 98. DWF
130;       Fixed a bug in how landscape offsets were calculated. 19 JUL 99. DWF.
131;       Fixed a bug in the way margins were used to conform to my
132;          original conception of the program. 19 JUL 99. DWF.
133;       Added Landscape and Portrait fields to the return structure. 19 JUL 99. DWF.
134;       Added PageSize keyword, changed MARGIN keyword, and completely
135;          rewrote most of the intenal code. 9 FEB 2000. DWF.
136;       Fixed a bug in how I calculated the aspect ratio. 1 MAR 2000. DWF.
137;       Added PRINTER keyword to return proper offset values for the
138;          PRINTER device, where the offset location is not rotated. 1 MAR 2000. DWF.
139;       Added PRINTER fudge factors to take into account that printer offsets are
140;          calculated from the printable area of the paper, rather than the corner
141;          of the paper. 8 AUG 2000. DWF.
142;       Changed the default margin to 0.05 from 0.15. 29 Nov 2004, DWF.
143;-
144;
145;###########################################################################
146;
147; LICENSE
148;
149; This software is OSI Certified Open Source Software.
150; OSI Certified is a certification mark of the Open Source Initiative.
151;
152; Copyright © 2000-2004 Fanning Software Consulting
153;
154; This software is provided "as-is", without any express or
155; implied warranty. In no event will the authors be held liable
156; for any damages arising from the use of this software.
157;
158; Permission is granted to anyone to use this software for any
159; purpose, including commercial applications, and to alter it and
160; redistribute it freely, subject to the following restrictions:
161;
162; 1. The origin of this software must not be misrepresented; you must
163;    not claim you wrote the original software. If you use this software
164;    in a product, an acknowledgment in the product documentation
165;    would be appreciated, but is not required.
166;
167; 2. Altered source versions must be plainly marked as such, and must
168;    not be misrepresented as being the original software.
169;
170; 3. This notice may not be removed or altered from any source distribution.
171;
172; For more information on Open Source Software, visit the Open Source
173; web site: http://www.opensource.org.
174;
175;###########################################################################
176
177
178
179FUNCTION PSWINDOW_ASPECT, aspectRatio, MARGIN=margin, WindowAspect=wAspectRatio
180
181ON_ERROR, 1
182
183   ; Check for aspect ratio parameter and possibilities.
184
185IF N_PARAMS() EQ 0 THEN aspectRatio = 1.0
186
187IF aspectRatio EQ 0 THEN BEGIN
188   MESSAGE, 'Aspect Ratio of 0. Changing to 1...', /Informational
189   aspectRatio = 1.0
190ENDIF
191
192s = SIZE(aspectRatio)
193IF s(s(0)+1) NE 4 THEN $
194   MESSAGE, 'Aspect Ratio is not a FLOAT. Take care...', /Informational
195
196   ; Check for margins.
197
198IF N_ELEMENTS(margin) EQ 0 THEN margin = 0.15
199
200   ; Error checking.
201
202IF margin LT 0 OR margin GE 0.5 THEN $
203   MESSAGE, 'The MARGIN keyword value must be between 0.0 and 0.5.'
204
205   ; Calculate the aspect ratio of the current window.
206
207IF N_Elements(wAspectRatio) EQ 0 THEN wAspectRatio = FLOAT(!D.Y_VSIZE) / !D.X_VSIZE
208
209   ; Calculate normalized positions in window.
210
211IF (aspectRatio LE wAspectRatio) THEN BEGIN
212   xstart = margin
213   ystart = 0.5 - (0.5 - margin) * (aspectRatio / wAspectRatio)
214   xend = 1.0 - margin
215   yend = 0.5 + (0.5 - margin) * (aspectRatio / wAspectRatio)
216ENDIF ELSE BEGIN
217   xstart = 0.5 - (0.5 - margin) * (wAspectRatio / aspectRatio)
218   ystart = margin
219   xend = 0.5 + (0.5 - margin) * (wAspectRatio / aspectRatio)
220   yend = 1.0 - margin
221ENDELSE
222
223position = [xstart, ystart, xend, yend]
224
225RETURN, position
226END ; ----------------------------------------------------------------------------------
227
228
229
230FUNCTION PSWINDOW, LANDSCAPE=landscape, CM=cm, MARGIN=margin, $
231   PageSize=pagesize, Printer=printer, Fudge=fudge, XFudge=xfudge, YFudge=yfudge
232
233   ; Set up default values.
234
235landscape = Keyword_Set(landscape)
236cm = Keyword_Set(cm)
237printer = Keyword_Set(printer)
238inches = 1
239
240   ; Set up printer fudge factors, if necessary.
241
242IF N_Elements(fudge) NE 0 THEN BEGIN
243   xfudge = fudge
244   yfudge = fudge
245ENDIF
246IF N_Elements(xfudge) EQ 0 THEN xfudge = 0.0
247IF N_Elements(yfudge) EQ 0 THEN yfudge = 0.0
248
249   ; Get the page size.
250
251IF N_Elements(pagesize) EQ 0 THEN pagesize = 'LETTER' $
252   ELSE pagesize = StrUpCase(pagesize)
253CASE pagesize OF
254   'LETTER': BEGIN
255      shortside = 8.5
256      longside = 11.0
257      ENDCASE
258   'LEGAL': BEGIN
259      shortside = 8.5
260      longside = 14.0
261      ENDCASE
262    'A4': BEGIN
263      shortside = 8.27
264      longside = 11.7
265      ENDCASE
266    ELSE: BEGIN
267      Message, 'Unknown page size. Using LETTER...', /Informational
268      shortside = 8.5
269      longside = 11.0
270      ENDCASE
271ENDCASE
272
273   ; Need measurements in centimeters?
274
275IF KEYWORD_SET(cm) THEN BEGIN
276      shortside = shortside * 2.54
277      longside = longside * 2.54
278      inches = 0
279ENDIF
280
281   ; Determine the margin of the window on the page.
282
283IF N_ELEMENTS(margin) EQ 0 THEN margin=0.05
284
285   ; Get the aspect ratio of the current display window. Aspect ratio
286   ; is ratio of xsize/ysize.
287
288aspectRatio = FLOAT(!D.Y_VSIZE) / !D.X_VSIZE
289
290   ; Get the aspect ratio of the page.
291
292IF Keyword_Set(landscape) THEN pAspectRatio = shortside / longside $
293   ELSE pAspectRatio = longside / shortside
294
295   ; Get the position on the page for this window.
296
297pos = PSWindow_Aspect(aspectRatio, Margin=margin, WindowAspect=pAspectRatio)
298
299   ; Convert normalized position coordinates to size units.
300
301IF KEYWORD_SET(landscape) THEN BEGIN
302   IF printer THEN BEGIN
303      xsize = (pos[2] - pos[0]) * longside
304      ysize = (pos[3] - pos[1]) * shortside
305      yoffset = pos[1] * shortside - yfudge
306      xoffset = pos[0] * longside - xfudge
307      landscape = 1
308      portrait = 0
309   ENDIF ELSE BEGIN
310      xsize = (pos[2] - pos[0]) * longside
311      ysize = (pos[3] - pos[1]) * shortside
312      xoffset = pos[1] * shortside
313      yoffset = longside - (pos[0] * longside)
314      landscape = 1
315      portrait = 0
316   ENDELSE
317ENDIF ELSE BEGIN
318   xsize = (pos[2] - pos[0]) * shortside
319   ysize = (pos[3] - pos[1]) * longside
320   IF printer THEN BEGIN
321      xoffset = pos[0] * shortside - xfudge
322      yoffset = pos[1] * longside - yfudge
323   ENDIF ELSE BEGIN
324      xoffset = pos[0] * shortside
325      yoffset = pos[1] * longside
326   ENDELSE
327   landscape = 0
328   portrait = 1
329ENDELSE
330
331   ; Return the proper DEVICE data structure.
332
333RETURN, {PSWINDOW_STRUCT, XSIZE:xsize, YSIZE:ysize, $
334   XOFFSET:xoffset, YOFFSET:yoffset, INCHES:inches, $
335   PORTRAIT:portrait, LANDSCAPE:landscape}
336
337END
Note: See TracBrowser for help on using the repository browser.