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,17 +23,39 @@ from wx.lib.pubsub import pub as Publisher
23 23
24 import constants as const 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 Interactor style responsible for zoom the camera. 52 Interactor style responsible for zoom the camera.
29 """ 53 """
30 def __init__(self): 54 def __init__(self):
31 - self.right_pressed = False  
32 - 55 + BaseImageInteractorStyle.__init__(self)
33 # Zoom using right button 56 # Zoom using right button
34 self.AddObserver("RightButtonPressEvent",self.OnZoomRightClick) 57 self.AddObserver("RightButtonPressEvent",self.OnZoomRightClick)
35 self.AddObserver("MouseMoveEvent", self.OnZoomRightMove) 58 self.AddObserver("MouseMoveEvent", self.OnZoomRightMove)
36 - self.AddObserver("RightButtonReleaseEvent", self.OnZoomRightRelease)  
37 59
38 def OnZoomRightMove(self, evt, obj): 60 def OnZoomRightMove(self, evt, obj):
39 if (self.right_pressed): 61 if (self.right_pressed):
@@ -41,11 +63,8 @@ class ZoomInteractorStyle(vtk.vtkInteractorStyleImage): @@ -41,11 +63,8 @@ class ZoomInteractorStyle(vtk.vtkInteractorStyleImage):
41 evt.OnRightButtonDown() 63 evt.OnRightButtonDown()
42 64
43 def OnZoomRightClick(self, evt, obj): 65 def OnZoomRightClick(self, evt, obj):
44 - self.right_pressed = 1  
45 evt.StartDolly() 66 evt.StartDolly()
46 67
47 - def OnZoomRightRelease(self, evt, obj):  
48 - self.right_pressed = False  
49 68
50 class CrossInteractorStyle(ZoomInteractorStyle): 69 class CrossInteractorStyle(ZoomInteractorStyle):
51 """ 70 """
@@ -58,7 +77,6 @@ class CrossInteractorStyle(ZoomInteractorStyle): @@ -58,7 +77,6 @@ class CrossInteractorStyle(ZoomInteractorStyle):
58 self.slice_actor = slice_data.actor 77 self.slice_actor = slice_data.actor
59 self.slice_data = slice_data 78 self.slice_data = slice_data
60 79
61 - self.left_pressed = False  
62 self.picker = vtk.vtkWorldPointPicker() 80 self.picker = vtk.vtkWorldPointPicker()
63 81
64 self.AddObserver("MouseMoveEvent", self.OnCrossMove) 82 self.AddObserver("MouseMoveEvent", self.OnCrossMove)
@@ -66,7 +84,6 @@ class CrossInteractorStyle(ZoomInteractorStyle): @@ -66,7 +84,6 @@ class CrossInteractorStyle(ZoomInteractorStyle):
66 self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseLeftButton) 84 self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseLeftButton)
67 85
68 def OnCrossMouseClick(self, obj, evt): 86 def OnCrossMouseClick(self, obj, evt):
69 - self.left_pressed = True  
70 iren = obj.GetInteractor() 87 iren = obj.GetInteractor()
71 self.ChangeCrossPosition(iren) 88 self.ChangeCrossPosition(iren)
72 89
@@ -77,9 +94,6 @@ class CrossInteractorStyle(ZoomInteractorStyle): @@ -77,9 +94,6 @@ class CrossInteractorStyle(ZoomInteractorStyle):
77 iren = obj.GetInteractor() 94 iren = obj.GetInteractor()
78 self.ChangeCrossPosition(iren) 95 self.ChangeCrossPosition(iren)
79 96
80 - def OnReleaseLeftButton(self, obj, evt):  
81 - self.left_pressed = False  
82 -  
83 def ChangeCrossPosition(self, iren): 97 def ChangeCrossPosition(self, iren):
84 mouse_x, mouse_y = iren.GetEventPosition() 98 mouse_x, mouse_y = iren.GetEventPosition()
85 ren = iren.GetRenderWindow().GetRenderers().GetFirstRenderer() 99 ren = iren.GetRenderWindow().GetRenderers().GetFirstRenderer()
@@ -158,6 +172,50 @@ class CrossInteractorStyle(ZoomInteractorStyle): @@ -158,6 +172,50 @@ class CrossInteractorStyle(ZoomInteractorStyle):
158 coord[0]) 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 class ViewerStyle: 219 class ViewerStyle:
162 def __init__(self): 220 def __init__(self):
163 self.interactor = None 221 self.interactor = None
invesalius/data/viewer_slice.py
@@ -193,6 +193,18 @@ class Viewer(wx.Panel): @@ -193,6 +193,18 @@ class Viewer(wx.Panel):
193 193
194 self.__set_cross_visibility(1) 194 self.__set_cross_visibility(1)
195 Publisher.sendMessage('Activate ball reference') 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 else: 208 else:
197 self.state = state 209 self.state = state
198 action = { 210 action = {
@@ -227,11 +239,6 @@ class Viewer(wx.Panel): @@ -227,11 +239,6 @@ class Viewer(wx.Panel):
227 "MouseMoveEvent": self.OnChangeSliceMove, 239 "MouseMoveEvent": self.OnChangeSliceMove,
228 "LeftButtonPressEvent": self.OnChangeSliceClick, 240 "LeftButtonPressEvent": self.OnChangeSliceClick,
229 }, 241 },
230 - const.STATE_WL:  
231 - {  
232 - "MouseMoveEvent": self.OnWindowLevelMove,  
233 - "LeftButtonPressEvent": self.OnWindowLevelClick,  
234 - },  
235 const.STATE_DEFAULT: 242 const.STATE_DEFAULT:
236 { 243 {
237 }, 244 },
@@ -353,32 +360,6 @@ class Viewer(wx.Panel): @@ -353,32 +360,6 @@ class Viewer(wx.Panel):
353 self.left_pressed = 0 360 self.left_pressed = 0
354 Publisher.sendMessage('Update slice viewer') 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 def UpdateWindowLevelValue(self, pubsub_evt): 363 def UpdateWindowLevelValue(self, pubsub_evt):
383 window, level = pubsub_evt.data 364 window, level = pubsub_evt.data
384 self.acum_achange_window, self.acum_achange_level = (window, level) 365 self.acum_achange_window, self.acum_achange_level = (window, level)