<> <> <> <> <> <> DIRECTORY Atom, AtomButtonsTypes, BasicTime, Buttons, SVCastRays, Containers, SVCoordSys, SVRay, SVGraphics, SVSceneToTree, Feedback, FS, Imager, ImagerInterpress, InputFocus, IO, Labels, SVMatrix3d, Menus, MessageWindow, SVPreprocess3d, Random, Rope, SV2d, SV3d, SVAssembly, SVBasicTypes, SVCaret, SVEditUser, SVEvent, SVFileoutPoly, SVFiles, SVImage, SVInterfaceTypes, SVModelTypes, SVRefresh, SVScene, SVSceneTypes, SVSelect, SVSelections, SVCatScan, SVTransforms, SVUtility, SVViewersOnScene, SVViewerTool, SVViewerTools, SVWindow, SVParseOut, ViewerClasses, ViewerTools; SVEventImplB: CEDAR PROGRAM IMPORTS Atom, BasicTime, Buttons, SVCaret, SVCastRays, SVCoordSys, SVRay, SVGraphics, SVSceneToTree, Feedback, FS, Imager, ImagerInterpress, InputFocus, IO, Labels, SVMatrix3d, MessageWindow, SVPreprocess3d, Random, Rope, SVAssembly, SVEditUser, SVFileoutPoly, SVFiles, SVImage, SVRefresh, SVScene, SVSelect, SVSelections, SVTransforms, SVUtility, SVViewersOnScene, SVViewerTools, SVWindow, SVParseOut, ViewerTools EXPORTS SVEvent = BEGIN Slice: TYPE = SVSceneTypes.Slice; BoundBox: TYPE = SVBasicTypes.BoundBox; Camera: TYPE = SVModelTypes.Camera; CatScan: TYPE = SVCatScan.CatScan; Classification: TYPE = SVSceneTypes.Classification; Color: TYPE = Imager.Color; CoordSystem: TYPE = SVModelTypes.CoordSystem; CSGTree: TYPE = SVSceneTypes.CSGTree; DrawStyle: TYPE = SVModelTypes.DrawStyle; EditToolData: TYPE = SVInterfaceTypes.EditToolData; FeedbackData: TYPE = AtomButtonsTypes.FeedbackData; Matrix4by4: TYPE = SV3d.Matrix4by4; MouseButton: TYPE = Menus.MouseButton; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = SV3d.Point3d; Primitive: TYPE = SVSceneTypes.Primitive; Ray: TYPE = SVSceneTypes.Ray; Scene: TYPE = SVSceneTypes.Scene; Selection: TYPE = SVInterfaceTypes.Selection; SelectionGenerator: TYPE = SVInterfaceTypes.SelectionGenerator; SelectionType: TYPE = SVInterfaceTypes.SelectionType; Skitter: TYPE = SVSceneTypes.Skitter; SkitterMode: TYPE = SVSceneTypes.SkitterMode; Sphere: TYPE = SV3d.Sphere; ToolData: TYPE = SVSceneTypes.ToolData; Vector3d: TYPE = SV3d.Vector3d; Viewer: TYPE = ViewerClasses.Viewer; SVData: TYPE = SVInterfaceTypes.SVData; DCProc: TYPE = SVInterfaceTypes.DCProc; <> globalSceneStyleCount: NAT = 4; globalSceneStyleArray: ARRAY[1..globalSceneStyleCount] OF Rope.ROPE _ ["WireFrame", "Shaded", "HiddenLine", "Normals"]; ToIP: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { DoMakeInterpress: SAFE PROC [dc: Imager.Context] = { pixelsPerMeter: REAL = 0.0254 / 72.0; Imager.ScaleT[dc, pixelsPerMeter]; SVGraphics.Clip[dc, camera]; SVGraphics.SetQualityCamera[camera, quality]; -- make a high quality image SVGraphics.ColorFilmCamera[camera, TRUE]; -- in color SVRefresh.InterpressEntireScene[dc, svData]; SVGraphics.SetQualityCamera[camera, fast]; -- restore to fast mode for interactive editting }; ipName: Rope.ROPE _ NARROW[event.rest.first]; camera: Camera _ svData.camera; ToIPAux[svData, ipName, NARROW[event.first], DoMakeInterpress]; }; ToIPAux: PUBLIC PROC [svData: SVData, ipName: Rope.ROPE, actionAtom: ATOM, makeInterpress: PROC [Imager.Context]] = { ipRef: ImagerInterpress.Ref; fullName: Rope.ROPE; success: BOOL; <> startTime: BasicTime.GMT; endTime: BasicTime.GMT; totalTime: INT; [fullName, success] _ SVUtility.GetInterpressFileName[ipName, svData.editToolData.originalWorkingDirectory, svData.feedback]; IF NOT success THEN RETURN; ipRef _ ImagerInterpress.Create[fullName]; [fullName] _ FS.FileInfo[fullName]; -- append the version number Feedback.PutF[svData.feedback, begin, "%g %g . . . ", [rope[Atom.GetPName[actionAtom]]], [rope[fullName]]]; startTime _ BasicTime.Now[]; ImagerInterpress.DoPage[ipRef, makeInterpress, 1.0]; ImagerInterpress.Close[ipRef]; endTime _ BasicTime.Now[]; totalTime _ BasicTime.Period[startTime, endTime]; Feedback.PutF[svData.feedback, end, " Done in time (%r)", [integer[totalTime]]]; }; StorePoly: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; wdir: Rope.ROPE; success, confirmation: BOOL; f: IO.STREAM; picName: Rope.ROPE _ ViewerTools.GetSelectionContents[]; 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; IF SVFiles.FileExists[fullName] THEN { confirmation _ MessageWindow.Confirm["Confirm overwrite of existing pic file"]; IF confirmation THEN f _ FS.StreamOpen[fullName, $create] ELSE RETURN; } ELSE f _ FS.StreamOpen[fullName, $create]; Feedback.PutF[svData.feedback, begin, "Writing scene: %g to file: %g...", [rope[fullName]], [rope[fullName]]]; IF NOT success THEN RETURN; SVFileoutPoly.StorePolyScene[scene, f, fullName]; Feedback.Append[svData.feedback, "Done", end]; }; -- end of StorePoly <> <> <> <> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> <> <> <<>> <<[fullName, success] _ SVUtility.GetInterpressFileName[ipName, svData.currentWDir, svData.feedback];>> <> <> <> <> <> <> <> <> <> <> <> <<};>> <<>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <<};>> <> <> <> <> <> <<};>> DrawColor: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> SVWindow.RestoreScreenAndInvariants[$DrawColor, svData]; }; -- end of DrawColor DrawBlackAndWhite: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVWindow.RestoreScreenAndInvariants[$DrawBlackAndWhite, svData]; }; -- end of DrawBlackAndWhite <> <> <<}; -- end of SetFocalLength>> <> XYZPrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { ViewerTools.SetSelection[svData.textSection.xyz]; }; <> CurrentStyle: PUBLIC PROC [svData: SVData] RETURNS [style: DrawStyle] = { SELECT globalSceneStyleArray[svData.sceneStyleIndex] FROM "WireFrame" => style _ wire; "Shaded" => style _ shaded; "HiddenLine" => style _ hiddenLine; "Normals" => style _ normals; <<"RayCast" => style _ rayCast;>> ENDCASE => ERROR; }; StylePrompt: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { newStyle: DrawStyle; scene: Scene _ svData.scene; svData.sceneStyleIndex _ IF svData.sceneStyleIndex = globalSceneStyleCount THEN 1 ELSE svData.sceneStyleIndex + 1; Labels.Set[svData.textSection.viewStyle, globalSceneStyleArray[svData.sceneStyleIndex]]; SELECT globalSceneStyleArray[svData.sceneStyleIndex] FROM "WireFrame" => newStyle _ wire; "Shaded" => newStyle _ shaded; "HiddenLine" => newStyle _ hiddenLine; "Normals" => newStyle _ normals; <<"RayCast" => newStyle _ rayCast;>> ENDCASE => ERROR; svData.camera.style _ newStyle; }; <> ShowCoordsMode: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { button: Buttons.Button _ NARROW[svData.textSection.showCoords]; IF svData.showCoordSys THEN { svData.showCoordSys _ NOT svData.showCoordSys; Buttons.SetDisplayStyle[button, $BlackOnWhite]; } ELSE { svData.showCoordSys _ NOT svData.showCoordSys; Buttons.SetDisplayStyle[button, $WhiteOnBlack]; }; }; -- end of ShowCoordsMode <> Selected: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> solidViewer: Viewer _ svData.actionArea; InputFocus.SetInputFocus[solidViewer]; SVViewersOnScene.ReSelectViewer[svData]; }; Deselected: PUBLIC PROC [svData: SVData] = { <> IF svData = NIL THEN RETURN; svData.textSection.isSelected _ FALSE; Labels.SetDisplayStyle[svData.textSection.selected, $BlackOnWhite, TRUE]; }; KillSelectionsButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { SVSelections.KillSkitterAndSelections[svData.editToolData]; SVSelect.DeselectAll[svData.scene, normal]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, svData.scene]; }; DeleteJacksButton: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { scene: Scene _ svData.scene; SVScene.DeleteAllPrimitivesOfClass["jack", scene, svData.feedback]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, svData.editToolData, scene]; }; <<>> <> SingleRay: PUBLIC PROC [svData: SVData, cameraPoint: Point2d] = { color: Color; xInt, yInt: INTEGER; tree: CSGTree; scene: Scene _ svData.scene; camera: Camera _ svData.camera; class: Classification; rayWorld: Ray; f: IO.STREAM _ Feedback.GetTypescriptStream[$Solidviews]; tree _ SVSceneToTree.AssemblyToTree[scene.assembly, scene, camera]; color _ SVCastRays.SingleRay[cameraPoint, tree, scene.lightSources, camera, svData.feedback, TRUE]; f.PutF["[%g,%g]: ",[real[cameraPoint[1]]], [real[cameraPoint[2]]]]; SVParseOut.FileoutColor[f, color]; f.PutChar[IO.CR]; [class, rayWorld] _ SVCastRays.SingleRay2[[xInt, yInt], tree, camera, TRUE, NIL, FALSE]; ClassToStream[f, class]; f.PutChar[IO.CR]; SVCastRays.SortClassByPrimitive[class]; ClassToStream[f, class]; f.PutChar[IO.CR]; SVRay.ReturnRayToPool[rayWorld]; f.PutChar[IO.CR]; SVCastRays.ReturnClassToPool[class]; }; ClassToStream: PROC [f: IO.STREAM, class: Classification] = { FOR i: NAT IN [1..class.count] DO f.PutF["(%g, %g) ", IO.rope[class.primitives[i].name], IO.real[class.params[i]]]; ENDLOOP; }; <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <<>> DrawCatScan: PUBLIC PROC [svData: SVData, catScan: CatScan] = { SVWindow.RestoreScreenAndInvariants[$DrawCatScan, svData]; }; DrawSelection: PROC [dc: Imager.Context, svData: SVData, selection: Selection, selectionType: SelectionType, color: Color] = { <> <<[] _ Imager.SetPaintMode[dc, invert];>> <> <> <> }; RayCastProgress: PUBLIC SVCastRays.NotifyOfProgressProc = { <> <> svData: SVData _ NARROW[clientData]; svData.refresh.currentY _ currentY; svData.refresh.minX _ minX; svData.refresh.minY _ minY; svData.refresh.maxX _ maxX; svData.refresh.maxY _ maxY; SVWindow.RestoreScreenAndInvariants[$DrawRayCastProgress, svData]; }; HowBigWillImageBe: PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; scene: Scene _ svData.scene; camera: Camera _ svData.camera; tree: CSGTree; boundBox: BoundBox; xSamples, ySamples: NAT; boundSphere: Sphere; tree _ SVSceneToTree.AssemblyToTree[scene.assembly, scene, camera]; [boundBox, boundSphere] _ SVPreprocess3d.PreprocessForImage[tree, camera]; IF camera.frame.fullScreen AND boundBox = NIL THEN { ComplainInfiniteScene[svData.feedback]; RETURN}; [xSamples, ySamples] _ SVImage.CountSamples[boundBox.loX, boundBox.loY, boundBox.hiX, boundBox.hiY, camera.resolution]; Feedback.PutF[svData.feedback, oneLiner, "(%g lines by %g samples) is the current ray tracing size", [integer[ySamples]], [integer[xSamples]]]; }; ComplainInfiniteScene: PROC [feedback: FeedbackData] = { Feedback.Append[feedback, "Infinite Scene. Please define a bounding frame.", oneLiner]; Feedback.Blink[feedback]; }; SkitterMakes: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; [----,----,svData] _ SVSelections.GetSkitterData[editToolData]; [] _ SkitterMakesAux[svData]; SVCaret.Kill[editToolData.skitter]; }; SkitterMakesAux: PROC [svData: SVData] RETURNS [coincident: Slice] = { <> editToolData: EditToolData _ svData.editToolData; scene: Scene _ svData.scene; camera: Camera _ svData.camera; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; SELECT skitterMode FROM surface => { coincident _ SVSelections.AddHookFromSkitter[editToolData]; svData.refresh.addedObject _ coincident; SVViewersOnScene.PaintSceneAllViewers[$ObjectAdded, svData.editToolData, scene]; }; tightrope => { coincident _ SVSelections.AddFloaterFromSkitter[editToolData]; <> SVViewersOnScene.PaintSceneAllViewers[$ObjectAdded, svData.editToolData, scene]; }; coordframe => { [coincident,----,----] _ SVSelections.GetSkitterData[editToolData]; }; ENDCASE => ERROR; }; SkitterMakesSource: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; scene: Scene _ svData.scene; camera: Camera _ svData.camera; coincident: Slice; movee: Selection; coincident _ SkitterMakesAux[svData]; IF coincident = NIL THEN RETURN; <> SELECT skitterMode FROM surface => { skitterAssem: Slice; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; movee _ SVSelections.CreateHookMovee[coincident, skitterAssem, svData]; SVSelections.PushMovee[movee]; }; tightrope => { movee _ SVSelections.CreateCoordSysMovee[coincident, svData]; SVSelections.PushMovee[movee]; }; coordframe => { movee _ SVSelections.CreateCoordSysMovee[coincident, svData]; SVSelections.PushMovee[movee]; }; ENDCASE => ERROR; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; SkitterMakesTarget: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; scene: Scene _ svData.scene; camera: Camera _ svData.camera; coincident: Slice; target: Selection; coincident _ SkitterMakesAux[svData]; -- create and draw the jack IF coincident = NIL THEN RETURN; SELECT skitterMode FROM surface => { skitterAssem: Slice; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; target _ SVSelections.CreateHookTarget[coincident, skitterAssem, svData]; SVSelections.PushTarget[target]; }; tightrope => { target _ SVSelections.CreateCoordSysTarget[coincident, svData]; SVSelections.PushTarget[target]; }; coordframe => { target _ SVSelections.CreateCoordSysTarget[coincident, svData]; SVSelections.PushTarget[target]; }; ENDCASE => ERROR; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; SkitterMakesPlane: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> scene: Scene _ svData.scene; camera: Camera _ svData.camera; coincident: Slice; planeSel: Selection; coincident _ SkitterMakesAux[svData]; IF coincident = NIL THEN RETURN; <> planeSel _ SVSelections.CreatePlaneSelection[coincident, svData]; SVSelections.PushPlane[planeSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; SkitterMakesSourceIndirect: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterAssem: Slice; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; indirect: Slice; sourceSel: Selection; camera: Camera _ svData.camera; scene: Scene _ svData.scene; found: BOOL; IF skitterMode # coordframe THEN { Feedback.Append[svData.feedback, "Can only select indirect with a coordframe skitter.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; IF skitterAssem.sittingOn = NIL THEN { Feedback.Append[svData.feedback, Rope.Concat[skitterAssem.name, " is not sitting on anything."], oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; [indirect, ----, found] _ SVScene.FindAssemblyFromName[skitterAssem.sittingOn, scene]; IF NOT found THEN RETURN; sourceSel _ SVSelections.CreateHookMovee[skitterAssem, indirect, svData]; SVSelections.PushMovee[sourceSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; << >> SkitterMakesTargetIndirect: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterAssem: Slice; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; indirect: Slice; targetSel: Selection; camera: Camera _ svData.camera; scene: Scene _ svData.scene; found: BOOL; IF skitterMode # coordframe THEN { Feedback.Append[svData.feedback, "Can only select indirect with a coordframe skitter.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; IF skitterAssem.sittingOn = NIL THEN { Feedback.Append[svData.feedback, Rope.Concat[skitterAssem.name, " is not sitting on anything."], oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; [indirect, ----, found] _ SVScene.FindAssemblyFromName[skitterAssem.sittingOn, scene]; IF NOT found THEN RETURN; targetSel _ SVSelections.CreateHookTarget[skitterAssem, indirect, svData]; SVSelections.PushTarget[targetSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; << >> SkitterMakesSourceIndirectOnly: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; scene: Scene _ svData.scene; camera: Camera _ svData.camera; coincident: Slice; movee: Selection; SELECT skitterMode FROM surface => { skitterAssem: Slice; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; SVSelect.SelectEntireSlice[skitterAssem, scene, normal]; movee _ SVSelections.CreateCoordSysMovee[skitterAssem, svData]; SVSelections.PushMovee[movee]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; tightrope => { coincident _ SVSelections.AddFloaterFromSkitter[editToolData]; movee _ SVSelections.CreateCoordSysMovee[coincident, svData]; SVSelections.PushMovee[movee]; SVCaret.Kill[svData.editToolData.skitter]; svData.refresh.addedObject _ coincident; SVViewersOnScene.PaintSceneAllViewers[$ObjectAdded, svData.editToolData, scene]; }; coordframe => { [coincident,----,----] _ SVSelections.GetSkitterData[editToolData]; movee _ SVSelections.CreateCoordSysMovee[coincident, svData]; SVSelections.PushMovee[movee]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; ENDCASE => ERROR; }; << >> SkitterMakesTargetIndirectOnly: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; scene: Scene _ svData.scene; camera: Camera _ svData.camera; coincident: Slice; targetSel: Selection; SELECT skitterMode FROM surface => { skitterAssem: Slice; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; targetSel _ SVSelections.CreateCoordSysTarget[skitterAssem, svData]; SVSelections.PushTarget[targetSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; tightrope => { coincident _ SVSelections.AddFloaterFromSkitter[editToolData]; <> targetSel _ SVSelections.CreateCoordSysTarget[coincident, svData]; SVSelections.PushTarget[targetSel]; SVCaret.Kill[svData.editToolData.skitter]; svData.refresh.addedObject _ coincident; SVViewersOnScene.PaintSceneAllViewers[$ObjectAdded, svData.editToolData, scene]; }; coordframe => { [coincident,----,----] _ SVSelections.GetSkitterData[editToolData]; targetSel _ SVSelections.CreateCoordSysTarget[coincident, svData]; SVSelections.PushTarget[targetSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; ENDCASE => ERROR; }; << >> SkitterMakesPlaneIndirectOnly: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; skitterMode: SkitterMode _ SVSelections.GetModeSkitter[editToolData]; scene: Scene _ svData.scene; camera: Camera _ svData.camera; coincident: Slice; planeSel: Selection; SELECT skitterMode FROM surface => { skitterAssem: Slice; [skitterAssem,----,----] _ SVSelections.GetSkitterData[editToolData]; planeSel _ SVSelections.CreatePlaneSelection[skitterAssem, svData]; SVSelections.PushPlane[planeSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; tightrope => { coincident _ SVSelections.AddFloaterFromSkitter[editToolData]; <> planeSel _ SVSelections.CreatePlaneSelection[coincident, svData]; SVSelections.PushPlane[planeSel]; SVCaret.Kill[svData.editToolData.skitter]; svData.refresh.addedObject _ coincident; SVViewersOnScene.PaintSceneAllViewers[$ObjectAdded, svData.editToolData, scene]; }; coordframe => { [coincident,----,----] _ SVSelections.GetSkitterData[editToolData]; planeSel _ SVSelections.CreatePlaneSelection[coincident, svData]; SVSelections.PushPlane[planeSel]; SVCaret.Kill[svData.editToolData.skitter]; SVViewersOnScene.PaintSceneAllViewers[$SelectionChanged, svData.editToolData, scene]; }; ENDCASE => ERROR; }; << >> MoveToTarget: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> source: Slice; dockCS: CoordSystem; moveeSel, targetSel: Selection; relativeMat: Matrix4by4; editToolData: EditToolData _ svData.editToolData; scene: Scene _ svData.scene; moveeSel _ SVSelections.TopMovee[]; IF moveeSel = NIL THEN RETURN; targetSel _ SVSelections.TopTarget[]; IF targetSel = NIL THEN RETURN; IF moveeSel.svData # targetSel.svData THEN { Feedback.Append[svData.feedback, "Move from viewer to viewer not yet implemented.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; dockCS _ targetSel.coincident.coordSys; [----, relativeMat] _ ParentAndPosition[moveeSel, targetSel, scene]; SELECT moveeSel.referentType FROM hook => { source _ moveeSel.indirect; SVAssembly.TugTransfLeaveTug[source, scene, moveeSel.coincident.coordSys, relativeMat, dockCS]; }; coordSys => { source _ moveeSel.coincident; SVAssembly.AbsTransf[source, scene, relativeMat, dockCS]; }; ENDCASE => ERROR; SVSelections.ClearMoveeStack[editToolData]; SVSelections.ClearTargetStack[editToolData]; SVViewersOnScene.SceneNewVersion[svData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; <> }; SourceRotX: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { RotateAux[event, svData, 1]; }; SourceRotY: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { RotateAux[event, svData, 2]; }; SourceRotZ: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { RotateAux[event, svData, 3]; }; RotateAux: PROC [event: LIST OF REF ANY, svData: SVData, axis: [1..3]] = { degrees: REAL _ NARROW[event.rest.first, REF REAL]^; sourceSel: Selection; scene: Scene; editToolData: EditToolData; jack, indirect: Slice; sourceSel _ SVSelections.TopMovee[]; IF sourceSel = NIL THEN RETURN; svData _ sourceSel.svData; editToolData _ svData.editToolData; SELECT sourceSel.referentType FROM hook => { jack _ sourceSel.coincident; indirect _ sourceSel.indirect; }; coordSys => { jack _ sourceSel.coincident; indirect _ sourceSel.coincident; }; ENDCASE => ERROR; scene _ svData.scene; SVTransforms.Rotate[indirect, scene, axis, degrees, jack.coordSys, TRUE]; svData.refresh.addedObject _ indirect; SVViewersOnScene.PaintSceneAllViewers[$ObjectChangedBoundBoxProvided, editToolData, scene]; }; CopyToAllTargets: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> moveeCopy, moveeOriginal, parent, moveeParent: Slice; moveeSel: Selection; editToolData: EditToolData _ svData.editToolData; oldScene, newScene: Scene; dockCS: CoordSystem; relativeMat: Matrix4by4; targets: SelectionGenerator; targetsExist: BOOL; moveeSel _ SVSelections.TopMovee[]; IF moveeSel = NIL THEN RETURN; oldScene _ moveeSel.svData.scene; SELECT moveeSel.referentType FROM hook => moveeOriginal _ moveeSel.indirect; coordSys => moveeOriginal _ moveeSel.coincident; ENDCASE => ERROR; [----, moveeParent] _ SVScene.FindAssemblyFromName[moveeOriginal.name, oldScene]; IF moveeParent = NIL THEN moveeParent _ moveeOriginal; <> [targets, targetsExist] _ SVSelections.GetSelectionGenerator[target]; IF NOT targetsExist THEN { Feedback.Append[svData.feedback, "Please make some targets to copy to.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; FOR targetSel: Selection _ SVSelections.NextSelection[targets], SVSelections.NextSelection[targets] UNTIL targetSel = NIL DO newScene _ targetSel.svData.scene; IF newScene = oldScene THEN { parent _ moveeParent; [----, relativeMat] _ ParentAndPosition[moveeSel, targetSel, newScene]; } ELSE [parent, relativeMat] _ ParentAndPosition[moveeSel, targetSel, newScene]; dockCS _ targetSel.coincident.coordSys; moveeCopy _ SVScene.CopyAssemblyAndSonsUniqueNames[moveeOriginal, oldScene, newScene, parent, svData.feedback]; SVTransforms.Normalize[moveeCopy, newScene, moveeOriginal.coordSys]; SELECT moveeSel.referentType FROM hook => SVAssembly.TugTransfLeaveTug[moveeCopy, newScene, moveeSel.coincident.coordSys, relativeMat, dockCS]; coordSys => SVAssembly.AbsTransf[moveeCopy, newScene, relativeMat, dockCS]; ENDCASE => ERROR; ENDLOOP; SVSelections.ClearTargetStack[editToolData]; SVViewersOnScene.SceneNewVersion[svData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, newScene]; <> }; CopyRotate: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> copy, moveeOriginal, moveeParent: Slice; sourceSel, planeSel: Selection; planeAssem: Slice; sourceCS, planeCS: CoordSystem; editToolData: EditToolData; scene: Scene; numberOfCopies: NAT; numberOfCopiesReal: REAL; degrees, deltaDegrees, realI: REAL; toolData: ToolData; sourceSel _ SVSelections.PopMovee[]; IF sourceSel = NIL THEN RETURN; planeSel _ SVSelections.PopPlane[]; IF planeSel = NIL THEN RETURN; planeAssem _ planeSel.coincident; IF planeAssem.toolMasterObject = NIL OR planeAssem.toolMasterObject.mainBody = NIL THEN ERROR; toolData _ NARROW[planeAssem.toolMasterObject.mainBody]; IF sourceSel.svData # planeSel.svData THEN { Feedback.Append[svData.feedback, "Can't copy rotate between viewers.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; svData _ sourceSel.svData; scene _ svData.scene; editToolData _ svData.editToolData; sourceCS _ sourceSel.coincident.coordSys; planeCS _ planeSel.coincident.coordSys; numberOfCopies _ SVViewerTools.GetNat[svData.textSection.xyz]; numberOfCopiesReal _ numberOfCopies; SELECT sourceSel.referentType FROM hook => moveeOriginal _ sourceSel.indirect; coordSys => moveeOriginal _ sourceSel.coincident; ENDCASE => ERROR; [----, moveeParent] _ SVScene.FindAssemblyFromName[moveeOriginal.name, scene]; deltaDegrees _ 360/numberOfCopiesReal; FOR i: NAT IN [1..numberOfCopies-1] DO realI _ i; degrees _ i*deltaDegrees; copy _ SVScene.CopyAssemblyAndSonsUniqueNames[moveeOriginal, scene, scene, moveeParent, svData.feedback]; SVTransforms.Normalize[copy, scene, moveeOriginal.coordSys]; SVTransforms.Rotate[copy, scene, MIN[toolData.plane, 3], degrees, planeCS]; ENDLOOP; SVViewersOnScene.SceneNewVersion[svData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; <> }; -- end of CopyRotate <<>> CopyToAllTargetsTree: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> moveeCopy, moveeOriginal, parent, moveeParent: Slice; moveeSel: Selection; editToolData: EditToolData _ svData.editToolData; oldScene, newScene: Scene; dockCS: CoordSystem; relativeMat: Matrix4by4; targets: SelectionGenerator; targetsExist: BOOL; moveeSel _ SVSelections.TopMovee[]; IF moveeSel = NIL THEN RETURN; oldScene _ moveeSel.svData.scene; SELECT moveeSel.referentType FROM hook => moveeOriginal _ moveeSel.indirect; coordSys => moveeOriginal _ moveeSel.coincident; ENDCASE => ERROR; [----, moveeParent] _ SVScene.FindAssemblyFromName[moveeOriginal.name, oldScene]; [targets, targetsExist] _ SVSelections.GetSelectionGenerator[target]; IF NOT targetsExist THEN { Feedback.Append[svData.feedback, "Please make some targets to copy to.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; FOR targetSel: Selection _ SVSelections.NextSelection[targets], SVSelections.NextSelection[targets] UNTIL targetSel = NIL DO newScene _ targetSel.svData.scene; [parent, relativeMat] _ ParentAndPosition[moveeSel, targetSel, newScene]; dockCS _ targetSel.coincident.coordSys; moveeCopy _ SVScene.CopyAssemblyAndSonsUniqueNames[moveeOriginal, oldScene, newScene, parent, svData.feedback]; SVTransforms.Normalize[moveeCopy, newScene, moveeOriginal.coordSys]; SELECT moveeSel.referentType FROM hook => SVAssembly.TugTransfLeaveTug[moveeCopy, newScene, moveeSel.coincident.coordSys, relativeMat, dockCS]; coordSys => SVAssembly.AbsTransf[moveeCopy, newScene, relativeMat, dockCS]; ENDCASE => ERROR; ENDLOOP; SVSelections.ClearTargetStack[editToolData]; SVViewersOnScene.SceneNewVersion[svData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, newScene]; <> }; <<>> ParentAndPosition: PRIVATE PROC [moveeSel, targetSel: Selection, newScene: Scene] RETURNS [parent: Slice, relativeMat: Matrix4by4] = { target: Slice; SELECT targetSel.referentType FROM hook => { [target, parent] _ SVScene.FindAssemblyFromName[targetSel.indirect.name, newScene]; IF target # targetSel.indirect THEN ERROR; SELECT moveeSel.referentType FROM hook => relativeMat _ SVMatrix3d.MakeRotateYMat[180]; -- mushroom placement coordSys => relativeMat _ SVMatrix3d.Identity[]; -- antenae placement ENDCASE => ERROR; }; coordSys => { [target, parent] _ SVScene.FindAssemblyFromName[targetSel.coincident.name, newScene]; IF Rope.Equal[targetSel.coincident.name, "sceneAssembly", TRUE] THEN parent _ targetSel.coincident; IF target # targetSel.coincident THEN ERROR; SELECT moveeSel.referentType FROM hook => relativeMat _ SVMatrix3d.Identity[]; -- will think about this some more. coordSys => relativeMat _ SVMatrix3d.Identity[]; ENDCASE => ERROR; }; ENDCASE => ERROR; }; RandomAngle: PRIVATE PROC [] RETURNS [degrees: REAL] = { <> randomNat: NAT _ Random.ChooseInt[NIL, 0, 9999]; degrees _ (randomNat/10000.0)*360.0; }; RandomScalar: PRIVATE PROC [min, max: REAL] RETURNS [scalar: REAL] = { <> randomNat: NAT _ Random.ChooseInt[NIL, 0, 9999]; scalar _ (randomNat/10000.0)*(max-min)+min; }; CopyRandomToAllTargets: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> moveeCopy, moveeOriginal, parent, moveeParent: Slice; moveeSel: Selection; editToolData: EditToolData _ svData.editToolData; oldScene, newScene: Scene; dockCS: CoordSystem; relativeMat: Matrix4by4; targets: SelectionGenerator; targetsExist: BOOL; min, max, randomScalar, randomDegrees: REAL; moveeSel _ SVSelections.TopMovee[]; IF moveeSel = NIL THEN RETURN; oldScene _ moveeSel.svData.scene; [min, max, ----] _ SVViewerTools.GetThreeReals[editToolData.transformSection.scaleXYZ]; SELECT moveeSel.referentType FROM hook => moveeOriginal _ moveeSel.indirect; coordSys => moveeOriginal _ moveeSel.coincident; ENDCASE => ERROR; [----, moveeParent] _ SVScene.FindAssemblyFromName[moveeOriginal.name, oldScene]; [targets, targetsExist] _ SVSelections.GetSelectionGenerator[target]; IF NOT targetsExist THEN { Feedback.Append[svData.feedback, "Please make some targets to copy to.", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; FOR targetSel: Selection _ SVSelections.NextSelection[targets], SVSelections.NextSelection[targets] UNTIL targetSel = NIL DO newScene _ targetSel.svData.scene; IF newScene = oldScene THEN { parent _ moveeParent; [----, relativeMat] _ ParentAndPosition[moveeSel, targetSel, newScene]; } ELSE [parent, relativeMat] _ ParentAndPosition[moveeSel, targetSel, newScene]; dockCS _ targetSel.coincident.coordSys; moveeCopy _ SVScene.CopyAssemblyAndSonsUniqueNames[moveeOriginal, oldScene, newScene, parent, svData.feedback]; SELECT moveeSel.referentType FROM hook => SVAssembly.TugTransfLeaveTug[moveeCopy, newScene, moveeSel.coincident.coordSys, relativeMat, dockCS]; coordSys => SVAssembly.AbsTransf[moveeCopy, newScene, relativeMat, dockCS]; ENDCASE => ERROR; randomDegrees _ RandomAngle[]; randomScalar _ RandomScalar[min, max]; SVTransforms.Rotate[moveeCopy, newScene, 3, randomDegrees, dockCS]; SVTransforms.ScaleEven[moveeCopy, newScene, randomScalar, dockCS]; ENDLOOP; SVSelections.ClearTargetStack[editToolData]; SVViewersOnScene.SceneNewVersion[svData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, newScene]; <> }; ExtendCurrent: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData _ svData.editToolData; scene: Scene _ svData.scene; assembly, parent: Slice; prim: Primitive; assemblyName: Rope.ROPE; success: BOOL; skitter: Skitter _ editToolData.skitter; [assembly, prim, svData] _ SVSelections.GetSkitterData[editToolData]; IF assembly = NIL THEN RETURN; assemblyName _ assembly.name; [assembly, parent, success] _ SVScene.FindAssemblyFromName[assemblyName, scene]; IF NOT success THEN { Feedback.Append[svData.feedback, Rope.Cat["ExtendCurrent: assembly ", assemblyName, " not found."], oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; SVCaret.SetAssemblyAndPrimitive[skitter, parent, prim]; }; ParentOfSkitter: PROC [] = { <> svData: SVData; editToolData: EditToolData _ svData.editToolData; scene: Scene _ svData.scene; assembly, realAssembly, parent: Slice; prim: Primitive; skitter: Skitter _ editToolData.skitter; [realAssembly, prim, svData] _ SVSelections.GetSkitterData[editToolData]; IF realAssembly = NIL THEN RETURN; [assembly, parent] _ SVScene.FindAssemblyFromName[realAssembly.name, scene]; IF assembly # realAssembly THEN ERROR; IF parent#NIL THEN SVCaret.SetAssemblyAndPrimitive[skitter, parent, prim]; }; SetTool: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData; planeAssem: Slice; planeSel: Selection; scene: Scene; planeSel _ SVSelections.TopPlane[]; IF planeSel = NIL THEN { Feedback.Append[svData.feedback, "SetTool: Make a plane selection first", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; planeAssem _ planeSel.coincident; svData _ planeSel.svData; scene _ svData.scene; editToolData _ NARROW[svData.editToolData]; planeAssem.showAs _ tool; SVScene.AddOrResizeToolToAssembly[planeAssem, scene]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; }; -- end of SetTool ResetTool: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData; planeAssem: Slice; planeSel: Selection; scene: Scene; planeSel _ SVSelections.TopPlane[]; IF planeSel = NIL THEN { Feedback.Append[svData.feedback, "ResetTool: Make a plane selection first", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; planeAssem _ planeSel.coincident; svData _ planeSel.svData; scene _ svData.scene; editToolData _ NARROW[svData.editToolData]; planeAssem.showAs _ normal; SVViewersOnScene.SceneNewVersion[svData]; SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; }; CycleTool: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { <> editToolData: EditToolData; planeAssem: Slice; planeSel: Selection; scene: Scene; camera: Camera; toolData: ToolData; planeSel _ SVSelections.TopPlane[]; IF planeSel = NIL THEN { Feedback.Append[svData.feedback, "CycleTool: Make a plane selection first", oneLiner]; Feedback.Blink[svData.feedback]; RETURN; }; planeAssem _ planeSel.coincident; svData _ planeSel.svData; camera _ svData.camera; scene _ svData.scene; editToolData _ NARROW[svData.editToolData]; IF planeAssem.toolMasterObject = NIL OR planeAssem.toolMasterObject.mainBody = NIL THEN SVScene.AddOrResizeToolToAssembly[planeAssem, scene]; toolData _ NARROW[planeAssem.toolMasterObject.mainBody]; toolData.plane _ IF toolData.plane = 3 THEN 1 ELSE toolData.plane + 1; <> SELECT toolData.plane FROM 1 => Feedback.Append[svData.feedback, Rope.Cat["x = 0 plane of ", planeAssem.name, " now selected."], oneLiner]; 2 => Feedback.Append[svData.feedback, Rope.Cat["y = 0 plane of ", planeAssem.name, " now selected."], oneLiner]; 3 => Feedback.Append[svData.feedback, Rope.Cat["z = 0 plane of ", planeAssem.name, " now selected."], oneLiner]; <<4 => Feedback.Append[svData.feedback, Rope.Cat["All planes of ", planeAssem.name, " now selected."], oneLiner];>> ENDCASE => ERROR; IF planeAssem.showAs = tool OR planeAssem.showAs = both THEN SVViewersOnScene.PaintSceneAllViewers[$PaintEntireScene, editToolData, scene]; }; DropPerpendicular: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { editToolData: EditToolData _ svData.editToolData; sourceSel, planeSel: Selection; toolData: ToolData; planeAssem: Slice; scene: Scene; camera: Camera; skitter: Skitter _ editToolData.skitter; selectionMat, sourcePlane: Matrix4by4; interceptPlane, originPlane: Point3d; sourceSel _ SVSelections.TopMovee[]; IF sourceSel = NIL THEN RETURN; planeSel _ SVSelections.TopPlane[]; IF planeSel = NIL THEN RETURN; planeAssem _ planeSel.coincident; svData _ planeSel.svData; camera _ svData.camera; scene _ svData.scene; IF planeAssem.toolMasterObject = NIL OR planeAssem.toolMasterObject.mainBody = NIL THEN SVScene.AddOrResizeToolToAssembly[planeAssem, scene]; toolData _ NARROW[planeAssem.toolMasterObject.mainBody]; sourcePlane _ SVCoordSys.FindAInTermsOfB[sourceSel.coincident.coordSys, planeSel.coincident.coordSys]; originPlane _ SVMatrix3d.OriginOfMatrix[sourcePlane]; interceptPlane _ originPlane; SELECT toolData.plane FROM 1 => interceptPlane[1] _ 0.0; 2 => interceptPlane[2] _ 0.0; 3 => interceptPlane[3] _ 0.0; <<4 => Who knows.>> ENDCASE => ERROR; selectionMat _ SVCoordSys.WRTWorld[planeSel.coincident.coordSys]; selectionMat _ SVMatrix3d.LocalTranslate[selectionMat, interceptPlane[1], interceptPlane[2], interceptPlane[3]]; SVCaret.SetAssemblyAndPrimitive[skitter, NIL, NIL]; SVCaret.PositionFromMatrix[svData.editToolData.skitter, [0,0], selectionMat]; SVSelections.SetModeSkitter[svData, tightrope]; SkitterMakes[event, svData]; -- sceneAssembly will be the parent of the new jack. }; Delete: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { scene: Scene _ svData.scene; SVEditUser.Delete[event, svData]; }; SetBoundingSpheres: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { camera: Camera _ svData.camera; camera.useBoundBoxes _ FALSE; }; SetSphereShadows: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { camera: Camera _ svData.camera; camera.useBoundSpheresForShadows _ TRUE; }; ResetSpheres: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { camera: Camera _ svData.camera; camera.useBoundBoxes _ TRUE; camera.useBoundSpheresForShadows _ FALSE; }; END.