# Handle Markups events from an external module

**URL:** <https://discourse.slicer.org/t/handle-markups-events-from-an-external-module/6332>\
**Category:** Development\
**Created:** [March 28, 2019, 8:37pm UTC](https://discourse.slicer.org/t/handle-markups-events-from-an-external-module/6332 "2019-03-28T20:37:16Z")\
**Posts on this page:** 1\
**Showing post:** 28

<div class="post-metadata">

**Author:** ![Fangwen\_Zhai](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/fangwen_zhai/32/6001_2.png) [@Fangwen\_Zhai](https://discourse.slicer.org/u/Fangwen_Zhai)\
**Post date:** [March 24, 2020, 6:44am UTC](https://discourse.slicer.org/t/handle-markups-events-from-an-external-module/6332/28 "2020-03-24T06:44:01Z")

</div>

> [@lassoan](#):
>
> I’ve added a new pair of events (available in Slicer Preview Release from tomorrow): `slicer.vtkMRMLMarkupsNode.PointPositionDefinedEvent` and `slicer.vtkMRMLMarkupsNode.PointPositionUndefinedEvent`. These are only invoked when a point is placed or a placed point is removed. Not impacted by point previews.
> 
> ```python
> def onMarkupPointPositionDefined(caller, event):
> markupsNode = caller
> movingMarkupIndex = markupsNode.GetDisplayNode().GetActiveControlPoint()
> logging.info(f"Markup point added: point ID = {movingMarkupIndex}")
> 
> def onMarkupPointPositionUndefined(caller, event):
> markupsNode = caller
> movingMarkupIndex = markupsNode.GetDisplayNode().GetActiveControlPoint()
> logging.info(f"Markup point removed: point ID = {movingMarkupIndex}")
> 
> markupsNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLMarkupsFiducialNode")
> markupsNode.CreateDefaultDisplayNodes()
> markupsNode.AddFiducial(0,0,0)
> markupsNode.AddObserver(slicer.vtkMRMLMarkupsNode.PointPositionDefinedEvent, onMarkupPointPositionDefined)
> markupsNode.AddObserver(slicer.vtkMRMLMarkupsNode.PointPositionUndefinedEvent, onMarkupPointPositionUndefined)
> 
> ```

As to the two events, there may be a bug in `bool vtkMRMLMarkupsNode::InsertControlPoint(ControlPoint *controlPoint, int targetIndex)`, line 689 of vtkMRMLMarkupsNode.cxx:

```C++
// let observers know that a markup was added
  this->InvokeCustomModifiedEvent(vtkMRMLMarkupsNode::PointAddedEvent, static_cast<void*>(&targetIndex));
  if (controlPoint->PositionStatus == vtkMRMLMarkupsNode::PositionDefined)
    {
    this->InvokeCustomModifiedEvent(vtkMRMLMarkupsNode::PointPositionUndefinedEvent, static_cast<void*>(&targetIndex));
    }
  this->UpdateMeasurements();

```

I think PointPositionUndefinedEvent should be PointPositionDefinedEvent?

---

_[View the full topic](https://discourse.slicer.org/t/handle-markups-events-from-an-external-module/6332)._
