Dear Andras,
I am trying to work with ‘Curve cut’ option of ‘dynamic modeler’ module in python. The workflow I follow are: Import a stl model, Fill it, Decimate it, Draw a closed curve which is resampled and then constrained it to the model, Add a fiducial on the inside area.
Next I try to work with ‘Curve cut’ option. Using the above inputs, in the GUI of 3D Slicer, everything goes fine and both models(positive and negative) are generated.
But after running the code I get no points for both.
What am I doing wrong? Can you help?
Here is the code:
#1.Fill the scan Model
def fill_holes_in_model(modelNode, holeSize=1000.0):
“”"
Fills holes in the input modelNode using vtkFillHolesFilter.
:param modelNode: vtkMRMLModelNode
:param holeSize: Maximum hole size to fill (in mm^2)
:return: New vtkMRMLModelNode with holes filled
“”"
polyData = modelNode.GetPolyData()
fillHoles = vtk.vtkFillHolesFilter()
fillHoles.SetInputData(polyData)
fillHoles.SetHoleSize(holeSize)
fillHoles.Update()
filledModel = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLModelNode", modelNode.GetName() + "_FilledModel")
filledModel.SetAndObservePolyData(fillHoles.GetOutput())
filledDisplay = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLModelDisplayNode")
slicer.mrmlScene.AddNode(filledDisplay)
filledModel.SetAndObserveDisplayNodeID(filledDisplay.GetID())
filledDisplay.Copy(modelNode.GetDisplayNode())
return filledModel
originalModel = slicer.util.getNode(“patientX_scan”)
filledModel = fill_holes_in_model(originalModel, holeSize=1000.0)
#2. Decimate the filled model
inputModel = slicer.util.getNode(‘patientX_scan_FilledModel’)
inputPolyData = inputModel.GetPolyData()
decimateFilter = vtk.vtkDecimatePro()
decimateFilter.SetTargetReduction(0.5) # This will reduce the number of polygons by 50%
decimateFilter.SetInputData(inputPolyData)
decimateFilter.PreserveTopologyOn() # Preserve topology to avoid self-intersections
decimateFilter.Update()
simplifiedPolyData = decimateFilter.GetOutput()
outputModel = slicer.mrmlScene.AddNewNodeByClass(‘vtkMRMLModelNode’, ‘DecimatedModel’)
outputModel.SetAndObservePolyData(simplifiedPolyData)
outputModel.CreateDefaultDisplayNodes()
outputModel.GetDisplayNode().SetVisibility(True)
#3. Respample the closed Curve
slicer.util.getNode(‘CC’).ResampleCurveWorld(0.5)
#4. Constrain the closed curve to the model
curveNode = slicer.util.getNode(‘CC’) # Closed curve node
surfaceNode = slicer.util.getNode(‘DecimatedModel’) # Model to constrain to
curveNode.SetCurveTypeToShortestDistanceOnSurface()
curveNode.SetAndObserveShortestDistanceSurfaceNode(surfaceNode)
#5. Trying to Curve cut in Dynamic Modeler
inputModel = slicer.util.getNode(‘DecimatedModel’)
inputCurve = slicer.util.getNode(‘CC’)
insidePoint = slicer.util.getNode(‘F’)
outputPositive = slicer.mrmlScene.AddNewNodeByClass(“vtkMRMLModelNode”, “CutModel_Positive”)
outputPositive.CreateDefaultDisplayNodes()
outputNegative = slicer.mrmlScene.AddNewNodeByClass(“vtkMRMLModelNode”, “CutModel_Negative”)
outputNegative.CreateDefaultDisplayNodes()
modelerNode = slicer.mrmlScene.AddNewNodeByClass(“vtkMRMLDynamicModelerNode”)
modelerNode.SetToolName(“Curve cut”)
modelerNode.SetNodeReferenceID(“InputModel”, inputModel.GetID())
modelerNode.SetNodeReferenceID(“InputCurve”, inputCurve.GetID())
modelerNode.SetNodeReferenceID(“InsidePoint”, insidePoint.GetID())
modelerNode.SetNodeReferenceID(“OutputPositiveModel”, outputPositive.GetID())
modelerNode.SetNodeReferenceID(“OutputNegativeModel”, outputNegative.GetID())
modelerNode.SetAttribute(“StraightCut”, “true”)
modelerNode.SetAttribute(“Operation”, “Split”)
modelerNode.SetAttribute(“InsideSurface”, “true”)
modelerNode.SetAttribute(“OutsideSurface”, “true”)
slicer.modules.dynamicmodeler.logic().RunDynamicModelerTool(modelerNode)
slicer.app.processEvents()
outputPositive.GetDisplayNode().SetVisibility(1)
outputNegative.GetDisplayNode().SetVisibility(1)
print(“Positive output points:”, outputPositive.GetMesh().GetNumberOfPoints() if outputPositive.GetMesh() else 0)
print(“Negative output points:”, outputNegative.GetMesh().GetNumberOfPoints() if outputNegative.GetMesh() else 0)
And here is the Output:
Positive output points: 0
Negative output points: 0
Thanks!!