Skip to content

Commit 6fc9601

Browse files
author
Florian Fritz
committed
Curvatures, Dijkstra-Graph and Frenet-Serret-Frame added
1 parent d990901 commit 6fc9601

3 files changed

Lines changed: 248 additions & 0 deletions

File tree

src/Python/PolyData/Curvatures.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
from __future__ import print_function, division
4+
import vtk
5+
6+
def main(filename, curvature=0, scalarRange=None, scheme=None):
7+
print("Loading", filename)
8+
reader = vtk.vtkXMLPolyDataReader()
9+
reader.SetFileName(filename)
10+
11+
curvaturesFilter = vtk.vtkCurvatures()
12+
curvaturesFilter.SetInputConnection(reader.GetOutputPort())
13+
if curvature == 0:
14+
curvaturesFilter.SetCurvatureTypeToMinimum()
15+
elif curvature == 1:
16+
curvaturesFilter.SetCurvatureTypeToMaximum()
17+
elif curvature == 2:
18+
curvaturesFilter.SetCurvatureTypeToGaussian()
19+
else:
20+
curvaturesFilter.SetCurvatureTypeToMean()
21+
curvaturesFilter.Update()
22+
23+
# Get scalar range from command line if present, otherwise use
24+
# range of computed curvature
25+
if scalarRange is None:
26+
scalarRange = curvaturesFilter.GetOutput().GetScalarRange()
27+
28+
# Build a lookup table
29+
if scheme is None:
30+
scheme = 16
31+
colorSeries = vtk.vtkColorSeries()
32+
colorSeries.SetColorScheme(scheme)
33+
print("Using color scheme #:", colorSeries.GetColorScheme(), \
34+
"is", colorSeries.GetColorSchemeName())
35+
36+
lut = vtk.vtkColorTransferFunction()
37+
lut.SetColorSpaceToHSV()
38+
39+
# Use a color series to create a transfer function
40+
numColors = colorSeries.GetNumberOfColors()
41+
for i in range(numColors):
42+
color = colorSeries.GetColor(i)
43+
dColor = [color[0]/255.0, color[1]/255.0, color[2]/255.0]
44+
t = scalarRange[0] + (scalarRange[1] - scalarRange[0]) / (numColors - 1) * i
45+
lut.AddRGBPoint(t, dColor[0], dColor[1], dColor[2])
46+
47+
# Create a mapper and actor
48+
mapper = vtk.vtkPolyDataMapper()
49+
mapper.SetInputConnection(curvaturesFilter.GetOutputPort())
50+
mapper.SetLookupTable(lut)
51+
mapper.SetScalarRange(scalarRange)
52+
53+
actor = vtk.vtkActor()
54+
actor.SetMapper(mapper)
55+
56+
# Create a scalar bar
57+
print("Displaying", curvaturesFilter.GetOutput().GetPointData().GetScalars().GetName())
58+
scalarBarActor = vtk.vtkScalarBarActor()
59+
scalarBarActor.SetLookupTable(mapper.GetLookupTable())
60+
scalarBarActor.SetTitle(
61+
curvaturesFilter.GetOutput().GetPointData().GetScalars().GetName())
62+
63+
scalarBarActor.SetNumberOfLabels(5)
64+
65+
# Create a renderer, render window, and interactor
66+
renderer = vtk.vtkRenderer()
67+
renderWindow = vtk.vtkRenderWindow()
68+
renderWindow.AddRenderer(renderer)
69+
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
70+
renderWindowInteractor.SetRenderWindow(renderWindow)
71+
72+
# Add the actors to the scene
73+
renderer.AddActor(actor)
74+
renderer.AddActor2D(scalarBarActor)
75+
76+
renderer.SetBackground(.1, .2, .3) # Background color blue
77+
78+
# Render and interact
79+
renderWindow.Render()
80+
renderWindowInteractor.Start()
81+
82+
83+
def get_program_parameters():
84+
import argparse
85+
description = 'Computes the curvature of a polydata surface.'
86+
epilogue = '''
87+
filename=./src/Testing/Data/cowHead.vtp
88+
curvature: 0=Min, 1=Max, 2=Gauss, 3=Mean
89+
'''
90+
parser = argparse.ArgumentParser(description=description, epilog=epilogue,
91+
formatter_class=argparse.RawDescriptionHelpFormatter)
92+
parser.add_argument('filename', help='Filename.vtp')
93+
parser.add_argument('curvature', type=int, help='Int value')
94+
parser.add_argument('scalarRangeLow', nargs='?', type=float, help='Float value')
95+
parser.add_argument('scalarRangeHigh', nargs='?', type=float, help='Float value')
96+
parser.add_argument('colorScheme', nargs='?', type=int, help='Int value')
97+
args = parser.parse_args()
98+
scalarRange = None
99+
if args.scalarRangeLow and args.scalarRangeHigh:
100+
scalarRange = (args.scalarRangeLow, args.scalarRangeHigh)
101+
return args.filename, args.curvature, scalarRange, args.colorScheme
102+
103+
if __name__ == "__main__":
104+
main(*get_program_parameters())
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
import vtk
5+
6+
def main():
7+
# Create a sphere
8+
sphereSource = vtk.vtkSphereSource()
9+
sphereSource.Update()
10+
11+
dijkstra = vtk.vtkDijkstraGraphGeodesicPath()
12+
dijkstra.SetInputConnection(sphereSource.GetOutputPort())
13+
dijkstra.SetStartVertex(0)
14+
dijkstra.SetEndVertex(10)
15+
dijkstra.Update()
16+
17+
# Create a mapper and actor
18+
pathMapper = vtk.vtkPolyDataMapper()
19+
pathMapper.SetInputConnection(dijkstra.GetOutputPort())
20+
21+
pathActor = vtk.vtkActor()
22+
pathActor.SetMapper(pathMapper)
23+
pathActor.GetProperty().SetColor(1,0,0) # Red
24+
pathActor.GetProperty().SetLineWidth(4)
25+
26+
# Create a mapper and actor
27+
mapper = vtk.vtkPolyDataMapper()
28+
mapper.SetInputConnection(sphereSource.GetOutputPort())
29+
30+
actor = vtk.vtkActor()
31+
actor.SetMapper(mapper)
32+
33+
# Create a renderer, render window, and interactor
34+
renderer = vtk.vtkRenderer()
35+
renderWindow = vtk.vtkRenderWindow()
36+
renderWindow.AddRenderer(renderer)
37+
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
38+
renderWindowInteractor.SetRenderWindow(renderWindow)
39+
40+
# Add the actor to the scene
41+
renderer.AddActor(actor)
42+
renderer.AddActor(pathActor)
43+
renderer.SetBackground(.3, .6, .3) # Background color green
44+
45+
# Render and interact
46+
renderWindow.Render()
47+
renderWindowInteractor.Start()
48+
49+
return 1
50+
51+
if __name__ == "__main__":
52+
main()
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import vtk
2+
3+
def main():
4+
# Generate some random points
5+
numberOfPoints = 8
6+
pointSource = vtk.vtkPointSource()
7+
pointSource.SetNumberOfPoints(numberOfPoints)
8+
pointSource.Update()
9+
10+
points = pointSource.GetOutput().GetPoints()
11+
12+
spline = vtk.vtkParametricSpline()
13+
spline.SetPoints(points)
14+
15+
functionSource = vtk.vtkParametricFunctionSource()
16+
functionSource.SetParametricFunction(spline)
17+
functionSource.SetUResolution(10 * numberOfPoints)
18+
functionSource.SetVResolution(10 * numberOfPoints)
19+
functionSource.SetWResolution(10 * numberOfPoints)
20+
21+
# Create the frame
22+
frame = vtk.vtkFrenetSerretFrame()
23+
frame.SetInputConnection(functionSource.GetOutputPort())
24+
frame.ConsistentNormalsOn()
25+
frame.Update()
26+
27+
# Setup renderer
28+
renderer = vtk.vtkRenderer()
29+
renderer.SetBackground(.4, .5, .7)
30+
31+
# for each vector, create a Glyph3D and DeepCopy the output
32+
arrow_radius = .05
33+
34+
for vector, color in zip(["FSNormals", "FSTangents","FSBinormals"], [(0.8900, 0.8100, 0.3400), (1.0000, 0.3882, 0.2784), (0.1804,0.5451,0.3412)]):
35+
polyData = MakeGlyphs(frame, arrow_radius, vector)
36+
37+
# Setup actors and mappers
38+
glyphMapper = vtk.vtkPolyDataMapper()
39+
glyphMapper.SetInputData(normalsPolyData)
40+
41+
glyphActor = vtk.vtkActor()
42+
glyphActor.SetMapper(mapper)
43+
glyphActor.GetProperty().SetColor(color)
44+
45+
renderer.AddActor(glyphActor)
46+
47+
# Display spline
48+
mapper = vtk.vtkPolyDataMapper()
49+
mapper.SetInputConnection(functionSource.GetOutputPort())
50+
actor = vtk.vtkActor()
51+
actor.SetMapper(mapper)
52+
renderer.AddActor(actor)
53+
54+
# Setup render window, and interactor
55+
renderWindow = vtk.vtkRenderWindow()
56+
renderWindow.AddRenderer(renderer)
57+
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
58+
renderWindowInteractor.SetRenderWindow(renderWindow)
59+
60+
# Pick a good view
61+
renderer.ResetCamera()
62+
renderer.GetActiveCamera().Azimuth(120)
63+
renderer.GetActiveCamera().Elevation(30)
64+
renderer.GetActiveCamera().Dolly(1.8)
65+
renderer.ResetCameraClippingRange()
66+
67+
renderWindow.SetSize(640, 480)
68+
renderWindow.Render()
69+
renderWindowInteractor.Start()
70+
71+
def MakeGlyphs(frame, arrow_size, vector_name)
72+
frame.GetOutput().GetPointData().SetActiveVectors(vector_name)
73+
srcPolyData = frame.GetOutput()
74+
75+
arrow = vtk.vtkArrowSource()
76+
arrow.SetTipResolution(16)
77+
arrow.SetTipLength(.3)
78+
arrow.SetTipRadius(.1)
79+
80+
glyph = vtk.vtkGlyph3D()
81+
glyph.SetSourceConnection(arrow.GetOutputPort())
82+
glyph.SetInputData(srcPolyData)
83+
glyph.SetVectorModeToUseVector()
84+
glyph.SetScaleModeToScaleByVector()
85+
glyph.SetScaleFactor(size)
86+
glyph.OrientOn()
87+
glyph.Update()
88+
89+
normalsPolyData = vtk.vtkPolyData()
90+
normalsPolyData.DeepCopy(glyph.GetOutput())
91+
92+
return normalsPolyData

0 commit comments

Comments
 (0)