Difference between revisions of "Documentation/Nightly/Developers/Tutorials/MigrationGuide/Slicer"
Line 8: | Line 8: | ||
<b> Summary</b> | <b> Summary</b> | ||
Python classes formerly in "slicer.moduledm", "slicer.modulelogic", "slicer.modulemrml" | Python classes formerly in "slicer.moduledm", "slicer.modulelogic", "slicer.modulemrml" | ||
− | and "slicer.modulewidget" are | + | and "slicer.modulewidget" are now directly available in the slicer module. |
See example of change [https://github.com/QIICR/LongitudinalPETCT/pull/11 here]. | See example of change [https://github.com/QIICR/LongitudinalPETCT/pull/11 here]. |
Revision as of 19:18, 24 September 2017
Home < Documentation < Nightly < Developers < Tutorials < MigrationGuide < SlicerContents
Migration Guide
Slicer Python Module: modulewidget and others removed.
Summary Python classes formerly in "slicer.moduledm", "slicer.modulelogic", "slicer.modulemrml" and "slicer.modulewidget" are now directly available in the slicer module.
See example of change here.
Rational:
See comments in commit messages referenced blow.
References:
https://github.com/Slicer/Slicer/commit/628f83fe7a6f4e0710e306bcaf7c04b9e3e5e6bd
https://github.com/Slicer/Slicer/commit/9cb5668fde1abc8f0430a91ca37fc29277ceeb4e
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: