home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 09 / hpgl / hpgl.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-03-24  |  13.3 KB  |  349 lines

  1. UNIT HPGL;
  2. (* definiert die gebräuchlichsten HPGL-Befehle *)
  3. (* setzt die UNIT PlGraph voraus, kann aber auch alleine benutzt werden *)
  4. (* weitere HPGL-Befehle werden in den nächsten Versionen implementiert *)
  5. (* die Datenausgabe erfolgt entweder direkt via Centronics ('PRN') oder
  6.    in eine beliebige Datei *)
  7. (* zug. Datenfile : PLOTTER.DAT - enthält die hardwareabh. Werte *)
  8. (* Compiler : Turbo-Pascal 5.0
  9.    Pgm.Vers.: 1.0.h
  10.    Stand    : 24.03.89
  11.    21.03.89 : P_PutPixel zeichnet jetzt nur noch einen Punkt
  12.           P_Mark (vormals P_PutPixel) markiert mit einem Kreuz
  13.           P_Rectangle zeichnet nun nur noch ein Rechteck
  14.           P_Bar (vormals P_Rectangle) zeichnet ein ausgefülltes Rechteck
  15.           Zeichensatz-Konstanten aus PlScript übernommen
  16.    22.03.89 : Einlesen der plotterabhängigen Werte von Disk
  17.    24.03.89 : die Grösse des Arbeitsbereiches (für GraphikWindow) wird nun
  18.           ebenfalls aus PLOTTER.DAT eingelesen
  19. *)
  20.  
  21. (* WICHTIGER HINWEIS :
  22.    Sollen Real-Zahlen an den Plotter übergeben werden - wie z.B. in der
  23.    PRC P_SetTextSlant - so müssen diese  u n b e d i n g t  formatiert
  24.    werden !!! HPGL mag nämlich keine Leerzeichen zwischen dem Code und
  25.    dem Zahlenwert ! Wer's nicht glaubt, der entferne in o.g. PRC die
  26.    Formatierung :1:3 --> der Plotter meldet einen Error !
  27. *)
  28.  
  29. INTERFACE
  30.  
  31. TYPE  strg80 = string[80];
  32.  
  33. CONST   (* Stiftfarben, sind wie die CRT-Farben definiert *)
  34.   Black:byte=1;     Blue:byte=1;          Green:byte=2;       Cyan:byte=3;
  35.   Red:byte=4;       Magenta:byte=5;       Brown:byte=6;       LightGray:byte=7;
  36.   DarkGray:byte=8;  LightBlue:byte=9;     LightGreen:byte=10; LightCyan:byte=11;
  37.   LightRed:byte=12; LightMagenta:byte=13; Yellow:byte=14;     White:byte=15;
  38.  
  39. CONST  (* Linienarten, für den LINE TYPE-Befehl *)
  40.   P_UserBitLn  = 0; (* benutzerdefiniert *)
  41.   P_DottedLn   = 1; (* gepunktet *)
  42.   P_DashedLn   = 2; (* gestrichelt *)
  43.   P_LgDashedLn = 3; (* gestrichelt, aber längere Striche, dafür kürzere Abstände *)
  44.   P_CenterLn   = 4; (* Strich-Punkt-Strich *)
  45.   P_L1CenterLn = 5; (* Strich/lang-Strich/kurz-Strich/lang *)
  46.   P_L2CenterLn = 6; (* Strich/lang-Strich/kurz-Strich/kurz-Strich/lang *)
  47.   P_NormalLn   = 7; (* gewöhnliche Linie *)
  48.  
  49. CONST  (* Schraffurarten, für den FILL STYLE-Befehl *)
  50.   P_SolidFill    = 1;  (* voll Ausfüllen in beiden Richtungen *)
  51.   P_SolidFillUni = 2;  (* voll Ausfüllen in einer Richtungen *)
  52.   P_LineFill     = 3;  (* Parallelschraffur *)
  53.   P_XHatchFill   = 4;  (* Gitterschraffur *)
  54.  
  55. CONST
  56.   P_NormStep = 3;      (* die Wiederholschrittweite für den LT-Befehl *)
  57.   P_DefaultFont = 0;   (* der Zeichensatz *)
  58.   P_FontSize = 2;      (* die Grösse des Zeichensatzes  (in cm !!) *)
  59.   P_HorizDir = 0;      (* Text von links nach rechts *)
  60.   P_VertDir = 1;       (* Text von unten nach oben *)
  61.  
  62. CONST  (* Zeichensätze *)
  63.    ANSI : BYTE = 0;   JIS  : BYTE = 6;    Katakana : BYTE = 8;
  64.    ISO  : BYTE = 9;   Swed1: BYTE = 30;   Swed2    : BYTE = 31;
  65.    Norw1: BYTE = 32;  Germ : BYTE = 33;   Franz    : BYTE = 34;
  66.    UK   : BYTE = 35;  Ital : BYTE = 36;   Span     : BYTE = 37;
  67.    Port : BYTE = 38;  Norw2: BYTE = 39;
  68.  
  69. VAR
  70.   OldExitProc:Pointer;
  71.   Xaxmin,Xaxmax,Yaxmin,Yaxmax:real;              { fuer USCALE }
  72.   Uaxmin,Uaxmax,Vaxmin,Vaxmax:integer;              { fuer Graphikwindow }
  73.   XLi, XRe, YOb, YUn         : INTEGER;
  74.     (* ^ definieren den Zeichenbereich des Plotters für die PRC GraphikWindow
  75.        der UNIT PlGraph. Masse in mm !!!
  76.       BEISPIEL für den direkten Aufruf von GraphikWindow :
  77.       GraphikWindow (20, round (uAXmAX /2  - 20 ), 20, round(vAXMAX / 2 - 20));
  78.       entspricht :
  79.       GraphikWindow (20, 181, 20, 118);
  80.       und definiert einen Plotbereich von 161 * 98 mm
  81.       bzw. mit den neuen Variablen :
  82.       GraphikWindow (XLi, XRe, YOb, YUn);
  83.     *)
  84. (*-----------------------------------------------*)
  85. CONST  Komma = ',';            (* HPGL-Trennbefehl *)
  86.        Ende  = ';';            (* HPGL-Befehlsende *)
  87.  
  88. VAR    Plot        : TEXT;
  89.        PFaktor     : INTEGER;
  90.        MaxColors   : BYTE;
  91. (*-----------------------------------------------*)
  92.   PROCEDURE OpenGraphik  (PlotName : Strg80);
  93.   PROCEDURE P_Line (X1, Y1, X2, Y2 : REAL);
  94.   PROCEDURE P_LineTo (X, Y : REAL);
  95.   PROCEDURE P_LineRel (X, Y : REAL);
  96.   PROCEDURE P_MoveTo (X, Y : REAL);
  97.   PROCEDURE P_SetColor (Farbe : BYTE);
  98.   PROCEDURE P_PutPixel (X, Y : REAL; Farbe : BYTE);
  99.   PROCEDURE P_Mark (X, Y : REAL; Farbe : BYTE);
  100.   PROCEDURE P_Rectangle (X1, Y1, X2, Y2 : REAL);
  101.   PROCEDURE P_Bar (X1, Y1, X2, Y2 : REAL);
  102.   PROCEDURE P_Circle (Rad, Aufl : REAL);
  103.   PROCEDURE P_Arc (X, Y, Winkel, Aufl : REAL);
  104.   PROCEDURE P_Pie (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
  105.   PROCEDURE P_PieSlice (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
  106.   PROCEDURE P_SetLineStyle (Art, Pattern, Dicke : WORD);
  107.   PROCEDURE P_SetLineWidth (Breite : REAL);
  108.   PROCEDURE P_SetFillStyle (Typ, Abstand, Winkel : INTEGER);
  109.   PROCEDURE P_SetViewPort (X1, Y1, X2, Y2 : WORD; Clip : BOOLEAN);
  110.   PROCEDURE P_SetTextSlant  (Tangens : REAL);
  111.   PROCEDURE P_SetTextStyle (Font, Dir : INTEGER; Size : REAL);
  112.   PROCEDURE P_OutTextXY (X, Y : INTEGER;  Text : Strg80);
  113.   PROCEDURE CloseGraphik;
  114. (*----------------------------------------------------*)
  115. IMPLEMENTATION
  116. (*----------------------------------------------------*)
  117. PROCEDURE DatenLesen;
  118. VAR t : TEXT;
  119. (* PLOTTER.DAT ist ein 8-zeiliges ASCII-File, das mit einem beliebigem
  120.    Text-Editor modifiziert werden kann.
  121.    Die verwendeten Standardwerte für einen DIN A3-Plotter sind in der
  122.    PRC OpenGraphik auskommentiert
  123. *)
  124. BEGIN
  125.   ASSIGN (t, 'Plotter.Dat');
  126.   (*$I-*)  RESET (t); (*$I+*)
  127.   IF IOResult <> 0 THEN
  128.     BEGIN
  129.       WRITELN
  130.       ('Datei mit den Plotter-Grundwerten nicht gefunden -- Abbruch !');
  131.       HALT;
  132.     END;
  133.   READLN (t, UaxMax);  READLN (t, VaxMax);
  134.   READLN (t, PFaktor); READLN (t, MaxColors);
  135.   READLN (t, XLi);     READLN (t, XRe);
  136.   READLN (t, YOb);     READLN (t, YUn);
  137.   CLOSE (t);
  138. END;
  139. (*----------------------------------------------------*)
  140. PROCEDURE OpenGraphik  (PlotName : Strg80);
  141. (* PlotName : 'PRN' für direkte Ausgabe via Centronics
  142.           'name.ext' für Datei                     *)
  143.  
  144. BEGIN
  145.   OldExitProc:=ExitProc; ExitProc:=ADDR(CloseGraphik);
  146.   ASSIGN (Plot, PlotName);
  147.   REWRITE (Plot);
  148.   WRITE (Plot, 'IN;');
  149.   DatenLesen;
  150. {
  151.   (* die folgenden 3 Zeilen sind an den jeweiligen Plotter anzupassen ! *)
  152.   (* werden ab V.1.0.g von Disk. gelesen ! *)
  153.   UaxMax := 403;  VaxMax := 276;    (* max. Blattgrösse in mm = DIN A3      *)
  154.   PFaktor := 40;                    (* Plotterschritte = 0.025 mm Auflösung *)
  155.   MaxColors := 8;                   (* max. Anzahl PlotterFarben            *)
  156. }
  157. END;
  158. (*-----------------------------------------------*)
  159. FUNCTION Wert (Koord : REAL) : INTEGER;
  160. BEGIN   Wert := ROUND (PFaktor * Koord);  END;
  161. (*-----------------------------------------------*)
  162. PROCEDURE P_Line (X1, Y1, X2, Y2 : REAL);
  163.  
  164. BEGIN
  165.   WRITELN (Plot, 'PU', Wert (X1), Komma, Wert (Y1), Ende);
  166.   WRITELN (Plot, 'PD', Wert (X1), Komma, Wert (Y1), Komma,
  167.                Wert (X2), Komma, wert (Y2), Ende);
  168. END;
  169. (*----------------------------------------------------*)
  170. PROCEDURE P_LineTo (X, Y : REAL);
  171.  
  172. BEGIN
  173.   WRITE (Plot, 'PD', Ende);
  174.   WRITELN (Plot, 'PA', Wert (X), Komma, Wert (Y), Ende);
  175. END;
  176. (*----------------------------------------------------*)
  177. PROCEDURE P_LineRel (X, Y : REAL);
  178.  
  179. BEGIN
  180.   WRITE (Plot, 'PD', Ende);
  181.   WRITELN (Plot, 'PR', Wert (X), Komma, Wert (Y), Ende);
  182.   WRITE (Plot, 'PA', Ende);  (* wieder mit absoluten Koordinaten zeichnen ! *)
  183. END;
  184. (*----------------------------------------------------*)
  185. PROCEDURE P_MoveTo (X, Y : REAL);
  186.  
  187. BEGIN
  188.   WRITELN (Plot, 'PU', Wert (X), Komma, Wert (Y), Ende);
  189. END;
  190. (*----------------------------------------------------*)
  191. PROCEDURE P_SetColor (Farbe : BYTE);
  192.  
  193. BEGIN
  194.   Farbe := (Farbe MOD SUCC(MaxColors));
  195.   WRITELN (Plot, 'SP', Farbe, Ende)
  196. END;
  197. (*----------------------------------------------------*)
  198. PROCEDURE P_PutPixel (X, Y : REAL; Farbe : BYTE);
  199.  
  200. BEGIN
  201.   P_SetColor (Farbe);
  202.   WRITELN (Plot, 'PU', Wert (X), Komma, Wert (Y), Ende);
  203.   WRITELN (Plot, 'PD', Wert (X), Komma, Wert (Y), Ende);
  204. END;
  205. (*----------------------------------------------------*)
  206. PROCEDURE P_Mark (X, Y : REAL; Farbe : BYTE);
  207. (* markiert angegebene Punkte mit einem Kreuz *)
  208.  
  209. CONST   Rad   = 25;
  210.     LStep = 1;
  211.  
  212. BEGIN
  213.   P_SetColor (Farbe);
  214.   P_MoveTo (X, Y - 1);  P_LineRel (0, 2);
  215.   P_MoveTo (X - 1, Y);  P_LineRel (2, 0);
  216.  
  217.   (*
  218.    Variante 1 : Kreis --> zu langsam !
  219.    P_MoveTo (X, Y);   WRITELN (Plot, 'CI', Rad, Ende);
  220.   *)
  221.  
  222.   (*
  223.    Variante 2 : mit Line
  224.    P_Line (X, Y - LStep, X , Y + LStep);  P_Line (X - LStep, Y, X + LStep, Y);
  225.   *)
  226.  
  227. END;
  228. (*----------------------------------------------------*)
  229. PROCEDURE P_Rectangle (X1, Y1, X2, Y2 : REAL);
  230. (* zeichnet ein Rechteck *)
  231. BEGIN
  232.    P_MoveTo (X1, Y1);
  233.    WRITELN (Plot, 'EA', Wert (X2), Komma, Wert (Y2), Ende);
  234. END;
  235. (*----------------------------------------------------*)
  236. PROCEDURE P_Bar (X1, Y1, X2, Y2 : REAL);
  237. (* zeichnet ein ausgefülltes Rechteck *)
  238. BEGIN
  239. (* X1 und Y1 werden in P_MoveTo skaliert ! *)
  240.    P_MoveTo (X1, Y1);
  241.    WRITELN (Plot, 'RA', Wert (X2), Komma, Wert (Y2), Ende);
  242. END;
  243. (*----------------------------------------------------*)
  244. PROCEDURE P_Circle (Rad, Aufl : REAL);
  245.  
  246. BEGIN
  247.   WRITELN (Plot, 'CI', Wert (Rad), Komma, ROUND (Aufl), Ende);
  248. END;
  249. (*----------------------------------------------------*)
  250. PROCEDURE P_Arc (X, Y, Winkel, Aufl : REAL);
  251. (* Beachten : Start an der Stiftposition ( = Bogenendpunkt) !
  252.           X, Y sind die Koordinaten des Mittelpunktes ! *)
  253. BEGIN
  254.   WRITELN (Plot, 'AA', Wert (X), Komma, Wert (Y), Komma,
  255.        ROUND (Winkel), Komma, ROUND (Aufl), Ende);
  256. END;
  257. (*----------------------------------------------------*)
  258. PROCEDURE P_Pie (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
  259. (* zeichnet ein Kuchenstück *)
  260. BEGIN
  261.   WRITELN (Plot, 'EW', Wert (Rad), Komma, ROUND (Startwinkel), Komma,
  262.        ROUND (SegmentWinkel), Komma, ROUND (Aufl), Ende);
  263. END;
  264. (*----------------------------------------------------*)
  265. PROCEDURE P_PieSlice (Rad, StartWinkel, SegmentWinkel, Aufl : REAL);
  266. (* zeichnet ein ausgefülltes Kuchenstück *)
  267. BEGIN
  268.   WRITELN (Plot, 'WG', Wert (Rad), Komma, ROUND (Startwinkel), Komma,
  269.        ROUND (SegmentWinkel), Komma, ROUND (Aufl), Ende);
  270. END;
  271. (*----------------------------------------------------*)
  272. PROCEDURE P_SetLineStyle (Art, Pattern, Dicke : WORD);
  273. (* Dicke   : Strichbreite / in dieser Version noch nicht implementiert ! *)
  274. (* Pattern : Wiederholschrittlänge, 2 oder 3 ergeben recht gefällige Linien *)
  275. BEGIN
  276.   IF Art IN [0..6]
  277.     THEN
  278.      WRITELN (Plot, 'LT', Art, Komma, Pattern, Ende)
  279.     ELSE
  280.      WRITELN (Plot, 'DF', Ende);
  281. (* die 'normale' Linie ist nicht definiert, also Plotter initialisieren ! *)
  282. (* 'IN' ergibt Probleme, wenn der (HPGL-)Skalierungsbefehl SC benutzt wird ! *)
  283. (* 'DF' versetzt den Plotter wieder in den Normalzustand, ohne die definierte
  284.     Skalierung zu verändern ! *)
  285. END;
  286. (*----------------------------------------------------*)
  287. PROCEDURE P_SetLineWidth (Breite : REAL);
  288. BEGIN
  289.   IF (Breite > 0.1) AND (Breite < 5.0)
  290.     THEN WRITELN (Plot, 'PT', Breite:1:3, Ende);
  291. END;
  292. (*----------------------------------------------------*)
  293. PROCEDURE P_SetFillStyle (Typ, Abstand, Winkel : INTEGER);
  294. (* Typ : 1 .. 4 *)
  295. (* Abstand : .. der Linien bei Parallel- und Gitterschraffur *)
  296. (*           in Plottersteps ! z.B. Abstand 120 = 3 mm *)
  297. (* Winkel  : Schraffurneigung, von der Horiz. ausgehend in 45-Grad-Steps *)
  298. (*           0 = horizontale, 90 = vertikale Schraffur *)
  299. (* lt. Plotter-Handbuch sollte der Typ "5" keine Schraffur zeichnen, mein *)
  300. (* Plotter schraffiert aber trotzdem mit der zuletzt gewählten Einstellung ! *)
  301. BEGIN
  302.   IF Typ IN [1..4]
  303.     THEN
  304.      WRITELN (Plot, 'FT', Typ, Komma, Abstand, Komma, Winkel, Ende);
  305. END;
  306. (*----------------------------------------------------*)
  307. PROCEDURE P_SetViewPort (X1, Y1, X2, Y2 : WORD; Clip : BOOLEAN);
  308. BEGIN
  309.    WRITELN (Plot, 'IW', Wert (X1), Komma, Wert (Y1), Komma,
  310.             Wert (X2), Komma, Wert (Y2), Ende);
  311. END;
  312. (*----------------------------------------------------*)
  313. PROCEDURE P_SetTextSlant  (Tangens : REAL);
  314. (* Textneigungswinkel *)
  315. BEGIN
  316. WRITELN (Plot, 'SL', Tangens:1:3, Ende);
  317. END;
  318. (*----------------------------------------------------*)
  319. PROCEDURE P_SetTextStyle (Font, Dir : INTEGER; Size : REAL);
  320. (* Dir :   0 = Horizontal  --  1 = Vertikal *)
  321. (* nur diese beiden Richtungen werden gesetzt ! *)
  322. BEGIN
  323.   WRITE (Plot, 'CS', Font, Ende);                (* Zeichensatz *)
  324.   CASE Dir OF 0 : WRITE (Plot, 'DI1,0', Ende)    (* horizontal  *)
  325.       ELSE    WRITE (Plot, 'DI0,1', Ende);   (* vertikal    *)
  326.   END;
  327.                                 (* Textgrösse *)
  328.   WRITELN (Plot, 'SI', 0.5 * Size:1:3, Komma, Size:1:3, Ende);
  329.              (* ^ Faktor zur Kompatibilität mit PGraph ! *)
  330. END;
  331. (*----------------------------------------------------*)
  332. PROCEDURE P_OutTextXY (X, Y : INTEGER;  Text : Strg80);
  333. (* Vorsicht bei den Umlauten !! *)
  334. BEGIN
  335.   P_MoveTo (X, Y);
  336.   WRITELN (Plot, 'LB', Text, CHR (3), Ende);
  337. END;
  338. (*----------------------------------------------------*)
  339. {$F+} PROCEDURE CloseGraphik;
  340. BEGIN
  341.   WRITELN (Plot, 'PU0,0;');
  342.   WRITELN (Plot, 'IN;');
  343.   WRITELN (Plot);
  344.   CLOSE (Plot);
  345.   ExitProc:=OldExitProc;
  346. END; {$F-}
  347. (*----------------------------------------------------*)
  348. END.
  349.