1package require vtk 2package require vtkinteraction 3 4# prevent the tk window from showing up then start the event loop 5wm withdraw . 6 7vtkRenderWindow renWin 8 9# create a rendering window and renderer 10vtkRenderer ren1 11 renWin AddRenderer ren1 12 renWin SetSize 400 400 13 14 15vtkSpherePuzzle puzzle 16vtkPolyDataMapper mapper 17 mapper SetInputConnection [puzzle GetOutputPort] 18vtkActor actor 19 actor SetMapper mapper 20 21vtkSpherePuzzleArrows arrows 22vtkPolyDataMapper mapper2 23 mapper2 SetInputConnection [arrows GetOutputPort] 24vtkActor actor2 25 actor2 SetMapper mapper2 26 27 28 29 30# Add the actors to the renderer, set the background and size 31# 32ren1 AddActor actor 33ren1 AddActor actor2 34 35ren1 SetBackground 0.1 0.2 0.4 36 37 38set LastVal -1 39proc MotionCallback {x y} { 40 global LastVal 41 42 # Compute display point from Tk display point. 43 set WindowY 400 44 set y [expr $WindowY - $y] 45 set z [ren1 GetZ $x $y] 46 47 ren1 SetDisplayPoint $x $y $z 48 ren1 DisplayToWorld 49 set pt [ren1 GetWorldPoint] 50 51 #tk_messageBox -message "$pt" 52 set x [lindex $pt 0] 53 set y [lindex $pt 1] 54 set z [lindex $pt 2] 55 56 set val [puzzle SetPoint $x $y $z] 57 if {$val != $LastVal} { 58 renWin Render 59 set LastVal $val 60 } 61} 62 63 64proc ButtonCallback {x y} { 65 66 # Compute display point from Tk display point. 67 set WindowY 400 68 set y [expr $WindowY - $y] 69 set z [ren1 GetZ $x $y] 70 71 ren1 SetDisplayPoint $x $y $z 72 ren1 DisplayToWorld 73 set pt [ren1 GetWorldPoint] 74 75 #tk_messageBox -message "$pt" 76 set x [lindex $pt 0] 77 set y [lindex $pt 1] 78 set z [lindex $pt 2] 79 80 for { set i 0} {$i <= 100} {set i [expr $i + 5]} { 81 puzzle SetPoint $x $y $z 82 puzzle MovePoint $i 83 renWin Render 84 } 85} 86 87renWin Render 88 89set cam [ren1 GetActiveCamera] 90$cam Elevation -40 91update 92 93ButtonCallback 261 272 94arrows SetPermutation puzzle 95renWin Render 96 97 98 99 100