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 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 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; 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; 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] = { }; 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]; 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; 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. $†File: SVEventImplB.mesa Author: Eric Bier in October 1982 Copyright c 1984 by Xerox Corporation. All rights reserved. Last edited by Bier on September 24, 1987 1:39:38 pm PDT Contents: Code to respond to button presses made in an SVViewer Bloomenthal, June 16, 1987 7:56:05 pm PDT GLOBAL VARIABLES Timing Varables ToIPLit: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { DoMakeInterpress: PROC [dc: Imager.Context] = { switched: BOOL _ FALSE; tempQuality _ svData.camera.quality; svData.camera.quality _ showall; tempStyle _ svData.camera.displayStyle; svData.camera.displayStyle _ print; IF NOT SVState.GetShowColors[svData] THEN { SVEvent.ToggleShowColors[svData, NIL]; switched _ TRUE; }; Feedback.Append[svData.feedback, startRope, begin]; Imager.ScaleT[dc, metersPerPixel]; SVRefresh.InterpressEntireScene[dc, svData]; svData.camera.quality _ tempQuality; svData.camera.displayStyle _ tempStyle; IF switched THEN SVEvent.ToggleShowColors[svData, NIL]; }; ipRef: ImagerInterpress.Ref; fullName: Rope.ROPE; success: BOOL; TIMING VARIABLES startTime: BasicTime.GMT; endTime: BasicTime.GMT; totalTime: INT; startRope, endRope: Rope.ROPE; tempQuality: SVModelTypes.QualityMode; tempStyle: SVModelTypes.DisplayStyle; ipName: Rope.ROPE _ "litshot.ip"; [fullName, success] _ SVUtility.GetInterpressFileName[ipName, svData.currentWDir, svData.feedback]; IF NOT success THEN RETURN; ipRef _ ImagerInterpress.Create[fullName]; startRope _ IO.PutFR["Writing to IP file: %g . . . ", [rope[fullName]]]; START TIMING startTime _ BasicTime.Now[]; ImagerInterpress.DoPage[ipRef, DoMakeInterpress, 1.0]; ImagerInterpress.Close[ipRef]; endTime _ BasicTime.Now[]; totalTime _ BasicTime.Period[startTime, endTime]; endRope _ IO.PutFR[" Done in time (%r)", [integer[totalTime]]]; Feedback.Append[svData.feedback, Rope.Concat[startRope, endRope], oneLiner]; }; Move: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { newMat: Matrix4by4; target, movee: Selection; target _ SVEditUser.GetTargetSelection[]; movee _ SVEditUser.GetMoveeSelection[]; IF target = NIL THEN ERROR; IF target.assembly = NIL THEN RETURN; IF movee = NIL THEN ERROR; IF movee.assembly = NIL THEN RETURN; If the two selections are in different viewers, then see if these viewers refer to different scenes. If so do a scene to scene copy before doing any aligning and abutting. IF target.svData # movee.svData THEN { targetPicture: ViewerPictureData _ NARROW[target.svData.viewerPicture.data]; moveePicture: ViewerPictureData _ NARROW[movee.svData.viewerPicture.data]; IF targetPicture.scene # moveePicture.scene THEN { copyAssembly: Slice _ SVScene.MergeAssemblyIntoScene[movee.assembly, moveePicture.scene, targetPicture.scene.assembly, targetPicture.scene]; The new assembly has the same relationship to scene assembly as the last assembly had to its parent. This will do for now. SVEvent.SceneNewVersion[target.svData]; SVEvent.DrawSceneInternal[NIL, target.svData, red, FALSE, FALSE]; SVEvent.DrawSceneInternal[NIL, movee.svData, red, FALSE, FALSE]; RETURN; }; }; newMat _ SVMatrix3d.MakeRotateYMat[180]; SVTransforms.TugTransf[movee.assembly.coordSys, movee.coordSys, target.coordSys, newMat]; Rotate them so they are tangent in an exterior fashion. SVEvent.SceneNewVersion[target.svData]; SVEvent.DrawSceneInternal[NIL, target.svData, red, FALSE, FALSE]; }; parent is the DrawColor button SetFocalLength: PUBLIC PROC [event: LIST OF REF ANY, svData: SVData] = { svData.camera.focalLength _ SVViewerTools.GetReal[svData.textSection.focalLength, 1800]; }; -- end of SetFocalLength PROMPTS PROMPTS WHICH CYCLE THROUGH POSSIBILITIES "RayCast" => style _ rayCast; "RayCast" => newStyle _ rayCast; ON/OFF SWITCHES UTILITIES This window has been selected. Show its Selected button as WhiteOnBlack. This window has been deselected. Show its Selected button as BlackOnWhite. Input Notify Procs PointAt: PUBLIC PROC [svData: SVData, cameraPoint: Point2d] = { Adds a new assembly to the scene of class "SVCoordSys", isTool is true. The first one will be pointer.0, the second pointer.1 and so on. Pointer will be defined with respect to the parent of the assembly which we are pointing at. If we are not pointing at anything, don't create a pointer. Just return. f: IO.STREAM _ Feedback.GetErrorStream[]; tree: CSGTree; normal: Vector3d; prim: Primitive; scene: Scene _ svData.scene; camera: Camera _ svData.camera; class: Classification; tree _ SVSceneToTree.AssemblyToTree[scene.assembly, scene, camera]; class _ SVCastRays.SingleRay2[cameraPoint, tree, camera, TRUE, TRUE, f]; IF class.count = 0 THEN RETURN; prim _ class.primitives[1]; normal _ class.normals[1]; }; SVTransforms.TellAboutParent[selection.coordSys]; [] _ Imager.SetPaintMode[dc, invert]; Imager.SetColor[dc, color]; IF selectionType = movee THEN SVEvent.DrawOneCS[dc, svData, selection.coordSys] ELSE SVEvent.DrawOneTargetCS[dc, svData, selection.coordSys]; PROC [currentY, minX, minY, maxX, maxY: REAL, clientData: REF ANY]; Draw a box of width 10 and length currentY-minY+1 with origin at (minX, minY) Depending on the mode of the skitter, we either create a hook, a floater, or nothing. SVEvent.ComplementAssembly[svData, coincident]; -- Draw the floater First do a SkitterMakes. Take the coordinate system of the resulting assembly and select it as a movee. This requires creating a new selection object, pointing it at the selected object, and adding the selection to the appropriate list. Will draw the new Jack (if any) into the given viewer. First do a SkitterMakes. Take the coordinate system of the resulting assembly and select it as a target. This requires creating a new selection object, pointing it at the selected object, and adding the selection to the appropriate list. The current skitter assembly should now become a plane selection. Plane selections draw themselves as a square aligned with the plane of the selected object. Will draw the new Jack (if any) into the given viewer. Like SkitterMakesSource, except that we expect the skitter mode to be "coordframe", and we don't make any Jacks. Instead, we look to see if the skitterAssembly is sitting on another assembly. If so, we create a hook movee selection. If any of these conditions fail, complain and do nothing. Like SkitterMakesTarget, except that we expect the skitter mode to be "coordframe", and we don't make any Jacks. Instead, we look to see if the skitterAssembly is sitting on another assembly. If so, we create a hook target selection. If any of these conditions fail, complain and do nothing. Like SkitterMakesSource, except that we don't make any Jacks. Instead, we make a source selection on the skitterAssembly. Like SkitterMakesTarget, except that we don't make any Jacks for surface skitters. Instead, we make a target selection on the skitterAssembly. SVEvent.ComplementAssembly[svData, coincident]; -- Draw the floater Like SkitterMakesPlane, except that we don't make any Jacks for surface skitters. Instead, we make a plane selection on the skitterAssembly. SVEvent.ComplementAssembly[svData, coincident]; -- Draw the floater Move the distinguished source to the distinguished target. There may be more than one new scene, but for now we'll just repaint the last one. Take the distinguished movee object. Make a copy at the exact same place for each target. Perform a TugRotX[180], etc. to make movee-copy tangent to target-referee at target. Each copy becomes attached to the parent of the target object. If moveeOriginal is the sceneAssembly, then use the sceneAssembly as the new parent as well. There may be more than one new scene, but for now we'll just repaint the last one. Copy the distinguished source to a set of positions in a circle whose center is the origin of the distinguished target and whose cicumference includes the origin of the source. There may be more than one new scene, but for now we'll just repaint the last one. Just like CopyToAllTargets except that we always use the parent of the target as the parent of each copy (good for making tree structures). There may be more than one new scene, but for now we'll just repaint the last one. Returns an angle evenly distributed in [0..360). Returns a scalar evenly distributed in [min..max). Just like CopyToAllTargets except that a random rotation and scaling is applied to each copy with respect to the dock coordsys. There may be more than one new scene, but for now we'll just repaint the last one. Find parent of skitter.assembly if any. Set skitter.assembly to this value. Indicate the selection by changing the name in the "Current:" slot of the edittool. Find parent of skitter.assembly if any. Set skitter.assembly to this value. Indicate the selection by changing the name in the "Current:" slot of the edittool. The current movee selection assembly is now a tool. It will appear as a simple rectangle and ray traces as a simple rectangle. The current movee selection assembly is now a non-tool. It will once again appear as its regular shape. Cycle through the 3 planes of the tool. Change the appearance of the plane selection and output a description of the current plane, as feedback. Indicate the currently selected plane in the message window. 4 => Feedback.Append[svData.feedback, Rope.Cat["All planes of ", planeAssem.name, " now selected."], oneLiner]; 4 => Who knows. Κ)Ι˜Iheadšœ™Jšœ!™!Jšœ Οmœ1™šŸœžœžœ˜4Mšœžœ˜%Mšœ"˜"Jšœ˜Jšœ.Οc˜JJšœ#žœ  ˜5Jšœ,˜,Jšœ+ 0˜[M˜—Lšœ žœžœ˜-Jšœ˜Lšœžœ!˜?L˜L˜—š Ÿœžœžœžœžœžœ˜uJšœ˜Lšœžœ˜Lšœ žœ˜JšΟb™Jšœ˜Jšœ˜Jšœ žœ˜J˜Lšœ}˜}Lšžœžœ žœžœ˜Jšœ*˜*Lšœ žœ ˜@J˜Jšœk˜kJš‘˜Jšœ4˜4Jšœ˜Jš‘˜Jšœ1˜1JšœP˜PJšœ˜—šŸ œžœžœ žœžœžœžœ˜CJšœžœ˜9Jšœ žœ˜Jšœžœ˜Jšœžœžœ˜ Jšœžœ&˜8Jšœžœ˜Jšœ˜J˜Jšžœžœžœ˜(Jšœ-˜-Jšœ žœ˜šœžœ˜*šœžœ žœžœ˜*Jšœ žœ˜Jšžœ˜ J˜—Jšœ˜—Jšžœžœ žœžœ˜šžœžœ˜&MšœO˜Ošžœžœ˜Mšœžœ˜$—Mšžœžœ˜ Mšœ˜—Mšžœžœ˜*Mšœn˜nJšžœžœ žœžœ˜Jšœ1˜1Mšœ.˜.Jšœ ˜J˜—J˜šΠbnœžœžœ žœžœžœžœ™AšŸœžœ™/Lšœ žœžœ™Lšœ$™$Lšœ ™ Lšœ'™'Lšœ#™#šžœžœžœ™+Lšœ!žœ™&Lšœ žœ™L™—Lšœ3™3L™"Lšœ,™,Lšœ$™$Lšœ'™'Lšžœ žœ"žœ™7L™—Lšœ™Lšœžœ™Lšœ žœ™Lšžœž ™Lšœžœ™Lšœžœ™Lšœ žœ™Lšœžœ™Lšœ&™&Lšœ%™%Lšœ žœ™!L™Lšœc™cLšžœžœ žœžœ™Lšœ*™*Lšœ žœ:™HLšžœž™ Lš‘™Lšœ6™6Lšœ™Lš‘™Lšœ1™1Lšœ žœ3™?LšœL™LL™L™—šŸœžœžœ žœžœžœžœ™>Jšœ™Jšœ™Jšœ)™)Jšœ'™'Jšžœ žœžœžœ™Jšžœžœžœžœ™%Jšžœ žœžœžœ™Jšžœžœžœžœ™$Jšœ¬™¬šžœžœ™&Jšœ"žœ#™LJšœ!žœ"™Jšžœ*žœ™2JšœŒ™ŒJšœ{™{Jšœ'™'Jšœžœžœžœ™AJšœžœžœžœ™@Jšžœ™Jšœ™—Jšœ™—Jšœ(™(JšœY™YJšœ7™7Jšœ'™'Jšœžœžœžœ™AJšœ™—J˜J˜šŸ œžœžœ žœžœžœžœ˜CJšœ™Jšœ8˜8Jšœ ˜J˜—šŸœžœžœ žœžœžœžœ˜KJšœ@˜@Jšœ ˜J˜—šŸœžœžœ žœžœžœžœ™HJšœX™XJšœ™—Jšœ˜Jšœ™J˜šŸ œžœžœ žœžœžœžœ˜CJšœ1˜1Jšœ˜—J˜Jšœ)™)J˜šŸ œžœžœžœ˜Išžœ/ž˜9Jšœ˜Jšœ˜Jšœ#˜#Jšœ˜Jšœ™Jšžœžœ˜J˜—J˜—šŸ œžœžœ žœžœžœžœ˜EJšœ˜Jšœ˜Jšœžœ0žœžœ˜rJšœX˜Xšžœ/ž˜9Jšœ˜Jšœ˜Jšœ&˜&Jšœ ˜ Jšœ ™ Jšžœžœ˜—Jšœ˜Jšœ˜—J˜Jšœ™J˜šŸœžœžœ žœžœžœžœ˜HJšœžœ ˜?šžœžœ˜Jšœžœ˜.Jšœ/˜/Jšœ˜—šžœ˜Jšœžœ˜.Jšœ/˜/Jšœ˜—Jšœ˜—J˜J˜Jšœ ™ J˜šŸœžœžœ žœžœžœžœ˜BJšœI™IJšœ(˜(Jšœ&˜&Jšœ(˜(Jšœ˜—šŸ œžœžœ˜,JšœK™KJšžœ žœžœžœ˜Jšœ žœ˜&JšœCžœ˜IJšœ˜J˜—šŸœžœžœ žœžœžœžœ˜NMšœ;˜;Mšœ+˜+Mšœ\˜\M˜—J˜šŸœžœžœ žœžœžœžœ˜KMšœ˜MšœC˜CMšœU˜UM˜—J™Jšœ™J˜šŸ œžœžœ+˜AJšœ ˜ Jšœ žœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜JšœΟuœ˜Jšœžœžœ-˜9Jšœ‘œ ˜CJšœ]žœ˜cJšœC˜CJšœ"˜"Jšœ žœžœ˜JšœFžœžœžœ˜XJšœ˜Jšœ žœžœ˜Jšœ'˜'Jšœ˜Jšœ žœžœ˜Jšœ£œ˜ Jšœ žœžœ˜Jšœ Ÿœ˜$Jšœ˜J˜—šŸ œžœžœžœ˜=šžœžœžœž˜!Jšœžœ!žœ˜QJšžœ˜—J˜J˜—šŸœžœžœ+™?Jšœ²™²Jšœžœžœ™)Jšœ™Jšœ™Jšœ™Jšœ™Jšœ™Jšœ™JšœC™CJšœ9ž œ™HJšžœžœžœ™Jšœ™Jšœ™Jšœ™J™—šŸ œžœžœ'˜?Mšœ:˜:M˜Mšœ˜—šŸ œžœk˜~Jšœ1™1Jšœ%™%Jšœ™Jšžœžœ2™OJšžœ9™=Jšœ˜—M˜šŸœžœ$˜;JšœC™CJšœM™MJšœžœ ˜$Jšœ#˜#Jšœ˜Jšœ˜Jšœ˜Jšœ˜JšœB˜BJšœ˜—J˜š Ÿœžœ žœžœžœžœ˜DJšœžœ˜9Jšœ˜Jšœ˜Jšœ˜J˜Mšœ˜Mšœžœ˜M˜M˜Jšœ‘œ ˜CMšœJ˜Jšžœžœ žœžœ˜4Mšœ(žœ˜0—Mšœw˜wšœd˜dMšœ*˜*—M˜M˜—šŸœžœ˜8MšœX˜XMšœ˜M˜M˜J˜J˜—J˜š Ÿ œž œ žœžœžœžœ˜FJšœ1˜1Jšœ"Ÿœ˜?Jšœ˜Jšœ#˜#J˜J˜—šŸœžœžœ˜FJ™UJšœ1˜1Jšœ˜Jšœ˜JšœE˜EJšžœ ž˜šœ ˜ Jšœ;˜;Jšœ(˜(JšœP˜PJ˜—šœ˜Jšœ>˜>JšœC™CJšœP˜PJ˜—šœ˜Jšœ  œ œ.˜CJ˜—Jšžœžœ˜J˜J˜—J˜š Ÿœž œ žœžœžœžœ˜LJšœξ™ξJšœ1˜1JšœE˜EJšœ˜Jšœ˜Jšœ˜J˜Jšœ%˜%šžœžœžœžœ˜ J™6—Jšžœ ž˜šœ ˜ J˜Jšœ œ œ.˜EJšœG˜GJšœ˜J˜—šœ˜Jšœ=˜=Jšœ˜J˜—šœ˜Jšœ=˜=Jšœ˜Jšœ˜—Jšžœžœ˜Jšœ*˜*JšœU˜UJ˜J˜—š Ÿœž œ žœžœžœžœ˜LJšœο™οJšœ1˜1JšœE˜EJšœ˜Jšœ˜Jšœ˜J˜J˜Jšœ ‘œ%˜AJšžœžœžœžœ˜ Jšžœ ž˜šœ ˜ J˜Jšœ œ œ.˜EJšœI˜IJšœ ˜ J˜—šœ˜Jšœ?˜?Jšœ ˜ J˜—šœ˜Jšœ?˜?Jšœ ˜ Jšœ˜—Jšžœžœ˜Jšœ*˜*JšœU˜UJ˜J˜—š Ÿœž œ žœžœžœžœ˜KJ™žJšœ˜Jšœ˜Jšœ˜J˜J˜Jšœ%˜%šžœžœžœžœ˜ J™6—JšœA˜AJšœ!˜!Jšœ*˜*JšœU˜UJ˜—J˜š Ÿœž œ žœžœžœžœ˜TJšœ₯™₯Jšœ1˜1J˜JšœE˜EJ˜J˜Jšœ˜Jšœ˜Jšœžœ˜ J˜šžœžœ˜"Jšœb˜bJšœ ˜ Jšžœ˜J˜—Jšœ œ œ.˜Ešžœžœžœ˜&Jšœk˜kJšœ ˜ Jšžœ˜J˜—Jšœ  œG˜VJšžœžœžœžœ˜JšœI˜IJšœ"˜"Jšœ*˜*JšœU˜UJ˜Jšœ™—š Ÿœž œ žœžœžœžœ˜TJšœ¦™¦Jšœ1˜1J˜JšœE˜EJ˜J˜Jšœ˜Jšœ˜Jšœžœ˜ J˜šžœžœ˜"Jšœb˜bJšœ ˜ Jšžœ˜J˜—Jšœ œ œ.˜Ešžœžœžœ˜&Jšœk˜kJšœ ˜ Jšžœ˜J˜—Jšœ  œG˜VJšžœžœžœžœ˜JšœJ˜JJšœ#˜#Jšœ*˜*JšœU˜UJ˜Jšœ™—š Ÿœž œ žœžœžœžœ˜XJšœz™zJšœ1˜1JšœE˜EJšœ˜Jšœ˜Jšœ˜J˜J˜Jšžœ ž˜šœ ˜ J˜Jšœ œ œ.˜EJš‘8˜8Jšœ‘œ˜?Jšœ˜Jšœ*˜*JšœU˜UJ˜—šœ˜Jšœ>˜>Jšœ=˜=Jšœ˜Jšœ*˜*Jšœ(˜(JšœP˜PJ˜—šœ˜Jšœ  œ œ.˜CJšœ=˜=Jšœ˜Jšœ*˜*JšœU˜UJšœ˜—Jšžœžœ˜J˜Jšœ™—š Ÿœž œ žœžœžœžœ˜XJšœ™Jšœ1˜1JšœE˜EJšœ˜Jšœ˜Jšœ˜J˜J˜Jšžœ ž˜šœ ˜ J˜Jšœ œ œ.˜EJšœ‘œ˜DJšœ#˜#Jšœ*˜*JšœU˜UJ˜—šœ˜Jšœ>˜>Jšœ0 ™CJšœB˜BJšœ#˜#Jšœ*˜*Jšœ(˜(JšœP˜PJ˜—šœ˜Jšœ  œ œ.˜CJšœB˜BJšœ#˜#Jšœ*˜*JšœU˜UJšœ˜—Jšžœžœ˜J˜Jšœ™—š Ÿœž œ žœžœžœžœ˜WJšœ™Jšœ1˜1JšœE˜EJšœ˜Jšœ˜Jšœ˜J˜J˜Jšžœ ž˜šœ ˜ J˜Jšœ œ œ.˜EJšœŸœ˜CJšœ!˜!Jšœ*˜*JšœU˜UJ˜—šœ˜Jšœ>˜>Jšœ0 ™CJšœŸœ˜AJšœ!˜!Jšœ*˜*Jšœ(˜(JšœP˜PJ˜—šœ˜Jšœ  œ œ.˜CJšœŸœ˜AJšœ!˜!Jšœ*˜*JšœU˜UJšœ˜—Jšžœžœ˜J˜Jšœ™—š Ÿ œž œ žœžœžœžœ˜FJ™:Jšœ˜J˜J˜J˜Jšœ1˜1Jšœ˜J˜J˜#Jšžœ žœžœžœ˜J˜%Jšžœ žœžœžœ˜šžœ$žœ˜,Jšœ^˜^Jšœ ˜ Jšžœ˜J˜—J˜Jš‘œ!˜'Jšœ‘ œ2˜DJ˜šžœž˜!šœ ˜ Jšœ˜Jšœ ‘œC˜_J˜—šœ ˜ Jšœ˜Jšœ ‘ œ%˜9J˜—Jšžœžœ˜—Jšœ+˜+Jšœ,˜,Jšœ)˜)šœN˜NJ™R—Jšœ˜—J˜š Ÿ œž œ žœžœžœžœ˜DMšœ˜M˜—š Ÿ œž œ žœžœžœžœ˜DMšœ˜M˜—š Ÿ œž œ žœžœžœžœ˜DMšœ˜M˜M˜—š Ÿ œžœ žœžœžœžœ#˜JJš œ žœžœžœžœ˜4Jšœ˜J˜ Jšœ˜J˜Jšœ$˜$Jšžœ žœžœžœ˜Jšœ˜Jšœ#˜#Jšžœž˜"šœ ˜ Jšœ˜Jšœ˜J˜—šœ ˜ Jšœ˜Jšœ ˜ J˜—Jšžœžœ˜J˜JšœCžœ˜IMšœ&˜&Mšœ[˜[M˜J˜—š Ÿœž œ žœžœžœžœ˜JJ™πJšœ5˜5J˜Jšœ1˜1Jšœ˜J˜J˜J˜Jšœžœ˜J˜Jš‘œ˜#Jšžœ žœžœžœ˜Jšœ!˜!J˜šžœž˜!Jšœ‘ œ˜*Jšœ ‘ œ˜0Jšžœžœ˜J˜—Jšœ‘ œ?˜Qšžœžœžœ˜6Jšœ\™\—J˜JšœE˜Ešžœžœžœ˜JšœS˜SJšœ ˜ Jšžœ˜J˜—šžœažœ žœž˜|Jšœ"˜"J˜šžœžœ˜Jš‘œ˜Jšœ œ‘ œ5˜GJ˜—šžœ‘œ‘ œ5˜NJ˜—Jš‘œ!˜'J˜Jšœo˜oJ˜Jšœ ‘ œ.˜DJšžœž˜!Jšœ‘œI˜mJšœ‘ œ+˜KJšžœžœ˜—Jšžœ˜Jšœ,˜,Jšœ)˜)šœQ˜QJ™R—J˜J˜—š Ÿ œž œ žœžœžœžœ˜DJ™°Jšœ(˜(Jšœ˜J˜J˜Jšœ˜Jšœ ˜ Jšœžœ˜Jšœžœ˜Jšœžœ˜#J˜J˜Jš‘ œ˜$Jšžœ žœžœžœ˜Jš‘œ˜#Jšžœ žœžœžœ˜Jšœ!˜!Jš žœžœžœ(žœžœžœ˜^Jšœ žœ'˜8šžœ‘ œžœ˜,JšœQ˜QJšœ ˜ Jšžœ˜J˜—Jšœ˜Jšœ˜Jšœ#˜#J˜Jšœ)˜)Jšœ'˜'J˜Jšœ>˜>Jšœ$˜$J˜šžœž˜"Jšœ‘ œ˜+Jšœ ‘ œ˜1Jšžœžœ˜J˜—Jšœ œ‘ œ<˜NJ˜Jšœ&˜&J˜šžœžœžœž˜&J˜J˜ Jšœ˜J˜Jšœi˜iJ˜Jšœ ‘ œ&˜