--Write Contour
--Written by M.Stone
--Last changed by M.Stone 8-Jan-82 14:49:20

DIRECTORY
	CurveDefs,
	GriffinFig,
	Rope USING [Ref],
	Vector USING[Add,Mul,Vec];

CurveFitIO: PROGRAM IMPORTS GriffinFig,Vector EXPORTS CurveDefs =
BEGIN OPEN CurveDefs;

lineStyleID: GriffinFig.LineStyleID;

OpenFile: PUBLIC PROC [file: Rope.Ref] = {
	black: GriffinFig.ColorID;
	GriffinFig.NewFile[file];
	black ← GriffinFig.Color[0,0,0,177777B];
	lineStyleID ← GriffinFig.LineStyle[black,1];
	};
CloseFile: PUBLIC PROC = {GriffinFig.CloseFile};

WriteContour: PUBLIC PROC[contour: ContourHandle, s: REAL, t: Vector.Vec] = {
	sl: SListHandle ← contour.sLists;
	enter: PROC[sa: SampleHandle] = {GriffinFig.EnterPoint[XFormPt[sa.xy]]};
	scale ← s; translate ← t;
	GriffinFig.StartPath[];
	ForAllSamples[contour,enter];
	GriffinFig.EnterPoint[XFormPt[sl.samples.xy]];
	[] ← GriffinFig.LineObject[lineStyleID, GriffinFig.EndPath[]];
	};

WriteSamples: PUBLIC PROC[samples: SampleHandle] = {
	s: SampleHandle ← samples;
	GriffinFig.StartPath[];
	DO
	  GriffinFig.EnterPoint[s.xy];
	  s ← s.next;
	  IF s=NIL OR s=samples THEN EXIT;
	  ENDLOOP;
	[] ← GriffinFig.EndPath[];
	};

WriteTraj: PUBLIC PROCEDURE[t: TrajHandle, first: BOOLEAN ← FALSE] = {
	l: LinkHandle ← t.links;
	IF first THEN GriffinFig.StartPath[] ELSE GriffinFig.NewBoundary[];
	DO GriffinFig.EnterCubic[l.cubic];
		IF l=t.lastLink THEN EXIT ELSE l ← l.next;
		ENDLOOP;
	[] ← GriffinFig.EndPath[];
	};

scale: REAL ← 1;
translate: Vector.Vec ← [0,0];
XFormPt: PROC[p: Vector.Vec] RETURNS [Vector.Vec] = {
	RETURN[Vector.Mul[Vector.Add[translate,p],scale]];
	};
	
ForAllSamples: PROC [c: ContourHandle,proc: PROC[sa: SampleHandle]] = {
	sl: SListHandle ← c.sLists;
	sa: SampleHandle ← NIL;
	UNTIL sl=NIL DO
		sa ← sl.samples;
		UNTIL sa=NIL DO
			proc[sa];
			IF sa=sl.lastSample THEN EXIT ELSE sa ← sa.next;
			ENDLOOP;
		IF sl=c.lastSList THEN EXIT ELSE sl ← sl.next;
		ENDLOOP
	};
		

END.