Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

eframe.f

Go to the documentation of this file.
00001 
00002 c
00003 c       Copyright (c) 1986,1987,1988,1989,1990,1991,1992,1993,
00004 c       by Steve McMillan, Drexel University, Philadelphia, PA.
00005 c
00006 c       All rights reserved.
00007 c
00008 c       Redistribution and use in source and binary forms are permitted
00009 c       provided that the above copyright notice and this paragraph are
00010 c       duplicated in all such forms and that any documentation,
00011 c       advertising materials, and other materials related to such
00012 c       distribution and use acknowledge that the software was developed
00013 c       by the author named above.
00014 c
00015 c       THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
00016 c       IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
00017 c       WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00018 c
00019 
00020       subroutine eframe(xmin,xmax,xlen,modx,xctit,
00021      *                  ymin,ymax,ylen,mody,yctit)
00022         save
00023 c
00024       character*(*) xctit,yctit
00025       character*100 outbuf
00026 c
00027       common/scales/xl,xr,dinchx,ybot,ytop,dinchy,rlen,slen
00028       common/dev status/idevon,idevpen,idevwt
00029       common/frdraw/mode/frhts/htl,htn/frwts/iwts(4)
00030       common/frpens/icolors(3)/frrotn/irot
00031       common/frticks/tiks(3),tikl/frint/iframe
00032       common/frconf/scent,rnuml,rnumr,snumt,snumb,dsnums,jrot,stopnum
00033       common/frbare/ibare
00034       common/frsetax/kax,lax
00035       common/dev init/init dev
00036       common/debug trace/itrace
00037 c
00038 c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00039 c
00040 c      Draw frame for plot with tick marks, numerical labels, and
00041 c      titles, using the extended (SIMBOL) font set.
00042 c
00043 c
00044 c      input: ( y is similar to x)
00045 c      ------
00046 c
00047 c       xmin plot value at left hand side
00048 c       xmax plot value at right hand side
00049 c       xlen length of x axis in inches
00050 c       modx = 1 linear plot limits correspond to xmin xmax
00051 c       modx = 2 linear plot limits adjusted to contain to xmin xmax
00052 c       modx =-1 log plot limits correspond to xmin xmax
00053 c       modx =-2 log plot limits adjusted to contain to xmin xmax
00054 c       xctit (character) contains x title
00055 c      *** for log plot enter actual variable, i.e. .01 not -2
00056 c
00057 c
00058 c      output:
00059 c      -------
00060 c
00061 c       xl actual value of left limit
00062 c       xr actual value of right limit
00063 c       dinchx inches per plot unit, i.e. xlen/(xr-xl)
00064 c       ybot actual value of bottom limit
00065 c       ytop actual value of top limit
00066 c       dinchy inches per plot unit, i.e. ylen/(ytop-ybot)
00067 c      *** for log plots limit is log10 of variable
00068 c
00069 c
00070 c       switches:
00071 c       ---------
00072 c
00073 c       the following common blocks each may contain one integer*4
00074 c       variable (imode, say), whose effect is as described.
00075 c
00076 c       (i)  /frdraw/  if imode is nonzero, only scaling information is
00077 c                       returned -- nothing is drawn,
00078 c       (ii) /frbnds/  for nonzero imode, only that part of the
00079 c                       graph (produced by m(d)line) lying within the
00080 c                       "frame"-defined box is actually plotted,
00081 c       (iii)/frlbx/  the x-axis is numbered only for imode=0,
00082 c       (iv) /frlby/  the y-axis is numbered only for imode=0.
00083 c       (v)  /frrotn/   an attempt will be made to keep all y-axis
00084 c                       labels horizontal if imode is zero. numerical labels
00085 c                       longer than six characters and text labels with
00086 c                       length greater than  max( 1.2, 7.5*htl )
00087 c                       will still be plotted vertically.
00088 c       (vi) /frplain/ if imode is nonzero, eframe will use "nombr" for the
00089 c                       numbers, to save on time.
00090 c       (vii) /frbare/ if imode is nonzero, no labels will be drawn and
00091 c                       "numbr" will be used for the numbers.
00092 c                       
00093 c
00094 c       The switches in (i) to (v) above may be set with
00095 c       "call setmod(im1,im2,im3,im4,im5)".
00096 c       /frplain/ is set using subroutine setsym.
00097 c
00098 c       Thus, if no switch is set, entire graphs will be drawn and both
00099 c       axes will be numbered (with horizontal labels, if possible).
00100 c
00101 c
00102 c       Other variable parameters:
00103 c       --------------------------
00104 c
00105 c       (vi) htl, htn, in common block /frhts/, give the sizes of the
00106 c       titles and numerical labels, respectively. defaults are .15, .15.
00107 c       The sizes of all tick marks along the axes scale with htn.
00108 c
00109 c       Set heights with "call sethts(ht1,ht2)".
00110 c
00111 c       (vii) the weights of various components of the frame may be set
00112 c       individually via the integer*4 array iwts in common /frwts/:
00113 c
00114 c               iwts(1):   box and tick marks.
00115 c               iwts(2):   numerical labels (excluding exponents, if any).
00116 c               iwts(3):   exponents (default = iwts(2)).
00117 c               iwts(4):   text labels.
00118 c
00119 c       s/r weight is called with argument iwts(.), when necessary.
00120 c       defaults are 0,0,0,0.
00121 c
00122 c       Set weights with "call setwts(iw1,iw2,iw3,iw4)".
00123 c
00124 c       (viii) the pen types (colors) of various frame components may be set
00125 c       individually via the integer*4 array icolors in common /frpens/:
00126 c
00127 c               icolors(1):   box and tick marks.
00128 c               icolors(2):   numerical labels (including exponents, if any).
00129 c               icolors(3):   text labels.
00130 c
00131 c       s/r color is called with argument icolors(.), when necessary.
00132 c       defaults are 0,0,0.
00133 c
00134 c       Set pens with "call setpens(ip1,ip2,ip3)".
00135 c
00136 c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00137 c
00138       data kountmax/5/
00139 c
00140       if(itrace.eq.1)open(2,file='UNIT2')
00141 c
00142       if(xmax.eq.xmin.or.ymax.eq.ymin.or.xlen.eq.0..or.ylen.eq.0.
00143      +   .or.(modx.lt.0.and.(xmin.le.0..or.xmax.le.0.))
00144      +   .or.(mody.lt.0.and.(ymin.le.0..or.ymax.le.0.)))then
00145           call display text('error in eframe arguments:',26)
00146           write(outbuf,11111)'x',xmin,xmax,xlen,modx
00147 11111     format(a1,': ',1p3e15.6,i10)
00148           call display text(outbuf,58)
00149           write(outbuf,11111)'y',ymin,ymax,ylen,mody
00150           call display text(outbuf,58)
00151           xl=0.
00152           xr=0.
00153           dinchx=0.
00154           ybot=0.
00155           ytop=0.
00156           dinchy=0.
00157           rlen=0.
00158           slen=0.
00159           return
00160       end if
00161 c
00162       if(init dev.eq.0)then
00163           init dev=-1
00164           call mcinit
00165           call devon
00166           call clear
00167       end if
00168       if(idevon.eq.0)call devon
00169 c
00170       call routine id('eframe')
00171       iframe=1
00172 c
00173 c     Experimental precautionary measure:
00174 c
00175       call clrstr
00176 c
00177 c-----------------------------------------------------------------------------
00178 c
00179 c     Adjust label and tick sizes, if the plot is small.
00180 c
00181       dmin=min(xlen,ylen)
00182       if(dmin.gt.2.)then
00183           if(htl.eq.0.)htl=.15
00184           if(htn.eq.0.)htn=.15
00185       else
00186           if(htl.eq.0.)htl=.075*dmin
00187           if(htn.eq.0.)htn=htl
00188       end if
00189 c
00190       tiks(1)=.2*htn
00191       tiks(2)=.30*htn
00192       tiks(3)=.45*htn
00193       tikl=.2*htn
00194 c
00195 c     Save current heights, pen and weight settings, for restoration at the end.
00196 c
00197       htlsto=htl
00198       htnsto=htn
00199       call getstatus(idum1,idum2,icolorinit,iwtinit)
00200       irotsto=irot
00201 c
00202 c     These will inform a new X-window of the curent colors...
00203 c
00204       call color(icolorinit)
00205       call weight(iwtinit)
00206 c
00207 c     Common variables:
00208 c     ----------------
00209 c
00210       modex=modx
00211       modey=mody
00212       rlen=xlen
00213       slen=ylen
00214 c
00215 c     Initialize parameters set by the fr*dr routines.
00216 c
00217       iconf=0
00218       scent=.5*slen
00219 c
00220       if (icolors(1).gt.0) call color(icolors(1))
00221 c
00222 c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00223 c
00224 c     Set axis, tick, and label info, then draw the axes and labels.
00225 c
00226 c     The x-axis action is controlled by x1, x2, y1, y2, modex, mode, kax.
00227 c     The y-axis action is controlled by x1, x2, y1, y2, modey, mode, lax.
00228 c
00229 c     NOTE that both axes must be "set" first, and the fr*set routines
00230 c     may modify x1, x2, y1, and y2.
00231 c
00232 c     NOTE also that the fr*dr routines return global variables used
00233 c     by the "labels" routine.
00234 c
00235 c     Determine appropriate x tick spacings...
00236 c
00237       x1=xmin
00238       x2=xmax
00239       if (modex.gt.0) then
00240           call frlnset(x1,x2,xlen,modex,dxs,dxm,dxl,
00241      &                  labxsp,labxdp,lpowx)
00242 c
00243 c         On return from frlnset, 
00244 c
00245 c         labxsp      = total number of spaces for label
00246 c         labxdp=-1   : integer format
00247 c         labxdp.gt.0 : number of places to right of decimal point
00248 c         lpowx.ne.0  : E format, otherwise F format
00249 c
00250 c         (Same for y below...)
00251 c
00252       else
00253           call frlgset(x1,x2,xlen,modex,dxs,dxm,dxl)
00254       end if
00255 c
00256 c     ...and set the x scaling in common /scales/.
00257 c
00258       xl=x1
00259       xr=x2
00260       dinchx=xlen/(xr-xl)
00261 c
00262 c     Do the same for y.
00263 c
00264       y1=ymin
00265       y2=ymax
00266       if (modey.gt.0) then
00267           call frlnset(y1,y2,ylen,modey,dys,dym,dyl,
00268      &                  labysp,labydp,lpowy)
00269       else
00270           call frlgset(y1,y2,ylen,modey,dys,dym,dyl)
00271       end if
00272 c
00273       ybot=y1
00274       ytop=y2
00275       dinchy=ylen/(ytop-ybot)
00276 c
00277 c     Draw axes, tick marks, labels.
00278 c     -----------------------------
00279 c
00280 
00281 c        write(6,*)'iwts = ',iwts
00282 c        write(6,*)'icolors = ',icolors
00283 c        write(6,*)'mode, kax = ',mode,kax
00284 
00285       if (mode.eq.0.and.kax.gt.0) then
00286           if (modex.gt.0) then
00287               call frlnxdr(y1,x1,x2,dxs,dxm,dxl,
00288      $                      1,1,labxsp,labxdp,lpowx)
00289               call frlnxdr(y2,x1,x2,dxs,dxm,dxl,
00290      $                      2,0,labxsp,labxdp,lpowx)
00291           else
00292               call frlgxdr(y1,x1,x2,dxs,dxm,dxl,1,1)
00293               call frlgxdr(y2,x1,x2,dxs,dxm,dxl,2,0)
00294           end if
00295           call labl(1,xctit)
00296       end if
00297 c
00298       if (mode.eq.0.and.lax.ge.0) then
00299 c
00300 c         Numbers are always drawn horizontally.
00301 c
00302           irot=0
00303 c
00304           if (modey.gt.0) then
00305               call frlnydr(x1,y1,y2,dys,dym,dyl,
00306      $                     1,1,labysp,labydp,lpowy)
00307               call frlnydr(x2,y1,y2,dys,dym,dyl,
00308      $                     2,0,labysp,labydp,lpowy)
00309           else
00310               call frlgydr(x1,y1,y2,dys,dym,dyl,1,1)
00311               call frlgydr(x2,y1,y2,dys,dym,dyl,2,0)
00312           end if
00313           irot = irotsto
00314           call labl(2,yctit)
00315       end if
00316 c
00317 c-----------------------------------------------------------------------------
00318 c
00319 c     Restore "true" settings (just in case).
00320 c
00321       htl = htlsto
00322       htn = htnsto
00323       call color(icolorinit)
00324       call weight(iwtinit)
00325       irot = irotsto
00326 c
00327       iframe=0
00328 c
00329       end
00330 
00331 
00332       subroutine labl(which,string)
00333         save
00334       integer which
00335       character*(*) string
00336 c
00337       common /frdraw/mode
00338       common /frbare/ibare
00339       common /frwts/iwts(4)
00340       common /frpens/icolors(3)
00341 c
00342 c     Draw the x- or the y-label.
00343 c
00344       if (mode.eq.0.and.ibare.ne.1.and.iwts(4).ge.0) then
00345 c
00346 c         Save current settings.
00347 c
00348           call getstatus(idum1,idum2,ipsto,iwsto)
00349 c
00350           if (iwts(4).gt.0) call weight(iwts(4))
00351           if (icolors(3).gt.0) call color(icolors(3))
00352 c
00353           if (which.eq.1) then
00354               call labels(string,' ')
00355           else
00356               call labels(' ',string)
00357           end if
00358 c
00359 c         Restore settings.
00360 c
00361           call color(ipsto)
00362           call weight(iwsto)
00363 c
00364       end if
00365 c
00366       end

Generated at Sun Feb 24 09:56:59 2002 for STARLAB by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001