def reset_view(self): center = self.shape * self.spacing / 2. + (self.shape + 1) % 2 * self.spacing / 2. width = (self.shape * self.spacing)[:2] width = np.min(width) * 0.5 self.scene.scene.background = (0, 0, 0) mlab.view(*([(0, 0), (90, 0), (0, 0)][self.axis]), focalpoint=center, figure=self.scene.mayavi_scene) self.scene.scene.parallel_projection = True self.scene.scene.camera.parallel_scale = width * 1.2 self.scene.scene.interactor.interactor_style = tvtk.InteractorStyleImage( ) try: #WX window self.scene.scene_editor.control.SetFocusFromKbd def focusfunc(vtkobj, i): self.scene.scene_editor.control.SetFocusFromKbd() except AttributeError: #QT window self.scene.scene_editor.control.setFocus def focusfunc(vtkobj, i): self.scene.scene_editor.control.setFocus() self.scene.interactor.add_observer("MouseMoveEvent", focusfunc) self.scene.interactor.add_observer("KeyReleaseEvent", self.handle_keys) self._outline_color_changed()
def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) # To avoid copying the data, we take a reference to the # raw VTK dataset, and pass it on to mlab. Mlab will create # a Mayavi source from the VTK without copying it. # We have to specify the figure so that the data gets # added on the figure we are interested in. outline = mlab.pipeline.outline( self.data_src3d.mlab_source.dataset, figure=scene.mayavi_scene, ) ipw = mlab.pipeline.image_plane_widget(outline, plane_orientation='%s_axes' % axis_name) setattr(self, 'ipw_%s' % axis_name, ipw) # Synchronize positions between the corresponding image plane # widgets on different views. ipw.ipw.sync_trait('slice_position', getattr(self, 'ipw_3d_%s' % axis_name).ipw) # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 # Add a callback on the image plane widget interaction to # move the others def move_view(obj, evt): position = obj.GetCurrentCursorPosition() for other_axis, axis_number in self._axis_names.iteritems(): if other_axis == axis_name: continue ipw3d = getattr(self, 'ipw_3d_%s' % other_axis) ipw3d.ipw.slice_position = position[axis_number] ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5 * self.data.shape[ self._axis_names[axis_name]] # choose the flag style lut and reverse it # this makes it nice for segmentations ipw.parent.scalar_lut_manager.lut_mode = 'flag' ipw.parent.scalar_lut_manager.reverse_lut = True ipw.ipw.reslice_interpolate = 'nearest_neighbour' # Position the view for the scene views = dict( x=(0, 90), y=(90, 90), z=(0, 0), ) scene.mlab.view(*views[axis_name]) # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0)
def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) # To avoid copying the data, we take a reference to the # raw VTK dataset, and pass it on to mlab. Mlab will create # a Mayavi source from the VTK without copying it. # We have to specify the figure so that the data gets # added on the figure we are interested in. outline = mlab.pipeline.outline( self.data_src3d.mlab_source.dataset, figure=scene.mayavi_scene, ) ipw = mlab.pipeline.image_plane_widget(outline, plane_orientation='%s_axes' % axis_name) setattr(self, 'ipw_%s' % axis_name, ipw) # Synchronize positions between the corresponding image plane # widgets on different views. ipw.ipw.sync_trait('slice_position', getattr(self, 'ipw_3d_%s' % axis_name).ipw) # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 # Add a callback on the image plane widget interaction to # move the others def move_view(obj, evt): position = obj.GetCurrentCursorPosition() for other_axis, axis_number in self._axis_names.items(): if other_axis == axis_name: continue ipw3d = getattr(self, 'ipw_3d_%s' % other_axis) ipw3d.ipw.slice_position = position[axis_number] ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5 * self.data.shape[ self._axis_names[axis_name]] # Position the view for the scene views = dict( x=(0, 90), y=(90, 90), z=(0, 0), ) scene.mlab.view(*views[axis_name]) # 2D interaction: only pan and zoom if axis_name == 'y': scene.mlab.xlabel('Longitude (deg)') scene.mlab.zlabel('Depth (km)') scene.mlab.axes(z_axis_visibility=False) elif axis_name == 'x': scene.mlab.ylabel('Latitude (deg)') scene.mlab.zlabel('Depth (km)') scene.mlab.axes(z_axis_visibility=False) elif axis_name == 'z': scene.mlab.xlabel('Longitude (deg)') scene.mlab.ylabel('Latitude (deg)') scene.mlab.axes(z_axis_visibility=False) scene.mlab.axes(ranges=[176.144, 176.249, -38.68, -38.493, 7., 0.], nb_labels=8) scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0)
def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) scene.scene.parallel_projection = True ipw_3d = getattr(self, 'ipw_3d_%s' % axis_name) # We create the image_plane_widgets in the side view using a # VTK dataset pointing to the data on the corresponding # image_plane_widget in the 3D view (it is returned by # ipw_3d._get_reslice_output()) side_src = ipw_3d.ipw._get_reslice_output() ipw = mlab.pipeline.image_plane_widget( side_src, colormap='gray', plane_orientation='z_axes', vmin=self.data.min(), vmax=self.data.max(), figure=scene.mayavi_scene, name='Cut view %s' % axis_name, # name='', ) setattr(self, 'ipw_%s' % axis_name, ipw) # Extract the spacing of the side_src to convert coordinates # into indices spacing = side_src.spacing # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 x, y, z = self.position cursor = mlab.points3d( x, y, z, mode='axes', color=(0, 0, 0), opacity=0, # mode = '2ddash', scale_factor=2 * max(self.data.shape), figure=scene.mayavi_scene, name='Cursor view %s' % axis_name, ) self.cursors[axis_name] = cursor # Add a callback on the image plane widget interaction to # move the others this_axis_number = self._axis_names[axis_name] def move_view(obj, evt): # Disable rendering on all scene position = list(obj.GetCurrentCursorPosition() * spacing)[:2] position.insert(this_axis_number, self.position[this_axis_number]) # We need to special case y, as the view has been rotated. if axis_name is 'y': position = position[::-1] self.position = position ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5 * self.data.shape[ self._axis_names[axis_name]] # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) # Some text: mlab.text(0.01, 0.8, axis_name, width=0.02) # Choose a view that makes sens views = dict(x=(0, 0), y=(90, 180), z=(0, 0)) mlab.view(views[axis_name][0], views[axis_name][1], focalpoint=0.5 * np.array(self.data.shape), figure=scene.mayavi_scene) scene.scene.camera.parallel_scale = 0.52 * np.mean(self.data.shape)
def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) ### # if axis_name=='z': # pts = self.make_ipw_3d('z',False) # out = mlab.pipeline.probe_data(pts, 50, 50, 50) # print(out) ### # To avoid copying the data, we take a reference to the # raw VTK dataset, and pass it on to mlab. Mlab will create # a Mayavi source from the VTK without copying it. # We have to specify the figure so that the data gets # added on the figure we are interested in. outline = mlab.pipeline.outline( self.data_src3d.mlab_source.dataset, figure=scene.mayavi_scene, ) ipw = mlab.pipeline.image_plane_widget(outline, plane_orientation='%s_axes' % axis_name, name='Cut view %s' % axis_name) setattr(self, 'ipw_%s' % axis_name, ipw) # Synchronize positions between the corresponding image plane # widgets on different views. ipw.ipw.sync_trait('slice_position', getattr(self, 'ipw_3d_%s' % axis_name).ipw) # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 # Add a callback on the image plane widget interaction to # move the others def move_view(obj, evt): position = obj.GetCurrentCursorPosition() for other_axis, axis_number in self._axis_names.items(): if other_axis == axis_name: continue ipw3d = getattr(self, 'ipw_3d_%s' % other_axis) ipw3d.ipw.slice_position = position[axis_number] if axis_name == 'x': xpos, ypos, zpos = position a = [] for i in range(100): out = mlab.pipeline.probe_data(ipw, i, ypos, zpos) a.append([out]) print('Y, Z cut at ' + '{0:.6f} um, {1:.6f} um'.format( y_array[int(ypos)] * 1e3, z_array[int(zpos)] * 1e3)) if axis_name == 'y': xpos, ypos, zpos = position a = [] for i in range(100): out = mlab.pipeline.probe_data(ipw, xpos, i, zpos) a.append([out]) print('X, Z cut at ' + '{0:.6f} um, {1:.6f} um'.format( x_array[int(xpos)] * 1e3, z_array[int(zpos)] * 1e3)) ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5 * self.data.shape[ self._axis_names[axis_name]] # Position the view for the scene views = dict( x=(0, 90), y=(90, 90), z=(0, 0), ) scene.mlab.view(*views[axis_name]) # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) # Label: if axis_name == 'x': mlab.text(0.01, 0.9, 'Plane YZ', width=0.2) if axis_name == 'y': mlab.text(0.01, 0.9, 'Plane XZ', width=0.2) if axis_name == 'z': mlab.text(0.01, 0.9, 'Plane XY', width=0.2)
def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) # To avoid copying the data, we take a reference to the # raw VTK dataset, and pass it on to mlab. Mlab will create # a Mayavi source from the VTK without copying it. # We have to specify the figure so that the data gets # added on the figure we are interested in. outline = mlab.pipeline.outline( self.data_src3d.mlab_source.dataset, figure=scene.mayavi_scene, ) ipw = mlab.pipeline.image_plane_widget(outline, plane_orientation='%s_axes' % axis_name) setattr(self, 'ipw_%s' % axis_name, ipw) # Synchronize positions between the corresponding image plane # widgets on different views. ipw.ipw.sync_trait('slice_position', getattr(self, 'ipw_3d_%s' % axis_name).ipw) # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 # Add a callback on the image plane widget interaction to # move the others def move_view(obj, evt): position = obj.GetCurrentCursorPosition() for other_axis, axis_number in iteritems( self.controller.LOCAL_AXIS_NUMBERS): ipw3d = getattr(self, 'ipw_3d_{}'.format(other_axis)) if other_axis == axis_name: axis_index_value = int(round(ipw3d.ipw.slice_position)) - 1 else: axis_index_value = int(round(position[axis_number])) axis_index_name = '{}_index'.format(other_axis) setattr(self, axis_index_name, axis_index_value) if other_axis == axis_name: continue ipw3d.ipw.slice_position = position[axis_number] #setattr(self, '{}_index'.format(other_axis), int(round(position[axis_number]))) ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = getattr(self, "{}_index".format(axis_name)) # Position the view for the scene views = dict( x=(0, 90), y=(90, 90), z=(0, 0), ) scene.mlab.view(*views[axis_name]) # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) # Some text: setattr(self, "_{}_label".format(axis_name), self.draw_axis_name(axis_name))