DIRECTORY Atom, FS, GGBasicTypes, GGError, GGEvent, GGFileIn, GGInterfaceTypes, GGModelTypes, GGObjects, GGOutline, GGParseIn, GGSegmentTypes, GGSlice, GGTraj, GGUtility, Imager, ImagerColor, IO, Rope, ViewerClasses; GGFileInImpl: CEDAR PROGRAM IMPORTS Atom, GGError, GGEvent, GGObjects, GGOutline, GGParseIn, GGSlice, GGTraj, GGUtility, Imager, IO, Rope EXPORTS GGFileIn = BEGIN Viewer: TYPE = ViewerClasses.Viewer; Color: TYPE = Imager.Color; GargoyleData: TYPE = GGInterfaceTypes.GargoyleData; Outline: TYPE = GGModelTypes.Outline; Point: TYPE = GGBasicTypes.Point; Scene: TYPE = GGModelTypes.Scene; Segment: TYPE = GGSegmentTypes.Segment; SegmentClass: TYPE = GGSegmentTypes.SegmentClass; Slice: TYPE = GGModelTypes.Slice; SliceClass: TYPE = GGModelTypes.SliceClass; StrokeEnd: TYPE = Imager.StrokeEnd; Traj: TYPE = GGModelTypes.Traj; Problem: PUBLIC SIGNAL [msg: Rope.ROPE] = GGError.Problem; FileinSceneAndOptions: PUBLIC PROC [f: IO.STREAM, gargoyleData: GargoyleData] = { sceneName: Rope.ROPE; scene: Scene _ gargoyleData.scene; version: REAL; count: NAT; entity: REF ANY; finger, newEntities: LIST OF REF ANY; GGParseIn.ReadBlankAndRope[f, "Gargoyle file for scene:"]; sceneName _ GGParseIn.ReadBlankAndWord[f]; GGParseIn.ReadBlankAndRope[f, "Produced by version"]; version _ GGParseIn.ReadBlankAndReal[f]; IF version >= 8607.17 THEN ReadOptions[f, gargoyleData]; GGParseIn.ReadBlankAndRope[f, "Entities:"]; GGParseIn.ReadBlankAndRope[f, "["]; count _ GGParseIn.ReadNAT[f]; GGParseIn.ReadRope[f, "]:"]; GGParseIn.ReadWhiteSpace[f]; [newEntities, finger] _ GGUtility.StartList[]; FOR i: NAT IN[1..count] DO entity _ FileinEntity[f, version, gargoyleData.feedback]; IF entity#NIL THEN [newEntities, finger] _ GGUtility.AddEntity[entity, newEntities, finger]; ENDLOOP; GGObjects.AddEntities[scene, newEntities]; f.Close[]; }; ReadOptions: PROC [f: IO.STREAM, gargoyleData: GargoyleData] = { keyWord, option: Rope.ROPE; good: BOOL; nextChar: CHAR; twoCRsFound: BOOL _ FALSE; UNTIL twoCRsFound DO [keyWord, good] _ GGParseIn.ReadKeyWord[f]; IF NOT good THEN { nextChar _ IO.PeekChar[f]; IF nextChar = IO.CR THEN { [] _ IO.GetChar[f]; twoCRsFound _ TRUE; }; LOOP}; good _ GGParseIn.ReadHorizontalBlank[f]; IF NOT good THEN { nextChar _ IO.PeekChar[f]; IF nextChar = IO.CR THEN { [] _ IO.GetChar[f]; twoCRsFound _ TRUE; }; LOOP}; option _ GGParseIn.ReadLine[f]; ProcessOption[keyWord, option, gargoyleData]; nextChar _ IO.PeekChar[f]; IF nextChar = IO.CR THEN { [] _ IO.GetChar[f]; twoCRsFound _ TRUE; }; ENDLOOP; }; ProcessOption: PROC[keyWord, option: Rope.ROPE, gargoyleData: GargoyleData] = { optionStream: IO.STREAM _ IO.RIS[option]; optionList: LIST OF Rope.ROPE; value: REAL; SELECT TRUE FROM Rope.Equal[keyWord, "Slope", FALSE] => { optionList _ GGParseIn.ReadListOfRope[optionStream]; FOR list: LIST OF Rope.ROPE _ optionList, list.rest UNTIL list = NIL DO value _ GGParseIn.ReadReal[IO.RIS[list.first]]; GGEvent.AddSlopeInternal[gargoyleData, value]; ENDLOOP; }; Rope.Equal[keyWord, "Angle", FALSE] => { optionList _ GGParseIn.ReadListOfRope[optionStream]; FOR list: LIST OF Rope.ROPE _ optionList, list.rest UNTIL list = NIL DO value _ GGParseIn.ReadReal[IO.RIS[list.first]]; GGEvent.AddAngleInternal[gargoyleData, value]; ENDLOOP; }; Rope.Equal[keyWord, "Radius", FALSE] => { optionList _ GGParseIn.ReadListOfRope[optionStream]; FOR list: LIST OF Rope.ROPE _ optionList, list.rest UNTIL list = NIL DO value _ GGParseIn.ReadReal[IO.RIS[list.first]]; GGEvent.AddRadiusInternal[gargoyleData, value]; ENDLOOP; }; Rope.Equal[keyWord, "LineDistance", FALSE] => { optionList _ GGParseIn.ReadListOfRope[optionStream]; FOR list: LIST OF Rope.ROPE _ optionList, list.rest UNTIL list = NIL DO value _ GGParseIn.ReadReal[IO.RIS[list.first]]; GGEvent.AddDistanceInternal[gargoyleData, value]; ENDLOOP; }; Rope.Equal[keyWord, "Midpoints", FALSE] => { on, good: BOOL; GGParseIn.ReadBlank[optionStream]; [on, good] _ GGParseIn.ReadBOOL[optionStream]; GGEvent.SetMidpointsInternal[gargoyleData, on AND good]; }; ENDCASE => SIGNAL Problem[msg: "Unknown keyword in gargoyle file."]; }; -- end ProcessOption FileinSceneOnly: PUBLIC PROC [f: IO.STREAM, scene: Scene] = { sceneName: Rope.ROPE; version: REAL; count: NAT; entity: REF ANY; finger, newEntities: LIST OF REF ANY; GGParseIn.ReadRope[f, "Gargoyle file for scene:"]; GGParseIn.ReadBlank[f]; sceneName _ GGParseIn.ReadWord[f]; GGParseIn.ReadWhiteSpace[f]; GGParseIn.ReadRope[f, "Produced by version"]; GGParseIn.ReadBlank[f]; version _ GGParseIn.ReadReal[f]; GGParseIn.ReadWhiteSpace[f]; IF version >= 8607.17 THEN SkipOptions[f]; GGParseIn.ReadRope[f, "Entities:"]; GGParseIn.ReadBlank[f]; GGParseIn.ReadRope[f, "["]; count _ GGParseIn.ReadNAT[f]; GGParseIn.ReadRope[f, "]:"]; GGParseIn.ReadWhiteSpace[f]; [newEntities, finger] _ GGUtility.StartList[]; FOR i: NAT IN[1..count] DO entity _ FileinEntity[f, version, NIL]; IF entity#NIL THEN [newEntities, finger] _ GGUtility.AddEntity[entity, newEntities, finger]; ENDLOOP; GGObjects.AddEntities[scene, newEntities]; f.Close[]; }; SkipOptions: PROC [f: IO.STREAM] = { keyWord, option: Rope.ROPE; good: BOOL; nextChar: CHAR; twoCRsFound: BOOL _ FALSE; GGParseIn.ReadBlank[f]; UNTIL twoCRsFound DO [keyWord, good] _ GGParseIn.ReadKeyWord[f]; IF NOT good THEN { nextChar _ IO.PeekChar[f]; IF nextChar = IO.CR THEN { [] _ IO.GetChar[f]; twoCRsFound _ TRUE; }; LOOP}; good _ GGParseIn.ReadHorizontalBlank[f]; IF NOT good THEN { nextChar _ IO.PeekChar[f]; IF nextChar = IO.CR THEN { [] _ IO.GetChar[f]; twoCRsFound _ TRUE; }; LOOP}; option _ GGParseIn.ReadLine[f]; nextChar _ IO.PeekChar[f]; IF nextChar = IO.CR THEN { [] _ IO.GetChar[f]; twoCRsFound _ TRUE; }; ENDLOOP; }; FileinEntity: PROC [f: IO.STREAM, version: REAL, feedback: Viewer] RETURNS [entity: REF ANY] = { nextWord: Rope.ROPE; nextWord _ GGParseIn.ReadBlankAndWord[f]; IF version > 8605.22 THEN SELECT TRUE FROM Rope.Equal[nextWord, "Outline:"] => { entity _ FileinOutline[f, version]; }; Rope.Equal[nextWord, "Slice"] => { entity _ FileinSlice[f, version, feedback]; }; ENDCASE => ERROR ELSE SELECT TRUE FROM Rope.Equal[nextWord, "Outline:"] => { entity _ FileinOutline[f, version]; }; Rope.Equal[nextWord, "Cluster"] => { entity _ FileinSlice[f, version, feedback]; }; ENDCASE => ERROR; }; FileinSlice: PROC [f: IO.STREAM, version: REAL, feedback: Viewer] RETURNS [slice: Slice] = { className: Rope.ROPE; type: ATOM; childCount: NAT; GGParseIn.ReadBlankAndRope[f, "(class:"]; className _ GGParseIn.ReadBlankAndWord[f]; GGParseIn.ReadBlankAndRope[f, ")"]; GGParseIn.ReadBlankAndRope[f, "["]; GGParseIn.ReadBlank[f]; childCount _ GGParseIn.ReadNAT[f]; GGParseIn.ReadBlankAndRope[f, "]:"]; GGParseIn.ReadBlankAndRope[f, "Data:"]; type _ SliceClassFromRope[className]; slice _ FileinSliceData[f, type, version, feedback]; }; FileinSliceData: PROC [f: IO.STREAM, type: ATOM, version: REAL, feedback: Viewer] RETURNS [slice: Slice] = { class: SliceClass; class _ GGSlice.FetchSliceClass[type]; slice _ class.filein[f, version, feedback]; }; FileinOutline: PROC [f: IO.STREAM, version: REAL] RETURNS [outline: Outline] = { fillColor: Color; strokeEnd: StrokeEnd; count: NAT; fence, hole: Traj; hasCircle: BOOL _ FALSE; GGParseIn.ReadBlankAndRope[f, "fillColor:"]; GGParseIn.ReadBlank[f]; fillColor _ GGParseIn.ReadColor[f]; GGParseIn.ReadBlankAndRope[f, "strokeEnd:"]; GGParseIn.ReadBlank[f]; strokeEnd _ GGParseIn.ReadStrokeEnd[f]; GGParseIn.ReadBlankAndRope[f, "Trajectories:"]; GGParseIn.ReadBlankAndRope[f, "["]; GGParseIn.ReadBlank[f]; count _ GGParseIn.ReadNAT[f]; GGParseIn.ReadBlankAndRope[f, "]"]; [fence, hasCircle] _ GGTraj.Filein[f, version]; IF hasCircle THEN fillColor _ NIL; -- needed for the transition from circle/disc class outline _ GGOutline.CreateOutline[fence, strokeEnd, fillColor]; FOR i: NAT IN [1..count-1] DO [hole, ----] _ GGTraj.Filein[f, version]; outline _ GGOutline.AddHole[outline, hole]; ENDLOOP; }; SliceClassFromRope: PROC [className: Rope.ROPE] RETURNS [type: ATOM] = { RETURN[Atom.MakeAtom[className] ]; }; END. File: GGFileInImpl.mesa Last edited by Bier on January 13, 1987 10:18:06 pm PST Copyright c 1986 by Xerox Corporation. All rights reserved. Contents: Recreates a gargoyle database from a text file of the sort produced by GGFileOut.mesa. Pier, October 29, 1986 8:31:16 pm PST Read in the Header Read in the alignment objects, etc. Read in the scene entities GGParseIn.ReadBlank[f]; Read in the Header Read in the alignment objects, etc. Read in the scene entities ProcessOption[keyWord, option, gargoyleData]; ส P– "cedar" style˜procšœ™Kšœ7™7Jšœ ฯmœ1™<šœ`™`Icode™%——K˜šฯk ˜ Kšœžœฎžœ˜ฮ—K˜šฯn œžœž˜Kšžœ^žœ˜mKšžœ ž˜—˜Kšœžœ˜$Kšœžœ˜Kšœžœ!˜3Kšœ žœ˜%Kšœžœ˜!Kšœžœ˜!Kšœ žœ˜'Kšœžœ˜1Kšœžœ˜!Kšœ žœ˜+Kšœ žœ˜#Kšœžœ˜K˜KšŸœžœžœ žœ˜:—K˜š Ÿœžœžœžœžœ!˜QKšœžœ˜Kšœ"˜"Kšœ žœ˜Kšœžœ˜ Kšœžœžœ˜š œžœžœžœžœ˜%Kšฯb™—Kšœ:˜:Kšœ*˜*Kšœ5˜5šœ(˜(Kš #™#—šžœžœ˜8Kš ™—Kšœ+˜+Kšœ#˜#Kšœ˜Kšœ9˜9Kšœ.˜.šžœžœžœ ž˜Kšœ   œ$˜9LšžœžœžœJ˜\Kšžœ˜—Kšœ*˜*Kšœ ˜ Kšœ˜K˜—šŸ œžœžœžœ!˜@Jšœžœ˜Jšœžœ˜ Jšœ žœ˜Jšœ žœžœ˜Jšœ™šžœ ž˜J˜+šžœžœžœ˜Jšœ žœ ˜šžœ žœžœžœ˜Jšœžœ ˜Jšœžœ˜J˜—Jšžœ˜—Jšœ(˜(šžœžœžœ˜Jšœ žœ ˜šžœ žœžœžœ˜Jšœžœ ˜Jšœžœ˜J˜—Jšžœ˜—Jšœ˜Jšœ-˜-Jšœ žœ ˜šžœ žœžœžœ˜Jšœžœ ˜Jšœžœ˜J˜——Jšžœ˜J˜—šŸ œžœžœ!˜OJš œžœžœžœžœ ˜)Jšœ žœžœžœ˜Jšœžœ˜ šžœžœž˜šœžœ˜(Jšœ4˜4š žœžœžœžœžœžœž˜GJšœžœžœ˜/Jšœ œ˜.Jšžœ˜—Jšœ˜—šœžœ˜(Jšœ4˜4š žœžœžœžœžœžœž˜GJšœžœžœ˜/Jšœ œ˜.Jšžœ˜—Jšœ˜—šœžœ˜)Jšœ4˜4š žœžœžœžœžœžœž˜GJšœžœžœ˜/Jšœ œ˜/Jšžœ˜—Jšœ˜—šœ$žœ˜/Jšœ4˜4š žœžœžœžœžœžœž˜GJšœžœžœ˜/Jšœ œ˜1Jšžœ˜—Jšœ˜—šœ!žœ˜,Jšœ žœ˜Jšœ"˜"Jšœ.˜.Jšœ œžœ˜8Jšœ˜—Lšžœžœ3˜D—Lšœฯc˜J˜J˜—š Ÿœžœžœžœžœ˜=Kšœžœ˜Kšœ žœ˜Kšœžœ˜ Kšœžœžœ˜š œžœžœžœžœ˜%Kš ™—Kšœ2˜2Kšœ˜Kšœ"˜"Kšœ˜Kšœ-˜-Kšœ˜Kšœ ˜ šœ˜Kš #™#—šžœžœ˜*Kš ™—Kšœ#˜#Kšœ˜Kšœ˜Kšœ˜Kšœ9˜9Kšœ.˜.šžœžœžœ ž˜Kšœ"žœ˜'LšžœžœžœJ˜\Kšžœ˜—Kšœ*˜*Kšœ ˜ Kšœ˜K˜—šŸ œžœžœžœ˜$Jšœžœ˜Jšœžœ˜ Jšœ žœ˜Jšœ žœžœ˜Jšœ˜šžœ ž˜J˜+šžœžœžœ˜Jšœ žœ ˜šžœ žœžœžœ˜Jšœžœ ˜Jšœžœ˜J˜—Jšžœ˜—Jšœ(˜(šžœžœžœ˜Jšœ žœ ˜šžœ žœžœžœ˜Jšœžœ ˜Jšœžœ˜J˜—Jšžœ˜—Jšœ˜Jšœ-™-Jšœ žœ ˜šžœ žœžœžœ˜Jšœžœ ˜Jšœžœ˜J˜——Jšžœ˜J˜J˜—šŸ œžœžœžœ žœžœ žœžœ˜`Kšœžœ˜Kšœ)˜)šžœž˜šžœžœž˜šœ%˜%Jšœ#˜#Kšœ˜—šœ"˜"Jšœ+˜+Kšœ˜—Kšžœž˜——šž˜šžœžœž˜šœ%˜%Jšœ#˜#Kšœ˜—šœ$˜$Jšœ+˜+Kšœ˜—Kšžœžœ˜——Kšœ˜K˜—š Ÿ œžœžœžœ žœžœ˜\Kšœžœ˜Kšœžœ˜ Kšœ žœ˜Kšœ)˜)Kšœ*˜*Kšœ#˜#Kšœ#˜#Kšœ˜Kšœ"˜"Kšœ$˜$Kšœ'˜'Kšœ%˜%Kšœ4˜4K˜K˜—šŸœžœžœžœžœ žœžœ˜lK˜Kšœ&˜&Kšœ+˜+K˜K˜—š Ÿ œžœžœžœ žœžœ˜PKšœ˜Kšœ˜Kšœžœ˜ Kšœ˜Kšœ žœžœ˜Kšœ,˜,Kšœ˜Kšœ#˜#Kšœ,˜,Kšœ˜Kšœ'˜'Kšœ/˜/Kšœ#˜#Kšœ˜Kšœ˜Kšœ#˜#Kšœ/˜/Lšžœ žœ žœก3˜VKšœ?˜?šžœžœžœž˜Kšœกœ˜)Kšœ+˜+—Kšžœ˜K˜K˜—š Ÿœžœžœžœžœ˜HKšžœ˜"K˜—K˜Kšžœ˜—…—T,ช