Back to Projects List
MarkupConstraints Slicer Module
Key Investigators
  - David Allemang (Kitware Inc.)
 
  - Jean-Christophe Fillion-Robin (Kitware Inc.)
 
  - Lucia Cevidanes (University of Michigan)
 
  - Maxime Gillot (University of Michigan)
 
  - Baptiste Baquero (University of Michigan)
 
Acknowledgements
  - Kyle Sunderland (PerkLab)
 
Project Description
MarkupConstraints is a Slicer module intended for Slicer extension developers to constrain
and synchronize markups and control points of different nodes.
The module has been developed to support Q3DCExtension, however I intend to expand it 
further for reuse in other interactive tools.
Objective
  - Robust constraints between control points in different vtkMRMLMarkupNode instances
    
      - Support for constraining points between for example a line and fiducial markup is 
very limited
 
    
   
  - Detect dependency cycles and provide meaningful error messages
    
      - Slicer freezes indefinitely when updating constraints with cycles
 
    
   
  - Robust constraints from control points to other node types
    
      - Project a point to the surface of a model
 
    
   
  - Support saving/loading a markup node or MRML scene while preserving constraints
 
  - Determine the best mode of distribution and publish
    
      - Likely will be published on the Extension Index in “Developer Tools”
 
    
   
  - Create a simple interactive UI for debugging/testing purposes
    
      - Should allow viewing or editing existing constraints in the scene
 
    
   
Progress
  - Created a Slicer module and logic with appropriate observers for applying constraints
 
  - Began refining API to support arbitrary constraints and dependencies (as means to 
resolve #1)
 
  - Fully resolved #1 with a robust API to define arbitrary constraints.
 
  - Created architecture documentation and API documentation for build constraint functions.
 
  - Created unittest suite for primary features.
 
Thanks to Kyle Sunderland (PerkLab) for his advice and inspiration!
Next Steps
  - Implement more adaptors to enable constraints against arbitrary node types, not just control points.
 
  - Use adaptors and node parameters/references to enable serialization with scene.
 
  - Implement graph analysis to detect cycles and deadlocks.
 
  - Expand constraint interface using abstract class for more extensibility.
 
Illustrations

Background and References
Source code is hosted in SlicerMarkupConstraints.