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:
- A very high number of times the first if statement is never entered while executing the filter
- Sometimes the second if statement is never entered while executing the filter
- The third and forth if blocks are always entered by executing the filter
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