MODULE DDTEK; (* This module takes a Gfile and plots the graphics instructions on a tektronics plotters. To use this driver type $ ddTEK gfile Where gfile is the file containing graphics commands. 1. INIT baudrate 2. ERAS 3. WIND lowerx,lowery,upperx,uppery 4. MAPW xmin,ymin,xmax,ymax 5. MOVE x,y 6. DRAW x,y 7. PLIN pcount,x[1],y[1],...,x[pcount],y[pcount] 8. LPAT SOLI|DASH|DOTT 9. FONT HARD|ROMA|STIC|SCRI|GOTH 10. CSIZ cht,cwid,slant,hindex,vindex 11. COLO BLAC|BLUE|GREE|REDD 12. LORG 3|6|9 13. TEXT x,y,rotation,charcount 20 words for 80 byte string 14. *EOG *) FROM VMSRTL IMPORT Lib$Get_Foreign; FROM FileSystem IMPORT File; FROM GfileManager IMPORT OpenGfile, GetW, GetWords, CloseGfile; FROM TEK IMPORT Movea,Drawa,Dasha,Linef,Anstr,Chrsiz,Dwindo,Initt,Newpag,Finitt, Binitt, (* 4662 specific routines *) Plinit, Pspeed, Plon, Ploff, Swchar, Term, Plcopy; FROM InOut IMPORT WriteString, WriteLn, Read, ReadLn; PROCEDURE MakePrompt( s : ARRAY OF CHAR ); VAR i : CARDINAL; BEGIN FOR i := 0 TO HIGH( s ) DO prompt[i+1] := s[i] END; prompt[ HIGH(s)+2 ] := 0C END MakePrompt; PROCEDURE FireUp( ); BEGIN MakePrompt( "Gfile > " ); status := Lib$Get_Foreign( argv, prompt, cmdlen ); IF status # 1 THEN WriteString(" missing gfile in command line " ); WriteLn; WriteLn; HALT END; argv[ cmdlen+1 ] := 0C; IF NOT OpenGfile( gf, argv, TRUE ) THEN WriteString("Error opening " ); WriteString( argv ); WriteLn; WriteLn; HALT END; END FireUp; PROCEDURE cmp( s, t : ARRAY OF CHAR ) : BOOLEAN; VAR i : CARDINAL; BEGIN FOR i := 0 TO HIGH( s ) DO IF s[i] # t[i] THEN RETURN FALSE END END; RETURN TRUE END cmp; PROCEDURE PolyLine; VAR rastunits : INTEGER; x,y : REAL; i : CARDINAL; pc : INTEGER; BEGIN ok := GetW( gf, pc ); IF pc <= 0 THEN RETURN END; ok := GetW( gf, x ); ok := GetW( gf, y ); Movea( x,y ); IF lpat = solid THEN FOR i := 2 TO CARDINAL( pc ) DO ok := GetW( gf, x ); ok := GetW( gf, y ); Drawa( x, y ); END; ELSIF lpat = dashed THEN rastunits := 5454; (* 25 visi, 25 invisible *) FOR i := 2 TO CARDINAL( pc ) DO ok := GetW( gf, x ); ok := GetW( gf, y ); Dasha( x, y, rastunits ); END; ELSIF lpat = dotted THEN rastunits := 1212; (* 5 visi, 5 invisible *) FOR i := 2 TO CARDINAL( pc ) DO ok := GetW( gf, x ); ok := GetW( gf, y ); Dasha( x, y, rastunits ); END; END END PolyLine; PROCEDURE DisplayText; VAR ade : ARRAY[ 1..80 ] OF INTEGER; i : CARDINAL; BEGIN ok := GetW( gf, x ); ok := GetW( gf, y ); ok := GetW( gf, rotation ); ok := GetW( gf, int ); (* character count *) ok := GetWords( gf, argv, 20 ); Movea( x, y ); Linef( ); (* so that x,y forms the top-left corner of text *) FOR i := 1 TO CARDINAL( int ) DO ade[ i ] := INTEGER( ORD( argv[ i ] ) ) END; Anstr( int, ade ) END DisplayText; VAR argv, prompt : ARRAY [1..80] OF CHAR; status, cmdlen : INTEGER; gf : File; ok : BOOLEAN; gcmd : ARRAY [1..4] OF CHAR; gin, gout : INTEGER; lowerx,lowery,upperx,uppery, xmin,ymin,xmax,ymax : REAL; xv : ARRAY [1..4] OF REAL; pc, I : CARDINAL; BaudRate : INTEGER; x, y : REAL; cht, cwid : REAL; rotation : REAL; slant : REAL; lineres : REAL; hcindex : INTEGER; vcindex : INTEGER; int : INTEGER; lpat : ( solid, dashed, dotted ); BEGIN FireUp( ); ok := GetW( gf, gcmd ); WHILE ok DO IF cmp( gcmd, "DRAW" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); IF lpat = solid THEN Drawa( x, y ) ELSIF lpat = dashed THEN int := 5454; (* 25 visi, 25 invisible *) Dasha( x, y, int ) ELSIF lpat = dotted THEN int := 1212; (* 5 visi, 5 invisible *) Dasha( x, y, int ) END ELSIF cmp( gcmd, "MOVE" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); Movea( x, y ) ELSIF cmp( gcmd, "PLIN" ) THEN PolyLine; ELSIF cmp( gcmd, "TEXT" ) THEN DisplayText; ELSIF cmp( gcmd, "COLO" ) THEN ok := GetW( gf, gcmd ); IF cmp( gcmd, "BLAC" ) THEN (* dummy code *) int:=1 ELSIF cmp( gcmd, "BLUE" ) THEN int:=2 ELSIF cmp( gcmd, "GREE" ) THEN int:=3 ELSIF cmp( gcmd, "REDD" ) THEN int:=4 END ELSIF cmp( gcmd, "LPAT" ) THEN ok := GetW( gf, gcmd ); IF cmp( gcmd, "SOLI" ) THEN lpat := solid ELSIF cmp( gcmd, "DASH" ) THEN lpat := dashed ELSIF cmp( gcmd, "DOTT" ) THEN lpat := dotted END ELSIF cmp( gcmd, "CSIZ" ) THEN ok := GetW( gf, cht ); ok := GetW( gf, cwid ); ok := GetW( gf, slant ); ok := GetW( gf, hcindex ); ok := GetW( gf, vcindex ); Chrsiz( hcindex ) ELSIF cmp( gcmd, "LORG" ) THEN ok := GetW( gf, int ); ELSIF cmp( gcmd, "FONT" ) THEN ok := GetW( gf, gcmd ); IF cmp( gcmd, "HARD" ) THEN int := 5 ELSIF cmp( gcmd, "ROMA" ) THEN int := 52 ELSIF cmp( gcmd, "STIC" ) THEN int := 51 ELSIF cmp( gcmd, "SCRI" ) THEN int := 53 ELSIF cmp( gcmd, "GOTH" ) THEN int := 54 ELSE int := 51 END; ELSIF cmp( gcmd, "WIND" ) THEN pc := 4; ok := GetWords( gf, xv, pc ); ELSIF cmp( gcmd, "MAPW" ) THEN pc := 4; ok := GetWords( gf, xv, pc ); Dwindo( xv[1],xv[3], xv[2],xv[4] ) ELSIF cmp( gcmd, "INIT" ) THEN ok := GetW( gf, BaudRate ); Initt( BaudRate ); Binitt(); (* Set up for 4662 plotter. remove comments for activation *) (* Term( 2, 1024 ); Plinit( 0 ); Swchar( 1 ); Plon( ); *) ELSIF cmp( gcmd, "ERAS" ) THEN Newpag ELSIF cmp( gcmd, "*EOG" ) THEN ok := FALSE END; IF ok THEN ok := GetW( gf, gcmd ) (* get next command *) END END; (* WHILE *) ok := CloseGfile( gf ); Ploff( ); Finitt( 0,0 ) END DDTEK.