Commit 94e17db75ad08fd522d76c4c7e6e7ccaade50f2c
1 parent
39603f52
Exists in
rotvol
Starting to show reoriented image
Showing
4 changed files
with
63 additions
and
6 deletions
Show diff stats
invesalius/constants.py
| ... | ... | @@ -494,16 +494,18 @@ SLICE_STATE_CROSS = 3006 |
| 494 | 494 | SLICE_STATE_SCROLL = 3007 |
| 495 | 495 | SLICE_STATE_EDITOR = 3008 |
| 496 | 496 | SLICE_STATE_WATERSHED = 3009 |
| 497 | +SLICE_STATE_REORIENT = 3010 | |
| 497 | 498 | |
| 498 | 499 | VOLUME_STATE_SEED = 2001 |
| 499 | -#STATE_LINEAR_MEASURE = 3001 | |
| 500 | -#STATE_ANGULAR_MEASURE = 3002 | |
| 500 | +# STATE_LINEAR_MEASURE = 3001 | |
| 501 | +# STATE_ANGULAR_MEASURE = 3002 | |
| 501 | 502 | |
| 502 | 503 | TOOL_STATES = [STATE_WL, STATE_SPIN, STATE_ZOOM, |
| 503 | 504 | STATE_ZOOM_SL, STATE_PAN, STATE_MEASURE_DISTANCE, |
| 504 | - STATE_MEASURE_ANGLE]#, STATE_ANNOTATE] | |
| 505 | + STATE_MEASURE_ANGLE] #, STATE_ANNOTATE] | |
| 505 | 506 | |
| 506 | -TOOL_SLICE_STATES = [SLICE_STATE_CROSS, SLICE_STATE_SCROLL] | |
| 507 | +TOOL_SLICE_STATES = [SLICE_STATE_CROSS, SLICE_STATE_SCROLL, | |
| 508 | + SLICE_STATE_REORIENT] | |
| 507 | 509 | |
| 508 | 510 | |
| 509 | 511 | SLICE_STYLES = TOOL_STATES + TOOL_SLICE_STATES |
| ... | ... | @@ -520,6 +522,7 @@ STYLE_LEVEL = {SLICE_STATE_EDITOR: 1, |
| 520 | 522 | SLICE_STATE_WATERSHED: 1, |
| 521 | 523 | SLICE_STATE_CROSS: 2, |
| 522 | 524 | SLICE_STATE_SCROLL: 2, |
| 525 | + SLICE_STATE_REORIENT: 2, | |
| 523 | 526 | STATE_ANNOTATE: 2, |
| 524 | 527 | STATE_DEFAULT: 0, |
| 525 | 528 | STATE_MEASURE_ANGLE: 2, | ... | ... |
invesalius/data/slice_.py
| ... | ... | @@ -584,7 +584,7 @@ class Slice(object): |
| 584 | 584 | if orientation == 'AXIAL': |
| 585 | 585 | tmp_array = np.array(self.matrix[slice_number:slice_number + number_slices]) |
| 586 | 586 | if np.any(self.rotations): |
| 587 | - transforms.apply_view_matrix_transform(self.matrix, self.spacing, M, slice_number, orientation, 1, self.matrix.min(), tmp_array) | |
| 587 | + transforms.apply_view_matrix_transform(self.matrix, self.spacing, M, slice_number, orientation, 2, self.matrix.min(), tmp_array) | |
| 588 | 588 | if self._type_projection == const.PROJECTION_NORMAL: |
| 589 | 589 | n_image = tmp_array.squeeze() |
| 590 | 590 | else: | ... | ... |
invesalius/data/styles.py
| ... | ... | @@ -1405,6 +1405,46 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): |
| 1405 | 1405 | session.ChangeProject() |
| 1406 | 1406 | |
| 1407 | 1407 | |
| 1408 | +class ReorientImageInteractorStyle(DefaultInteractorStyle): | |
| 1409 | + """ | |
| 1410 | + Interactor style responsible for image reorientation | |
| 1411 | + """ | |
| 1412 | + def __init__(self, viewer): | |
| 1413 | + DefaultInteractorStyle.__init__(self, viewer) | |
| 1414 | + | |
| 1415 | + self.viewer = viewer | |
| 1416 | + | |
| 1417 | + self.AddObserver("KeyPressEvent", self.OnKeyPress) | |
| 1418 | + | |
| 1419 | + def SetUp(self): | |
| 1420 | + self.viewer.slice_.current_mask.is_shown = False | |
| 1421 | + Publisher.sendMessage('Reload actual slice') | |
| 1422 | + | |
| 1423 | + def OnKeyPress(self, evt, obj): | |
| 1424 | + key = self.viewer.interactor.GetKeyCode() | |
| 1425 | + if key == '+': | |
| 1426 | + delta = 1 | |
| 1427 | + elif key == '-': | |
| 1428 | + delta = -1 | |
| 1429 | + else: | |
| 1430 | + return | |
| 1431 | + | |
| 1432 | + rx, ry, rz = self.viewer.slice_.rotations | |
| 1433 | + orientation = self.viewer.orientation | |
| 1434 | + if orientation == 'AXIAL': | |
| 1435 | + rz += np.deg2rad(delta) | |
| 1436 | + elif orientation == 'CORONAL': | |
| 1437 | + ry += np.deg2rad(delta) | |
| 1438 | + elif orientation == 'SAGITAL': | |
| 1439 | + rx += np.deg2rad(delta) | |
| 1440 | + | |
| 1441 | + self.viewer.slice_.rotations = (rx, ry, rz) | |
| 1442 | + | |
| 1443 | + self.viewer.slice_.discard_all_buffers() | |
| 1444 | + self.viewer.slice_.current_mask.clear_history() | |
| 1445 | + Publisher.sendMessage('Reload actual slice') | |
| 1446 | + | |
| 1447 | + | |
| 1408 | 1448 | def get_style(style): |
| 1409 | 1449 | STYLES = { |
| 1410 | 1450 | const.STATE_DEFAULT: DefaultInteractorStyle, |
| ... | ... | @@ -1419,5 +1459,6 @@ def get_style(style): |
| 1419 | 1459 | const.SLICE_STATE_SCROLL: ChangeSliceInteractorStyle, |
| 1420 | 1460 | const.SLICE_STATE_EDITOR: EditorInteractorStyle, |
| 1421 | 1461 | const.SLICE_STATE_WATERSHED: WaterShedInteractorStyle, |
| 1462 | + const.SLICE_STATE_REORIENT: ReorientImageInteractorStyle, | |
| 1422 | 1463 | } |
| 1423 | 1464 | return STYLES[style] | ... | ... |
invesalius/gui/frame.py
| ... | ... | @@ -1278,7 +1278,8 @@ class SliceToolBar(AuiToolBar): |
| 1278 | 1278 | |
| 1279 | 1279 | self.parent = parent |
| 1280 | 1280 | self.enable_items = [const.SLICE_STATE_SCROLL, |
| 1281 | - const.SLICE_STATE_CROSS] | |
| 1281 | + const.SLICE_STATE_CROSS, | |
| 1282 | + const.SLICE_STATE_REORIENT] | |
| 1282 | 1283 | self.__init_items() |
| 1283 | 1284 | self.__bind_events() |
| 1284 | 1285 | self.__bind_events_wx() |
| ... | ... | @@ -1297,6 +1298,9 @@ class SliceToolBar(AuiToolBar): |
| 1297 | 1298 | |
| 1298 | 1299 | path = os.path.join(d,"cross_original.png") |
| 1299 | 1300 | BMP_CROSS = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
| 1301 | + | |
| 1302 | + path = os.path.join(d, "tool_rotate_original.png") | |
| 1303 | + BMP_REORIENT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
| 1300 | 1304 | else: |
| 1301 | 1305 | path = os.path.join(d, "slice.png") |
| 1302 | 1306 | BMP_SLICE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
| ... | ... | @@ -1304,6 +1308,9 @@ class SliceToolBar(AuiToolBar): |
| 1304 | 1308 | path = os.path.join(d,"cross.png") |
| 1305 | 1309 | BMP_CROSS = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
| 1306 | 1310 | |
| 1311 | + path = os.path.join(d, "tool_rotate.png") | |
| 1312 | + BMP_REORIENT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
| 1313 | + | |
| 1307 | 1314 | self.sst = self.AddToggleTool(const.SLICE_STATE_SCROLL, |
| 1308 | 1315 | BMP_SLICE,#, kind=wx.ITEM_CHECK) |
| 1309 | 1316 | wx.NullBitmap, |
| ... | ... | @@ -1316,6 +1323,12 @@ class SliceToolBar(AuiToolBar): |
| 1316 | 1323 | toggle=True, |
| 1317 | 1324 | short_help_string=_("Slices' cross intersection")) |
| 1318 | 1325 | |
| 1326 | + self.srt = self.AddToggleTool(const.SLICE_STATE_REORIENT, | |
| 1327 | + BMP_REORIENT,#, kind=wx.ITEM_CHECK) | |
| 1328 | + wx.NullBitmap, | |
| 1329 | + toggle=True, | |
| 1330 | + short_help_string=_("Reorient slices")) | |
| 1331 | + | |
| 1319 | 1332 | def __bind_events(self): |
| 1320 | 1333 | """ |
| 1321 | 1334 | Bind events related to pubsub. | ... | ... |