Nektar++
VtkToPng.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // File: VtkToPng.cpp
4 //
5 // For more information, please see: http://www.nektar.info
6 //
7 // The MIT License
8 //
9 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10 // Department of Aeronautics, Imperial College London (UK), and Scientific
11 // Computing and Imaging Institute, University of Utah (USA).
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining a
14 // copy of this software and associated documentation files (the "Software"),
15 // to deal in the Software without restriction, including without limitation
16 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 // and/or sell copies of the Software, and to permit persons to whom the
18 // Software is furnished to do so, subject to the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be included
21 // in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29 // DEALINGS IN THE SOFTWARE.
30 //
31 // Description: Render a VTK Unstructured Grid file as a PNG
32 //
33 ///////////////////////////////////////////////////////////////////////////////
34 
36 #include <vtkActor.h>
37 #include <vtkRenderWindow.h>
38 #include <vtkRenderer.h>
39 
40 #if VTK_MAJOR_VERSION >= 9
41 #include <limits>
42 #include <stdexcept>
43 #endif
44 
45 #include <vtkCamera.h>
46 #include <vtkDataSetMapper.h>
47 #include <vtkGraphicsFactory.h>
48 #include <vtkLookupTable.h>
49 #include <vtkPNGWriter.h>
50 #include <vtkPointData.h>
51 #include <vtkPolyData.h>
52 #include <vtkSmartPointer.h>
53 #include <vtkSphereSource.h>
54 #include <vtkWindowToImageFilter.h>
55 #include <vtkXMLUnstructuredGridReader.h>
56 
57 #include <iostream>
58 using namespace std;
59 
60 int main(int argc, char *argv[])
61 {
62  if (argc != 2 && argc != 4)
63  {
64  cout << "Usage: VtkToPng vtk-file [lower upper]" << endl;
65  exit(-1);
66  }
67 
68  string vInput = argv[1];
69  string vOutput = vInput.substr(0, vInput.find_last_of('.')) + ".png";
70 
71  // Setup offscreen rendering
72  vtkSmartPointer<vtkGraphicsFactory> graphics_factory =
73  vtkSmartPointer<vtkGraphicsFactory>::New();
74  graphics_factory->SetOffScreenOnlyMode(1);
75  graphics_factory->SetUseMesaClasses(1);
76 
77  // Create a poly data reader and retrieve dataset from file
78  vtkSmartPointer<vtkXMLUnstructuredGridReader> reader =
79  vtkSmartPointer<vtkXMLUnstructuredGridReader>::New();
80  reader->SetFileName(vInput.c_str());
81  reader->Update();
82 
83  vtkSmartPointer<vtkDataSet> data =
84  vtkSmartPointer<vtkDataSet>(reader->GetOutputAsDataSet());
85  data->GetPointData()->SetActiveScalars("u");
86 
87  double scalar_range[2];
88  data->GetScalarRange(scalar_range);
89  if (argc == 4)
90  {
91  scalar_range[0] = atof(argv[2]);
92  scalar_range[1] = atof(argv[3]);
93  }
94 
95  // Lookup table
96  vtkSmartPointer<vtkLookupTable> lookup =
97  vtkSmartPointer<vtkLookupTable>::New();
98  lookup->SetHueRange(0.0, 1.0);
99  lookup->SetSaturationRange(1, 1);
100  lookup->SetTableRange(scalar_range);
101  lookup->SetValueRange(1, 1);
102  lookup->Build();
103 
104  // Create a mapper and actor
105  vtkSmartPointer<vtkDataSetMapper> mapper =
106  vtkSmartPointer<vtkDataSetMapper>::New();
107 #if VTK_MAJOR_VERSION <= 5
108  mapper->SetInput(data);
109 #else
110  mapper->SetInputData(data);
111 #endif
112 
113 #if VTK_MAJOR_VERSION < 8 || (VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION <= 1)
114  // deprecated as of vtk 8.1
115  mapper->ImmediateModeRenderingOn();
116 #endif
117 
118  mapper->ScalarVisibilityOn();
119  mapper->SetScalarModeToUsePointData();
120  mapper->UseLookupTableScalarRangeOn();
121  // mapper->SetScalarRange(data->GetScalarRange());
122  mapper->SetLookupTable(lookup);
123 
124  vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
125  actor->SetMapper(mapper);
126 
127  // Configure camera position and direction
128  vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
129  camera->SetPosition(0.0, -1.0, 1.0);
130  camera->SetFocalPoint(0, 0, 0);
131 
132  // A renderer and render window
133  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
134  vtkSmartPointer<vtkRenderWindow> renderWindow =
135  vtkSmartPointer<vtkRenderWindow>::New();
136  renderWindow->SetOffScreenRendering(1);
137  renderWindow->AddRenderer(renderer);
138 
139  // Add the actors to the scene
140  renderer->AddActor(actor);
141  renderer->SetBackground(0, 0, 0); // Background color white
142  renderer->SetActiveCamera(camera);
143  renderer->ResetCamera();
144 
145  renderWindow->Render();
146 
147  // Create an image of scene
148  vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter =
149  vtkSmartPointer<vtkWindowToImageFilter>::New();
150  windowToImageFilter->SetInput(renderWindow);
151 
152 #if VTK_MAJOR_VERSION < 8 || (VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION <= 1)
153  // deprecated as of vtk 8.1
154  windowToImageFilter->SetMagnification(4);
155 #else
156  windowToImageFilter->SetScale(4, 4);
157 #endif
158  windowToImageFilter->Update();
159 
160  // Write image to PNG
161  vtkSmartPointer<vtkPNGWriter> writer = vtkSmartPointer<vtkPNGWriter>::New();
162  writer->SetFileName(vOutput.c_str());
163  writer->SetInputConnection(windowToImageFilter->GetOutputPort());
164  writer->Write();
165 
166  return EXIT_SUCCESS;
167 }
int main(int argc, char *argv[])
Definition: VtkToPng.cpp:60