From 8f68c9cd843276e3385345e6650394d32163ce38 Mon Sep 17 00:00:00 2001 From: Thiago Franco de Moraes Date: Tue, 12 Jul 2016 15:16:34 -0300 Subject: [PATCH] Only testing --- invesalius/data/converters.py | 22 ++++++++++++++++++++++ invesalius/data/slice_data.py | 1 + invesalius/data/viewer_slice.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/invesalius/data/converters.py b/invesalius/data/converters.py index 93df985..c44a6db 100644 --- a/invesalius/data/converters.py +++ b/invesalius/data/converters.py @@ -56,3 +56,25 @@ def to_vtk(n_array, spacing, slice_number, orientation): image_copy.DeepCopy(image) return image_copy + + +def np_rgba_to_vtk(n_array, spacing=(1.0, 1.0, 1.0)): + dy, dx, dc = n_array.shape + v_image = numpy_support.numpy_to_vtk(n_array.reshape(dy*dx, dc)) + + extent = (0, dx -1, 0, dy -1, 0, 0) + + # Generating the vtkImageData + image = vtk.vtkImageData() + image.SetOrigin(0, 0, 0) + image.SetSpacing(spacing) + image.SetDimensions(dx, dy, 1) + # SetNumberOfScalarComponents and SetScalrType were replaced by + # AllocateScalars + # image.SetNumberOfScalarComponents(1) + # image.SetScalarType(numpy_support.get_vtk_array_type(n_array.dtype)) + image.AllocateScalars(numpy_support.get_vtk_array_type(n_array.dtype), dc) + image.SetExtent(extent) + image.GetPointData().SetScalars(v_image) + + return image diff --git a/invesalius/data/slice_data.py b/invesalius/data/slice_data.py index 92d2929..c40dece 100644 --- a/invesalius/data/slice_data.py +++ b/invesalius/data/slice_data.py @@ -38,6 +38,7 @@ class SliceData(object): self.number = 0 self.orientation = 'AXIAL' self.renderer = None + self.canvas_renderer = None self.overlay_renderer = None self.__create_text() self.__create_box() diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index 91280af..714acb5 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -23,7 +23,7 @@ import collections import itertools import tempfile -import numpy +import numpy as np import vtk from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor @@ -46,6 +46,8 @@ import project import slice_data as sd import utils +from data import converters + from data import measures ID_TO_TOOL_ITEM = {} @@ -144,6 +146,50 @@ class ContourMIPConfig(wx.Panel): self.txt_mip_border.Disable() +class CanvasRendererCTX: + def __init__(self, viewer): + self.viewer = viewer + self.canvas_renderer = viewer.slice_data.canvas_renderer + self._size = self.canvas_renderer.GetSize() + self._init_canvas() + viewer.slice_data.renderer.AddObserver("EndEvent", self.OnPaint) + + def _init_canvas(self): + w, h = self._size + self._array = np.empty((h, w, 4), dtype=np.uint8) + + self._cv_image = converters.np_rgba_to_vtk(self._array) + + self.mapper = vtk.vtkImageMapper() + self.mapper.SetInputData(self._cv_image) + self.mapper.SetColorWindow(255) + self.mapper.SetColorLevel(128) + + self.actor = vtk.vtkActor2D() + self.actor.SetPosition(0, 0) + self.actor.SetMapper(self.mapper) + self.actor.GetProperty().SetOpacity(0.99) + + self.canvas_renderer.AddActor2D(self.actor) + + def _resize_canvas(self, w, h): + self._array = np.empty((h, w, 4), dtype=np.uint8) + self._cv_image = converters.np_rgba_to_vtk(self._array) + self.mapper.SetInputData(self._cv_image) + self.mapper.Update() + + def OnPaint(self, evt, obj): + size = self.canvas_renderer.GetSize() + w, h = size + if self._size != size: + self._size = size + self._resize_canvas(w, h) + + self._array[:] = 0 + self._array[150:500, 150:500, 0] = 255 + self._array[150:500, 150:500, 3] = 127 + self._cv_image.Modified() + class Viewer(wx.Panel): @@ -896,6 +942,8 @@ class Viewer(wx.Panel): self.cam = self.slice_data.renderer.GetActiveCamera() self.__build_cross_lines() + canvas = CanvasRendererCTX(self) + # Set the slice number to the last slice to ensure the camera if far # enough to show all slices. self.set_slice_number(max_slice_number - 1) @@ -958,13 +1006,20 @@ class Viewer(wx.Panel): renderer.SetLayer(0) cam = renderer.GetActiveCamera() + canvas_renderer = vtk.vtkRenderer() + canvas_renderer.SetLayer(1) + canvas_renderer.SetActiveCamera(cam) + canvas_renderer.SetInteractive(0) + canvas_renderer.PreserveDepthBufferOn() + overlay_renderer = vtk.vtkRenderer() - overlay_renderer.SetLayer(1) + overlay_renderer.SetLayer(2) overlay_renderer.SetActiveCamera(cam) overlay_renderer.SetInteractive(0) - - self.interactor.GetRenderWindow().SetNumberOfLayers(2) + + self.interactor.GetRenderWindow().SetNumberOfLayers(3) self.interactor.GetRenderWindow().AddRenderer(overlay_renderer) + self.interactor.GetRenderWindow().AddRenderer(canvas_renderer) self.interactor.GetRenderWindow().AddRenderer(renderer) actor = vtk.vtkImageActor() @@ -974,12 +1029,14 @@ class Viewer(wx.Panel): slice_data = sd.SliceData() slice_data.SetOrientation(self.orientation) slice_data.renderer = renderer + slice_data.canvas_renderer = canvas_renderer slice_data.overlay_renderer = overlay_renderer slice_data.actor = actor slice_data.SetBorderStyle(sd.BORDER_ALL) renderer.AddActor(actor) renderer.AddActor(slice_data.text.actor) renderer.AddViewProp(slice_data.box_actor) + return slice_data def __update_camera(self): -- libgit2 0.21.2