[85] | 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 | |
---|
| 179 | FUNCTION PSWINDOW_ASPECT, aspectRatio, MARGIN=margin, WindowAspect=wAspectRatio |
---|
| 180 | |
---|
| 181 | ON_ERROR, 1 |
---|
| 182 | |
---|
| 183 | ; Check for aspect ratio parameter and possibilities. |
---|
| 184 | |
---|
| 185 | IF N_PARAMS() EQ 0 THEN aspectRatio = 1.0 |
---|
| 186 | |
---|
| 187 | IF aspectRatio EQ 0 THEN BEGIN |
---|
| 188 | MESSAGE, 'Aspect Ratio of 0. Changing to 1...', /Informational |
---|
| 189 | aspectRatio = 1.0 |
---|
| 190 | ENDIF |
---|
| 191 | |
---|
| 192 | s = SIZE(aspectRatio) |
---|
| 193 | IF s(s(0)+1) NE 4 THEN $ |
---|
| 194 | MESSAGE, 'Aspect Ratio is not a FLOAT. Take care...', /Informational |
---|
| 195 | |
---|
| 196 | ; Check for margins. |
---|
| 197 | |
---|
| 198 | IF N_ELEMENTS(margin) EQ 0 THEN margin = 0.15 |
---|
| 199 | |
---|
| 200 | ; Error checking. |
---|
| 201 | |
---|
| 202 | IF 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 | |
---|
| 207 | IF N_Elements(wAspectRatio) EQ 0 THEN wAspectRatio = FLOAT(!D.Y_VSIZE) / !D.X_VSIZE |
---|
| 208 | |
---|
| 209 | ; Calculate normalized positions in window. |
---|
| 210 | |
---|
| 211 | IF (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) |
---|
| 216 | ENDIF 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 |
---|
| 221 | ENDELSE |
---|
| 222 | |
---|
| 223 | position = [xstart, ystart, xend, yend] |
---|
| 224 | |
---|
| 225 | RETURN, position |
---|
| 226 | END ; ---------------------------------------------------------------------------------- |
---|
| 227 | |
---|
| 228 | |
---|
| 229 | |
---|
| 230 | FUNCTION 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 | |
---|
| 235 | landscape = Keyword_Set(landscape) |
---|
| 236 | cm = Keyword_Set(cm) |
---|
| 237 | printer = Keyword_Set(printer) |
---|
| 238 | inches = 1 |
---|
| 239 | |
---|
| 240 | ; Set up printer fudge factors, if necessary. |
---|
| 241 | |
---|
| 242 | IF N_Elements(fudge) NE 0 THEN BEGIN |
---|
| 243 | xfudge = fudge |
---|
| 244 | yfudge = fudge |
---|
| 245 | ENDIF |
---|
| 246 | IF N_Elements(xfudge) EQ 0 THEN xfudge = 0.0 |
---|
| 247 | IF N_Elements(yfudge) EQ 0 THEN yfudge = 0.0 |
---|
| 248 | |
---|
| 249 | ; Get the page size. |
---|
| 250 | |
---|
| 251 | IF N_Elements(pagesize) EQ 0 THEN pagesize = 'LETTER' $ |
---|
| 252 | ELSE pagesize = StrUpCase(pagesize) |
---|
| 253 | CASE 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 |
---|
| 271 | ENDCASE |
---|
| 272 | |
---|
| 273 | ; Need measurements in centimeters? |
---|
| 274 | |
---|
| 275 | IF KEYWORD_SET(cm) THEN BEGIN |
---|
| 276 | shortside = shortside * 2.54 |
---|
| 277 | longside = longside * 2.54 |
---|
| 278 | inches = 0 |
---|
| 279 | ENDIF |
---|
| 280 | |
---|
| 281 | ; Determine the margin of the window on the page. |
---|
| 282 | |
---|
| 283 | IF 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 | |
---|
| 288 | aspectRatio = FLOAT(!D.Y_VSIZE) / !D.X_VSIZE |
---|
| 289 | |
---|
| 290 | ; Get the aspect ratio of the page. |
---|
| 291 | |
---|
| 292 | IF Keyword_Set(landscape) THEN pAspectRatio = shortside / longside $ |
---|
| 293 | ELSE pAspectRatio = longside / shortside |
---|
| 294 | |
---|
| 295 | ; Get the position on the page for this window. |
---|
| 296 | |
---|
| 297 | pos = PSWindow_Aspect(aspectRatio, Margin=margin, WindowAspect=pAspectRatio) |
---|
| 298 | |
---|
| 299 | ; Convert normalized position coordinates to size units. |
---|
| 300 | |
---|
| 301 | IF 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 |
---|
| 317 | ENDIF 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 |
---|
| 329 | ENDELSE |
---|
| 330 | |
---|
| 331 | ; Return the proper DEVICE data structure. |
---|
| 332 | |
---|
| 333 | RETURN, {PSWINDOW_STRUCT, XSIZE:xsize, YSIZE:ysize, $ |
---|
| 334 | XOFFSET:xoffset, YOFFSET:yoffset, INCHES:inches, $ |
---|
| 335 | PORTRAIT:portrait, LANDSCAPE:landscape} |
---|
| 336 | |
---|
| 337 | END |
---|