PACKET picfile DEFINES (*Autor: H.Indenbirken *) (*Stand: 23.02.1985 *) PICFILE, :=, picture file, plot, select pen, selected pen, background, set values, get values, view, viewport, window, oblique, orthographic, perspective, extrema, put, get, to first pic, to eof, to pic, up, down, is first picture, eof, picture no, pictures, delete picture, insert picture, read picture, write picture, put picture: LET max pics = 1024, pic dataspace = 1102; TYPE PICFILE = BOUND STRUCT (INT size, pos, background, ROW 16 ROW 3 INT pens, ROW 16 BOOL hidden, ROW 3 ROW 2 REAL sizes, ROW 2 ROW 2 REAL limits, ROW 4 REAL angles, ROW 2 REAL obliques, ROW 3 REAL perspectives ROW max pics PICTURE pic); TEXT VAR i text :: ""0""0"", r text :: ""0""0""0""0""0""0""0""0""; INT VAR i; OP := (PICFILE VAR p, DATASPACE CONST d) : IF type (d) = pic dataspace THEN CONCR (p) := d ELIF type (d) < 0 THEN type (d, pic dataspace) ; CONCR (p) := d ; init picfile dataspace ; ELSE errorstop ("dataspace is no PICFILE") FI . init picfile dataspace : r.size := 0; r.pos := 0; r.background := 0; r.sizes := ROW 3 ROW 2 REAL : (ROW 2 REAL : (0.0, 1.0), ROW 2 REAL : (0.0, 1.0), ROW 2 REAL : (0.0, 1.0)); r.limits := ROW 2 ROW 2 REAL : (ROW 2 REAL : (0.0, 1.0), ROW 2 REAL : (0.0, 1.0)); r.angles := ROW 4 REAL : (0.0, 0.0, 0.0, 0.0); r.obliques := ROW 2 REAL : (0.0, 0.0); r.perspectives := ROW 3 REAL : (0.0, 0.0, 0.0); FOR i FROM 1 UPTO 16 REP r.pens [i] := ROW 3 INT : (1, 0, 1); r.hidden [i] := TRUE PER . r : CONCR (CONCR (p)). END OP :=; DATASPACE PROC picture file (TEXT CONST name) : IF exists (name) THEN old (name) ELSE new (name) FI END PROC picture file; PROC plot (TEXT CONST name) : PICFILE VAR p :: old (name); plot (p); END PROC plot; PROC plot (PICFILE VAR p) : set values (p.sizes, p.limits, p.angles, p.obliques, p.perspectives); begin plot; clear; FOR i FROM 1 UPTO p.size REP IF pen (p.pic [i]) <> 0 THEN plot pic FI PER; end plot . plot pic: pen (p.background, p.pens (pen (p.pic (i)))(1), p.pens (pen (p.pic (i)))(2), p.pens (pen (p.pic (i)))(3)); hidden lines (p.hidden [pen (p.pic [i])]); plot (p.pic (i)) . END PROC plot; PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line type, BOOL CONST hidden): IF pen < 1 OR pen > 16 THEN errorstop ("pen out of range") FI; p.pens [pen] := ROW 3 INT : (colour, thickness, line type); p.hidden [pen] := hidden END PROC select pen; PROC selected pen (PICFILE CONST p, INT CONST pen, INT VAR colour, thickness, line type, BOOL VAR hidden): IF pen < 1 OR pen > 16 THEN errorstop ("pen out of range") FI; colour := p.pens [pen][1]; thickness := p.pens [pen][2]; line type := p.pens [pen][3]; hidden := p.hidden [pen] END PROC selected pen; INT PROC background (PICFILE CONST p): p.background END PROC background; PROC background (PICFILE VAR p, INT CONST colour): p.background := colour END PROC background; PROC get values (PICFILE CONST p, ROW 3 ROW 2 REAL VAR size, ROW 2 ROW 2 REAL VAR limits, ROW 4 REAL VAR angles, ROW 2 REAL VAR oblique, ROW 3 REAL VAR perspective) : size := p.sizes; limits := p.limits; angles := p.angles; oblique := p.obliques; perspective := p.perspectives; END PROC get values; PROC set values (PICFILE VAR p, ROW 3 ROW 2 REAL CONST size, ROW 2 ROW 2 REAL CONST limits, ROW 4 REAL CONST angles, ROW 2 REAL CONST oblique, ROW 3 REAL CONST perspective) : p.sizes := size; p.limits := limits; p.angles := angles; p.obliques := oblique; p.perspectives := perspective; END PROC set values; PROC view (PICFILE VAR p, REAL CONST alpha): p.angles [1] := alpha END PROC view; PROC view (PICFILE VAR p, REAL CONST phi, theta): p.angles [2] := sind (theta) * cosd (phi); p.angles [3] := sind (theta) * sind (phi); p.angles [4] := cosd (theta); END PROC view; PROC view (PICFILE VAR p, REAL CONST x, y, z): p.angles [2] := x; p.angles [3] := y; p.angles [4] := z END PROC view; PROC viewport (PICFILE VAR p,REAL CONST hor min,hor max,vert min,vert max) : p.limits := ROW 2 ROW 2 REAL : (ROW 2 REAL : (hor min, hor max), ROW 2 REAL : (vert min, vert max)) END PROC viewport; PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max) : window (p, x min, x max, y min, y max, 0.0, 1.0) END PROC window; PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max, z min, z max) : p.sizes := ROW 3 ROW 2 REAL : (ROW 2 REAL : (x min, x max), ROW 2 REAL : (y min, y max), ROW 2 REAL : (z min, z max)) END PROC window; PROC oblique (PICFILE VAR p, REAL CONST a, b) : p.obliques := ROW 2 REAL : (a, b); p.perspectives := ROW 3 REAL : (0.0, 0.0, 0.0) END PROC oblique; PROC orthographic (PICFILE VAR p) : p.obliques := ROW 2 REAL : (0.0, 0.0); p.perspectives := ROW 3 REAL : (0.0, 0.0, 0.0) END PROC orthographic; PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz) : p.obliques := ROW 2 REAL : (0.0, 0.0); p.perspectives := ROW 3 REAL : (cx, cy, cz) END PROC perspective; PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max) : REAL VAR dummy; extrema (p, x min, x max, y min, y max, dummy, dummy) END PROC extrema; PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z min,z max) : REAL VAR new x min, new x max, new y min, new y max, new z min, new z max; x min := max real; x max := - max real; y min := max real; y max := - max real; z min := max real; z max := - max real; FOR i FROM 1 UPTO p.size REP IF dim (p.pic [i]) = 2 THEN extrema (p.pic [i], new x min, new x max, new y min, new y max) ELSE extrema (p.pic [i], new x min, new x max, new y min, new y max, new z min, new z max) FI; x min := min (x min, new x min); x max := max (x max, new x max); y min := min (y min, new y min); y max := max (y max, new y max); z min := min (z min, new z min); z max := max (z max, new z max); PER END PROC extrema; PROC put (FILE VAR f, PICFILE CONST p): put line (f, parameter); FOR i FROM 1 UPTO p.size REP put line (f, text (p.pic [i])) PER . parameter: intern (p.size) + intern (p.pos) + intern (p.background) + intern (p.pens) + intern (p.hidden) + intern (p.sizes) + intern (p.limits) + intern (p.angles) + intern (p.obliques) + intern (p.perspectives) . END PROC put; PROC get (PICFILE VAR p, FILE VAR f): TEXT VAR record; get line (f, record); convert parameter; FOR i FROM 1 UPTO p.size REP get line (f, record); p.pic [i] := picture (record) PER . convert parameter: convert (record, p.size); convert (record, p.pos); convert (record, p.background); convert (record, p.pens); convert (record, p.hidden); convert (record, p.sizes); convert (record, p.limits); convert (record, p.angles); convert (record, p.obliques); convert (record, p.perspectives) . END PROC get; PROC to first pic (PICFILE VAR p): p.pos := 1 END PROC to first pic; PROC to eof (PICFILE VAR p): p.pos := p.size+1 END PROC to eof; PROC to pic (PICFILE VAR p, INT CONST n): IF n < 1 THEN errorstop ("Position underflow") ELIF n > p.size THEN errorstop ("Position after end of PICFILE") ELSE p.pos := n FI END PROC to pic; PROC up (PICFILE VAR p): to pic (p, p.pos-1) END PROC up; PROC up (PICFILE VAR p, INT CONST n): to pic (p, p.pos-n) END PROC up; PROC down (PICFILE VAR p): to pic (p, p.pos+1) END PROC down; PROC down (PICFILE VAR p, INT CONST n): to pic (p, p.pos+n) END PROC down; BOOL PROC is first picture (PICFILE CONST p): p.pos = 1 END PROC is first picture; BOOL PROC eof (PICFILE CONST p): p.pos >= p.size END PROC eof; INT PROC picture no (PICFILE CONST p): p.pos END PROC picture no; INT PROC pictures (PICFILE CONST p): p.size END PROC pictures; PROC delete picture (PICFILE VAR p) : INT VAR i; FOR i FROM p.pos+1 UPTO p.size REP p.pic [i-1] := p.pic [i] PER; p.pic [p.size] := nilpicture; IF p.size > 1 THEN p.size DECR 1 FI END PROC delete picture; PROC insert picture (PICFILE VAR p) : INT VAR i; IF p.size >= max pics THEN errorstop ("PICFILE overflow") ELSE p.size INCR 1; FOR i FROM p.size DOWNTO p.pos+1 REP p.pic [i] := p.pic [i-1] PER; p.pic [p.pos] := nilpicture; FI END PROC insert picture; PROC read picture (PICFILE VAR p, PICTURE VAR pic) : pic := p.pic (p.pos) . END PROC read picture; PROC write picture (PICFILE VAR p, PICTURE CONST pic) : p.pic (p.pos) := pic . END PROC write picture; PROC put picture (PICFILE VAR p, PICTURE CONST pic) : IF p.size >= max pics THEN errorstop ("PICFILE overflow") ELSE p.size INCR 1; p.pic [p.size] := pic; FI END PROC put picture; TEXT PROC intern (INT CONST n): replace (i text, 1, n); i text END PROC intern; TEXT PROC intern (ROW 16 ROW 3 INT CONST n): INT VAR i, j; TEXT VAR result :: ""; FOR i FROM 1 UPTO 16 REP FOR j FROM 1 UPTO 3 REP result CAT intern (n [i][j]) PER PER; result END PROC intern; TEXT PROC intern (ROW 16 BOOL CONST n): INT VAR i, result :: 0; FOR i FROM 1 UPTO 16 REP IF n [i] THEN set bit (result, i-1) FI PER; intern (result) END PROC intern; TEXT PROC intern (REAL CONST r): replace (r text, 1, r); r text END PROC intern; TEXT PROC intern (ROW 3 ROW 2 REAL CONST r): INT VAR i, j; TEXT VAR result :: ""; FOR i FROM 1 UPTO 3 REP FOR j FROM 1 UPTO 2 REP result CAT intern (r [i][j]) PER PER; result END PROC intern; TEXT PROC intern (ROW 2 ROW 2 REAL CONST r): INT VAR i, j; TEXT VAR result :: ""; FOR i FROM 1 UPTO 2 REP FOR j FROM 1 UPTO 2 REP result CAT intern (r [i][j]) PER PER; result END PROC intern; TEXT PROC intern (ROW 4 REAL CONST r): intern (r [1]) + intern (r [2]) + intern (r [3]) + intern (r [4]) END PROC intern; TEXT PROC intern (ROW 3 REAL CONST r): intern (r [1]) + intern (r [2]) + intern (r [3]) END PROC intern; TEXT PROC intern (ROW 2 REAL CONST r): intern (r [1]) + intern (r [2]) END PROC intern; PROC convert (TEXT VAR record, INT VAR n): n := record ISUB 1; record := subtext (record, 3) END PROC convert; PROC convert (TEXT VAR record, ROW 16 ROW 3 INT VAR n): INT VAR i, j; FOR i FROM 1 UPTO 16 REP FOR j FROM 1 UPTO 3 REP convert (record, n [i][j]) PER PER END PROC convert; PROC convert (TEXT VAR record, ROW 16 BOOL VAR n): INT VAR i, result; convert (record, result); FOR i FROM 1 UPTO 16 REP n [i] := bit (i-1, result) PER END PROC convert; PROC convert (TEXT VAR record, REAL VAR r): r := record RSUB 1; record := subtext (record, 9) END PROC convert; PROC convert (TEXT VAR record, ROW 3 ROW 2 REAL VAR r): INT VAR i, j; FOR i FROM 1 UPTO 3 REP FOR j FROM 1 UPTO 2 REP convert (record, r [i][j]) PER PER; END PROC convert; PROC convert (TEXT VAR record, ROW 2 ROW 2 REAL VAR r): INT VAR i, j; FOR i FROM 1 UPTO 2 REP FOR j FROM 1 UPTO 2 REP convert (record, r [i][j]) PER PER; END PROC convert; PROC convert (TEXT VAR record, ROW 4 REAL VAR r): convert (record, r [1]); convert (record, r [2]); convert (record, r [3]); convert (record, r [4]) END PROC convert; PROC convert (TEXT VAR record, ROW 3 REAL VAR r): convert (record, r [1]); convert (record, r [2]); convert (record, r [3]) END PROC convert; PROC convert (TEXT VAR record, ROW 2 REAL VAR r): convert (record, r [1]); convert (record, r [2]) END PROC convert; END PACKET picfile