1#!/usr/bin/env python
2import os
3import vtk
4from vtk.util.misc import vtkGetDataRoot
5VTK_DATA_ROOT = vtkGetDataRoot()
6
7def GetRGBColor(colorName):
8    '''
9        Return the red, green and blue components for a
10        color as doubles.
11    '''
12    rgb = [0.0, 0.0, 0.0]  # black
13    vtk.vtkNamedColors().GetColorRGB(colorName, rgb)
14    return rgb
15
16# Generate a rectilinear grid from a field.
17#
18
19# Create a reader and write out the field
20reader = vtk.vtkDataSetReader()
21reader.SetFileName(VTK_DATA_ROOT + "/Data/RectGrid2.vtk")
22
23ds2do = vtk.vtkDataSetToDataObjectFilter()
24ds2do.SetInputConnection(reader.GetOutputPort())
25
26# NOTE: This test only works if the current directory is writable
27#
28try:
29    channel = open("RGridField.vtk", "wb")
30    channel.close()
31
32    writer = vtk.vtkDataObjectWriter()
33    writer.SetInputConnection(ds2do.GetOutputPort())
34    writer.SetFileName("RGridField.vtk")
35    writer.Write()
36
37    # Read the field
38    #
39    dor = vtk.vtkDataObjectReader()
40    dor.SetFileName("RGridField.vtk")
41
42    do2ds = vtk.vtkDataObjectToDataSetFilter()
43    do2ds.SetInputConnection(dor.GetOutputPort())
44    do2ds.SetDataSetTypeToRectilinearGrid()
45    do2ds.SetDimensionsComponent("Dimensions", 0)
46    do2ds.SetPointComponent(0, "XCoordinates", 0)
47    do2ds.SetPointComponent(1, "YCoordinates", 0)
48    do2ds.SetPointComponent(2, "ZCoordinates", 0)
49    do2ds.Update()
50
51    fd2ad = vtk.vtkFieldDataToAttributeDataFilter()
52    fd2ad.SetInputData(do2ds.GetRectilinearGridOutput())
53    fd2ad.SetInputFieldToDataObjectField()
54    fd2ad.SetOutputAttributeDataToPointData()
55    fd2ad.SetVectorComponent(0, "vectors", 0)
56    fd2ad.SetVectorComponent(1, "vectors", 1)
57    fd2ad.SetVectorComponent(2, "vectors", 2)
58    fd2ad.SetScalarComponent(0, "scalars", 0)
59    fd2ad.Update()
60
61    # create pipeline
62    #
63    plane = vtk.vtkRectilinearGridGeometryFilter()
64    plane.SetInputData(fd2ad.GetRectilinearGridOutput())
65    plane.SetExtent(0, 100, 0, 100, 15, 15)
66
67    warper = vtk.vtkWarpVector()
68    warper.SetInputConnection(plane.GetOutputPort())
69    warper.SetScaleFactor(0.05)
70
71    planeMapper = vtk.vtkDataSetMapper()
72    planeMapper.SetInputConnection(warper.GetOutputPort())
73    planeMapper.SetScalarRange(0.197813, 0.710419)
74
75    planeActor = vtk.vtkActor()
76    planeActor.SetMapper(planeMapper)
77
78    cutPlane = vtk.vtkPlane()
79    cutPlane.SetOrigin(fd2ad.GetOutput().GetCenter())
80    cutPlane.SetNormal(1, 0, 0)
81
82    planeCut = vtk.vtkCutter()
83    planeCut.SetInputData(fd2ad.GetRectilinearGridOutput())
84    planeCut.SetCutFunction(cutPlane)
85
86    cutMapper = vtk.vtkDataSetMapper()
87    cutMapper.SetInputConnection(planeCut.GetOutputPort())
88    cutMapper.SetScalarRange(fd2ad.GetOutput().GetPointData().GetScalars().GetRange())
89
90    cutActor = vtk.vtkActor()
91    cutActor.SetMapper(cutMapper)
92
93    iso = vtk.vtkContourFilter()
94    iso.SetInputData(fd2ad.GetRectilinearGridOutput())
95    iso.SetValue(0, 0.7)
96
97    normals = vtk.vtkPolyDataNormals()
98    normals.SetInputConnection(iso.GetOutputPort())
99    normals.SetFeatureAngle(45)
100
101    isoMapper = vtk.vtkPolyDataMapper()
102    isoMapper.SetInputConnection(normals.GetOutputPort())
103    isoMapper.ScalarVisibilityOff()
104
105    isoActor = vtk.vtkActor()
106    isoActor.SetMapper(isoMapper)
107    isoActor.GetProperty().SetColor(GetRGBColor('bisque'))
108    isoActor.GetProperty().SetRepresentationToWireframe()
109
110    streamer = vtk.vtkStreamTracer()
111    streamer.SetInputConnection(fd2ad.GetOutputPort())
112    streamer.SetStartPosition(-1.2, -0.1, 1.3)
113    streamer.SetMaximumPropagation(500)
114    streamer.SetInitialIntegrationStep(0.05)
115    streamer.SetIntegrationDirectionToBoth()
116
117    streamTube = vtk.vtkTubeFilter()
118    streamTube.SetInputConnection(streamer.GetOutputPort())
119    streamTube.SetRadius(0.025)
120    streamTube.SetNumberOfSides(6)
121    streamTube.SetVaryRadiusToVaryRadiusByVector()
122
123    mapStreamTube = vtk.vtkPolyDataMapper()
124    mapStreamTube.SetInputConnection(streamTube.GetOutputPort())
125    mapStreamTube.SetScalarRange(fd2ad.GetOutput().GetPointData().GetScalars().GetRange())
126
127    streamTubeActor = vtk.vtkActor()
128    streamTubeActor.SetMapper(mapStreamTube)
129    streamTubeActor.GetProperty().BackfaceCullingOn()
130
131    outline = vtk.vtkOutlineFilter()
132    outline.SetInputData(fd2ad.GetRectilinearGridOutput())
133
134    outlineMapper = vtk.vtkPolyDataMapper()
135    outlineMapper.SetInputConnection(outline.GetOutputPort())
136
137    outlineActor = vtk.vtkActor()
138    outlineActor.SetMapper(outlineMapper)
139    outlineActor.GetProperty().SetColor(GetRGBColor('black'))
140
141    # Graphics stuff
142    # Create the RenderWindow, Renderer and both Actors
143    #
144    ren1 = vtk.vtkRenderer()
145    renWin = vtk.vtkRenderWindow()
146    renWin.SetMultiSamples(0)
147    renWin.AddRenderer(ren1)
148    iren = vtk.vtkRenderWindowInteractor()
149    iren.SetRenderWindow(renWin)
150
151    # Add the actors to the renderer, set the background and size
152    #
153    ren1.AddActor(outlineActor)
154    ren1.AddActor(planeActor)
155    ren1.AddActor(cutActor)
156    ren1.AddActor(isoActor)
157    ren1.AddActor(streamTubeActor)
158
159    ren1.SetBackground(1, 1, 1)
160
161    renWin.SetSize(300, 300)
162
163    ren1.GetActiveCamera().SetPosition(0.0390893, 0.184813, -3.94026)
164    ren1.GetActiveCamera().SetFocalPoint(-0.00578326, 0, 0.701967)
165    ren1.GetActiveCamera().SetViewAngle(30)
166    ren1.GetActiveCamera().SetViewUp(0.00850257, 0.999169, 0.0398605)
167    ren1.GetActiveCamera().SetClippingRange(3.08127, 6.62716)
168
169    iren.Initialize()
170
171    # render the image
172    #
173    renWin.Render()
174
175    # cleanup
176    #
177    try:
178        os.remove("RGridField.vtk")
179    except OSError:
180        pass
181
182
183#    iren.Start()
184
185except IOError:
186    print("Couldn't open RGridField.vtk for writing.")
187