Commit 4ad282869a0fb3ce665f68e81367fd6e31403b55

Authored by Thiago Franco de Moraes
1 parent be359ec4
Exists in rotvol

It's already rotating

invesalius/data/slice_.py
@@ -94,7 +94,7 @@ class Slice(object): @@ -94,7 +94,7 @@ class Slice(object):
94 self.n_border = const.PROJECTION_BORDER_SIZE 94 self.n_border = const.PROJECTION_BORDER_SIZE
95 95
96 self._spacing = (1.0, 1.0, 1.0) 96 self._spacing = (1.0, 1.0, 1.0)
97 - self.rotations = (0, 0, 0) 97 + self.rotations = [0, 0, 0]
98 self.center = [0, 0, 0] 98 self.center = [0, 0, 0]
99 99
100 self.number_of_colours = 256 100 self.number_of_colours = 256
invesalius/data/styles.py
@@ -1421,6 +1421,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): @@ -1421,6 +1421,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1421 1421
1422 self._over_center = False 1422 self._over_center = False
1423 self.dragging = False 1423 self.dragging = False
  1424 + self.to_rot = False
1424 1425
1425 self.picker = vtk.vtkWorldPointPicker() 1426 self.picker = vtk.vtkWorldPointPicker()
1426 1427
@@ -1458,10 +1459,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): @@ -1458,10 +1459,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1458 rx += np.deg2rad(delta) 1459 rx += np.deg2rad(delta)
1459 1460
1460 self.viewer.slice_.rotations = (rx, ry, rz) 1461 self.viewer.slice_.rotations = (rx, ry, rz)
1461 -  
1462 - for buffer_ in self.viewer.slice_.buffer_slices.values():  
1463 - buffer_.discard_vtk_image()  
1464 - buffer_.discard_image() 1462 + self._discard_buffers()
1465 1463
1466 self.viewer.slice_.current_mask.clear_history() 1464 self.viewer.slice_.current_mask.clear_history()
1467 Publisher.sendMessage('Reload actual slice') 1465 Publisher.sendMessage('Reload actual slice')
@@ -1469,9 +1467,29 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): @@ -1469,9 +1467,29 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1469 def OnLeftClick(self, obj, evt): 1467 def OnLeftClick(self, obj, evt):
1470 if self._over_center: 1468 if self._over_center:
1471 self.dragging = True 1469 self.dragging = True
  1470 + else:
  1471 + x, y = self.viewer.interactor.GetEventPosition()
  1472 + w, h = self.viewer.interactor.GetSize()
  1473 +
  1474 + self.picker.Pick(h/2.0, w/2.0, 0, self.viewer.slice_data.renderer)
  1475 + cx, cy, cz = self.viewer.slice_.center
  1476 +
  1477 + self.picker.Pick(x, y, 0, self.viewer.slice_data.renderer)
  1478 + x, y, z = self.picker.GetPickPosition()
  1479 +
  1480 + if self.viewer.orientation == 'AXIAL':
  1481 + self.p0 = np.array((y-cy, x-cx))
  1482 + elif self.viewer.orientation == 'CORONAL':
  1483 + self.p0 = np.array((z-cz, x-cx))
  1484 + elif self.viewer.orientation == 'SAGITAL':
  1485 + self.p0 = np.array((z-cz, y-cy))
  1486 +
  1487 + self.to_rot = True
  1488 +
1472 1489
1473 def OnLeftRelease(self, obj, evt): 1490 def OnLeftRelease(self, obj, evt):
1474 self.dragging = False 1491 self.dragging = False
  1492 + self.to_rot = False
1475 1493
1476 def OnMouseMove(self, obj, evt): 1494 def OnMouseMove(self, obj, evt):
1477 """ 1495 """
@@ -1487,11 +1505,10 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): @@ -1487,11 +1505,10 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1487 coord.SetValue(center) 1505 coord.SetValue(center)
1488 cx, cy = coord.GetComputedDisplayValue(self.viewer.slice_data.renderer) 1506 cx, cy = coord.GetComputedDisplayValue(self.viewer.slice_data.renderer)
1489 1507
1490 - dist_center = ((mx - cx)**2 + (my - cy)**2)**0.5 1508 + self.picker.Pick(mx, my, 0, self.viewer.slice_data.renderer)
  1509 + x, y, z = self.picker.GetPickPosition()
1491 1510
1492 if self.dragging: 1511 if self.dragging:
1493 - self.picker.Pick(mx, my, 0, self.viewer.slice_data.renderer)  
1494 - x, y, z = self.picker.GetPickPosition()  
1495 icx, icy, icz = self.viewer.slice_.center 1512 icx, icy, icz = self.viewer.slice_.center
1496 1513
1497 if self.viewer.orientation == 'AXIAL': 1514 if self.viewer.orientation == 'AXIAL':
@@ -1502,7 +1519,32 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): @@ -1502,7 +1519,32 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1502 self.viewer.slice_.center = (icx, y, z) 1519 self.viewer.slice_.center = (icx, y, z)
1503 Publisher.sendMessage('Update slice viewer') 1520 Publisher.sendMessage('Update slice viewer')
1504 1521
  1522 + elif self.to_rot:
  1523 + cx, cy, cz = self.viewer.slice_.center
  1524 + # x, y, z = self.picker.GetPickPosition()
  1525 + if self.viewer.orientation == 'AXIAL':
  1526 + p1 = np.array((y-cy, x-cx))
  1527 + elif self.viewer.orientation == 'CORONAL':
  1528 + p1 = np.array((z-cz, x-cx))
  1529 + elif self.viewer.orientation == 'SAGITAL':
  1530 + p1 = np.array((z-cz, y-cy))
  1531 + p0 = self.p0
  1532 +
  1533 + if self.viewer.orientation == 'AXIAL':
  1534 + angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1])
  1535 + self.viewer.slice_.rotations[2] = angle
  1536 + elif self.viewer.orientation == 'CORONAL':
  1537 + angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1])
  1538 + self.viewer.slice_.rotations[1] = angle
  1539 + elif self.viewer.orientation == 'SAGITAL':
  1540 + angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1])
  1541 + self.viewer.slice_.rotations[0] = angle
  1542 + self._discard_buffers()
  1543 + self.viewer.slice_.current_mask.clear_history()
  1544 + Publisher.sendMessage('Reload actual slice')
  1545 + Publisher.sendMessage('Update slice viewer')
1505 else: 1546 else:
  1547 + dist_center = ((mx - cx)**2 + (my - cy)**2)**0.5
1506 if dist_center <= 15: 1548 if dist_center <= 15:
1507 self._over_center = True 1549 self._over_center = True
1508 cursor = wx.StockCursor(wx.CURSOR_SIZENESW) 1550 cursor = wx.StockCursor(wx.CURSOR_SIZENESW)
@@ -1567,6 +1609,11 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): @@ -1567,6 +1609,11 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle):
1567 self.line2 = self._create_line(0.5, 0, 0.5, 1, color2) 1609 self.line2 = self._create_line(0.5, 0, 0.5, 1, color2)
1568 1610
1569 1611
  1612 + def _discard_buffers(self):
  1613 + for buffer_ in self.viewer.slice_.buffer_slices.values():
  1614 + buffer_.discard_vtk_image()
  1615 + buffer_.discard_image()
  1616 +
1570 def get_style(style): 1617 def get_style(style):
1571 STYLES = { 1618 STYLES = {
1572 const.STATE_DEFAULT: DefaultInteractorStyle, 1619 const.STATE_DEFAULT: DefaultInteractorStyle,