Преглед изворни кода

(Re-)create graphs from .MtA data files.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7311 8c9fc860-2736-0410-a75d-ab315db34111
eth.hunzikerp пре 8 година
родитељ
комит
2066ac423a
1 измењених фајлова са 129 додато и 10 уклоњено
  1. 129 10
      source/WMSimpleGraphs.Mod

+ 129 - 10
source/WMSimpleGraphs.Mod

@@ -5,7 +5,7 @@ MODULE WMSimpleGraphs;	(** AUTHOR "Patrick Hunziker"; PURPOSE "Minimum-overhead
 (*ToDo: ticks for Graph. labels on axes *)
 (*ToDo: catch NaN and Inf in data and other strategies to avoid erratic window sizes*)
 
-IMPORT Strings, WMGraphics, WMRectangles, Modules, Reals, WM:=WMWindowManager, MathL, Raster;
+IMPORT Strings, WMGraphics, WMRectangles, WMMessages, Modules, Reals, Files, Streams, WM:=WMWindowManager, MathL, Raster, Commands;
 
 CONST Colors=[WMGraphics.Red,WMGraphics.Blue,WMGraphics.Green,WMGraphics.Yellow, WMGraphics.Magenta, WMGraphics.Cyan, WMGraphics.Gray];
 		MinSize=30;
@@ -17,6 +17,7 @@ TYPE
 TYPE
 	Window=OBJECT(WM.BufferWindow);
 	VAR width,height:LONGINT;
+		data:ARRAY [?] OF LONGREAL;
 	
 		PROCEDURE Update(w,h: LONGINT);
 		BEGIN
@@ -27,6 +28,7 @@ TYPE
 		BEGIN
 			Init^(w,h, alpha); 
 			Update(w,h);
+			INCL(flags, WM.FlagStorable);
 		END Init;
 
 		PROCEDURE Resized( width, height: LONGINT);
@@ -42,11 +44,26 @@ TYPE
 			Invalidate(rect);
 		END Resized;
 		
+		PROCEDURE Handle*(VAR x : WMMessages.Message);
+		VAR filename: Files.FileName; f:Files.File; w:Files.Writer;
+		BEGIN
+			IF (x.msgType = WMMessages.MsgSerialize) THEN
+				GenerateName(GetTitle(),filename);
+				Strings.Append(filename, ".MtA"); (* file type "MathArray" *)
+				f:=Files.New(filename);
+				Files.OpenWriter(w,f,0);
+				StoreLR(w, data);
+				w.Update;
+				Files.Register(f);	
+			ELSE Handle^(x)
+			END
+		END Handle;
+
+		
 	END Window;
 	
 	Histogram* = OBJECT (Window);
-	VAR 
-		data:ARRAY [*] OF LONGREAL;
+	
 
 		PROCEDURE &New*(CONST data: ARRAY [*] OF LONGREAL; CONST title: ARRAY OF CHAR);
 		VAR max:LONGREAL; w0,h0:LONGINT;
@@ -63,6 +80,8 @@ TYPE
 			SetPointerInfo(manager.pointerCrosshair);
 		END New;
 		
+
+		
 		PROCEDURE NewData*(CONST data: ARRAY [*] OF LONGREAL);
 		BEGIN
 			SELF.data:=data;
@@ -88,7 +107,7 @@ TYPE
 	(** display matrix values in checkerboard like fashion. positive values are in black/grey/white, negative values in red*)
 	Matrix* = OBJECT (Window);
 	VAR 
-		data:ARRAY [*,*] OF LONGREAL;
+		(*data:ARRAY [*,*] OF LONGREAL;*)
 		max,min, offset, gain:LONGREAL;
 
 		PROCEDURE &New*(CONST data: ARRAY [*,*] OF LONGREAL; CONST title: ARRAY OF CHAR);
@@ -125,7 +144,6 @@ TYPE
 		END NewData;
 
 		PROCEDURE Update(w,h: LONGINT);
-		VAR i:LONGINT;
 		VAR col: WMGraphics.Color; x,y:LONGINT; val:LONGREAL; valI:LONGINT;
 		BEGIN
 			FOR y:=0 TO LEN(data,0)-1 DO
@@ -149,7 +167,7 @@ TYPE
 	Graph* = OBJECT (Window);
 	CONST border=5;
 	VAR 
-		data:ARRAY [*] OF LONGREAL;
+		(*data:ARRAY [*] OF LONGREAL;*)
 		max,min:LONGREAL;
 
 		PROCEDURE &New*(CONST data: ARRAY [*] OF LONGREAL; CONST title: ARRAY OF CHAR);
@@ -202,7 +220,7 @@ END Graph;
 Graphs* = OBJECT (Window);
 	CONST border=5;
 	VAR 
-		data:ARRAY [*,*] OF LONGREAL;
+		(*data:ARRAY [*,*] OF LONGREAL;*)
 		max,min:LONGREAL;
 
 		PROCEDURE &New*(CONST data: ARRAY [*,*] OF LONGREAL; CONST title: ARRAY OF CHAR);
@@ -257,7 +275,7 @@ END Graphs;
 GraphXY* = OBJECT (Window);
 	CONST border=5; scaleRatio=0.95;
 	VAR 
-		data:ARRAY [*,*] OF LONGREAL;
+		(*data:ARRAY [*,*] OF LONGREAL;*)
 		minx,miny,maxx,maxy:LONGREAL;
 		ticks: ARRAY [*,*] OF LONGREAL;
 
@@ -293,11 +311,11 @@ GraphXY* = OBJECT (Window);
 		PROCEDURE GetTicks ; (*ticks along X, along Y, at decimal units*)
 		VAR maxx,maxy,stepx,stepy: LONGREAL; log:LONGREAL; steps,i:LONGINT;
 		BEGIN
-			maxx:=MAX(ABS(data[0]));
+			maxx:=MAX(ABS(data[0,*]));
 			log:=Log10(maxx);
 			stepx:=Exp10(log);
 			
-			maxy:=MAX(ABS(data[1]));
+			maxy:=MAX(ABS(data[1,*]));
 			log:=Log10(maxy);
 			stepy := Exp10(log);
 			
@@ -435,6 +453,51 @@ BEGIN
 	slope:=1; intercept:=2;
 END DummyRegressor;
 
+PROCEDURE WriteLR(W:Streams.Writer; CONST t: ARRAY [?] OF LONGREAL);
+VAR len: ARRAY [*] OF LONGINT; i:LONGINT;
+BEGIN
+	ASSERT(DIM(t)>0);
+	len:=LEN(t);
+	IF  DIM(t)=1 THEN 
+		FOR i:=0 TO LEN(t,0)-1 DO W.RawLReal(t[i]) END;
+	ELSE
+		FOR i:=0 TO LEN(t,0)-1 DO WriteLR(W, t[i,?]) END;
+	END;
+END WriteLR;
+
+PROCEDURE StoreLR(W:Streams.Writer; CONST t: ARRAY [?] OF LONGREAL);
+VAR i:LONGINT; len: ARRAY [*] OF LONGINT;
+BEGIN
+	W.String("TENSOR 1.0 LR "); (* type, version *) W.Ln;
+	W.Int(DIM(t),0);
+	len:=LEN(t);
+	FOR i:=0 TO LEN(len,0)-1 DO W.Char(" "); W.Int(len[i],0); END;
+	W.Ln;
+	WriteLR(W,t);
+	W.Update;
+END StoreLR;
+
+PROCEDURE GenerateName(prefix: Strings.String; VAR str: ARRAY OF CHAR);
+VAR  i,j:LONGINT; title: Files.FileName; c:CHAR;
+BEGIN
+	i:=0; j:=0;
+	IF prefix#NIL THEN
+		WHILE (i<LEN(prefix)) & (j<LEN(title)-1) DO
+			c:=prefix[i];
+			IF (c>="A")&(c<="Z") OR (c>="a")&(c<="z") OR(c>="0")&(c<="9") OR (c="_") OR (c=" ")THEN
+				IF c=" " THEN c:="_" END;
+				title[j]:=c; INC(i); INC(j);
+			ELSE
+				INC(i);
+			END;
+		END;
+		title[j]:=0X;
+		IF title="" THEN title:="GraphData" END;
+	ELSE title:="GraphData"
+	END;
+	COPY(title, str);
+END GenerateName;
+
 VAR Pos, PosX,PosY: LONGINT;
 
 PROCEDURE Demo*;
@@ -471,6 +534,61 @@ BEGIN {EXCLUSIVE}
 	g.NewData([-2,7,8,4,5,9,6,4,7,8,4,5,9,6]);
 END Demo1;*)
 
+(* from MatrixUtilities.Mod*)
+PROCEDURE LoadData(R:Streams.Reader): ARRAY [?] OF LONGREAL;
+VAR s: ARRAY 16 OF CHAR; i, k:LONGINT; len: ARRAY [*] OF LONGINT;
+BEGIN
+	R.Ln(s);
+	ASSERT(s="TENSOR 1.0 LR "); 
+	IF R.GetInteger(k, FALSE) THEN NEW(len,k) ELSE HALT(200) END;
+	FOR i:=0 TO k-1 DO 
+		IF R.GetInteger(len[i],FALSE) THEN END;
+	END;
+	R.SkipLn;
+	IF (DIM(RESULT)#k) OR (LEN(RESULT)#len) THEN NEW(RESULT,len) END;
+	ReadLR(R,RESULT);
+	RETURN RESULT
+END LoadData;
+
+PROCEDURE ReadLR(R:Streams.Reader; VAR t: ARRAY [?] OF LONGREAL);
+VAR i:LONGINT;
+BEGIN
+	ASSERT(DIM(t)>0);
+	IF  DIM(t)=1 THEN 
+		FOR i:=0 TO LEN(t,0)-1 DO R.RawLReal(t[i]) END;
+	ELSE
+		FOR i:=0 TO LEN(t,0)-1 DO ReadLR(R, t[i,?]) END;
+	END;
+END ReadLR;
+
+(* Draw Graph from File, currently implemented for .MtA Files (see MatrixUtilities.Mod) *)
+PROCEDURE Open*(context:Commands.Context);
+VAR filename: Files.FileName; type: ARRAY 16 OF CHAR; 
+	data: ARRAY [?] OF LONGREAL;
+	f:Files.File; r:Files.Reader;
+	h:Histogram; g:Graph; k: Graphs; gx:GraphXY; m:Matrix; s:Scatter; rg:Regression;
+BEGIN
+	IF context.arg.GetString(filename) THEN
+		IF Strings.Pos(".MtA",filename)<0 THEN context.out.String("wrong file type of "); context.out.String(filename); context.out.Ln; context.out.Update;
+		ELSE
+			IF ~context.arg.GetString(type) THEN type:="" END;
+			f:=Files.Old(filename);
+			IF f#NIL THEN
+				Files.OpenReader(r,f,0);
+				data:=LoadData(r);
+				IF type="Histogram" THEN NEW(h, data, filename); 
+				ELSIF type="Matrix" THEN NEW(m, data, filename);
+				ELSIF type="Graph" THEN NEW(g, data, filename);
+				ELSIF type="Graphs" THEN NEW(k, data, filename);
+				ELSIF type="GraphXY" THEN NEW(gx, data, filename);
+				ELSIF type="Scatter" THEN NEW(s, data, filename);
+				ELSIF type="Regression" THEN NEW(rg, data, filename,DummyRegressor);
+				ELSE
+				END;
+			END;
+		END
+	END;
+END Open;
 
 
 PROCEDURE Cleanup;
@@ -498,4 +616,5 @@ SystemTools.FreeDownTo MatrixBase ~
 Compiler.Compile -p=Win32G WMSimpleGraphs.Mod ~
 
 WMSimpleGraphs.Demo 1 ~
+WMSimpleGraphs.Open  MultiGraph.MtA Graphs~