MODULE GDProgressPlot; IMPORT PSPlot; IMPORT NamedColors AS NC; FROM PSPlot IMPORT Color; IMPORT GDGeometry; FROM GDGeometry IMPORT LONG; REVEAL T = PublicT BRANDED OBJECT f: PSPlot.File; maxTime: Time; maxScore: Score; stepWidth: REAL; (* Width of `step' lines (mm). *) lifeWidth: REAL; (* Width of `life' lines (mm). *) OVERRIDES open := OpenMethod; close := CloseMethod; plotStep := PlotStepMethod; plotLife := PlotLifeMethod; END; PROCEDURE OpenMethod( ppt: T; name: TEXT; (* File name (without the ".eps" extension). *) maxTime: Time; (* Maximum time (for scaling). *) maxScore: Score; (* Maximum score value (for scaling). *) stepWidth: REAL; (* Width of `step' lines (mm). *) lifeWidth: REAL; (* Width of `life' lines (mm). *) ): T = BEGIN ppt.maxTime := maxTime; ppt.maxScore := maxScore; ppt.stepWidth := stepWidth; ppt.lifeWidth := lifeWidth; ppt.f := OpenEPSFile(name, maxTime, FLOAT(maxScore, LONG)); RETURN ppt END OpenMethod; PROCEDURE OpenEPSFile(name: TEXT; maxX, maxY: LONG): PSPlot.File = BEGIN WITH wd = 300.0d0, ht = 100.0d0, f = NEW(PSPlot.EPSFile).open(name & ".eps", wd, ht) DO f.setScale(PSPlot.Axis.X, -0.05d0*maxX, 1.05d0*maxX); f.setScale(PSPlot.Axis.Y, -0.05d0*maxY, 1.05d0*maxY); f.setLineWidth(0.333); f.setLineSolid(); f.setLineColor(PSPlot.Black); f.frame(); f.coordLine(PSPlot.Axis.Y, 0.0d0); f.coordLine(PSPlot.Axis.X, 0.0d0); RETURN f END END OpenEPSFile; PROCEDURE CloseMethod(ppt: T) = BEGIN ppt.f.close() END CloseMethod; PROCEDURE PlotStepMethod( ppt: T; READONLY color: Color; ck0: Time; sc0: Score; ck1: Time; sc1: Score; ck2: Time; ) = VAR y0 := sc0; y1 := sc1; BEGIN WITH f = ppt.f, maxScore = ppt.maxScore DO (* Convert "HugeScore" to something plottable: *) IF sc0 >= HugeScore AND sc1 >= HugeScore THEN y0 := 0.95d0 * maxScore; y1 := y0 ELSE IF sc0 = HugeScore THEN y0 := sc1 + 0.05d0*maxScore END; IF sc1 = HugeScore THEN y1 := sc0 + 0.05d0*maxScore END; END; f.setLineColor(color); f.setLineWidth(ppt.stepWidth); IF sc0 = HugeScore OR sc1 = HugeScore THEN f.setFillColor(color) END; IF sc0 = HugeScore THEN f.circle(ck0, y0, 0.3) END; f.segment(ck0, y0, ck1, y1); IF sc1 = HugeScore THEN f.circle(ck1, y1, 0.3) ELSIF ck2 > ck1 THEN f.setLineColor(NC.MdGray); f.segment(ck1, y1, ck2, y1); END; END; END PlotStepMethod; PROCEDURE PlotLifeMethod( ppt: T; READONLY color: Color; ck0: Time; sc: Score; ck1: Time; ) = BEGIN IF sc < HugeScore THEN WITH f = ppt.f DO f.setLineWidth(ppt.lifeWidth); f.setLineColor(color); f.segment(ck0, sc, ck1, sc) END END END PlotLifeMethod; BEGIN END GDProgressPlot. (* Last edited on 2000-01-12 17:07:31 by stolfi *)