(* ------------------------------------------------------------------------
  :Program.       HPGL
  :Contents.      Funktionen zur Erstellung eines HPGL-Files
  :Author.        Carsten & Michael Mehring
  :Address.       Stöckhofstraße 23
  :Address.       D-7250 Leonberg 7 (Fed.Rep.Germany)
  :Phone.         07152/46548
  :History.       v1.0 C/M 28-May-89 Erste Version
  :History.       v1.1 C/M 01-Jun-89 cm_to_ScaleX/Y,TextBreite/HoeheHPGL
  :History.       v1.2 C/M 23-Jun-89 umgesetzt von TP4.0 auf M2Amiga
  :Copyright.     (c) by Carsten/Michael Mehring
  :Copyright.     declared as FreeWare
  :Language.      Modula-2
  :Translator.    M2Amiga 3.3d
  :Imports.       InOut2 [Bernd Preusing] AMOK #12
------------------------------------------------------------------------ *)
IMPLEMENTATION MODULE HPGL;


FROM InOut2           IMPORT SetOutput,WriteString,WriteLn,WriteInt,WriteCard,
                             CloseOutput,Write;
FROM FFPInOut         IMPORT WriteReal;
FROM FFPConversions   IMPORT RealToStr;
FROM Conversions      IMPORT ValToStr;
FROM Str              IMPORT Length;
FROM MathLibFFP       IMPORT pi,sin,cos;
FROM SYSTEM           IMPORT FFP;


(* ------------------------- IMPLEMENTATION ------------------------ *)


CONST Vorkomma  = 5;
      Nachkomma = 5;
      A4Breite  = 27.2;
      A4Hoehe   = 19.1;
      MaxPlotterUnitsX = 10900;
      MaxPlotterUnitsY = 7650;

VAR XStr,YStr: ARRAY [0..80] OF CHAR;
    Str      : ARRAY [0..80] OF CHAR;

    ScaleXMin,ScaleXMax,ScaleYMin,ScaleYMax : INTEGER;
    XPaperSize,YPaperSize                   : FFP;
    XTextSize,YTextSize                     : FFP;



(* private Routinen *)
PROCEDURE XYtoStr (x,y : FFP; VAR XStr,YStr : ARRAY OF CHAR);

VAR Err : BOOLEAN;
BEGIN
   RealToStr (x,XStr,Vorkomma,Nachkomma,FALSE,Err);
   RealToStr (y,YStr,Vorkomma,Nachkomma,FALSE,Err);
END XYtoStr; 


PROCEDURE OpenFile (FileName : ARRAY OF CHAR);

BEGIN
   SetOutput (FileName);
END OpenFile; 

PROCEDURE CloseFile;

BEGIN
   CloseOutput();
END CloseFile;



PROCEDURE SetInit;

BEGIN
   WriteString ("IN;"); WriteLn;
END SetInit; 

PROCEDURE SetPlotArea (XMin,YMin,XMax,YMax : CARDINAL);

BEGIN
   XPaperSize := FFP(ABS(XMax-XMin))/FFP(MaxPlotterUnitsX)*A4Breite;
   YPaperSize := FFP(ABS(YMax-YMin))/FFP(MaxPlotterUnitsY)*A4Hoehe;
   
   WriteString ("IP ");
   WriteCard (XMin,5);
   WriteString (",");
   WriteCard (YMin,5);
   WriteString (",");
   WriteCard (XMax,5);
   WriteString (",");
   WriteCard (YMax,5);
   WriteString (";"); 
END SetPlotArea;

PROCEDURE SetWindow (XMin,YMin,XMax,YMax : CARDINAL);

BEGIN
   WriteString ("IW ");
   WriteCard (XMin,5);
   WriteString (",");
   WriteCard (YMin,5);
   WriteString (",");
   WriteCard (XMax,5);
   WriteString (",");
   WriteCard (YMax,5);
   WriteString (";"); 
END SetWindow;


PROCEDURE cmtoScaleX(cm:FFP):FFP;
BEGIN
   RETURN (cm * FFP(ABS(ScaleXMin-ScaleXMax)) / XPaperSize);
END cmtoScaleX;

PROCEDURE cmtoScaleY(cm:FFP):FFP;
BEGIN
   RETURN (cm * FFP(ABS(ScaleYMin-ScaleYMax)) / YPaperSize);
END cmtoScaleY;

PROCEDURE TextBreiteHPGL (TextStr : ARRAY OF CHAR) : FFP;
BEGIN
   RETURN (cmtoScaleX (FFP(Length(TextStr))*XTextSize));
END TextBreiteHPGL;

PROCEDURE TextHoeheHPGL() : FFP;
BEGIN
   RETURN (cmtoScaleY (YTextSize));
END TextHoeheHPGL;


PROCEDURE SetScale (XMin,XMax,YMin,YMax : INTEGER);

BEGIN
   ScaleXMin := XMin;   ScaleXMax := XMax;
   ScaleYMin := YMin;   ScaleYMax := YMax;
   WriteString ("SC ");
   WriteInt (XMin,5);
   WriteString (",");
   WriteInt (XMax,5);
   WriteString (",");
   WriteInt (YMin,5);
   WriteString (",");
   WriteInt (YMax,5);
   WriteString (";"); 
END SetScale;



PROCEDURE SetPen (PenNr : CARDINAL);

BEGIN
   WriteString ("SP");
   WriteCard (PenNr,5);
   WriteString (";"); 
END SetPen;


PROCEDURE MoveHPGL (x,y : FFP);

BEGIN
   XYtoStr (x,y,XStr,YStr);
   WriteString ("PU "); WriteString (XStr);
   WriteString (" "); WriteString (YStr); WriteString (";");
END MoveHPGL;

PROCEDURE DotHPGL (x,y : FFP);

BEGIN
   MoveHPGL (x,y);
   WriteString ("PD; PU;"); WriteLn;
END DotHPGL;

PROCEDURE LineHPGL (x1,y1,x2,y2 : FFP);

BEGIN
   XYtoStr (x1,y1,XStr,YStr);
   WriteString ("PU "); WriteString (XStr);
   WriteString (" "); WriteString (YStr); WriteString (";");

   XYtoStr (x2,y2,XStr,YStr);
   WriteString ("PD "); WriteString (XStr);
   WriteString (" "); WriteString (YStr); WriteString (";");
   WriteLn;
END LineHPGL;

PROCEDURE LineToHPGL (x,y : FFP);

BEGIN
   XYtoStr (x,y,XStr,YStr);
   WriteString ("PD "); WriteString (XStr);
   WriteString (" "); WriteString (YStr); WriteString (";");
   WriteLn;
END LineToHPGL;


PROCEDURE TickLenHPGL (tp,tn : FFP);

VAR tpStr,tnStr : ARRAY [0..80] OF CHAR;
BEGIN
   IF (tp = 0.0) AND (tn = 0.0) THEN
      WriteString ("TL;"); WriteLn;
   ELSE
      XYtoStr (tp,tn,tpStr,tnStr);
      WriteString ("TL "); WriteString (tpStr);
      WriteString (","); WriteString (tnStr);
      WriteString (";");
      WriteLn;
   END;
END TickLenHPGL;

PROCEDURE XTick (x,y : FFP);

BEGIN
   MoveHPGL (x,y);
   WriteString ("XT;"); WriteLn;
END XTick;

PROCEDURE YTick (x,y : FFP);

BEGIN
   MoveHPGL (x,y);
   WriteString ("YT;"); WriteLn;
END YTick;

PROCEDURE BorderHPGL;

BEGIN
   LineHPGL   (FFP(ScaleXMin),FFP(ScaleYMin),FFP(ScaleXMax),FFP(ScaleYMin));
   LineToHPGL (FFP(ScaleXMax),FFP(ScaleYMax));
   LineToHPGL (FFP(ScaleXMin),FFP(ScaleYMax));
   LineToHPGL (FFP(ScaleXMin),FFP(ScaleYMin));
   WriteLn;
END BorderHPGL;


PROCEDURE TextSizeHPGL (Breite,Hoehe : FFP);

BEGIN
   XYtoStr (Breite,Hoehe,XStr,YStr);
   WriteString ("SI "); WriteString (XStr); 
   WriteString (","); WriteString (YStr);
   WriteString (";");
   XTextSize := Breite;
   YTextSize := Hoehe;
END TextSizeHPGL;

PROCEDURE TextDirHPGL (theta : FFP);

VAR run,rise       : FFP;
    RunStr,RiseStr : ARRAY [0..80] OF CHAR;
    thetabogen     : FFP;
BEGIN
   thetabogen := theta * pi / 180.0;
   rise := XTextSize*sin(thetabogen);
   run  := XTextSize*cos(thetabogen);
   XYtoStr (run,rise,RunStr,RiseStr);
   WriteString ("DI "); WriteString (RunStr);
   WriteString (","); WriteString (RiseStr);
   WriteString (";");
END TextDirHPGL;


PROCEDURE TextHPGL (x,y : FFP; TextStr : ARRAY OF CHAR);

BEGIN
   MoveHPGL (x,y);
   WriteString ("LB ");
   WriteString (TextStr);
   Write (3C);
   WriteLn;
END TextHPGL;


BEGIN
   XPaperSize := A4Breite;
   YPaperSize := A4Hoehe;
   XTextSize  := 0.19;
   YTextSize  := 0.27;
END HPGL.
