MODULE SPDrawTriang EXPORTS Main; (* Plots a triangulation on the sphere *) IMPORT Wr, FileRd, Thread, OSError, Process, ParseParams; IMPORT SPTriang, HLR3, LR4; FROM Stdio IMPORT stderr; TYPE Options = RECORD triName: TEXT; (* Triang file (minus ".tri" extension) or "-" *) outName: TEXT; (* Output file (minus ".poly" and ".ps" extension) *) obs: HLR3.Point; (* Position of observer *) upp: HLR3.Point; (* Approximate "up" direction vector *) END; <* FATAL Wr.Failure, Thread.Alerted, OSError.E *> PROCEDURE Main() = BEGIN WITH o = GetOptions(), triRd = FileRd.Open(o.triName & ".tri"), tri = MakeTriRef(SPTriang.Read(triRd)) DO OutputDelaunay(tri^, o.outName, o.obs, o.upp); END; END Main; PROCEDURE OutputDelaunay( READONLY tri: SPTriang.T; name: TEXT; obs, upp: HLR3.Point; ) = <* FATAL Wr.Failure, Thread.Alerted *> BEGIN Wr.PutText(stderr, "Writing " & name & "...\n"); SPTriang.PerspDraw(tri.arc^, name, obs, upp); SPTriang.OutputX3D(tri.side^, name); END OutputDelaunay; PROCEDURE MakeTriRef(READONLY tri: SPTriang.T): REF SPTriang.T = BEGIN WITH t = NEW(REF SPTriang.T) DO t^ := tri; RETURN t END END MakeTriRef; PROCEDURE GetOptions (): Options = VAR o: Options; BEGIN TRY WITH pp = NEW(ParseParams.T).init(stderr) DO pp.getKeyword("-triName"); o.triName := pp.getNext(); pp.getKeyword("-outName"); o.outName := pp.getNext(); IF pp.keywordPresent("-obs") THEN o.obs := ParsePointOption(pp) ELSE o.obs := HLR3.Point{c := LR4.T{0.0d0, 1.0d0, 0.0d0, 0.0d0}} END; IF pp.keywordPresent("-upp") THEN o.upp := ParsePointOption(pp) ELSE o.upp := HLR3.Point{c := LR4.T{0.0d0, 0.0d0, 0.0d0, 1.0d0}} END; pp.finish(); END EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: SPDrawTriang \\\n"); Wr.PutText(stderr, " -triName \\\n"); Wr.PutText(stderr, " -outName \\\n"); Wr.PutText(stderr, " [ -obs ] \\\n"); Wr.PutText(stderr, " [ -upp ] \\\n"); Process.Exit (1); END; RETURN o END GetOptions; PROCEDURE ParsePointOption(pp: ParseParams.T): HLR3.Point RAISES {ParseParams.Error} = VAR p: HLR3.Point; BEGIN FOR i := 0 TO 3 DO p.c[i] := pp.getNextLongReal(-1.0d20, +1.0d20) END; RETURN p END ParsePointOption; BEGIN Main(); END SPDrawTriang.