<> <> <> <> <> DIRECTORY AtomButtons, AtomButtonsTypes, Basics, BasicTime, CodeTimer, Containers, SVCoordSys, SVSceneToTree, Feedback, FileNames, FS, GGFileOps, GGViewerOps, Imager, IO, Menus, Random, Real, Rope, SlackProcess, SV2d, SV3d, SVAlign, SVAssembly, SVBasicTypes, SVBoundBox, SVCaret, SVCastRays, SVDrawMonitor, SVEditUser, SVEvent, SVFiles, SVGravity, SVInterfaceTypes, SVModelTypes, SVMouseEvent, SVRefresh, SVScene, SVSceneTypes, SVSelect, SVSelections, SVSessionLog, SVState, SVUserInput, SVViewersOnScene, SVViewerTool, SVWindow, SVParseOut, ViewerClasses, ViewerOps, ViewerTools; SVEventImplA: CEDAR PROGRAM IMPORTS AtomButtons, BasicTime, CodeTimer, GGFileOps, GGViewerOps, SVBoundBox, SVCoordSys, SVSceneToTree, Feedback, FileNames, FS, IO, Random, Rope, SlackProcess, SVAlign, SVAssembly, SVCaret, SVCastRays, SVEditUser, SVEvent, SVFiles, SVGravity, SVMouseEvent, SVRefresh, SVScene, SVSelect, SVSelections, SVSessionLog, SVState, SVUserInput, SVViewersOnScene, SVWindow, SVParseOut, ViewerOps, ViewerTools EXPORTS SVEvent = BEGIN AlignBag: TYPE = SVInterfaceTypes.AlignBag; AssemblyGenerator: TYPE = SVScene.AssemblyGenerator; BoundBox: TYPE = SVBasicTypes.BoundBox; BoundBlock: TYPE = SVBasicTypes.BoundBlock; Camera: TYPE = SVModelTypes.Camera; Color: TYPE = Imager.Color; CoordSysGenerator: TYPE = SVScene.CoordSysGenerator; CoordSystem: TYPE = SVModelTypes.CoordSystem; CSGTree: TYPE = SVSceneTypes.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 = SVSceneTypes.Primitive; Scene: TYPE = SVSceneTypes.Scene; Slice: TYPE = SVSceneTypes.Slice; SliceDescriptor: TYPE = SVSceneTypes.SliceDescriptor; SliceDescriptorGenerator: TYPE = SVSceneTypes.SliceDescriptorGenerator; SortedButtonHandle: TYPE = AtomButtonsTypes.SortedButtonHandle; TriggerBag: TYPE = SVInterfaceTypes.TriggerBag; TwoState: TYPE = AtomButtons.TwoState; Vector2d: TYPE = SV2d.Vector2d; Vector3d: TYPE = SV3d.Vector3d; Viewer: TYPE = ViewerClasses.Viewer; SVData: TYPE = SVInterfaceTypes.SVData; <> GravityChoiceChange: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { forward: BOOL _ event.rest.first = $FlipForward; SVState.CycleGravityType[svData, forward]; }; GravityExtentChange: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { extent: REAL _ SVState.GetGravityExtent[svData]; -- in inches success: BOOL _ TRUE; SELECT event.rest.first FROM $ValueUp => { IF extent < 256.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 { SVState.SetGravityExtent[svData, extent]; }; }; ToggleGravity: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.ToggleGravity[svData]; }; ToggleMidpoints: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.ToggleMidpoints[svData]; }; <<>> <> InitializeAlignments: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AllAlignmentsOff[NIL, svData]; SVState.SetShowAlignments[svData, TRUE]; SVState.SetGravity[svData, TRUE]; SVState.SetGravityType[svData, pointsPreferred]; SVEvent.InchScaleUnit[NIL, svData]; SVState.SetHeuristics[svData, TRUE]; }; <<>> AllAlignmentsOff: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SlopeLinePrompt[event, svData]; SlopePlanePrompt[event, svData]; SVState.SetMidpoints[svData, FALSE]; }; StandardSlopes: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.BuildScalarButtons[svData.hitTest.slopeHandle, svData, SVUserInput.EventNotify, NIL, LIST[ <<["", 999.9, LIST[$NoOp, NEW[REAL _ 999.9]], FALSE], -- dummy first button>> ["150", 150.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 150.0]]], FALSE], ["135", 135.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 135.0]]], FALSE], ["120", 120.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 120.0]]], FALSE], ["90", 90.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 90.0]]], FALSE], ["60", 60.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 60.0]]], FALSE], ["45", 45.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 45.0]]], FALSE], ["30", 30.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 30.0]]], FALSE], ["0", 0.0, LIST[LIST[$ChooseSlope, NEW[REAL _ 0.0]]], TRUE] ]]; }; StandardAzimuths: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.BuildScalarButtons[svData.hitTest.azimuthHandle, svData, SVUserInput.EventNotify, NIL, LIST[ <<["", 999.9, LIST[$NoOp, NEW[REAL _ 999.9]], FALSE], -- dummy first button>> ["150", 150.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 150.0]]], FALSE], ["135", 135.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 135.0]]], FALSE], ["120", 120.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 120.0]]], FALSE], ["90", 90.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 90.0]]], FALSE], ["60", 60.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 60.0]]], FALSE], ["45", 45.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 45.0]]], FALSE], ["30", 30.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 30.0]]], FALSE], ["0", 0.0, LIST[LIST[$ChooseAzimuth, NEW[REAL _ 0.0]]], TRUE] ]]; }; StandardSlopeLines: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.BuildSortedButtons[svData.hitTest.slopeLineHandle, svData, SVUserInput.EventNotify, NIL, LIST[ ["(0 0)",NEW[Vector2d_[0,0]], LIST[LIST[$ToggleSlopeLine,NEW[Vector2d_[0,0]]]],TRUE], ["(0 90)",NEW[Vector2d_[0,90]],LIST[LIST[$ToggleSlopeLine,NEW[Vector2d_[0,90]]]],FALSE], ["(90 0)",NEW[Vector2d_[90,0]], LIST[LIST[$ToggleSlopeLine,NEW[Vector2d_[90,0]]]],FALSE] ]]; IF event.first = $StandardSlopeLines THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; StandardSlopePlanes: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.BuildSortedButtons[svData.hitTest.slopePlaneHandle, svData, SVUserInput.EventNotify, NIL, LIST[ ["(0 0)",NEW[Vector2d_[0,0]],LIST[LIST[$ToggleSlopePlane,NEW[Vector2d_[0,0]]]],FALSE], ["(0 90)",NEW[Vector2d_[0,90]],LIST[LIST[$ToggleSlopePlane,NEW[Vector2d_[0,90]]]],FALSE], ["(90 0)",NEW[Vector2d_[90,0]],LIST[LIST[$ToggleSlopePlane,NEW[Vector2d_[90,0]]]],TRUE] ]]; IF event.first = $StandardSlopePlanes THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; <<>> StandardRadii: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.BuildScalarButtons[svData.hitTest.radiusHandle, svData, SVUserInput.EventNotify, NIL, LIST[ ["1/18", 1.0/18.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 1.0/18.0]]], FALSE], ["1/9", 1.0/9.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 1.0/9.0]]], FALSE], ["1/8", 0.125, LIST[LIST[$ToggleRadius, NEW[REAL _ 0.125]]], FALSE], ["1/4", 0.25, LIST[LIST[$ToggleRadius, NEW[REAL _ 0.25]]], FALSE], ["1/3", 1.0/3.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 1.0/3.0]]], FALSE], ["1/2", 0.5, LIST[LIST[$ToggleRadius, NEW[REAL _ 0.5]]], FALSE], ["2/3", 2.0/3.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 2.0/3.0]]], FALSE], ["3/4", 0.75, LIST[LIST[$ToggleRadius, NEW[REAL _ 0.75]]], FALSE], ["1", 1.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 1.0]]], FALSE], ["2", 2.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 2.0]]], FALSE], ["4", 4.0, LIST[LIST[$ToggleRadius, NEW[REAL _ 4.0]]], FALSE] ]]; IF event.first = $StandardRadii THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; <> AzimuthPrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; GetAzimuth: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; AddAzimuth: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> <> <> azimuth: REAL; success, alreadyThere: BOOL; [azimuth, success] _ SVState.GetAzimuthValue[svData]; IF NOT success THEN RETURN; alreadyThere _ SVState.AddAzimuth[svData, azimuth]; IF NOT alreadyThere THEN { -- a new button was added SVWindow.RestoreScreenAndInvariants[paintAction: $None, svData: svData, remake: none, backgndOK: TRUE, edited: TRUE, okToClearFeedback: TRUE]; }; }; DeleteAzimuth: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.DeleteAzimuth[svData]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; ChooseAzimuth: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { azimuth: REAL _ NARROW[event.rest.first, REF REAL]^; AtomButtons.SetAllScalarStates[svData, svData.hitTest.azimuthHandle, FALSE]; AtomButtons.SetScalarState[svData, svData.hitTest.azimuthHandle, azimuth, TRUE]; }; <<>> <> SlopePrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> }; GetSlope: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; AddSlope: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> <> <> slope: REAL; success, alreadyThere: BOOL; [slope, success] _ SVState.GetSlopeValue[svData]; IF NOT success THEN RETURN; alreadyThere _ SVState.AddSlope[svData, slope]; IF NOT alreadyThere THEN { -- a new button was added SVWindow.RestoreScreenAndInvariants[paintAction: $None, svData: svData, remake: none, backgndOK: TRUE, edited: TRUE, okToClearFeedback: TRUE]; }; }; DeleteSlope: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.DeleteSlope[svData]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; ChooseSlope: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { slope: REAL _ NARROW[event.rest.first, REF REAL]^; AtomButtons.SetAllScalarStates[svData, svData.hitTest.slopeHandle, FALSE]; AtomButtons.SetScalarState[svData, svData.hitTest.slopeHandle, slope, TRUE]; }; <<>> <> SlopeLinePrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.SetAllScalarStates[svData, svData.hitTest.slopeLineHandle, FALSE]; IF event.first = $SlopeLinePrompt THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; GetSlopeLine: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; AddSlopeLine: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AddAzimuth[event, svData]; AddSlope[event, svData]; NewSlopeLine[event, svData]; }; NewSlopeLine: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { azimuth, slope: REAL; alreadyThere: BOOL; azimuth _ SVState.GetSelectedAzimuth[svData]; slope _ SVState.GetSelectedSlope[svData]; alreadyThere _ SVState.AddSlopeLine[svData, azimuth, slope]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsSelected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; DeleteSlopeLine: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.DeleteSlopeLines[svData]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; ToggleSlopeLine: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { restoreNow: BOOL _ event.first = $ToggleSlopeLine; ToggleAlignmentAux[event, svData, svData.hitTest.slopeLineHandle, restoreNow]; }; ToggleAlignmentAux: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData, handle: SortedButtonHandle, restoreNow: BOOL] = { FindAzimuthSlope: PROC [state: BOOL, name: Rope.ROPE, value: REF ANY, clientData: REF ANY] RETURNS [newState: BOOL, newName: Rope.ROPE _ NIL, newValue: REF ANY, done: BOOL _ FALSE] = { azimuthSlope: Vector2d _ NARROW[value, REF Vector2d]^; IF ABS[azimuthSlope[1]-azimuth] < epsilon AND ABS[azimuthSlope[2]-slope] < epsilon THEN {totalNewState _ newState _ NOT state; done _ TRUE} ELSE newState _ state; newName _ name; newValue _ value; }; epsilon: REAL = 0.001; totalNewState: BOOL _ FALSE; azimuth, slope: REAL; azimuthSlope: Vector2d; azimuthSlope _ NARROW[event.rest.first, REF Vector2d]^; azimuth _ azimuthSlope[1]; slope _ azimuthSlope[2]; AtomButtons.WriteSortedButtons[handle, FindAzimuthSlope, svData]; -- alters totalNewState IF restoreNow AND totalNewState THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsSelected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE] ELSE SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; <> SlopePlanePrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.SetAllScalarStates[svData, svData.hitTest.slopePlaneHandle, FALSE]; IF event.first = $SlopePlanePrompt THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; GetSlopePlane: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; AddSlopePlane: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AddAzimuth[event, svData]; AddSlope[event, svData]; NewSlopePlane[event, svData]; }; NewSlopePlane: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { azimuth, slope: REAL; alreadyThere: BOOL; azimuth _ SVState.GetSelectedAzimuth[svData]; slope _ SVState.GetSelectedSlope[svData]; alreadyThere _ SVState.AddSlopePlane[svData, azimuth, slope]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsSelected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; DeleteSlopePlane: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.DeleteSlopePlanes[svData]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; ToggleSlopePlane: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { restoreNow: BOOL _ event.first = $ToggleSlopePlane; ToggleAlignmentAux[event, svData, svData.hitTest.slopePlaneHandle, restoreNow]; }; <<>> <> RadiusPrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { AtomButtons.SetAllScalarStates[svData, svData.hitTest.radiusHandle, FALSE]; IF event.first = $RadiusPrompt THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; GetRadius: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { }; AddRadius: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { radius: REAL; success, alreadyThere: BOOL; [radius, success] _ SVState.GetRadiusValue[svData]; IF NOT success THEN RETURN; alreadyThere _ SVState.AddRadius[svData, radius]; IF NOT alreadyThere THEN { -- a new button was added SVWindow.RestoreScreenAndInvariants[paintAction: $None, svData: svData, remake: none, backgndOK: TRUE, edited: TRUE, okToClearFeedback: TRUE]; }; }; DeleteRadius: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVState.DeleteRadii[svData]; SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; ToggleRadius: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { restoreNow: BOOL _ event.first = $ToggleSlopePlane; FindRadius: PROC [state: BOOL, name: Rope.ROPE, value: REF ANY, clientData: REF ANY] RETURNS [newState: BOOL, newName: Rope.ROPE _ NIL, newValue: REF ANY, done: BOOL _ FALSE] = { eachRad: REAL _ NARROW[value, REF REAL]^; IF ABS[eachRad-radius] < epsilon THEN {totalNewState _ newState _ NOT state; done _ TRUE} ELSE newState _ state; newName _ name; newValue _ value; }; epsilon: REAL = 0.001; totalNewState: BOOL _ FALSE; radius: REAL; handle: SortedButtonHandle _ svData.hitTest.radiusHandle; radius _ NARROW[event.rest.first, REF REAL]^; AtomButtons.WriteSortedButtons[handle, FindRadius, svData]; -- alters totalNewState IF restoreNow AND totalNewState THEN SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsSelected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE] ELSE SVWindow.RestoreScreenAndInvariants[paintAction: $NewAlignmentsDeselected, svData: svData, remake: alignBag, backgndOK: TRUE, edited: FALSE, okToClearFeedback: TRUE]; }; <<>> <> MeasureSlopeHit: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { viewer: Viewer _ svData.measure.slopeView; ViewerTools.SetSelection[viewer]; }; MeasureAzimuthHit: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { viewer: Viewer _ svData.measure.azimuthView; ViewerTools.SetSelection[viewer]; }; MeasureRadiusHit: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { viewer: Viewer _ svData.measure.radiusView; ViewerTools.SetSelection[viewer]; }; <<>> <> <<>> 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, SVCoordSys.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[paintAction: $PaintEntireScene, svData: svData, remake: triggerBag, backgndOK: FALSE, edited: FALSE, okToClearFeedback: TRUE]; }; 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 MergeScene: PROC [realScene, tempScene: Scene, feedback: FeedbackData] = { sceneAssembly, sliceParent, sliceCopy: Slice; g: AssemblyGenerator _ SVScene.PrimAssembliesInScene[tempScene]; sceneAssembly _ realScene.assembly; SVSelect.DeselectAll[realScene, normal]; FOR slice: Slice _ SVScene.NextAssembly[g], SVScene.NextAssembly[g] UNTIL slice = NIL DO [----, sliceParent] _ SVScene.FindAssemblyFromName[slice.name, tempScene]; sliceCopy _ SVScene.CopyAssemblyAndSonsUniqueNames[slice, tempScene, realScene, sceneAssembly, feedback]; SVSelect.SelectEntireSlice[sliceCopy, realScene, normal]; ENDLOOP; }; GetMergeAux: PROC [fullName: Rope.ROPE, wdir: Rope.ROPE, versionSpecified: BOOL _ FALSE, event: ATOM, opName: Rope.ROPE, svData: SVData] = { success: BOOL; scene: Scene; oldScreenCS: CoordSystem _ svData.camera.screenCS; <> startTime: BasicTime.GMT; endTime: BasicTime.GMT; totalTime: INT; timeRope: Rope.ROPE; drawStyle: DrawStyle; cameraName: Rope.ROPE; startTime _ BasicTime.Now[]; IF event = $Get THEN { fileCamera: FileCamera; [scene, success] _ SVViewersOnScene.LoadScene[svData, fullName, wdir]; IF NOT success THEN RETURN; <> 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]; }; }; drawStyle _ SVEvent.CurrentStyle[svData]; svData.camera _ SVScene.CreateCamera[scene.coordSysRoot, SVCoordSys.CopyCoordSysFromAnyTree[oldScreenCS, "SCREEN", NIL, NIL], drawStyle]; SVScene.StuffCameraFromFileCamera[svData.camera, fileCamera, svData.camera.style, scene]; svData.scene _ scene; UpdateHeader[fullName, svData]; SceneOldVersion[svData]; } ELSE { [scene, success] _ SVFiles.OpenScene[fullName, wdir, svData.feedback]; IF NOT success THEN RETURN; MergeScene[svData.scene, scene, svData.feedback]; }; endTime _ BasicTime.Now[]; totalTime _ BasicTime.Period[startTime, endTime]; timeRope _ IO.PutFR[" Done in time (%r)", [integer[totalTime]]]; Feedback.Append[svData.feedback, timeRope, oneLiner]; <> SVEvent.Selected[NIL, svData]; SVWindow.RestoreScreenAndInvariants[paintAction: $PaintEntireScene, svData: svData, remake: triggerBag, backgndOK: FALSE, edited: event=$Merge, okToClearFeedback: FALSE]; }; Get: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; picName: Rope.ROPE _ NARROW[event.rest.first]; success: BOOL; fullName: Rope.ROPE; wdir: Rope.ROPE; wdir _ editToolData.originalWorkingDirectory; [----, fullName, success] _ GetSolidviews3dFileName[event.rest, wdir, svData.feedback]; IF NOT success THEN GOTO Abort; ClearAux[event, svData]; GetMergeAux[fullName, wdir, FALSE, $Get, "Get", svData]; EXITS Abort => { Feedback.Append[svData.feedback, "Could not find requested file", oneLiner]; Feedback.Blink[svData.feedback]; }; }; -- end of Get Merge: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ NARROW[svData.editToolData]; fullName: Rope.ROPE; wdir: Rope.ROPE; success, versionSpecified: BOOL _ FALSE; wdir _ editToolData.originalWorkingDirectory; [----, fullName, success] _ GetSolidviews3dFileName[event.rest, wdir, svData.feedback]; IF NOT success THEN { Feedback.Append[svData.feedback, "Could not find requested file", oneLiner]; GOTO Abort; }; GetMergeAux[fullName, wdir, versionSpecified, $Merge, "Merge", svData]; EXITS Abort => Feedback.Blink[svData.feedback]; }; ClearAux: PROC [event: LIST OF REF ANY, svData: SVData] = { svData.refresh.overlayList _ NIL; SVSelect.DeselectAllAllClasses[svData.scene]; <> svData.editToolData.skitter _ SVCaret.Create[]; svData.scene.anchor _ SVCaret.Create[]; svData.aborted _ ALL[FALSE]; }; Store: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; wdir: Rope.ROPE; success: BOOL _ TRUE; picName: Rope.ROPE _ NARROW[event.rest.first]; fullName: Rope.ROPE; scene: Scene _ svData.scene; emergency: BOOL _ FALSE; wdir _ editToolData.originalWorkingDirectory; [----, fullName, success] _ GetSolidviews3dFileName[event.rest, svData.currentWDir, svData.feedback, emergency]; 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 GetSolidviews3dFileName: PROC [event: LIST OF REF ANY, currentWDir: Rope.ROPE, feedback: FeedbackData, emergency: BOOL _ FALSE] RETURNS [fileName, fullName: Rope.ROPE _ NIL, success: BOOL _ TRUE] = { RopeFromRef: PROC [ref: REF ANY] RETURNS [rope: Rope.ROPE] ~ { WITH ref SELECT FROM text: REF TEXT => RETURN[Rope.FromRefText[text] ]; r: Rope.ROPE => RETURN[r]; ENDCASE => ERROR; }; fileName _ IF event#NIL AND event.first#NIL THEN RopeFromRef[event.first] ELSE "NoName"; [fullName, success, ----] _ GGFileOps.GetGenericFileName[fileName, currentWDir, "gg3d", LIST["gargoyle", "ip", "interpress", "script", "log", "ais"], feedback, emergency]; }; <<>> Split: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> scene: Scene _ svData.scene; SVViewersOnScene.Split[svData, scene]; }; <