Difference between revisions of "Documentation/Nightly/Developers/Tutorials/MigrationGuide/Slicer"
| Line 15: | Line 15: | ||
etc), which require separate storage node but are not transformable. | etc), which require separate storage node but are not transformable. | ||
| − | Changed introduced in [http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=24891 r24891] | + | <b>References:</b> |
| + | * Changed introduced in [http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=24891 r24891] | ||
<b>Error message similar to:</b> | <b>Error message similar to:</b> | ||
| Line 33: | Line 34: | ||
Removes lines and/or refactor code | Removes lines and/or refactor code | ||
| + | |||
| + | |||
===MRML: Slicer 4.5: Introduction of vtkMRMLLabelMapVolumeNode=== | ===MRML: Slicer 4.5: Introduction of vtkMRMLLabelMapVolumeNode=== | ||
Revision as of 17:33, 4 September 2017
Home < Documentation < Nightly < Developers < Tutorials < MigrationGuide < SlicerContents
Migration Guide
MRML: Slicer 4.6: Moved up vtkMRMLStorableNode in the MRML node hierarchy.
Rational:
vtkMRMLStorableNode is not a children of vtkMRMLTransformable node anymore, but directly a children of vtkMRMLNode.
This allows making a node storable without requiring it to be also transformable. It is important for several node types (color maps, tables, etc), which require separate storage node but are not transformable.
References:
- Changed introduced in r24891
Error message similar to:
/tmp/LongitudinalPETCT/MRML/vtkMRMLLongitudinalPETCTStudyNode.cxx: In member function ‘void vtkMRMLLongitudinalPETCTStudyNode::ObserveRegistrationTransform(bool)’:
/tmp/LongitudinalPETCT/MRML/vtkMRMLLongitudinalPETCTStudyNode.cxx:478:28: error: ‘class vtkMRMLVolumePropertyNode’ has no member named ‘GetParentTransformNode’
&& propNode->GetParentTransformNode()
^
/tmp/LongitudinalPETCT/MRML/vtkMRMLLongitudinalPETCTStudyNode.cxx:480:23: error: ‘class vtkMRMLVolumePropertyNode’ has no member named ‘SetAndObserveTransformNodeID’
propNode->SetAndObserveTransformNodeID(
^
/tmp/LongitudinalPETCT/MRML/vtkMRMLLongitudinalPETCTStudyNode.cxx:503:23: error: ‘class vtkMRMLVolumePropertyNode’ has no member named ‘SetAndObserveTransformNodeID’
propNode->SetAndObserveTransformNodeID(NULL);
^
Solution:
Removes lines and/or refactor code
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 (part1: down cast to vtkMRMLLabelMapVolumeNode, remove call to SetLabelMap)
Replace lines like:
vtkMRMLNode* outputNode = d->OutputLabelVolumeMRMLNodeComboBox->currentNode();
vtkMRMLScalarVolumeNode* outputVolumeNode = vtkMRMLScalarVolumeNode::SafeDownCast(outputNode);
[...]
outputVolumeNode->SetLabelMap(1);
with:
vtkMRMLLabelMapVolumeNode* outputVolumeNode =
vtkMRMLLabelMapVolumeNode::SafeDownCast(d->OutputLabelVolumeMRMLNodeComboBox->currentNode());
[...]
Solution (part2: 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 (part3: Update node selector configuration):
Replace lines like:
nodeSelector.setNodeTypes(QStringList("vtkMRMLScalarVolumeNode"));
nodeSelector.addAttribute("vtkMRMLScalarVolumeNode", "LabelMap", "1");
with:
nodeSelector.setNodeTypes(QStringList("vtkMRMLLabelMapVolumeNode"));
References:
- http://www.slicer.org/slicerWiki/index.php/Documentation/Labs/Segmentations#vtkMRMLLabelMapVolumeNode_integration
- http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=24291
CLI: Slicer 4.3: Add ITKFactoryRegistration library centralizing ITK IO factory registration
Rational:
Linking against ITKFactoryRegistration ensures that ITK IO factory are properly registered on all supported platforms.
Error message similar to:
Undefined symbols for architecture x86_64: "itk::itkFactoryRegistration()", referenced from: _main in ImageMakerTest.cxx.o ld: symbol(s) not found for architecture x86_64
Solution:
Replace lines like:
target_link_libraries(${CLP}Test ${CLP}Lib)
with:
target_link_libraries(${CLP}Test ${CLP}Lib ${SlicerExecutionModel_EXTRA_EXECUTABLE_TARGET_LIBRARIES})
References: