MODULE DDHP7221; (* This module takes a Gfile and plots the graphics instructions on a HP 7221 series (B|S|T) plotters. To use this driver type $ ddhp gfile Where gfile is the file containing graphics commands. 1. INIT baudrate|hp_model 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 HP7221 IMPORT Plots,PenSpd,Draw,Move,ForSymbol,NewPen,DasLna,Csizea, Lorg,Cfont,Limit,SetIn,Locate,Mapuu,PlotOf,PlotOn; FROM InOut IMPORT WriteString, WriteLn, Read, ReadLn; TYPE Linepatterns = ( solid, dashed, dotted ); 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 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 pc : INTEGER; x,y: REAL; i : CARDINAL; BEGIN ok := GetW( gf, pc ); IF pc <= 0 THEN RETURN END; ok := GetW( gf, x ); ok := GetW( gf, y ); Move( x, y ); FOR i := 2 TO CARDINAL( pc ) DO ok := GetW( gf, x ); ok := GetW( gf, y ); Draw( x,y ); END; END PolyLine; PROCEDURE SetLinepattern; VAR code : INTEGER; res : REAL; BEGIN IF linetype = solid THEN code := 1; res := 0.5; DasLna( code, res ); ELSIF linetype = dashed THEN code := 2; res := 0.125; DasLna( code, res ); ELSIF linetype = dotted THEN code := 8; res := 0.075; DasLna( code, res ); END END SetLinepattern; PROCEDURE DisplayText; VAR storelpat : Linepatterns; BEGIN ok := GetW( gf, x ); ok := GetW( gf, y ); ok := GetW( gf, rotation ); ok := GetW( gf, int ); (* character count *) ok := GetWords( gf, argv, 20 ); storelpat := linetype; linetype := solid; SetLinepattern; ForSymbol( x, y, cht, argv, rotation, int ); linetype := storelpat; SetLinepattern; 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; linetype : Linepatterns; hcindex : INTEGER; vcindex : INTEGER; int : INTEGER; BEGIN MakePrompt( "Gfile > " ); status := Lib$Get_Foreign( argv, prompt, cmdlen ); IF status # 1 THEN WriteString(" Error in processing command line args" ); WriteLn; HALT END; argv[ cmdlen+1 ] := 0C; IF NOT OpenGfile( gf, argv, TRUE ) THEN WriteString("Error opening " ); WriteString( argv ); WriteLn; HALT END; int := 1; (* init level in call to Plots *) gin := 5; (* standard fortran input *) gout := 6; (* standard fortran output *) Plots( int, gin, gout ); ok := GetW( gf, gcmd ); WHILE ok DO IF cmp( gcmd, "DRAW" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); Draw( x, y ) ELSIF cmp( gcmd, "MOVE" ) THEN ok := GetW( gf, x ); ok := GetW( gf, y ); Move( 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 int:=1; NewPen( int ) ELSIF cmp( gcmd, "BLUE" ) THEN int:=2; NewPen( int ) ELSIF cmp( gcmd, "GREE" ) THEN int:=3; NewPen( int ) ELSIF cmp( gcmd, "REDD" ) THEN int:=4; NewPen( int ) END ELSIF cmp( gcmd, "LPAT" ) THEN ok := GetW( gf, gcmd ); linetype := solid; IF cmp( gcmd, "SOLI" ) THEN linetype := solid; ELSIF cmp( gcmd, "DASH" ) THEN linetype := dashed; ELSIF cmp( gcmd, "DOTT" ) THEN linetype := dotted END; SetLinepattern; 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 ); x := cwid/cht; (* ratio of width to hite *) Csizea( cht, x, slant ) ELSIF cmp( gcmd, "LORG" ) THEN ok := GetW( gf, int ); Lorg( int ) ELSIF cmp( gcmd, "FONT" ) THEN ok := GetW( gf, gcmd ); IF cmp( gcmd, "HARD" ) THEN int := 5 ELSIF cmp( gcmd, "ROMA" ) THEN int := 53 ELSIF cmp( gcmd, "STIC" ) THEN int := 51 ELSIF cmp( gcmd, "SCRI" ) THEN int := 52 ELSIF cmp( gcmd, "GOTH" ) THEN int := 54 ELSE int := 51 END; Cfont( 0, int ) ELSIF cmp( gcmd, "WIND" ) THEN pc := 4; ok := GetWords( gf, xv, pc ); Limit( xv[1],xv[3], xv[2],xv[4] ); SetIn; Locate( xv[1],xv[3], xv[2],xv[4] ); int := 20; PenSpd( int ); int := 51; Cfont( 0, int ); NewPen( 1 ); PenSpd( BaudRate) ELSIF cmp( gcmd, "MAPW" ) THEN pc := 4; ok := GetWords( gf, xv, pc ); Mapuu( xv[1],xv[3], xv[2],xv[4] ) ELSIF cmp( gcmd, "INIT" ) THEN ok := GetW( gf, BaudRate ); (* BaudRate specifies pen speed for HP *) ELSIF cmp( gcmd, "ERAS" ) THEN PlotOf( ); WriteString("Pause for paper change, "); WriteString("hit RETURN to continue.." ); WriteLn; Read( argv[1] ); ReadLn; PlotOn( ) ELSIF cmp( gcmd, "*EOG" ) THEN ok := FALSE END; IF ok THEN ok := GetW( gf, gcmd ) (* get next command *) END END; (* WHILE *) ok := CloseGfile( gf ); int := 0; NewPen( int ); (* put pen away *) PlotOf( ) END DDHP7221.