3D Slicer 中的有一群类以“xxxxNode”方式命名。每一个类除了自身特有的一些功能外,还有各种各样的Event,以vtkMRMLMarkupsNode为例,有:
- CopyWithSceneWithSingleModifiedEvent
- CopyWithSingleModifiedEvent
- CopyWithoutModifiedEvent
- DisplayModifiedEvent
- GetDisableModifiedEvent
- HierarchyModifiedEvent
- IDChangedEvent
- InvokeCustomModifiedEvent
- InvokeEvent
- InvokePendingModifiedEvent
- LabelFormatModifiedEvent
- LockModifiedEvent
- MarkupAddedEvent
- MarkupRemovedEvent
- NthMarkupModifiedEvent
- PointClickedEvent
- ……等等……(太多了,列不完)
在3D Slicer扩展程序编写时,我们常常需要实现对某一个事件(Event)作出响应,这时就需要用到这些Event,具体如何使用呢?以vtkMRMLMarkupsNode的MarkupAddedEvent为例,实现添加一个标点就打印该点坐标的功能:
import slicer
def MarkupAddedEventCallback(Node, Event):
index = Node.GetNumberOfFiducials() - 1
pos = [0, 0, 0]
Node.GetNthFiducialPosition(index, pos)
print(pos)
MarkupsNode = slicer.vtkMRMLMarkupsNode()
MarkupsNode.AddObserver(MarkupsNode.MarkupAddedEvent, MarkupAddedEventCallback)
参考:[slicer-devel] How to get the new markup’s position through adding observer to MarkupAddedEvent