home *** CD-ROM | disk | FTP | other *** search
- SUBROUTINE DRCHEK(IER)
- C checks that this object size is less than page size
- C returns IER = 0 if it is
- INCLUDE 'CDE.DrawF'
- IER=0
- IF(LP.EQ.0)THEN
- C use the largest object regardless of size
- IF(MINPX.LT.MINBOX)MINPX=MINBOX
- IF(MAXPX.GT.MAXBOX)MAXPX=MAXBOX
- IF(MINPY.LT.MINBOY)MINPY=MINBOY
- IF(MAXPY.GT.MAXBOY)MAXPY=MAXBOY
- RETURN
- ELSE
- IF(MINBOX.GT.MINPX.AND.MINBOY.GT.MINPY.AND.
- 1 MAXBOX.LT.MAXPX.AND.MAXBOY.LT.MAXPY)RETURN
- ENDIF
- IER=5
- RETURN
- END
- SUBROUTINE DRFILE(PSIZE,FNAME,IER)
- C control routine to make a DRAWfile in file FNAME
- C returns IER =0 for success, othwise gives error number
- C PSIZE is page size, =A4 check size of objects will go in,
- C error return if they won't, ="" set to size of largest
- CHARACTER *(*) FNAME, PSIZE
- PARAMETER (MAXPR=100,NSIZES=5,MAXCHR=255)
- CHARACTER *3 PS(0:NSIZES-1)
- C user text
- CHARACTER *1 CHARAY(MAXCHR)
- DIMENSION ARRAY(2,MAXPR),LSIZES(2,0:NSIZES-1)
- C dimensions of user co-ordinate pairs
- INCLUDE 'CDE.DrawF'
- DATA PS /' ', 'A4L', 'A4P', 'A5L', 'A5P'/
- DATA LSIZES/0,0,297,210,210,297,210,148,148,210/
- C scale is 1mm in internal Draw units (PRM p1489
- C fudge below to get !Draw to get right page size, should be 25.4 really ??
- SCALE=180.*256./25.5
- C check page size flag
- DO 6 I=0,NSIZES-1
- IF(PS(I).NE.PSIZE)GOTO6
- C set page size flag in COMMON/DR/
- LP=I
- GOTO8
- 6 CONTINUE
- LP=0
- 8 MINPX=0.
- MINPY=0.
- C set page sizes according to the flag LP
- MAXPX=LSIZES(1,LP)*SCALE
- MAXPY=LSIZES(2,LP)*SCALE
- C open file FNAME for writing
- CALL DROPEN(FNAME,IER)
- IF(IER.NE.0)RETURN
- C set up DRAWfile header
- CALL DRHEAD(IER)
- IF(IER.NE.0)GOTO90
- C User routine to make the object,
- C set up NPTS co-ordinate pairs in ARRAY
- NPTS=0
- C set up default colour words on this call
- L1=-1
- L2=0
- L3=0
- L4=0
- C solid line in black minimum width
- 10 CALL DRPOL(ARRAY,MAXPR,NPTS,L1,L2,L3,L4,IER)
- IF(NPTS.LE.0)GOTO20
- C check for an error from the user routine
- IF(IER.NE.0)GOTO90
- C store a DRAW path object in the file
- CALL DRPATH(ARRAY,NPTS,L1,L2,L3,L4,IER)
- IF(IER.NE.0)GOTO90
- GOTO10
- C store a DRAW text object
- 20 NCHARS=0
- C defaults for text
- L1=0
- C text colour and hint
- L2=?IFFFFFF00
- C text style (= font number)
- L3=0
- C text size in points
- L4=12
- 30 CALL DRCHAR(CHARAY,MAXCHR,NCHARS,L1,L2,L3,L4,XL,YL,IER)
- IF(NCHARS.LE.0)GOTO40
- C check for error from the user routine
- IF(IER.NE.0)GOTO90
- C store a Text object in the file
- CALL DRTEXT(CHARAY,NCHARS,L1,L2,L3,L4,XL,YL,IER)
- IF(IER.NE.0)GOTO90
- GOTO30
- 40 CONTINUE
- C close the file
- 90 CALL DRCLOS
- RETURN
- END
- SUBROUTINE DRHEAD(IER)
- C sets up the header for the DRAWfile
- C
- C 12 bytes filetype identifier padded with zeros
- C 12 bytes application identifier padded with spaces zero terminated
- C 4 bytes for x,y at corners of bounding box lower left, top right
- INCLUDE 'CDE.DrawF'
- C 1st 3 words are 'Draw', 201, 0
- LBUF(1)=?I77617244
- LBUF(2)=201
- LBUF(3)=0
- C a r D T
- LBUF(4)=?I61724454
- C w
- LBUF(5)=?I20202077
- LBUF(6)=?I20202020
- C set page sizes from page flag LP
- C MINPX=?I02F380
- C MAXPX=?I06DA80
- C A4 size Landscape orientation from !molecule
- C MINPY=?I012CC0
- C MAXPY=?I050CC0
- LBUF(7)=MINPX
- LBUF(8)=MINPY
- LBUF(9)=MAXPX
- LBUF(10)=MAXPY
- LB=10
- CALL DRWRIT(LBUF,LB,0,IER)
- RETURN
- END
- SUBROUTINE DRPATH(ARRAY,NPTS,L1,L2,L3,L4,IER)
- C creates a DRAW Path Object in LBUF from the NPTS co-ordinate pairs in ARRAY
- C returns dimensions of bounding box
- C L1,L2,L3,L4 1ST 3 WORDS OF PATH HEADER
- DIMENSION ARRAY(2,*),LPAT(10)
- INCLUDE 'CDE.DrawF'
- C data for dash patterns
- DATA LPAT/2*?I0900,2*?I1200,2*?I2400,?I2400,3*?I0900/
- C make the Path Object header
- C this is a path object type 2
- LBUF(1)=2
- C LBUF(2) is count, 3,4,5,6 size to be entered later
- C word 1 =colour if filled, -1 otherwise
- LBUF(7)=L1
- C line colour black
- LBUF(8)=L2
- C line width minimum, and joints as in Archive vol4#6 page 42
- LBUF(9)=L3
- C LBUF(10)=L4
- LBUF(10)=?I20100042
- LB=10
- IF(L4.GT.0.AND.L4.LT.5)THEN
- C set up dotted lines set pattern bit
- LBUF(10)=?I201000C2
- C offset to start of pattern
- LBUF(11)=0
- C number of elements in the following pattern
- LBUF(12)=2
- C pattern of dashes
- LBUF(13)=LPAT(2*L4-1)
- LBUF(14)=LPAT(2*L4)
- LB=14
- IF(L4.EQ.4)THEN
- C dashes and dots
- LBUF(15)=LPAT(9)
- LBUF(16)=LPAT(10)
- LBUF(12)=4
- LB=16
- ENDIF
- ENDIF
- C Path Object header done, now add the picture from ARRAY
- CALL DRPIC(LBUF(LB+1),LX,ARRAY,NPTS)
- C check that object size compatible with page size
- CALL DRCHEK(IER)
- IF(IER.NE.0)RETURN
- LW=LB+LX
- C number of bytes stored in LBUF
- LBUF(2)=LW*4
- C update path header with count and size
- LBUF(3)=MINBOX
- LBUF(4)=MINBOY
- LBUF(5)=MAXBOX
- LBUF(6)=MAXBOY
- C write out this path object
- CALL DRWRIT(LBUF,LW,-1,IER)
- RETURN
- END
- SUBROUTINE DRPIC(MBUF,LB,ARRAY,NPTS)
- C scales the NPTS pairs of co-ordinatesin ARRAY and moves them into LBUF
- C returns LB number of words stored in MBUF
- PARAMETER (MOVE=2,MDRAW=8,MTERM=0)
- DIMENSION MBUF(*),ARRAY(2,*)
- INCLUDE 'CDE.DrawF'
- MINBOX=999999
- MINBOY=999999
- MAXBOX=-1
- MAXBOY=-1
- C initialise box min and max
- LB=1
- DO 20 I=1,NPTS
- IF(I.EQ.1)THEN
- MBUF(LB)=MOVE
- ELSE
- MBUF(LB)=MDRAW
- ENDIF
- C Scale x,y to mm units
- IW=SCALE*ARRAY(1,I)
- MBUF(LB+1)=IW
- IF(IW.LT.MINBOX)MINBOX=IW
- IF(IW.GT.MAXBOX)MAXBOX=IW
- IW=SCALE*ARRAY(2,I)
- MBUF(LB+2)=IW
- IF(IW.LT.MINBOY)MINBOY=IW
- IF(IW.GT.MAXBOY)MAXBOY=IW
- 20 LB=LB+3
- C all x,y pairs now stored, terminate with 00
- MBUF(LB)=MTERM
- RETURN
- END
- SUBROUTINE DRPOL(ARRAY,MAXPR,NPTS,L1,L2,L3,L4,IER)
- C Dummy User routine sets up co-ordinate pairs for lines into ARRAY
- C assume units mm, MAXPR max no of pairs, NPTS returned
- DIMENSION ARRAY(2,MAXPR)
- IER=0
- RETURN
- END
- SUBROUTINE DRCHAR(CHARAY,MAXCHR,NCHARS,L1,L2,L3,L4,XL,YL,IER)
- CHARACTER *(*) CHARAY
- C Dummy user routine to set up text
- IER=0
- RETURN
- END
- SUBROUTINE DRTEXT(CHARAY,NCHARS,L1,L2,L3,L4,XL,YL,IER)
- C creates a DRAW Text Object from the NCHARS characters in CHARAY
- C L1,L2 are colours of text, L3 font number, L4 size (same for x and y)
- C XL,YL lower left corner of text in the picture, IER =error return
- CHARACTER *1 CHARAY(*)
- INCLUDE 'CDE.DrawF'
- IER=0
- C make the Text Object header path object type 1
- LBUF(1)=1
- C LBUF(2) is count, 3,4,5,6 box size to be entered later
- C word 1= colour word, 2= colour of hint, 3=style(font no)
- LBUF(7)=L1
- LBUF(8)=L2
- LBUF(9)=L3
- C 10,11 are x,y sizes of font, units are 1/640 of a point
- LBUF(10)=L4*640
- LBUF(11)=LBUF(10)
- C lower left corner of start of text
- MINBOX=XL*SCALE
- MINBOY=YL*SCALE
- C set bounding box lower left
- C upper y value = 1 character
- MAXBOY=MINBOY+LBUF(11)
- C assume monospacing in x check width will go in
- MAXBOX=MINBOX+LBUF(10)*NCHARS
- C allow for other objects already stored
- CALL DRCHEK(IER)
- IF(IER.NE.0)THEN
- IER=6
- RETURN
- ENDIF
- C set box sizes into header
- LBUF(12)=MINBOX
- LBUF(13)=MINBOY
- LB=13
- C Text Object header done, now add the characters from ARRAY
- C must have text in a whole number of words, null filled
- NADD=1+(NCHARS/4)
- ICH=1
- IZERO=0
- DO 20 I=1,NADD
- IW=0
- DO 10 J=0,24,8
- IF(ICH.LE.NCHARS)THEN
- IW=IOR(IW,ISHFT(ICHAR(CHARAY(ICH)),J))
- ELSE
- IW=IOR(IW,ISHFT(IZERO,J))
- ENDIF
- ICH=ICH+1
- 10 CONTINUE
- LBUF(LB+I)=IW
- 20 CONTINUE
- C number of bytes stored in LBUF
- LBUF(2)=(LB+NADD)*4
- C update path header with count and size
- LBUF(3)=MINBOX
- LBUF(4)=MINBOY
- LBUF(5)=MAXBOX
- LBUF(6)=MAXBOY
- LW=LB+NADD
- C write out this path object
- CALL DRWRIT(LBUF,LW,-1,IER)
- RETURN
- END
- SUBROUTINE DROBJ(ARRAY,NWDS,IER)
- C Write out NWDS words of ARRAY set up by the user
- IER=0
- RETURN
- END
- SUBROUTINE SAVMEM(LBUF,LB,FILNAM,IER)
- DIMENSION LBUF(*),IREGS(0:7)
- CHARACTER *(*) FILNAM
- CHARACTER *20 FTERM
- DATA IREGS/10,7*0/
- C saves array LBUF, length LB, to file, FILNAM
- IER=0
- FTERM=FILNAM//CHAR(0)
- IREGS(1)=LOCC(FTERM)
- IREGS(2)=?I0AFF
- C filetype Draw
- IREGS(4)=LOC(LBUF)
- C LB=words, but need Byte address
- IREGS(5)=IREGS(4)+LB*4
- C writes out contents of LBUF to file (SWI 8 =OSFILE)
- CALL SWIF77(8,IREGS,IFLAG)
- C ought to have an IER error return here
- RETURN
- END
- SUBROUTINE DRWRIT(LBUF,NWD,IWD,IER)
- C write out NWD words form array LBUF to the open file
- C IWD < 0 appends to end after latest block written
- C IWD >=0 writes at position IWD in the file
- PARAMETER(IGBPB=12,IFIND=13,IFILE=8)
- CHARACTER FNAME*(*),NAME*50
- DIMENSION LBUF(*),IREGS(0:7)
- DATA IHANDL/0/
- IER=0
- C set the error flag to zero
- C file must be open to write
- IF(IHANDL.EQ.0) THEN
- IER=3
- RETURN
- ENDIF
- IF(IWD.GE.0) THEN
- C put data in file at word IWD
- IREGS(0)=1
- IREGS(4)=4*IWD
- ELSE
- C append data to file, but remember that this is not necessarily
- C at the end of the file!!!
- IREGS(0)=2
- ENDIF
- IREGS(1)=IHANDL
- IREGS(2)=LOC(LBUF)
- IREGS(3)=4*NWD
- CALL SWIF77(IGBPB,IREGS,IFLAG)
- C should test for errors someday and set IER depending on IFLAG
- RETURN
- C open file here -----------------------------------------
- ENTRY DROPEN(FNAME,IER)
- IER=0
- IF(IHANDL.NE.0) THEN
- C can't open already open file!
- IER=2
- RETURN
- ENDIF
- C null terminate file name
- NAME=FNAME//CHAR(0)
- IREGS(0)=128
- IREGS(1)=LOCC(NAME)
- CALL SWIF77(IFIND,IREGS,IFLAG)
- C must check value of IFLAG and return IER <> 0
- IHANDL=IREGS(0)
- RETURN
- C close file here -------------------------------------------
- ENTRY DRCLOS
- C no file to close?
- IF(IHANDL.EQ.0) RETURN
- IREGS(0)=0
- IREGS(1)=IHANDL
- CALL SWIF77(IFIND,IREGS,IFLAG)
- IHANDL=0
- C set file type of 'NAME' to &AFF (DrawFile)
- IREGS(0)=18
- IREGS(1)=LOCC(NAME)
- IREGS(2)=?I0AFF
- CALL SWIF77(IFILE,IREGS,IFLAG)
- RETURN
- END
-