DIRECTORY BasicObject3d, ColorMap, CoordSys, CSG, CSGGraphics, DisplayList3d, FileNames, FS, Graphics, GraphicsColor, IO, Labels, Matrix3d, Menus, Preprocess3d, Rope, Scratchpad2dUser, SV2d, SV3d, SVArtwork, SVArtworkUser, SVEditUser, SVEditUserB, SVError, SVHalfSpaces, SVInputMonitor, SVInterfaceTypes, SVMappings, SVMatrix2d, SVModelTypes, SVRayTypes, SVSceneTypes, SVPolygon2d, SVSelections, SVTransforms, SVViewerTools, SVViewerUser, SweepGeometry, TiogaMenuOps, ViewerClasses, ViewerTools; SVEditUserImplE: CEDAR PROGRAM IMPORTS DisplayList3d, FileNames, FS, Labels, Rope, SVArtwork, SVArtworkUser, SVEditUser, SVError, SVMappings, SVMatrix2d, SVSelections, SVViewerTools, SVViewerUser, ViewerTools EXPORTS SVEditUser, SVEditUserB = BEGIN Artwork: TYPE = SVModelTypes.Artwork; Assembly: TYPE = SVSceneTypes.Assembly; Camera: TYPE = SVModelTypes.Camera; Color: TYPE = GraphicsColor.Color; CoordSystem: TYPE = SVModelTypes.CoordSystem; EditToolData: TYPE = SVEditUser.EditToolData; 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; SpaceFunction: TYPE = SVModelTypes.SpaceFunction; SMap: TYPE = SVModelTypes.SMap; Tube: TYPE = SVModelTypes.Tube; Box: TYPE = SVModelTypes.Box; Viewer: TYPE = ViewerClasses.Viewer; globalBoxOMapIndex: PUBLIC NAT _ 1; globalBoxOMapCount: NAT = 2; globalBoxOMapArray: PUBLIC ARRAY[1..globalBoxOMapCount] OF Rope.ROPE _ ["Orthogonal", "Radial"]; BoxOCycle: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; 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] = TRUSTED { 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; SVError.Append["Can't read your rgb color.", TRUE, TRUE]; SVError.Blink[]; }; [material, partialSuccess] _ SVArtwork.RopeToMaterial[materialName]; IF NOT partialSuccess THEN { success _ FALSE; SVError.Append[Rope.Cat["Material ", materialName," not known."], TRUE, TRUE]; SVError.Blink[]; RETURN; }; }; Set3DArtwork: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; color: Color; threeDArtwork: Artwork; material: Material; success: BOOL; x, y, z: REAL; spaceFunction: SpaceFunction; g: SelectionGenerator; selectionsExist: BOOL; IF mouseButton = blue THEN { SVError.Append["Can't undo Set3DArtwork.", TRUE, TRUE]; SVError.Blink[]; 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: Assembly _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO IF Rope.Equal[assembly.name, "background", FALSE] THEN { SVError.Append["Can't apply 3DArtwork to the background ... ignored",TRUE,TRUE]; SVError.Blink[]; 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]; DisplayList3d.SetArtworkAssembly[assembly, threeDArtwork, scene]; ENDLOOP; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintSceneAllViewers[SVViewerUser.EraseAndDrawSceneEtc, 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; SVError.Append[error.explanation, TRUE, TRUE]; SVError.Blink[]; CONTINUE; } ]; }; SetColorArtwork: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; color: Color; colorArtwork: Artwork; material: Material; success: BOOL; g: SelectionGenerator; selectionsExist: BOOL; IF mouseButton = blue THEN { SVError.Append["Can't undo SetColorArtwork.", TRUE, TRUE]; SVError.Blink[]; 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: Assembly _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO IF Rope.Equal[assembly.name, "background", FALSE] THEN { scene.backgroundColor _ color; SVEditUser.PaintSceneAllViewers[SVViewerUser.EraseAndDrawSceneEtc, editToolData, scene]; LOOP; }; -- a special case to set background color colorArtwork _ SVArtwork.CreateColorArtwork[color, material]; DisplayList3d.SetArtworkAssembly[assembly, colorArtwork, scene]; ENDLOOP; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; SVEditUser.PaintSceneAllViewers[SVViewerUser.EraseAndDrawSceneEtc, editToolData, scene]; }; SetTubeArtwork: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; 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; [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: Assembly _ SVSelections.NextSelectionCoincident[g], SVSelections.NextSelectionCoincident[g] UNTIL assembly = NIL DO 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 => { SVError.Append[Rope.Cat["Sampled image ", picName, " not found."], TRUE, TRUE]; SVError.Blink[]; GOTO FileProblem} ]; DisplayList3d.SetArtworkAssembly[assembly, artwork, scene]; REPEAT FileProblem => NULL; FINISHED => { SVArtworkUser.SetArtwork[editToolData.artworkTool, artwork, scene.name, assembly.name]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; ENDLOOP; }; GetBoxOMap: PRIVATE PROC [viewer: Viewer] RETURNS [oMap: OMap] = TRUSTED { 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 [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; 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; [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: Assembly _ 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; DisplayList3d.SetArtworkAssembly[assembly, artwork, scene]; REPEAT FINISHED => { SVArtworkUser.SetArtwork[editToolData.artworkTool, artwork, scene.name, assembly.name]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; ENDLOOP; }; GetArtwork: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; scene: Scene _ editToolData.sceneSection.currentScene; assembly: Assembly; 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 [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; degrees: REAL _ SVViewerTools.GetReal[editToolData.artworkTransformSection.degrees, 45]; SVArtworkUser.RotateArtwork[editToolData.artworkTool, degrees]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; NormalizeArtwork: PUBLIC PROC [parent: REF ANY, clientData: REF ANY, mouseButton: MouseButton, shift, control: BOOL] = TRUSTED { editToolData: EditToolData _ NARROW[clientData]; SVArtworkUser.NormalizeArtwork[editToolData.artworkTool]; SVEditUser.SceneNewVersion[editToolData.currentViewerToolData]; }; END. ΆFile: SVEditUserImplE.mesa Author: Eric Bier on June 14, 1985 5:49:18 pm PDT Last edited by Bier on May 24, 1985 0:31:56 am 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. ΚT˜Ihead1™J™1Jšœ2™2Jšœ Οmœ1™˜EJ˜JšœA˜AJšœ,˜,Jšžœžœžœžœ˜#Jšœ žœ˜J˜šžœgžœ žœž˜Jšœ  œ˜"šœ œr œ5˜άJšœ'žœžœ˜9—Jšžœžœ žœžœ˜J˜Jšœ œ˜;—šž˜šžœ˜ JšœW˜WJšœ?˜?J˜——Jšžœ˜Jšœ˜J˜J˜—šŸ œžœžœ žœžœžœžœ,žœžœ˜zJšœz™zJšœžœ ˜0Jšœ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˜—JšŸ œžœžœ žœžœžœžœ˜[šœžœžœ˜!Jšœžœ ˜0Jšœ žœK˜XJšœ?˜?Jšœ?˜?Jšœ˜—šŸœžœžœ žœžœžœžœ,žœžœ˜€Jšœžœ ˜0Jšœ9˜9Jšœ?˜?Jšœ˜J˜—Jšžœ˜—…—50F: