<> <> <> <> <> DIRECTORY AtomButtons, AtomButtonsTypes, Basics, BasicTime, CodeTimer, Containers, CoordSys, DisplayListToTree, Feedback, FileNames, FS, Imager, IO, Menus, Random, Real, Rope, SlackProcess, SV2d, SV3d, SVAlign, SVAssembly, SVBasicTypes, SVCaret, SVCastRays, SVDrawMonitor, SVEditUser, SVEvent, SVFiles, SVGravity, SVInterfaceTypes, SVModelTypes, SVMouseEvent, SVRefresh, SVScene, SVSceneTypes, SVSelect, SVSelections, SVSessionLog, SVState, SVUserInput, SVUtility, SVViewersOnScene, SVViewerTool, SVWindow, TFO3d, ViewerClasses, ViewerOps, ViewerTools; SVEventImplA: CEDAR PROGRAM IMPORTS AtomButtons, BasicTime, CodeTimer, CoordSys, DisplayListToTree, Feedback, FileNames, FS, IO, Random, Rope, SlackProcess, SVAlign, SVAssembly, SVCaret, SVCastRays, SVEditUser, SVEvent, SVFiles, SVGravity, SVMouseEvent, SVRefresh, SVScene, SVSelect, SVSelections, SVSessionLog, SVState, SVUserInput, SVUtility, SVViewersOnScene, SVWindow, TFO3d, ViewerOps, ViewerTools EXPORTS SVEvent = BEGIN AlignBag: TYPE = SVInterfaceTypes.AlignBag; BoundBox: TYPE = SVBasicTypes.BoundBox; 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]; }; <<>> <> 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; azimuth, slope: REAL; azimuthSlope: Vector2d; azimuthSlope _ NARROW[event.rest.first, REF Vector2d]^; azimuth _ azimuthSlope[1]; slope _ azimuthSlope[2]; AtomButtons.WriteSortedButtons[handle, FindAzimuthSlope, svData]; 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]; }; <<>> <> <<>> 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 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; fileCamera: FileCamera; cameraName: Rope.ROPE; startTime _ BasicTime.Now[]; [scene, success] _ SVViewersOnScene.LoadScene[svData, fullName, wdir]; IF NOT success THEN RETURN; 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]; }; }; 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]; <> svData.scene _ scene; UpdateHeader[fullName, svData]; SceneOldVersion[svData]; 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; 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; ClearAux[event, svData]; GetMergeAux[fullName, wdir, FALSE, $Get, "Get", svData]; }; -- end of Get 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; 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]; }; <