Commit 64eec96aa2a3767b7e96b99df4d16f496d8b86b3
1 parent
4ad28286
Exists in
rotvol
Improvements
Showing
1 changed file
with
73 additions
and
45 deletions
Show diff stats
invesalius/data/styles.py
... | ... | @@ -1431,6 +1431,8 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1431 | 1431 | self.AddObserver("MouseMoveEvent", self.OnMouseMove) |
1432 | 1432 | self.viewer.slice_data.renderer.AddObserver("StartEvent", self.OnUpdate) |
1433 | 1433 | |
1434 | + self.viewer.interactor.Bind(wx.EVT_LEFT_DCLICK, self.OnDblClick) | |
1435 | + | |
1434 | 1436 | def SetUp(self): |
1435 | 1437 | self.viewer.slice_.current_mask.is_shown = False |
1436 | 1438 | self.draw_lines() |
... | ... | @@ -1495,55 +1497,22 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1495 | 1497 | """ |
1496 | 1498 | This event is responsible to reorient image, set mouse cursors |
1497 | 1499 | """ |
1498 | - # Getting mouse position | |
1499 | - iren = self.viewer.interactor | |
1500 | - mx, my = iren.GetEventPosition() | |
1501 | - | |
1502 | - # Getting center value | |
1503 | - center = self.viewer.slice_.center | |
1504 | - coord = vtk.vtkCoordinate() | |
1505 | - coord.SetValue(center) | |
1506 | - cx, cy = coord.GetComputedDisplayValue(self.viewer.slice_data.renderer) | |
1507 | - | |
1508 | - self.picker.Pick(mx, my, 0, self.viewer.slice_data.renderer) | |
1509 | - x, y, z = self.picker.GetPickPosition() | |
1510 | 1500 | |
1511 | 1501 | if self.dragging: |
1512 | - icx, icy, icz = self.viewer.slice_.center | |
1513 | - | |
1514 | - if self.viewer.orientation == 'AXIAL': | |
1515 | - self.viewer.slice_.center = (x, y, icz) | |
1516 | - elif self.viewer.orientation == 'CORONAL': | |
1517 | - self.viewer.slice_.center = (x, icy, z) | |
1518 | - elif self.viewer.orientation == 'SAGITAL': | |
1519 | - self.viewer.slice_.center = (icx, y, z) | |
1520 | - Publisher.sendMessage('Update slice viewer') | |
1521 | - | |
1502 | + self._move_center_rot() | |
1522 | 1503 | 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') | |
1504 | + self._rotate() | |
1546 | 1505 | else: |
1506 | + # Getting mouse position | |
1507 | + iren = self.viewer.interactor | |
1508 | + mx, my = iren.GetEventPosition() | |
1509 | + | |
1510 | + # Getting center value | |
1511 | + center = self.viewer.slice_.center | |
1512 | + coord = vtk.vtkCoordinate() | |
1513 | + coord.SetValue(center) | |
1514 | + cx, cy = coord.GetComputedDisplayValue(self.viewer.slice_data.renderer) | |
1515 | + | |
1547 | 1516 | dist_center = ((mx - cx)**2 + (my - cy)**2)**0.5 |
1548 | 1517 | if dist_center <= 15: |
1549 | 1518 | self._over_center = True |
... | ... | @@ -1570,6 +1539,64 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1570 | 1539 | self.line2.SetPoint2(x, h, 0) |
1571 | 1540 | self.line2.Update() |
1572 | 1541 | |
1542 | + def OnDblClick(self, evt): | |
1543 | + self.viewer.slice_.rotations = [0, 0, 0] | |
1544 | + self._discard_buffers() | |
1545 | + self.viewer.slice_.current_mask.clear_history() | |
1546 | + Publisher.sendMessage('Reload actual slice') | |
1547 | + | |
1548 | + def _move_center_rot(self): | |
1549 | + iren = self.viewer.interactor | |
1550 | + mx, my = iren.GetEventPosition() | |
1551 | + | |
1552 | + icx, icy, icz = self.viewer.slice_.center | |
1553 | + | |
1554 | + self.picker.Pick(mx, my, 0, self.viewer.slice_data.renderer) | |
1555 | + x, y, z = self.picker.GetPickPosition() | |
1556 | + | |
1557 | + if self.viewer.orientation == 'AXIAL': | |
1558 | + self.viewer.slice_.center = (x, y, icz) | |
1559 | + elif self.viewer.orientation == 'CORONAL': | |
1560 | + self.viewer.slice_.center = (x, icy, z) | |
1561 | + elif self.viewer.orientation == 'SAGITAL': | |
1562 | + self.viewer.slice_.center = (icx, y, z) | |
1563 | + | |
1564 | + self._discard_buffers() | |
1565 | + self.viewer.slice_.current_mask.clear_history() | |
1566 | + Publisher.sendMessage('Reload actual slice') | |
1567 | + | |
1568 | + def _rotate(self): | |
1569 | + # Getting mouse position | |
1570 | + iren = self.viewer.interactor | |
1571 | + mx, my = iren.GetEventPosition() | |
1572 | + | |
1573 | + cx, cy, cz = self.viewer.slice_.center | |
1574 | + | |
1575 | + self.picker.Pick(mx, my, 0, self.viewer.slice_data.renderer) | |
1576 | + x, y, z = self.picker.GetPickPosition() | |
1577 | + | |
1578 | + if self.viewer.orientation == 'AXIAL': | |
1579 | + p1 = np.array((y-cy, x-cx)) | |
1580 | + elif self.viewer.orientation == 'CORONAL': | |
1581 | + p1 = np.array((z-cz, x-cx)) | |
1582 | + elif self.viewer.orientation == 'SAGITAL': | |
1583 | + p1 = np.array((z-cz, y-cy)) | |
1584 | + p0 = self.p0 | |
1585 | + | |
1586 | + if self.viewer.orientation == 'AXIAL': | |
1587 | + angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1]) | |
1588 | + self.viewer.slice_.rotations[2] = angle | |
1589 | + elif self.viewer.orientation == 'CORONAL': | |
1590 | + angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1]) | |
1591 | + self.viewer.slice_.rotations[1] = angle | |
1592 | + elif self.viewer.orientation == 'SAGITAL': | |
1593 | + angle = np.arctan2(p0[0] , p0[1]) - np.arctan2(p1[0], p1[1]) | |
1594 | + self.viewer.slice_.rotations[0] = angle | |
1595 | + | |
1596 | + self._discard_buffers() | |
1597 | + self.viewer.slice_.current_mask.clear_history() | |
1598 | + Publisher.sendMessage('Reload actual slice') | |
1599 | + | |
1573 | 1600 | def _create_line(self, x0, y0, x1, y1, color): |
1574 | 1601 | line = vtk.vtkLineSource() |
1575 | 1602 | line.SetPoint1(x0, y0, 0) |
... | ... | @@ -1587,6 +1614,7 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
1587 | 1614 | actor.SetMapper(mapper) |
1588 | 1615 | actor.GetProperty().SetLineWidth(2.0) |
1589 | 1616 | actor.GetProperty().SetColor(color) |
1617 | + actor.GetProperty().SetOpacity(0.5) | |
1590 | 1618 | |
1591 | 1619 | self.viewer.slice_data.renderer.AddActor(actor) |
1592 | 1620 | ... | ... |