<> <> <> <> <> DIRECTORY SVCoordSys, Feedback, FileNames, FS, GGParseIn, Imager, IO, Labels, SVMatrix3d, Menus, SVPredefSweeps, SVPreprocess3d, Rope, SV2d, SV3d, SVArtwork, SVArtworkUser, SVEditUser, SVEditUserB, SVGraphics, SVHalfSpaces, SVInterfaceTypes, SVMappings, SVMatrix2d, SVModelTypes, SVPolygon2d, SVScene, SVSceneTypes, SVScratchpadUser, SVSelections, SVTransforms, SVViewersOnScene, SVViewerTools, SVSweepGeometry, TiogaMenuOps, ViewerClasses, ViewerTools; SVEditUserImplE: CEDAR PROGRAM IMPORTS Feedback, FileNames, FS, GGParseIn, IO, Labels, SVPredefSweeps, Rope, SVArtwork, SVArtworkUser, SVEditUser, SVMappings, SVMatrix2d, SVScene, SVSelections, SVViewersOnScene, SVViewerTools, 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 _ GGParseIn.ReadWNAT[IO.RIS[linesOfLongRope]]; <> SVPredefSweeps.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 _ GGParseIn.ReadWNAT[IO.RIS[linesOfLatRope]]; <> SVPredefSweeps.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.