Commit 9cbf791e35f212fdf2b10ddf976636fb6581c7e9

Authored by Thiago Franco de Moraes
1 parent 91ea38bc
Exists in interactor_style

Created a new interactor style to handle the editor

invesalius/data/styles.py
... ... @@ -138,17 +138,6 @@ class CrossInteractorStyle(DefaultInteractorStyle):
138 138  
139 139 iren.Render()
140 140  
141   - def get_coordinate_cursor(self):
142   - # Find position
143   - x, y, z = self.picker.GetPickPosition()
144   - bounds = self.slice_actor.GetBounds()
145   - if bounds[0] == bounds[1]:
146   - x = bounds[0]
147   - elif bounds[2] == bounds[3]:
148   - y = bounds[2]
149   - elif bounds[4] == bounds[5]:
150   - z = bounds[4]
151   - return x, y, z
152 141  
153 142 def calcultate_scroll_position(self, position):
154 143 # Based in the given coord (x, y, z), returns a list with the scroll positions for each
... ... @@ -444,6 +433,145 @@ class ChangeSliceInteractorStyle(DefaultInteractorStyle):
444 433 self.last_position = position[1]
445 434  
446 435  
  436 +class EditorInteractorStyle(DefaultInteractorStyle):
  437 + def __init__(self, viewer):
  438 + DefaultInteractorStyle.__init__(self, viewer)
  439 +
  440 + self.viewer = viewer
  441 + self.orientation = self.viewer.orientation
  442 +
  443 + self.picker = vtk.vtkWorldPointPicker()
  444 +
  445 + self.AddObserver("EnterEvent", self.OnEnterInteractor)
  446 + self.AddObserver("LeaveEvent", self.OnLeaveInteractor)
  447 +
  448 + self.AddObserver("LeftButtonPressEvent", self.OnBrushClick)
  449 + self.AddObserver("LeftButtonReleaseEvent", self.OnBrushClick)
  450 + self.AddObserver("MouseMoveEvent", self.OnBrushMove)
  451 +
  452 + def OnEnterInteractor(self, obj, evt):
  453 + if (self.viewer.slice_.buffer_slices[self.orientation].mask is None):
  454 + return
  455 + self.viewer.slice_data.cursor.Show()
  456 + self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK))
  457 + self.viewer.interactor.Render()
  458 +
  459 + def OnLeaveInteractor(self, obj, evt):
  460 + self.viewer.slice_data.cursor.Show(0)
  461 + self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
  462 + self.viewer.interactor.Render()
  463 +
  464 + def OnBrushClick(self, obj, evt):
  465 + if (self.viewer.slice_.buffer_slices[self.orientation].mask is None):
  466 + return
  467 +
  468 + viewer = self.viewer
  469 + iren = viewer.interactor
  470 +
  471 + viewer._set_editor_cursor_visibility(1)
  472 +
  473 + mouse_x, mouse_y = iren.GetEventPosition()
  474 + render = iren.FindPokedRenderer(mouse_x, mouse_y)
  475 + slice_data = viewer.get_slice_data(render)
  476 +
  477 + # TODO: Improve!
  478 + #for i in self.slice_data_list:
  479 + #i.cursor.Show(0)
  480 + slice_data.cursor.Show()
  481 +
  482 + self.picker.Pick(mouse_x, mouse_y, 0, render)
  483 +
  484 + coord = self.get_coordinate_cursor()
  485 + position = slice_data.actor.GetInput().FindPoint(coord)
  486 +
  487 + if position != -1:
  488 + coord = slice_data.actor.GetInput().GetPoint(position)
  489 +
  490 + slice_data.cursor.SetPosition(coord)
  491 + cursor = slice_data.cursor
  492 + radius = cursor.radius
  493 +
  494 + if position < 0:
  495 + position = viewer.calculate_matrix_position(coord)
  496 +
  497 + viewer.slice_.edit_mask_pixel(viewer._brush_cursor_op, cursor.GetPixels(),
  498 + position, radius, viewer.orientation)
  499 + viewer._flush_buffer = True
  500 +
  501 + # TODO: To create a new function to reload images to viewer.
  502 + viewer.OnScrollBar()
  503 +
  504 + def OnBrushMove(self, obj, evt):
  505 + if (self.viewer.slice_.buffer_slices[self.orientation].mask is None):
  506 + return
  507 +
  508 + viewer = self.viewer
  509 + iren = viewer.interactor
  510 +
  511 + viewer._set_editor_cursor_visibility(1)
  512 +
  513 + mouse_x, mouse_y = iren.GetEventPosition()
  514 + render = iren.FindPokedRenderer(mouse_x, mouse_y)
  515 + slice_data = viewer.get_slice_data(render)
  516 +
  517 + # TODO: Improve!
  518 + #for i in self.slice_data_list:
  519 + #i.cursor.Show(0)
  520 +
  521 + self.picker.Pick(mouse_x, mouse_y, 0, render)
  522 +
  523 + #if (self.pick.GetViewProp()):
  524 + #self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK))
  525 + #else:
  526 + #self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
  527 +
  528 + coord = self.get_coordinate_cursor()
  529 + position = viewer.slice_data.actor.GetInput().FindPoint(coord)
  530 +
  531 + # when position == -1 the cursos is not over the image, so is not
  532 + # necessary to set the cursor position to world coordinate center of
  533 + # pixel from slice image.
  534 + if position != -1:
  535 + coord = slice_data.actor.GetInput().GetPoint(position)
  536 + slice_data.cursor.SetPosition(coord)
  537 + #self.__update_cursor_position(slice_data, coord)
  538 +
  539 + if (self.left_pressed):
  540 + cursor = slice_data.cursor
  541 + position = slice_data.actor.GetInput().FindPoint(coord)
  542 + radius = cursor.radius
  543 +
  544 + if position < 0:
  545 + position = viewer.calculate_matrix_position(coord)
  546 +
  547 + viewer.slice_.edit_mask_pixel(viewer._brush_cursor_op, cursor.GetPixels(),
  548 + position, radius, self.orientation)
  549 + # TODO: To create a new function to reload images to viewer.
  550 + viewer.OnScrollBar(update3D=False)
  551 +
  552 + else:
  553 + viewer.interactor.Render()
  554 +
  555 + def OnBrushRelease(self, evt, obj):
  556 + if (self.viewer.slice_.buffer_slices[self.orientation].mask is None):
  557 + return
  558 +
  559 + self.viewer.slice_.apply_slice_buffer_to_mask(self.orientation)
  560 + self.viewer_flush_buffer = False
  561 +
  562 + def get_coordinate_cursor(self):
  563 + # Find position
  564 + x, y, z = self.picker.GetPickPosition()
  565 + bounds = self.viewer.slice_data.actor.GetBounds()
  566 + if bounds[0] == bounds[1]:
  567 + x = bounds[0]
  568 + elif bounds[2] == bounds[3]:
  569 + y = bounds[2]
  570 + elif bounds[4] == bounds[5]:
  571 + z = bounds[4]
  572 + return x, y, z
  573 +
  574 +
447 575 class ViewerStyle:
448 576 def __init__(self):
449 577 self.interactor = None
... ...
invesalius/data/viewer_slice.py
... ... @@ -175,6 +175,9 @@ class Viewer(wx.Panel):
175 175 interactor.SetInteractorStyle(style)
176 176  
177 177 def SetInteractorStyle(self, state):
  178 + self.__set_cross_visibility(0)
  179 + self.on_wl = False
  180 + self.wl_text.Hide()
178 181 if state == const.STATE_DEFAULT:
179 182 style = styles.DefaultInteractorStyle(self)
180 183 self.style = style
... ... @@ -247,6 +250,13 @@ class Viewer(wx.Panel):
247 250 self.interactor.SetInteractorStyle(style)
248 251 self.interactor.Render()
249 252  
  253 + elif state == const.SLICE_STATE_EDITOR:
  254 + style = styles.EditorInteractorStyle(self)
  255 +
  256 + self.style = style
  257 + self.interactor.SetInteractorStyle(style)
  258 + self.interactor.Render()
  259 +
250 260 else:
251 261 self.state = state
252 262 action = {
... ... @@ -278,7 +288,7 @@ class Viewer(wx.Panel):
278 288 self.on_wl = False
279 289 self.wl_text.Hide()
280 290  
281   - self.__set_editor_cursor_visibility(0)
  291 + self._set_editor_cursor_visibility(0)
282 292  
283 293 # Bind method according to current mode
284 294 if(state == const.STATE_ZOOM_SL):
... ... @@ -654,7 +664,7 @@ class Viewer(wx.Panel):
654 664 if (self.slice_.buffer_slices[self.orientation].mask is None):
655 665 return
656 666  
657   - self.__set_editor_cursor_visibility(1)
  667 + self._set_editor_cursor_visibility(1)
658 668  
659 669 mouse_x, mouse_y = self.interactor.GetEventPosition()
660 670 render = self.interactor.FindPokedRenderer(mouse_x, mouse_y)
... ... @@ -691,7 +701,7 @@ class Viewer(wx.Panel):
691 701 if (self.slice_.buffer_slices[self.orientation].mask is None):
692 702 return
693 703  
694   - self.__set_editor_cursor_visibility(1)
  704 + self._set_editor_cursor_visibility(1)
695 705  
696 706 mouse_x, mouse_y = self.interactor.GetEventPosition()
697 707 render = self.interactor.FindPokedRenderer(mouse_x, mouse_y)
... ... @@ -1166,7 +1176,7 @@ class Viewer(wx.Panel):
1166 1176 def __set_cross_visibility(self, visibility):
1167 1177 self.cross_actor.SetVisibility(visibility)
1168 1178  
1169   - def __set_editor_cursor_visibility(self, visibility):
  1179 + def _set_editor_cursor_visibility(self, visibility):
1170 1180 for slice_data in self.slice_data_list:
1171 1181 slice_data.cursor.actor.SetVisibility(visibility)
1172 1182  
... ...