Commit 13f819f768cfbf96681f14da0f5f253878c12f16

Authored by Thiago Franco de Moraes
1 parent f7b5fc4d
Exists in interactor_style

Created a new interactor style to handle Window level & width

invesalius/data/styles.py
... ... @@ -23,17 +23,39 @@ from wx.lib.pubsub import pub as Publisher
23 23  
24 24 import constants as const
25 25  
26   -class ZoomInteractorStyle(vtk.vtkInteractorStyleImage):
  26 +class BaseImageInteractorStyle(vtk.vtkInteractorStyleImage):
  27 + def __init__(self):
  28 + self.right_pressed = False
  29 + self.left_pressed = False
  30 +
  31 + self.AddObserver("LeftButtonPressEvent", self.OnPressLeftButton)
  32 + self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseLeftButton)
  33 +
  34 + self.AddObserver("RightButtonPressEvent",self.OnPressRightButton)
  35 + self.AddObserver("RightButtonReleaseEvent", self.OnReleaseRightButton)
  36 +
  37 + def OnPressLeftButton(self, evt, obj):
  38 + self.left_pressed = True
  39 +
  40 + def OnReleaseLeftButton(self, evt, obj):
  41 + self.left_pressed = False
  42 +
  43 + def OnPressRightButton(self, evt, obj):
  44 + self.right_pressed = True
  45 +
  46 + def OnReleaseRightButton(self, evt, obj):
  47 + self.right_pressed = False
  48 +
  49 +
  50 +class ZoomInteractorStyle(BaseImageInteractorStyle):
27 51 """
28 52 Interactor style responsible for zoom the camera.
29 53 """
30 54 def __init__(self):
31   - self.right_pressed = False
32   -
  55 + BaseImageInteractorStyle.__init__(self)
33 56 # Zoom using right button
34 57 self.AddObserver("RightButtonPressEvent",self.OnZoomRightClick)
35 58 self.AddObserver("MouseMoveEvent", self.OnZoomRightMove)
36   - self.AddObserver("RightButtonReleaseEvent", self.OnZoomRightRelease)
37 59  
38 60 def OnZoomRightMove(self, evt, obj):
39 61 if (self.right_pressed):
... ... @@ -41,11 +63,8 @@ class ZoomInteractorStyle(vtk.vtkInteractorStyleImage):
41 63 evt.OnRightButtonDown()
42 64  
43 65 def OnZoomRightClick(self, evt, obj):
44   - self.right_pressed = 1
45 66 evt.StartDolly()
46 67  
47   - def OnZoomRightRelease(self, evt, obj):
48   - self.right_pressed = False
49 68  
50 69 class CrossInteractorStyle(ZoomInteractorStyle):
51 70 """
... ... @@ -58,7 +77,6 @@ class CrossInteractorStyle(ZoomInteractorStyle):
58 77 self.slice_actor = slice_data.actor
59 78 self.slice_data = slice_data
60 79  
61   - self.left_pressed = False
62 80 self.picker = vtk.vtkWorldPointPicker()
63 81  
64 82 self.AddObserver("MouseMoveEvent", self.OnCrossMove)
... ... @@ -66,7 +84,6 @@ class CrossInteractorStyle(ZoomInteractorStyle):
66 84 self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseLeftButton)
67 85  
68 86 def OnCrossMouseClick(self, obj, evt):
69   - self.left_pressed = True
70 87 iren = obj.GetInteractor()
71 88 self.ChangeCrossPosition(iren)
72 89  
... ... @@ -77,9 +94,6 @@ class CrossInteractorStyle(ZoomInteractorStyle):
77 94 iren = obj.GetInteractor()
78 95 self.ChangeCrossPosition(iren)
79 96  
80   - def OnReleaseLeftButton(self, obj, evt):
81   - self.left_pressed = False
82   -
83 97 def ChangeCrossPosition(self, iren):
84 98 mouse_x, mouse_y = iren.GetEventPosition()
85 99 ren = iren.GetRenderWindow().GetRenderers().GetFirstRenderer()
... ... @@ -158,6 +172,50 @@ class CrossInteractorStyle(ZoomInteractorStyle):
158 172 coord[0])
159 173  
160 174  
  175 +class WWWLInteractorStyle(ZoomInteractorStyle):
  176 + """
  177 + Interactor style responsible for Window Level & Width functionality.
  178 + """
  179 + def __init__(self, ww, wl):
  180 + ZoomInteractorStyle.__init__(self)
  181 +
  182 + self.last_x = 0
  183 + self.last_y = 0
  184 +
  185 + self.acum_achange_window = ww
  186 + self.acum_achange_level = wl
  187 +
  188 + self.AddObserver("MouseMoveEvent", self.OnWindowLevelMove)
  189 + self.AddObserver("LeftButtonPressEvent", self.OnWindowLevelClick)
  190 +
  191 + def OnWindowLevelMove(self, obj, evt):
  192 + if (self.left_pressed):
  193 + iren = obj.GetInteractor()
  194 + mouse_x, mouse_y = iren.GetEventPosition()
  195 + self.acum_achange_window += mouse_x - self.last_x
  196 + self.acum_achange_level += mouse_y - self.last_y
  197 + self.last_x, self.last_y = mouse_x, mouse_y
  198 +
  199 + Publisher.sendMessage('Bright and contrast adjustment image',
  200 + (self.acum_achange_window, self.acum_achange_level))
  201 +
  202 + #self.SetWLText(self.acum_achange_level,
  203 + # self.acum_achange_window)
  204 +
  205 + const.WINDOW_LEVEL['Manual'] = (self.acum_achange_window,\
  206 + self.acum_achange_level)
  207 + Publisher.sendMessage('Check window and level other')
  208 + Publisher.sendMessage('Update window level value',(self.acum_achange_window,
  209 + self.acum_achange_level))
  210 + #Necessary update the slice plane in the volume case exists
  211 + Publisher.sendMessage('Update slice viewer')
  212 + Publisher.sendMessage('Render volume viewer')
  213 +
  214 + def OnWindowLevelClick(self, obj, evt):
  215 + iren = obj.GetInteractor()
  216 + self.last_x, self.last_y = iren.GetLastEventPosition()
  217 +
  218 +
161 219 class ViewerStyle:
162 220 def __init__(self):
163 221 self.interactor = None
... ...
invesalius/data/viewer_slice.py
... ... @@ -193,6 +193,18 @@ class Viewer(wx.Panel):
193 193  
194 194 self.__set_cross_visibility(1)
195 195 Publisher.sendMessage('Activate ball reference')
  196 + elif state == const.STATE_WL:
  197 + self.on_wl = True
  198 + self.wl_text.Show()
  199 +
  200 + ww = sl.Slice().window_width
  201 + wl = sl.Slice().window_level
  202 +
  203 + style = styles.WWWLInteractorStyle(ww, wl)
  204 + self.style = style
  205 + self.interactor.SetInteractorStyle(style)
  206 + self.interactor.Render()
  207 +
196 208 else:
197 209 self.state = state
198 210 action = {
... ... @@ -227,11 +239,6 @@ class Viewer(wx.Panel):
227 239 "MouseMoveEvent": self.OnChangeSliceMove,
228 240 "LeftButtonPressEvent": self.OnChangeSliceClick,
229 241 },
230   - const.STATE_WL:
231   - {
232   - "MouseMoveEvent": self.OnWindowLevelMove,
233   - "LeftButtonPressEvent": self.OnWindowLevelClick,
234   - },
235 242 const.STATE_DEFAULT:
236 243 {
237 244 },
... ... @@ -353,32 +360,6 @@ class Viewer(wx.Panel):
353 360 self.left_pressed = 0
354 361 Publisher.sendMessage('Update slice viewer')
355 362  
356   - def OnWindowLevelMove(self, evt, obj):
357   - if (self.left_pressed):
358   - position = self.interactor.GetLastEventPosition()
359   - mouse_x, mouse_y = self.interactor.GetEventPosition()
360   - self.acum_achange_window += mouse_x - self.last_x
361   - self.acum_achange_level += mouse_y - self.last_y
362   - self.last_x, self.last_y = mouse_x, mouse_y
363   -
364   - Publisher.sendMessage('Bright and contrast adjustment image',
365   - (self.acum_achange_window, self.acum_achange_level))
366   -
367   - #self.SetWLText(self.acum_achange_level,
368   - # self.acum_achange_window)
369   -
370   - const.WINDOW_LEVEL['Manual'] = (self.acum_achange_window,\
371   - self.acum_achange_level)
372   - Publisher.sendMessage('Check window and level other')
373   - Publisher.sendMessage('Update window level value',(self.acum_achange_window,
374   - self.acum_achange_level))
375   - #Necessary update the slice plane in the volume case exists
376   - Publisher.sendMessage('Update slice viewer')
377   - Publisher.sendMessage('Render volume viewer')
378   -
379   - def OnWindowLevelClick(self, evt, obj):
380   - self.last_x, self.last_y = self.interactor.GetLastEventPosition()
381   -
382 363 def UpdateWindowLevelValue(self, pubsub_evt):
383 364 window, level = pubsub_evt.data
384 365 self.acum_achange_window, self.acum_achange_level = (window, level)
... ...