/usr/share/vtk/GUI/Tcl/CustomInteraction.tcl is in vtk-examples 5.8.0-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | #
# This example creates a polygonal model of a cone, and then renders it to
# the screen. It also defines an interaction style by creating a set
# of Command/Observers. (Note: it is far more efficient to create new
# styles by subclassing vtkInteractorStyle. This is just an illustrative
# example.) If you really want trackball behavior, look at the
# vtkInteractorStyleTrackballCamera class.
#
#
# First we include the VTK Tcl packages which will make available
# all of the VTK commands to Tcl.
#
package require vtk
#
# Next we create an instance of vtkConeSource and set some of its
# properties. The instance of vtkConeSource "cone" is part of a visualization
# pipeline (it is a source process object); it produces data (output type is
# vtkPolyData) which other filters may process.
#
vtkConeSource cone
cone SetHeight 3.0
cone SetRadius 1.0
cone SetResolution 10
#
# In this example we terminate the pipeline with a mapper process object.
# (Intermediate filters such as vtkShrinkPolyData could be inserted in
# between the source and the mapper.) We create an instance of
# vtkPolyDataMapper to map the polygonal data into graphics primitives. We
# connect the output of the cone souece to the input of this mapper.
#
vtkPolyDataMapper coneMapper
coneMapper SetInputConnection [cone GetOutputPort]
#
# Create an actor to represent the cone. The actor orchestrates rendering of
# the mapper's graphics primitives. An actor also refers to properties via a
# vtkProperty instance, and includes an internal transformation matrix. We
# set this actor's mapper to be coneMapper which we created above.
#
vtkActor coneActor
coneActor SetMapper coneMapper
#
# Create the Renderer and assign actors to it. A renderer is like a
# viewport. It is part or all of a window on the screen and it is responsible
# for drawing the actors it has. We also set the background color here.
#
vtkRenderer ren1
ren1 AddActor coneActor
ren1 SetBackground 0.1 0.2 0.4
#
# Finally we create the render window which will show up on the screen
# We put our renderer into the render window using AddRenderer. We also
# set the size to be 300 pixels by 300.
#
vtkRenderWindow renWin
renWin AddRenderer ren1
renWin SetSize 300 300
#
# Define custom interaction.
#
vtkRenderWindowInteractor iren
iren SetInteractorStyle ""
iren SetRenderWindow renWin
#
# Add the observers to watch for particular events. These invoke
# Tcl procedures.
#
set Rotating 0
set Panning 0
set Zooming 0
iren AddObserver LeftButtonPressEvent {global Rotating; set Rotating 1}
iren AddObserver LeftButtonReleaseEvent {global Rotating; set Rotating 0}
iren AddObserver MiddleButtonPressEvent {global Panning; set Panning 1}
iren AddObserver MiddleButtonReleaseEvent {global Panning; set Panning 0}
iren AddObserver RightButtonPressEvent {global Zooming; set Zooming 1}
iren AddObserver RightButtonReleaseEvent {global Zooming; set Zooming 0}
iren AddObserver MouseMoveEvent MouseMove
iren AddObserver KeyPressEvent Keypress
# General high-level logic
#
proc MouseMove {} {
global Rotating Panning Zooming
set lastXYpos [iren GetLastEventPosition]
set lastX [lindex $lastXYpos 0]
set lastY [lindex $lastXYpos 1]
set xypos [iren GetEventPosition]
set x [lindex $xypos 0]
set y [lindex $xypos 1]
set center [renWin GetSize]
set centerX [expr [lindex $center 0] / 2.0]
set centerY [expr [lindex $center 1] / 2.0]
if { $Rotating } {
Rotate ren1 [ren1 GetActiveCamera] $x $y $lastX $lastY $centerX $centerY
} elseif { $Panning } {
Pan ren1 [ren1 GetActiveCamera] $x $y $lastX $lastY $centerX $centerY
} elseif { $Zooming } {
Dolly ren1 [ren1 GetActiveCamera] $x $y $lastX $lastY $centerX $centerY
}
}
proc Keypress {} {
set key [iren GetKeySym]
if { $key == "e" } {
vtkCommand DeleteAllObjects
exit
} elseif { $key == "w" } {
Wireframe
} elseif { $key == "s" } {
Surface
}
}
#
# Routines that translate the events into camera motions.
#
# This one is associated with the left mouse button. It translates x and y
# relative motions into camera azimuth and elevation commands.
#
proc Rotate {renderer camera x y lastX lastY centerX centerY} {
$camera Azimuth [expr ($lastX - $x)]
$camera Elevation [expr ($lastY - $y)]
$camera OrthogonalizeViewUp
renWin Render
}
# Pan translates x-y motion into translation of the focal point and position.
#
proc Pan {renderer camera x y lastX lastY centerX centerY} {
set FPoint [$camera GetFocalPoint]
set FPoint0 [lindex $FPoint 0]
set FPoint1 [lindex $FPoint 1]
set FPoint2 [lindex $FPoint 2]
set PPoint [$camera GetPosition]
set PPoint0 [lindex $PPoint 0]
set PPoint1 [lindex $PPoint 1]
set PPoint2 [lindex $PPoint 2]
$renderer SetWorldPoint $FPoint0 $FPoint1 $FPoint2 1.0
$renderer WorldToDisplay
set DPoint [$renderer GetDisplayPoint]
set focalDepth [lindex $DPoint 2]
set APoint0 [expr $centerX + ($x - $lastX)]
set APoint1 [expr $centerY + ($y - $lastY)]
$renderer SetDisplayPoint $APoint0 $APoint1 $focalDepth
$renderer DisplayToWorld
set RPoint [$renderer GetWorldPoint]
set RPoint0 [lindex $RPoint 0]
set RPoint1 [lindex $RPoint 1]
set RPoint2 [lindex $RPoint 2]
set RPoint3 [lindex $RPoint 3]
if { $RPoint3 != 0.0 } {
set RPoint0 [expr $RPoint0 / $RPoint3]
set RPoint1 [expr $RPoint1 / $RPoint3]
set RPoint2 [expr $RPoint2 / $RPoint3]
}
$camera SetFocalPoint \
[expr ($FPoint0 - $RPoint0)/2.0 + $FPoint0] \
[expr ($FPoint1 - $RPoint1)/2.0 + $FPoint1] \
[expr ($FPoint2 - $RPoint2)/2.0 + $FPoint2]
$camera SetPosition \
[expr ($FPoint0 - $RPoint0)/2.0 + $PPoint0] \
[expr ($FPoint1 - $RPoint1)/2.0 + $PPoint1] \
[expr ($FPoint2 - $RPoint2)/2.0 + $PPoint2]
renWin Render
}
# Dolly converts y-motion into a camera dolly commands.
proc Dolly {renderer camera x y lastX lastY centerX centerY} {
set dollyFactor [expr pow(1.02,(0.5*($y - $lastY)))]
if {[$camera GetParallelProjection]} {
set parallelScale [expr [$camera GetParallelScale] * $dollyFactor];
$camera SetParallelScale $parallelScale;
} else {
$camera Dolly $dollyFactor
$renderer ResetCameraClippingRange
}
renWin Render
}
# Wireframe sets the representation of all actors to wireframe.
#
proc Wireframe {} {
set actors [ren1 GetActors]
$actors InitTraversal
set actor [$actors GetNextItem]
while { $actor != "" } {
[$actor GetProperty] SetRepresentationToWireframe
set actor [$actors GetNextItem]
}
renWin Render
}
# Surface sets the representation of all actors to surface.
#
proc Surface {} {
set actors [ren1 GetActors]
$actors InitTraversal
set actor [$actors GetNextItem]
while { $actor != "" } {
[$actor GetProperty] SetRepresentationToSurface
set actor [$actors GetNextItem]
}
renWin Render
}
iren Initialize
wm withdraw .
|