I am working on a set of custom extensions, and I have been able to muddle through to get several things working, but I am now running into problems and having trouble debugging. I think my problem may be related to not understanding the relationship between a segmentEditorWidget and a segmentEditorNode. For example, in my code I create a segmentEditorWidget and a segmentEditorNode, add them to the mrmlScene, and try to link them together:
segmentEditorWidget = slicer.qMRMLSegmentEditorWidget() segmentEditorNode = slicer.vtkMRMLSegmentEditorNode() slicer.mrmlScene.AddNode(segmentEditorNode) segmentEditorWidget.setMRMLSegmentEditorNode(segmentEditorNode) segmentEditorWidget.setSegmentationNode(newSegmentationNode) # This doesn't seem to link the widget to the new segmentation node, it still seems to link to an older, pre-existing segmentation node segmentEditorWidget.setMRMLScene(slicer.mrmlScene) # Not sure if I should do this: segmentEditorWidget.setMasterVolumeNode(volumeNode) # or this: segmentEditorNode.SetAndObserveMasterVolumeNode(volumeNode) segmentEditorNode.SetAndObserveSegmentationNode(newSegmentationNode) # this line does seem to successfully link to the new segmentation node
I’m not sure how to properly understand the relationship between the widget and the node. If I change something in one of them, when is that reflected in the other, and when is it not? For my purposes, I want to start from an existing segmentation, make a copy of it, and then make several modifications to the new, copied segmentation. Can I get by without using a widget at all, since I never need to interact with it graphically? If so, how can I do the equivalent of segmentEditorWidget.setActiveEffectByName() and effect = segmentEditorWidget.activeEffect()? I am aware of the documentation at apidocs.slicer.org and find it helpful sometimes, but it never contains anything like a readable explanation of the logical structure of things, just a few word notes (if I am lucky!).
For example, at https://apidocs.slicer.org/master/classvtkMRMLSegmentEditorNode.html, I see that there is a function SetActiveEffectName(), but it isn’t clear to me whether that function means I am assigning a name to an active effect or selecting a name. It allows me to use any string as an argument, even one which does not correspond to any of the set of possible active effects, which makes me worried that I am not selecting an effect but rather creating a name for an effect, but it could easily be that there just isn’t any error checking to make sure that the effect name I supply actually corresponds to an effect. I don’t see anything in the documentation which would help me figure out which of those is happening. I am a relatively novice python programmer and worse than novice C++ programmer, so when things get down to the C++ code, looking at the source code is only sometimes helpful and is entirely lacking in nuance for me.
Is there any reference which outlines the basic programming design for slicer and/or vtk? I mean something which might say something like “display nodes hold parameters related to the 2D and 3D display of segmentations. For a given segmentation node, it’s display node can be accessed through segmentationNode.GetDisplayNode()” or simple explanations like that. Thanks for any help you can provide.