Display fibers as tube with non-uniform radius

Thank you so much for you help Andras and Lauren. I have managed to fix the problem. I am attaching the code for others.

  def createTube(self,cord):


modelNode = slicer.vtkMRMLModelNode()#slicer.util.getNode('SphereModel')
sizeLine = np.shape(cord)
numPoints=sizeLine[0]
lineCellArray = vtk.vtkCellArray()
lineCellArray.InsertNextCell(numPoints)
points = vtk.vtkPoints()

for i in xrange(numPoints):
  points.InsertPoint(i,cord[i])

for i in xrange(numPoints):
  lineCellArray.InsertCellPoint(i)

#Add radius
tubeRadius=vtk.vtkDoubleArray()
tubeRadius.SetNumberOfTuples(numPoints)
tubeRadius.SetName("TubeRadius")

for i in range(numPoints):
  radius=0.5*i   #variable radius
  tubeRadius.SetTuple1(i, radius)


linePolyData = vtk.vtkPolyData()
linePolyData.SetPoints(points)
linePolyData.SetLines(lineCellArray)
linePolyData.GetPointData().AddArray(tubeRadius)
linePolyData.GetPointData().SetActiveScalars("TubeRadius")




tubeSegmentFilter = vtk.vtkTubeFilter()
tubeSegmentFilter.SetInputData(linePolyData)

tubeSegmentFilter.SetNumberOfSides(10)  # INSERT VALUE
tubeSegmentFilter.CappingOn()
tubeSegmentFilter.SetVaryRadiusToVaryRadiusByAbsoluteScalar()
tubeSegmentFilter.Update()

modelNode.SetAndObservePolyData(tubeSegmentFilter.GetOutput())
modelDisplay = slicer.vtkMRMLModelDisplayNode()
modelDisplay.SetOpacity(0.5)
slicer.mrmlScene.AddNode(modelDisplay)
modelNode.SetAndObserveDisplayNodeID(modelDisplay.GetID())
modelDisplay.SetInputPolyDataConnection(modelNode.GetPolyDataConnection())
slicer.mrmlScene.AddNode(modelNode)
4 Likes