#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Test the vtkMagnifierWidget and vtkMagnifierRepresentation classes

import vtk
import vtk.test.Testing
from vtk.util.misc import vtkGetDataRoot
VTK_DATA_ROOT = vtkGetDataRoot()

# Control test resolution
res = 32

# These are the pre-recorded events
Recording = \
    "# StreamVersion 1.1\n\
    MouseMoveEvent 146 150 0 0 0 0\n\
    KeyPressEvent 146 150 0 116 1 t\n\
    CharEvent 146 150 0 116 1 t\n\
    KeyReleaseEvent 146 150 0 116 1 t\n\
    LeftButtonPressEvent 146 150 0 0 0 t\n\
    StartInteractionEvent 146 150 0 0 0 t\n\
    MouseMoveEvent 147 149 0 0 0 t\n\
    RenderEvent 147 149 0 0 0 t\n\
    InteractionEvent 147 149 0 0 0 t\n\
    MouseMoveEvent 148 148 0 0 0 t\n\
    RenderEvent 148 148 0 0 0 t\n\
    InteractionEvent 148 148 0 0 0 t\n\
    MouseMoveEvent 149 148 0 0 0 t\n\
    RenderEvent 149 148 0 0 0 t\n\
    InteractionEvent 149 148 0 0 0 t\n\
    MouseMoveEvent 149 148 0 0 0 t\n\
    RenderEvent 149 148 0 0 0 t\n\
    InteractionEvent 149 148 0 0 0 t\n\
    MouseMoveEvent 149 147 0 0 0 t\n\
    RenderEvent 149 147 0 0 0 t\n\
    InteractionEvent 149 147 0 0 0 t\n\
    MouseMoveEvent 150 147 0 0 0 t\n\
    RenderEvent 150 147 0 0 0 t\n\
    InteractionEvent 150 147 0 0 0 t\n\
    MouseMoveEvent 150 146 0 0 0 t\n\
    RenderEvent 150 146 0 0 0 t\n\
    InteractionEvent 150 146 0 0 0 t\n\
    MouseMoveEvent 151 145 0 0 0 t\n\
    RenderEvent 151 145 0 0 0 t\n\
    InteractionEvent 151 145 0 0 0 t\n\
    MouseMoveEvent 152 143 0 0 0 t\n\
    RenderEvent 152 143 0 0 0 t\n\
    InteractionEvent 152 143 0 0 0 t\n\
    MouseMoveEvent 153 142 0 0 0 t\n\
    RenderEvent 153 142 0 0 0 t\n\
    InteractionEvent 153 142 0 0 0 t\n\
    MouseMoveEvent 154 141 0 0 0 t\n\
    RenderEvent 154 141 0 0 0 t\n\
    InteractionEvent 154 141 0 0 0 t\n\
    MouseMoveEvent 154 140 0 0 0 t\n\
    RenderEvent 154 140 0 0 0 t\n\
    InteractionEvent 154 140 0 0 0 t\n\
    MouseMoveEvent 155 139 0 0 0 t\n\
    RenderEvent 155 139 0 0 0 t\n\
    InteractionEvent 155 139 0 0 0 t\n\
    MouseMoveEvent 155 138 0 0 0 t\n\
    RenderEvent 155 138 0 0 0 t\n\
    InteractionEvent 155 138 0 0 0 t\n\
    MouseMoveEvent 156 137 0 0 0 t\n\
    RenderEvent 156 137 0 0 0 t\n\
    InteractionEvent 156 137 0 0 0 t\n\
    MouseMoveEvent 156 136 0 0 0 t\n\
    RenderEvent 156 136 0 0 0 t\n\
    InteractionEvent 156 136 0 0 0 t\n\
    MouseMoveEvent 156 134 0 0 0 t\n\
    RenderEvent 156 134 0 0 0 t\n\
    InteractionEvent 156 134 0 0 0 t\n\
    MouseMoveEvent 157 132 0 0 0 t\n\
    RenderEvent 157 132 0 0 0 t\n\
    InteractionEvent 157 132 0 0 0 t\n\
    MouseMoveEvent 157 131 0 0 0 t\n\
    RenderEvent 157 131 0 0 0 t\n\
    InteractionEvent 157 131 0 0 0 t\n\
    MouseMoveEvent 158 130 0 0 0 t\n\
    RenderEvent 158 130 0 0 0 t\n\
    InteractionEvent 158 130 0 0 0 t\n\
    MouseMoveEvent 158 129 0 0 0 t\n\
    RenderEvent 158 129 0 0 0 t\n\
    InteractionEvent 158 129 0 0 0 t\n\
    MouseMoveEvent 159 127 0 0 0 t\n\
    RenderEvent 159 127 0 0 0 t\n\
    InteractionEvent 159 127 0 0 0 t\n\
    MouseMoveEvent 159 126 0 0 0 t\n\
    RenderEvent 159 126 0 0 0 t\n\
    InteractionEvent 159 126 0 0 0 t\n\
    MouseMoveEvent 159 125 0 0 0 t\n\
    RenderEvent 159 125 0 0 0 t\n\
    InteractionEvent 159 125 0 0 0 t\n\
    MouseMoveEvent 159 124 0 0 0 t\n\
    RenderEvent 159 124 0 0 0 t\n\
    InteractionEvent 159 124 0 0 0 t\n\
    MouseMoveEvent 160 124 0 0 0 t\n\
    RenderEvent 160 124 0 0 0 t\n\
    InteractionEvent 160 124 0 0 0 t\n\
    MouseMoveEvent 161 123 0 0 0 t\n\
    RenderEvent 161 123 0 0 0 t\n\
    InteractionEvent 161 123 0 0 0 t\n\
    MouseMoveEvent 162 122 0 0 0 t\n\
    RenderEvent 162 122 0 0 0 t\n\
    InteractionEvent 162 122 0 0 0 t\n\
    MouseMoveEvent 163 122 0 0 0 t\n\
    RenderEvent 163 122 0 0 0 t\n\
    InteractionEvent 163 122 0 0 0 t\n\
    MouseMoveEvent 164 121 0 0 0 t\n\
    RenderEvent 164 121 0 0 0 t\n\
    InteractionEvent 164 121 0 0 0 t\n\
    MouseMoveEvent 168 119 0 0 0 t\n\
    RenderEvent 168 119 0 0 0 t\n\
    InteractionEvent 168 119 0 0 0 t\n\
    MouseMoveEvent 172 119 0 0 0 t\n\
    RenderEvent 172 119 0 0 0 t\n\
    InteractionEvent 172 119 0 0 0 t\n\
    MouseMoveEvent 174 119 0 0 0 t\n\
    RenderEvent 174 119 0 0 0 t\n\
    InteractionEvent 174 119 0 0 0 t\n\
    MouseMoveEvent 177 118 0 0 0 t\n\
    RenderEvent 177 118 0 0 0 t\n\
    InteractionEvent 177 118 0 0 0 t\n\
    MouseMoveEvent 178 118 0 0 0 t\n\
    RenderEvent 178 118 0 0 0 t\n\
    InteractionEvent 178 118 0 0 0 t\n\
    MouseMoveEvent 179 118 0 0 0 t\n\
    RenderEvent 179 118 0 0 0 t\n\
    InteractionEvent 179 118 0 0 0 t\n\
    MouseMoveEvent 179 119 0 0 0 t\n\
    RenderEvent 179 119 0 0 0 t\n\
    InteractionEvent 179 119 0 0 0 t\n\
    MouseMoveEvent 179 120 0 0 0 t\n\
    RenderEvent 179 120 0 0 0 t\n\
    InteractionEvent 179 120 0 0 0 t\n\
    MouseMoveEvent 180 120 0 0 0 t\n\
    RenderEvent 180 120 0 0 0 t\n\
    InteractionEvent 180 120 0 0 0 t\n\
    MouseMoveEvent 181 122 0 0 0 t\n\
    RenderEvent 181 122 0 0 0 t\n\
    InteractionEvent 181 122 0 0 0 t\n\
    MouseMoveEvent 182 123 0 0 0 t\n\
    RenderEvent 182 123 0 0 0 t\n\
    InteractionEvent 182 123 0 0 0 t\n\
    MouseMoveEvent 184 125 0 0 0 t\n\
    RenderEvent 184 125 0 0 0 t\n\
    InteractionEvent 184 125 0 0 0 t\n\
    MouseMoveEvent 186 129 0 0 0 t\n\
    RenderEvent 186 129 0 0 0 t\n\
    InteractionEvent 186 129 0 0 0 t\n\
    MouseMoveEvent 187 129 0 0 0 t\n\
    RenderEvent 187 129 0 0 0 t\n\
    InteractionEvent 187 129 0 0 0 t\n\
    MouseMoveEvent 191 132 0 0 0 t\n\
    RenderEvent 191 132 0 0 0 t\n\
    InteractionEvent 191 132 0 0 0 t\n\
    MouseMoveEvent 192 133 0 0 0 t\n\
    RenderEvent 192 133 0 0 0 t\n\
    InteractionEvent 192 133 0 0 0 t\n\
    MouseMoveEvent 194 134 0 0 0 t\n\
    RenderEvent 194 134 0 0 0 t\n\
    InteractionEvent 194 134 0 0 0 t\n\
    MouseMoveEvent 196 135 0 0 0 t\n\
    RenderEvent 196 135 0 0 0 t\n\
    InteractionEvent 196 135 0 0 0 t\n\
    MouseMoveEvent 198 135 0 0 0 t\n\
    RenderEvent 198 135 0 0 0 t\n\
    InteractionEvent 198 135 0 0 0 t\n\
    MouseMoveEvent 199 135 0 0 0 t\n\
    RenderEvent 199 135 0 0 0 t\n\
    InteractionEvent 199 135 0 0 0 t\n\
    MouseMoveEvent 200 134 0 0 0 t\n\
    RenderEvent 200 134 0 0 0 t\n\
    InteractionEvent 200 134 0 0 0 t\n\
    MouseMoveEvent 202 133 0 0 0 t\n\
    RenderEvent 202 133 0 0 0 t\n\
    InteractionEvent 202 133 0 0 0 t\n\
    MouseMoveEvent 203 132 0 0 0 t\n\
    RenderEvent 203 132 0 0 0 t\n\
    InteractionEvent 203 132 0 0 0 t\n\
    MouseMoveEvent 204 132 0 0 0 t\n\
    RenderEvent 204 132 0 0 0 t\n\
    InteractionEvent 204 132 0 0 0 t\n\
    MouseMoveEvent 205 131 0 0 0 t\n\
    RenderEvent 205 131 0 0 0 t\n\
    InteractionEvent 205 131 0 0 0 t\n\
    MouseMoveEvent 206 131 0 0 0 t\n\
    RenderEvent 206 131 0 0 0 t\n\
    InteractionEvent 206 131 0 0 0 t\n\
    MouseMoveEvent 208 130 0 0 0 t\n\
    RenderEvent 208 130 0 0 0 t\n\
    InteractionEvent 208 130 0 0 0 t\n\
    MouseMoveEvent 210 129 0 0 0 t\n\
    RenderEvent 210 129 0 0 0 t\n\
    InteractionEvent 210 129 0 0 0 t\n\
    MouseMoveEvent 211 129 0 0 0 t\n\
    RenderEvent 211 129 0 0 0 t\n\
    InteractionEvent 211 129 0 0 0 t\n\
    MouseMoveEvent 212 128 0 0 0 t\n\
    RenderEvent 212 128 0 0 0 t\n\
    InteractionEvent 212 128 0 0 0 t\n\
    MouseMoveEvent 213 128 0 0 0 t\n\
    RenderEvent 213 128 0 0 0 t\n\
    InteractionEvent 213 128 0 0 0 t\n\
    MouseMoveEvent 215 127 0 0 0 t\n\
    RenderEvent 215 127 0 0 0 t\n\
    InteractionEvent 215 127 0 0 0 t\n\
    MouseMoveEvent 215 126 0 0 0 t\n\
    RenderEvent 215 126 0 0 0 t\n\
    InteractionEvent 215 126 0 0 0 t\n\
    MouseMoveEvent 217 125 0 0 0 t\n\
    RenderEvent 217 125 0 0 0 t\n\
    InteractionEvent 217 125 0 0 0 t\n\
    MouseMoveEvent 217 124 0 0 0 t\n\
    RenderEvent 217 124 0 0 0 t\n\
    InteractionEvent 217 124 0 0 0 t\n\
    MouseMoveEvent 220 122 0 0 0 t\n\
    RenderEvent 220 122 0 0 0 t\n\
    InteractionEvent 220 122 0 0 0 t\n\
    MouseMoveEvent 223 120 0 0 0 t\n\
    RenderEvent 223 120 0 0 0 t\n\
    InteractionEvent 223 120 0 0 0 t\n\
    MouseMoveEvent 226 118 0 0 0 t\n\
    RenderEvent 226 118 0 0 0 t\n\
    InteractionEvent 226 118 0 0 0 t\n\
    MouseMoveEvent 228 118 0 0 0 t\n\
    RenderEvent 228 118 0 0 0 t\n\
    InteractionEvent 228 118 0 0 0 t\n\
    MouseMoveEvent 229 116 0 0 0 t\n\
    RenderEvent 229 116 0 0 0 t\n\
    InteractionEvent 229 116 0 0 0 t\n\
    MouseMoveEvent 230 117 0 0 0 t\n\
    RenderEvent 230 117 0 0 0 t\n\
    InteractionEvent 230 117 0 0 0 t\n\
    MouseMoveEvent 230 117 0 0 0 t\n\
    RenderEvent 230 117 0 0 0 t\n\
    InteractionEvent 230 117 0 0 0 t\n\
    MouseMoveEvent 231 118 0 0 0 t\n\
    RenderEvent 231 118 0 0 0 t\n\
    InteractionEvent 231 118 0 0 0 t\n\
    MouseMoveEvent 232 119 0 0 0 t\n\
    RenderEvent 232 119 0 0 0 t\n\
    InteractionEvent 232 119 0 0 0 t\n\
    MouseMoveEvent 234 120 0 0 0 t\n\
    RenderEvent 234 120 0 0 0 t\n\
    InteractionEvent 234 120 0 0 0 t\n\
    MouseMoveEvent 235 122 0 0 0 t\n\
    RenderEvent 235 122 0 0 0 t\n\
    InteractionEvent 235 122 0 0 0 t\n\
    MouseMoveEvent 237 124 0 0 0 t\n\
    RenderEvent 237 124 0 0 0 t\n\
    InteractionEvent 237 124 0 0 0 t\n\
    MouseMoveEvent 239 126 0 0 0 t\n\
    RenderEvent 239 126 0 0 0 t\n\
    InteractionEvent 239 126 0 0 0 t\n\
    MouseMoveEvent 240 127 0 0 0 t\n\
    RenderEvent 240 127 0 0 0 t\n\
    InteractionEvent 240 127 0 0 0 t\n\
    MouseMoveEvent 240 128 0 0 0 t\n\
    RenderEvent 240 128 0 0 0 t\n\
    InteractionEvent 240 128 0 0 0 t\n\
    MouseMoveEvent 241 129 0 0 0 t\n\
    RenderEvent 241 129 0 0 0 t\n\
    InteractionEvent 241 129 0 0 0 t\n\
    MouseMoveEvent 241 131 0 0 0 t\n\
    RenderEvent 241 131 0 0 0 t\n\
    InteractionEvent 241 131 0 0 0 t\n\
    MouseMoveEvent 241 131 0 0 0 t\n\
    RenderEvent 241 131 0 0 0 t\n\
    InteractionEvent 241 131 0 0 0 t\n\
    MouseMoveEvent 242 132 0 0 0 t\n\
    RenderEvent 242 132 0 0 0 t\n\
    InteractionEvent 242 132 0 0 0 t\n\
    MouseMoveEvent 242 133 0 0 0 t\n\
    RenderEvent 242 133 0 0 0 t\n\
    InteractionEvent 242 133 0 0 0 t\n\
    MouseMoveEvent 242 134 0 0 0 t\n\
    RenderEvent 242 134 0 0 0 t\n\
    InteractionEvent 242 134 0 0 0 t\n\
    MouseMoveEvent 242 135 0 0 0 t\n\
    RenderEvent 242 135 0 0 0 t\n\
    InteractionEvent 242 135 0 0 0 t\n\
    MouseMoveEvent 242 136 0 0 0 t\n\
    RenderEvent 242 136 0 0 0 t\n\
    InteractionEvent 242 136 0 0 0 t\n\
    MouseMoveEvent 242 137 0 0 0 t\n\
    RenderEvent 242 137 0 0 0 t\n\
    InteractionEvent 242 137 0 0 0 t\n\
    MouseMoveEvent 242 138 0 0 0 t\n\
    RenderEvent 242 138 0 0 0 t\n\
    InteractionEvent 242 138 0 0 0 t\n\
    MouseMoveEvent 243 139 0 0 0 t\n\
    RenderEvent 243 139 0 0 0 t\n\
    InteractionEvent 243 139 0 0 0 t\n\
    MouseMoveEvent 244 139 0 0 0 t\n\
    RenderEvent 244 139 0 0 0 t\n\
    InteractionEvent 244 139 0 0 0 t\n\
    MouseMoveEvent 245 139 0 0 0 t\n\
    RenderEvent 245 139 0 0 0 t\n\
    InteractionEvent 245 139 0 0 0 t\n\
    MouseMoveEvent 246 139 0 0 0 t\n\
    RenderEvent 246 139 0 0 0 t\n\
    InteractionEvent 246 139 0 0 0 t\n\
    MouseMoveEvent 247 139 0 0 0 t\n\
    RenderEvent 247 139 0 0 0 t\n\
    InteractionEvent 247 139 0 0 0 t\n\
    MouseMoveEvent 248 138 0 0 0 t\n\
    RenderEvent 248 138 0 0 0 t\n\
    InteractionEvent 248 138 0 0 0 t\n\
    MouseMoveEvent 250 137 0 0 0 t\n\
    RenderEvent 250 137 0 0 0 t\n\
    InteractionEvent 250 137 0 0 0 t\n\
    MouseMoveEvent 253 136 0 0 0 t\n\
    RenderEvent 253 136 0 0 0 t\n\
    InteractionEvent 253 136 0 0 0 t\n\
    MouseMoveEvent 255 134 0 0 0 t\n\
    RenderEvent 255 134 0 0 0 t\n\
    InteractionEvent 255 134 0 0 0 t\n\
    MouseMoveEvent 256 133 0 0 0 t\n\
    RenderEvent 256 133 0 0 0 t\n\
    InteractionEvent 256 133 0 0 0 t\n\
    LeftButtonReleaseEvent 256 133 0 0 0 t\n\
    EndInteractionEvent 256 133 0 0 0 t\n\
    RenderEvent 256 133 0 0 0 t\n\
    MouseMoveEvent 255 132 0 0 0 t\n\
    MouseMoveEvent 254 131 0 0 0 t\n\
    MouseMoveEvent 253 131 0 0 0 t\n\
    MouseMoveEvent 251 129 0 0 0 t\n\
    MouseMoveEvent 249 128 0 0 0 t\n\
    MouseMoveEvent 247 127 0 0 0 t\n\
    MouseMoveEvent 246 126 0 0 0 t\n\
    MouseMoveEvent 242 125 0 0 0 t\n\
    MouseMoveEvent 240 124 0 0 0 t\n\
    MouseMoveEvent 238 124 0 0 0 t\n\
    MouseMoveEvent 236 123 0 0 0 t\n\
    MouseMoveEvent 233 123 0 0 0 t\n\
    MouseMoveEvent 232 123 0 0 0 t\n\
    MouseMoveEvent 231 123 0 0 0 t\n\
    MouseMoveEvent 230 123 0 0 0 t\n\
    MouseMoveEvent 229 122 0 0 0 t\n\
    MouseMoveEvent 228 122 0 0 0 t\n\
    MouseMoveEvent 227 122 0 0 0 t\n\
    MouseMoveEvent 226 122 0 0 0 t\n\
    MouseMoveEvent 225 122 0 0 0 t\n\
    MouseMoveEvent 224 122 0 0 0 t\n\
    MouseMoveEvent 223 122 0 0 0 t\n\
    MouseMoveEvent 221 122 0 0 0 t\n\
    MouseMoveEvent 220 122 0 0 0 t\n\
    MouseMoveEvent 219 123 0 0 0 t\n\
    MouseMoveEvent 217 123 0 0 0 t\n\
    MouseMoveEvent 215 123 0 0 0 t\n\
    MouseMoveEvent 214 123 0 0 0 t\n\
    MouseMoveEvent 213 124 0 0 0 t\n\
    MouseMoveEvent 212 124 0 0 0 t\n\
    MouseMoveEvent 211 124 0 0 0 t\n\
    MouseMoveEvent 210 125 0 0 0 t\n\
    MouseMoveEvent 209 125 0 0 0 t\n\
    MouseMoveEvent 207 125 0 0 0 t\n\
    MouseMoveEvent 206 126 0 0 0 t\n\
    MouseMoveEvent 205 126 0 0 0 t\n\
    MouseMoveEvent 204 127 0 0 0 t\n\
    MouseMoveEvent 204 128 0 0 0 t\n\
    MouseMoveEvent 203 129 0 0 0 t\n\
    KeyPressEvent 203 129 0 109 1 m\n\
    CharEvent 203 129 0 109 1 m\n\
    RenderEvent 203 129 0 109 1 m\n\
    KeyReleaseEvent 203 129 0 109 1 m\n\
    MouseMoveEvent 203 129 0 0 0 m\n\
    RenderEvent 203 129 0 0 0 m\n\
    MouseMoveEvent 202 129 0 0 0 m\n\
    RenderEvent 202 129 0 0 0 m\n\
    MouseMoveEvent 201 128 0 0 0 m\n\
    RenderEvent 201 128 0 0 0 m\n\
    MouseMoveEvent 200 128 0 0 0 m\n\
    RenderEvent 200 128 0 0 0 m\n\
    MouseMoveEvent 199 128 0 0 0 m\n\
    RenderEvent 199 128 0 0 0 m\n\
    MouseMoveEvent 199 127 0 0 0 m\n\
    RenderEvent 199 127 0 0 0 m\n\
    MouseMoveEvent 199 126 0 0 0 m\n\
    RenderEvent 199 126 0 0 0 m\n\
    MouseMoveEvent 199 127 0 0 0 m\n\
    RenderEvent 199 127 0 0 0 m\n\
    MouseMoveEvent 199 127 0 0 0 m\n\
    RenderEvent 199 127 0 0 0 m\n\
    MouseMoveEvent 199 128 0 0 0 m\n\
    RenderEvent 199 128 0 0 0 m\n\
    MouseMoveEvent 199 129 0 0 0 m\n\
    RenderEvent 199 129 0 0 0 m\n\
    MouseMoveEvent 199 130 0 0 0 m\n\
    RenderEvent 199 130 0 0 0 m\n\
    MouseMoveEvent 199 131 0 0 0 m\n\
    RenderEvent 199 131 0 0 0 m\n\
    KeyPressEvent 199 131 0 0 1 Shift_L\n\
    CharEvent 199 131 0 0 1 Shift_L\n\
    KeyPressEvent 199 131 1 43 1 plus\n\
    CharEvent 199 131 1 43 1 plus\n\
    RenderEvent 199 131 1 43 1 plus\n\
    KeyReleaseEvent 199 131 1 43 1 plus\n\
    KeyPressEvent 199 131 1 43 1 plus\n\
    CharEvent 199 131 1 43 1 plus\n\
    RenderEvent 199 131 1 43 1 plus\n\
    KeyReleaseEvent 199 131 1 43 1 plus\n\
    KeyReleaseEvent 199 131 1 0 1 Shift_L\n\
    KeyPressEvent 199 131 0 45 1 minus\n\
    CharEvent 199 131 0 45 1 minus\n\
    RenderEvent 199 131 0 45 1 minus\n\
    KeyReleaseEvent 199 131 0 45 1 minus\n\
    KeyPressEvent 199 131 0 45 1 minus\n\
    CharEvent 199 131 0 45 1 minus\n\
    RenderEvent 199 131 0 45 1 minus\n\
    KeyReleaseEvent 199 131 0 45 1 minus\n\
    KeyPressEvent 199 131 0 45 1 minus\n\
    CharEvent 199 131 0 45 1 minus\n\
    RenderEvent 199 131 0 45 1 minus\n\
    KeyReleaseEvent 199 131 0 45 1 minus\n\
"

# Create a simple geometry: a mace
sphere = vtk.vtkSphereSource()
sphere.SetThetaResolution(res)
sphere.SetPhiResolution(int(res/2))

cone = vtk.vtkConeSource()
cone.SetResolution(int(res/4))

normals = vtk.vtkGlyph3D()
normals.SetInputConnection(sphere.GetOutputPort())
normals.SetSourceConnection(cone.GetOutputPort())
normals.SetVectorModeToUseNormal()
normals.SetScaleFactor(0.1)

sphereMapper = vtk.vtkPolyDataMapper()
sphereMapper.SetInputConnection(sphere.GetOutputPort())

spikeMapper = vtk.vtkPolyDataMapper()
spikeMapper.SetInputConnection(normals.GetOutputPort())

sphereActor = vtk.vtkActor()
sphereActor.SetMapper(sphereMapper)

spikeActor = vtk.vtkActor()
spikeActor.SetMapper(spikeMapper)

# Special effect to see edges
edges = vtk.vtkFeatureEdges()
edges.SetInputConnection(sphere.GetOutputPort())
edges.ExtractAllEdgeTypesOff()
edges.ManifoldEdgesOn()

edgeMapper = vtk.vtkPolyDataMapper()
edgeMapper.SetInputConnection(edges.GetOutputPort())
edgeMapper.ScalarVisibilityOff()

edgeActor = vtk.vtkActor()
edgeActor.SetMapper(edgeMapper)
edgeActor.GetProperty().SetColor(1,0,0)

# Create the RenderWindow, Renderer and both Actors
#
ren0 = vtk.vtkRenderer()
ren0.SetViewport(0,0,0.5,1.0)
ren1 = vtk.vtkRenderer()
ren1.SetViewport(0.5,0,1.0,1.0)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren0)
renWin.AddRenderer(ren1)

iRen = vtk.vtkRenderWindowInteractor()
iRen.SetRenderWindow(renWin)

# Observe events for magnification factor change
def ChangeMag(widget, event_string):
    if iRen.GetKeyCode() == '+' :
        magF = magRep.GetMagnificationFactor() + 1
    else:
        magF = magRep.GetMagnificationFactor() - 1
    magRep.SetMagnificationFactor(magF)

# Add the magnifier widget
magRep = vtk.vtkMagnifierRepresentation()
magRep.SetRenderer(ren0)
magRep.GetMagnificationRenderer().SetBackground(0.8,0.8,0.8)
magRep.BorderOn()
magRep.GetBorderProperty().SetColor(0,1,0)
magRep.AddViewProp(sphereActor)
magRep.AddViewProp(edgeActor)

magW = vtk.vtkMagnifierWidget()
magW.SetInteractor(iRen)
magW.SetRepresentation(magRep)
magW.AddObserver("WidgetValueChangedEvent",ChangeMag)

# Handle playback of events
recorder = vtk.vtkInteractorEventRecorder()
recorder.SetInteractor(iRen)
#recorder.SetFileName("record.log")
#recorder.On()
#recorder.Record()
recorder.ReadFromInputStringOn()
recorder.SetInputString(Recording)

# Add the actors to the renderer, set the background and size
#
ren0.AddActor(sphereActor)
ren0.AddActor(spikeActor)
ren0.SetBackground(0,0,0)
ren0.ResetCamera()

ren1.AddActor(sphereActor)
ren1.AddActor(spikeActor)
ren1.SetBackground(0,0,0)
ren1.ResetCamera()

renWin.SetSize(600, 300)

iRen.Initialize()
renWin.Render()

# Playack events
recorder.Play()

# Interact with the data
iRen.Start()
