<> <> <> <> <> DIRECTORY Feedback, Imager, ImagerColor, IO, Rope, Shading, SV3d, SVViewerTools, TFI3d, ViewerClasses, ViewerTools; SVViewerToolsImpl: CEDAR PROGRAM IMPORTS Feedback, ImagerColor, IO, Rope, Shading, TFI3d, ViewerTools EXPORTS SVViewerTools = BEGIN Color: TYPE = Imager.Color; Point3d: TYPE = SV3d.Point3d; Viewer: TYPE = ViewerClasses.Viewer; GetReal: PUBLIC PROC [textViewer: Viewer, default: REAL] RETURNS [r: REAL] = { rRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; IF Rope.Size[rRope] = 0 THEN r _ default ELSE { IF Rope.Find[rRope, ".", 0, FALSE] = -1 THEN rRope _ Rope.Concat[rRope, ".0"]; r _ IO.GetReal[IO.RIS[rRope]]; }; }; GetBool: PUBLIC PROC [textViewer: Viewer] RETURNS [b: BOOL] = { bRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; b _ IF Rope.Equal[bRope, "TRUE"] THEN TRUE ELSE FALSE; }; GetColor: PUBLIC PROC [textViewer: Viewer] RETURNS [color: Color, success: BOOL] = { r, g, b: REAL; success _ TRUE; [r, g, b] _ GetThreeReals[textViewer]; IF r > 1 OR r < 0 THEN {Feedback.AppendRaw[$Solidviews, "r value must be between 0 and 1", oneLiner]; Feedback.BlinkRaw[$Solidviews]; success _ FALSE}; IF g > 1 OR g < 0 THEN {Feedback.AppendRaw[$Solidviews, "g value must be between 0 and 1", oneLiner]; Feedback.BlinkRaw[$Solidviews]; success _ FALSE}; IF b > 1 OR b < 0 THEN {Feedback.AppendRaw[$Solidviews, "b value must be between 0 and 1", oneLiner]; Feedback.BlinkRaw[$Solidviews]; success _ FALSE}; IF success THEN color _ ImagerColor.ColorFromRGB [[r, g, b]]; }; GetThreeReals: PUBLIC PROC [textViewer: Viewer] RETURNS [x, y, z: REAL] = { wholeRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; wholeStream: IO.STREAM _ IO.RIS[wholeRope]; threeNumsThere: BOOL _ TRUE; TFI3d.ReadBlank[wholeStream]; x _ TFI3d.ReadReal[wholeStream]; TFI3d.ReadBlankAndRope[wholeStream, "," !TFI3d.RopeNotOnTop => {threeNumsThere _ FALSE; CONTINUE}]; IF NOT threeNumsThere THEN y _ x ELSE { TFI3d.ReadBlank[wholeStream]; y _ TFI3d.ReadReal[wholeStream]}; TFI3d.ReadBlankAndRope[wholeStream, "," !TFI3d.RopeNotOnTop => {threeNumsThere _ FALSE; CONTINUE}]; IF NOT threeNumsThere THEN z _ y ELSE { TFI3d.ReadBlank[wholeStream]; z _ TFI3d.ReadReal[wholeStream]}; }; GetNat: PUBLIC PROC [textViewer: Viewer] RETURNS [n: NAT] = { nRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; IF Rope.Size[nRope] = 0 THEN n _ 0 ELSE { n _ IO.GetInt[IO.RIS[nRope]]; }; }; GetPoint: PUBLIC PROC [textViewer: Viewer] RETURNS [point: Point3d, success: BOOL] = { <,]".>> pointRope: Rope.ROPE _ ViewerTools.GetContents[textViewer]; f: IO.STREAM _ IO.RIS[pointRope]; ReadRope[f, "["]; point[1] _ ReadBlankAndReal[f]; ReadRope[f, ","]; point[2] _ ReadBlankAndReal[f]; ReadRope[f, ","]; point[3] _ ReadBlankAndReal[f]; ReadRope[f, "]"]; success _ TRUE; }; SetReal: PUBLIC PROC [viewer: Viewer, real: REAL] = { s: IO.STREAM; realRope: Rope.ROPE; s _ IO.ROS[]; s.PutF["%g", [real[real]]]; realRope _ IO.RopeFromROS[s]; ViewerTools.SetContents[viewer, realRope]; }; SetBool: PUBLIC PROC [viewer: Viewer, bool: BOOL] = { s: IO.STREAM; boolRope: Rope.ROPE; s _ IO.ROS[]; s.PutF["%g", [boolean[bool]]]; boolRope _ IO.RopeFromROS[s]; ViewerTools.SetContents[viewer, boolRope]; }; SetColor: PUBLIC PROC [viewer: Viewer, color: Color] = { r,g,b: REAL; [r,g,b] _ Shading.ExtractRGB[color]; SetThreeReals[viewer, r, g, b]; }; SetThreeReals: PUBLIC PROC [viewer: Viewer, a, b, c: REAL] = { s: IO.STREAM; realsRope: Rope.ROPE; s _ IO.ROS[]; s.PutF["%g, %g, %g", [real[a]], [real[b]], [real[c]]]; realsRope _ IO.RopeFromROS[s]; ViewerTools.SetContents[viewer, realsRope]; }; SetPoint: PUBLIC PROC [viewer: Viewer, point: Point3d] = { pointRope: Rope.ROPE; pointRope _ IO.PutFR["[%g,%g,%g]", [real[point[1]]], [real[point[2]]], [real[point[3]]]]; ViewerTools.SetContents[viewer, pointRope]; }; ReadRope: PUBLIC PROC [f: IO.STREAM, rope: Rope.ROPE] = { <> <> c: CHAR; endofstream: BOOL _ FALSE; FOR i: INT IN[1..Rope.Length[rope]] DO c _ IO.GetChar[f ! IO.EndOfStream => {endofstream _ TRUE; CONTINUE}]; IF endofstream THEN SIGNAL RopeNotOnTop [IO.GetIndex[f], NIL, rope]; IF NOT c = Rope.Fetch[rope,i-1] THEN SIGNAL RopeNotOnTop [IO.GetIndex[f], Rope.FromChar[c], rope]; ENDLOOP; }; RopeNotOnTop: PUBLIC SIGNAL [position: NAT, wasThere: Rope.ROPE, notThere: Rope.ROPE] = CODE; ReadBlankAndReal: PROC [f: IO.STREAM] RETURNS [r: REAL] = { <> ReadBlank[f]; r _ ReadReal[f]; }; ReadBlank: PROC [f: IO.STREAM] = { <'s, 's, and 's until something else is encountered. Doesn't mind if no white space characters are found. Treats comments as white space.>> [] _ IO.SkipWhitespace[f, TRUE]; }; ReadReal: PROC [f: IO.STREAM] RETURNS [r: REAL] = { <, or . Leaves these terminators on the stream.>> realRope: Rope.ROPE; end: BOOL _ FALSE; [realRope, ----] _ IO.GetTokenRope[f, RealBreakProc !IO.EndOfStream => {end _ TRUE; CONTINUE}]; IF end THEN {r _ 0.0; RETURN}; IF Rope.Find[realRope, ".", 0, FALSE] = -1 THEN realRope _ Rope.Concat[realRope, ".0"]; r _ IO.GetReal[IO.RIS[realRope]]; }; RealBreakProc: PROC [char: CHAR] RETURNS [IO.CharClass] = { SELECT char FROM '], ', => RETURN [break]; IO.CR =>RETURN [break]; IO.SP => RETURN [break]; ENDCASE => RETURN [other]; }; END.