Difference between revisions of "Documentation/Nightly/Developers/Tutorials/MigrationGuide/Slicer"

From Slicer Wiki
Jump to: navigation, search
Line 69: Line 69:
 
   if (d->DisplayNode)
 
   if (d->DisplayNode)
 
     {
 
     {
    bgVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetBgVolumeNode());
 
 
     labelmapVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode());
 
     labelmapVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode());
 
     }
 
     }
Line 79: Line 78:
 
   if (d->DisplayNode)
 
   if (d->DisplayNode)
 
     {
 
     {
    bgVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetBgVolumeNode());
 
 
     labelmapVolumeNode = vtkMRMLLabelMapVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode());
 
     labelmapVolumeNode = vtkMRMLLabelMapVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode());
 
     }
 
     }

Revision as of 04:51, 30 August 2017

Home < Documentation < Nightly < Developers < Tutorials < MigrationGuide < Slicer


MRML: Slicer 4.5: Introduction of vtkMRMLLabelMapVolumeNode

Rational:

Before vtkMRMLScalarVolumeNode was used for both scalar and label map volumes and the LabelMap custom MRML node attribute was used for distinguishing between them (0=scalar; 1=label map volume).

This made conversion between labelmap/scalar volumes very easy but made it difficult to customize behavior, display, processing of segmentation information.

Now a new vtkMRMLLabelMapVolumeNode class is used for storing segmentation information (still using vtkMRMLScalarVolume used as base class for backward compatibility; but in the future the base class may be changed to reflect that segmentation can be represented in various ways, not just as volumes).

Error message similar to:

 error: ‘class vtkMRMLScalarVolumeNode’ has no member named ‘SetLabelMap’
    outputVolumeNode->SetLabelMap(1);
                      ^

Solution (Update node selector configuration):

Replace lines like:

 nodeSelector.setNodeTypes(QStringList("vtkMRMLScalarVolumeNode"));
 nodeSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", "1");

with:

 nodeSelector.setNodeTypes(QStringList("vtkMRMLLabelMapVolumeNode"));


Solution (Update UI file):

Replace lines like:

 <widget class="qMRMLNodeComboBox" name="InputLabelVolumeMRMLNodeComboBox">
  <property name="nodeTypes">
   <stringlist>
    <string>vtkMRMLScalarVolumeNode</string>
   </stringlist>
  </property>
  [...]
 </widget>

with:

 <widget class="qMRMLNodeComboBox" name="InputLabelVolumeMRMLNodeComboBox">
  <property name="nodeTypes">
   <stringlist>
    <string>vtkMRMLLabelMapVolumeNode</string>      <------------- Update Here
   </stringlist>
  </property>
  [...]
 </widget>


Solution (Update SafeDownCast usage):

Replace lines like:

  vtkMRMLScalarVolumeNode* labelmapVolumeNode = NULL;
  
  if (d->DisplayNode)
    {
    labelmapVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode());
    }

with:

  vtkMRMLLabelMapVolumeNode* labelmapVolumeNode = NULL;
  
  if (d->DisplayNode)
    {
    labelmapVolumeNode = vtkMRMLLabelMapVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode());
    }


References: