317 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
318 segmentationDisplayNode = segmentationNode.GetDisplayNode()
323 previewContainsClosedSurfaceRepresentation = previewNode.GetSegmentation().ContainsRepresentation(
324 slicer.vtkSegmentationConverter.GetSegmentationClosedSurfaceRepresentationName())
327 segmentIDs = vtk.vtkStringArray()
328 previewNode.GetSegmentation().GetSegmentIDs(segmentIDs)
329 for index
in range(segmentIDs.GetNumberOfValues()):
330 segmentID = segmentIDs.GetValue(index)
331 previewSegmentLabelmap = slicer.vtkOrientedImageData()
332 previewNode.GetBinaryLabelmapRepresentation(segmentID, previewSegmentLabelmap)
333 self.
scriptedEffect.modifySegmentByLabelmap(segmentationNode, segmentID, previewSegmentLabelmap,
334 slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)
337 segmentationDisplayNode.SetSegmentVisibility(segmentID,
False)
338 previewNode.GetSegmentation().RemoveSegment(segmentID)
340 if previewContainsClosedSurfaceRepresentation:
341 segmentationNode.CreateClosedSurfaceRepresentation()
391 import vtkSegmentationCorePython
as vtkSegmentationCore
393 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
396 effectiveGeometryImage = slicer.vtkOrientedImageData()
397 effectiveGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
398 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_EFFECTIVE_SEGMENTS, self.
selectedSegmentIds)
399 if effectiveGeometryString
is None:
401 vtkSegmentationCore.vtkSegmentationConverter.DeserializeImageGeometry(effectiveGeometryString, effectiveGeometryImage)
404 masterImageExtent = masterImageData.GetExtent()
407 effectiveLabelExtent = effectiveGeometryImage.GetExtent()
413 return ((masterImageExtent[0] != currentLabelExtent[0]
and currentLabelExtent[0] > effectiveLabelExtent[0] - self.
minimumExtentMargin)
or
414 (masterImageExtent[1] != currentLabelExtent[1]
and currentLabelExtent[1] < effectiveLabelExtent[1] + self.
minimumExtentMargin)
or
415 (masterImageExtent[2] != currentLabelExtent[2]
and currentLabelExtent[2] > effectiveLabelExtent[2] - self.
minimumExtentMargin)
or
416 (masterImageExtent[3] != currentLabelExtent[3]
and currentLabelExtent[3] < effectiveLabelExtent[3] + self.
minimumExtentMargin)
or
417 (masterImageExtent[4] != currentLabelExtent[4]
and currentLabelExtent[4] > effectiveLabelExtent[4] - self.
minimumExtentMargin)
or
418 (masterImageExtent[5] != currentLabelExtent[5]
and currentLabelExtent[5] < effectiveLabelExtent[5] + self.
minimumExtentMargin))
422 import vtkSegmentationCorePython
as vtkSegmentationCore
425 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
444 editableAreaSpecified = (
445 self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMask()
446 or self.
scriptedEffect.parameterSetNode().GetMaskMode() != slicer.vtkMRMLSegmentationNode.EditAllowedEverywhere)
448 logging.error(f
"Auto-complete operation failed: at least {self.minimumNumberOfSegmentsWithEditableArea} visible segments are required when editable area is defined")
450 _(
"Minimum {minimumNumberOfSegments} visible segments are required.").format(
453 logging.error(f
"Auto-complete operation skipped: at least {self.minimumNumberOfSegmentsWithEditableArea} visible segments or setting of editable area is required")
455 _(
"Minimum {minimumNumberOfSegments} visible segments (or specification of editable area or intensity range) is required.").format(
459 logging.error(f
"Auto-complete operation failed: at least {self.minimumNumberOfSegments} visible segments are required")
462 _(
"Minimum {minimumNumberOfSegments} visible segments are required.").format(
468 commonGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
469 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_EFFECTIVE_SEGMENTS, self.
selectedSegmentIds)
470 if not commonGeometryString:
471 logging.info(
"Auto-complete operation skipped: all visible segments are empty")
476 masterImageExtent = masterImageData.GetExtent()
479 print(f
"self.extentGrowthRatio = {self.extentGrowthRatio}")
481 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[1] - labelsEffectiveExtent[0]))),
482 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[3] - labelsEffectiveExtent[2]))),
483 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[5] - labelsEffectiveExtent[4])))]
484 labelsExpandedExtent = [
485 max(masterImageExtent[0], labelsEffectiveExtent[0] - margin[0]),
486 min(masterImageExtent[1], labelsEffectiveExtent[1] + margin[0]),
487 max(masterImageExtent[2], labelsEffectiveExtent[2] - margin[1]),
488 min(masterImageExtent[3], labelsEffectiveExtent[3] + margin[1]),
489 max(masterImageExtent[4], labelsEffectiveExtent[4] - margin[2]),
490 min(masterImageExtent[5], labelsEffectiveExtent[5] + margin[2])]
491 print(
"masterImageExtent = " + repr(masterImageExtent))
492 print(
"labelsEffectiveExtent = " + repr(labelsEffectiveExtent))
493 print(
"labelsExpandedExtent = " + repr(labelsExpandedExtent))
497 previewNode = slicer.mrmlScene.AddNewNodeByClass(
"vtkMRMLSegmentationNode")
498 previewNode.CreateDefaultDisplayNodes()
499 previewNode.GetDisplayNode().SetVisibility2DOutline(
False)
500 if segmentationNode.GetParentTransformNode():
501 previewNode.SetAndObserveTransformNodeID(segmentationNode.GetParentTransformNode().GetID())
502 self.
scriptedEffect.parameterSetNode().SetNodeReferenceID(ResultPreviewNodeReferenceRole, previewNode.GetID())
507 previewNode.GetSegmentation().SetConversionParameter(
508 slicer.vtkBinaryLabelmapToClosedSurfaceConversionRule.GetSmoothingFactorParameterName(),
511 inputContainsClosedSurfaceRepresentation = segmentationNode.GetSegmentation().ContainsRepresentation(
512 slicer.vtkSegmentationConverter.GetSegmentationClosedSurfaceRepresentationName())
518 masterImageClipper = vtk.vtkImageConstantPad()
519 masterImageClipper.SetInputData(masterImageData)
521 masterImageClipper.Update()
528 intensityBasedMasking = self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMask()
529 maskSegmentID = self.
scriptedEffect.parameterSetNode().GetMaskSegmentID()
if self.
scriptedEffect.parameterSetNode().GetMaskSegmentID()
else ""
530 intensityRange = self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMaskRange()
if intensityBasedMasking
else None
539 logging.error(
"Failed to create edit mask")
542 previewNode.SetName(segmentationNode.GetName() +
" preview")
543 previewNode.RemoveClosedSurfaceRepresentation()
547 mergedImage = slicer.vtkOrientedImageData()
548 segmentationNode.GenerateMergedLabelmapForAllSegments(
552 outputLabelmap = slicer.vtkOrientedImageData()
553 self.computePreviewLabelmap(mergedImage, outputLabelmap)
555 if previewNode.GetSegmentation().GetNumberOfSegments() != self.
selectedSegmentIds.GetNumberOfValues():
557 previewNode.GetSegmentation().RemoveAllSegments()
562 previewSegment = previewNode.GetSegmentation().GetSegment(segmentID)
563 if not previewSegment:
564 inputSegment = segmentationNode.GetSegmentation().GetSegment(segmentID)
566 previewSegment = vtkSegmentationCore.vtkSegment()
567 previewSegment.SetName(inputSegment.GetName())
568 previewSegment.SetColor(inputSegment.GetColor())
569 previewNode.GetSegmentation().AddSegment(previewSegment, segmentID)
571 labelValue = index + 1
572 previewSegment.AddRepresentation(vtkSegmentationCore.vtkSegmentationConverter.GetSegmentationBinaryLabelmapRepresentationName(), outputLabelmap)
573 previewSegment.SetLabelValue(labelValue)
576 previewNode.GetDisplayNode().SetSegmentVisibility3D(segmentID,
not self.
isBackgroundLabelmap(outputLabelmap, labelValue))