home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* GR-EDIT2.INC *)
- (* 2.Teil des Vektor-Editors *)
- (* ------------------------------------------------------ *)
- PROCEDURE edit(b:word); {Hier beginnt die Editor-Arbeit}
- CONST
- blink = TRUE;
- VAR
- off, paar, anz, akt : INTEGER;
- x, y : ShortInt;
- st : STRING[4];
- linie, junk : BOOLEAN;
- knoten : ARRAY[0..255] OF WORD;
-
- FUNCTION vec_art(nr:word):tArt; {Identifiziert Vektor-Art}
- BEGIN
- WITH userfont DO
- vec_art := decodiere_vektor(vect^[nr],
- vect^[nr+1],rx,ry,junk);
- END;
-
- PROCEDURE rahmen(farbe : WORD);
- BEGIN {Umrahmt angesteuertes Zahlenpaar}
- SetColor(farbe);
- IF GraphDriver > 2 THEN
- Rectangle(tx * (akt AND $F),
- cy_t + (ty + 1) * (akt SHR 4) - ty + 2,
- tx * (akt AND $F) + tx + 1,
- cy_t + (ty + 1) * (akt SHR 4) + 3);
- Rectangle(tx * (akt AND $F) + 1,
- cy_t + (ty + 1) * (akt SHR 4) - ty + 1,
- tx * (akt AND $F) + tx,
- cy_t + (ty + 1) * (akt SHR 4) + 2);
- END;
-
- PROCEDURE blinker(on : BOOLEAN);
- BEGIN {setzt "Blinker" auf Graphik-Punkt}
- IF on THEN SetColor(white) ELSE SetColor(black);
- IF (vec_art(knoten[akt]) = normal) OR
- (vec_art(knoten[akt-1]) = normal) THEN
- WITH userfont DO
- Rectangle(cx_g + Round(faktor/korr_faktor*rx) - 2,
- cy_g - faktor*(ry-info^.unterlaengen)-2,
- cx_g + Round(faktor/korr_faktor*rx) + 2,
- cy_g - faktor*(ry-info^.unterlaengen)+2);
- SetColor(white);
- END;
-
- FUNCTION f_taste(blink:BOOLEAN):BOOLEAN; {Funktionstaste?}
- BEGIN
- blinker(TRUE);
- IF blink THEN WHILE NOT KeyPressed DO BEGIN
- blinker(TRUE); Delay(200);
- blinker(FALSE); Delay(200);
- END;
- c := ReadKey;
- f_taste := c=#0; {Funktionstaste wurde gedrückt}
- IF c=#0 THEN c:=ReadKey; {wenn Funktionstaste: welche? }
- END;
-
- PROCEDURE bild_neu; {Zeichnet Raster und Zeichen neu}
- BEGIN
- WITH userfont,info^ DO BEGIN
- cx := cx_g; cy := cy_g + faktor*unterlaengen;
- Bar(0,0,txof-1,cy_g+ty); {Raster-Bereich löschen}
- FOR s:=0 TO breite^[b] DO {x-Achse: doppelte Punkte}
- PutPixel(cx+Round(faktor*s/korr_faktor)-1,cy,15);
- FOR s:=0 TO breite^[b] DO { Raster }
- FOR k := unterlaengen TO hoehe DO
- PutPixel(cx + Round(faktor*s/korr_faktor),
- cy - faktor*k,15);
- FOR k := unterlaengen TO hoehe DO
- IF k MOD 5 = 0 THEN BEGIN { Maß-Striche }
- PutPixel(cx-1,cy-faktor*k,1); { y - Achse }
- PutPixel(cx-2,cy-faktor*k,1);
- MoveTo(0,cy-faktor*k);
- Str(k:3,st); meintext(4,st);
- END;
- FOR s:=0 TO breite^[b] DO { x - Achse }
- IF s MOD 5 = 0 THEN BEGIN
- PutPixel(cx + Round(faktor/korr_faktor*s),
- cy - faktor*unterlaengen + 1, 4);
- PutPixel(cx + Round(faktor/korr_faktor*s),
- cy - faktor*unterlaengen + 2, 4);
- Str(s, st);
- MoveTo(cx + Round(faktor/korr_faktor*s) - 5,
- cy - faktor*unterlaengen - 1);
- meintext(4, st);
- END;
- MoveTo(cx, cy);
- zeichne(userfont, b, FALSE, faktor, 0);
- END;
- END;
-
- PROCEDURE vector_schreiben(n:BYTE);
- {Koordinaten eines Knotens}
- BEGIN
- WITH userfont DO BEGIN
- MoveTo(tx*(n AND $F) + 2, cy_t + (ty+1)*(n SHR 4));
- CASE decodiere_vektor(vect^[knoten[n]],
- vect^[knoten[n]+1],
- x,y,linie) OF
- normal: BEGIN
- Bar(GetX,GetY-ty+2,GetX+tx-3,GetY+1);
- Str(x:2,st); meintext(5,st);
- Str(y:2,st); meintext(5,'/'+st);
- IF linie THEN
- Line(GetX-tx+8,GetY+1,GetX+3,GetY+1);
- END;
- ref_zeichen: BEGIN {wird erst in Teil 3 benötigt}
- Bar(GetX,GetY-ty+2,GetX+2*tx-3,GetY+1);
- Str(vect^[knoten[n]+1], st);
- meintext(5, 'R' + #26 + st + ': ');
- Str(vect^[knoten[n]+2]:2, st);
- meintext(5, st);
- END;
- texte: BEGIN {wird erst in Teil 3 benötigt}
- Bar(GetX,GetY-ty+2,GetX+2*tx-3,GetY+1);
- Str(vect^[knoten[n]+2]:3, st);
- meintext(5, 'Txt' + st + ':');
- Str(vect^[knoten[n]+1]*2:2, st);
- meintext(5, st);
- END;
- kreis: BEGIN {wird erst in Teil 3 benötigt}
- Bar(GetX,GetY-ty+2,GetX+2*tx-3,GetY+1);
- Str(vect^[knoten[n]+2] AND $3F, st);
- meintext(5, 'Ellip ' + st + '/');
- Str(vect^[knoten[n]+3] AND $3F, st);
- meintext(5, st);
- END;
- END;
- END;
- END;
-
- PROCEDURE vector_plus_minus(n:INTEGER);
- {Fügt n Eckpunkte ein oder löscht}
- BEGIN
- WITH userfont DO BEGIN
- IF n > 0 THEN
- Move(vect^[paar], vect^[paar + 2*n],
- umfang - 128 - info^.vect_anfang - paar)
- ELSE
- Move(vect^[paar-2*n],vect^[paar],
- umfang - 128 - info^.vect_anfang - paar + 2*n);
- FOR k := b + 1 TO info^.anfang + info^.anzahl - 1 DO
- Inc(offs^[k], 2*n);
- IF (n = 1) AND (vec_art(knoten[akt]) <> normal)
- AND (paar = knoten[akt]) THEN BEGIN
- vect^[knoten[akt]] := $80;
- vect^[knoten[akt]+1] := 0;
- END;
- Inc(anz, n); Inc(paar, 2*n); Inc(umfang, 2*n)
- END;
- END;
-
- PROCEDURE vector_neu; {schreibt alle Koordinaten neu}
- BEGIN
- SetFillStyle(EmptyFill, black);
- Bar(0, cy_t - ty, GetMaxX, GetMaxY);
- anz := 0; paar := off; knoten[0] := off;
- WITH userfont DO
- WHILE (vect^[knoten[anz] + 2] <> 0) OR
- (vect^[knoten[anz] + 3] <> 0) DO BEGIN
- vector_schreiben(anz);
- CASE vec_art(knoten[anz]) OF
- normal : BEGIN Inc(anz); Inc(paar, 2) END;
- ref_zeichen,
- kreis : BEGIN
- knoten[anz+1] := knoten[anz];
- Inc(anz, 2); Inc(paar, 4);
- IF anz+1 = akt THEN Dec(akt);
- END;
- texte : BEGIN
- knoten[anz+1] := knoten[anz];
- Inc(paar,vect^[knoten[anz]+2]+3);
- Inc(anz, 2);
- IF anz+1 = akt THEN Dec(akt);
- END;
- ELSE Exit;
- END; {case}
- knoten[anz] := paar; {Offset des nächsten Knotens}
- END; {while}
- IF akt > anz-1 THEN BEGIN
- akt := anz-1;
- IF vec_art(knoten[akt]) <> normal THEN Dec(akt);
- END;
- rahmen(white);
- END;
-
- FUNCTION vec_laenge(b0:word):word;
- {Ermittelt Anzahl der Vektoren einer Grafik}
- BEGIN
- WITH userfont,info^ DO
- IF b0<anfang+anzahl-1 THEN
- vec_laenge:= offs^[b0+1]-offs^[b0]
- ELSE vec_laenge:= umfang-128-vect_anfang-offs^[b0];
- END;
-
- PROCEDURE kopieren; {Kopiert ein anderes Zeichen}
- VAR altlaenge,neulaenge : word;
- i : INTEGER;
-
- BEGIN
- RestoreCrtMode; ClrScr;
- WriteLn('Sie kopieren nun ein anderes Bild und löschen'+
- ' das aktuelle Bild!');
- WriteLn;
- WriteLn('Welches Bild soll kopiert werden? (0=Ende)');
- i:=bildwahl;
- IF i>0 THEN WITH userfont DO BEGIN
- altlaenge:=vec_laenge(i);
- neulaenge:=vec_laenge(b);
- IF altlaenge<>neulaenge THEN
- vector_plus_minus((altlaenge-neulaenge) SHR 1);
- Move(vect^[offs^[i]],vect^[offs^[b]],altlaenge);
- breite^[b]:=breite^[i]
- END;
- SetGraphMode(GraphMode);
- akt:=0; vector_neu
- END;
-
- PROCEDURE text_eingeben; {Plaziert freien Text in Graphik}
- BEGIN {Folgt in Teil 3}
- END;
-
- PROCEDURE referenz; {Blendet andere Graphik ein}
- BEGIN {Folgt in Teil 3}
- END;
-
- PROCEDURE kreis_zeichnen; {Zeichnet Kreis+Ellipse/Teile}
- BEGIN {Folgt in Teil 3}
- END;
-
- BEGIN {von EDIT}
- WITH userfont DO BEGIN
- off:=offs^[b]; ClearDevice;
- akt:=0; vector_neu; bild_neu;
- REPEAT
- Str(b,st);
- MoveTo(txof,ty-2);
- meintext(5,'Sie bearbeiten:');
- MoveTo(txof,2*ty-2);
- meintext(5,' Bild '+st);
- MoveTo(txof,cy_g);
- meintext(5,'unterstrichen => ');
- MoveTo(txof,cy_g+ty);
- meintext(5,' Linie sichtbar');
- Bar(txof,2*ty,GetMaxX,cy_g-ty-1);
- MoveTo(txof,4*ty);
- meintext(5,'Knoten anwählen --> ['#27#26']');
- MoveTo(txof,5*ty);
- meintext(5,'Verändern --> [V]');
- MoveTo(txof,7*ty);
- meintext(5,'Knoten einfügen --> [F1]');
- MoveTo(txof,8*ty);
- meintext(5,'Knoten löschen --> [F2]');
- MoveTo(txof,11*ty);
- meintext(5,'Bild kopieren --> [F4]');
- MoveTo(txof,13*ty);
- meintext(5,'Raster breiter --> [F7]');
- MoveTo(txof,14*ty);
- meintext(5,'Raster schmaler --> [F8]');
- MoveTo(txof,16*ty);
- meintext(5,'alles löschen --> [F10]');
- MoveTo(txof,18*ty);
- meintext(5,'Ende --> [ESC]');
- WHILE f_taste(NOT blink) DO BEGIN {Funktionstaste ?}
- blinker(FALSE); paar:=knoten[akt];
- CASE c OF
- 'K': IF akt>0 THEN BEGIN (* < *)
- rahmen(black);
- IF vec_art(knoten[akt-1])=normal
- THEN Dec(akt,1)
- ELSE Dec(akt,2);
- rahmen(white)
- END;
- 'M': IF akt<anz-1 THEN BEGIN (* > *)
- rahmen(black);
- IF vec_art(knoten[akt]) = normal
- THEN Inc(akt,1)
- ELSE IF akt<anz-2 THEN Inc(akt,2);
- rahmen(white)
- END;
- ';': BEGIN vector_plus_minus(1); (* F1 *)
- Inc(akt); vector_neu
- END;
- '<': IF anz>1 THEN BEGIN (* F2 *)
- CASE vec_art(knoten[akt]) OF
- normal: vector_plus_minus(-1);
- kreis,ref_zeichen: vector_plus_minus(-2);
- texte: BEGIN paar:=knoten[akt+2];
- vector_plus_minus((knoten[akt]-
- knoten[akt+2])DIV 2)
- END
- END;
- vector_neu
- END;
- 'D': BEGIN paar:=knoten[0]; (* F0 *)
- akt:=0;
- vector_plus_minus(-vec_laenge(b) DIV 2 + 3);
- vect^[off]:=$80; vect^[off+1]:=0;
- vector_neu
- END;
- '>': kopieren; (* F4 *)
- 'B': IF breite^[b]>1 THEN BEGIN Dec(breite^[b]);
- Dec(vect^[knoten[anz]]) (* F8 *)
- END;
- 'A': IF breite^[b]<127 THEN BEGIN Inc(breite^[b]);
- Inc(vect^[knoten[anz]]) (* F7 *)
- END;
- END; {case c}
- IF (c IN ['<','D','>','B','A']) AND NOT KeyPressed
- THEN bild_neu;
- END; {while}
- IF UpCase(c)='V'then {Verändern}
- CASE vec_art(knoten[akt]) OF
- normal :
- BEGIN
- Bar(txof,2*ty,GetMaxX,cy_g-ty-1);
- MoveTo(txof,4*ty);
- meintext(5,'Punkt schieben --> ['#18#29']');
- MoveTo(txof,6*ty);
- meintext(5,'Linie sichtbar --> [Ins]');
- MoveTo(txof,7*ty);
- meintext(5,'Linie unsichtbar--> [Del]');
- MoveTo(txof,9*ty);
- meintext(5,'Bild einblenden --> [F5] ');
- MoveTo(txof,10*ty);
- meintext(5,'Ellipse zeichnen--> [F6] ');
- MoveTo(txof,12*ty);
- meintext(5,'Text eingeben --> [F9] ');
- MoveTo(txof,18*ty);
- meintext(5,' Ende --> [E]');
- REPEAT
- IF f_taste(blink) THEN BEGIN
- CASE c OF
- 'H': vect^[knoten[akt]+1]:= (* ^ *)
- (vect^[knoten[akt]+1] AND $80) OR
- (vect^[knoten[akt]+1]+1) AND $7F;
- 'K': IF vect^[knoten[akt]]>$80 THEN (* < *)
- Dec(vect^[knoten[akt]]);
- 'M': Inc(vect^[knoten[akt]]); (* > *)
- 'P': vect^[knoten[akt]+1]:= (* v *)
- (vect^[knoten[akt]+1] AND $80) OR
- (vect^[knoten[akt]+1]-1) AND $7F;
- '?': referenz; (* F5 *)
- '@': kreis_zeichnen; (* F6 *)
- 'C': text_eingeben; (* F9 *)
- 'R': vect^[knoten[akt]+1]:= (*Ins *)
- vect^[knoten[akt]+1] OR $80;
- 'S': vect^[knoten[akt]+1]:= (*Del *)
- vect^[knoten[akt]+1] AND $7F;
- END;
- vector_schreiben(akt);
- IF NOT KeyPressed THEN bild_neu
- END
- UNTIL UpCase(c) IN ['E','?','@','C',#13]
- END; {normal}
- ref_zeichen,kreis,texte:
- BEGIN
- Bar(txof,2*ty,GetMaxX,cy_g-ty-1);
- Str(vect^[knoten[akt]+1],st);
- MoveTo(txof,3*ty);
- CASE vec_art(knoten[akt]) OF
- ref_zeichen: meintext(5,'Referenz '#26' Bild '+st);
- kreis : meintext(5,'Ellipse (Kreis)');
- texte : BEGIN meintext(5,'Text, ');
- Str(vect^[knoten[akt]+2]:2,st);
- meintext(5,'Länge '+st+', ')
- END
- END;
- MoveTo(txof,6*ty);
- meintext(5,'verschieben: Vektor links');
- MoveTo(txof,8*ty);
- meintext(5,'größer / kleiner--> [+/-]');
- MoveTo(txof,9*ty);
- meintext(5,'drehen --> [PgUp] [PgDn]');
- MoveTo(txof,18*ty);
- meintext(5,' Ende --> [E]');
- REPEAT
- Bar(txof,4*ty,GetMaxX,5*ty); MoveTo(txof,5*ty);
- Str(vect^[knoten[akt]+2]:2,st);
- CASE vec_art(knoten[akt]) OF
- ref_zeichen: BEGIN
- meintext(5,'Größe '+st+'/16, ');
- Str(vect^[knoten[akt]+3]*2,st)
- END;
- kreis: Str(vect^[knoten[akt]] AND $F *3,st);
- texte: BEGIN
- Str(vect^[knoten[akt]] AND $F,st);
- meintext(5,'Größe '+st+', ');
- Str(vect^[knoten[akt]+1]*2,st)
- END;
- END;
- meintext(5,'Drehung '+st+'°');
- IF f_taste(blink) THEN
- CASE c OF
- 'Q': CASE vec_art(knoten[akt]) OF (* PgDn *)
- ref_zeichen:
- IF vect^[knoten[akt]+3]=0 THEN
- vect^[knoten[akt]+3]:=179
- ELSE Dec(vect^[knoten[akt]+3]);
- kreis:
- IF vect^[knoten[akt]] AND $F >0 THEN
- Dec(vect^[knoten[akt]])
- ELSE Inc(vect^[knoten[akt]],$F);
- texte:
- IF vect^[knoten[akt]+1]=0 THEN
- vect^[knoten[akt]+1]:=179
- ELSE Dec(vect^[knoten[akt]+1])
- END;
- 'I': CASE vec_art(knoten[akt]) OF (* PgUp *)
- ref_zeichen: Inc(vect^[knoten[akt]+3]);
- kreis:
- IF vect^[knoten[akt]] AND $F <$F THEN
- Inc(vect^[knoten[akt]])
- ELSE Dec(vect^[knoten[akt]],$F);
- texte:
- IF vect^[knoten[akt]+1]=179 THEN
- vect^[knoten[akt]+1]:=0
- ELSE Inc(vect^[knoten[akt]+1])
- END
- END {case c...}
- ELSE CASE c OF
- '+': CASE vec_art(knoten[akt]) OF
- ref_zeichen: Inc(vect^[knoten[akt]+2]);
- kreis:
- IF (vect^[knoten[akt]+2] AND $3F<$3F) THEN
- Inc(vect^[knoten[akt]+2]);
- texte:
- IF (vect^[knoten[akt]] AND $F < $F) THEN
- Inc(vect^[knoten[akt]])
- END;
- '-': CASE vec_art(knoten[akt]) OF
- ref_zeichen: Dec(vect^[knoten[akt]+2]);
- kreis:
- IF (vect^[knoten[akt]+2] AND $3F>0) THEN
- Dec(vect^[knoten[akt]+2]);
- texte:
- IF (vect^[knoten[akt]] AND $F > 1) THEN
- {Maske für die unteren 4 Bit}
- Dec(vect^[knoten[akt]])
- END;
- END; {if f_taste ...}
- IF c IN ['I','Q','+','-'] THEN BEGIN
- vector_schreiben(akt);
- IF NOT KeyPressed THEN bild_neu
- END
- UNTIL UpCase(c)='E' {Ende von Verändern}
- END {ref_zeichen, kreis, texte}
- END {case vec_art}
- UNTIL c=#27
- END {with}
- END; {Edit}
-
- PROCEDURE editieren; { Rahmenprozedur für EDIT }
- VAR nr:word;
- BEGIN
- WITH userfont,info^ DO
- faktor:=cy_g DIV (hoehe-unterlaengen);
- GotoXY(1,16);
- nr:=bildwahl;
- IF nr>0 THEN BEGIN
- SetGraphMode(GraphMode);
- edit(nr);
- RestoreCrtMode
- END
- END;
-