Commit ccffc4598b2b2858b8020c7ed5c4062a28881034

Authored by Renan
1 parent 956ad569
Exists in master

FIX: brain mesh peel from file

invesalius/data/brainmesh_handler.py
... ... @@ -7,17 +7,18 @@ import numpy as np
7 7  
8 8 import invesalius.data.slice_ as sl
9 9 from invesalius.data.converters import to_vtk
10   -
  10 +import invesalius.data.vtk_utils as vtk_utils
11 11  
12 12 class Brain:
13   - def __init__(self, n_peels, window_width, window_level, affine_vtk=None):
  13 + def __init__(self, n_peels, window_width, window_level, affine, inv_proj):
14 14 # Create arrays to access the peel data and peel Actors
15 15 self.peel = []
16 16 self.peelActors = []
17 17 self.window_width = window_width
18 18 self.window_level = window_level
19 19 self.numberOfPeels = n_peels
20   - self.affine_vtk = affine_vtk
  20 + self.affine = affine
  21 + self.inv_proj = inv_proj
21 22  
22 23 def from_mask(self, mask):
23 24 mask= np.array(mask.matrix[1:, 1:, 1:])
... ... @@ -52,6 +53,7 @@ class Brain:
52 53 def from_mask_file(self, mask_path):
53 54 slic = sl.Slice()
54 55 image = slic.matrix
  56 + image = np.flip(image, axis=1)
55 57 image = to_vtk(image, spacing=slic.spacing)
56 58  
57 59 # Read the mask
... ... @@ -69,13 +71,10 @@ class Brain:
69 71 self._do_surface_creation(mask, mask_sFormMatrix)
70 72  
71 73  
72   - def _do_surface_creation(self, mask, mask_sFormMatrix=None, qFormMatrix=None):
  74 + def _do_surface_creation(self, mask, mask_sFormMatrix=None):
73 75 if mask_sFormMatrix is None:
74 76 mask_sFormMatrix = vtk.vtkMatrix4x4()
75 77  
76   - if qFormMatrix is None:
77   - qFormMatrix = vtk.vtkMatrix4x4()
78   -
79 78 value = np.mean(mask.GetScalarRange())
80 79  
81 80 # Use the mask to create isosurface
... ... @@ -115,14 +114,13 @@ class Brain:
115 114 tmpPeel = cleanMesh(tmpPeel)
116 115  
117 116 refImageSpace2_xyz_transform = vtk.vtkTransform()
118   - refImageSpace2_xyz_transform.SetMatrix(qFormMatrix)
  117 + refImageSpace2_xyz_transform.SetMatrix(vtk_utils.numpy_to_vtkMatrix4x4(np.linalg.inv(self.affine)))
119 118  
120 119 self.refImageSpace2_xyz = vtk.vtkTransformPolyDataFilter()
121 120 self.refImageSpace2_xyz.SetTransform(refImageSpace2_xyz_transform)
122 121  
123 122 xyz2_refImageSpace_transform = vtk.vtkTransform()
124   - qFormMatrix.Invert()
125   - xyz2_refImageSpace_transform.SetMatrix(qFormMatrix)
  123 + xyz2_refImageSpace_transform.SetMatrix(vtk_utils.numpy_to_vtkMatrix4x4(self.affine))
126 124  
127 125 self.xyz2_refImageSpace = vtk.vtkTransformPolyDataFilter()
128 126 self.xyz2_refImageSpace.SetTransform(xyz2_refImageSpace_transform)
... ... @@ -138,14 +136,22 @@ class Brain:
138 136 self.peel_centers = vtk.vtkFloatArray()
139 137 self.peel.append(newPeel)
140 138 self.currentPeelActor = vtk.vtkActor()
141   - if self.affine_vtk:
142   - self.currentPeelActor.SetUserMatrix(self.affine_vtk)
  139 + if not np.all(np.equal(self.affine, np.eye(4))):
  140 + affine_vtk = self.CreateTransformedVTKAffine()
  141 + self.currentPeelActor.SetUserMatrix(affine_vtk)
143 142 self.GetCurrentPeelActor(currentPeel)
144 143 self.peelActors.append(self.currentPeelActor)
145 144 # locator will later find the triangle on the peel surface where the coil's normal intersect
146 145 self.locator = vtk.vtkCellLocator()
147 146 self.PeelDown(currentPeel)
148 147  
  148 + def CreateTransformedVTKAffine(self):
  149 + affine_transformed = self.affine.copy()
  150 + matrix_shape = tuple(self.inv_proj.Project().matrix_shape)
  151 + affine_transformed[1, -1] -= matrix_shape[1]
  152 +
  153 + return vtk_utils.numpy_to_vtkMatrix4x4(affine_transformed)
  154 +
149 155 def get_actor(self, n):
150 156 return self.GetPeelActor(n)
151 157  
... ... @@ -216,8 +222,9 @@ class Brain:
216 222  
217 223 def TransformPeelPosition(self, p):
218 224 peel_transform = vtk.vtkTransform()
219   - if self.affine_vtk:
220   - peel_transform.SetMatrix(self.affine_vtk)
  225 + if not np.all(np.equal(self.affine, np.eye(4))):
  226 + affine_vtk = self.CreateTransformedVTKAffine()
  227 + peel_transform.SetMatrix(affine_vtk)
221 228 refpeelspace = vtk.vtkTransformPolyDataFilter()
222 229 refpeelspace.SetInputData(self.peel[p])
223 230 refpeelspace.SetTransform(peel_transform)
... ...
invesalius/gui/task_navigator.py
... ... @@ -2023,18 +2023,14 @@ class TractographyPanel(wx.Panel):
2023 2023 slic = sl.Slice()
2024 2024 ww = slic.window_width
2025 2025 wl = slic.window_level
2026   - affine_vtk = vtk.vtkMatrix4x4()
2027   -
  2026 + affine = np.eye(4)
2028 2027 if method == peels_dlg.FROM_FILES:
2029   - matrix_shape = tuple(inv_proj.matrix_shape)
2030 2028 try:
2031 2029 affine = slic.affine.copy()
2032 2030 except AttributeError:
2033   - affine = np.eye(4)
2034   - affine[1, -1] -= matrix_shape[1]
2035   - affine_vtk = vtk_utils.numpy_to_vtkMatrix4x4(affine)
  2031 + pass
2036 2032  
2037   - self.brain_peel = brain.Brain(self.n_peels, ww, wl, affine_vtk)
  2033 + self.brain_peel = brain.Brain(self.n_peels, ww, wl, affine, inv_proj)
2038 2034 if method == peels_dlg.FROM_MASK:
2039 2035 choices = [i for i in inv_proj.mask_dict.values()]
2040 2036 mask_index = peels_dlg.cb_masks.GetSelection()
... ...