+ self.Zoom(event.x, event.y)
+
+
+ def OnEnter(self, event):
+ self.__OldFocus = wxWindow_FindFocus()
+ self.SetFocus()
+ x, y = event.GetPositionTuple()
+ self.UpdateRenderer(x,y)
+
+
+ def OnLeave(self, event):
+ if (self._OldFocus != None):
+ self.__OldFocus.SetFocus()
+
+
+ def OnChar(self, event):
+ key = event.KeyCode()
+ if (key == ord('r')) or (key == ord('R')):
+ self.Reset()
+ elif (key == ord('w')) or (key == ord('W')):
+ self.Wireframe()
+ elif (key == ord('s')) or (key == ord('S')):
+ self.Surface()
+ elif (key == ord('p')) or (key == ord('P')):
+ x, y = event.GetPositionTuple()
+ self.PickActor(x, y)
+ else:
+ event.Skip()
+
+
+ # Start of internal functions
+ def GetZoomFactor(self):
+ return self._CurrentZoom
+
+
+ def SetZoomFactor(self, zf):
+ self._CurrentZoom = zf
+
+
+ def GetPicker(self):
+ return self._Picker
+
+
+ def Render(self):
+ if (self._CurrentLight):
+ light = self._CurrentLight
+ light.SetPosition(self._CurrentCamera.GetPosition())
+ light.SetFocalPoint(self._CurrentCamera.GetFocalPoint())
+
+ wxVTKRenderWindowBase.Render(self)
+
+
+ def UpdateRenderer(self, x, y):
+ """
+ UpdateRenderer will identify the renderer under the mouse and set
+ up _CurrentRenderer, _CurrentCamera, and _CurrentLight.
+ """
+ sz = self.GetSize()
+ windowX = sz.width
+ windowY = sz.height
+
+ renderers = self._RenderWindow.GetRenderers()
+ numRenderers = renderers.GetNumberOfItems()
+
+ self._CurrentRenderer = None
+ renderers.InitTraversal()
+ for i in range(0,numRenderers):
+ renderer = renderers.GetNextItem()
+ vx,vy = (0,0)
+ if (windowX > 1):
+ vx = float (x)/(windowX-1)
+ if (windowY > 1):
+ vy = (windowY-float(y)-1)/(windowY-1)
+ (vpxmin,vpymin,vpxmax,vpymax) = renderer.GetViewport()
+
+ if (vx >= vpxmin and vx <= vpxmax and
+ vy >= vpymin and vy <= vpymax):
+ self._CurrentRenderer = renderer
+ self._ViewportCenterX = float(windowX)*(vpxmax-vpxmin)/2.0\
+ +vpxmin
+ self._ViewportCenterY = float(windowY)*(vpymax-vpymin)/2.0\
+ +vpymin
+ self._CurrentCamera = self._CurrentRenderer.GetActiveCamera()
+ lights = self._CurrentRenderer.GetLights()
+ lights.InitTraversal()
+ self._CurrentLight = lights.GetNextItem()
+ break
+
+ self._LastX = x
+ self._LastY = y
+
+
+ def GetCurrentRenderer(self):
+ return self._CurrentRenderer
+
+
+ def StartMotion(self, event):
+ x, y = event.GetPositionTuple()
+ self.UpdateRenderer(x,y)
+ self.box.CaptureMouse()
+
+
+ def EndMotion(self, event=None):
+ if self._CurrentRenderer:
+ self.Render()
+ self.box.ReleaseMouse()
+
+
+ def Rotate(self,x,y):
+ if self._CurrentRenderer:
+
+ self._CurrentCamera.Azimuth(self._LastX - x)
+ self._CurrentCamera.Elevation(y - self._LastY)
+ self._CurrentCamera.OrthogonalizeViewUp()
+
+ self._LastX = x
+ self._LastY = y
+
+ self._CurrentRenderer.ResetCameraClippingRange()
+ self.Render()
+
+
+ def PanAbsolute(self, x_vec, y_vec):
+ if self._CurrentRenderer:
+
+ renderer = self._CurrentRenderer
+ camera = self._CurrentCamera
+ (pPoint0,pPoint1,pPoint2) = camera.GetPosition()
+ (fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint()
+
+ if (camera.GetParallelProjection()):
+ renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
+ renderer.WorldToDisplay()
+ fx,fy,fz = renderer.GetDisplayPoint()
+ renderer.SetDisplayPoint(fx+x_vec,
+ fy+y_vec,
+ fz)
+ renderer.DisplayToWorld()
+ fx,fy,fz,fw = renderer.GetWorldPoint()
+ camera.SetFocalPoint(fx,fy,fz)
+
+ renderer.SetWorldPoint(pPoint0,pPoint1,pPoint2,1.0)
+ renderer.WorldToDisplay()
+ fx,fy,fz = renderer.GetDisplayPoint()
+ renderer.SetDisplayPoint(fx+x_vec,
+ fy+y_vec,
+ fz)
+ renderer.DisplayToWorld()
+ fx,fy,fz,fw = renderer.GetWorldPoint()
+ camera.SetPosition(fx,fy,fz)
+
+ else:
+ (fPoint0,fPoint1,fPoint2) = camera.GetFocalPoint()
+ # Specify a point location in world coordinates
+ renderer.SetWorldPoint(fPoint0,fPoint1,fPoint2,1.0)
+ renderer.WorldToDisplay()
+ # Convert world point coordinates to display coordinates
+ dPoint = renderer.GetDisplayPoint()
+ focalDepth = dPoint[2]
+
+ aPoint0 = self._ViewportCenterX + x_vec
+ aPoint1 = self._ViewportCenterY + y_vec
+
+ renderer.SetDisplayPoint(aPoint0,aPoint1,focalDepth)
+ renderer.DisplayToWorld()
+
+ (rPoint0,rPoint1,rPoint2,rPoint3) = renderer.GetWorldPoint()
+ if (rPoint3 != 0.0):
+ rPoint0 = rPoint0/rPoint3
+ rPoint1 = rPoint1/rPoint3
+ rPoint2 = rPoint2/rPoint3
+
+ camera.SetFocalPoint((fPoint0 - rPoint0) + fPoint0,
+ (fPoint1 - rPoint1) + fPoint1,
+ (fPoint2 - rPoint2) + fPoint2)
+
+ camera.SetPosition((fPoint0 - rPoint0) + pPoint0,
+ (fPoint1 - rPoint1) + pPoint1,
+ (fPoint2 - rPoint2) + pPoint2)
+
+ self.Render()
+
+
+ def Pan(self, x, y):
+ self.PanAbsolute(x - self._LastX, - y + self._LastY)
+ self._LastX = x
+ self._LastY = y
+
+
+ def Zoom(self,x,y):
+ if self._CurrentRenderer:
+
+ renderer = self._CurrentRenderer
+ camera = self._CurrentCamera
+
+ zoomFactor = math.pow(1.02,(0.5*(self._LastY - y)))
+ self._CurrentZoom = self._CurrentZoom * zoomFactor
+
+ if camera.GetParallelProjection():
+ parallelScale = camera.GetParallelScale()/zoomFactor
+ camera.SetParallelScale(parallelScale)
+ else:
+ camera.Dolly(zoomFactor)
+ renderer.ResetCameraClippingRange()
+
+ self._LastX = x
+ self._LastY = y
+
+ self.Render()
+
+
+ def Reset(self):
+ if self._CurrentRenderer:
+ self._CurrentRenderer.ResetCamera()
+
+ self.Render()
+
+
+ def Wireframe(self):
+ actors = self._CurrentRenderer.GetActors()
+ numActors = actors.GetNumberOfItems()
+ actors.InitTraversal()
+ for i in range(0,numActors):
+ actor = actors.GetNextItem()
+ actor.GetProperty().SetRepresentationToWireframe()
+
+ self.Render()
+
+
+ def Surface(self):
+ actors = self._CurrentRenderer.GetActors()
+ numActors = actors.GetNumberOfItems()
+ actors.InitTraversal()
+ for i in range(0,numActors):
+ actor = actors.GetNextItem()
+ actor.GetProperty().SetRepresentationToSurface()
+
+ self.Render()
+