331 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
332 segmentationDisplayNode = segmentationNode.GetDisplayNode()
337 previewContainsClosedSurfaceRepresentation = previewNode.GetSegmentation().ContainsRepresentation(
338 slicer.vtkSegmentationConverter.GetSegmentationClosedSurfaceRepresentationName())
341 segmentIDs = vtk.vtkStringArray()
342 previewNode.GetSegmentation().GetSegmentIDs(segmentIDs)
343 for index
in range(segmentIDs.GetNumberOfValues()):
344 segmentID = segmentIDs.GetValue(index)
345 previewSegmentLabelmap = slicer.vtkOrientedImageData()
346 previewNode.GetBinaryLabelmapRepresentation(segmentID, previewSegmentLabelmap)
347 self.
scriptedEffect.modifySegmentByLabelmap(segmentationNode, segmentID, previewSegmentLabelmap,
348 slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)
351 segmentationDisplayNode.SetSegmentVisibility(segmentID,
False)
352 previewNode.GetSegmentation().RemoveSegment(segmentID)
354 if previewContainsClosedSurfaceRepresentation:
355 segmentationNode.CreateClosedSurfaceRepresentation()
405 import vtkSegmentationCorePython
as vtkSegmentationCore
407 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
410 effectiveGeometryImage = slicer.vtkOrientedImageData()
411 effectiveGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
412 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_EFFECTIVE_SEGMENTS, self.
selectedSegmentIds)
413 if not effectiveGeometryString:
415 vtkSegmentationCore.vtkSegmentationConverter.DeserializeImageGeometry(effectiveGeometryString, effectiveGeometryImage)
418 masterImageExtent = masterImageData.GetExtent()
421 effectiveLabelExtent = effectiveGeometryImage.GetExtent()
427 return ((masterImageExtent[0] != currentLabelExtent[0]
and currentLabelExtent[0] > effectiveLabelExtent[0] - self.
minimumExtentMargin)
or
428 (masterImageExtent[1] != currentLabelExtent[1]
and currentLabelExtent[1] < effectiveLabelExtent[1] + self.
minimumExtentMargin)
or
429 (masterImageExtent[2] != currentLabelExtent[2]
and currentLabelExtent[2] > effectiveLabelExtent[2] - self.
minimumExtentMargin)
or
430 (masterImageExtent[3] != currentLabelExtent[3]
and currentLabelExtent[3] < effectiveLabelExtent[3] + self.
minimumExtentMargin)
or
431 (masterImageExtent[4] != currentLabelExtent[4]
and currentLabelExtent[4] > effectiveLabelExtent[4] - self.
minimumExtentMargin)
or
432 (masterImageExtent[5] != currentLabelExtent[5]
and currentLabelExtent[5] < effectiveLabelExtent[5] + self.
minimumExtentMargin))
436 import vtkSegmentationCorePython
as vtkSegmentationCore
439 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
458 editableAreaSpecified = (
459 self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMask()
460 or self.
scriptedEffect.parameterSetNode().GetMaskMode() != slicer.vtkMRMLSegmentationNode.EditAllowedEverywhere)
462 logging.error(f
"Auto-complete operation failed: at least {self.minimumNumberOfSegmentsWithEditableArea} visible segments are required when editable area is defined")
464 _(
"Minimum {minimumNumberOfSegments} visible segments are required.").format(
467 logging.error(f
"Auto-complete operation skipped: at least {self.minimumNumberOfSegmentsWithEditableArea} visible segments or setting of editable area is required")
469 _(
"Minimum {minimumNumberOfSegments} visible segments (or specification of editable area or intensity range) is required.").format(
473 logging.error(f
"Auto-complete operation failed: at least {self.minimumNumberOfSegments} visible segments are required")
476 _(
"Minimum {minimumNumberOfSegments} visible segments are required.").format(
482 commonGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
483 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_EFFECTIVE_SEGMENTS, self.
selectedSegmentIds)
484 if not commonGeometryString:
485 logging.info(
"Auto-complete operation skipped: all visible segments are empty")
490 masterImageExtent = masterImageData.GetExtent()
493 print(f
"self.extentGrowthRatio = {self.extentGrowthRatio}")
495 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[1] - labelsEffectiveExtent[0]))),
496 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[3] - labelsEffectiveExtent[2]))),
497 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[5] - labelsEffectiveExtent[4])))]
498 labelsExpandedExtent = [
499 max(masterImageExtent[0], labelsEffectiveExtent[0] - margin[0]),
500 min(masterImageExtent[1], labelsEffectiveExtent[1] + margin[0]),
501 max(masterImageExtent[2], labelsEffectiveExtent[2] - margin[1]),
502 min(masterImageExtent[3], labelsEffectiveExtent[3] + margin[1]),
503 max(masterImageExtent[4], labelsEffectiveExtent[4] - margin[2]),
504 min(masterImageExtent[5], labelsEffectiveExtent[5] + margin[2])]
505 print(
"masterImageExtent = " + repr(masterImageExtent))
506 print(
"labelsEffectiveExtent = " + repr(labelsEffectiveExtent))
507 print(
"labelsExpandedExtent = " + repr(labelsExpandedExtent))
511 previewNode = slicer.mrmlScene.AddNewNodeByClass(
"vtkMRMLSegmentationNode")
512 previewNode.CreateDefaultDisplayNodes()
513 previewNode.GetDisplayNode().SetVisibility2DOutline(
False)
514 if segmentationNode.GetParentTransformNode():
515 previewNode.SetAndObserveTransformNodeID(segmentationNode.GetParentTransformNode().GetID())
516 self.
scriptedEffect.setCommonNodeReference(ResultPreviewNodeReferenceRole, previewNode)
521 previewNode.GetSegmentation().SetConversionParameter(
522 slicer.vtkBinaryLabelmapToClosedSurfaceConversionRule.GetSmoothingFactorParameterName(),
525 inputContainsClosedSurfaceRepresentation = segmentationNode.GetSegmentation().ContainsRepresentation(
526 slicer.vtkSegmentationConverter.GetSegmentationClosedSurfaceRepresentationName())
532 masterImageClipper = vtk.vtkImageConstantPad()
533 masterImageClipper.SetInputData(masterImageData)
535 masterImageClipper.Update()
542 intensityBasedMasking = self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMask()
543 maskSegmentID = self.
scriptedEffect.parameterSetNode().GetMaskSegmentID()
if self.
scriptedEffect.parameterSetNode().GetMaskSegmentID()
else ""
544 intensityRange = self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMaskRange()
if intensityBasedMasking
else None
553 logging.error(
"Failed to create edit mask")
556 previewNode.SetName(segmentationNode.GetName() +
" preview")
557 previewNode.RemoveClosedSurfaceRepresentation()
561 mergedImage = slicer.vtkOrientedImageData()
562 segmentationNode.GenerateMergedLabelmapForAllSegments(
566 outputLabelmap = slicer.vtkOrientedImageData()
567 self.computePreviewLabelmap(mergedImage, outputLabelmap)
569 if previewNode.GetSegmentation().GetNumberOfSegments() != self.
selectedSegmentIds.GetNumberOfValues():
571 previewNode.GetSegmentation().RemoveAllSegments()
576 previewSegment = previewNode.GetSegmentation().GetSegment(segmentID)
577 if not previewSegment:
578 inputSegment = segmentationNode.GetSegmentation().GetSegment(segmentID)
580 previewSegment = vtkSegmentationCore.vtkSegment()
581 previewSegment.SetName(inputSegment.GetName())
582 previewSegment.SetColor(inputSegment.GetColor())
583 previewNode.GetSegmentation().AddSegment(previewSegment, segmentID)
585 labelValue = index + 1
586 previewSegment.AddRepresentation(vtkSegmentationCore.vtkSegmentationConverter.GetSegmentationBinaryLabelmapRepresentationName(), outputLabelmap)
587 previewSegment.SetLabelValue(labelValue)
590 previewNode.GetDisplayNode().SetSegmentVisibility3D(segmentID,
not self.
isBackgroundLabelmap(outputLabelmap, labelValue))