Difference between revisions of "Documentation/Nightly/Developers/Tutorials/MigrationGuide/Slicer"
| Line 69: | Line 69: | ||
if (d->DisplayNode) | if (d->DisplayNode) | ||
{ | { | ||
| − | |||
labelmapVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode()); | labelmapVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(d->DisplayNode->GetLabelmapVolumeNode()); | ||
} | } | ||
| Line 79: | Line 78: | ||
if (d->DisplayNode) | if (d->DisplayNode) | ||
{ | { | ||
| − | |||
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: