DIRECTORY CoordSys, Feedback, FileNames, FS, Imager, IO, Labels, Matrix3d, Menus, PredefSweeps, Preprocess3d, Rope, SV2d, SV3d, SVArtwork, SVArtworkUser, SVEditUser, SVEditUserB, SVGraphics, SVHalfSpaces, SVInterfaceTypes, SVMappings, SVMatrix2d, SVModelTypes, SVPolygon2d, SVRayTypes, SVScene, SVSceneTypes, SVScratchpadUser, SVSelections, SVTransforms, SVViewersOnScene, SVViewerTools, SweepGeometry, TFI3d, TiogaMenuOps, ViewerClasses, ViewerTools; SVEditUserImplE: CEDAR PROGRAM IMPORTS Feedback, FileNames, FS, IO, Labels, PredefSweeps, Rope, SVArtwork, SVArtworkUser, SVEditUser, SVMappings, SVMatrix2d, SVScene, SVSelections, SVViewersOnScene, SVViewerTools, TFI3d, ViewerTools EXPORTS SVEditUser, SVEditUserB = BEGIN Artwork: TYPE = SVModelTypes.Artwork; Box: TYPE = SVModelTypes.Box; Camera: TYPE = SVModelTypes.Camera; Color: TYPE = Imager.Color; CoordSystem: TYPE = SVModelTypes.CoordSystem; EditToolData: TYPE = SVEditUser.EditToolData; MasterObject: TYPE = SVSceneTypes.MasterObject; MasterObjectList: TYPE = SVSceneTypes.MasterObjectList; Material: TYPE = SVModelTypes.Material; Matrix3by3: TYPE = SV2d.Matrix3by3; MouseButton: TYPE = Menus.MouseButton; OMap: TYPE = SVModelTypes.OMap; Scene: TYPE = SVSceneTypes.Scene; Selection: TYPE = SVInterfaceTypes.Selection; SelectionGenerator: TYPE = SVInterfaceTypes.SelectionGenerator; Slice: TYPE = SVSceneTypes.Slice; SMap: TYPE = SVModelTypes.SMap; SpaceFunction: TYPE = SVModelTypes.SpaceFunction; SVData: TYPE = SVInterfaceTypes.SVData; Tube: TYPE = SVModelTypes.Tube; Viewer: TYPE = ViewerClasses.Viewer; globalBoxOMapIndex: PUBLIC NAT _ 1; globalBoxOMapCount: NAT = 2; globalBoxOMapArray: PUBLIC ARRAY[1..globalBoxOMapCount] OF Rope.ROPE _ ["Orthogonal", "Radial"]; BoxOCycle: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; globalBoxOMapIndex _ IF globalBoxOMapIndex = globalBoxOMapCount THEN 1 ELSE globalBoxOMapIndex + 1; Labels.Set[editToolData.artworkSection.oMapLabel, globalBoxOMapArray[globalBoxOMapIndex]]; }; GetSimpleArtworkParameters: PRIVATE PROC [editToolData: EditToolData, scene: Scene] RETURNS [color: Color, success: BOOL, material: Material] = { materialName: Rope.ROPE _ SVEditUser.globalMatArray[editToolData.artworkSection.materialValue]; partialSuccess: BOOL; success _ TRUE; [color, partialSuccess] _ SVViewerTools.GetColor[editToolData.artworkSection.rgb]; IF NOT partialSuccess THEN { success _ FALSE; Feedback.AppendRaw[$Solidviews, "Can't read your rgb color.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; }; [material, partialSuccess] _ SVArtwork.RopeToMaterial[materialName]; IF NOT partialSuccess THEN { success _ FALSE; Feedback.AppendRaw[$Solidviews, Rope.Cat["Material ", materialName," not known."], oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; }; Set3DArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; color: Color; threeDArtwork: Artwork; material: Material; success: BOOL; x, y, z: REAL; spaceFunction: SpaceFunction; g: SelectionGenerator; selectionsExist: BOOL; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN { Feedback.AppendRaw[$Solidviews, "Can't undo Set3DArtwork.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN}; [color, success, material] _ GetSimpleArtworkParameters[editToolData, scene]; IF NOT success THEN RETURN; [g, selectionsExist] _ SVSelections.GetSelectionGenerator[movee]; SVSelections.ComplainIfNot[selectionsExist]; IF NOT selectionsExist THEN RETURN; FOR assembly: Slice _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO IF Rope.Equal[assembly.name, "background", FALSE] THEN { Feedback.AppendRaw[$Solidviews, "Can't apply 3DArtwork to the background ... ignored", oneLiner]; Feedback.BlinkRaw[$Solidviews]; LOOP; }; -- a special case to set background color [x, y, z] _ SVViewerTools.GetThreeReals[editToolData.artworkSection.boxXYZ]; spaceFunction _ SVMappings.CreateFunction[[x, y, z]]; threeDArtwork _ SVArtwork.Create3DArtwork[assembly.coordSys, material, spaceFunction]; SVScene.SetArtworkAssembly[assembly, threeDArtwork, scene]; ENDLOOP; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; }; GetFullPicname: PRIVATE PROC [editToolData: EditToolData] RETURNS [fullName: Rope.ROPE, success: BOOL] = { wdir: Rope.ROPE _ editToolData.originalWorkingDirectory; picName: Rope.ROPE _ ViewerTools.GetContents[editToolData.artworkSection.picName]; success _ TRUE; [fullName,,] _ FS.ExpandName[picName, wdir ! FS.Error => IF error.group = user THEN { success _ FALSE; Feedback.AppendRaw[$Solidviews, error.explanation, oneLiner]; Feedback.BlinkRaw[$Solidviews]; CONTINUE; } ]; }; SetColorArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; color: Color; colorArtwork: Artwork; material: Material; success: BOOL; g: SelectionGenerator; selectionsExist: BOOL; arg: ATOM _ NARROW[event.rest.first]; IF arg=$Undo THEN { Feedback.AppendRaw[$Solidviews, "Can't undo SetColorArtwork.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN}; [color, success, material] _ GetSimpleArtworkParameters[editToolData, scene]; IF NOT success THEN RETURN; [g, selectionsExist] _ SVSelections.GetSelectionGenerator[movee]; SVSelections.ComplainIfNot[selectionsExist]; IF NOT selectionsExist THEN RETURN; FOR assembly: Slice _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO IF Rope.Equal[assembly.name, "background", FALSE] THEN { scene.backgroundColor _ color; LOOP; }; -- a special case to set background color colorArtwork _ SVArtwork.CreateColorArtwork[color, material]; SVScene.SetArtworkAssembly[assembly, colorArtwork, scene]; ENDLOOP; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; }; SetTubeArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; tubeHeight: REAL _ SVViewerTools.GetReal[editToolData.artworkSection.tubeHeight, 100]; tubeRadius: REAL _ SVViewerTools.GetReal[editToolData.artworkSection.tubeRadius, 50]; picName: Rope.ROPE; resolution: REAL _ SVViewerTools.GetReal[editToolData.artworkSection.resolution, 72.0]; material: Material; backgroundColor: Color; tube: Tube; isColor: BOOL; mat: Matrix3by3; artwork, oldArtwork: Artwork; success: BOOL; g: SelectionGenerator; selectionsExist: BOOL; lastAssembly: Slice; [picName, success] _ GetFullPicname[editToolData]; IF NOT success THEN RETURN; [backgroundColor, success, material] _ GetSimpleArtworkParameters[editToolData, scene]; IF NOT success THEN RETURN; [g, selectionsExist] _ SVSelections.GetSelectionGenerator[movee]; SVSelections.ComplainIfNot[selectionsExist]; IF NOT selectionsExist THEN RETURN; FOR assembly: Slice _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO IF Rope.Equal[assembly.name, "background", FALSE] THEN { Feedback.AppendRaw[$Solidviews, "Can't put tube artwork in background.", oneLiner]; Feedback.BlinkRaw[$Solidviews]; RETURN; }; tube _ SVMappings.CreateTube[tubeRadius, tubeHeight]; oldArtwork _ assembly.artwork; IF oldArtwork = NIL THEN mat _ SVMatrix2d.Identity[] ELSE { IF ISTYPE[oldArtwork.surface, Tube] THEN mat _ oldArtwork.artWRTPad.mat ELSE mat _ SVMatrix2d.Identity[]; }; isColor _ SVViewerTools.GetBool[editToolData.artworkSection.isColor]; artwork _ SVArtwork.CreateFileArtwork[coordSys: assembly.coordSys, material: material, surface: tube, oMap: tubeO, sMap: tubeS, filename: picName, isColor: isColor, background: backgroundColor, resolution: resolution, mat: mat ! SVArtwork.FileNotFound => { Feedback.AppendRaw[$Solidviews, Rope.Cat["Sampled image ", picName, " not found."], oneLiner]; Feedback.BlinkRaw[$Solidviews]; GOTO FileProblem} ]; SVScene.SetArtworkAssembly[assembly, artwork, scene]; lastAssembly _ assembly; REPEAT FileProblem => NULL; FINISHED => { SVArtworkUser.SetArtwork[editToolData.artworkTool, artwork, scene.name, lastAssembly.name]; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; ENDLOOP; }; GetBoxOMap: PRIVATE PROC [viewer: Viewer] RETURNS [oMap: OMap] = { mapRope: Rope.ROPE _ ViewerTools.GetContents[viewer]; SELECT TRUE FROM Rope.Equal[mapRope, "Orthogonal", FALSE] => RETURN[orthogonal]; Rope.Equal[mapRope, "Radial", FALSE] => RETURN[radial]; ENDCASE => ERROR UnknownOMap; }; UnknownOMap: ERROR = CODE; SetBoxArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; x, y, z: REAL; picName: Rope.ROPE _ ViewerTools.GetContents[editToolData.artworkSection.picName]; resolution: REAL _ SVViewerTools.GetReal[editToolData.artworkSection.resolution, 72.0]; material: Material; backgroundColor: Color; box: Box; isColor: BOOL; oMap: OMap _ GetBoxOMap[editToolData.artworkSection.oMapLabel]; artwork: Artwork; success: BOOL; g: SelectionGenerator; selectionsExist: BOOL; oldAssembly: Slice; [picName, success] _ GetFullPicname[editToolData]; IF NOT success THEN RETURN; [backgroundColor, success, material] _ GetSimpleArtworkParameters[editToolData, scene]; IF NOT success THEN RETURN; [x, y, z] _ SVViewerTools.GetThreeReals[editToolData.artworkSection.boxXYZ]; isColor _ SVViewerTools.GetBool[editToolData.artworkSection.isColor]; [g, selectionsExist] _ SVSelections.GetSelectionGenerator[movee]; SVSelections.ComplainIfNot[selectionsExist]; IF NOT selectionsExist THEN RETURN; success _ TRUE; FOR assembly: Slice _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO box _ SVMappings.CreateBox[x,y,z]; artwork _ SVArtwork.CreateFileArtwork[coordSys: assembly.coordSys, material: material, surface: box, oMap: oMap, sMap: unfoldedBox, filename: picName, isColor: isColor, background: backgroundColor, resolution: resolution ! SVArtwork.FileNotFound => {success _ FALSE; CONTINUE}]; IF NOT success THEN RETURN; SVScene.SetArtworkAssembly[assembly, artwork, scene]; oldAssembly _ assembly; REPEAT FINISHED => { SVArtworkUser.SetArtwork[editToolData.artworkTool, artwork, scene.name, oldAssembly.name]; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; ENDLOOP; }; GetArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; scene: Scene _ editToolData.sceneSection.currentScene; assembly: Slice; artwork: Artwork; materialName: Rope.ROPE; IF Rope.Equal[ViewerTools.GetContents[editToolData.sceneSection.source], "background", FALSE] THEN { ViewerTools.SetContents[editToolData.artworkSection.picName, NIL]; SVViewerTools.SetColor[editToolData.artworkSection.rgb, scene.backgroundColor]; RETURN}; -- a special case to get background color assembly _ SVSelections.TopMoveeCoincident[]; IF assembly = NIL THEN RETURN; artwork _ assembly.artwork; ViewerTools.SetContents[editToolData.artworkSection.picName, FileNames.GetShortName[artwork.source]]; SVViewerTools.SetColor[editToolData.artworkSection.rgb, artwork.color]; materialName _ SVArtwork.MaterialToRope[artwork.material]; ViewerTools.SetContents[editToolData.artworkSection.material, materialName]; IF artwork.source = NIL THEN { ViewerTools.SetContents[editToolData.artworkSection.isColor, NIL]; ViewerTools.SetContents[editToolData.artworkSection.resolution, NIL]; ViewerTools.SetContents[editToolData.artworkSection.tubeHeight, NIL]; ViewerTools.SetContents[editToolData.artworkSection.tubeRadius, NIL]; ViewerTools.SetContents[editToolData.artworkSection.boxXYZ, NIL]; }-- a pure color artwork. Update color and material only. Blank out other info. ELSE {-- a file artwork. Display isColorFile, resolution, simple surface parameters and mapping types SVViewerTools.SetBool[editToolData.artworkSection.isColor, artwork.isColorFile]; SVViewerTools.SetReal[editToolData.artworkSection.resolution, artwork.resolution]; WITH artwork.surface SELECT FROM tube: SVMappings.Tube => { SVViewerTools.SetReal[editToolData.artworkSection.tubeHeight, tube.H]; SVViewerTools.SetReal[editToolData.artworkSection.tubeRadius, tube.R]; }; box: SVMappings.Box => { SVViewerTools.SetThreeReals[editToolData.artworkSection.boxXYZ, box.x, 2*box.halfY, box.z]; SELECT artwork.oMap FROM orthogonal => { globalBoxOMapIndex _ 1; ViewerTools.SetContents[editToolData.artworkSection.oMapLabel, SVArtwork.OMapToRope[orthogonal]]; }; radial => { globalBoxOMapIndex _ 2; ViewerTools.SetContents[editToolData.artworkSection.oMapLabel, SVArtwork.OMapToRope[radial]]; }; ENDCASE => ERROR; }; ENDCASE => ERROR; }; SVArtworkUser.SetArtwork[editToolData.artworkTool, artwork, scene.name, assembly.name]; }; -- end of GetArtwork RotateArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; degrees: REAL _ SVViewerTools.GetReal[editToolData.artworkTransformSection.degrees, 45]; SVArtworkUser.RotateArtwork[editToolData.artworkTool, degrees]; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; NormalizeArtwork: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; SVArtworkUser.NormalizeArtwork[editToolData.artworkTool]; SVViewersOnScene.SceneNewVersion[editToolData.currentSVData]; }; RemakeMO: PROC [mo: MasterObject] = { mo.class.update[mo, NIL]; }; LinesOfLongitude: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; thisMO: MasterObject; linesOfLongRope: Rope.ROPE _ ViewerTools.GetSelectionContents[]; linesOfLongitude: NAT; scene: Scene _ svData.scene; IF Rope.Length[linesOfLongRope] = 0 THEN linesOfLongitude _ 4 ELSE linesOfLongitude _ TFI3d.ReadBlankAndNAT[IO.RIS[linesOfLongRope]]; PredefSweeps.SetLinesOfLongitude[linesOfLongitude]; FOR ol: MasterObjectList _ scene.masterObjects, ol.rest UNTIL ol = NIL DO thisMO _ ol.first; RemakeMO[thisMO]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[paintAction: $PaintEntireScene, editToolData: editToolData, scene: svData.scene]; }; LinesOfLatitude: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; thisMO: MasterObject; linesOfLatRope: Rope.ROPE _ ViewerTools.GetSelectionContents[]; linesOfLatitude: NAT; scene: Scene _ svData.scene; IF Rope.Length[linesOfLatRope] = 0 THEN linesOfLatitude _ 4 ELSE linesOfLatitude _ TFI3d.ReadBlankAndNAT[IO.RIS[linesOfLatRope]]; PredefSweeps.SetLinesOfLatitude[linesOfLatitude]; FOR ol: MasterObjectList _ scene.masterObjects, ol.rest UNTIL ol = NIL DO thisMO _ ol.first; RemakeMO[thisMO]; ENDLOOP; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, svData.scene]; }; END. File: SVEditUserImplE.mesa Author: Eric Bier on June 14, 1985 5:49:18 pm PDT Last edited by Bier on April 29, 1987 5:16:24 pm PDT Copyright c 1985 by Xerox Corporation. All rights reserved. Contents: All of the procedures called by SVEditTool when menus and buttons are pressed (part 5) IMPORTED TYPES GLOBAL VARIABLES This is a horrible breach of information hiding, but I haven't the time. I shouldn't be picking apart artwork records and CoordSystem2d's in the user interface. End of horrible kludge. Sets the artwork of all of assembly's leaf subassemblies. Get the artwork of the currently named assembly. Stuff this information into the artwork section and display the artwork. Extra Menus Update all of the master objects. Update all of the master objects. Κε˜Ihead1™J™1Jšœ4™4Jšœ Οmœ1™˜EJ˜JšœA˜AJšœ,˜,Jšžœžœžœžœ˜#Jšœ žœ˜J˜šžœdžœ žœž˜~Jšœ  œ˜"šœ œr œ5˜άJšœ'žœžœ˜9—Jšžœžœ žœžœ˜J˜Jšœ œ˜5Jšœ˜—šž˜šžœ˜ JšœZ˜ZJšœ=˜=J˜——Jšžœ˜Jšœ˜J˜J˜—šŸ œžœžœ žœžœžœžœ˜DJšœz™zJšœ1˜1Jšœ6˜6Jšœ˜Jšœ˜Jšœžœ˜J˜šžœF˜HJšœžœžœ˜Jšœ=žœ˜BJšœO˜OJšΠbkœ‘)˜2—Jšœ-˜-Jšžœ žœžœžœ˜Jšœ˜Jšœe˜eJšœ3 œ˜GJšœ:˜:Jšœ4 œ˜Lšžœžœžœ˜Jšœ4 œžœ˜BJšœ4  œžœ˜EJšœ4  œžœ˜EJšœ4  œžœ˜EJšœ4 œžœ˜AJšœ‘O˜P—šžœ‘`˜fJšœ2 œ˜PJšœ2  œ˜Ršžœžœž˜ šœ˜Jšœ2  œžœ˜FJšœ2  œžœ˜FJšœ˜—šœ˜Jšœ[˜[Jšžœž˜šœ˜Jšœ˜Jšœa˜aJ˜—˜ Jšœ˜Jšœ]˜]J˜—Jšžœžœ˜Jšœ˜—Jšžœžœ˜—Jšœ˜—JšœW˜WJšœ‘˜J˜—šŸ œžœžœ žœžœžœžœ˜GJšœ1˜1Jšœ žœK˜XJšœ?˜?Jšœ=˜=Jšœ˜—šŸœžœžœ žœžœžœžœ˜JJšœ1˜1Jšœ9˜9Jšœ=˜=Jšœ˜J˜—J˜J™ codešŸœžœ˜%Mšœžœ˜M˜M˜—š Ÿœž œ žœžœžœžœ˜JMšœ#žœ ž˜1Lšœ˜L•StartOfExpansion[]šœžœ&˜@Lšœžœ˜Lšœ˜Mšžœ"žœ˜=šžœ*žœžœ˜GLš !™!—Mšœ3˜3šžœ5žœžœž˜IJšœ˜Jšœ˜Jšžœ˜—Lšœw˜wMšœ˜M˜—š Ÿœž œ žœžœžœžœ˜IMšœ#žœ ž˜1Lšœ˜L–[]šœžœ&˜?Lšœžœ˜Lšœ˜Mšžœ!žœ˜;šžœ)žœžœ˜ELš !™!—Mšœ1˜1šžœ5žœžœž˜IJšœ˜Jšœ˜Jšžœ˜—LšœU˜UMšœ˜M˜—J™Jšžœ˜—…—:τLα