def __init__(self, *args, **kwargs): """Initializer. """ self._aspect_ratio = kwargs.get('aspect_ratio', (4, 3)) self.render_window = wxVTKRenderWindowInteractor(self, -1) # disable widget (to avoid rendering) self.render_window.Enable(False) # Hook exit event. self.render_window.AddObserver('ExitEvent', self.ObserverExitEventHandler) self.renderers = [] # events self.Bind(wx.EVT_SIZE, self.OnSize)
def __init__(self, parent=None, id=-1, pos=wx.DefaultPosition, title="3D Density"): VizFrame.__init__(self, parent, id, pos, title) self.widget = wxVTKRenderWindowInteractor(self,-1) style = vtk.vtkInteractorStyleTrackballCamera() self.widget.SetInteractorStyle(style) self.ren = vtk.vtkRenderer() self.ren.SetBackground(0.1, 0.1, 0.7) self.widget.GetRenderWindow().AddRenderer(self.ren) self.data = None self.colors = None # layout the frame self.box = wx.BoxSizer(wx.HORIZONTAL) self.leftPanel = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.box) self.box.Add(self.leftPanel,0, wx.EXPAND) self.box.Add(self.widget,1,wx.EXPAND) self.Layout() self.MenuBar = wx.MenuBar() self.FileMenu = wx.Menu() self.GateMenu = wx.Menu() self.MenuBar.Append(self.FileMenu, "File") self.MenuBar.Append(self.GateMenu, "Gating") self.SetMenuBar(self.MenuBar) export = self.FileMenu.Append(-1, "Export graphics") self.Bind(wx.EVT_MENU, self.OnExport, export) self.colorGate = self.GateMenu.Append(-1, "Gate on visible colors only") self.Bind(wx.EVT_MENU, self.GateByColor, self.colorGate) self.colorGate.Enable(False) gate = self.GateMenu.Append(-1, "Capture gated events") self.boxAddMenuItem = self.GateMenu.Append(-1, "Add box gate") self.GateMenu.AppendSeparator() self.boxes = [] self.Bind(wx.EVT_MENU, self.OnBox, self.boxAddMenuItem) self.Bind(wx.EVT_MENU, self.Gate, gate) self.selectActor = vtk.vtkLODActor() self.planes = {} #vtk.vtkPlanes() self.clipper = vtk.vtkClipPolyData() self.boxCount = 1 self.boxIds = {} self.Show() self.SendSizeEvent()
def __init__(self, *args, **kwargs): """Initializer. """ self._aspect_ratio = kwargs.get('aspect_ratio', (4, 3)) self.render_window = wxVTKRenderWindowInteractor(self, -1) # disable widget (to avoid rendering) self.render_window.Enable(False) # Hook exit event. self.render_window.AddObserver('ExitEvent', self.ObserverExitEventHandler) self.renderers = [] # events self.Bind(wx.EVT_SIZE, self.OnSize)
def simplewx(ren,title='Tractarian',width=600,height=400): ''' Create a simple wx window and render vtk inside ''' print('Using wx') app = wx.PySimpleApp() frame = wx.Frame(None, -1, title, size=(width,height)) sh.widget = wxvi.wxVTKRenderWindowInteractor(frame, -1) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(sh.widget, 1, wx.EXPAND) frame.SetSizer(sizer) frame.Layout() sh.widget.Enable(1) sh.widget.AddObserver("ExitEvent", lambda o,e,f=frame: f.Close()) sh.widget.GetRenderWindow().AddRenderer(ren) frame.Show() app.MainLoop() return
def _create_control(self, parent): """ Create the toolkit-specific control that represents the widget. """ # Create the VTK widget. self._vtk_control = window = wxVTKRenderWindowInteractor(parent, -1, stereo=self.stereo) # Override these handlers. wx.EVT_CHAR(window, None) # Remove the default handler. wx.EVT_CHAR(window, self.OnKeyDown) wx.EVT_KEY_UP(window, None) # Remove the default handler. wx.EVT_KEY_UP(window, self.OnKeyUp) wx.EVT_PAINT(window, None) # Remove the default handler. wx.EVT_PAINT(window, self.OnPaint) wx.EVT_SIZE(window, None) # Remove the default handler. wx.EVT_SIZE(window, self.OnSize) # Override the button down and up handlers as well to note the # interaction. This is to toggle the busy status nicely. for evt in (wx.EVT_LEFT_DOWN, wx.EVT_RIGHT_DOWN, wx.EVT_MIDDLE_DOWN): evt(window, None) evt(window, self.OnButtonDown) for evt in (wx.EVT_LEFT_UP, wx.EVT_RIGHT_UP, wx.EVT_MIDDLE_UP): evt(window, None) evt(window, self.OnButtonUp) # Enable the widget. window.Enable(1) # Switch the default interaction style to the trackball one. window.GetInteractorStyle().SetCurrentStyleToTrackballCamera() # Grab the renderwindow. renwin = self._renwin = tvtk.to_tvtk(window.GetRenderWindow()) renwin.set(point_smoothing=self.point_smoothing, line_smoothing=self.line_smoothing, polygon_smoothing=self.polygon_smoothing) # Create a renderer and add it to the renderwindow self._renderer = tvtk.Renderer() renwin.add_renderer(self._renderer) # Save a reference to our camera so it is not GC'd -- needed for # the sync_traits to work. self._camera = self.camera # Sync various traits. self._renderer.background = self.background self.sync_trait('background', self._renderer) self.renderer.on_trait_change(self.render, 'background') self._camera.parallel_projection = self.parallel_projection self.sync_trait('parallel_projection', self._camera) renwin.off_screen_rendering = self.off_screen_rendering self.sync_trait('off_screen_rendering', self._renwin) self.render_window.on_trait_change(self.render, 'off_screen_rendering') self.render_window.on_trait_change(self.render, 'stereo_render') self.render_window.on_trait_change(self.render, 'stereo_type') self.camera.on_trait_change(self.render, 'parallel_projection') def _show_parent_hack(window, parent): """A hack to get the VTK scene properly setup for use.""" # Force the parent to show itself. parent.Show(1) # on some platforms, this SetSize() is necessary to cause # an OnPaint() when the event loop begins; else we get an # empty window until we force a redraw. window.SetSize(parent.GetSize()) # This is necessary on slow machines in order to force the # wx events to be handled. wx.GetApp().Yield(True) window.Render() if wx.Platform == '__WXMSW__': _show_parent_hack(window, parent) else: if (wx.VERSION[0] == 2) and (wx.VERSION[1] < 5): _show_parent_hack(window, parent) window.Update() # Because of the way the VTK widget is setup, and because we # set the size above, the window sizing is usually completely # messed up when the application window is shown. To work # around this a dynamic IDLE event handler is added and # immediately removed once it executes. This event handler # simply forces a resize to occur. The _idle_count allows us # to execute the idle function a few times (this seems to work # better). def _do_idle(event, window=window): w = wx.GetTopLevelParent(window) # Force a resize sz = w.GetSize() w.SetSize((sz[0]-1, sz[1]-1)) w.SetSize(sz) window._idle_count -= 1 if window._idle_count < 1: wx.EVT_IDLE(window, None) del window._idle_count window._idle_count = 2 wx.EVT_IDLE(window, _do_idle) self._interactor = tvtk.to_tvtk(window._Iren) return window