<> <> <> <> DIRECTORY Atom, Convert, SVCoordSys, Feedback, Imager, IO, Menus, RefTab, Rope, SlackProcess, SV2d, SV3d, SVBasicTypes, SVEvent, SVInterfaceTypes, SVModelTypes, SVMouseEvent, SVSceneTypes, SVSessionLog, SVUserInput, SVWindow, TIP, TIPUser, ViewerClasses, ViewerTools; SVUserInputImpl: CEDAR PROGRAM IMPORTS Atom, Convert, SVCoordSys, Feedback, IO, RefTab, Rope, SlackProcess, SVEvent, SVMouseEvent, SVSessionLog, SVWindow, ViewerTools EXPORTS SVUserInput = BEGIN Artwork: TYPE = SVModelTypes.Artwork; ArtworkToolData: TYPE = SVInterfaceTypes.ArtworkToolData; Slice: TYPE = SVSceneTypes.Slice; SliceList: TYPE = SVSceneTypes.SliceList; BoundBox: TYPE = SVBasicTypes.BoundBox; Camera: TYPE = SVModelTypes.Camera; Classification: TYPE = SVSceneTypes.Classification; Color: TYPE = Imager.Color; CSGTree: TYPE = SVSceneTypes.CSGTree; EditToolData: TYPE = SVInterfaceTypes.EditToolData; EventProc: TYPE = SVUserInput.EventProc; FileCamera: TYPE = SVSceneTypes.FileCamera; FrameBox: TYPE = SVModelTypes.FrameBox; MasterObject: TYPE = SVSceneTypes.MasterObject; Point2d: TYPE = SV2d.Point2d; Primitive: TYPE = SVSceneTypes.Primitive; Ray: TYPE = SVSceneTypes.Ray; Scene: TYPE = SVSceneTypes.Scene; Selection: TYPE = SVInterfaceTypes.Selection; Shape: TYPE = SVSceneTypes.Shape; SlackHandle: TYPE = SlackProcess.SlackHandle; SVData: TYPE = SVInterfaceTypes.SVData; TrigLine: TYPE = SV2d.TrigLine; Vector3d: TYPE = SV3d.Vector3d; Problem: SIGNAL [msg: Rope.ROPE] = Feedback.Problem; <> InputNotify: PUBLIC PROC [self: ViewerClasses.Viewer, input: LIST OF REF ANY] = { <> <> svData: SVData _ NARROW[self.data]; ProcessAndQueueEvent[input, svData]; }; EventNotify: PUBLIC PROC [clientData: REF ANY, event: LIST OF REF ANY] = { WITH clientData SELECT FROM editToolData: EditToolData => ProcessAndQueueEvent[event, editToolData.currentSVData]; svData: SVData => ProcessAndQueueEvent[event, svData]; ENDCASE => ERROR; }; ProcessAndQueueEvent: PROC [event: LIST OF REF ANY, svData: SVData] = { <> <<1) LIST[REF CHAR].>> <<2) LIST[ATOM, ... ].>> handle: SlackHandle _ svData.slackHandle; optimizeHint: REF ANY; WITH event.first SELECT FROM atom: ATOM => { atomName: Rope.ROPE; atomName _ Atom.GetPName[atom]; IF atom = $During THEN optimizeHint _ LIST[$During]; <> <> <> <<};>> event _ GetAnyArguments[event, svData]; }; ENDCASE => ERROR; IF printAllInput THEN PrintAllInput[event, svData]; SlackProcess.QueueInputAction[handle, Dispatch, event, svData, optimizeHint]; }; GetAnyArguments: PROC [event: LIST OF REF ANY, svData: SVData] RETURNS [newEvent: LIST OF REF ANY] = { atom: ATOM; found: BOOL; regEvent: RegisteredEvent; refAny: REF ANY; camera: Camera _ svData.camera; atom _ NARROW[event.first]; [found, refAny] _ RefTab.Fetch[eventTable, atom]; regEvent _ NARROW[refAny]; IF NOT found THEN { NotYetImplementedMessage[atom, svData]; newEvent _ event; } ELSE { SELECT regEvent.argType FROM none => { IF event.rest # NIL AND ISTYPE[event.rest.first, TIP.TIPScreenCoords] THEN { mousePlace: TIP.TIPScreenCoords _ NARROW[event.rest.first]; point: Point2d _ SVCoordSys.ScreenToCamera[[mousePlace.mouseX, mousePlace.mouseY], camera.screenCS]; refPoint: REF Imager.VEC _ NEW[Imager.VEC _ [point[1], point[2]]]; newEvent _ LIST[event.first, refPoint]; } ELSE newEvent _ event; }; refReal => newEvent _ CheckForSelectedReal[atom, event]; refInt => newEvent _ CheckForSelectedInt[atom, event]; rope => newEvent _ CheckForSelectedRope[atom, event]; ENDCASE => ERROR; }; }; <> Dispatch: PROC [clientData: REF ANY, event: LIST OF REF ANY] = { svData: SVData _ NARROW[clientData]; atom: ATOM _ NARROW[event.first]; found: BOOL; regEvent: RegisteredEvent; refAny: REF ANY; [found, refAny] _ RefTab.Fetch[eventTable, atom]; regEvent _ NARROW[refAny]; IF NOT found THEN NotYetImplementedMessage[atom, svData] ELSE regEvent.eventProc[event, svData]; }; <> printAllInput: BOOL _ FALSE; -- controlled by Debug menu PrintAllInput: PROC [event: LIST OF REF ANY, clientData: REF ANY] = { svData: SVData _ NARROW[clientData]; FOR list: LIST OF REF ANY _ event, list.rest UNTIL list = NIL DO WITH list.first SELECT FROM atom: ATOM => Feedback.AppendTypescript[svData.feedback, Atom.GetPName[atom], oneLiner]; int: REF INT => Feedback.AppendTypescript[svData.feedback, IO.PutFR["%g ", [integer[int^]]], oneLiner]; refChar: REF CHAR => Feedback.AppendTypescript[svData.feedback, IO.PutFR["%g ", [character[refChar^]]], oneLiner]; coords: TIP.TIPScreenCoords => Feedback.AppendTypescript[svData.feedback, IO.PutFR["(%g, %g) ", [real[coords.mouseX]], [real[coords.mouseY]]], oneLiner]; ENDCASE => ERROR; ENDLOOP; }; NotYetImplementedMessage: PROC [atom: ATOM, svData: SVData] = { Feedback.PutF[svData.feedback, oneLiner, "User action %g is not yet implemented", [rope[Atom.GetPName[atom]]]]; Feedback.Blink[svData.feedback]; }; CheckForSelectedReal: PROC [atom: ATOM, action: LIST OF REF ANY] RETURNS [newAction: LIST OF REF ANY] = { rope: Rope.ROPE; real: REAL; IF action.rest = NIL THEN { -- interactive call rope _ ViewerTools.GetSelectionContents[]; real _ Convert.RealFromRope[rope ! Convert.Error => {real _ -1.0; CONTINUE}]; newAction _ LIST[atom, NEW[REAL _ real]]; } ELSE IF ISTYPE[action.rest.first, REF TEXT] THEN { -- TIP table call rope _ Rope.FromRefText[NARROW[action.rest.first]]; real _ Convert.RealFromRope[rope ! Convert.Error => {real _ -1.0; CONTINUE}]; newAction _ LIST[atom, NEW[REAL _ real]]; } ELSE newAction _ action; -- SessionLog call }; CheckForSelectedInt: PROC [atom: ATOM, action: LIST OF REF ANY] RETURNS [newAction: LIST OF REF ANY] = { rope: Rope.ROPE; int: INT; IF action.rest = NIL THEN { -- interactive call rope _ ViewerTools.GetSelectionContents[]; int _ IO.GetInt[IO.RIS[rope] ! IO.EndOfStream, IO.Error => {int _ -1; CONTINUE}]; newAction _ LIST[atom, NEW[INT _ int]]; } ELSE IF ISTYPE[action.rest.first, REF INT] THEN { -- TIP table call or SessionLog call newAction _ action; } ELSE ERROR; }; CheckForSelectedRope: PROC [atom: ATOM, action: LIST OF REF ANY] RETURNS [newAction: LIST OF REF ANY] = { IF action.rest = NIL THEN { -- interactive call newAction _ LIST[atom, ViewerTools.GetSelectionContents[]]; } ELSE IF ISTYPE[action.rest.first, REF TEXT] THEN { -- TIP table call newAction _ LIST[atom, Rope.FromRefText[NARROW[action.rest.first]]]; } ELSE newAction _ action; -- SessionLog call }; RegisteredEvent: TYPE = REF RegisteredEventObj; RegisteredEventObj: TYPE = RECORD [ eventProc: EventProc, argType: SVUserInput.ArgumentType ]; RegisterAction: PUBLIC PROC [atom: ATOM, eventProc: EventProc, argType: SVUserInput.ArgumentType] = { regEvent: RegisteredEvent _ NEW[RegisteredEventObj _ [eventProc, argType]]; notAlreadyRegistered: BOOL _ TRUE; notAlreadyRegistered _ RefTab.Insert[eventTable, atom, regEvent]; IF NOT notAlreadyRegistered THEN SIGNAL Problem[msg: IO.PutFR["Event %g was already registered in Solidviews's event table.", [rope[Atom.GetPName[atom]]] ]]; }; eventTable: RefTab.Ref; NoOp: EventProc = {}; RegisterSolidviewsActions: PROC = { <> eventTable _ RefTab.Create[300]; <> RegisterAction[$EndOfSessionLogMessage, SVSessionLog.EndOfSessionLogMessage, none]; <> RegisterAction[$Clear, SVEvent.Clear, none]; RegisterAction[$Restore, SVEvent.Restore, none]; RegisterAction[$Get, SVEvent.Get, rope]; RegisterAction[$Merge, SVEvent.Merge, rope]; RegisterAction[$Store, SVEvent.Store, rope]; RegisterAction[$Save, SVEvent.Save, none]; RegisterAction[$Split, SVEvent.Split, none]; <> RegisterAction[$ToIP, SVEvent.ToIP, rope]; RegisterAction[$StorePoly, SVEvent.StorePoly, none]; <> RegisterAction[$RayCast, SVEvent.RayCast, none]; RegisterAction[$RayCastColor, SVEvent.RayCast, none]; RegisterAction[$StopRays, SVEvent.StopRays, none]; RegisterAction[$ARay, SVEvent.ARay, none]; <> <> <> <> <> <> RegisterAction[$StrokeColorFromColorTool, SVEvent.StrokeColorFromColorTool, none]; RegisterAction[$PrintStrokeColor, SVEvent.PrintStrokeColor, none]; RegisterAction[$StrokeColorToColorTool, SVEvent.StrokeColorToColorTool, none]; RegisterAction[$StrokeColorNone, SVEvent.StrokeColorNone, none]; RegisterAction[$StrokeColorGray, SVEvent.StrokeColorGray, refReal]; RegisterAction[$StrokeColorFromSelectedName, SVEvent.StrokeColorFromSelectedName, rope]; RegisterAction[$StrokeColorFromSelectedRGB, SVEvent.StrokeColorFromSelectedRGB, rope]; RegisterAction[$ShowDefaultStrokeColor, SVEvent.ShowDefaultStrokeColor, none]; RegisterAction[$SetDefaultStrokeColor, SVEvent.SetDefaultStrokeColor, none]; <> RegisterAction[$AreaColorFromColorTool, SVEvent.AreaColorFromColorTool, none]; RegisterAction[$PrintAreaColor, SVEvent.PrintAreaColor, none]; RegisterAction[$AreaColorToColorTool, SVEvent.AreaColorToColorTool, none]; RegisterAction[$AreaColorNone, SVEvent.AreaColorNone, none]; RegisterAction[$AreaColorGray, SVEvent.AreaColorGray, refReal]; RegisterAction[$AreaColorFromSelectedName, SVEvent.AreaColorFromSelectedName, rope]; RegisterAction[$AreaColorFromSelectedRGB, SVEvent.AreaColorFromSelectedRGB, rope]; RegisterAction[$ShowDefaultFillColor, SVEvent.ShowDefaultFillColor, none]; RegisterAction[$SetDefaultFillColor, SVEvent.SetDefaultFillColor, none]; <> RegisterAction[$SelectAll, SVEvent.SelectAll, none]; <> RegisterAction[$GravityChoiceChange, SVEvent.GravityChoiceChange, none]; RegisterAction[$GravityExtentChange, SVEvent.GravityExtentChange, none]; RegisterAction[$ToggleGravity, SVEvent.ToggleGravity, none]; RegisterAction[$ToggleMidpoints, SVEvent.ToggleMidpoints, none]; <> RegisterAction[$InitializeAlignments, SVEvent.InitializeAlignments, none]; RegisterAction[$StandardSlopes, SVEvent.StandardSlopes, none]; RegisterAction[$StandardAzimuths, SVEvent.StandardAzimuths, none]; <> RegisterAction[$AzimuthPrompt, SVEvent.AzimuthPrompt, none]; RegisterAction[$GetAzimuth, SVEvent.GetAzimuth, none]; RegisterAction[$AddAzimuth, SVEvent.AddAzimuth, none]; RegisterAction[$DeleteAzimuth, SVEvent.DeleteAzimuth, none]; RegisterAction[$ChooseAzimuth, SVEvent.ChooseAzimuth, none]; <> RegisterAction[$SlopePrompt, SVEvent.SlopePrompt, none]; RegisterAction[$GetSlope, SVEvent.GetSlope, none]; RegisterAction[$AddSlope, SVEvent.AddSlope, none]; RegisterAction[$DeleteSlope, SVEvent.DeleteSlope, none]; RegisterAction[$ChooseSlope, SVEvent.ChooseSlope, none]; <> RegisterAction[$SlopeLinePrompt, SVEvent.SlopeLinePrompt, none]; RegisterAction[$GetSlopeLine, SVEvent.GetSlopeLine, none]; RegisterAction[$AddSlopeLine, SVEvent.AddSlopeLine, none]; RegisterAction[$NewSlopeLine, SVEvent.NewSlopeLine, none]; RegisterAction[$DeleteSlopeLine, SVEvent.DeleteSlopeLine, none]; RegisterAction[$ToggleSlopeLine, SVEvent.ToggleSlopeLine, none]; <> RegisterAction[$SlopePlanePrompt, SVEvent.SlopePlanePrompt, none]; RegisterAction[$GetSlopePlane, SVEvent.GetSlopePlane, none]; RegisterAction[$AddSlopePlane, SVEvent.AddSlopePlane, none]; RegisterAction[$NewSlopePlane, SVEvent.NewSlopePlane, none]; RegisterAction[$DeleteSlopePlane, SVEvent.DeleteSlopePlane, none]; RegisterAction[$ToggleSlopePlane, SVEvent.ToggleSlopePlane, none]; <> RegisterAction[$RadiusPrompt, SVEvent.RadiusPrompt, none]; RegisterAction[$GetRadius, SVEvent.GetRadius, none]; RegisterAction[$AddRadius, SVEvent.AddRadius, none]; RegisterAction[$DeleteRadius, SVEvent.DeleteRadius, none]; RegisterAction[$ToggleRadius, SVEvent.ToggleRadius, none]; <> RegisterAction[$StylePrompt, SVEvent.StylePrompt, none]; RegisterAction[$XYZPrompt, SVEvent.XYZPrompt, none]; RegisterAction[$Selected, SVEvent.Selected, none]; RegisterAction[$KillSelectionsButton, SVEvent.KillSelectionsButton, none]; RegisterAction[$DeleteJacksButton, SVEvent.DeleteJacksButton, none]; <> RegisterAction[$ExtendCurrent, SVEvent.ExtendCurrent, none]; RegisterAction[$ReloadTipTable, SVWindow.ReloadTipTable, none]; RegisterAction[$Delete, SVEvent.Delete, none]; RegisterAction[$IPSnapShot, SVEvent.IPSnapShot, none]; RegisterAction[$NoOp, NoOp, none]; RegisterAction[$AddCylinder, SVEvent.AddCylinder, none]; RegisterAction[$Skewer, SVEvent.Skewer, none]; RegisterAction[$MoveUntilTouch, SVEvent.MoveUntilTouch, none]; RegisterAction[$ArrowShoot, SVEvent.ArrowShoot, none]; RegisterAction[$DropPerpendicular, SVEvent.DropPerpendicular, none]; RegisterAction[$VolleyShoot, NoOp, none]; RegisterAction[$JackPivotX, SVEvent.JackPivotX, refReal]; RegisterAction[$JackPivotY, SVEvent.JackPivotY, refReal]; RegisterAction[$JackPivotZ, SVEvent.JackPivotZ, refReal]; RegisterAction[$SourcePivotX, SVEvent.SourcePivotX, refReal]; RegisterAction[$SourcePivotY, SVEvent.SourcePivotY, refReal]; RegisterAction[$SourcePivotZ, SVEvent.SourcePivotZ, refReal]; RegisterAction[$SourceRotX, SVEvent.SourceRotX, refReal]; RegisterAction[$SourceRotY, SVEvent.SourceRotY, refReal]; RegisterAction[$SourceRotZ, SVEvent.SourceRotZ, refReal]; RegisterAction[$CopyRandomToAllTargets, SVEvent.CopyRandomToAllTargets, none]; RegisterAction[$CopyToAllTargets, SVEvent.CopyToAllTargets, none]; RegisterAction[$CopyToAllTargetsTree, SVEvent.CopyToAllTargetsTree, none]; RegisterAction[$MoveToTarget, SVEvent.MoveToTarget, none]; RegisterAction[$CopyRotate, SVEvent.CopyRotate, none]; RegisterAction[$CycleTool, SVEvent.CycleTool, none]; RegisterAction[$SetTool, SVEvent.SetTool, none]; RegisterAction[$ResetTool, SVEvent.ResetTool, none]; RegisterAction[$ResetSpheres, SVEvent.ResetSpheres, none]; RegisterAction[$SetBoundingSpheres, SVEvent.SetBoundingSpheres, none]; RegisterAction[$SetSphereShadows, SVEvent.SetSphereShadows, none]; RegisterAction[$SkitterMakes, SVEvent.SkitterMakes, none]; RegisterAction[$SkitterMakesSource, SVEvent.SkitterMakesSource, none]; RegisterAction[$SkitterMakesTarget, SVEvent.SkitterMakesTarget, none]; RegisterAction[$SkitterMakesPlane, SVEvent.SkitterMakesPlane, none]; RegisterAction[$SkitterMakesSourceIndirect, SVEvent.SkitterMakesSourceIndirect, none]; RegisterAction[$SkitterMakesTargetIndirect, SVEvent.SkitterMakesTargetIndirect, none]; RegisterAction[$SkitterMakesSourceIndirectOnly, SVEvent.SkitterMakesSourceIndirectOnly, none]; RegisterAction[$SkitterMakesTargetIndirectOnly, SVEvent.SkitterMakesTargetIndirectOnly, none]; RegisterAction[$SkitterMakesPlaneIndirectOnly, SVEvent.SkitterMakesPlaneIndirectOnly, none]; <> RegisterAction[$StartBlock, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartDrag, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartCopyAndDrag, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartRotate, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartScale, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSelectJoint, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSelectSegment, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSelectTraj, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSelectTopLevel, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartExtendSelection, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartExtendSelectJoint, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartExtendSelectSegment, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartExtendSelectTraj, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartExtendSelectTopLevel, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSelectWithBlock, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSelectPartsWithBlock, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartFrame, SVMouseEvent.HandleMouse, none]; RegisterAction[$StartSkitter, SVMouseEvent.HandleMouse, none]; RegisterAction[$During, SVMouseEvent.HandleMouse, none]; RegisterAction[$MouseUp, SVMouseEvent.HandleMouse, none]; RegisterAction[$GuardUp, SVMouseEvent.HandleMouse, none]; RegisterAction[$AllUp, SVMouseEvent.HandleMouse, none]; RegisterAction[$Abort, SVMouseEvent.HandleMouseless, none]; }; -- end of RegisterSolidviewsActions RegisterSolidviewsActions[]; END.