<> <> <> <> <> DIRECTORY Atom, FileNames, GGBasicTypes, AtomButtons, Feedback, GGFileOut, GGInterfaceTypes, GGModelTypes, GGScene, GGParseOut, GGSegmentTypes, IO, Rope; GGFileOutImpl: CEDAR PROGRAM IMPORTS Atom, FileNames, AtomButtons, Feedback, GGScene, GGParseOut, IO EXPORTS GGFileOut = BEGIN EntityGenerator: TYPE = GGModelTypes.EntityGenerator; FenceHoleOpen: TYPE = GGModelTypes.FenceHoleOpen; GGData: TYPE = GGInterfaceTypes.GGData; Outline: TYPE = GGModelTypes.Outline; Point: TYPE = GGBasicTypes.Point; ScalarButtonClient: TYPE = AtomButtons.ScalarButtonClient; Scene: TYPE = GGModelTypes.Scene; Segment: TYPE = GGSegmentTypes.Segment; Slice: TYPE = GGModelTypes.Slice; SliceGenerator: TYPE = GGModelTypes.SliceGenerator; Traj: TYPE = GGModelTypes.Traj; TwoState: TYPE = AtomButtons.TwoState; Problem: PUBLIC SIGNAL [msg: Rope.ROPE] = Feedback.Problem; versionRope: Rope.ROPE; Init: PROC [] ~ { <> <> <> <> <> <> <> <> <> <> <> versionRope _ "8705.14"; }; <> <> <> <> <> <> <> <> <> <> <> <<};>> <<>> FileoutSceneAndOptions: PUBLIC PROC [f: IO.STREAM, ggData: GGData, fileName: Rope.ROPE] = { sliceGen: SliceGenerator _ GGScene.TopLevelSlicesInScene[ggData.scene]; sliceCount: NAT _ CountSlices[ggData.scene]; fileName _ FileNames.GetShortName[fileName]; f.PutF["Gargoyle file for scene: %g\n", [rope[fileName]]]; f.PutF["Produced by version %g\n\n", [rope[versionRope]]]; FileoutAlignments[f, ggData]; f.PutF["Entities: [%g]:\n\n", [integer[sliceCount]]]; FOR slice: Slice _ GGScene.NextSlice[sliceGen], GGScene.NextSlice[sliceGen] UNTIL slice = NIL DO FileoutSlice[f, slice]; ENDLOOP; }; <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <<>> <<>> FileoutSceneOnly: PUBLIC PROC [f: IO.STREAM, scene: Scene, fileName: Rope.ROPE] = { sliceGen: SliceGenerator _ GGScene.TopLevelSlicesInScene[scene]; sliceCount: NAT _ CountSlices[scene]; fileName _ FileNames.GetShortName[fileName]; f.PutF["Gargoyle file for scene: %g\n", [rope[fileName]]]; f.PutF["Produced by version %g\n\n", [rope[versionRope]]]; <> f.PutChar[IO.CR]; f.PutChar[IO.CR]; f.PutF["Entities: [%g]:\n\n", [integer[sliceCount]]]; FOR slice: Slice _ GGScene.NextSlice[sliceGen], GGScene.NextSlice[sliceGen] UNTIL slice = NIL DO FileoutSlice[f, slice]; ENDLOOP; }; PrintButtonValues: PROC [f: IO.STREAM, firstButton: ScalarButtonClient] = { IF firstButton = NIL THEN SIGNAL Problem[msg: "There should always be a dummy first button."]; firstButton _ firstButton.next; IF firstButton # NIL THEN { f.PutF["%g", [real[firstButton.value]]]; FOR thisButton: ScalarButtonClient _ firstButton.next, thisButton.next UNTIL thisButton = NIL DO f.PutF[", %g", [real[thisButton.value]]]; ENDLOOP; }; }; FileoutAlignments: PROC [f: IO.STREAM, ggData: GGData] = { firstButton: ScalarButtonClient; stateInfo: TwoState; midPointsOn: BOOL; f.PutF["Slope: "]; firstButton _ ggData.hitTest.slopeHeader.scalarButtons; PrintButtonValues[f, firstButton]; f.PutChar[IO.CR]; f.PutF["Angle: "]; firstButton _ ggData.hitTest.angleHeader.scalarButtons; PrintButtonValues[f, firstButton]; f.PutChar[IO.CR]; f.PutF["Radius: "]; firstButton _ ggData.hitTest.radiusHeader.scalarButtons; PrintButtonValues[f, firstButton]; f.PutChar[IO.CR]; f.PutF["LineDistance: "]; firstButton _ ggData.hitTest.distanceHeader.scalarButtons; PrintButtonValues[f, firstButton]; f.PutChar[IO.CR]; f.PutF["Midpoints: "]; stateInfo _ ggData.hitTest.midpointButton; midPointsOn _ AtomButtons.GetButtonState[stateInfo] = on; GGParseOut.WriteBOOL[f, midPointsOn]; f.PutChar[IO.CR]; f.PutChar[IO.CR]; }; CountSlices: PROC [scene: Scene] RETURNS [count: NAT] = { sliceGen: SliceGenerator _ GGScene.TopLevelSlicesInScene[scene]; count _ 0; FOR slice: Slice _ GGScene.NextSlice[sliceGen], GGScene.NextSlice[sliceGen] UNTIL slice = NIL DO count _ count + 1; ENDLOOP; }; <> <> < FileoutSlice[f, slice];>> < outline.class.fileout[outline, f];>> < ERROR;>> <<};>> <<>> <> <> <> <> <> <> <> <<};>> <<>> FileoutSlice: PUBLIC PROC [f: IO.STREAM, slice: Slice] = { className: Rope.ROPE _ Atom.GetPName[slice.class.type]; f.PutF["%g\n", [rope[className]] ]; slice.class.fileout[slice, f]; f.PutChar[IO.CR]; f.PutChar[IO.CR]; }; Init[]; END.