Introduction and Acknowledgements
This work is part of the SparKit project, funded by An Applied Cancer Research Unit of Cancer Care Ontario with funds provided by the Ministry of Health and Long-Term Care and the Ontario Consortium for Adaptive Interventions in Radiation Oncology (OCAIRO) to provide free, open-source toolset for radiotherapy and related image-guided interventions.
The Contours module manages contours and contour hierarchies.
NOTE: There are some inconveniences and unsupported features in the current state of this module. Instead of addressing these issues, we re-implement the whole mechanism. It will be called Segmentations, and will be available around summer of 2015. Until then, please see FAQ section on this page, or contact us with questions.
Further information about the Segmentation effort on the related Assembla ticket and wiki page, and the links pointing from these pages.
- Load as ribbon, then compute DVH; the user wants to see the contours in 3D
- Edit contour 1, edit contour 2; see contour 1 while editing contour 2
- Create contour node, convert it to (empty) labelmap; do contouring on the labelmapo representation; convert to model
- Create/load labelmap or surface, create Contour node from that in Subject Hierarchy module
- Create contour from scratch
- In Contours module select 'Create new Contour' in the contour selector drop-down to create a new contour
- In Subject Hierarchy module drag&drop new contour to under a contour set in the tree
- The default representation is an empty Ribbon model. It can be converted to Indexed labelmap in the Contours module, then the labelmap extracted in SH, which can be edited in the Editor module
- Note: this feature is quite inconvenient right now, a full overhaul is coming up soon
- Create contour from labelmap volume or model
- In Contours module use the Create contour from representation section
- In Subject Hierarchy module drag&drop the existing representation (labelmap or model) to under a contour set in the tree. This way an encapsulating Contour node gets created and associated to the corresponding color table
- Create new Contour set from scratch
- Right-click on an existing Study node and select 'Create child contour set'. This menu item is only available for Study level nodes
- Extract labelmap representation from a contour (for editing or display).
- First make sure labelmap representation is present, if not sure see Change active representation section in Contours module
- In Contours module click Extract in Contour functions section
- In Subject hierarchy right-click the contour and select the Extract labelmap to volume node option
- Edit an existing contour
- See page via link above
Panels and their use
- Current contour(s): Currently selected contour node (vtkMRMLContourNode) or conotur hierarchy node (vtkMRMLContourHierarchyNode)
- Representations: The active representation (Ribbon model / Indexed labelmap / Closed surface model) of the selected contour. If a hierarchy is selected in which the active representations of the contained contours do not match, Various is indicated
- Change active representation: This box contains controls to convert from one representation to another
- Create contour from representation: see above
- Contour functions: see above
- Issue for original Contours effort on SlicerRT Assembla ticketing system here
- Issue for Segmentations (complete Contours overhaul, expected delivery 2015 summer) here
Information for Developers
- Extract model from a contour
- There is currently no UI solution to extract a model node from a contour node, but it can be done via the python console:
>>> contour = getNode('Bladder_Contour') >>> points = contour.GetDicomRtRoiPoints() # This extracts the planar contour points, but you may want to extract the RibbonModel or ClosedSurfaceModel >>> pointsCopy = vtk.vtkPolyData() >>> pointsCopy.DeepCopy(points) >>> pointsCopy.GetNumberOfPoints() >>> modelNode = slicer.vtkMRMLModelNode() >>> modelNode.SetName(contour.GetStructureName()) >>> modelNode = slicer.mrmlScene.AddNode(modelNode) >>> polyDataProducer = vtk.vtkTrivialProducer() >>> polyDataProducer.SetOutput(pointsCopy) >>> modelNode.SetPolyDataConnection(polyDataProducer.GetOutputPort()) >>> displayNode = slicer.vtkMRMLModelDisplayNode() >>> slicer.mrmlScene.AddNode(displayNode) >>> displayNode.VisibilityOn() >>> modelNode.SetAndObserveDisplayNodeID(displayNode.GetID())
- This script uses a contour node with a specific name. If you want to do this for all contours, then just iterate over the vtkMRMLContourNode nodes in the scene, like this:
>>> allContours = slicer.util.getNodes('vtkMRMLContourNode*') >>> for contour in allContours.values(): >>> points = contour.GetDicomRtRoiPoints() >>> ...