Commit 9cbf791e35f212fdf2b10ddf976636fb6581c7e9
1 parent
91ea38bc
Exists in
interactor_style
Created a new interactor style to handle the editor
Showing
2 changed files
with
153 additions
and
15 deletions
Show diff stats
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 | ... | ... |