326 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
327 segmentationDisplayNode = segmentationNode.GetDisplayNode()
332 previewContainsClosedSurfaceRepresentation = previewNode.GetSegmentation().ContainsRepresentation(
333 slicer.vtkSegmentationConverter.GetSegmentationClosedSurfaceRepresentationName())
336 segmentIDs = vtk.vtkStringArray()
337 previewNode.GetSegmentation().GetSegmentIDs(segmentIDs)
338 for index
in range(segmentIDs.GetNumberOfValues()):
339 segmentID = segmentIDs.GetValue(index)
340 previewSegmentLabelmap = slicer.vtkOrientedImageData()
341 previewNode.GetBinaryLabelmapRepresentation(segmentID, previewSegmentLabelmap)
342 self.
scriptedEffect.modifySegmentByLabelmap(segmentationNode, segmentID, previewSegmentLabelmap,
343 slicer.qSlicerSegmentEditorAbstractEffect.ModificationModeSet)
346 segmentationDisplayNode.SetSegmentVisibility(segmentID,
False)
347 previewNode.GetSegmentation().RemoveSegment(segmentID)
349 if previewContainsClosedSurfaceRepresentation:
350 segmentationNode.CreateClosedSurfaceRepresentation()
400 import vtkSegmentationCorePython
as vtkSegmentationCore
402 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
405 effectiveGeometryImage = slicer.vtkOrientedImageData()
406 effectiveGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
407 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_EFFECTIVE_SEGMENTS, self.
selectedSegmentIds)
408 if effectiveGeometryString
is None:
410 vtkSegmentationCore.vtkSegmentationConverter.DeserializeImageGeometry(effectiveGeometryString, effectiveGeometryImage)
413 masterImageExtent = masterImageData.GetExtent()
416 effectiveLabelExtent = effectiveGeometryImage.GetExtent()
422 return ((masterImageExtent[0] != currentLabelExtent[0]
and currentLabelExtent[0] > effectiveLabelExtent[0] - self.
minimumExtentMargin)
or
423 (masterImageExtent[1] != currentLabelExtent[1]
and currentLabelExtent[1] < effectiveLabelExtent[1] + self.
minimumExtentMargin)
or
424 (masterImageExtent[2] != currentLabelExtent[2]
and currentLabelExtent[2] > effectiveLabelExtent[2] - self.
minimumExtentMargin)
or
425 (masterImageExtent[3] != currentLabelExtent[3]
and currentLabelExtent[3] < effectiveLabelExtent[3] + self.
minimumExtentMargin)
or
426 (masterImageExtent[4] != currentLabelExtent[4]
and currentLabelExtent[4] > effectiveLabelExtent[4] - self.
minimumExtentMargin)
or
427 (masterImageExtent[5] != currentLabelExtent[5]
and currentLabelExtent[5] < effectiveLabelExtent[5] + self.
minimumExtentMargin))
431 import vtkSegmentationCorePython
as vtkSegmentationCore
434 segmentationNode = self.
scriptedEffect.parameterSetNode().GetSegmentationNode()
453 editableAreaSpecified = (
454 self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMask()
455 or self.
scriptedEffect.parameterSetNode().GetMaskMode() != slicer.vtkMRMLSegmentationNode.EditAllowedEverywhere)
457 logging.error(f
"Auto-complete operation failed: at least {self.minimumNumberOfSegmentsWithEditableArea} visible segments are required when editable area is defined")
459 _(
"Minimum {minimumNumberOfSegments} visible segments are required.").format(
462 logging.error(f
"Auto-complete operation skipped: at least {self.minimumNumberOfSegmentsWithEditableArea} visible segments or setting of editable area is required")
464 _(
"Minimum {minimumNumberOfSegments} visible segments (or specification of editable area or intensity range) is required.").format(
468 logging.error(f
"Auto-complete operation failed: at least {self.minimumNumberOfSegments} visible segments are required")
471 _(
"Minimum {minimumNumberOfSegments} visible segments are required.").format(
477 commonGeometryString = segmentationNode.GetSegmentation().DetermineCommonLabelmapGeometry(
478 vtkSegmentationCore.vtkSegmentation.EXTENT_UNION_OF_EFFECTIVE_SEGMENTS, self.
selectedSegmentIds)
479 if not commonGeometryString:
480 logging.info(
"Auto-complete operation skipped: all visible segments are empty")
485 masterImageExtent = masterImageData.GetExtent()
488 print(f
"self.extentGrowthRatio = {self.extentGrowthRatio}")
490 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[1] - labelsEffectiveExtent[0]))),
491 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[3] - labelsEffectiveExtent[2]))),
492 int(max(3, self.
extentGrowthRatio * (labelsEffectiveExtent[5] - labelsEffectiveExtent[4])))]
493 labelsExpandedExtent = [
494 max(masterImageExtent[0], labelsEffectiveExtent[0] - margin[0]),
495 min(masterImageExtent[1], labelsEffectiveExtent[1] + margin[0]),
496 max(masterImageExtent[2], labelsEffectiveExtent[2] - margin[1]),
497 min(masterImageExtent[3], labelsEffectiveExtent[3] + margin[1]),
498 max(masterImageExtent[4], labelsEffectiveExtent[4] - margin[2]),
499 min(masterImageExtent[5], labelsEffectiveExtent[5] + margin[2])]
500 print(
"masterImageExtent = " + repr(masterImageExtent))
501 print(
"labelsEffectiveExtent = " + repr(labelsEffectiveExtent))
502 print(
"labelsExpandedExtent = " + repr(labelsExpandedExtent))
506 previewNode = slicer.mrmlScene.AddNewNodeByClass(
"vtkMRMLSegmentationNode")
507 previewNode.CreateDefaultDisplayNodes()
508 previewNode.GetDisplayNode().SetVisibility2DOutline(
False)
509 if segmentationNode.GetParentTransformNode():
510 previewNode.SetAndObserveTransformNodeID(segmentationNode.GetParentTransformNode().GetID())
511 self.
scriptedEffect.setCommonNodeReference(ResultPreviewNodeReferenceRole, previewNode)
516 previewNode.GetSegmentation().SetConversionParameter(
517 slicer.vtkBinaryLabelmapToClosedSurfaceConversionRule.GetSmoothingFactorParameterName(),
520 inputContainsClosedSurfaceRepresentation = segmentationNode.GetSegmentation().ContainsRepresentation(
521 slicer.vtkSegmentationConverter.GetSegmentationClosedSurfaceRepresentationName())
527 masterImageClipper = vtk.vtkImageConstantPad()
528 masterImageClipper.SetInputData(masterImageData)
530 masterImageClipper.Update()
537 intensityBasedMasking = self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMask()
538 maskSegmentID = self.
scriptedEffect.parameterSetNode().GetMaskSegmentID()
if self.
scriptedEffect.parameterSetNode().GetMaskSegmentID()
else ""
539 intensityRange = self.
scriptedEffect.parameterSetNode().GetSourceVolumeIntensityMaskRange()
if intensityBasedMasking
else None
548 logging.error(
"Failed to create edit mask")
551 previewNode.SetName(segmentationNode.GetName() +
" preview")
552 previewNode.RemoveClosedSurfaceRepresentation()
556 mergedImage = slicer.vtkOrientedImageData()
557 segmentationNode.GenerateMergedLabelmapForAllSegments(
561 outputLabelmap = slicer.vtkOrientedImageData()
562 self.computePreviewLabelmap(mergedImage, outputLabelmap)
564 if previewNode.GetSegmentation().GetNumberOfSegments() != self.
selectedSegmentIds.GetNumberOfValues():
566 previewNode.GetSegmentation().RemoveAllSegments()
571 previewSegment = previewNode.GetSegmentation().GetSegment(segmentID)
572 if not previewSegment:
573 inputSegment = segmentationNode.GetSegmentation().GetSegment(segmentID)
575 previewSegment = vtkSegmentationCore.vtkSegment()
576 previewSegment.SetName(inputSegment.GetName())
577 previewSegment.SetColor(inputSegment.GetColor())
578 previewNode.GetSegmentation().AddSegment(previewSegment, segmentID)
580 labelValue = index + 1
581 previewSegment.AddRepresentation(vtkSegmentationCore.vtkSegmentationConverter.GetSegmentationBinaryLabelmapRepresentationName(), outputLabelmap)
582 previewSegment.SetLabelValue(labelValue)
585 previewNode.GetDisplayNode().SetSegmentVisibility3D(segmentID,
not self.
isBackgroundLabelmap(outputLabelmap, labelValue))