Commit d66bacece62858ea62e650462449be16998a5ba2
1 parent
7d09e69f
Exists in
master
and in
68 other branches
ADD: Planes with slices in volume or surface
Showing
2 changed files
with
106 additions
and
37 deletions
Show diff stats
invesalius/data/slice_.py
... | ... | @@ -58,6 +58,8 @@ class Slice(object): |
58 | 58 | |
59 | 59 | ps.Publisher().subscribe(self.UpdateColourTableBackground,\ |
60 | 60 | 'Change colour table from background image') |
61 | + | |
62 | + ps.Publisher().subscribe(self.InputImageWidget, 'Input Image in the widget') | |
61 | 63 | |
62 | 64 | def __set_current_mask_threshold_limits(self, pubsub_evt): |
63 | 65 | thresh_min = pubsub_evt.data[0] |
... | ... | @@ -427,7 +429,19 @@ class Slice(object): |
427 | 429 | thresh_min, thresh_max = self.window_level.GetOutput().GetScalarRange() |
428 | 430 | self.lut_bg.SetTableRange(thresh_min, thresh_max) |
429 | 431 | |
430 | - | |
432 | + | |
433 | + def InputImageWidget(self, pubsub_evt): | |
434 | + widget = pubsub_evt.data | |
435 | + | |
436 | + flip = vtk.vtkImageFlip() | |
437 | + flip.SetInput(self.window_level.GetOutput()) | |
438 | + flip.SetFilteredAxis(1) | |
439 | + flip.FlipAboutOriginOn() | |
440 | + flip.Update() | |
441 | + | |
442 | + widget.SetInput(flip.GetOutput()) | |
443 | + | |
444 | + | |
431 | 445 | def CreateMask(self, imagedata=None, name=None): |
432 | 446 | |
433 | 447 | future_mask = Mask() | ... | ... |
invesalius/data/viewer_volume.py
... | ... | @@ -71,7 +71,7 @@ class Viewer(wx.Panel): |
71 | 71 | |
72 | 72 | self.__bind_events() |
73 | 73 | self.__bind_events_wx() |
74 | - | |
74 | + | |
75 | 75 | |
76 | 76 | def OnMove(self, obj, evt): |
77 | 77 | if self.onclick and self.raycasting_volume: |
... | ... | @@ -234,17 +234,21 @@ class Viewer(wx.Panel): |
234 | 234 | self.text.SetValue("WL: %d WW: %d"%(wl, ww)) |
235 | 235 | self.ren.AddActor(self.text.actor) |
236 | 236 | self.ren.SetBackground(colour) |
237 | - | |
238 | - | |
237 | + | |
239 | 238 | if not (self.view_angle): |
240 | 239 | self.SetViewAngle(const.VOL_FRONT) |
241 | 240 | else: |
242 | 241 | self.ren.ResetCamera() |
243 | 242 | self.ren.ResetCameraClippingRange() |
244 | 243 | |
245 | - | |
246 | 244 | self.UpdateRender() |
247 | 245 | |
246 | + def LoadPlane(self): | |
247 | + self.plane = SlicePlane() | |
248 | + self.plane.EnableX() | |
249 | + self.plane.EnableY() | |
250 | + self.plane.EnableZ() | |
251 | + | |
248 | 252 | def ChangeBackgroundColour(self, pubsub_evt): |
249 | 253 | colour = pubsub_evt.data |
250 | 254 | self.ren.SetBackground(colour) |
... | ... | @@ -263,7 +267,6 @@ class Viewer(wx.Panel): |
263 | 267 | ren.ResetCamera() |
264 | 268 | ren.ResetCameraClippingRange() |
265 | 269 | |
266 | - | |
267 | 270 | #self.ShowOrientationCube() |
268 | 271 | |
269 | 272 | self.interactor.Render() |
... | ... | @@ -292,40 +295,92 @@ class Viewer(wx.Panel): |
292 | 295 | |
293 | 296 | def UpdateRender(self, evt_pubsub=None): |
294 | 297 | self.interactor.Render() |
295 | - | |
296 | - def CreatePlanes(self): | |
297 | - | |
298 | - imagedata = self.imagedata | |
299 | - ren = self.ren | |
300 | - interactor = self.interactor | |
301 | - | |
302 | - import ivVolumeWidgets as vw | |
303 | - axial_plane = vw.Plane() | |
304 | - axial_plane.SetRender(ren) | |
305 | - axial_plane.SetInteractor(interactor) | |
306 | - axial_plane.SetOrientation(vw.AXIAL) | |
307 | - axial_plane.SetInput(imagedata) | |
308 | - axial_plane.Show() | |
309 | - axial_plane.Update() | |
310 | - | |
311 | - coronal_plane = vw.Plane() | |
312 | - coronal_plane.SetRender(ren) | |
313 | - coronal_plane.SetInteractor(interactor) | |
314 | - coronal_plane.SetOrientation(vw.CORONAL) | |
315 | - coronal_plane.SetInput(imagedata) | |
316 | - coronal_plane.Show() | |
317 | - coronal_plane.Update() | |
318 | - | |
319 | - sagital_plane = vw.Plane() | |
320 | - sagital_plane.SetRender(ren) | |
321 | - sagital_plane.SetInteractor(interactor) | |
322 | - sagital_plane.SetOrientation(vw.SAGITAL) | |
323 | - sagital_plane.SetInput(imagedata) | |
324 | - sagital_plane.Show() | |
325 | - sagital_plane.Update() | |
326 | 298 | |
327 | 299 | def SetWidgetInteractor(self, evt_pubsub=None): |
328 | 300 | evt_pubsub.data.SetInteractor(self.interactor._Iren) |
329 | 301 | |
330 | 302 | def AppendActor(self, evt_pubsub=None): |
331 | 303 | self.ren.AddActor(evt_pubsub.data) |
304 | + | |
305 | + | |
306 | + | |
307 | + | |
308 | +class SlicePlane: | |
309 | + | |
310 | + def __init__(self): | |
311 | + | |
312 | + self.Create() | |
313 | + self.__bind_events() | |
314 | + | |
315 | + def __bind_events(self): | |
316 | + self.plane_x.AddObserver("InteractionEvent", self.Update) | |
317 | + | |
318 | + def Create(self): | |
319 | + | |
320 | + plane_x = self.plane_x = vtk.vtkImagePlaneWidget() | |
321 | + plane_x.DisplayTextOff() | |
322 | + ps.Publisher().sendMessage('Input Image in the widget', plane_x) | |
323 | + plane_x.SetPlaneOrientationToXAxes() | |
324 | + plane_x.TextureVisibilityOn() | |
325 | + plane_x.SetLeftButtonAction(1) | |
326 | + plane_x.SetRightButtonAction(0) | |
327 | + prop1 = plane_x.GetPlaneProperty() | |
328 | + prop1.SetColor(0, 0, 1) | |
329 | + cursor_property = plane_x.GetCursorProperty() | |
330 | + cursor_property.SetOpacity(0) | |
331 | + | |
332 | + plane_y = self.plane_y = vtk.vtkImagePlaneWidget() | |
333 | + plane_y.DisplayTextOff() | |
334 | + ps.Publisher().sendMessage('Input Image in the widget', plane_y) | |
335 | + plane_y.SetPlaneOrientationToYAxes() | |
336 | + plane_y.TextureVisibilityOn() | |
337 | + plane_y.SetLeftButtonAction(1) | |
338 | + plane_y.SetRightButtonAction(0) | |
339 | + prop1 = plane_y.GetPlaneProperty() | |
340 | + prop1.SetColor(0, 1, 0) | |
341 | + cursor_property = plane_y.GetCursorProperty() | |
342 | + cursor_property.SetOpacity(0) | |
343 | + | |
344 | + plane_z = self.plane_z = vtk.vtkImagePlaneWidget() | |
345 | + plane_z.DisplayTextOff() | |
346 | + ps.Publisher().sendMessage('Input Image in the widget', plane_z) | |
347 | + plane_z.SetPlaneOrientationToZAxes() | |
348 | + plane_z.TextureVisibilityOn() | |
349 | + plane_z.SetLeftButtonAction(1) | |
350 | + plane_z.SetRightButtonAction(0) | |
351 | + prop1 = plane_z.GetPlaneProperty() | |
352 | + prop1.SetColor(1, 0, 0) | |
353 | + cursor_property = plane_z.GetCursorProperty() | |
354 | + cursor_property.SetOpacity(0) | |
355 | + | |
356 | + ps.Publisher().sendMessage('Set Widget Interactor', plane_x) | |
357 | + ps.Publisher().sendMessage('Set Widget Interactor', plane_y) | |
358 | + ps.Publisher().sendMessage('Set Widget Interactor', plane_z) | |
359 | + | |
360 | + def EnableX(self, evt_pubsub=None): | |
361 | + self.plane_x.On() | |
362 | + self.Update() | |
363 | + | |
364 | + def EnableY(self, evt_pubsub=None): | |
365 | + self.plane_y.On() | |
366 | + self.Update() | |
367 | + | |
368 | + def EnableZ(self, evt_pubsub=None): | |
369 | + self.plane_z.On() | |
370 | + self.Update() | |
371 | + | |
372 | + def DisableX(self, evt_pubsub=None): | |
373 | + self.plane_x.Off() | |
374 | + self.Update() | |
375 | + | |
376 | + def DisableY(self, evt_pubsub=None): | |
377 | + self.plane_y.Off() | |
378 | + self.Update() | |
379 | + | |
380 | + def DisableZ(self, evt_pubsub=None): | |
381 | + self.plane_z.Off() | |
382 | + self.Update() | |
383 | + | |
384 | + def Update(self, obj, evt): | |
385 | + ps.Publisher().sendMessage('Render volume viewer', None) | |
386 | + | |
332 | 387 | \ No newline at end of file | ... | ... |