Commit d97c6212269264e55f5d99e6bdac88a612da7883
1 parent
91b19b16
Exists in
master
and in
67 other branches
Added the option to swap axes
Showing
5 changed files
with
50 additions
and
2 deletions
Show diff stats
invesalius/constants.py
... | ... | @@ -460,6 +460,11 @@ ID_START = wx.NewId() |
460 | 460 | ID_FLIP_X = wx.NewId() |
461 | 461 | ID_FLIP_Y = wx.NewId() |
462 | 462 | ID_FLIP_Z = wx.NewId() |
463 | + | |
464 | +ID_SWAP_XY = wx.NewId() | |
465 | +ID_SWAP_XZ = wx.NewId() | |
466 | +ID_SWAP_YZ = wx.NewId() | |
467 | + | |
463 | 468 | #--------------------------------------------------------- |
464 | 469 | STATE_DEFAULT = 1000 |
465 | 470 | STATE_WL = 1001 | ... | ... |
invesalius/data/mask.py
... | ... | @@ -49,6 +49,7 @@ class Mask(): |
49 | 49 | |
50 | 50 | def __bind_events(self): |
51 | 51 | Publisher.subscribe(self.OnFlipVolume, 'Flip volume') |
52 | + Publisher.subscribe(self.OnSwapVolumeAxes, 'Swap volume axes') | |
52 | 53 | |
53 | 54 | def SavePlist(self, filename): |
54 | 55 | mask = {} |
... | ... | @@ -98,6 +99,11 @@ class Mask(): |
98 | 99 | submatrix[:] = submatrix[:, :, ::-1] |
99 | 100 | self.matrix[0, 0, 1::] = self.matrix[0, 0, :0:-1] |
100 | 101 | |
102 | + def OnSwapVolumeAxes(self, pubsub_evt): | |
103 | + axis0, axis1 = pubsub_evt.data | |
104 | + self.matrix = self.matrix.swapaxes(axis0, axis1) | |
105 | + print type(self.matrix) | |
106 | + | |
101 | 107 | def _save_mask(self, filename): |
102 | 108 | shutil.copyfile(self.temp_file, filename) |
103 | 109 | ... | ... |
invesalius/data/slice_.py
... | ... | @@ -134,6 +134,7 @@ class Slice(object): |
134 | 134 | Publisher.subscribe(self.UpdateSlice3D,'Update slice 3D') |
135 | 135 | |
136 | 136 | Publisher.subscribe(self.OnFlipVolume, 'Flip volume') |
137 | + Publisher.subscribe(self.OnSwapVolumeAxes, 'Swap volume axes') | |
137 | 138 | |
138 | 139 | def GetMaxSliceNumber(self, orientation): |
139 | 140 | shape = self.matrix.shape |
... | ... | @@ -980,6 +981,21 @@ class Slice(object): |
980 | 981 | for buffer_ in self.buffer_slices.values(): |
981 | 982 | buffer_.discard_buffer() |
982 | 983 | |
984 | + def OnSwapVolumeAxes(self, pubsub_evt): | |
985 | + axis0, axis1 = pubsub_evt.data | |
986 | + self.matrix = self.matrix.swapaxes(axis0, axis1) | |
987 | + if (axis0, axis1) == (2, 1): | |
988 | + self.spacing = self.spacing[1], self.spacing[0], self.spacing[2] | |
989 | + elif (axis0, axis1) == (2, 0): | |
990 | + self.spacing = self.spacing[2], self.spacing[1], self.spacing[0] | |
991 | + elif (axis0, axis1) == (1, 0): | |
992 | + self.spacing = self.spacing[0], self.spacing[2], self.spacing[1] | |
993 | + | |
994 | + for buffer_ in self.buffer_slices.values(): | |
995 | + buffer_.discard_buffer() | |
996 | + | |
997 | + print type(self.matrix) | |
998 | + | |
983 | 999 | def OnExportMask(self, pubsub_evt): |
984 | 1000 | #imagedata = self.current_mask.imagedata |
985 | 1001 | imagedata = self.imagedata | ... | ... |
invesalius/data/viewer_slice.py
... | ... | @@ -1002,7 +1002,7 @@ class Viewer(wx.Panel): |
1002 | 1002 | Publisher.subscribe(self.RemoveActors, 'Remove actors ' + str(ORIENTATIONS[self.orientation])) |
1003 | 1003 | |
1004 | 1004 | Publisher.subscribe(self.ReloadActualSlice, 'Reload actual slice') |
1005 | - | |
1005 | + Publisher.subscribe(self.OnUpdateScroll, 'Update scroll') | |
1006 | 1006 | |
1007 | 1007 | def SetDefaultCursor(self, pusub_evt): |
1008 | 1008 | self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) |
... | ... | @@ -1502,6 +1502,11 @@ class Viewer(wx.Panel): |
1502 | 1502 | self.set_slice_number(pos) |
1503 | 1503 | self.interactor.Render() |
1504 | 1504 | |
1505 | + def OnUpdateScroll(self, pubsub_evt): | |
1506 | + max_slice_number = sl.Slice().GetNumberOfSlices(self.orientation) | |
1507 | + self.scroll.SetScrollbar(wx.SB_VERTICAL, 1, max_slice_number, | |
1508 | + max_slice_number) | |
1509 | + | |
1505 | 1510 | def AddActors(self, pubsub_evt): |
1506 | 1511 | "Inserting actors" |
1507 | 1512 | actors, n = pubsub_evt.data | ... | ... |
invesalius/gui/frame.py
... | ... | @@ -344,7 +344,11 @@ class Frame(wx.Frame): |
344 | 344 | const.ID_FLIP_Y: 1, |
345 | 345 | const.ID_FLIP_Z: 0}[id] |
346 | 346 | self.FlipVolume(axis) |
347 | - | |
347 | + elif id in (const.ID_SWAP_XY, const.ID_SWAP_XZ, const.ID_SWAP_YZ): | |
348 | + axes = {const.ID_SWAP_XY: (2, 1), | |
349 | + const.ID_SWAP_XZ: (2, 0), | |
350 | + const.ID_SWAP_YZ: (1, 0)}[id] | |
351 | + self.SwapAxes(axes) | |
348 | 352 | def OnSize(self, evt): |
349 | 353 | """ |
350 | 354 | Refresh GUI when frame is resized. |
... | ... | @@ -418,6 +422,11 @@ class Frame(wx.Frame): |
418 | 422 | Publisher.sendMessage('Flip volume', axis) |
419 | 423 | Publisher.sendMessage('Reload actual slice') |
420 | 424 | |
425 | + def SwapAxes(self, axes): | |
426 | + Publisher.sendMessage('Swap volume axes', axes) | |
427 | + Publisher.sendMessage('Update scroll') | |
428 | + Publisher.sendMessage('Reload actual slice') | |
429 | + | |
421 | 430 | # ------------------------------------------------------------------ |
422 | 431 | # ------------------------------------------------------------------ |
423 | 432 | # ------------------------------------------------------------------ |
... | ... | @@ -492,9 +501,16 @@ class MenuBar(wx.MenuBar): |
492 | 501 | app(const.ID_FLIP_Y, _("A <-> P")) |
493 | 502 | app(const.ID_FLIP_Z, _("T <-> B")) |
494 | 503 | |
504 | + swap_axes_menu = wx.Menu() | |
505 | + app = swap_axes_menu.Append | |
506 | + app(const.ID_SWAP_XY, _("R-L <-> A-P")) | |
507 | + app(const.ID_SWAP_XZ, _("R-L <-> T-B")) | |
508 | + app(const.ID_SWAP_YZ, _("A-P <-> T-B")) | |
509 | + | |
495 | 510 | file_edit = wx.Menu() |
496 | 511 | app = file_edit.Append |
497 | 512 | file_edit.AppendMenu(wx.NewId(), _('Flip'), flip_menu) |
513 | + file_edit.AppendMenu(wx.NewId(), _('Swap axes'), swap_axes_menu) | |
498 | 514 | #app(wx.ID_UNDO, "Undo\tCtrl+Z") |
499 | 515 | #app(wx.ID_REDO, "Redo\tCtrl+Y") |
500 | 516 | #app(const.ID_EDIT_LIST, "Show Undo List...") | ... | ... |