1 | #!/usr/bin/env python |
---|
2 | # |
---|
3 | # This example introduces 3D widgets. 3D widgets take advantage of the |
---|
4 | # event/observer design pattern introduced previously. They typically |
---|
5 | # have a particular representation in the scene which can be interactively |
---|
6 | # selected and manipulated using the mouse and keyboard. As the widgets |
---|
7 | # are manipulated, they in turn invoke events such as StartInteractionEvent, |
---|
8 | # InteractionEvent, and EndInteractionEvent which can be used to manipulate |
---|
9 | # the scene that the widget is embedded in. 3D widgets work in the context |
---|
10 | # of the event loop which was set up in the previous example. |
---|
11 | # |
---|
12 | # Note: there are more 3D widget examples in VTK/Examples/GUI/. |
---|
13 | # |
---|
14 | |
---|
15 | # First we import the VTK Python package that will make available all |
---|
16 | # of the VTK commands to Python. |
---|
17 | import vtk |
---|
18 | |
---|
19 | # Next we create an instance of vtkConeSource and set some of its |
---|
20 | # properties. The instance of vtkConeSource "cone" is part of a |
---|
21 | # visualization pipeline (it is a source process object); it produces |
---|
22 | # data (output type is vtkPolyData) which other filters may process. |
---|
23 | cone = vtk.vtkConeSource() |
---|
24 | cone.SetHeight(3.0) |
---|
25 | cone.SetRadius(1.0) |
---|
26 | cone.SetResolution(10) |
---|
27 | |
---|
28 | # In this example we terminate the pipeline with a mapper process object. |
---|
29 | # (Intermediate filters such as vtkShrinkPolyData could be inserted in |
---|
30 | # between the source and the mapper.) We create an instance of |
---|
31 | # vtkPolyDataMapper to map the polygonal data into graphics primitives. We |
---|
32 | # connect the output of the cone souece to the input of this mapper. |
---|
33 | coneMapper = vtk.vtkPolyDataMapper() |
---|
34 | coneMapper.SetInput(cone.GetOutput()) |
---|
35 | |
---|
36 | # Create an actor to represent the cone. The actor orchestrates rendering of |
---|
37 | # the mapper's graphics primitives. An actor also refers to properties via a |
---|
38 | # vtkProperty instance, and includes an internal transformation matrix. We |
---|
39 | # set this actor's mapper to be coneMapper which we created above. |
---|
40 | coneActor = vtk.vtkActor() |
---|
41 | coneActor.SetMapper(coneMapper) |
---|
42 | |
---|
43 | # Create the Renderer and assign actors to it. A renderer is like a |
---|
44 | # viewport. It is part or all of a window on the screen and it is |
---|
45 | # responsible for drawing the actors it has. We also set the |
---|
46 | # background color here. |
---|
47 | ren1 = vtk.vtkRenderer() |
---|
48 | ren1.AddActor(coneActor) |
---|
49 | ren1.SetBackground(0.1, 0.2, 0.4) |
---|
50 | |
---|
51 | # Finally we create the render window which will show up on the screen |
---|
52 | # We put our renderer into the render window using AddRenderer. We |
---|
53 | # also set the size to be 300 pixels by 300. |
---|
54 | renWin = vtk.vtkRenderWindow() |
---|
55 | renWin.AddRenderer(ren1) |
---|
56 | renWin.SetSize(300, 300) |
---|
57 | |
---|
58 | # The vtkRenderWindowInteractor class watches for events (e.g., keypress, |
---|
59 | # mouse) in the vtkRenderWindow. These events are translated into |
---|
60 | # event invocations that VTK understands (see VTK/Common/vtkCommand.h |
---|
61 | # for all events that VTK processes). Then observers of these VTK |
---|
62 | # events can process them as appropriate. |
---|
63 | iren = vtk.vtkRenderWindowInteractor() |
---|
64 | iren.SetRenderWindow(renWin) |
---|
65 | |
---|
66 | # By default the vtkRenderWindowInteractor instantiates an instance |
---|
67 | # of vtkInteractorStyle. vtkInteractorStyle translates a set of events |
---|
68 | # it observes into operations on the camera, actors, and/or properties |
---|
69 | # in the vtkRenderWindow associated with the vtkRenderWinodwInteractor. |
---|
70 | # Here we specify a particular interactor style. |
---|
71 | style = vtk.vtkInteractorStyleTrackballCamera() |
---|
72 | iren.SetInteractorStyle(style) |
---|
73 | |
---|
74 | |
---|
75 | # Here we use a vtkBoxWidget to transform the underlying coneActor (by |
---|
76 | # manipulating its transformation matrix). Many other types of widgets |
---|
77 | # are available for use, see the documentation for more details. |
---|
78 | # |
---|
79 | # The SetInteractor method is how 3D widgets are associated with the render |
---|
80 | # window interactor. Internally, SetInteractor sets up a bunch of callbacks |
---|
81 | # using the Command/Observer mechanism (AddObserver()). The place factor |
---|
82 | # controls the initial size of the widget with respect to the bounding box |
---|
83 | # of the input to the widget. |
---|
84 | boxWidget = vtk.vtkBoxWidget() |
---|
85 | boxWidget.SetInteractor(iren) |
---|
86 | boxWidget.SetPlaceFactor(1.25) |
---|
87 | |
---|
88 | # Place the interactor initially. The input to a 3D widget is used to |
---|
89 | # initially position and scale the widget. The EndInteractionEvent is |
---|
90 | # observed which invokes the SelectPolygons callback. |
---|
91 | boxWidget.SetProp3D(coneActor) |
---|
92 | boxWidget.PlaceWidget() |
---|
93 | |
---|
94 | # Similar to Step2/Python/Cone2.py, we define a callback for |
---|
95 | # interaction. As can be seen the callback takes two arguments. The |
---|
96 | # first being the object that generates the event and the second |
---|
97 | # argument the event name (which is a string). |
---|
98 | def myCallback(widget, event_string): |
---|
99 | t = vtk.vtkTransform() |
---|
100 | boxWidget.GetTransform(t) |
---|
101 | boxWidget.GetProp3D().SetUserTransform(t) |
---|
102 | |
---|
103 | |
---|
104 | # Now for every interaction event that is generated by the boxWidget, |
---|
105 | # call our callback function. |
---|
106 | boxWidget.AddObserver("InteractionEvent", myCallback) |
---|
107 | |
---|
108 | # Normally the user presses the "i" key to bring a 3D widget to |
---|
109 | # life. Here we will manually enable it so it appears with the cone. |
---|
110 | boxWidget.On() |
---|
111 | |
---|
112 | # Start the event loop. |
---|
113 | iren.Initialize() |
---|
114 | iren.Start() |
---|
115 | |
---|
116 | # There is no explicit need to free any objects at this point. |
---|
117 | # Once Python exits, memory is automatically freed. |
---|