forked from smart-needle-manual/system_integration
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsolution.py
More file actions
38 lines (29 loc) · 1.18 KB
/
solution.py
File metadata and controls
38 lines (29 loc) · 1.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import vtk
import slicer
# Get the Slicer ROS2 logic and node
rosLogic = slicer.util.getModuleLogic('ROS2')
rosNode = rosLogic.GetDefaultROS2Node()
# Optional: list available subscriber types
rosNode.RegisteredROS2SubscriberNodes()
# Create subscriber for PoseArray
subShape = rosNode.CreateAndAddSubscriberNode('PoseArray', '/needle/state/current_shape')
# Create fiducial node
fid = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLMarkupsFiducialNode', 'PoseArrayPoints')
# Create curve from fiducials (Python API)
markupsLogic = slicer.modules.markups.logic()
curveNode = markupsLogic.AddNewCurveNode(fid)
curveNode.SetName("NeedleShapeZ")
# Callback to update fiducials from PoseArray
def myCallback(caller=None, event=None):
message = subShape.GetLastMessage() # vtkTransformCollection
num = message.GetNumberOfItems()
# Clear old fiducials
fid.RemoveAllMarkups()
for i in range(num):
transform = message.GetItemAsObject(i)
m = vtk.vtkMatrix4x4()
transform.GetMatrix(m)
x, y, z = m.GetElement(0,3), m.GetElement(1,3), m.GetElement(2,3)
fid.AddFiducial(x, y, z)
# Add observer
observerId = subShape.AddObserver('ModifiedEvent', myCallback)