home *** CD-ROM | disk | FTP | other *** search
- UNIT HPGL;
- (* definiert die gebräuchlichsten HPGL-Befehle *)
- (* setzt die UNIT PlGraph voraus, kann aber auch alleine benutzt werden *)
- (* weitere HPGL-Befehle werden in den nächsten Versionen implementiert *)
- (* die Datenausgabe erfolgt entweder direkt via Centronics ('PRN') oder
- in eine beliebige Datei *)
- (* zug. Datenfile : PLOTTER.DAT - enthält die hardwareabh. Werte *)
- (* Compiler : Turbo-Pascal 5.0
- Pgm.Vers.: 1.0.h
- Stand : 24.03.89
- 21.03.89 : P_PutPixel zeichnet jetzt nur noch einen Punkt
- P_Mark (vormals P_PutPixel) markiert mit einem Kreuz
- P_Rectangle zeichnet nun nur noch ein Rechteck
- P_Bar (vormals P_Rectangle) zeichnet ein ausgefülltes Rechteck
- Zeichensatz-Konstanten aus PlScript übernommen
- 22.03.89 : Einlesen der plotterabhängigen Werte von Disk
- 24.03.89 : die Grösse des Arbeitsbereiches (für GraphikWindow) wird nun
- ebenfalls aus PLOTTER.DAT eingelesen
- *)
-
- (* WICHTIGER HINWEIS :
- Sollen Real-Zahlen an den Plotter übergeben werden - wie z.B. in der
- PRC P_SetTextSlant - so müssen diese u n b e d i n g t formatiert
- werden !!! HPGL mag nämlich keine Leerzeichen zwischen dem Code und
- dem Zahlenwert ! Wer's nicht glaubt, der entferne in o.g. PRC die
- Formatierung :1:3 --> der Plotter meldet einen Error !
- *)
-
- INTERFACE
-
- TYPE strg80 = string[80];
-
- CONST (* Stiftfarben, sind wie die CRT-Farben definiert *)
- Black:byte=1; Blue:byte=1; Green:byte=2; Cyan:byte=3;
- Red:byte=4; Magenta:byte=5; Brown:byte=6; LightGray:byte=7;
- DarkGray:byte=8; LightBlue:byte=9; LightGreen:byte=10; LightCyan:byte=11;
- LightRed:byte=12; LightMagenta:byte=13; Yellow:byte=14; White:byte=15;
-
- CONST (* Linienarten, für den LINE TYPE-Befehl *)
- P_UserBitLn = 0; (* benutzerdefiniert *)
- P_DottedLn = 1; (* gepunktet *)
- P_DashedLn = 2; (* gestrichelt *)
- P_LgDashedLn = 3; (* gestrichelt, aber längere Striche, dafür kürzere Abstände *)
- P_CenterLn = 4; (* Strich-Punkt-Strich *)
- P_L1CenterLn = 5; (* Strich/lang-Strich/kurz-Strich/lang *)
- P_L2CenterLn = 6; (* Strich/lang-Strich/kurz-Strich/kurz-Strich/lang *)
- P_NormalLn = 7; (* gewöhnliche Linie *)
-
- CONST (* Schraffurarten, für den FILL STYLE-Befehl *)
- P_SolidFill = 1; (* voll Ausfüllen in beiden Richtungen *)
- P_SolidFillUni = 2; (* voll Ausfüllen in einer Richtungen *)
- P_LineFill = 3; (* Parallelschraffur *)
- P_XHatchFill = 4; (* Gitterschraffur *)
-
- CONST
- P_NormStep = 3; (* die Wiederholschrittweite für den LT-Befehl *)
- P_DefaultFont = 0; (* der Zeichensatz *)
- P_FontSize = 2; (* die Grösse des Zeichensatzes (in cm !!) *)
- P_HorizDir = 0; (* Text von links nach rechts *)
- P_VertDir = 1; (* Text von unten nach oben *)
-
- CONST (* Zeichensätze *)
- ANSI : BYTE = 0; JIS : BYTE = 6; Katakana : BYTE = 8;
- ISO : BYTE = 9; Swed1: BYTE = 30; Swed2 : BYTE = 31;
- Norw1: BYTE = 32; Germ : BYTE = 33; Franz : BYTE = 34;
- UK : BYTE = 35; Ital : BYTE = 36; Span : BYTE = 37;
- Port : BYTE = 38; Norw2: BYTE = 39;
-
- VAR
- OldExitProc:Pointer;
- Xaxmin,Xaxmax,Yaxmin,Yaxmax:real; { fuer USCALE }
- Uaxmin,Uaxmax,Vaxmin,Vaxmax:integer; { fuer Graphikwindow }
- XLi, XRe, YOb, YUn : INTEGER;
- (* ^ definieren den Zeichenbereich des Plotters für die PRC GraphikWindow
- der UNIT PlGraph. Masse in mm !!!
- BEISPIEL für den direkten Aufruf von GraphikWindow :
- GraphikWindow (20, round (uAXmAX /2 - 20 ), 20, round(vAXMAX / 2 - 20));
- entspricht :
- GraphikWindow (20, 181, 20, 118);
- und definiert einen Plotbereich von 161 * 98 mm
- bzw. mit den neuen Variablen :
- GraphikWindow (XLi, XRe, YOb, YUn);
- *)
- (*-----------------------------------------------*)
- CONST Komma = ','; (* HPGL-Trennbefehl *)
- Ende = ';'; (* HPGL-Befehlsende *)
-
- VAR Plot : TEXT;
- PFaktor : INTEGER;
- MaxColors : BYTE;
- (*-----------------------------------------------*)
- PROCEDURE OpenGraphik (PlotName : Strg80);
- PROCEDURE P_Line (X1, Y1, X2, Y2 : REAL);
- PROCEDURE P_LineTo (X, Y : REAL);
- PROCEDURE P_LineRel (X, Y : REAL);
- PROCEDURE P_MoveTo (X, Y : REAL);
- PROCEDURE P_SetColor (Farbe : BYTE);
- PROCEDURE P_PutPixel (X, Y : REAL; Farbe : BYTE);
- PROCEDURE P_Mark (X, Y : REAL; Farbe : BYTE);
- PROCEDURE P_Rectangle (X1, Y1, X2, Y2 : REAL);
- PROCEDURE P_Bar (X1, Y1, X2, Y2 : REAL);
- PROCEDURE P_Circle (Rad, Aufl : REAL);
- PROCEDURE P_Arc (X, Y, Winkel, Aufl : REAL);
- PROCEDURE P_Pie (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
- PROCEDURE P_PieSlice (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
- PROCEDURE P_SetLineStyle (Art, Pattern, Dicke : WORD);
- PROCEDURE P_SetLineWidth (Breite : REAL);
- PROCEDURE P_SetFillStyle (Typ, Abstand, Winkel : INTEGER);
- PROCEDURE P_SetViewPort (X1, Y1, X2, Y2 : WORD; Clip : BOOLEAN);
- PROCEDURE P_SetTextSlant (Tangens : REAL);
- PROCEDURE P_SetTextStyle (Font, Dir : INTEGER; Size : REAL);
- PROCEDURE P_OutTextXY (X, Y : INTEGER; Text : Strg80);
- PROCEDURE CloseGraphik;
- (*----------------------------------------------------*)
- IMPLEMENTATION
- (*----------------------------------------------------*)
- PROCEDURE DatenLesen;
- VAR t : TEXT;
- (* PLOTTER.DAT ist ein 8-zeiliges ASCII-File, das mit einem beliebigem
- Text-Editor modifiziert werden kann.
- Die verwendeten Standardwerte für einen DIN A3-Plotter sind in der
- PRC OpenGraphik auskommentiert
- *)
- BEGIN
- ASSIGN (t, 'Plotter.Dat');
- (*$I-*) RESET (t); (*$I+*)
- IF IOResult <> 0 THEN
- BEGIN
- WRITELN
- ('Datei mit den Plotter-Grundwerten nicht gefunden -- Abbruch !');
- HALT;
- END;
- READLN (t, UaxMax); READLN (t, VaxMax);
- READLN (t, PFaktor); READLN (t, MaxColors);
- READLN (t, XLi); READLN (t, XRe);
- READLN (t, YOb); READLN (t, YUn);
- CLOSE (t);
- END;
- (*----------------------------------------------------*)
- PROCEDURE OpenGraphik (PlotName : Strg80);
- (* PlotName : 'PRN' für direkte Ausgabe via Centronics
- 'name.ext' für Datei *)
-
- BEGIN
- OldExitProc:=ExitProc; ExitProc:=ADDR(CloseGraphik);
- ASSIGN (Plot, PlotName);
- REWRITE (Plot);
- WRITE (Plot, 'IN;');
- DatenLesen;
- {
- (* die folgenden 3 Zeilen sind an den jeweiligen Plotter anzupassen ! *)
- (* werden ab V.1.0.g von Disk. gelesen ! *)
- UaxMax := 403; VaxMax := 276; (* max. Blattgrösse in mm = DIN A3 *)
- PFaktor := 40; (* Plotterschritte = 0.025 mm Auflösung *)
- MaxColors := 8; (* max. Anzahl PlotterFarben *)
- }
- END;
- (*-----------------------------------------------*)
- FUNCTION Wert (Koord : REAL) : INTEGER;
- BEGIN Wert := ROUND (PFaktor * Koord); END;
- (*-----------------------------------------------*)
- PROCEDURE P_Line (X1, Y1, X2, Y2 : REAL);
-
- BEGIN
- WRITELN (Plot, 'PU', Wert (X1), Komma, Wert (Y1), Ende);
- WRITELN (Plot, 'PD', Wert (X1), Komma, Wert (Y1), Komma,
- Wert (X2), Komma, wert (Y2), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_LineTo (X, Y : REAL);
-
- BEGIN
- WRITE (Plot, 'PD', Ende);
- WRITELN (Plot, 'PA', Wert (X), Komma, Wert (Y), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_LineRel (X, Y : REAL);
-
- BEGIN
- WRITE (Plot, 'PD', Ende);
- WRITELN (Plot, 'PR', Wert (X), Komma, Wert (Y), Ende);
- WRITE (Plot, 'PA', Ende); (* wieder mit absoluten Koordinaten zeichnen ! *)
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_MoveTo (X, Y : REAL);
-
- BEGIN
- WRITELN (Plot, 'PU', Wert (X), Komma, Wert (Y), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetColor (Farbe : BYTE);
-
- BEGIN
- Farbe := (Farbe MOD SUCC(MaxColors));
- WRITELN (Plot, 'SP', Farbe, Ende)
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_PutPixel (X, Y : REAL; Farbe : BYTE);
-
- BEGIN
- P_SetColor (Farbe);
- WRITELN (Plot, 'PU', Wert (X), Komma, Wert (Y), Ende);
- WRITELN (Plot, 'PD', Wert (X), Komma, Wert (Y), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_Mark (X, Y : REAL; Farbe : BYTE);
- (* markiert angegebene Punkte mit einem Kreuz *)
-
- CONST Rad = 25;
- LStep = 1;
-
- BEGIN
- P_SetColor (Farbe);
- P_MoveTo (X, Y - 1); P_LineRel (0, 2);
- P_MoveTo (X - 1, Y); P_LineRel (2, 0);
-
- (*
- Variante 1 : Kreis --> zu langsam !
- P_MoveTo (X, Y); WRITELN (Plot, 'CI', Rad, Ende);
- *)
-
- (*
- Variante 2 : mit Line
- P_Line (X, Y - LStep, X , Y + LStep); P_Line (X - LStep, Y, X + LStep, Y);
- *)
-
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_Rectangle (X1, Y1, X2, Y2 : REAL);
- (* zeichnet ein Rechteck *)
- BEGIN
- P_MoveTo (X1, Y1);
- WRITELN (Plot, 'EA', Wert (X2), Komma, Wert (Y2), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_Bar (X1, Y1, X2, Y2 : REAL);
- (* zeichnet ein ausgefülltes Rechteck *)
- BEGIN
- (* X1 und Y1 werden in P_MoveTo skaliert ! *)
- P_MoveTo (X1, Y1);
- WRITELN (Plot, 'RA', Wert (X2), Komma, Wert (Y2), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_Circle (Rad, Aufl : REAL);
-
- BEGIN
- WRITELN (Plot, 'CI', Wert (Rad), Komma, ROUND (Aufl), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_Arc (X, Y, Winkel, Aufl : REAL);
- (* Beachten : Start an der Stiftposition ( = Bogenendpunkt) !
- X, Y sind die Koordinaten des Mittelpunktes ! *)
- BEGIN
- WRITELN (Plot, 'AA', Wert (X), Komma, Wert (Y), Komma,
- ROUND (Winkel), Komma, ROUND (Aufl), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_Pie (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
- (* zeichnet ein Kuchenstück *)
- BEGIN
- WRITELN (Plot, 'EW', Wert (Rad), Komma, ROUND (Startwinkel), Komma,
- ROUND (SegmentWinkel), Komma, ROUND (Aufl), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_PieSlice (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
- (* zeichnet ein ausgefülltes Kuchenstück *)
- BEGIN
- WRITELN (Plot, 'WG', Wert (Rad), Komma, ROUND (Startwinkel), Komma,
- ROUND (SegmentWinkel), Komma, ROUND (Aufl), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetLineStyle (Art, Pattern, Dicke : WORD);
- (* Dicke : Strichbreite / in dieser Version noch nicht implementiert ! *)
- (* Pattern : Wiederholschrittlänge, 2 oder 3 ergeben recht gefällige Linien *)
- BEGIN
- IF Art IN [0..6]
- THEN
- WRITELN (Plot, 'LT', Art, Komma, Pattern, Ende)
- ELSE
- WRITELN (Plot, 'DF', Ende);
- (* die 'normale' Linie ist nicht definiert, also Plotter initialisieren ! *)
- (* 'IN' ergibt Probleme, wenn der (HPGL-)Skalierungsbefehl SC benutzt wird ! *)
- (* 'DF' versetzt den Plotter wieder in den Normalzustand, ohne die definierte
- Skalierung zu verändern ! *)
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetLineWidth (Breite : REAL);
- BEGIN
- IF (Breite > 0.1) AND (Breite < 5.0)
- THEN WRITELN (Plot, 'PT', Breite:1:3, Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetFillStyle (Typ, Abstand, Winkel : INTEGER);
- (* Typ : 1 .. 4 *)
- (* Abstand : .. der Linien bei Parallel- und Gitterschraffur *)
- (* in Plottersteps ! z.B. Abstand 120 = 3 mm *)
- (* Winkel : Schraffurneigung, von der Horiz. ausgehend in 45-Grad-Steps *)
- (* 0 = horizontale, 90 = vertikale Schraffur *)
- (* lt. Plotter-Handbuch sollte der Typ "5" keine Schraffur zeichnen, mein *)
- (* Plotter schraffiert aber trotzdem mit der zuletzt gewählten Einstellung ! *)
- BEGIN
- IF Typ IN [1..4]
- THEN
- WRITELN (Plot, 'FT', Typ, Komma, Abstand, Komma, Winkel, Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetViewPort (X1, Y1, X2, Y2 : WORD; Clip : BOOLEAN);
- BEGIN
- WRITELN (Plot, 'IW', Wert (X1), Komma, Wert (Y1), Komma,
- Wert (X2), Komma, Wert (Y2), Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetTextSlant (Tangens : REAL);
- (* Textneigungswinkel *)
- BEGIN
- WRITELN (Plot, 'SL', Tangens:1:3, Ende);
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_SetTextStyle (Font, Dir : INTEGER; Size : REAL);
- (* Dir : 0 = Horizontal -- 1 = Vertikal *)
- (* nur diese beiden Richtungen werden gesetzt ! *)
- BEGIN
- WRITE (Plot, 'CS', Font, Ende); (* Zeichensatz *)
- CASE Dir OF 0 : WRITE (Plot, 'DI1,0', Ende) (* horizontal *)
- ELSE WRITE (Plot, 'DI0,1', Ende); (* vertikal *)
- END;
- (* Textgrösse *)
- WRITELN (Plot, 'SI', 0.5 * Size:1:3, Komma, Size:1:3, Ende);
- (* ^ Faktor zur Kompatibilität mit PGraph ! *)
- END;
- (*----------------------------------------------------*)
- PROCEDURE P_OutTextXY (X, Y : INTEGER; Text : Strg80);
- (* Vorsicht bei den Umlauten !! *)
- BEGIN
- P_MoveTo (X, Y);
- WRITELN (Plot, 'LB', Text, CHR (3), Ende);
- END;
- (*----------------------------------------------------*)
- {$F+} PROCEDURE CloseGraphik;
- BEGIN
- WRITELN (Plot, 'PU0,0;');
- WRITELN (Plot, 'IN;');
- WRITELN (Plot);
- CLOSE (Plot);
- ExitProc:=OldExitProc;
- END; {$F-}
- (*----------------------------------------------------*)
- END.