home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
td187src.lzh
/
VARIABLE.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
27KB
|
841 lines
IMPLEMENTATION MODULE Variablen;
FROM SYSTEM IMPORT ADDRESS , ADR;
FROM Storage IMPORT ALLOCATE , DEALLOCATE;
FROM Diverses IMPORT round, NumAlert, BlockIntersect;
FROM Types IMPORT Block, ExtendedArraySize, ObjectPtrTyp,
CodeAryTyp, DrawObjectTyp,
CharPtrTyp, ExtendedPtrTyp;
IMPORT mtAlerts ;
IMPORT mtAppl ;
IMPORT MagicVDI ;
IMPORT MagicAES ;
IMPORT MagicSys ;
IMPORT MagicConvert;
IMPORT CommonData;
IMPORT MagicStrings;
IMPORT MathLib0;
IMPORT RSCindices;
(**
IMPORT Debug;
IMPORT RTD;
**)
CONST Magic = 2905;
VAR IgnoreMode : BOOLEAN; (* Falls TRUE wird Aufruf von NewObject ignoriert *)
zoomit : BOOLEAN;
aftstr : ARRAY [1..5],[0..4] OF ARRAY [0..2] OF CHAR;
secondadr : ObjectPtrTyp;
PROCEDURE ZoomMode (zoom : BOOLEAN; factor : LONGREAL);
(*
Schaltet Zoom-Modus an/aus
*)
BEGIN
zoomit := zoom;
zoomfak := factor;
END ZoomMode;
PROCEDURE PixDistance(picdist : INTEGER) : INTEGER;
(*
Rechnet Pixel-Abstände in PIc-Abstände um und umgekehrt
*)
BEGIN
IF zoomit THEN
RETURN round(MathLib0.real(picdist) * zoomfak);
ELSE
RETURN picdist;
END;
END PixDistance;
PROCEDURE PicDistance(pixdist : INTEGER) : INTEGER;
(*
Rechnet Pixel-Abstände in PIC-Abstände um
*)
BEGIN
IF zoomit THEN
RETURN round(MathLib0.real(pixdist) / zoomfak);
ELSE
RETURN pixdist;
END;
END PicDistance;
PROCEDURE PixToPic ( xpix , ypix : INTEGER; VAR xpic , ypic : INTEGER) ;
VAR y : INTEGER ; (* leider geht y-Achse beim ST von oben nach unten *)
BEGIN
y := CommonData.OffsetXY[3] ;
IF zoomit THEN
xpic := round( MathLib0.real(xpix - CommonData.WorkArea[0]) /
zoomfak);
xpic := xpic + CommonData.ZeroX;
ypic := round( MathLib0.real(y - ypix + CommonData.WorkArea[1]) /
zoomfak );
ypic := ypic + CommonData.ZeroY;
ELSE
xpic := xpix -
CommonData.WorkArea[0] + CommonData.ZeroX;
ypic := y - ypix +
CommonData.WorkArea[1] + CommonData.ZeroY;
END;
END PixToPic ;
PROCEDURE PicToPix (VAR xpix , ypix : INTEGER; xpic , ypic : INTEGER) ;
VAR y : INTEGER ; (* leider geht y-Achse beim ST von oben nach unten *)
BEGIN
y := CommonData.OffsetXY[3] ;
IF zoomit THEN
xpix := round( zoomfak *
MathLib0.real(CommonData.FatherXOffset + xpic
- CommonData.ZeroX)) +
CommonData.WorkArea[0];
ypix := y - round( zoomfak *
MathLib0.real(CommonData.FatherYOffset + ypic
- CommonData.ZeroY)) +
CommonData.WorkArea[1];
ELSE
xpix := (CommonData.FatherXOffset + xpic - CommonData.ZeroX) +
CommonData.WorkArea[0];
ypix := y - (CommonData.FatherYOffset + ypic - CommonData.ZeroY) +
CommonData.WorkArea[1];
END;
END PicToPix ;
PROCEDURE Visible (SurroundRec : ARRAY OF INTEGER) : BOOLEAN ;
(* SurroundRec entspricht Surround in ObjectRecTyp *)
VAR X1, Y1, X2, Y2 : INTEGER;
temp : INTEGER;
result : BOOLEAN;
BEGIN
PixToPic (CommonData.ClipXY[0], CommonData.ClipXY[1], X1, Y1);
PixToPic (CommonData.ClipXY[2], CommonData.ClipXY[3], X2, Y2);
(* X1,Y1 +--------+ s0,s1 +-------+ *)
(* | | | | *)
(* | | | | *)
(* +--------+ X2,Y2 +-------+ s0+s2,s1-s3 *)
(* Keine X-Überschneidung ? *)
IF (X1>X2) THEN temp := X2; X2 := X1; X1 := temp; END;
IF (Y1<Y2) THEN temp := Y2; Y2 := Y1; Y1 := temp; END;
IF (X2<SurroundRec[0]) OR (X1>SurroundRec[0]+SurroundRec[2]) THEN
RETURN FALSE;
ELSE
(* Keine Y-Überschneidung ? *)
IF (Y2>SurroundRec[1]) OR (Y1<SurroundRec[1]-SurroundRec[3]) THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END;
END;
RETURN TRUE;
END Visible;
VAR strings : ARRAY [1..4] OF ARRAY [1..19] OF CHAR;
numbers : ARRAY [1..4] OF INTEGER;
PROCEDURE Position ( ShowDelta : BOOLEAN;
XPos, YPos, XDelta, YDelta : INTEGER ) ;
(*
Zeigt die momentane Maus-Position (XPos, YPos) an. Ist ShowDelta TRUE,
so wird zusätzlich noch der Abstand zum Punkt (XDelta,YDelta) angezeigt.
*)
CONST coordlen = 11;
VAR str : ARRAY [ 0..9 ] OF CHAR ;
str2: ARRAY [ 0..9 ] OF CHAR ;
bdum : BITSET;
xm , ym ,dum , x , y : INTEGER;
i, deltax, deltay : INTEGER;
tree : POINTER TO ARRAY [ 0..255 ] OF MagicAES.OBJECT ;
xmdelta, ymdelta : INTEGER;
PROCEDURE ChangeNumber(num, index, rscindex : INTEGER);
VAR txt : ARRAY [0..127] OF CHAR;
blank : ARRAY [0..1] OF CHAR;
BEGIN
blank := ' ';
CoordToStr(num, strings[index]);
WHILE MagicStrings.Length(strings[index])<coordlen DO
MagicStrings.Insert(blank, strings[index], 0);
END;
tree^[rscindex].StringPtr := ADR(strings[index]);
numbers[index] := num;
END ChangeNumber;
PROCEDURE ShowNumber(num, x, y : INTEGER);
VAR txt : ARRAY [0..127] OF CHAR;
blank : ARRAY [0..1] OF CHAR;
BEGIN
blank := ' ';
CoordToStr(num, txt);
WHILE MagicStrings.Length(txt)<coordlen DO
MagicStrings.Insert(blank, txt, 0);
END;
MagicVDI.Text (mtAppl.VDIHandle , x, y, txt);
END ShowNumber;
PROCEDURE UpdatePosBox;
CONST DeskWin = 0 ;
VAR brec, bvis, bsect, bclip : Block;
BEGIN
i := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ; (* paint *)
i := MagicVDI.SetTextcolor (mtAppl.VDIHandle , MagicAES.BLACK) ;
MagicVDI.SetTextalignment (mtAppl.VDIHandle ,
MagicVDI.BaseJust, MagicVDI.BottomJust ,
i , i) ;
MagicAES.ObjcOffset (tree , RSCindices.posbox , brec.x , brec.y) ;
brec.y := brec.y + 1; (* oberen Rand schützen *)
brec.w := tree^ [ RSCindices.posbox ] .obWidth ;
brec.h := tree^ [ RSCindices.posbox ] .obHeight - 2; (* unteren auch *)
(* Zuerst holen wir uns mal den sichtbaren Bereich *)
MagicAES.WindGet(DeskWin, MagicAES.WFFIRSTXYWH, bvis);
WHILE (bvis.w > 0) AND (bvis.h > 0) DO
IF BlockIntersect(brec, bvis, bsect) THEN
bclip.x := bsect.x;
bclip.y := bsect.y;
bclip.w := bsect.x + bsect.w - 1;
bclip.h := bsect.y + bsect.h - 1;
MagicVDI.SetClipping (mtAppl.VDIHandle , bclip , TRUE) ;
ShowNumber(deltax, CommonData.DXPosx , CommonData.DXPosy+2);
ShowNumber(xm , CommonData.XPosx , CommonData.XPosy+2);
ShowNumber(deltay, CommonData.DYPosx , CommonData.DYPosy+2);
ShowNumber(ym , CommonData.YPosx , CommonData.YPosy+2);
MagicVDI.SetClipping (mtAppl.VDIHandle , bclip , FALSE) ;
(**
MagicAES.ObjcDraw (tree , 0 , 9 , bsect);
**)
END ;
MagicAES.WindGet(DeskWin, MagicAES.WFNEXTXYWH, bvis);
END ;
MagicVDI.SetTextalignment (mtAppl.VDIHandle ,
MagicVDI.BaseJust, MagicVDI.BaseJust,
i , i) ;
END UpdatePosBox;
BEGIN
tree := MagicAES.RsrcGaddr(MagicAES.RTREE , RSCindices.desktop) ;
x := XDelta; y := YDelta;
IF x < CommonData.WorkArea [ 0 ] THEN x := CommonData.WorkArea [ 0 ] END;
IF x > CommonData.WorkArea [ 2 ] THEN x := CommonData.WorkArea [ 2 ] END;
IF y < CommonData.WorkArea [ 1 ] THEN y := CommonData.WorkArea [ 1 ] END;
IF y > CommonData.WorkArea [ 3 ] THEN y := CommonData.WorkArea [ 3 ] END;
IF ShowDelta THEN
PixToPic (x , y , xmdelta , ymdelta) ;
END;
dum := MagicVDI.SetTextcolor (mtAppl.VDIHandle , MagicAES.BLACK) ;
x := XPos;
y := YPos;
IF x < CommonData.WorkArea [ 0 ] THEN x := CommonData.WorkArea [ 0 ] END;
IF x > CommonData.WorkArea [ 2 ] THEN x := CommonData.WorkArea [ 2 ] END;
IF y < CommonData.WorkArea [ 1 ] THEN y := CommonData.WorkArea [ 1 ] END;
IF y > CommonData.WorkArea [ 3 ] THEN y := CommonData.WorkArea [ 3 ] END;
PixToPic (x , y , xm , ym) ;
IF ShowDelta THEN
deltax := ABS (xm - xmdelta);
deltay := ABS (ym - ymdelta);
ELSE
deltax := 0;
deltay := 0;
END;
IF (deltax<>numbers[1]) OR (deltay<>numbers[3]) OR
(xm<>numbers[2]) OR (ym<>numbers[4]) THEN
ChangeNumber(deltax, 1, RSCindices.dxpos);
ChangeNumber(xm , 2, RSCindices.xpos);
ChangeNumber(deltay, 3, RSCindices.dypos);
ChangeNumber(ym , 4, RSCindices.ypos);
UpdatePosBox;
END;
END Position ;
(* ---------------------------- *)
PROCEDURE NewObject (NewCode : CodeAryTyp ;
NewCPtr : CharPtrTyp ;
NewEPtr : ExtendedPtrTyp;
NewSRec : ARRAY OF MagicSys.sWORD) ;
VAR i : INTEGER ;
error : BOOLEAN;
tmp : ObjectPtrTyp;
BEGIN
error := FALSE;
LastObject := FirstObject;
WHILE LastObject^.Next<>NIL DO
LastObject := LastObject^.Next;
END;
IF LastObject<>NIL THEN
(**
RTD.Message('LastObject<>NIL');
**)
NEW (tmp);
LastObject^.Next := tmp ;
IF LastObject^.Next <> NIL THEN
CommonData.ObjectCreated := TRUE;
LastObject := LastObject^.Next ;
FOR i := 0 TO 9 DO
LastObject^.Code [ i ] := NewCode [ i ] ;
END;
FOR i := 0 TO 3 DO
LastObject^.Surround [ i ] := MagicSys.CastToInt(NewSRec [ i ]) ;
END;
LastObject^.Children := NIL;
LastObject^.Bitmap := NIL;
LastObject^.Selected := FALSE;
LastObject^.Locked := FALSE;
LastObject^.SurrDirty := FALSE;
IF (NewCode [ 9 ] > 0) AND (NewCPtr<>NIL) THEN
ALLOCATE (LastObject^.CPtr , MagicSys.CastToLCard (NewCode [ 9 ])) ;
FOR i := 0 TO NewCode [ 9 ] - 1 DO
LastObject^.CPtr^[ i ] := NewCPtr^ [ i ] ;
END;
ELSE
LastObject^.CPtr := NIL ;
END;
IF (NewEPtr <> NIL) AND (NewCode[3]>0) THEN
ALLOCATE (LastObject^.EPtr , 4 * MagicSys.CastToLCard (NewCode [ 3 ])) ;
FOR i := 0 TO NewCode [ 3 ] - 1 DO
LastObject^.EPtr^[ (2 * i) ] := NewEPtr^ [ (2 * i) ] ;
LastObject^.EPtr^[ (2 * i) + 1] := NewEPtr^ [ (2 * i) + 1 ] ;
END;
ELSE
LastObject^.EPtr := NIL ;
END;
LastObject^.Next := NIL ;
ELSE
(* Wer will, mag hier noch eine Alertbox ausgeben, das könnte aber
problematisch werden, wenn zuviele Objekte auf einmal angemeldet
werden...
*)
error := TRUE;
END;
ELSE
error := TRUE;
END;
IF error THEN
mtAlerts.SetIcon(mtAlerts.Bomb);
(**
i := mtAlerts.Alert(1, NoMoreObjects);
**)
i := NumAlert(22, 1);
IgnoreMode := TRUE;
END;
END NewObject ;
PROCEDURE DeleteObject (Object : ObjectPtrTyp) ;
VAR obj1, obj2 : ObjectPtrTyp;
BEGIN
(**
RTD.Into('DeleteObject');
**)
IF Object = RefObject THEN
RefObject := NIL;
END;
IF (ORD(Object^.Code [ 0 ]) = ORD(Picture)) AND
(Object^.Children<>NIL) THEN
obj1 := Object^.Children;
WHILE obj1<>NIL DO
obj2 := obj1^.Next;
DeleteObject(obj1);
obj1 := obj2;
END;
END;
IF (Object^.CPtr<>NIL) AND (Object^.Code [ 9 ] > 0) THEN
DEALLOCATE (Object^.CPtr , MagicSys.CastToLCard (Object^.Code [ 9 ])) ;
END;
IF (Object^.EPtr<>NIL) AND (Object^.Code [ 3 ] > 0) THEN
DEALLOCATE (Object^.EPtr , 4 * MagicSys.CastToLCard (Object^.Code [ 3 ])) ;
END;
DISPOSE (Object) ;
IgnoreMode := FALSE;
(**
RTD.Leaving('DeleteObject');
**)
END DeleteObject ;
(* ---------------------------- *)
PROCEDURE DeleteWholeTree;
VAR obj, obj2 : ObjectPtrTyp;
BEGIN
obj := FirstObject^.Next;
WHILE obj<>NIL DO
obj2 := obj^.Next;
DeleteObject(obj);
obj := obj2;
END;
FirstObject^.Next := NIL;
LastObject := FirstObject;
END DeleteWholeTree;
(* ---------------------------- *)
PROCEDURE MergeToSubpic(LastNormalObject : ObjectPtrTyp;
SPX, SPY, SPW, SPH : INTEGER) ;
(*
Fa₧t alle Objekte HINTER LastNormalObject zu einem Subpicture zusammen
*)
VAR mycode : CodeAryTyp;
temp : ObjectPtrTyp;
i : INTEGER;
surround : ARRAY [0..3] OF INTEGER;
BEGIN
FOR i:=0 TO 9 DO mycode[i] := 0; END;
mycode[0] := ORD(Picture);
mycode[1] := SPX; mycode[2] := SPY;
mycode[3] := SPW; mycode[4] := SPH;
surround[0] := SPX;
surround[1] := SPY + SPH;
surround[2] := SPW;
surround[3] := SPH;
IF LastNormalObject<>NIL THEN
temp := LastNormalObject^.Next;
LastNormalObject^.Next := NIL;
LastObject := LastNormalObject;
NewObject(mycode, NIL, NIL, surround);
LastObject^.Children := temp;
WHILE temp<>NIL DO
temp^.Code[1] := temp^.Code[1] - SPX;
temp^.Code[2] := temp^.Code[2] - SPY;
temp := temp^.Next;
END;
END;
END MergeToSubpic;
(* ---------------------------- *)
PROCEDURE CheckConsistency;
(*
Überprüfung auf evtle. Unstimmigkeiten.
Z.Zt. nur Check auf leere Subpics
*)
VAR check, prev : ObjectPtrTyp;
BEGIN
prev := FirstObject;
check := FirstObject^.Next;
WHILE check<>NIL DO
IF ORD(check^.Code[0]) = ORD(Picture) THEN
IF check^.Children=NIL THEN
prev^.Next := check^.Next;
DeleteObject(check);
check := prev^.Next;
ELSE
prev := check;
check := check^.Next;
END;
ELSE
prev := check;
check := check^.Next;
END;
END;
LastObject := FirstObject;
WHILE LastObject^.Next <> NIL DO
LastObject := LastObject^.Next;
END;
END CheckConsistency;
(* ---------------------------- *)
(* ---------------------------- *)
PROCEDURE NumberToStr(number : INTEGER; VAR str : ARRAY OF CHAR);
(* Wandelt INTEGER-Zahl in String, keine führenden Blanks *)
VAR nst : ARRAY [ 0..10 ] OF CHAR ; ind , anf : INTEGER ;
BEGIN
IF number=0 THEN
MagicStrings.Assign('0', str);
ELSE
FOR ind := 0 TO 10 DO nst [ ind ] := 0C END;
MagicConvert.IntToStr (number, 9 , nst) ;
anf := 0 ;
WHILE nst [ anf ] = " " DO anf := anf + 1 END;
FOR ind := anf TO 10 DO nst [ ind - anf ] := nst [ ind ] END;
MagicStrings.Assign(nst,str);
END;
END NumberToStr;
PROCEDURE FactorToStr(VAR factorstr : ARRAY OF CHAR);
(* Liefert Vorfaktor für \unitlength *)
VAR one : ARRAY [0..1] OF CHAR;
BEGIN
CASE FirstObject^.Code [ 6 ] DIV 0100H OF
1 : MagicStrings.Assign('0.1',factorstr); |
2 : MagicStrings.Assign('10',factorstr); |
3 : MagicStrings.Assign('0.01',factorstr); |
4 : MagicStrings.Assign('100',factorstr); |
ELSE
(* 0 *)
one := '1';
MagicStrings.Assign(one,factorstr); (* sollte ausser bei Null nie vorkommen *)
END;
END FactorToStr;
PROCEDURE UnitToStr(VAR unitstr : ARRAY OF CHAR);
(* Liefert die einfache Einheit, z.B. mm *)
BEGIN
CASE FirstObject^.Code [ 6 ] MOD 0100H OF
0 : MagicStrings.Assign('mm',unitstr); |
1 : MagicStrings.Assign('cm',unitstr); |
2 : MagicStrings.Assign('pt',unitstr); |
3 : MagicStrings.Assign('pc',unitstr); |
4 : MagicStrings.Assign('in',unitstr); |
5 : MagicStrings.Assign('bp',unitstr); |
6 : MagicStrings.Assign('dd',unitstr); |
7 : MagicStrings.Assign('cc',unitstr); |
8 : MagicStrings.Assign('sp',unitstr); |
9 : MagicStrings.Assign('pp',unitstr); |
10 : MagicStrings.Assign('em',unitstr); |
11 : MagicStrings.Assign('ex',unitstr); |
ELSE
MagicStrings.Assign('mm',unitstr); (* sollte nie vorkommen *)
END;
END UnitToStr;
PROCEDURE CoordToStr(coord : INTEGER; VAR str : ARRAY OF CHAR);
(* Liefert Angabe mit Einheit *)
VAR unitstr, valuestr : ARRAY [0..127] OF CHAR;
BEGIN
UnitToStr(unitstr);
ValueToStr(coord, valuestr);
MagicStrings.Assign(valuestr,str);
MagicStrings.Append(unitstr, str);
END CoordToStr;
PROCEDURE ValueToStr(value : INTEGER; VAR str : ARRAY OF CHAR);
(*
Liefert Angabe in Einheiten der Basis-Einheit (pt, cm, mm...)
ohne Angabe dieser Einheit, also z.B. bei einer unitlength
von 1/10 * 1cm liefert bei CommonData.InternalResolution=2
der Integer-Wert von 40 den String "2.000"
beim Faktor 1/1 : "20.00"
beim Faktor 1/10 : "2.000"
beim Faktor 1/100: "0.2000"
beim Faktor 10/1 : "200.0"
beim Faktor 100/1: "2000"
*)
VAR res : ARRAY [0..127] OF CHAR;
pre, aft : INTEGER;
i, j : INTEGER;
comma : CARDINAL;
r : LONGREAL;
minus : BOOLEAN;
BEGIN
minus := value<0;
pre := ABS(value) DIV (CommonData.InternalResolution);
aft := ABS(value) MOD (CommonData.InternalResolution);
NumberToStr(pre, res);
(* Diese Lösung ist nicht unabhängig vom Wert von InternalResolution *)
MagicStrings.Append(aftstr[CommonData.InternalResolution, aft], res);
CASE FirstObject^.Code [ 6 ] DIV 0100H OF
0 : (* x 1 *) comma := 2; |
1 : (* x 1/10 *) comma := 3; |
2 : (* x 10 *) comma := 1; |
3 : (* x 1/100 *) comma := 4; |
4 : (* x 100 *) comma := 0; |
ELSE
comma := 2; (* sollte nicht vorkommen *)
END;
IF comma>0 THEN
WHILE (MagicStrings.Length(res) < comma) DO
MagicStrings.Insert('0', res, 0);
END;
MagicStrings.Insert('.', res, MagicStrings.Length(res) - comma);
IF res[0]='.' THEN
MagicStrings.Insert('0', res, 0);
END;
IF minus THEN
MagicStrings.Insert('-', res, 0);
END;
END;
MagicStrings.Assign(res,str);
END ValueToStr;
PROCEDURE Value10ToStr(value : MagicSys.lINTEGER; VAR str : ARRAY OF CHAR);
VAR res : ARRAY [0..127] OF CHAR;
pre : MagicSys.lINTEGER;
aft : INTEGER;
i, j : INTEGER;
comma : CARDINAL;
r : LONGREAL;
minus : BOOLEAN;
BEGIN
minus := value<0;
pre := ABS(value) DIV LONG(CommonData.InternalResolution);
aft := SHORT(ABS(value) MOD LONG(CommonData.InternalResolution));
MagicConvert.LIntToStr(pre, 20, res);
WHILE (res[0]=' ') DO MagicStrings.Delete(res, 0, 1); END;
(* Diese Lösung ist nicht unabhängig vom Wert von InternalResolution *)
MagicStrings.Append(aftstr[CommonData.InternalResolution, aft], res);
CASE FirstObject^.Code [ 6 ] DIV 0100H OF
0 : (* x 1 *) comma := 3; |
1 : (* x 1/10 *) comma := 4; |
2 : (* x 10 *) comma := 2; |
3 : (* x 1/100 *) comma := 5; |
4 : (* x 100 *) comma := 1; |
ELSE
comma := 3; (* sollte nicht vorkommen *)
END;
IF comma>0 THEN
WHILE (LENGTH(res) < comma) DO
MagicStrings.Insert('0', res, 0);
END;
MagicStrings.Insert('.', res, LENGTH(res) - comma);
IF res[0]='.' THEN
MagicStrings.Insert('0', res, 0);
END;
IF minus THEN
MagicStrings.Insert('-', res, 0);
END;
END;
MagicStrings.Assign(res,str);
END Value10ToStr;
PROCEDURE SimpleValueToStr(value : INTEGER; VAR str : ARRAY OF CHAR);
(*
Liefert Angabe Als Vielfaches der Basis-Einheit (pt, cm, mm...)
unter berücksichtigung des Vorfaktors ohne Angabe dieser Einheit,
also z.B. bei einer unitlength von 1/10 * 1cm liefert bei
CommonData.InternalResolution=2 der Integer-Wert von 40 den
String "20.00"
*)
VAR res : ARRAY [0..127] OF CHAR;
pre, aft : INTEGER;
i, j : INTEGER;
comma : CARDINAL;
r : LONGREAL;
minus : BOOLEAN;
BEGIN
(* $D+*)
minus := value<0;
pre := ABS(value) DIV (CommonData.InternalResolution);
aft := ABS(value) MOD (CommonData.InternalResolution);
NumberToStr(pre, res);
(* Diese Lösung ist nicht unabhängig vom Wert von InternalResolution *)
MagicStrings.Append('.', res);
MagicStrings.Append(aftstr[CommonData.InternalResolution, aft], res);
IF res[0]='.' THEN
MagicStrings.Insert('0', res, 0);
END;
IF minus THEN
MagicStrings.Insert('-', res, 0);
END;
MagicStrings.Assign(res,str);
(* $D-*)
END SimpleValueToStr;
PROCEDURE SimpleValue10ToStr( value : MagicSys.lINTEGER;
VAR str : ARRAY OF CHAR);
(*
Liefert Angabe Als Vielfaches der Basis-Einheit (pt, cm, mm...)
unter berücksichtigung des Vorfaktors ohne Angabe dieser Einheit,
also z.B. bei einer unitlength von 1/10 * 1cm liefert bei
CommonData.InternalResolution=2 der Integer-Wert von 40 den
String "20.00"
*)
VAR res : ARRAY [0..127] OF CHAR;
tmp : ARRAY [0..2] OF CHAR;
aft : INTEGER;
pre10,
aft10 : INTEGER;
pre : MagicSys.lINTEGER;
i, j : INTEGER;
comma : CARDINAL;
r : LONGREAL;
minus : BOOLEAN;
BEGIN
(* $D+*)
minus := value<0;
pre := ABS(value) DIV LONG(CommonData.InternalResolution);
pre10 := SHORT(pre DIV 10);
aft10 := SHORT(pre MOD 10);
aft := SHORT(ABS(value) MOD LONG(CommonData.InternalResolution));
NumberToStr(pre10, res);
(* Diese Lösung ist nicht unabhängig vom Wert von InternalResolution *)
tmp := '.?';
tmp[1] := CHR(ORD(aft10) + ORD('0'));
MagicStrings.Append(tmp, res);
MagicStrings.Append(aftstr[CommonData.InternalResolution, aft], res);
MagicStrings.Append(aftstr[CommonData.InternalResolution, aft], res);
IF res[0]='.' THEN
MagicStrings.Insert('0', res, 0);
END;
IF minus THEN
MagicStrings.Insert('-', res, 0);
END;
MagicStrings.Assign(res,str);
(* $D-*)
END SimpleValue10ToStr;
PROCEDURE GetOneVal(VAR str : ARRAY OF CHAR;
VAR val : INTEGER;
reals : BOOLEAN);
VAR r : LONGREAL;
ok : BOOLEAN;
BEGIN
(*
Im übergebenen String steht eine Zahl. Diese wird extrahiert und in
Integer-Wert gewandelt (eventuell mit vorheriger Konversion der
Koordinaten in die internen Rasterkoordinaten (1/4 mm Auflösung)
*)
val := 0;
r := MagicConvert.StrToReal(str);
IF reals THEN
r := r * MathLib0.real(CommonData.InternalResolution); (* Auflösung 1/4 mm *)
END;
val := round ( r );
END GetOneVal;
PROCEDURE StrToCoord(VAR coord : INTEGER; VAR str : ARRAY OF CHAR);
(* Wandelt Text in Koordinatenangabe *)
BEGIN
(*
Im übergebenen String steht eine Zahl. Diese wird extrahiert und in
Integer-Wert gewandelt (mit vorheriger Konversion der
Koordinaten in die internen Rasterkoordinaten (1/4 mm Auflösung)
*)
GetOneVal(str, coord, TRUE);
END StrToCoord;
PROCEDURE StrToValue(VAR value : INTEGER; VAR str : ARRAY OF CHAR);
(* Wandelt Text in Wertangabe *)
BEGIN
(*
Im übergebenen String steht eine Zahl. Diese wird extrahiert und in
Integer-Wert gewandelt.
*)
GetOneVal(str, value, FALSE);
END StrToValue;
PROCEDURE InitAftComma;
VAR i, j : INTEGER;
BEGIN
FOR i:=1 TO 5 DO FOR j:=1 TO 4 DO aftstr[i, j] := ''; END; END;
FOR i:=1 TO 5 DO aftstr[i, 0] := '00'; END;
aftstr[2, 1] := '50';
aftstr[3, 1] := '33'; aftstr[3, 2] := '67';
aftstr[4, 1] := '25'; aftstr[4, 2] := '50'; aftstr[4, 3] := '75';
aftstr[5, 1] := '20'; aftstr[5, 2] := '40'; aftstr[5, 3] := '60';
aftstr[5, 4] := '80';
END InitAftComma;
(* Die Durchmesser der Kreise und Scheiben sind beschränkt. *)
(* Im LaTeX-Manual werden 40 pts bzw. 15 pts angegeben. *)
(* Somit ergeben sich folgende Radien. *)
(*
Merke: Die Auflösung beträgt immer ein 1/4 der momentanen
\unitlength
MaxCircle MaxDisk
In mm: 21 8
In cm: 2 1 ( 10mm = 1cm )
In pt: 60 24 ( 1pt = 0.351mm)
In pc: 5 2 ( 1pc = 12pt )
In in: 1 1 ( 1in = 72.27pt)
In bp: 60 24 ( 72p = 1in )
In dd: 56 23 ( 1157dd = 1238pt )
In cc: 5 2 ( 1cc = 12dd )
In sp: 32767 32767 (65536sp = 1pt )
In pp: 249 100 ( 300pp = 1in ) (Laserdruckerauflösung)
*)
PROCEDURE MaxValue(ForCircle : BOOLEAN) : INTEGER;
(* wie oben angegeben *)
VAR factor : LONGREAL;
MaxValInPts : LONGREAL;
result : INTEGER;
BEGIN
(**
IF ForCircle THEN
MaxValInPts := 2621440.0; (* 40 * 65536 *)
ELSE
MaxValInPts := 983040.0; (* 15 * 65536 *)
END;
**)
IF ForCircle THEN
MaxValInPts := 1310720.0; (* 20 * 65536 *)
ELSE
MaxValInPts := 491520.0; (* 7.5* 65536 *)
END;
IF CommonData.LimitedDisk THEN
CASE (FirstObject^.Code[6] MOD 0100H) OF
0 : (* mm *) factor := 186467.0; |
1 : (* cm *) factor := 1864679.0; |
2 : (* pt *) factor := 65536.0; |
3 : (* pc *) factor := 786432.0; |
4 : (* in *) factor := 4736286.0; |
5 : (* bp *) factor := 65781.0; |
6 : (* dd *) factor := 70124.0; |
7 : (* cc *) factor := 841489.0; |
8 : (* sp *) factor := 1.0; |
9 : (* pp *) factor := 4736286.0 / 300.0; | (* 300 dpi *)
10 : (* em *) factor := 655361.0; | (* 10pt *)
(**
10 : (* em *) factor := 717621.0; | (* 11pt *)
10 : (* em *) factor := 770040.0; | (* 12pt *)
**)
11 : (* ex *) factor := 282168.0; | (* 10pt *)
(**
11 : (* ex *) factor := 308974.0; | (* 11pt *)
11 : (* ex *) factor := 338603.0; | (* 12pt *)
**)
ELSE
(* mm *) factor := 186467.0; (* sollte nie vorkommen *)
END;
CASE (FirstObject^.Code[6] DIV 0100H) OF
0 : (* x 1 *) |
1 : (* x 1/10 *) factor := factor / 10.0; |
2 : (* x 10 *) factor := factor * 10.0; |
3 : (* x 1/100 *) factor := factor / 100.0; |
4 : (* x 100 *) factor := factor * 100.0; |
ELSE
(* sollte nicht vorkommen *)
END;
MaxValInPts := MaxValInPts / factor *
MathLib0.real(CommonData.InternalResolution);
IF MaxValInPts>32767.0 THEN
result := 32767;
ELSE
result := round( MaxValInPts );
END;
ELSE
result := 32767;
END;
RETURN result;
END MaxValue;
PROCEDURE MaxCircle() : INTEGER;
(* wie oben angegeben *)
BEGIN
RETURN MaxValue(TRUE);
END MaxCircle;
PROCEDURE MaxDisk() : INTEGER;
(* wie oben angegeben *)
BEGIN
RETURN MaxValue(FALSE);
END MaxDisk;
BEGIN
(**
RTD.SetDevice(RTD.printer);
**)
IgnoreMode := FALSE;
zoomit := FALSE;
zoomfak := 1.0;
FirstObject := NIL;
LastObject := NIL;
secondadr := NIL;
numbers[1] := 0;
numbers[2] := 0;
numbers[3] := 0;
numbers[4] := 0;
(**
InitSentinel;
**)
InitAftComma;
END Variablen.