166 def getInvertedBinaryLabelmap(self, modifierLabelmap):
169 inverter = vtk.vtkImageThreshold()
170 inverter.SetInputData(modifierLabelmap)
171 inverter.SetInValue(fillValue)
172 inverter.SetOutValue(eraseValue)
173 inverter.ReplaceInOn()
174 inverter.ThresholdByLower(0)
175 inverter.SetOutputScalarType(vtk.VTK_UNSIGNED_CHAR)
178 invertedModifierLabelmap = slicer.vtkOrientedImageData()
179 invertedModifierLabelmap.ShallowCopy(inverter.GetOutput())
180 imageToWorldMatrix = vtk.vtkMatrix4x4()
181 modifierLabelmap.GetImageToWorldMatrix(imageToWorldMatrix)
182 invertedModifierLabelmap.SetGeometryFromImageToWorldMatrix(imageToWorldMatrix)
183 return invertedModifierLabelmap
190 import vtkSegmentationCorePython
as vtkSegmentationCore
197 bypassMasking = self.
scriptedEffect.integerParameter(
"BypassMasking") != 0
199 selectedSegmentID = self.
scriptedEffect.parameterSetNode().GetSelectedSegmentID()
201 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
202 segmentation = segmentationNode.GetSegmentation()
207 if not modifierSegmentID:
208 logging.error(f
"Operation {operation} requires a selected modifier segment")
210 modifierSegment = segmentation.GetSegment(modifierSegmentID)
211 modifierSegmentLabelmap = slicer.vtkOrientedImageData()
212 segmentationNode.GetBinaryLabelmapRepresentation(modifierSegmentID, modifierSegmentLabelmap)
215 commonGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
216 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_SEGMENTS,
None)
217 if not commonGeometryString:
218 logging.info(
"Logical operation skipped: all segments are empty")
220 commonGeometryImage = slicer.vtkOrientedImageData()
221 vtkSegmentationCore.vtkSegmentationConverter.DeserializeImageGeometry(commonGeometryString, commonGeometryImage,
False)
225 if not vtkSegmentationCore.vtkOrientedImageDataResample.DoGeometriesMatch(commonGeometryImage, modifierSegmentLabelmap):
226 modifierSegmentLabelmap_CommonGeometry = slicer.vtkOrientedImageData()
227 vtkSegmentationCore.vtkOrientedImageDataResample.ResampleOrientedImageToReferenceOrientedImage(
228 modifierSegmentLabelmap, commonGeometryImage, modifierSegmentLabelmap_CommonGeometry,
232 modifierSegmentLabelmap = modifierSegmentLabelmap_CommonGeometry
234 if operation == LOGICAL_COPY:
236 modifierSegmentLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet, bypassMasking)
237 elif operation == LOGICAL_UNION:
239 modifierSegmentLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeAdd, bypassMasking)
240 elif operation == LOGICAL_SUBTRACT:
242 modifierSegmentLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeRemove, bypassMasking)
243 elif operation == LOGICAL_INTERSECT:
244 selectedSegmentLabelmap = self.
scriptedEffect.selectedSegmentLabelmap()
245 intersectionLabelmap = slicer.vtkOrientedImageData()
246 vtkSegmentationCore.vtkOrientedImageDataResample.MergeImage(
247 selectedSegmentLabelmap, modifierSegmentLabelmap, intersectionLabelmap,
248 vtkSegmentationCore.vtkOrientedImageDataResample.OPERATION_MINIMUM, selectedSegmentLabelmap.GetExtent())
249 selectedSegmentLabelmapExtent = selectedSegmentLabelmap.GetExtent()
250 modifierSegmentLabelmapExtent = modifierSegmentLabelmap.GetExtent()
251 commonExtent = [max(selectedSegmentLabelmapExtent[0], modifierSegmentLabelmapExtent[0]),
252 min(selectedSegmentLabelmapExtent[1], modifierSegmentLabelmapExtent[1]),
253 max(selectedSegmentLabelmapExtent[2], modifierSegmentLabelmapExtent[2]),
254 min(selectedSegmentLabelmapExtent[3], modifierSegmentLabelmapExtent[3]),
255 max(selectedSegmentLabelmapExtent[4], modifierSegmentLabelmapExtent[4]),
256 min(selectedSegmentLabelmapExtent[5], modifierSegmentLabelmapExtent[5])]
258 intersectionLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet, commonExtent, bypassMasking)
260 elif operation == LOGICAL_INVERT:
261 selectedSegmentLabelmap = self.
scriptedEffect.selectedSegmentLabelmap()
264 invertedSelectedSegmentLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet, bypassMasking)
266 elif operation == LOGICAL_CLEAR
or operation == LOGICAL_FILL:
267 selectedSegmentLabelmap = self.
scriptedEffect.selectedSegmentLabelmap()
268 vtkSegmentationCore.vtkOrientedImageDataResample.FillImage(
269 selectedSegmentLabelmap, 1
if operation == LOGICAL_FILL
else 0, selectedSegmentLabelmap.GetExtent())
271 selectedSegmentLabelmap, slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet, bypassMasking)
274 logging.error(f
"Unknown operation: {operation}")