Probably the simplest is to create a segmentation node directly instead of creating a vtk file that can be loaded as segmentation. Here is a complete example of creating a segment (including closed surface and binary labelmap representation) from a list of contour points:
# Create segmentation node where we will store segments
segmentationNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentationNode")
segmentationNode.CreateDefaultDisplayNodes()
# Create a segment from planar contours - can be repeated for multiple segments
segmentName = "test"
segmentColor = [1, 0, 0]
contours = [
[[10,10,0], [30,10,0], [30,40,0], [10,25,0]],
[[12,13,10], [31,9,10], [34,41,10], [12,23,10]],
[[14,8,20], [22,11,20], [28,16,20], [16,28,20], [2,21,20]],
]
contoursPolyData = vtk.vtkPolyData()
contourPoints = vtk.vtkPoints()
contourLines = vtk.vtkCellArray()
contoursPolyData.SetLines(contourLines)
contoursPolyData.SetPoints(contourPoints)
for contour in contours:
startPointIndex = contourPoints.GetNumberOfPoints()
contourLine = vtk.vtkPolyLine()
linePointIds = contourLine.GetPointIds()
for point in contour:
linePointIds.InsertNextId(contourPoints.InsertNextPoint(point))
linePointIds.InsertNextId(startPointIndex) # make the contour line closed
contourLines.InsertNextCell(contourLine)
segment = slicer.vtkSegment()
segment.SetName(segmentName)
segment.SetColor(segmentColor)
segment.AddRepresentation('Planar contour', contoursPolyData)
segmentationNode.GetSegmentation().AddSegment(segment)