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] = { 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[$CycleSelection, SVEvent.CycleSelection, none]; RegisterAction[$BlockSelectNew, SVEvent.BlockSelectNew, none]; RegisterAction[$BlockSelectNewAndDelete, SVEvent.BlockSelectNewAndDelete, none]; RegisterAction[$MakeHot, SVEvent.MakeHot, none]; RegisterAction[$MakeCold, SVEvent.MakeCold, none]; RegisterAction[$DropAnchor, SVEvent.DropAnchor, none]; RegisterAction[$LiftAnchor, SVEvent.LiftAnchor, none]; RegisterAction[$MakeAllHot, SVEvent.MakeAllHot, none]; RegisterAction[$MakeAllCold, SVEvent.MakeAllCold, none]; RegisterAction[$StandardAlignments, SVEvent.StandardAlignments, none]; RegisterAction[$ScaleUnitFromSegment, SVEvent.ScaleUnitFromSegment, none]; RegisterAction[$ScaleUnitFromValue, SVEvent.ScaleUnitFromValue, none]; RegisterAction[$ScaleUnitFromSelection, SVEvent.ScaleUnitFromSelection, refReal]; RegisterAction[$InchScaleUnit, SVEvent.InchScaleUnit, none]; RegisterAction[$CentimeterScaleUnit, SVEvent.CentimeterScaleUnit, none]; RegisterAction[$PointsScaleUnit, SVEvent.PointsScaleUnit, none]; RegisterAction[$PrintScaleUnit, SVEvent.PrintScaleUnit, none]; RegisterAction[$ToggleShowColors, SVEvent.ToggleShowColors, none]; RegisterAction[$DrawBoundBoxes, SVEvent.DrawBoundBoxes, none]; RegisterAction[$DrawBoundSpheres, SVEvent.DrawBoundSpheres, none]; RegisterAction[$DrawCoordSystems, SVEvent.DrawCoordSystems, none]; RegisterAction[$DrawPoint, SVEvent.DrawPt, none]; RegisterAction[$CrossHairs, SVEvent.CrossHairs, none]; RegisterAction[$TestGravity, SVEvent.TestGravity, refInt]; RegisterAction[$ResetStatistics, SVEvent.ResetStatistics, none]; RegisterAction[$PrintStatistics, SVEvent.PrintStatistics, none]; RegisterAction[$RaiseSIGNAL, SVEvent.RaiseSIGNAL, none]; RegisterAction[$DrawSceneButton, SVEvent.DrawSceneButton, none]; RegisterAction[$DrawColor, SVEvent.DrawColor, none]; RegisterAction[$DrawBlackAndWhite, SVEvent.DrawBlackAndWhite, none]; RegisterAction[$ShowCoordsMode, SVEvent.ShowCoordsMode, 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. ήFile: SVUserInputImpl.mesa Last edited by Bier on September 24, 1987 2:33:20 pm PDT Copyright c 1984 by Xerox Corporation. All rights reserved. Contents: Procedures for responding to button clicks made in a solidviewer. Before the Queue (done by InputNotifier, Menu Process or Playback Process) ViewerClasses.NotifyProc Called by the TIP table machinery when an action is received from mouse or keyboard. Self is an ActionArea. The event will be in one of two forms: 1) LIST[REF CHAR]. 2) LIST[ATOM, ... ]. IF Rope.Equal[Rope.Substr[atomName, 0, 5], "Start", TRUE] THEN { SlackProcess.QueueInputAction[handle, Dispatch, LIST[$SawTextFinish], svData, NIL]; need this before selection changes }; After the Queue (Done by SlackProcess). Utility Routines There were 91 events on April 28, 1987, and 94 EditUser events, making 185 total events. Special Internal Actions File Menu Interpress Menu SVCastRays Menu Stroke Menu RegisterAction[$StrokeWidth, SVEvent.StrokeWidth, refReal]; RegisterAction[$PrintStrokeValues, SVEvent.PrintStrokeValues, none]; RegisterAction[$ShowDefaultStrokeValues, SVEvent.ShowDefaultStrokeValues, none]; RegisterAction[$SetDefaultStrokeValues, SVEvent.SetDefaultStrokeValues, none]; Stroke Color Menu Fill Color Menu Select Menu Hot Spots Menu Units Menu Other Style Buttons Debug Menu Master Line Buttons Select Menu Gravity Functions Alignment Lines Azimuth Line Slope Line Slope Line Line Slope Plane Line Radius Line Text Prompts Tip Table Functions Mouse Actions Κθ˜Iheadšœ™Jšœ8™8Jšœ Οmœ1™˜eLšœžœ,˜KLšœžœžœ˜"LšœA˜ALš žœžœžœžœžœf˜L˜L˜—L˜LšŸœ˜šŸœžœ˜#L™XLšœ ˜ Lš ™LšœS˜SLš  ™ Lšœ,˜,Lšœ0˜0Lšœ(˜(Lšœ,˜,Lšœ,˜,Lšœ*˜*Lšœ,˜,Lš ™Lšœ*˜*Lšœ4˜4Lš ™Lšœ0˜0Lšœ5˜5Lšœ2˜2Lšœ*˜*Iprocš  ™ Lšœ;™;LšœD™DLšœP™PLšœN™NMš ™LšœR˜RLšœB˜BLšœN˜NLšœ@˜@LšœC˜CLšœX˜XLšœV˜VLšœN˜NLšœL˜LLš ™LšœN˜NLšœ>˜>LšœJ˜JLšœ<˜˜>Lšœ>˜>LšœP˜PLš ™Lšœ0˜0Lšœ2˜2Lšœ6˜6Lšœ6˜6Lšœ6˜6Lšœ8˜8LšœF˜FLš  ™ LšœJ˜JLšœF˜FLšœQ˜QLšœ<˜˜>Lš ™LšœB˜BLš  ™ Lšœ>˜>LšœB˜BLšœB˜BLšœ1˜1Lšœ6˜6Lšœ:˜:Lšœ@˜@Lšœ@˜@Lšœ8˜8Lš ™Lšœ@˜@Lšœ4˜4LšœD˜DLšœ>˜>Mš  ™ Mšœ4˜4Lš ™LšœH˜HLšœH˜HLšœ<˜˜>LšœB˜BMš  ™ Lšœ<˜˜>J˜Jšœ6˜6JšœD˜DJšœ)˜)Jšœ9˜9Jšœ9˜9Jšœ9˜9Jšœ=˜=Jšœ=˜=Jšœ=˜=Jšœ9˜9Jšœ9˜9Jšœ9˜9J˜JšœN˜NJšœB˜BJšœJ˜JJšœ:˜:Jšœ6˜6J˜Jšœ4˜4Jšœ0˜0Jšœ4˜4J˜Jšœ:˜:JšœF˜FJšœB˜BJ˜Jšœ:˜:JšœF˜FJšœF˜FJšœD˜DJšœV˜VJšœV˜VJšœ^˜^Jšœ^˜^Jšœ\˜\J˜J™ Jšœ<˜˜>Jšœ8˜8Jšœ9˜9Jšœ9˜9Jšœ7˜7Jšœ;˜;Lšœ‘#˜&L˜—Lšœ˜L˜Jšžœ˜Jšœ˜Jš ˜—…—DrY8