<> <> <> <> <> DIRECTORY AtomButtons, AtomButtonsTypes, BasicTime, CodeTimer, Containers, CoordSys, DisplayListToTree, Feedback, FileNames, FS, GraphicsButton, Imager, IO, Menus, Random, Rope, SlackProcess, SV2d, SV3d, SVBasicTypes, SVCastRays, SVDrawMonitor, SVEditUser, SVEvent, SVFiles, SVGravity, SVInterfaceTypes, SVModelTypes, SVRayTypes, SVScene, SVSceneTypes, SVSelections, SVSessionLog, SVState, SVUserInput, SVUtility, SVViewersOnScene, SVViewerTool, SVWindow, TFO3d, ViewerClasses, ViewerOps, ViewerTools; SVEventImplA: CEDAR PROGRAM IMPORTS AtomButtons, BasicTime, SVCastRays, CodeTimer, CoordSys, DisplayListToTree, Feedback, FileNames, FS, GraphicsButton, IO, Random, Rope, SlackProcess, SVEditUser, SVEvent, SVFiles, SVGravity, SVScene, SVSelections, SVSessionLog, SVState, SVUserInput, SVUtility, SVViewersOnScene, SVWindow, TFO3d, ViewerOps, ViewerTools EXPORTS SVEvent = BEGIN Slice: TYPE = SVSceneTypes.Slice; BoundBox: TYPE = SVBasicTypes.BoundBox; Camera: TYPE = SVModelTypes.Camera; Color: TYPE = Imager.Color; CoordSysGenerator: TYPE = SVScene.CoordSysGenerator; CoordSystem: TYPE = SVModelTypes.CoordSystem; CSGTree: TYPE = SVRayTypes.CSGTree; DisplayContextProc: TYPE = SVInterfaceTypes.DCProc; DrawStyle: TYPE = SVModelTypes.DrawStyle; EditToolData: TYPE = SVInterfaceTypes.EditToolData; FeatureData: TYPE = SVInterfaceTypes.FeatureData; FeedbackData: TYPE = AtomButtonsTypes.FeedbackData; FileCamera: TYPE = SVSceneTypes.FileCamera; GravityType: TYPE = SVInterfaceTypes.GravityType; MasterObject: TYPE = SVSceneTypes.MasterObject; Matrix4by4: TYPE = SV3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = SV3d.Point3d; Primitive: TYPE = SVRayTypes.Primitive; Scene: TYPE = SVSceneTypes.Scene; TwoState: TYPE = AtomButtons.TwoState; Vector3d: TYPE = SV3d.Vector3d; Viewer: TYPE = ViewerClasses.Viewer; SVData: TYPE = SVInterfaceTypes.SVData; <> GravityChoiceChange: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { info: AtomButtons.EnumTypeRef _ svData.hitTest.gravityTypeMenu; name: Rope.ROPE; IF event.rest.first = $FlipForward THEN AtomButtons.TimeToFlipThru[LIST[$FlipForward, info]] ELSE AtomButtons.TimeToFlipThru[LIST[$FlipBackward, info]]; name _ info.flipLabel.name; SELECT TRUE FROM Rope.Equal[name, "StrictDistance", TRUE] => svData.hitTest.gravityType _ strictDistance; Rope.Equal[name, "PreferLines", TRUE] => svData.hitTest.gravityType _ linesPreferred; Rope.Equal[name, "PreferPoints", TRUE] => svData.hitTest.gravityType _ pointsPreferred; ENDCASE => ERROR; UpdateGravityChoice[svData]; }; UpdateGravityChoice: PROC [clientData: REF ANY] = { svData: SVData _ NARROW[clientData]; SELECT AtomButtons.GetButtonState[svData.hitTest.gravButton] FROM on => SELECT svData.hitTest.gravityType FROM strictDistance => SVWindow.SetCursorLooks[strictDistance, svData]; linesPreferred => SVWindow.SetCursorLooks[linesPreferred, svData]; pointsPreferred => SVWindow.SetCursorLooks[pointsPreferred, svData]; ENDCASE => ERROR; -- SHOULD NOT USE off STATE off => SVWindow.SetCursorLooks[off, svData]; ENDCASE => ERROR; }; GravityExtentChange: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { ged: SVInterfaceTypes.GravityExtentData _ NARROW[GraphicsButton.GetValue[svData.hitTest.gravityExtentButton].buttonData]; extent: REAL _ ged.extent; success: BOOL _ TRUE; SELECT event.rest.first FROM $ValueUp => { IF extent < 18432.0 THEN extent _ extent*2.0 ELSE { Feedback.PutF[svData.feedback, oneLiner, "Can't extend gravity further than 256 inches."]; Feedback.Blink[svData.feedback]; success _ FALSE; }; }; $ValueDown => extent _ extent/2.0; ENDCASE => extent _ SVEditUser.GetDefaultGravityExtent[]; IF success THEN { SetGravityExtent[svData, extent/72.0]; }; }; SetGravityExtent: PUBLIC PROC [svData: SVData, inches: REAL] = { screenDots: REAL; graphicsState: AtomButtonsTypes.GraphicsState _ svData.hitTest.gravityExtentButton; ged: SVInterfaceTypes.GravityExtentData; screenDots _ inches*72.0; Feedback.PutF[svData.feedback, oneLiner, "Gravity extent is now %g inches.", [real[inches]] ]; ged _ NEW[SVInterfaceTypes.GravityExtentDataObj _ [extent: screenDots]]; GraphicsButton.SetButtonValueAndPaint[graphicsState, svData, ged]; svData.hitTest.tolerance _ screenDots; svData.hitTest.criticalR _ screenDots; svData.hitTest.innerR _ screenDots/2.0; }; ToggleGravity: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { stateInfo: TwoState _ svData.hitTest.gravButton; AtomButtons.SwitchState[stateInfo]; UpdateGravityChoice[svData]; }; ToggleMidpoints: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { stateInfo: TwoState _ svData.hitTest.midpointButton; AtomButtons.SwitchState[stateInfo]; SVWindow.RestoreScreenAndInvariants[paintAction: $None, svData: svData]; }; <<>> <> InitializeAlignments: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; <<>> <> <<>> Painter: PUBLIC PROC [proc: DisplayContextProc, svData: SVData _ NIL] = { }; -- end of Painter UpdateHeader: PUBLIC PROC [pictureFile: Rope.ROPE, svData: SVData] = { headerRope: Rope.ROPE; aisName: Rope.ROPE; viewName: Rope.ROPE _ svData.camera.viewName; IF pictureFile = NIL THEN pictureFile _ svData.scene.name; headerRope _ Rope.Cat[viewName, " View of Solid Scene: ", pictureFile]; aisName _ Rope.Concat[SVFiles.FilenameMinusExtension[pictureFile], ".ais"]; svData.outer.name _ headerRope; ViewerOps.PaintViewer[svData.outer, caption, FALSE, NIL]; }; NewVersion: PUBLIC PROC [viewer: Viewer] = { svData: SVData _ NARROW[viewer.data]; scene: Scene _ svData.scene; scene.dirty _ TRUE; svData.scene.tree.outOfDate _ TRUE; svData.outer.newVersion _ TRUE; UpdateHeader[scene.name, svData]; }; SceneOldVersion: PUBLIC PROC [svData: SVData] = { <> scene: Scene _ svData.scene; SVViewersOnScene.SceneOldVersion[svData, scene]; }; OldVersion: PUBLIC PROC [viewer: Viewer] = { svData: SVData _ NARROW[viewer.data]; scene: Scene _ svData.scene; scene.dirty _ FALSE; svData.scene.tree.outOfDate _ TRUE; -- OldVersion may result from loading a new scene, or creating an empty scene. In either case, the ray tracing tree is out of date. Set flag just in case. svData.outer.newVersion _ FALSE; UpdateHeader[scene.name, svData]; }; <> <<>> EraseAndDrawScene: PUBLIC PROC [svData: SVData] = { SVWindow.RestoreScreenAndInvariants[$PaintEntireScene, svData]; }; <<>> <> <<>> DrawSceneButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVWindow.RestoreScreenAndInvariants[$PaintEntireScene, svData]; }; Clear: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; oldScene: Scene _ svData.scene; newScene: Scene; oldScreenCS: CoordSystem; fileCamera: FileCamera; cameraName: Rope.ROPE; drawStyle: DrawStyle; oldScreenCS _ svData.camera.screenCS; newScene _ svData.scene _ SVScene.CreateScene["NoName.pic"]; SVSelections.KillSkitterAndSelections[editToolData]; UpdateHeader[newScene.name, svData]; SVEvent.Selected[event, svData]; IF newScene.cameraOrder = NIL THEN fileCamera _ newScene.cameras.first ELSE { success: BOOL; cameraName _ newScene.cameraOrder.first; [fileCamera, success] _ SVScene.FindFileCameraFromName[cameraName, newScene]; IF NOT success THEN { fileCamera _ newScene.cameras.first; Feedback.Append[svData.feedback, Rope.Cat["Camera ", cameraName, " not found"], oneLiner]; Feedback.Blink[svData.feedback]; }; }; drawStyle _ SVEvent.CurrentStyle[svData]; svData.camera _ SVScene.CreateCamera[newScene.coordSysRoot, CoordSys.CopyCoordSysFromAnyTree[oldScreenCS, "SCREEN", NIL, NIL], drawStyle]; SVScene.StuffCameraFromFileCamera[svData.camera, fileCamera, svData.camera.style, newScene]; SVViewersOnScene.NotifyOfEmpty[svData: svData, from: oldScene, to: svData.scene]; SceneOldVersion[svData]; <> SVWindow.RestoreScreenAndInvariants[$PaintEntireScene, svData]; }; Restore: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; success: BOOL; wdir: Rope.ROPE; scene: Scene _ svData.scene; wdir _ editToolData.originalWorkingDirectory; [scene, success] _ SVViewersOnScene.LoadScene[svData, scene.name, wdir]; <> IF success THEN { svData.scene _ scene; SVSelections.KillSkitterAndSelections[editToolData]; SceneOldVersion[svData]; UpdateHeader[scene.name, svData]; EraseAndDrawScene[svData]; SVEvent.Selected[event, svData]; }; }; -- end of Reset Save: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { success: BOOL; sceneName: Rope.ROPE; scene: Scene _ svData.scene; sceneName _ FileNames.StripVersionNumber[scene.name]; success _ SVViewersOnScene.SaveScene[svData, sceneName]; IF success THEN { SVEvent.Selected[event, svData]; SceneOldVersion[svData]; UpdateHeader[scene.name, svData]; }; }; -- end of Save Get: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; success: BOOL; picName: Rope.ROPE _ NARROW[event.rest.first]; fullName: Rope.ROPE; wdir: Rope.ROPE; scene: Scene; oldScreenCS: CoordSystem _ svData.camera.screenCS; <> startTime: BasicTime.GMT; endTime: BasicTime.GMT; totalTime: INT; timeRope: Rope.ROPE; drawStyle: DrawStyle; IF Rope.Length[picName] = 0 THEN RETURN; wdir _ editToolData.originalWorkingDirectory; success _ TRUE; [fullName,,] _ FS.ExpandName[picName, wdir ! FS.Error => IF error.group = user THEN { success _ FALSE; CONTINUE; } ]; IF NOT success THEN RETURN; <> startTime _ BasicTime.Now[]; [scene, success] _ SVViewersOnScene.LoadScene[svData, fullName, wdir]; IF success THEN { fileCamera: FileCamera; cameraName: Rope.ROPE; <> endTime _ BasicTime.Now[]; totalTime _ BasicTime.Period[startTime, endTime]; timeRope _ IO.PutFR[" Done in time (%r)", [integer[totalTime]]]; Feedback.Append[svData.feedback, timeRope, oneLiner]; IF scene.cameraOrder = NIL THEN fileCamera _ scene.cameras.first ELSE { cameraName _ scene.cameraOrder.first; [fileCamera, success] _ SVScene.FindFileCameraFromName[cameraName, scene]; IF NOT success THEN { fileCamera _ scene.cameras.first; Feedback.Append[svData.feedback, Rope.Cat["Camera ", cameraName, " not found"], oneLiner]; Feedback.Blink[svData.feedback]; }; }; svData.scene _ scene; SVSelections.KillSkitterAndSelections[editToolData]; drawStyle _ SVEvent.CurrentStyle[svData]; svData.camera _ SVScene.CreateCamera[scene.coordSysRoot, CoordSys.CopyCoordSysFromAnyTree[oldScreenCS, "SCREEN", NIL, NIL], drawStyle]; SVScene.StuffCameraFromFileCamera[svData.camera, fileCamera, svData.camera.style, scene]; SceneOldVersion[svData]; UpdateHeader[fullName, svData]; EraseAndDrawScene[svData]; SVEvent.Selected[event, svData]; }; }; -- end of Get Store: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; wdir: Rope.ROPE; success: BOOL; picName: Rope.ROPE _ NARROW[event.rest.first]; fullName: Rope.ROPE; scene: Scene _ svData.scene; IF Rope.Length[picName] = 0 THEN RETURN; wdir _ editToolData.originalWorkingDirectory; success _ TRUE; [fullName,,] _ FS.ExpandName[picName, wdir ! FS.Error => IF error.group = user THEN { success _ FALSE; CONTINUE; } ]; IF NOT success THEN RETURN; success _ SVViewersOnScene.StoreScene[svData, scene, fullName]; IF success THEN { UpdateHeader[fullName, svData]; SVEvent.Selected[event, svData]; SceneOldVersion[svData]; UpdateHeader[scene.name, svData]; <> }; }; -- end of Store Split: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> scene: Scene _ svData.scene; SVViewersOnScene.Split[svData, scene]; }; <