Commit b41e19ac4df328740079278582f835388df4d154
1 parent
95cc3f3a
Exists in
rotvol
Showing angles in a dialog
Showing
4 changed files
with
75 additions
and
16 deletions
Show diff stats
invesalius/constants.py
invesalius/data/styles.py
... | ... | @@ -1426,7 +1426,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1426 | 1426 | |
1427 | 1427 | self.picker = vtk.vtkWorldPointPicker() |
1428 | 1428 | |
1429 | - self.AddObserver("KeyPressEvent", self.OnKeyPress) | |
1429 | + # self.AddObserver("KeyPressEvent", self.OnKeyPress) | |
1430 | 1430 | self.AddObserver("LeftButtonPressEvent",self.OnLeftClick) |
1431 | 1431 | self.AddObserver("LeftButtonReleaseEvent", self.OnLeftRelease) |
1432 | 1432 | self.AddObserver("MouseMoveEvent", self.OnMouseMove) |
... | ... | @@ -1546,6 +1546,9 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1546 | 1546 | def OnDblClick(self, evt): |
1547 | 1547 | self.viewer.slice_.rotations = [0, 0, 0] |
1548 | 1548 | self.viewer.slice_.q_orientation = np.array((1, 0, 0, 0)) |
1549 | + | |
1550 | + Publisher.sendMessage('Update reorient angles', (0, 0, 0)) | |
1551 | + | |
1549 | 1552 | self._discard_buffers() |
1550 | 1553 | self.viewer.slice_.current_mask.clear_history() |
1551 | 1554 | Publisher.sendMessage('Reload actual slice') |
... | ... | @@ -1566,6 +1569,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1566 | 1569 | elif self.viewer.orientation == 'SAGITAL': |
1567 | 1570 | self.viewer.slice_.center = (icx, y, z) |
1568 | 1571 | |
1572 | + | |
1569 | 1573 | self._discard_buffers() |
1570 | 1574 | self.viewer.slice_.current_mask.clear_history() |
1571 | 1575 | Publisher.sendMessage('Reload actual slice') |
... | ... | @@ -1608,6 +1612,9 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1608 | 1612 | # angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1]) |
1609 | 1613 | self.viewer.slice_.rotations[0] = angle |
1610 | 1614 | |
1615 | + az, ay, ax = transformations.euler_from_quaternion(self.viewer.slice_.q_orientation) | |
1616 | + Publisher.sendMessage('Update reorient angles', (ax, ay, az)) | |
1617 | + | |
1611 | 1618 | self._discard_buffers() |
1612 | 1619 | self.viewer.slice_.current_mask.clear_history() |
1613 | 1620 | Publisher.sendMessage('Reload actual slice %s' % self.viewer.orientation) | ... | ... |
invesalius/gui/dialogs.py
... | ... | @@ -1566,3 +1566,51 @@ class MaskBooleanDialog(wx.Dialog): |
1566 | 1566 | |
1567 | 1567 | self.Close() |
1568 | 1568 | self.Destroy() |
1569 | + | |
1570 | + | |
1571 | +class ReorientImageDialog(wx.Dialog): | |
1572 | + def __init__(self): | |
1573 | + pre = wx.PreDialog() | |
1574 | + pre.Create(wx.GetApp().GetTopWindow(), -1, _(u'Image reorientation'), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT) | |
1575 | + self.PostCreate(pre) | |
1576 | + | |
1577 | + self._init_gui() | |
1578 | + self._bind_events() | |
1579 | + | |
1580 | + def _init_gui(self): | |
1581 | + self.anglex = wx.TextCtrl(self, -1, "0.0") | |
1582 | + self.angley = wx.TextCtrl(self, -1, "0.0") | |
1583 | + self.anglez = wx.TextCtrl(self, -1, "0.0") | |
1584 | + | |
1585 | + btnapply = wx.Button(self, -1, _("Apply")) | |
1586 | + | |
1587 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | |
1588 | + | |
1589 | + sizer.Add(wx.StaticText(self, -1, _("Angle X")), 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5) | |
1590 | + sizer.Add(self.anglex, 0, wx.EXPAND | wx.ALL, 5) | |
1591 | + sizer.AddSpacer(5) | |
1592 | + | |
1593 | + sizer.Add(wx.StaticText(self, -1, _("Angle Y")), 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5) | |
1594 | + sizer.Add(self.angley, 0, wx.EXPAND | wx.ALL, 5) | |
1595 | + sizer.AddSpacer(5) | |
1596 | + | |
1597 | + sizer.Add(wx.StaticText(self, -1, _("Angle Z")), 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5) | |
1598 | + sizer.Add(self.anglez, 0, wx.EXPAND | wx.ALL, 5) | |
1599 | + sizer.AddSpacer(5) | |
1600 | + | |
1601 | + sizer.Add(btnapply, 0, wx.EXPAND | wx.ALL, 5) | |
1602 | + sizer.AddSpacer(5) | |
1603 | + | |
1604 | + self.SetSizer(sizer) | |
1605 | + self.Fit() | |
1606 | + | |
1607 | + def _bind_events(self): | |
1608 | + Publisher.subscribe(self._update_angles, 'Update reorient angles') | |
1609 | + | |
1610 | + def _update_angles(self, pubsub_evt): | |
1611 | + anglex, angley, anglez = pubsub_evt.data | |
1612 | + self.anglex.SetValue("%.2f" % np.rad2deg(anglex)) | |
1613 | + self.angley.SetValue("%.2f" % np.rad2deg(angley)) | |
1614 | + self.anglez.SetValue("%.2f" % np.rad2deg(anglez)) | |
1615 | + | |
1616 | + print anglex, angley, anglez | ... | ... |
invesalius/gui/frame.py
... | ... | @@ -411,6 +411,9 @@ class Frame(wx.Frame): |
411 | 411 | elif id == const.ID_CLEAN_MASK: |
412 | 412 | self.OnCleanMask() |
413 | 413 | |
414 | + elif id == const.ID_REORIENT_IMG: | |
415 | + self.OnReorientImg() | |
416 | + | |
414 | 417 | def OnSize(self, evt): |
415 | 418 | """ |
416 | 419 | Refresh GUI when frame is resized. |
... | ... | @@ -520,6 +523,11 @@ class Frame(wx.Frame): |
520 | 523 | Publisher.sendMessage('Clean current mask') |
521 | 524 | Publisher.sendMessage('Reload actual slice') |
522 | 525 | |
526 | + def OnReorientImg(self): | |
527 | + Publisher.sendMessage('Enable style', const.SLICE_STATE_REORIENT) | |
528 | + rdlg = dlg.ReorientImageDialog() | |
529 | + rdlg.Show() | |
530 | + | |
523 | 531 | # ------------------------------------------------------------------ |
524 | 532 | # ------------------------------------------------------------------ |
525 | 533 | # ------------------------------------------------------------------ |
... | ... | @@ -538,7 +546,8 @@ class MenuBar(wx.MenuBar): |
538 | 546 | # not. Eg. save should only be available if a project is open |
539 | 547 | self.enable_items = [const.ID_PROJECT_SAVE, |
540 | 548 | const.ID_PROJECT_SAVE_AS, |
541 | - const.ID_PROJECT_CLOSE] | |
549 | + const.ID_PROJECT_CLOSE, | |
550 | + const.ID_REORIENT_IMG] | |
542 | 551 | self.__init_items() |
543 | 552 | self.__bind_events() |
544 | 553 | |
... | ... | @@ -650,6 +659,12 @@ class MenuBar(wx.MenuBar): |
650 | 659 | |
651 | 660 | tools_menu.AppendMenu(-1, _(u"Mask"), mask_menu) |
652 | 661 | |
662 | + # Image menu | |
663 | + image_menu = wx.Menu() | |
664 | + reorient_menu = image_menu.Append(const.ID_REORIENT_IMG, _(u'Reorient image\tCtrl+Shift+R')) | |
665 | + reorient_menu.Enable(False) | |
666 | + tools_menu.AppendMenu(-1, _(u'Image'), image_menu) | |
667 | + | |
653 | 668 | |
654 | 669 | # VIEW |
655 | 670 | #view_tool_menu = wx.Menu() |
... | ... | @@ -1278,8 +1293,7 @@ class SliceToolBar(AuiToolBar): |
1278 | 1293 | |
1279 | 1294 | self.parent = parent |
1280 | 1295 | self.enable_items = [const.SLICE_STATE_SCROLL, |
1281 | - const.SLICE_STATE_CROSS, | |
1282 | - const.SLICE_STATE_REORIENT] | |
1296 | + const.SLICE_STATE_CROSS,] | |
1283 | 1297 | self.__init_items() |
1284 | 1298 | self.__bind_events() |
1285 | 1299 | self.__bind_events_wx() |
... | ... | @@ -1298,9 +1312,6 @@ class SliceToolBar(AuiToolBar): |
1298 | 1312 | |
1299 | 1313 | path = os.path.join(d,"cross_original.png") |
1300 | 1314 | 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) | |
1304 | 1315 | else: |
1305 | 1316 | path = os.path.join(d, "slice.png") |
1306 | 1317 | BMP_SLICE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
... | ... | @@ -1308,9 +1319,6 @@ class SliceToolBar(AuiToolBar): |
1308 | 1319 | path = os.path.join(d,"cross.png") |
1309 | 1320 | BMP_CROSS = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) |
1310 | 1321 | |
1311 | - path = os.path.join(d, "tool_rotate.png") | |
1312 | - BMP_REORIENT = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
1313 | - | |
1314 | 1322 | self.sst = self.AddToggleTool(const.SLICE_STATE_SCROLL, |
1315 | 1323 | BMP_SLICE,#, kind=wx.ITEM_CHECK) |
1316 | 1324 | wx.NullBitmap, |
... | ... | @@ -1323,12 +1331,6 @@ class SliceToolBar(AuiToolBar): |
1323 | 1331 | toggle=True, |
1324 | 1332 | short_help_string=_("Slices' cross intersection")) |
1325 | 1333 | |
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 | - | |
1332 | 1334 | def __bind_events(self): |
1333 | 1335 | """ |
1334 | 1336 | Bind events related to pubsub. | ... | ... |