PACKET basis plot DEFINES (* Autor: Heiko Indenbirken*) (* Stand: 12.04.85 *) (*Änderung: 06.08.86/10:03 *) (* ****************** Hardwareunabhängiger Teil ********************* *) (* *) (* *) (* Im Harwareunabhängigen Paket 'basis plot' werden folgende *) (* Prozeduren definiert: *) (* Procedure : Bedeutung *) (* ---------------------------------------------------------------- *) (* move : Positioniert auf (x, y,[z]) in Weltkoordinaten*) (* draw : Zeichnet eine Linie bis zum Punkt (x, y, [z]).*) (* move r : Positioniert (x, y, [z]) weiter *) (* draw r : Zeichnet (x, y, [z]) weiter *) (* *) (* draw : Zeichnet einen Text *) (* *) (* mark : Marker mit (no, size) *) (* bar : Balken mit (width, height, pattern) *) (* bar : Balken mit (from, to, width, pattern) *) (* circle : Kreis(segment) mit (radius, from, to, pattern)*) (* *) (* where : Gibt die aktuelle Stiftposition (x, y, [z]) *) (* *) (*************************************************************************) move, draw, move r, draw r, mark, bar, circle, where: LET POS = STRUCT (REAL x, y, z); POS VAR pos :: POS : (0.0, 0.0, 0.0); INT VAR h :: 0, v :: 0; PROC move (REAL CONST x, y) : transform (x, y, 0.0, h, v); move (h, v); pos := POS : (x, y, 0.0) END PROC move; PROC move (REAL CONST x, y, z) : transform (x, y, z, h, v); move (h, v); pos := POS : (x, y, z) END PROC move; PROC draw (REAL CONST x, y) : transform (x, y, 0.0, h, v); draw (h, v); pos := POS : (x, y, 0.0) END PROC draw; PROC draw (REAL CONST x, y, z) : transform (x, y, z, h, v); draw (h, v); pos := POS : (x, y, z) END PROC draw; PROC move r (REAL CONST x, y) : transform (pos.x+x, pos.y+y, pos.z, h, v); move (h, v); pos := POS : (pos.x+x, pos.y+y, pos.z) END PROC move r; PROC move r (REAL CONST x, y, z) : transform (pos.x+x, pos.y+y, pos.z+z, h, v); move (h, v); pos := POS : (pos.x+x, pos.y+y, pos.z+z) END PROC move r; PROC draw r (REAL CONST x, y) : transform (pos.x+x, pos.y+y, pos.z, h, v); draw (h, v); pos := POS : (pos.x+x, pos.y+y, pos.z) END PROC draw r; PROC draw r (REAL CONST x, y, z) : transform (pos.x+x, pos.y+y, pos.z+z, h, v); draw (h, v); pos := POS : (pos.x+x, pos.y+y, pos.z+z) END PROC draw r; PROC where (REAL VAR x, y) : x := pos.x; y := pos.y END PROC where; PROC where (REAL VAR x, y, z) : x := pos.x; y := pos.y; z := pos.z END PROC where; PROC draw (TEXT CONST msg, REAL CONST angle, height percent, width percent): draw (msg, angle, height (height percent), width (width percent)) . END PROC draw; PROC mark (REAL CONST size, INT CONST no): marker (h, v, no, diagonal (size)) END PROC mark; PROC bar (REAL CONST width, height, INT CONST pattern): INT VAR diff, up, zero x, zero y; transform (0.0, 0.0, 0.0, zero x, zero y); transform (width*0.5, height, 0.0, diff, up); bar (h-(diff-zero x), v, h+(diff-zero x), v+(up-zero y), pattern); move (h, v) END PROC bar; PROC bar (REAL CONST from, to, height, INT CONST pattern): INT VAR from h, to h, up; transform (from, height, 0.0, from h, up); transform (to, height, 0.0, to h, up); bar (from h, v, to h, up, pattern); move (h, v) END PROC bar; PROC circle (REAL CONST rad, from, to, INT CONST pattern): circle (h, v, diagonal (rad), from, to, pattern) . END PROC circle; ENDPACKET basis plot; PACKET plot DEFINES plot: (*Autor: Heiko Indenbirken *) (*Stand: 13.10.89/22:31 *) LET draw key = 1, move key = 2, text key = 3, move r key = 4, draw r key = 5, bar 2 key = 6, bar 3 key = 7, circle key = 8, mark key = 9; LET dim error = "PICTURE not initialized", key error = "wrong key code: "; TEXT VAR points; INT VAR pic length, pic pen, pic dim, read pos; PICTURE VAR pic; PROC plot (PICTURE CONST pic): init plot; IF pic dim = 2 THEN plot two dim pic ELIF pic dim = 3 THEN plot three dim pic ELIF NOT (pic dim = 0 AND pic length = 0) THEN errorstop (dim error) FI; points := "" . init plot: picture (pic, points, pic dim, pic pen); pic length := length (points); read pos := 0 . plot two dim pic: WHILE read pos < pic length REP plot two dim position PER . plot two dim position : read pos INCR 1; SELECT key OF CASE draw key: draw (next real, next real) CASE move key: move (next real, next real) CASE move r key: move r (next real, next real) CASE draw r key: draw r (next real, next real) CASE text key: draw (next text, next real, next real, next real) CASE bar 2 key: bar (next real, next real, next int) CASE bar 3 key: bar (next real, next real, next real, next int) CASE circle key: circle (next real, next real, next real, next int) CASE mark key: mark (next real, next int) OTHERWISE errorstop (key error + text (key)) END SELECT . plot three dim pic: WHILE read pos < pic length REP plot three dim position PER . plot three dim position : read pos INCR 1; SELECT key OF CASE draw key: draw (next real, next real, next real) CASE move key: move (next real, next real, next real) CASE move r key: move r (next real, next real, next real) CASE draw r key: draw r (next real, next real, next real) CASE text key: draw (next text, next real, next real, next real) CASE bar 2 key: bar (next real, next real, next int) CASE bar 3 key: bar (next real, next real, next real, next int) CASE circle key: circle (next real, next real, next real, next int) CASE mark key: mark (next real, next int) OTHERWISE errorstop (key error + text (key)) END SELECT . key: code (points SUB read pos) . END PROC plot; REAL PROC next real: read pos INCR 8; subtext (points, read pos-7, read pos) RSUB 1 . END PROC next real; INT PROC next int: read pos INCR 2; subtext (points, read pos-1, read pos) ISUB 1 . END PROC next int; TEXT PROC next text: INT CONST text length :: next int; read pos INCR text length; subtext (points, read pos-text length+1, read pos) . END PROC next text; PROC plot (TEXT CONST name) : PICFILE VAR p :: old (name); plot (p); END PROC plot; PROC plot (PICFILE VAR p) : set projektion; disable stop; begin plot; clear screen; plot pictures (p); errorcheck; end plot . set projektion: ROW 3 ROW 2 REAL VAR size; ROW 2 ROW 2 REAL VAR limit; ROW 4 REAL VAR angles; ROW 2 REAL VAR oblique; ROW 3 REAL VAR perspective; get values (p, size, limit, angles, oblique, perspective); set values (size, limit, angles, oblique, perspective) . clear screen: INT VAR x0, y0, x1, y1, h max, v max; REAL VAR x cm, y cm; IF background (p) > -1 THEN clear ELSE drawing area (x cm, y cm, h max, v max); new values (x cm, y cm, h max, v max, x0, x1 , y0, y1); set range (max (0, x0), max (0, y0), min (h max, x1), min (v max, y1)) FI . errorcheck: IF is error THEN line; put line ("Erorr at PICTURE No " + text (picture no (p))); FI . END PROC plot; PROC plot pictures (PICFILE VAR p): INT VAR back :: abs (background (p)), no; enable stop; FOR no FROM 1 UPTO pictures (p) REP to pic (p, no); read picture (p, pic); IF this picture is ok THEN set pen of pic; plot (pic) FI PER . this picture is ok: pen (pic) <> 0 AND length (pic) > 0 . set pen of pic: INT VAR colour, thick, type; selected pen (p, pen (pic), colour, thick, type); set pen (back, colour, thick, type) . END PROC plot pictures; END PACKET plot