<> <> <> <> <> DIRECTORY Feedback, Imager, ImagerColor, IO, Rope, Shading, SVViewerTools, TFI3d, ViewerClasses, ViewerTools; SVViewerToolsImpl: CEDAR PROGRAM IMPORTS Feedback, ImagerColor, IO, Rope, Shading, TFI3d, ViewerTools EXPORTS SVViewerTools = BEGIN Color: TYPE = Imager.Color; 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]]; }; }; 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]; }; END.