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