home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
td187src.lzh
/
CSSPECIA.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
33KB
|
1,013 lines
IMPLEMENTATION MODULE CSspecial;
FROM BezierCurve IMPORT ComputeRealBezier;
FROM Dialoge IMPORT BusyStart, BusyEnd;
FROM Diverses IMPORT round, GetFSelText, NumAlert, min, max;
FROM FileIO IMPORT Fopen, EOF, AgainChar, Reset, Close, ReadChar,
ReadLn, AgainLine, Rewrite, WriteLn;
FROM ObjectUtilities IMPORT FillObject;
FROM Types IMPORT TextPosTyp, DrawObjectTyp,
LatexSpecials,
CodeAryTyp, ObjectPtrTyp;
FROM SYSTEM IMPORT BYTE, WORD, ADDRESS , ADR ;
FROM Storage IMPORT ALLOCATE , DEALLOCATE ;
IMPORT CommonData ;
IMPORT GetFile;
IMPORT MathLib0 ;
IMPORT MagicConvert ;
IMPORT MagicDOS ;
IMPORT MagicStrings ;
IMPORT MagicSys ;
IMPORT Variablen ;
IMPORT mtAlerts;
(**
IMPORT Debug;
IMPORT RTD;
**)
(**
VAR UseCSspecial : BOOLEAN;
**)
CONST CSBug = TRUE; (* Sobald Treiber Werte der unit mit Vorfaktoren *)
BugMsg = FALSE; (* erkennen auf FALSE setzen... (für cond.comp.) *)
TYPE chset = SET OF CHAR;
CONST Magic = -29564; (* Test auf ungültige Zahl *)
FMagic = -29564.0; (* Test auf ungültige Zahl *)
Integers = chset{'0'..'9','+','-'};
Reals = chset{'0'..'9','+','-','.'};
CS1Idlong = 'CS-Graphics V 1';
(*
CS2Idlong = 'CS-Graphics V 2';
*)
CSIdshort = 'CS-Graphics';
VAR FileHandle, oldlineval, oldthickval : INTEGER;
(* $D+*)
PROCEDURE OpenFile(REF FileName : ARRAY OF CHAR);
VAR Line, temp : ARRAY [0..29] OF CHAR;
BEGIN
Rewrite(FileHandle, FileName);
(*
IF CommonData.Usespecial = cstrunk2 THEN
WriteLn(FileHandle, CS2Idlong);
ELSE
WriteLn(FileHandle, CS1Idlong);
END;
*)
WriteLn(FileHandle, CS1Idlong);
WriteLn(FileHandle, "% Created by TeX-Draw by Jens Pirnay");
temp := "r";
WriteLn(FileHandle, temp); (* Reset *)
(*$? CSBug AND BugMsg:
WriteLn(FileHandle, "% Bug in Driver? Only pure units e.g. 1mm are recognized!"); (* Reset *)
*)
(*$? CSBug:
Line := 'u 1';
*)
(*$? NOT CSBug:
Line := 'u ';
Variablen.FactorToStr(temp);
MagicStrings.Append ( temp, Line);
*)
Variablen.UnitToStr(temp);
MagicStrings.Append ( temp, Line);
WriteLn(FileHandle, Line); (* Unitlength *)
oldlineval := 0;
oldthickval := 1; (* 0.4 pt *)
END OpenFile;
(* $D-*)
PROCEDURE Do1Line (x : INTEGER; VAR temp : ARRAY OF CHAR);
VAR i : INTEGER; found : INTEGER;
BEGIN
(*$? CSBug: Variablen.ValueToStr ( x , temp ) ; *)
(*$? NOT CSBug: Variablen.SimpleValueToStr ( x , temp ) ; *)
END Do1Line;
PROCEDURE DoLine(x1, y1, x2, y2 : INTEGER);
VAR line : ARRAY [0..255] OF CHAR;
temp : ARRAY [0..19] OF CHAR;
BEGIN
Do1Line(x1, line);
Do1Line(y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
MagicStrings.Append(' l ', line);
Do1Line(x2-x1, temp);
MagicStrings.Append(temp, line);
Do1Line(y2-y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END DoLine;
PROCEDURE DoBetterLine(x1, y1, x2, y2 : MagicSys.lINTEGER);
(* Werte sind das 10-fache des normalen *)
VAR line : ARRAY [0..255] OF CHAR;
temp : ARRAY [0..19] OF CHAR;
PROCEDURE Do10Line (x : MagicSys.lINTEGER; VAR temp : ARRAY OF CHAR);
VAR i : CARDINAL; found : BOOLEAN;
BEGIN
(*$? CSBug: Variablen.Value10ToStr ( x , temp ) ; *)
(*$? NOT CSBug: Variablen.SimpleValue10ToStr ( x , temp ) ; *)
(**
(* Aus 30.12 wird nun 3.012 *)
i := 0;
found := FALSE;
REPEAT
IF (temp[i] = '.') THEN
found := TRUE;
IF (i>0) THEN
temp[i ] := temp[i-1];
temp[i-1] := '.';
(* CS mag kein .3 sondern will 0.3 *)
IF (i-1 = 0) THEN
MagicStrings.Insert('0', temp, i-1);
ELSE
(* Keine Zahl ? Vorzeichen o.ä. ? *)
IF NOT ((temp[i-2]>='0') AND (temp[i-2]<='9')) THEN
MagicStrings.Insert('0', temp, i-1);
END;
END;
ELSE
MagicStrings.Insert('0', temp, 1);
END;
END;
INC(i);
UNTIL (i>=LENGTH(temp)) OR found;
IF NOT found THEN
(* Aus 30 wird 3.0 *)
i := LENGTH(temp);
temp[i+1] := 0C; (* um eins länger *)
temp[i ] := temp[i-1];
temp[i-1] := '.';
END;
**)
END Do10Line;
BEGIN
Do10Line(x1, line);
Do10Line(y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
Do10Line(x2-x1, temp);
MagicStrings.Append(' l ', line);
MagicStrings.Append(temp, line);
Do10Line(y2-y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END DoBetterLine;
PROCEDURE DoIt ( Object : ObjectPtrTyp;
dx, dy : INTEGER ) ;
CONST deltaangle = 3;
VAR txt : ARRAY [0..9] OF CHAR;
FirstX, FirstY, x, y, i : INTEGER;
startangle, endangle : INTEGER;
xradius, yradius : INTEGER;
CurrX, CurrY, OldX, OldY : MagicSys.lINTEGER;
x1, x2, x3, x4 : INTEGER;
px1, px2, px3, px4 : INTEGER;
y1, y2, y3, y4 : INTEGER;
py1, py2, py3, py4 : INTEGER;
PROCEDURE myentier ( x : LONGREAL ) : MagicSys.lINTEGER;
VAR result: MagicSys.lINTEGER;
BEGIN
result := INT(ABS(x) + 0.5);
IF x<0.0 THEN
RETURN -result;
ELSE
RETURN result;
END;
END myentier;
PROCEDURE WriteBezier(anzahl, x1, y1, x2, y2, x3, y3 : INTEGER);
CONST MaxBezPts = 1000;
VAR Number : ARRAY [0..19] OF CHAR;
BezierArray : ARRAY [0..2*MaxBezPts+1] OF LONGREAL;
i : INTEGER;
Line, temp : ARRAY [0..255] OF CHAR;
BEGIN
IF CommonData.Usespecial = cstrunk2 THEN
Do1Line(dx + x1, Line);
Do1Line(dy + y1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
MagicStrings.Append(' b2 ', Line);
Do1Line(x2 - x1, temp);
MagicStrings.Append(temp, Line);
Do1Line(y2 - y1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
Do1Line(x3 - x1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
Do1Line(y3 - y1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
WriteLn(FileHandle, Line);
ELSE
IF anzahl<=MaxBezPts THEN
i := anzahl;
ELSE
i := MaxBezPts;
END;
ComputeRealBezier(BezierArray, i, x1, y1, x2, y2, x3, y3);
OldX := myentier(10.0 * BezierArray[0]);
OldY := myentier(10.0 * BezierArray[1]);
FOR i:=1 TO anzahl DO
CurrX := myentier(10.0 * BezierArray[2*i ]);
CurrY := myentier(10.0 * BezierArray[2*i+1]);
DoBetterLine(10 * LONG(dx + Object^.Code[1]) + OldX,
10 * LONG(dy + Object^.Code[2]) + OldY,
10 * LONG(dx + Object^.Code[1]) + CurrX,
10 * LONG(dy + Object^.Code[2]) + CurrY);
OldX := CurrX;
OldY := CurrY;
END;
END;
END WriteBezier;
PROCEDURE MakeCircles1(Object : ObjectPtrTyp);
VAR startangle, endangle, xradius, yradius, i : INTEGER;
BEGIN
startangle := 0;
endangle := 360;
xradius := Object^.Code [3];
yradius := Object^.Code [3];
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Arc :
startangle := Object^.Code [4];
endangle := startangle + Object^.Code [5]; |
Ellipse :
yradius := Object^.Code [4]; |
Oval :
CASE VAL(TextPosTyp, Object^.Code[4]) OF
LeftTop : startangle := 090; endangle := 180; |
Left : startangle := 090; endangle := 270; |
LeftBot : startangle := 180; endangle := 270; |
Top : startangle := 000; endangle := 180; |
Bottom : startangle := 180; endangle := 360; |
RightTop : startangle := 000; endangle := 090; |
Right : startangle := 270; endangle := 450; |
RightBot : startangle := 270; endangle := 360; |
ELSE
END; |
ELSE
END;
i := startangle;
OldX := myentier(10.0 * MathLib0.real(xradius) *
MathLib0.cos(MathLib0.rad(
MathLib0.real(i MOD 360))));
OldY := myentier(10.0 * MathLib0.real(yradius) *
MathLib0.sin(MathLib0.rad(
MathLib0.real(i MOD 360))));
INC(i, deltaangle);
REPEAT
CurrX := myentier(10.0 * MathLib0.real(xradius) *
MathLib0.cos(MathLib0.rad(
MathLib0.real(i MOD 360))));
CurrY := myentier(10.0 * MathLib0.real(yradius) *
MathLib0.sin(MathLib0.rad(
MathLib0.real(i MOD 360))));
DoBetterLine(10 * LONG(dx + Object^.Code[1]) + OldX,
10 * LONG(dy + Object^.Code[2]) + OldY,
10 * LONG(dx + Object^.Code[1]) + CurrX,
10 * LONG(dy + Object^.Code[2]) + CurrY);
OldX := CurrX;
OldY := CurrY;
INC(i, deltaangle);
IF (i>endangle) THEN
IF i<>endangle + deltaangle THEN
i := endangle;
END;
END;
UNTIL i>endangle;
END MakeCircles1;
PROCEDURE MakeCircles2(Object : ObjectPtrTyp);
VAR startangle, deltaangle, xradius, yradius, i : INTEGER;
PROCEDURE WriteFilledEllipse(mx, my, rx, ry : INTEGER);
VAR line, temp : ARRAY [0..255] OF CHAR;
BEGIN
Do1Line(mx, line);
Do1Line(my, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
MagicStrings.Append(' e ', line);
Do1Line(rx, temp);
MagicStrings.Append(temp, line);
Do1Line(ry, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END WriteFilledEllipse;
PROCEDURE WriteAngle(mx, my, rx, ry, sa, sd : INTEGER);
VAR line, temp : ARRAY [0..255] OF CHAR;
BEGIN
Do1Line(mx, line);
Do1Line(my, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
MagicStrings.Append(' a ', line);
Do1Line(rx, temp);
MagicStrings.Append(temp, line);
Do1Line(ry, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
MagicStrings.Append(' 0 ', line);
Variablen.NumberToStr(sa, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
Variablen.NumberToStr(sd, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END WriteAngle;
PROCEDURE WriteCircle(mx, my, r : INTEGER; IsCircle : BOOLEAN);
VAR line, temp : ARRAY [0..255] OF CHAR;
BEGIN
Do1Line(mx, line);
Do1Line(my, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
IF IsCircle THEN
MagicStrings.Append(' c ', line);
ELSE
MagicStrings.Append(' d ', line);
END;
Do1Line(r, temp);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END WriteCircle;
BEGIN
xradius := Object^.Code [3];
yradius := Object^.Code [3];
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Circle, Disk:
WriteCircle(Object^.Code[1] + dx, Object^.Code[2] + dy,
xradius,
VAL(DrawObjectTyp, Object^.Code [0]) = Circle); |
Arc : startangle := Object^.Code [4];
deltaangle := Object^.Code [5];
WriteAngle(Object^.Code[1] + dx, Object^.Code[2] + dy,
xradius, yradius, startangle, deltaangle); |
Ellipse :
startangle := Object^.Code [5];
deltaangle := Object^.Code [6];
yradius := Object^.Code [4];
IF (Object^.Code[7] <> 0) THEN
WriteFilledEllipse(Object^.Code[1] + dx, Object^.Code[2] + dy,
xradius, yradius);
ELSE
WriteAngle(Object^.Code[1] + dx, Object^.Code[2] + dy,
xradius, yradius, startangle, deltaangle);
END; |
Oval :
CASE VAL(TextPosTyp, Object^.Code[4]) OF
LeftTop : startangle := 090; deltaangle := 090; |
Left : startangle := 090; deltaangle := 180; |
LeftBot : startangle := 180; deltaangle := 090; |
Top : startangle := 000; deltaangle := 180; |
Bottom : startangle := 180; deltaangle := 180; |
RightTop : startangle := 000; deltaangle := 090; |
Right : startangle := 270; deltaangle := 180; |
RightBot : startangle := 270; deltaangle := 090; |
ELSE
END;
WriteAngle(Object^.Code[1] + dx, Object^.Code[2] + dy,
xradius, yradius, startangle, deltaangle); |
ELSE
END;
END MakeCircles2;
BEGIN
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Dashbox : i := 1; |
EpicDashedLine : i := 1; |
EpicDottedLine : i := 2; |
ELSE
i := 0;
END;
IF i<>oldlineval THEN
oldlineval := i;
txt := 't x';
txt[2] := CHR(ORD('0') + MagicSys.CastToCard(i));
WriteLn(FileHandle, txt);
END;
IF (Object^.Code[8]<>oldthickval) AND
(CommonData.Usespecial = cstrunk2) THEN
CASE Object^.Code[8] OF
1,2 : oldthickval := 1;
txt := 'w 0.4pt'; |
3,4 : oldthickval := 3;
txt := 'w 0.6pt'; |
5,6 : oldthickval := 5;
txt := 'w 0.8pt'; |
ELSE
oldthickval := 1;
txt := 'w 0.4pt';
END;
WriteLn(FileHandle, txt);
END;
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Beziercurve:
WriteBezier(Object^.Code [ 7 ],
Object^.Code [ 1 ] , Object^.Code [ 2 ] ,
Object^.Code [ 1 ] + Object^.Code [ 3 ] ,
Object^.Code [ 2 ] + Object^.Code [ 4 ] ,
Object^.Code [ 1 ] + Object^.Code [ 5 ] ,
Object^.Code [ 2 ] + Object^.Code [ 6 ] ); |
Bezierellipse:
(* Bezierellipse, etwas komplizierter *)
(* Gegeben sind drei Punkte der umgebenden Raute *)
(* Der vierte Punkt lä₧t sich dann berechnen, damit *)
(* sind dann die vier Kontrollpkte gegeben. Die an- *)
(* deren Punkte sind dann die Seitenmitten. Insge- *)
(* samt kriegen wir also vier Bezierkurven. *)
x1 := Object^.Code[1]; y1 := Object^.Code[2];
x2 := Object^.Code[3] + x1; y2 := Object^.Code[4] + y1;
x3 := Object^.Code[5] + x1; y3 := Object^.Code[6] + y1;
x4 := x2 + (x1 - x2) + (x3 - x2);
y4 := y2 + (y1 - y2) + (y3 - y2);
px1 := (x1 + x2) DIV 2; py1 := (y1 + y2) DIV 2;
px2 := (x1 + x4) DIV 2; py2 := (y1 + y4) DIV 2;
px3 := (x3 + x4) DIV 2; py3 := (y3 + y4) DIV 2;
px4 := (x3 + x2) DIV 2; py4 := (y3 + y2) DIV 2;
WriteBezier(Object^.Code [ 7 ], px1, py1, x1, y1, px2, py2);
WriteBezier(Object^.Code [ 7 ], px2, py2, x4, y4, px3, py3);
WriteBezier(Object^.Code [ 7 ], px3, py3, x3, y3, px4, py4);
WriteBezier(Object^.Code [ 7 ], px4, py4, x2, y2, px1, py1); |
Arc, Circle, Ellipse, Oval:
IF CommonData.Usespecial = cstrunk2 THEN
MakeCircles2(Object);
ELSE
MakeCircles1(Object);
END; |
Disk:
IF CommonData.Usespecial = cstrunk2 THEN
MakeCircles2(Object);
END; |
EpicGrid:
FirstX := 0;
REPEAT
DoLine(FirstX + Object^.Code[1] + dx, Object^.Code[2] + dy,
FirstX + Object^.Code[1] + dx, Object^.Code[2] + Object^.Code[4] + dy);
FirstX := FirstX + Object^.Code[5];
UNTIL FirstX>Object^.Code[3];
FirstY := 0;
REPEAT
DoLine(Object^.Code[1] + dx,
FirstY + Object^.Code[2] + dy,
Object^.Code[1] + Object^.Code[3] + dx,
FirstY + Object^.Code[2] + dy);
FirstY := FirstY + Object^.Code[6];
UNTIL FirstY>Object^.Code[4]; |
Arrow,
Line:
IF Object^.Code [ 5 ] < 0 THEN x := -1 ELSE x := +1 END ;
IF Object^.Code [ 6 ] < 0 THEN y := -1 ELSE y := +1 END ;
DoLine(dx + Object^.Code[1], dy + Object^.Code[2],
dx + Object^.Code[1] + x * Object^.Code[3],
dy + Object^.Code[2] + y * Object^.Code[4]); |
Framebox,
Dashbox :
IF (VAL(DrawObjectTyp, Object^.Code [0]) = Dashbox) OR
(Object^.Code[6] <> 1) THEN
DoLine(dx + Object^.Code[1],
dy + Object^.Code[2],
dx + Object^.Code[1],
dy + Object^.Code[2] + Object^.Code[4]);
DoLine(dx + Object^.Code[1],
dy + Object^.Code[2] + Object^.Code[4],
dx + Object^.Code[1] + Object^.Code[3],
dy + Object^.Code[2] + Object^.Code[4]);
DoLine(dx + Object^.Code[1] + Object^.Code[3],
dy + Object^.Code[2] + Object^.Code[4],
dx + Object^.Code[1] + Object^.Code[3],
dy + Object^.Code[2]);
DoLine(dx + Object^.Code[1] + Object^.Code[3],
dy + Object^.Code[2],
dx + Object^.Code[1],
dy + Object^.Code[2]);
END; |
ELSE (* EpicLines *)
FirstX := Object^.Code[1] + dx;
FirstY := Object^.Code[2] + dy;
x := FirstX;
y := FirstY;
FOR i := 1 TO Object^.Code[3] DO
DoLine( x, y, FirstX + Object^.EPtr^[(i-1)*2 ],
FirstY + Object^.EPtr^[(i-1)*2 + 1]);
x := FirstX + Object^.EPtr^[(i-1)*2 ];
y := FirstY + Object^.EPtr^[(i-1)*2 + 1];
END;
END;
END DoIt;
PROCEDURE CompilePic(StartObj : ObjectPtrTyp;
dx, dy : INTEGER);
(* wird bei jedem Picture bzw. Subpicture aufgerufen, *)
(* evtl. auch rekursiv *)
VAR Object : ObjectPtrTyp;
TempStr: ARRAY [0..129] OF CHAR;
i : INTEGER;
lines : BOOLEAN;
BEGIN
Object := StartObj;
WHILE Object <> NIL DO
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Picture:
CompilePic(Object^.Children,
dx + Object^.Code[1], dy + Object^.Code[2]); |
Beziercurve,
Bezierellipse,
Oval,
Arc,
Circle,
Disk,
Ellipse,
Line,
Arrow,
EpicSolidLine,
EpicDottedLine,
EpicGrid,
Spline,
EpicDashedLine : DoIt(Object, dx, dy); |
ELSE
END;
Object := Object^.Next ;
END ; (* WHILE *)
END CompilePic;
(* $D+*)
PROCEDURE WriteCSspecial(REF FileName : ARRAY OF CHAR);
VAR dx, dy : INTEGER; tmp : ARRAY [0..255] OF CHAR;
BEGIN
IF ((CommonData.Usespecial = cstrunk1) OR
(CommonData.Usespecial = cstrunk2)) AND
(Variablen.FirstObject^.Next<>NIL) THEN
OpenFile(FileName);
dx := 0;
dy := 0;
CompilePic(Variablen.FirstObject^.Next, dx, dy);
Close(FileHandle);
END;
END WriteCSspecial;
(* $D-*)
PROCEDURE ParseFile(name : ARRAY OF CHAR) : BOOLEAN;
CONST strlen = 255;
TYPE UnitTyp = (mm, cm, pt, pc, in, bp, dd, cc, sp, pp, em, ex);
VAR i : INTEGER;
ok, first : BOOLEAN;
upperleft : BOOLEAN;
pixperinch : INTEGER;
c : CHAR;
str, num : ARRAY [0..strlen] OF CHAR;
intArray : ARRAY [1..19] OF INTEGER;
forwArray : ARRAY [1..5] OF INTEGER;
backwArray : ARRAY [1..5] OF INTEGER;
realArray : ARRAY [1..19] OF LONGREAL;
charBuffer : ARRAY [0..255] OF CHAR;
Code : CodeAryTyp;
obj : ObjectPtrTyp;
Surround : ARRAY [0..3] OF INTEGER;
wx : INTEGER ;
wy : INTEGER ;
ww : INTEGER ;
wh : INTEGER ;
dum : INTEGER ;
pos : CARDINAL;
Version : CARDINAL;
maxx, minx,
maxy, miny : INTEGER;
MinX, MinY : INTEGER;
deltaX,
deltaY : INTEGER;
CurrLineTyp: DrawObjectTyp;
unit : UnitTyp;
BaseUnitTyp: UnitTyp;
UnitChar : ARRAY UnitTyp,[0..2] OF CHAR;
(* $D+*)
PROCEDURE SkipBlanks;
BEGIN
WHILE (str[0] = ' ') OR (str[0]=7C) DO
MagicStrings.Delete(str, 0, 1);
END;
END SkipBlanks;
(* $D-*)
PROCEDURE GetNumber(reals: BOOLEAN; VAR temp : ARRAY OF CHAR);
VAR i, j : INTEGER;
BEGIN
(* Zunächst Spaces weg *)
i := 0;
WHILE (str[i]=' ') OR (str[i] = 07C) DO INC(i); END;
temp[0] := 0C;
j := 0;
IF reals THEN
WHILE str[i] IN Reals DO
temp[j] := str[i];
INC(i);
INC(j);
END;
ELSE
WHILE str[i] IN Integers DO
temp[j] := str[i];
INC(i);
INC(j);
END;
END;
temp[j] := 0C;
WHILE (str[i]=' ') OR (str[i] = 07C) DO INC(i); END;
(**
RTD.Write('Line before:', str);
**)
IF i>0 THEN
MagicStrings.Delete(str, 0, i);
END;
(**
RTD.Write('Line after :', str);
RTD.Write('Line back :', temp);
**)
END GetNumber;
(* $D+*)
PROCEDURE GetRealNumber() : LONGREAL;
VAR res : LONGREAL;
temp : ARRAY [0..19] OF CHAR;
BEGIN
GetNumber(TRUE, temp);
IF temp[0]<>0C THEN
res := MagicConvert.StrToReal(temp);
ELSE
res := FMagic;
END;
RETURN res;
END GetRealNumber;
PROCEDURE GetIntNumber() : INTEGER;
VAR res : INTEGER;
temp : ARRAY [0..19] OF CHAR;
BEGIN
GetNumber(FALSE, temp);
IF temp[0]<>0C THEN
res := MagicConvert.StrToInt(temp);
ELSE
res := Magic;
END;
RETURN res;
END GetIntNumber;
(* $D-*)
PROCEDURE GetLine;
BEGIN
str[0] := 0C;
IF NOT EOF THEN
ReadLn (FileHandle, str);
END;
END GetLine;
PROCEDURE GetNewLine;
BEGIN
REPEAT
GetLine;
UNTIL str[0] <> '%';
SkipBlanks;
END GetNewLine;
PROCEDURE ScanStr;
CONST cmdlen = 19;
VAR i, nrint, nrreal : INTEGER;
dx, dy, x, y : LONGREAL;
ix, iy, idx, idy : INTEGER;
cmd : ARRAY [0..cmdlen] OF CHAR;
unit : UnitTyp;
crdarray : ARRAY [0..5] OF INTEGER;
okay : BOOLEAN;
PROCEDURE Crd(r : LONGREAL) : INTEGER;
CONST Internal = 5.0; (* 5 Pixel per Units *)
Factor = 10.0; (* 1/10 unitlength *)
VAR res : INTEGER;
BEGIN
res := round(r * Factor * Internal);
RETURN res;
END Crd;
PROCEDURE InitCode(typus : DrawObjectTyp; x, y : INTEGER);
VAR (*$Reg*) i : CARDINAL;
BEGIN
FOR i := 0 TO 9 DO Code[i] := 0; END;
FOR i := 0 TO 3 DO Surround[i] := 0; END;
Code[0] := MagicSys.CastToInt(ORD(typus)); (* Typus *)
Code[1] := x;
Code[2] := y;
END InitCode;
PROCEDURE GetCrds( anzahl : CARDINAL;
VAR crdarray : ARRAY OF INTEGER;
VAR okay : BOOLEAN);
VAR c : CARDINAL; r : REAL;
BEGIN
okay := TRUE;
FOR c:=1 TO anzahl DO
SkipBlanks;
r := GetRealNumber();
IF (r<>FMagic) THEN
crdarray[c-1] := Crd(r);
ELSE
okay := FALSE;
crdarray[c-1] := Magic;
END;
END;
END GetCrds;
PROCEDURE GetInts( anzahl : CARDINAL;
VAR intarray : ARRAY OF INTEGER;
VAR okay : BOOLEAN);
VAR c : CARDINAL; i : INTEGER;
BEGIN
okay := TRUE;
FOR c:=1 TO anzahl DO
SkipBlanks;
i := GetIntNumber();
IF (i<>Magic) THEN
intarray[c-1] := i;
ELSE
okay := FALSE;
crdarray[c-1] := Magic;
END;
END;
END GetInts;
BEGIN
CASE str[0] OF
'r' : (* Reset *)
BaseUnitTyp := pt;
CurrLineTyp := EpicSolidLine; |
'u' : (* Unit *)
FOR unit := mm TO ex DO
IF MagicStrings.Pos(UnitChar[unit], str) < strlen THEN
BaseUnitTyp := unit;
END;
END; |
'w' : (* Linien-Breite *) |
't' : (* Linien-Typ *)
SkipBlanks;
i := GetIntNumber();
IF (i<>Magic) THEN
CASE i OF
0 : CurrLineTyp := EpicSolidLine; |
1 : CurrLineTyp := EpicDashedLine; |
2 : CurrLineTyp := EpicDottedLine; |
3 : CurrLineTyp := EpicDashedLine; |
4 : CurrLineTyp := EpicDashedLine; |
5 : CurrLineTyp := EpicDottedLine; |
6 : CurrLineTyp := EpicDottedLine; |
ELSE
CurrLineTyp := EpicSolidLine;
END;
END;|
ELSE
(* Also wahrscheinlich eine Linie *)
(* Zunächst Ausgangsposition *)
GetCrds(2, crdarray, okay);
IF okay THEN
(* Jetzt der Befehlscode *)
SkipBlanks;
i := 0;
WHILE (str[i]<>' ') AND (i<cmdlen) DO
cmd[i] := str[i];
INC(i);
END;
cmd[i] := 0C;
IF i>0 THEN
MagicStrings.Delete(str, 0, i);
END;
IF (cmd[1] = 0C) THEN (* 1 Buchstabe *)
CASE cmd[0] OF
'l':
InitCode(CurrLineTyp, crdarray[0], crdarray[1]);
GetCrds(2, crdarray, okay);
IF okay THEN
FOR i:=0 TO 1 DO
Variablen.ebuffer[i] := crdarray[i];
END;
Code[3] := 1; (* Anzahl Punkte in ebuffer *)
Code[8] := 1; (* Thickness *)
Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
Variablen.LastObject^.SurrDirty := TRUE;
END; |
'e' : (* Filled Ellipse *)
InitCode(Ellipse, crdarray[0], crdarray[1]);
GetCrds(2, crdarray, okay);
IF okay THEN
Code[3] := crdarray[0];
Code[4] := crdarray[1];
Code[5] := 0;
Code[6] := 360;
Code[7] := 1; (* Fillflag *)
Variablen.NewObject(Code, NIL, NIL, Surround);
Variablen.LastObject^.SurrDirty := TRUE;
END; |
'a' : (* Arc *)
InitCode(Arc, crdarray[0], crdarray[1]);
GetCrds(2, crdarray, okay);
IF okay THEN
ix := crdarray[0];
iy := crdarray[1];
GetInts(3, crdarray, okay);
IF okay THEN
IF ix = iy THEN
(* Kreis-Bogen *)
Code[3] := ix;
Code[4] := crdarray[1];
Code[5] := crdarray[2];
ELSE
(* Ellipsen-Bogen *)
Code[0] := MagicSys.CastToInt(ORD(Ellipse)); (* Typus *)
Code[3] := ix;
Code[4] := iy;
Code[5] := crdarray[1];
Code[6] := crdarray[2];
END;
END;
END; |
'c', 'd': (* Circle / Disk *)
IF cmd[0] = 'c' THEN
InitCode(Circle, crdarray[0], crdarray[1]);
ELSE
InitCode(Disk, crdarray[0], crdarray[1]);
END;
GetCrds(1, crdarray, okay);
IF okay THEN
Code[3] := crdarray[0];
Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
Variablen.LastObject^.SurrDirty := TRUE;
END; |
'i': (* Include nicht unterstützt *) |
ELSE
END;
ELSIF LENGTH(cmd)=2 THEN
IF (cmd[0] = 'b') AND (cmd[1]='2') THEN
InitCode(Beziercurve, crdarray[0], crdarray[1]);
GetCrds(4, crdarray, okay);
IF okay THEN
FOR i:=0 TO 3 DO
Code[i + 3] := crdarray[i];
END;
Code[7] := 50; (* Anzahl Punkte *)
Variablen.NewObject(Code, NIL, ADR(Variablen.ebuffer), Surround);
Variablen.LastObject^.SurrDirty := TRUE;
END;
END;
END;
END;
END;
END ScanStr;
BEGIN
UnitChar[mm] := 'mm'; UnitChar[cm] := 'cm';
UnitChar[pt] := 'pt'; UnitChar[pc] := 'pc';
UnitChar[in] := 'in'; UnitChar[bp] := 'bp';
UnitChar[dd] := 'dd'; UnitChar[cc] := 'cc';
UnitChar[sp] := 'sp'; UnitChar[pp] := 'pp';
UnitChar[em] := 'em'; UnitChar[ex] := 'ex';
Reset(FileHandle, name);
IF FileHandle >= 6 THEN
GetLine;
(* steht in der ersten Zeile ein "CS-Graphics" ? *)
pos := MagicStrings.Pos(CSIdshort, str);
(**
RTD.Write('str', str);
**)
(**
RTD.Write('id ', CSIdshort);
**)
(**
RTD.ShowVar('pos', pos);
**)
Close(FileHandle);
ok := pos = 0;
(**
RTD.ShowVar('pos', pos);
**)
IF ok THEN
(**
RTD.Message('ok!');
**)
ELSE
(**
RTD.Message('Not ok!');
**)
END;
IF NOT ok THEN
mtAlerts.SetIcon(mtAlerts.Graphic);
(**
RTD.Message('Now NumAlert');
**)
i := NumAlert(27, 1);
ok := i = 2;
END;
IF ok THEN
BusyStart(name, TRUE);
minx := 0; miny := 0;
maxx := 0; maxy := 0;
CurrLineTyp := EpicSolidLine;
BaseUnitTyp := pt;
Reset(FileHandle, name);
EOF := FALSE;
Variablen.DeleteWholeTree;
WHILE NOT EOF DO
(* $D+*)
GetNewLine;
(**
RTD.Write('Line:', str);
**)
IF str[0]<>0C THEN
ScanStr;
END;
(* $D-*)
END;
Close(FileHandle);
Variablen.FirstObject^.Code[3] := maxx;
Variablen.FirstObject^.Code[4] := maxy;
Variablen.FirstObject^.Code[6] := MagicSys.CastToInt(ORD(BaseUnitTyp)) +
0100H * 1; (* 1/10 Aufloesung *)
Variablen.FirstObject^.Code[7] := 5;
CommonData.InternalResolution := 5;
BusyEnd;
RETURN TRUE;
END;
RETURN FALSE;
END;
END ParseFile;
PROCEDURE ImportCSspecial():BOOLEAN;
(*
Fragt nach Dateinamen, lädt Datei ein, versucht sie zu interpretieren,
und die Objekte abzulegen. Unbekannte Objekte werden ignoriert.
Die bisherigen Objekte werden gelöscht.
*)
VAR input, titel, msg : ARRAY [0..255] OF CHAR;
tmp1, tmp2 : ARRAY [0..14] OF CHAR;
res, exist : BOOLEAN;
dum : INTEGER;
BEGIN
res := FALSE;
GetFSelText(10, msg);
tmp1 := '*.';
tmp2 := '*.';
MagicStrings.Append(CommonData.Extensions[8], tmp1);
MagicStrings.Append(CommonData.Extensions[8], tmp2);
IF GetFile.GetFileName(input, titel, tmp1, tmp2,
CommonData.CSGPath, msg,
exist, FALSE, TRUE, TRUE, FALSE) THEN
IF exist THEN
res := ParseFile(input);
IF res THEN
MagicStrings.Assign(input, CommonData.FileName);
GetFile.ReplaceExtension(CommonData.FileName, CommonData.Extensions[1]);
GetFile.ReplacePath(CommonData.FileName, '');
END;
ELSE
res := FALSE;
END;
END;
RETURN res;
END ImportCSspecial;
END CSspecial.