class SceneWithBrowser(SplitPanel): """ Provides an Scene along with an embedded PyCrust Python shell. In the shell, 'scene' and 's' are bound to the Scene.""" # The ratio of the size of the left/top pane to the right/bottom pane. ratio = Float(0.3) # The direction in which the panel is split. direction = Str('vertical') # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The `PythonShell` instance. browser = Instance(PipelineBrowser) ########################################################################### # `IWidget` interface. ########################################################################### def destroy(self): if self.scene is not None: self.scene.close() super(SceneWithBrowser, self).destroy() ########################################################################### # Protected 'SplitPanel' interface. ########################################################################### def _create_lhs(self, parent): """ Creates the left hand side or top depending on the style. """ self._create_scene(parent) self.browser = PipelineBrowser(self.scene) if parent is not None: parent.show() self.browser.show(parent=parent) return self.browser._ui.control def _create_rhs(self, parent): """ Creates the right hand side or bottom depending on the style. 's' and 'scene' are bound to the Scene instance.""" self._create_scene(parent) self.scene.renderer.background = 0.5, 0.5, 0.5 return self.scene.control ########################################################################### # Private 'SceneWithBrowser' interface. ########################################################################### def _create_scene(self, parent): """ Make sure that the scene has been created. """ if self.scene is None: self.scene = DecoratedScene(parent)
connect_ = tvtk.PolyDataConnectivityFilter(extraction_mode=4) connect = mlab.pipeline.user_defined(smooth, filter=connect_) # Compute normals for shading the surface compute_normals = mlab.pipeline.poly_data_normals(connect) compute_normals.filter.feature_angle = 80 surf = mlab.pipeline.surface(compute_normals, color=(0.9, 0.72, 0.62)) #---------------------------------------------------------------------- # Display a cut plane of the raw data ipw = mlab.pipeline.image_plane_widget(src, colormap='bone', plane_orientation='z_axes', slice_index=55) mlab.view(-165, 32, 350, [143, 133, 73]) mlab.roll(180) fig.scene.disable_render = False #---------------------------------------------------------------------- # To make the link between the Mayavi pipeline and the much more # complex VTK pipeline, we display both: mlab.show_pipeline(rich_view=False) from tvtk.pipeline.browser import PipelineBrowser browser = PipelineBrowser(fig.scene) browser.show() mlab.show()
def isosurfacing(data): """data should be a 3d array with channel last.""" # Heuristic for finding the threshold for the brain # Exctract the percentile 20 and 80 (without using # scipy.stats.scoreatpercentile) # sorted_data = np.sort(data.ravel()) # l = len(sorted_data) # lower_thr = sorted_data[int(0.2 * l)] # upper_thr = sorted_data[int(0.8 * l)] # The white matter boundary: find the densest part of the upper half # of histogram, and take a value 10% higher, to cut _in_ the white matter # hist, bins = np.histogram(data[data > np.mean(data)], bins=50) # brain_thr_idx = np.argmax(hist) # brain_thr = bins[brain_thr_idx + 4] # del hist, bins, brain_thr_idx # Display the data ############################################################# fig = mlab.figure(bgcolor=(0, 0, 0), size=(400, 500)) # to speed things up fig.scene.disable_render = True src = mlab.pipeline.scalar_field(data) # Our data is not equally spaced in all directions: src.spacing = [1, 1, 20] src.update_image_data = True #---------------------------------------------------------------------- # Brain extraction pipeline # In the following, we create a Mayavi pipeline that strongly # relies on VTK filters. For this, we make heavy use of the # mlab.pipeline.user_defined function, to include VTK filters in # the Mayavi pipeline. # Apply image-based filters to clean up noise # thresh_filter = tvtk.ImageThreshold() # thresh_filter.threshold_between(lower_thr, upper_thr) # thresh = mlab.pipeline.user_defined(src, filter=thresh_filter) median_filter = tvtk.ImageMedian3D() median_filter.kernel_size = [3, 3, 3] median = mlab.pipeline.user_defined(src, filter=median_filter) diffuse_filter = tvtk.ImageAnisotropicDiffusion3D( diffusion_factor=1.0, diffusion_threshold=100.0, number_of_iterations=5, ) diffuse = mlab.pipeline.user_defined(median, filter=diffuse_filter) # Extract brain surface contour = mlab.pipeline.contour(diffuse, ) contour.filter.contours = [0.5, ] # Apply mesh filter to clean up the mesh (decimation and smoothing) dec = mlab.pipeline.decimate_pro(mlab.pipeline.triangle_filter(contour)) dec.filter.feature_angle = 60. dec.filter.target_reduction = 0.5 smooth_ = tvtk.SmoothPolyDataFilter( number_of_iterations=10, relaxation_factor=0.1, feature_angle=60, feature_edge_smoothing=False, boundary_smoothing=False, convergence=0., ) smooth = mlab.pipeline.user_defined(dec, filter=smooth_) # Get the largest connected region connect_ = tvtk.PolyDataConnectivityFilter(extraction_mode=4) connect = mlab.pipeline.user_defined(smooth, filter=connect_) # Compute normals for shading the surface compute_normals = mlab.pipeline.poly_data_normals(connect) compute_normals.filter.feature_angle = 80 surf = mlab.pipeline.surface(compute_normals, color=(1, 1, 1)) #---------------------------------------------------------------------- # Display a cut plane of the raw data ipw = mlab.pipeline.image_plane_widget(src, colormap='bone', plane_orientation='z_axes', slice_index=55) # mlab.view(-165, 32, 350, [143, 133, 73]) # mlab.roll(180) fig.scene.disable_render = False #---------------------------------------------------------------------- # To make the link between the Mayavi pipeline and the much more # complex VTK pipeline, we display both: mlab.show_pipeline(rich_view=False) from tvtk.pipeline.browser import PipelineBrowser browser = PipelineBrowser(fig.scene) browser.show() mlab.show()
class BrowserView(View): """ The TVTK pipeline browser view. """ #### 'IWorkbenchPart' interface ########################################### # The part's name (displayed to the user). name = 'TVTK Pipeline Browser' #### 'IView' interface #################################################### # The position of the view relative to the item specified in the # 'relative_to' trait. position = 'left' #### 'BrowserView' interface ############################################## # The pipeline browser instance that we are a view of. browser = Instance('tvtk.pipeline.browser.PipelineBrowser') # The scene manager. scene_manager = Instance( 'tvtk.plugins.scene.i_scene_manager.ISceneManager' ) ########################################################################### # 'IWorkbenchPart' interface. ########################################################################### def create_control(self, parent): """ Create the toolkit-specific control that represents the view. """ from tvtk.pipeline.browser import PipelineBrowser self.browser = PipelineBrowser() self.browser.show(parent=parent) return self.browser.ui.control ########################################################################### # Private interface. ########################################################################### #### Trait change handlers ################################################ @on_trait_change('scene_manager:scenes_items') def _on_scenes_changed(self, event): """ Dynamic trait change handler. This is called when scenes are added/removed from the scene manager, it is used to add and remove objects from the pipeline. """ # Scenes that were removed. map(self._remove_scene, event.removed) # Scenes that were added. map(self._add_scene, event.added) return #### Methods ############################################################## def _add_scene(self, scene): """ Add the specified scene to the pipeline browser. """ self.browser.renwins.append(scene) self.browser.root_object.append(scene.render_window) return def _remove_scene(self, scene): """ Remove the specified scene from the pipeline browser. """ if scene in self.browser.renwins: self.browser.renwins.remove(scene) self.browser.root_object.remove(scene.render_window) return