VTKRuledSurface Bug?

Hi

Here is a straight-forward example with python’s vtk


(Please note the missing triangle in front of the picture)

Code below:

def polylineSource(numberOfSides):
    polygonSource = vtk.vtkRegularPolygonSource()
    polygonSource.SetNumberOfSides(numberOfSides)
    polygonSource.SetRadius(1.0)
    polygonSource.SetCenter(0, 0, 0)
    polygonSource.GeneratePolygonOff()
    polygonSource.GeneratePolylineOn()
    polygonSource.Update()
    return polygonSource.GetOutput()

polyline = polylineSource(numberOfSides=7)

transform = vtk.vtkTransform()
transform.PostMultiply()
transform.RotateX(15)
transform.RotateY(45)
transform.RotateZ(30)
transform.Translate(0, 0, -2)

transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetTransform(transform)
transformFilter.SetInputData(polyline)
transformFilter.Update()
transformedPolyline = transformFilter.GetOutput()

appendedPolylines = vtk.vtkAppendPolyData()
appendedPolylines.AddInputData(polyline)
appendedPolylines.AddInputData(transformedPolyline)
appendedPolylines.Update()

ruledSurfaceFilter = vtk.vtkRuledSurfaceFilter()
ruledSurfaceFilter.SetRuledModeToPointWalk()
ruledSurfaceFilter.CloseSurfaceOff()
ruledSurfaceFilter.SetOnRatio(1)
ruledSurfaceFilter.SetDistanceFactor(10000000)
ruledSurfaceFilter.SetOrientLoops(True)
ruledSurfaceFilter.SetInputData(appendedPolylines.GetOutput())
ruledSurfaceFilter.Update()


# From this rendering example:
# https://examples.vtk.org/site/Python/Tutorial/Tutorial_Step1/
coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection(ruledSurfaceFilter.GetOutputPort())

coneActor = vtk.vtkActor()
coneActor.SetMapper(coneMapper)
colors = vtk.vtkNamedColors()
coneActor.GetProperty().SetColor(colors.GetColor3d('MistyRose'))

ren1 = vtk.vtkRenderer()
ren1.AddActor(coneActor)
ren1.SetBackground(colors.GetColor3d('MidnightBlue'))

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetSize(600, 600)
renWin.SetWindowName('Tutorial_Step1')

for i in range(0, 270):
    # Render the image
    renWin.Render()
    # Rotate the active camera by one degree.
    ren1.GetActiveCamera().Azimuth(1)


# Slicer code to visualize the models
#modelsLogic = slicer.modules.models.logic()
#triangleModel = modelsLogic.AddModel(polyline)
#pentagonModel = modelsLogic.AddModel(transformedPolyline)
#bothModel = modelsLogic.AddModel(appendedPolylines.GetOutput())
#ruledExtrusionModel = modelsLogic.AddModel(ruledSurfaceFilter.GetOutput())

As a side note, I tried adding some logging statements to the vtkRuledSurfaceFilter and I noted some things using different input data:

In my opinion this implies that the while loop that controls the creation of new triangles has some faulty logic.

Hope you can help

Mauro