<> <> <> <> <> 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.