<> <> <> <> DIRECTORY CodeTimer, SVGraphics, Feedback, Imager, ImagerBackdoor, ImagerPath, IO, Matrix3d, Rope, SV2d, SV3d, SVAlign, SVAssembly, SVBasicTypes, SVDescribe, SVGravity, SVInterfaceTypes, SVModelTypes, SVMouseEvent, SVRayTypes, SVRefresh, SVScene, SVSceneTypes, SVSelect, SVSelections, SVState, SVWindow, TIPUser, ViewerClasses; SVMouseEventImplB: CEDAR PROGRAM IMPORTS CodeTimer, SVGraphics, Feedback, Imager, ImagerBackdoor, Matrix3d, Rope, SVAlign, SVAssembly, SVDescribe, SVGravity, SVRefresh, SVScene, SVSelect, SVSelections, SVState, SVWindow EXPORTS SVMouseEvent = BEGIN ArtworkToolData: TYPE = SVInterfaceTypes.ArtworkToolData; Slice: TYPE = SVSceneTypes.Slice; BoundBox: TYPE = SVBasicTypes.BoundBox; Camera: TYPE = SVModelTypes.Camera; Classification: TYPE = SVRayTypes.Classification; CoordSystem: TYPE = SVModelTypes.CoordSystem; EditToolData: TYPE = SVInterfaceTypes.EditToolData; FeatureData: TYPE = SVInterfaceTypes.FeatureData; FileCamera: TYPE = SVSceneTypes.FileCamera; FrameBox: TYPE = SVModelTypes.FrameBox; MasterObject: TYPE = SVSceneTypes.MasterObject; Matrix4by4: TYPE = SV3d.Matrix4by4; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = SV3d.Point3d; Primitive: TYPE = SVRayTypes.Primitive; Ray: TYPE = SVRayTypes.Ray; Scene: TYPE = SVSceneTypes.Scene; Selection: TYPE = SVInterfaceTypes.Selection; SelectionGenerator: TYPE = SVInterfaceTypes.SelectionGenerator; SelectMode: TYPE = SVSceneTypes.SelectMode; SkitterMode: TYPE = SVSceneTypes.SkitterMode; SliceDescriptor: TYPE = SVSceneTypes.SliceDescriptor; ToolData: TYPE = SVSceneTypes.ToolData; TrigLine: TYPE = SV2d.TrigLine; Vector3d: TYPE = SV3d.Vector3d; SVData: TYPE = SVInterfaceTypes.SVData; MouseProc: TYPE = SVMouseEvent.MouseProc; StartProc: TYPE = SVMouseEvent.StartProc; Problem: SIGNAL [msg: Rope.ROPE] = Feedback.Problem; FrameUpLeft: PUBLIC StartProc = { <> camera: Camera _ svData.camera; camera.frame.fullScreen _ FALSE; camera.frame.downLeft[1] _ cameraPoint[1]; camera.frame.upRight[2] _ cameraPoint[2]; camera.frame.downLeft[2] _ cameraPoint[2] - 50.0; -- Just to give the frame an initial size. camera.frame.upRight[1] _ cameraPoint[1] + 50.0; SVWindow.RestoreScreenAndInvariants[$DuringMotion, svData]; }; FrameDownRightMove: PUBLIC MouseProc = { <> camera: Camera _ svData.camera; DoDrawFrame: PROC [dc: Imager.Context] = { Imager.SetColor[dc, ImagerBackdoor.invert]; SVGraphics.DrawFrame [dc, camera]; }; camera.frame.downLeft[2] _ cameraPoint[2]; camera.frame.upRight[1] _ cameraPoint[1]; <> SVWindow.RestoreScreenAndInvariants[$DuringMotion, svData]; }; FrameDownRightEnd: PUBLIC MouseProc = { camera: Camera _ svData.camera; fileCamera: FileCamera; success: BOOL; FrameDownRightMove[event, svData, cameraPoint]; <> <> [fileCamera, success] _ SVScene.FindFileCameraFromName[camera.viewName, svData.scene]; IF success THEN { fileCamera.frame.downLeft _ camera.frame.downLeft; fileCamera.frame.upRight _ camera.frame.upRight; fileCamera.frame.fullScreen _ FALSE; }; }; DeleteFrame: PUBLIC MouseProc = { camera: Camera _ svData.camera; frame: FrameBox _ camera.frame; DoDrawFrame: PROC [dc: Imager.Context] = { Imager.SetColor[dc, ImagerBackdoor.invert]; SVGraphics.DrawFrame [dc, camera]; }; <> SVWindow.RestoreScreenAndInvariants[$FrameChanged, svData]; frame.fullScreen _ TRUE; }; SaveSavedState: PROC [svData: SVData] = { SVScene.SaveSelections[svData.scene]; <> <> }; <> StartSelectJoint: PUBLIC StartProc = { svData.drag.selectState _ joint; StartSelectAux[svData, cameraPoint]; DuringSelect[NIL, svData, cameraPoint]; }; StartSelectSegment: PUBLIC StartProc = { svData.drag.selectState _ segment; StartSelectAux[svData, cameraPoint]; DuringSelect[NIL, svData, cameraPoint]; }; StartSelectTraj: PUBLIC StartProc = { svData.drag.selectState _ traj; StartSelectAux[svData, cameraPoint]; DuringSelect[NIL, svData, cameraPoint]; }; StartSelectTopLevel: PUBLIC StartProc = { svData.drag.selectState _ topLevel; StartSelectAux[svData, cameraPoint]; DuringSelect[NIL, svData, cameraPoint]; }; StartSelectAux: PROC [svData: SVData, cameraPoint: Point2d] = { IF NOT SVRefresh.EmptyOverlay[svData] THEN ERROR; SaveSavedState[svData]; }; DuringSelect: PUBLIC MouseProc = { <> opRope: Rope.ROPE = "Selecting "; worldPt: Point3d; normalVec: Vector3d; feature: FeatureData; hitData: REF ANY; scene: Scene _ svData.scene; selectMode: SelectMode _ SVState.GetSelectMode[svData]; IF selectMode = joint THEN [worldPt, normalVec, feature, hitData] _ SVGravity.PointsPreferred[cameraPoint, svData.hitTest.criticalR, SVAlign.emptyAlignBag, svData.hitTest.sceneBag, svData, TRUE] ELSE [worldPt, normalVec, feature, hitData] _ SVGravity.StrictDistance[cameraPoint, svData.hitTest.criticalR, SVAlign.emptyAlignBag, svData.hitTest.sceneBag, svData, TRUE]; SetCaretAttractorEndpoint[svData, cameraPoint, worldPt, normalVec, feature, hitData]; SVSelect.DeselectAll[scene, normal]; IF feature#NIL THEN SelectAndDescribeSlicePart[feature, hitData, worldPt, svData, selectMode, opRope] ELSE DescribeOperationOnNothing[svData, opRope]; SVWindow.RestoreScreenAndInvariants[paintAction: $DuringSelect, svData: svData, remake: none, backgndOK: TRUE, edited: FALSE, okToClearFeedback: FALSE]; }; -- end DuringSelect SelectAndDescribeSlicePart: PUBLIC PROC [feature: FeatureData, hitData: REF ANY, hitPoint: Point3d, svData: SVData, mode: SelectMode, opRope: Rope.ROPE] = { selectedD: REF ANY _ SelectSlicePart[feature, hitData, hitPoint, svData, mode]; description: Rope.ROPE _ WITH selectedD SELECT FROM sliceD: SliceDescriptor => SVAssembly.Describe[sliceD], ENDCASE => SVDescribe.DescribeFeature[feature, hitData, svData]; Feedback.PutFHerald[svData.feedback, oneLiner, "%g %g", [rope[opRope]], [rope[description]] ]; }; SelectSlicePart: PUBLIC PROC [feature: FeatureData, hitData: REF ANY, hitPoint: Point3d, svData: SVData, mode: SelectMode] RETURNS [selectedD: REF ANY] = { <> SELECT feature.type FROM slice => { slice: Slice _ NARROW[feature.shape, SliceDescriptor].slice; selectedSliceD: SliceDescriptor; selectedSliceD _ SVAssembly.NewParts[slice, hitData, hitPoint, mode]; SVSelect.SelectSlice[selectedSliceD, svData.scene, normal]; selectedD _ selectedSliceD; }; slopeLine, angleLine, distanceLine, intersectionPoint, radiiCircle, midpoint => ERROR; ENDCASE => ERROR Problem[msg: "unimplemented result type"]; }; DescribeOperationOnNothing: PUBLIC PROC [svData: SVData, opRope: Rope.ROPE] = { Feedback.PutFHerald[svData.feedback, oneLiner, "%g %g", [rope[opRope]], [rope["nothing"]] ]; }; SetCaretAttractorEndpoint: PUBLIC PROC [svData: SVData, cameraPoint: Point2d, worldPt: Point3d, normal: Vector3d, feature: FeatureData, hitData: REF ANY] = { assembly: Slice; assembly _ IF feature = NIL THEN NIL ELSE NARROW[feature.shape, SliceDescriptor].slice; IF feature=NIL THEN [] _ SVSelections.PositionSkitter[cameraPoint, worldPt, normal, assembly, svData] ELSE { shape: REF ANY _ feature.shape; SELECT feature.type FROM slice => { jointPos: Point3d; jointNormal: Vector3d; sliceD: SliceDescriptor _ NARROW[shape]; jointD: SliceDescriptor; [jointD, jointPos, jointNormal] _ SVAssembly.ClosestJointToHitData[sliceD, worldPt, normal, hitData]; [] _ SVSelections.PositionSkitter[cameraPoint, jointPos, jointNormal, assembly, svData]; }; ENDCASE => [] _ SVSelections.PositionSkitter[cameraPoint, worldPt, normal, assembly, svData]; }; }; EndSelect: PUBLIC MouseProc = { pointWORLD: Point3d; normalWORLD: Vector3d; feature: FeatureData; hitData: REF ANY; scene: Scene _ svData.scene; selectMode: SelectMode _ SVState.GetSelectMode[svData]; IF selectMode = joint THEN [pointWORLD, normalWORLD, feature, hitData] _ SVGravity.PointsPreferred[cameraPoint, svData.hitTest.criticalR, SVAlign.emptyAlignBag, svData.hitTest.sceneBag, svData, TRUE] ELSE [pointWORLD, normalWORLD, feature, hitData] _ SVGravity.StrictDistance[cameraPoint, svData.hitTest.criticalR, SVAlign.emptyAlignBag, svData.hitTest.sceneBag, svData, TRUE]; SetCaretAttractorEndpoint[svData, cameraPoint, pointWORLD, normalWORLD, feature, hitData]; SVWindow.NewCaretPos[svData]; SVSelect.DeselectAll[scene, normal]; SELECT selectMode FROM joint => EndSelectAux[svData, cameraPoint, feature, hitData, pointWORLD, joint, "joint"]; segment => EndSelectAux[svData, cameraPoint, feature, hitData, pointWORLD, segment, "segment"]; traj => EndSelectAux[svData, cameraPoint, feature, hitData, pointWORLD, traj, "trajectory"]; topLevel => EndSelectAux[svData, cameraPoint, feature, hitData, pointWORLD, topLevel, "object"]; ENDCASE => ERROR; SVState.SetSelectMode[svData, none]; -- added to help DescribeFeature work. KAP. }; -- end EndSelect <> <