Commit 4fa55237998a2e57c25e8624af5500063acd8d19

Authored by sotodela
Committed by GitHub
1 parent 5e3adf0d
Exists in master

Coil projection enhancement (#320)

* modify arrow properties, replace orientation disk with torus

* Remove ball actor

* Change coil angle arrow projection constant to 5 degrees

* Add removing arrow and disk used for coil projection  when removing the peel

* Modify Add_Torus function to be able to modify the color, Modify colors for arrow and torus, Modify size of coil projected arrow

* Modify torus color

* Modify arrow color

* Undo changes done in commit 5fc6fd12b56e42a22571246c025256c30600deaf
invesalius/constants.py
@@ -782,7 +782,7 @@ ARROW_UPPER_LIMIT = 15 @@ -782,7 +782,7 @@ ARROW_UPPER_LIMIT = 15
782 COIL_ANGLES_THRESHOLD = 3 782 COIL_ANGLES_THRESHOLD = 3
783 COIL_COORD_THRESHOLD = 3 783 COIL_COORD_THRESHOLD = 3
784 TIMESTAMP = 2.0 784 TIMESTAMP = 2.0
785 -COIL_ANGLE_ARROW_PROJECTION_THRESHOLD = 10 785 +COIL_ANGLE_ARROW_PROJECTION_THRESHOLD = 5
786 786
787 CAM_MODE = True 787 CAM_MODE = True
788 788
invesalius/data/viewer_volume.py
@@ -174,7 +174,7 @@ class Viewer(wx.Panel): @@ -174,7 +174,7 @@ class Viewer(wx.Panel):
174 self.z_actor = None 174 self.z_actor = None
175 self.mark_actor = None 175 self.mark_actor = None
176 self.obj_projection_arrow_actor = None 176 self.obj_projection_arrow_actor = None
177 - self.object_orientation_disk_actor = None 177 + self.object_orientation_torus_actor = None
178 178
179 self._mode_cross = False 179 self._mode_cross = False
180 self._to_show_ball = 0 180 self._to_show_ball = 0
@@ -1316,17 +1316,18 @@ class Viewer(wx.Panel): @@ -1316,17 +1316,18 @@ class Viewer(wx.Panel):
1316 self.z_actor = self.add_line([0., 0., 0.], [0., 0., 1.], color=[1.0, .0, .0]) 1316 self.z_actor = self.add_line([0., 0., 0.], [0., 0., 1.], color=[1.0, .0, .0])
1317 1317
1318 self.obj_projection_arrow_actor = self.Add_ObjectArrow([0., 0., 0.], [0., 0., 0.], vtk_colors.GetColor3d('Red'), 1318 self.obj_projection_arrow_actor = self.Add_ObjectArrow([0., 0., 0.], [0., 0., 0.], vtk_colors.GetColor3d('Red'),
1319 - 15)  
1320 - self.object_orientation_disk_actor = self.Add_Object_Orientation_Disk([0., 0., 0.], [0., 0., 0.],  
1321 - vtk_colors.GetColor3d('Red')) 1319 + 8)
  1320 + self.object_orientation_torus_actor = self.Add_Torus([0., 0., 0.], [0., 0., 0.],
  1321 + vtk_colors.GetColor3d('Red'))
  1322 +
1322 #self.obj_projection_arrow_actor.SetVisibility(False) 1323 #self.obj_projection_arrow_actor.SetVisibility(False)
1323 - #self.object_orientation_disk_actor.SetVisibility(False) 1324 + #self.object_orientation_torus_actor.SetVisibility(False)
1324 self.ren.AddActor(self.obj_actor) 1325 self.ren.AddActor(self.obj_actor)
1325 self.ren.AddActor(self.x_actor) 1326 self.ren.AddActor(self.x_actor)
1326 self.ren.AddActor(self.y_actor) 1327 self.ren.AddActor(self.y_actor)
1327 self.ren.AddActor(self.z_actor) 1328 self.ren.AddActor(self.z_actor)
1328 #self.ren.AddActor(self.obj_projection_arrow_actor) 1329 #self.ren.AddActor(self.obj_projection_arrow_actor)
1329 - #self.ren.AddActor(self.object_orientation_disk_actor) 1330 + #self.ren.AddActor(self.object_orientation_torus_actor)
1330 # self.obj_axes = vtk.vtkAxesActor() 1331 # self.obj_axes = vtk.vtkAxesActor()
1331 # self.obj_axes.SetShaftTypeToCylinder() 1332 # self.obj_axes.SetShaftTypeToCylinder()
1332 # self.obj_axes.SetXAxisLabelText("x") 1333 # self.obj_axes.SetXAxisLabelText("x")
@@ -1356,10 +1357,36 @@ class Viewer(wx.Panel): @@ -1356,10 +1357,36 @@ class Viewer(wx.Panel):
1356 1357
1357 return disk_actor 1358 return disk_actor
1358 1359
  1360 + def Add_Torus(self, position, orientation, color=[0.0, 0.0, 1.0]):
  1361 + torus = vtk.vtkParametricTorus()
  1362 + torus.SetRingRadius(2)
  1363 + torus.SetCrossSectionRadius(1)
  1364 +
  1365 + torusSource = vtk.vtkParametricFunctionSource()
  1366 + torusSource.SetParametricFunction(torus)
  1367 + torusSource.Update()
  1368 +
  1369 + torusMapper = vtk.vtkPolyDataMapper()
  1370 + torusMapper.SetInputConnection(torusSource.GetOutputPort())
  1371 + torusMapper.SetScalarRange(0, 360)
  1372 +
  1373 + torusActor = vtk.vtkActor()
  1374 + torusActor.SetMapper(torusMapper)
  1375 + torusActor.GetProperty().SetDiffuseColor(color)
  1376 + torusActor.SetPosition(position)
  1377 + torusActor.SetOrientation(orientation)
  1378 +
  1379 + return torusActor
  1380 +
1359 def Add_ObjectArrow(self, direction, orientation, color=[0.0, 0.0, 1.0], size=2): 1381 def Add_ObjectArrow(self, direction, orientation, color=[0.0, 0.0, 1.0], size=2):
1360 vtk_colors = vtk.vtkNamedColors() 1382 vtk_colors = vtk.vtkNamedColors()
1361 1383
1362 arrow = vtk.vtkArrowSource() 1384 arrow = vtk.vtkArrowSource()
  1385 + arrow.SetTipResolution(40)
  1386 + arrow.SetShaftResolution(40)
  1387 + arrow.SetShaftRadius(0.05)
  1388 + arrow.SetTipRadius(0.15)
  1389 + arrow.SetTipLength(0.35)
1363 1390
1364 mapper = vtk.vtkPolyDataMapper() 1391 mapper = vtk.vtkPolyDataMapper()
1365 mapper.SetInputConnection(arrow.GetOutputPort()) 1392 mapper.SetInputConnection(arrow.GetOutputPort())
@@ -1410,10 +1437,14 @@ class Viewer(wx.Panel): @@ -1410,10 +1437,14 @@ class Viewer(wx.Panel):
1410 def AddPeeledSurface(self, flag, actor): 1437 def AddPeeledSurface(self, flag, actor):
1411 if self.actor_peel: 1438 if self.actor_peel:
1412 self.ren.RemoveActor(self.actor_peel) 1439 self.ren.RemoveActor(self.actor_peel)
  1440 + self.ren.RemoveActor(self.object_orientation_torus_actor)
  1441 + self.ren.RemoveActor(self.obj_projection_arrow_actor)
1413 self.actor_peel = None 1442 self.actor_peel = None
1414 if flag and actor: 1443 if flag and actor:
1415 self.ren.AddActor(actor) 1444 self.ren.AddActor(actor)
1416 self.actor_peel = actor 1445 self.actor_peel = actor
  1446 + self.ren.AddActor(self.object_orientation_torus_actor)
  1447 + self.ren.AddActor(self.obj_projection_arrow_actor)
1417 self.Refresh() 1448 self.Refresh()
1418 1449
1419 def GetPeelCenters(self, centers, normals): 1450 def GetPeelCenters(self, centers, normals):
@@ -1465,27 +1496,27 @@ class Viewer(wx.Panel): @@ -1465,27 +1496,27 @@ class Viewer(wx.Panel):
1465 1496
1466 1497
1467 self.ren.AddActor(self.obj_projection_arrow_actor) 1498 self.ren.AddActor(self.obj_projection_arrow_actor)
1468 - self.ren.AddActor(self.object_orientation_disk_actor) 1499 + self.ren.AddActor(self.object_orientation_torus_actor)
1469 1500
1470 self.obj_projection_arrow_actor.SetPosition(closestPoint) 1501 self.obj_projection_arrow_actor.SetPosition(closestPoint)
1471 self.obj_projection_arrow_actor.SetOrientation(coil_dir) 1502 self.obj_projection_arrow_actor.SetOrientation(coil_dir)
1472 1503
1473 - self.object_orientation_disk_actor.SetPosition(closestPoint)  
1474 - self.object_orientation_disk_actor.SetOrientation(coil_dir) 1504 + self.object_orientation_torus_actor.SetPosition(closestPoint)
  1505 + self.object_orientation_torus_actor.SetOrientation(coil_dir)
1475 1506
1476 # change color of arrow and disk according to angle 1507 # change color of arrow and disk according to angle
1477 if angle < self.angle_arrow_projection_threshold: 1508 if angle < self.angle_arrow_projection_threshold:
1478 - self.object_orientation_disk_actor.GetProperty().SetColor(vtk_colors.GetColor3d('Green'))  
1479 - self.obj_projection_arrow_actor.GetProperty().SetColor(vtk_colors.GetColor3d('Green')) 1509 + self.object_orientation_torus_actor.GetProperty().SetDiffuseColor([51/255,176/255,102/255])
  1510 + self.obj_projection_arrow_actor.GetProperty().SetColor([55/255,120/255,163/255])
1480 else: 1511 else:
1481 - self.object_orientation_disk_actor.GetProperty().SetColor(vtk_colors.GetColor3d('indian_red'))  
1482 - self.obj_projection_arrow_actor.GetProperty().SetColor(vtk_colors.GetColor3d('indian_red')) 1512 + self.object_orientation_torus_actor.GetProperty().SetDiffuseColor([240/255,146/255,105/255])
  1513 + self.obj_projection_arrow_actor.GetProperty().SetColor([240/255,146/255,105/255])
1483 else: 1514 else:
1484 self.ren.RemoveActor(self.y_actor) 1515 self.ren.RemoveActor(self.y_actor)
1485 1516
1486 else: 1517 else:
1487 self.ren.RemoveActor(self.obj_projection_arrow_actor) 1518 self.ren.RemoveActor(self.obj_projection_arrow_actor)
1488 - self.ren.RemoveActor(self.object_orientation_disk_actor) 1519 + self.ren.RemoveActor(self.object_orientation_torus_actor)
1489 self.ren.RemoveActor(self.x_actor) 1520 self.ren.RemoveActor(self.x_actor)
1490 #self.ren.RemoveActor(self.y_actor) 1521 #self.ren.RemoveActor(self.y_actor)
1491 self.Refresh() 1522 self.Refresh()
@@ -1501,7 +1532,7 @@ class Viewer(wx.Panel): @@ -1501,7 +1532,7 @@ class Viewer(wx.Panel):
1501 self.x_actor.SetVisibility(self.obj_state) 1532 self.x_actor.SetVisibility(self.obj_state)
1502 self.y_actor.SetVisibility(self.obj_state) 1533 self.y_actor.SetVisibility(self.obj_state)
1503 self.z_actor.SetVisibility(self.obj_state) 1534 self.z_actor.SetVisibility(self.obj_state)
1504 - #self.object_orientation_disk_actor.SetVisibility(self.obj_state) 1535 + #self.object_orientation_torus_actor.SetVisibility(self.obj_state)
1505 #self.obj_projection_arrow_actor.SetVisibility(self.obj_state) 1536 #self.obj_projection_arrow_actor.SetVisibility(self.obj_state)
1506 self.Refresh() 1537 self.Refresh()
1507 1538
@@ -1562,7 +1593,7 @@ class Viewer(wx.Panel): @@ -1562,7 +1593,7 @@ class Viewer(wx.Panel):
1562 self.ren.RemoveActor(self.x_actor) 1593 self.ren.RemoveActor(self.x_actor)
1563 #self.ren.RemoveActor(self.y_actor) 1594 #self.ren.RemoveActor(self.y_actor)
1564 self.ren.RemoveActor(self.obj_projection_arrow_actor) 1595 self.ren.RemoveActor(self.obj_projection_arrow_actor)
1565 - self.ren.RemoveActor(self.object_orientation_disk_actor) 1596 + self.ren.RemoveActor(self.object_orientation_torus_actor)
1566 self.GetCellIntersection(p1, norm, coil_norm, coil_dir) 1597 self.GetCellIntersection(p1, norm, coil_norm, coil_dir)
1567 self.Refresh() 1598 self.Refresh()
1568 1599
@@ -1580,14 +1611,14 @@ class Viewer(wx.Panel): @@ -1580,14 +1611,14 @@ class Viewer(wx.Panel):
1580 self.ren.RemoveActor(self.z_actor) 1611 self.ren.RemoveActor(self.z_actor)
1581 self.ren.RemoveActor(self.mark_actor) 1612 self.ren.RemoveActor(self.mark_actor)
1582 self.ren.RemoveActor(self.obj_projection_arrow_actor) 1613 self.ren.RemoveActor(self.obj_projection_arrow_actor)
1583 - self.ren.RemoveActor(self.object_orientation_disk_actor) 1614 + self.ren.RemoveActor(self.object_orientation_torus_actor)
1584 self.obj_actor = None 1615 self.obj_actor = None
1585 self.x_actor = None 1616 self.x_actor = None
1586 self.y_actor = None 1617 self.y_actor = None
1587 self.z_actor = None 1618 self.z_actor = None
1588 self.mark_actor = None 1619 self.mark_actor = None
1589 self.obj_projection_arrow_actor = None 1620 self.obj_projection_arrow_actor = None
1590 - self.object_orientation_disk_actor=None 1621 + self.object_orientation_torus_actor=None
1591 self.Refresh() 1622 self.Refresh()
1592 1623
1593 def UpdateShowObjectState(self, state): 1624 def UpdateShowObjectState(self, state):
invesalius/gui/task_navigator.py
@@ -2022,8 +2022,13 @@ class TractographyPanel(wx.Panel): @@ -2022,8 +2022,13 @@ class TractographyPanel(wx.Panel):
2022 # self.view_peeling = ctrl.GetValue() 2022 # self.view_peeling = ctrl.GetValue()
2023 if ctrl.GetValue(): 2023 if ctrl.GetValue():
2024 actor = self.brain_peel.get_actor(self.peel_depth, self.affine_vtk) 2024 actor = self.brain_peel.get_actor(self.peel_depth, self.affine_vtk)
  2025 + self.peel_loaded = True
  2026 + Publisher.sendMessage('Update peel visualization', data=self.peel_loaded)
2025 else: 2027 else:
2026 actor = None 2028 actor = None
  2029 + self.peel_loaded = False
  2030 + Publisher.sendMessage('Update peel visualization', data= self.peel_loaded)
  2031 +
2027 Publisher.sendMessage('Update peel', flag=ctrl.GetValue(), actor=actor) 2032 Publisher.sendMessage('Update peel', flag=ctrl.GetValue(), actor=actor)
2028 2033
2029 def OnEnableTracts(self, evt, ctrl): 2034 def OnEnableTracts(self, evt, ctrl):