1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4'''
5=========================================================================
6
7  Program:   Visualization Toolkit
8  Module:    TestNamedColorsIntegration.py
9
10  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
11  All rights reserved.
12  See Copyright.txt or http:#www.kitware.com/Copyright.htm for details.
13
14     This software is distributed WITHOUT ANY WARRANTY without even
15     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16     PURPOSE.  See the above copyright notice for more information.
17
18=========================================================================
19'''
20
21import vtk
22import vtk.test.Testing
23from vtk.util.misc import vtkGetDataRoot
24import os
25VTK_DATA_ROOT = vtkGetDataRoot()
26
27# This example demonstrates how to use the vtkCameraOrientationWidget to control
28# a renderer's camera orientation.
29
30# -Z -> -X -> -Z
31FromMinusZToMinusX = "# StreamVersion 1.1\n\
32					EnterEvent 150 150 0 0 0 c\n\
33					MouseMoveEvent 294 265 0 0 0 c\n\
34					LeftButtonPressEvent 294 265 0 0 0 c\n\
35					LeftButtonReleaseEvent 294 265 0 0 0 c\n"
36FromMinusXToMinusZ = "# StreamVersion 1.1\n\
37					EnterEvent 150 150 0 0 0 c\n\
38					MouseMoveEvent 267 289 0 0 0 c\n\
39					LeftButtonPressEvent 267 289 0 0 0 c\n\
40					LeftButtonReleaseEvent 267 289 0 0 0 c\n"
41###
42# -Z -> -Y -> -Z
43FromMinusZToMinusY = "# StreamVersion 1.1\n\
44					EnterEvent 150 150 0 0 0 c\n\
45					MouseMoveEvent 268 288 0 0 0 c\n\
46					LeftButtonPressEvent 268 288 0 0 0 c\n\
47					LeftButtonReleaseEvent 268 288 0 0 0 c\n"
48FromMinusYToMinusZ = "# StreamVersion 1.1\n\
49					EnterEvent 150 150 0 0 0 c\n\
50					MouseMoveEvent 267 289 0 0 0 c\n\
51					LeftButtonPressEvent 267 289 0 0 0 c\n\
52					LeftButtonReleaseEvent 267 289 0 0 0 c\n"
53###
54# -Z -> +Z -> -Z
55FromMinusZToPlusZ = "# StreamVersion 1.1\n\
56					EnterEvent 150 150 0 0 0 c\n\
57					MouseMoveEvent 267 265 0 0 0 c\n\
58					LeftButtonPressEvent 267 265 0 0 0 c\n\
59					LeftButtonReleaseEvent 267 265 0 0 0 c\n"
60FromPlusZToMinusZ = "# StreamVersion 1.1\n\
61					EnterEvent 150 150 0 0 0 c\n\
62					MouseMoveEvent 267 265 0 0 0 c\n\
63					LeftButtonPressEvent 267 265 0 0 0 c\n\
64					LeftButtonReleaseEvent 267 265 0 0 0 c\n"
65###
66# +Z -> +X -> +Z
67FromPlusZToPlusX = "# StreamVersion 1.1\n\
68					EnterEvent 150 150 0 0 0 c\n\
69					MouseMoveEvent 289 265 0 0 0 c\n\
70					LeftButtonPressEvent 289 265 0 0 0 c\n\
71					LeftButtonReleaseEvent 289 265 0 0 0 c\n"
72FromPlusXToPlusZ = "# StreamVersion 1.1\n\
73					EnterEvent 150 150 0 0 0 c\n\
74					MouseMoveEvent 267 245 0 0 0 c\n\
75					LeftButtonPressEvent 267 245 0 0 0 c\n\
76					LeftButtonReleaseEvent 267 245 0 0 0 c\n"
77###
78# +Z -> +Y -> +Z
79FromPlusZToPlusY = "# StreamVersion 1.1\n\
80					EnterEvent 150 150 0 0 0 c\n\
81					MouseMoveEvent 267 245 0 0 0 c\n\
82					LeftButtonPressEvent 267 245 0 0 0 c\n\
83					LeftButtonReleaseEvent 267 245 0 0 0 c\n"
84FromPlusYToPlusZ = "# StreamVersion 1.1\n\
85					EnterEvent 150 150 0 0 0 c\n\
86					MouseMoveEvent 267 245 0 0 0 c\n\
87					LeftButtonPressEvent 267 245 0 0 0 c\n\
88					LeftButtonReleaseEvent 267 245 0 0 0 c\n"
89
90###
91# -Z -> arbitrary
92FromMinusZToArbitrary = "# StreamVersion 1.1\n\
93					LeaveEvent 300 150 0 0 0 c\n\
94					EnterEvent 150 150 0 0 0 c\n\
95					MouseMoveEvent 268 288 0 0 0 c\n\
96					LeftButtonPressEvent 268 288 0 0 0 c\n\
97					MouseMoveEvent 266 287 0 0 0 c\n\
98					MouseMoveEvent 260 260 0 0 0 c\n\
99					MouseMoveEvent 250 255 0 0 0 c\n\
100					MouseMoveEvent 246 250 0 0 0 c\n\
101					LeftButtonReleaseEvent 246 250 0 0 0 c\n"
102
103
104class TestCameraOrientationWidget(vtk.test.Testing.vtkTest):
105
106    def spin(self, instructions, widgetBack, widgetUp, camPos, focalPoint, viewUp):
107        self.recorder.SetInputString(instructions)
108        self.recorder.Play()
109
110        rep = self.camOrientManipulator.GetRepresentation()
111        cam = self.renderer.GetActiveCamera()
112        for i in range(3):
113            widgetBack[i] = rep.GetBack()[i]
114            widgetUp[i] = rep.GetUp()[i]
115
116            camPos[i] = cam.GetPosition()[i]
117            focalPoint[i] = cam.GetFocalPoint()[i]
118            viewUp[i] = cam.GetViewUp()[i]
119
120    def testCameraOrientationWidget(self):
121        self.camOrientManipulator = vtk.vtkCameraOrientationWidget()
122        self.renderer = vtk.vtkRenderer()
123        self.renWin = vtk.vtkRenderWindow()
124        self.interactor = vtk.vtkRenderWindowInteractor()
125        self.recorder = vtk.vtkInteractorEventRecorder()
126
127        reader = vtk.vtkXMLPolyDataReader()
128        reader.SetFileName(os.path.join(VTK_DATA_ROOT, "Data/cow.vtp"))
129
130        mapper = vtk.vtkPolyDataMapper()
131        mapper.SetInputConnection(reader.GetOutputPort())
132
133        actor = vtk.vtkActor()
134        actor.SetMapper(mapper)
135
136        self.renderer.AddActor(actor)
137        self.renderer.SetBackground(0.32, 0.32, 0.32)
138        self.renWin.AddRenderer(self.renderer)
139        self.renWin.SetSize(300, 300)
140
141        self.interactor.SetRenderWindow(self.renWin)
142        self.interactor.Initialize()
143
144        self.camOrientManipulator.SetParentRenderer(self.renderer)
145        self.camOrientManipulator.On()
146
147        self.renWin.Render()
148
149        self.recorder.SetInteractor(self.interactor)
150        self.recorder.ReadFromInputStringOn()
151
152        instructions = [FromMinusZToMinusX, FromMinusXToMinusZ,
153                        FromMinusZToMinusY, FromMinusYToMinusZ,
154                        FromMinusZToPlusZ,  FromPlusZToMinusZ,
155                        FromMinusZToPlusZ,  FromPlusZToPlusX,
156                        FromPlusXToPlusZ,   FromPlusZToPlusY,
157                        FromPlusYToPlusZ,   FromPlusZToMinusZ,
158                        FromMinusZToArbitrary]
159
160        requiredWidgetBack = [
161            [-1, 0, 0], [0, 0, -1], [0, -1, 0], [0, 0, -1],
162            [0, 0, 1],  [0, 0, -1], [0, 0, 1],  [1, 0, 0],
163            [0, 0, 1],  [0, 1, 0],  [0, 0, 1],  [0, 0, -1],
164            [-0.44760227022559895, -0.7930977224238861, -0.4130958852069752]
165        ]
166        requiredWidgetUp = [[0, 0, 1], [0, 1, 0], [0, 0, 1],
167                            [0, 1, 0], [0, 1, 0], [0, 1, 0],
168                            [0, 1, 0], [0, 0, 1], [0, 1, 0],
169                            [0, 0, 1], [0, 1, 0], [0, 1, 0],
170                            [-0.24830554277755906,
171                                0.5540205026572317, -0.7946103699684332]
172                            ]
173        requiredPos = [
174            [25.3322, -0.438658, 0],        [0.776126, -0.438658, 24.556],
175            [0.776126, 24.1174, 0],         [0.776126, -0.438658, 24.556],
176            [0.776126, -0.438658, -24.556], [0.776126, -0.438658, 24.556],
177            [0.776126, -0.438658, -24.556], [-23.7799, -0.438658, 0],
178            [0.776126, -0.438658, -24.556], [0.776126, -24.9947, 0],
179            [0.776126, -0.438658, -24.556], [0.776126, -0.438658, 24.556],
180            [11.767466031971992, 19.036682097465544, 10.143999445975485]
181        ]
182
183        requiredFp = [
184            [0.776126, -0.438658, 0], [0.776126, -0.438658, 0],
185            [0.776126, -0.438658, 0], [0.776126, -0.438658, 0],
186            [0.776126, -0.438658, 0], [0.776126, -0.438658, 0],
187            [0.776126, -0.438658, 0], [0.776126, -0.438658, 0],
188            [0.776126, -0.438658, 0], [0.776126, -0.438658, 0],
189            [0.776126, -0.438658, 0], [0.776126, -0.438658, 0],
190            [0.7761263847351074, -0.4386579990386963, 0.0]
191        ]
192        requiredViewUp = [[0, 0, 1], [0, 1, 0], [0, 0, 1],
193                          [0, 1, 0], [0, 1, 0], [0, 1, 0],
194                          [0, 1, 0], [0, 0, 1], [0, 1, 0],
195                          [0, 0, 1], [0, 1, 0], [0, 1, 0],
196                          [-0.24830554277755904,
197                              0.5540205026572318, -0.7946103699684332]
198                          ]
199
200        widgetBack = [0, 0, 0]
201        widgetUp = [0, 0, 0]
202        camPos = [0, 0, 0]
203        focalPoint = [0, 0, 0]
204        viewUp = [0, 0, 0]
205        for i in range(13):
206            self.spin(
207                instructions[i], widgetBack, widgetUp, camPos, focalPoint, viewUp)
208            # verify widget, camera orientations
209            for j in range(3):
210                self.assertAlmostEqual(widgetBack[j], requiredWidgetBack[i][j])
211                self.assertAlmostEqual(widgetUp[j], requiredWidgetUp[i][j])
212                self.assertAlmostEqual(camPos[j], requiredPos[i][j], places=4)
213                self.assertAlmostEqual(
214                    focalPoint[j], requiredFp[i][j], places=4)
215                self.assertAlmostEqual(
216                    viewUp[j], requiredViewUp[i][j], places=4)
217
218        # Remove the observers so we can go interactive. Without this the "-I"
219        # testing option fails.
220        self.recorder.Off()
221        vtk.test.Testing.compareImage(self.renWin, vtk.test.Testing.getAbsImagePath(
222            "TestCameraOrientationWidget.png"))
223        vtk.test.Testing.interact()
224
225
226if __name__ == "__main__":
227    vtk.test.Testing.main([(TestCameraOrientationWidget, 'test')])
228