I’ve created a listener when SegmentationNodes are added to my scene, something like this:
@vtk.calldata_type(vtk.VTK_OBJECT)
def onNodeAdded(caller, event, node):
if node.IsA( "vtkMRMLSegmentationNode" ):
# call `myFunction()` in current thread
myFunction( node )
slicer.mrmlScene.AddObserver(slicer.vtkMRMLScene.NodeAddedEvent, onNodeAdded)
Actually, I’m performing some editor effects automatically whenever I add a SegmentationNode.
If I don’t use the callback (i.e. slicer.mrmlScene.AddObserver() not called) and do the steps manually: call myFunction() in the interpreter after the node was added, things works as expected. However, if I add the callback as an observer (above code block), something wrong happens so myFunction() fails. I guess this is because the SegmentationNode has to be fully added in order for myFunction() to work.
How can I call myFunction() after the SegmentationNode and its dependencies was completely added? A timed callback to myFunction() can be a solution (practically but not completely safe in theory).