-- File: Fileout3dImpl.mesa -- Last edited by Bier on December 19, 1982 5:55 pm -- Author: Eric Bier on July 6, 1983 4:29 pm -- Contents: Facilities for creating text files and writing out a human-readable version of a 3d object database DIRECTORY CoordSys, DisplayList3d, Fileout3d, IO, Matrix3d, Rope, Shading, SVArtwork, SweepGeometry, TFO3d; Fileout3dImpl: PROGRAM IMPORTS CoordSys, IO, DisplayList3d, TFO3d EXPORTS Fileout3d = BEGIN Artwork: TYPE = SVArtwork.Artwork; Matrix4by4: TYPE = Matrix3d.Matrix4by4; Point3d: TYPE = Matrix3d.Point3d; AssemblyList: TYPE = REF AssemblyListObj; AssemblyListObj: TYPE = DisplayList3d.AssemblyListObj; Assembly: TYPE = REF AssemblyObj; AssemblyObj: TYPE = DisplayList3d.AssemblyObj; MasterObject: TYPE = REF MasterObjectRec; MasterObjectRec: TYPE = DisplayList3d.MasterObjectRec; MasterObjectList: TYPE = DisplayList3d.MasterObjectList; Scene: TYPE = REF SceneObj; SceneObj: TYPE = DisplayList3d.SceneObj; LightSource: TYPE = REF LightSourceObj; LightSourceObj: TYPE = Shading.LightSourceObj; LightSourceList: TYPE = LIST OF LightSource; LinearMesh: TYPE = REF LinearMeshRecord; LinearMeshRecord: TYPE = SweepGeometry.LinearMeshRecord; RevoluteMesh: TYPE = REF RevoluteMeshRecord; RevoluteMeshRecord: TYPE = SweepGeometry.RevoluteMeshRecord; LinearMeshArray: TYPE = SweepGeometry.LinearMeshArray; RevoluteMeshArray: TYPE = SweepGeometry.RevoluteMeshArray; CoordSystem: TYPE = REF CoordSysObj; CoordSysObj: TYPE = CoordSys.CoordSysObj; CoordSysList: TYPE = CoordSys.CoordSysList; FileoutScene: PUBLIC PROC [scene: Scene, f: IO.STREAM, fileName: Rope.ROPE] = { f.PutF["File: %g\n",[rope[fileName]]]; f.PutF["3D file for scene: %g\n",[rope[fileName]]]; f.PutF["Produced by %g\n\n", [rope[DisplayList3d.versionRope]]]; f.PutF["Background color: "]; TFO3d.FileoutColor[f, scene.backgroundColor]; f.PutChar[IO.CR]; f.PutChar[IO.CR]; scene.coordSystems _ CoordSys.SortCoordSysListByBreadth[scene.coordSystems]; FileoutCoordSystems[f,scene.coordSystems]; FileoutLightSources[f,scene.lightSources]; FileoutObjects[f,scene.masterObjects]; FileoutAssembly[f, scene.assembly, scene.masterObjects]; f.PutF["END"]; f.Close[]; scene.dirty _ FALSE; }; CountCoordSystems: PROC [csl: CoordSysList] RETURNS [count: NAT] = { count _ 0; FOR list: CoordSysList _ csl, list.rest UNTIL list = NIL DO count _ count + 1; ENDLOOP; }; FileoutCoordSystems: PROC [f: IO.STREAM, csl: CoordSysList] = { count: NAT _ CountCoordSystems[csl]; thisCS: CoordSystem; f.PutF["CoordSystems [%g]:\n",[integer[count]]]; FOR thisCSL: CoordSysList _ csl, thisCSL.rest UNTIL thisCSL = NIL DO thisCS _ thisCSL.first; f.PutF["CoordSys: %g mat: ",[rope[thisCS.name]]]; TFO3d.FileoutMatrix[f,thisCS.mat]; f.PutF[" withRespectTo: "]; IF thisCS.withRespectTo = NIL THEN f.PutF["NIL"] ELSE f.PutRope[thisCS.withRespectTo.name]; f.PutChar[IO.CR]; ENDLOOP; f.PutChar[IO.CR]; }; CountLightSources: PROC [lsl: LightSourceList] RETURNS [count: NAT] = { count _ 0; FOR list: LightSourceList _ lsl, list.rest UNTIL list = NIL DO count _ count + 1; ENDLOOP; }; FileoutLightSources: PUBLIC PROC [f: IO.STREAM, lsl: LightSourceList] = { count: NAT _ CountLightSources[lsl]; thisLS: LightSource; f.PutF["LightSources [%g]:\n",[integer[count]]]; FOR thisLSL: LightSourceList _ lsl, thisLSL.rest UNTIL thisLSL = NIL DO thisLS _ thisLSL.first; FileoutLightSource[f, thisLS]; f.PutChar[IO.CR]; ENDLOOP; f.PutChar[IO.CR]; }; FileoutLightSource: PROC [f: IO.STREAM, lightSource: LightSource] = { f.PutF["LightSource: %g position: ",[rope[lightSource.name]]]; TFO3d.FileoutPoint3d[f,lightSource.position]; f.PutF[" color: "]; TFO3d.FileoutColor[f, lightSource.color]; }; CountAssemblies: PROC [asl: AssemblyList] RETURNS [count: NAT] = { count _ 0; FOR list: LIST OF Assembly _ asl.list, list.rest UNTIL list = NIL DO count _ count + 1; ENDLOOP; }; FileoutArtwork: PRIVATE PROC [f: IO.STREAM, artwork: Artwork] = { f.PutF["material: "]; TFO3d.FileoutMaterial[f, artwork.material]; f.PutF[" surface: "]; TFO3d.FileoutSurface[f, artwork.surface]; f.PutChar[IO.CR]; IF artwork.source # NIL THEN{ f.PutF["SMap: "]; TFO3d.FileoutSMap[f, artwork.sMap]; f.PutF[" OMap: "]; TFO3d.FileoutOMap[f, artwork.oMap]; f.PutChar[IO.SP]; f.PutF["source: %g ", [rope[artwork.source]]]; IF artwork.isColorFile THEN f.PutF["colorFile"] ELSE f.PutF["bwFile"]; f.PutF[" resolution: %g\n", [real[artwork.resolution]]]; f.PutF["mat: "]; TFO3d.FileoutMatrix3by3[f, artwork.artWRTPad.mat]; }; f.PutF[" color: "]; TFO3d.FileoutColor[f, artwork.color]; }; FileoutAssembly: PROC [f: IO.STREAM, assem: Assembly, mol: MasterObjectList] = { pointSetOp: Rope.ROPE; f.PutF["Assembly: %g, coordSys: %g, scalars: ", [rope[assem.name]],[rope[assem.coordSys.name]]]; TFO3d.FileoutPoint3d[f, assem.scalars]; f.PutChar[IO.CR]; f.PutChar[IO.TAB]; f.PutF["artwork: "]; FileoutArtwork[f, assem.artwork]; f.PutChar[IO.CR]; -- file out subassembly or master object information f.PutChar[IO.TAB]; WITH assem.object SELECT FROM alist: AssemblyList => {SELECT alist.pointSetOp FROM union => pointSetOp _ "union"; intersection => pointSetOp _ "intersection"; difference => pointSetOp _ "difference"; ENDCASE => ERROR; f.PutF["subassemblies [point set op: %g]\n", [rope[pointSetOp]]]; FileoutSubassemblyNames[f,alist]; f.PutChar[IO.CR]; FileoutAssemblies[f,alist,mol];}; ENDCASE => {f.PutF["object: "]; FileoutObjectName[f,assem.object]}; f.PutChar[IO.CR]; }; -- end of FileoutAssembly FileoutAssemblies: PROC [f: IO.STREAM, as: AssemblyList, mol: MasterObjectList] = { count: NAT _ CountAssemblies[as]; f.PutF["Subassemblies [%g]:\n",[integer[count]]]; FOR aso: LIST OF Assembly _ as.list, aso.rest UNTIL aso = NIL DO FileoutAssembly[f, aso.first, mol]; ENDLOOP; -- next assembly f.PutChar[IO.CR]; }; -- end of FileoutAssemblies FileoutObjectName: PROC [f: IO.STREAM, object: REF ANY] = { mo: MasterObject _ NARROW[object]; f.PutRope[mo.name]; }; FileoutSubassemblyNames: PROC [f: IO.STREAM, asl: AssemblyList] = { count: NAT _ CountAssemblies[asl]; thisA: Assembly; f.PutF[" [%g]: (", [integer[count]]]; IF count = 0 THEN {f.PutF[")\n"]; RETURN}; thisA _ asl.list.first; f.PutRope[thisA.name]; FOR list: LIST OF Assembly _ asl.list.rest, list.rest UNTIL list = NIL DO thisA _ list.first; f.PutF[", %g",[rope[thisA.name]]]; ENDLOOP; f.PutF[")\n"]; }; CountObjects: PROC [ol: MasterObjectList] RETURNS [count: NAT] = { count _ 0; FOR list: MasterObjectList _ ol, list.rest UNTIL list = NIL DO count _ count + 1; ENDLOOP; }; FileoutObjects: PROC [f: IO.STREAM, ol: MasterObjectList] = { mo: MasterObject; count: NAT _ CountObjects[ol]; f.PutF["Objects [%g]:\n",[integer[count]]]; FOR mol: MasterObjectList _ ol, mol.rest UNTIL mol = NIL DO mo _ mol.first; f.PutF["Master Object: %g class: %g\n", [rope[mo.name]], [rope[mo.class.name]]]; mo.class.fileout[f, mo]; ENDLOOP; f.PutChar[IO.CR]; }; END. Κ_– "Mesa" style˜IprocšŽΟcοœΟk œ)žœRžœžœ žœžœžœ2žœ!žœ#žœžœ#žœ,žœžœžœ,žœžœ#žœ4žœ*žœžœžœ(žœžœ!žœ,žœžœžœžœžœ%žœ1žœžœ)žœ7žœ5žœ2žœžœžœ'žœΟn œžœžœžœžœžœώžœžœžœžœΆžœŸœžœžœ žœžœ%žœžœžœžœ Ÿœžœžœžœ!žœdžœ+žœ žœžœ”žœžœžœžœ3žœžœžœ žœžœ Ÿœžœžœ žœžœ(žœžœžœžœŸœž œžœžœ$žœdžœ.žœ žœžœHžœžœžœ žœžœŸœžœžœžœΥŸœžœžœ žœžœžœžœ žœžœžœžœŸœžœžœžœžœ²žœžœΣŸœžœžœžœ@žœΩžœžœžœžœžœšžœžœ‹žœžœ0žœPžœžœœŸœžœžœžœ7žœLžœžœžœžœžœžœ(žœœ žœžœœŸœžœžœžœ žœžœžœ%Ÿœžœžœžœ!žœ°žœžœžœ%žœžœžœ=žœŸ œžœžœ žœžœ(žœžœžœžœŸœžœžœžœ7žœCžœ&žœžœžœ‚žœ žœžœ žœ˜Σ7—…—Φ;