TTK
Loading...
Searching...
No Matches
ttkUserInterfaceBase.cpp
Go to the documentation of this file.
1// local includes
3
4#include <vtkPointData.h>
5#include <vtkTexture.h>
6#include <vtkVersionMacros.h>
7
8#ifndef TTK_INSTALL_ASSETS_DIR
9#define TTK_INSTALL_ASSETS_DIR "."
10#endif // TTK_INSTALL_ASSETS_DIR
11
12using namespace std;
13using namespace ttk;
14
16
18
19 vtkRenderWindowInteractor *interactor = this->Interactor;
20 string key = interactor->GetKeySym();
21
22 if(interactor->GetControlKey()) {
23 // control key pressed
24 if(key == "e") {
25 // export
26 userInterface_->exportScene("output.wrl");
27 }
28 if(key == "s") {
29 // save in vtk file format
30 userInterface_->save();
31 }
32 } else {
33
34 if(key == "Return") {
35 // do something if the user hits Enter
36 userInterface_->execute();
37 } else if(key == "Escape") {
38 exit(0);
39 }
40
41 if((key == "0") || (key == "1") || (key == "2") || (key == "3")
42 || (key == "4") || (key == "5") || (key == "6") || (key == "7")
43 || (key == "8") || (key == "9")) {
44
45 int outputId = -1;
46 stringstream stream;
47
48 stream << key;
49 stream >> outputId;
50
51 userInterface_->switchOutput(outputId);
52 }
53
54 if(key == "t") {
55 userInterface_->switchTransparency();
56 }
57 }
58
59 if(userInterface_->getKeyHandler()) {
60 userInterface_->getKeyHandler()->OnKeyPress(interactor, key);
61 }
62
63 userInterface_->refresh();
64}
65
67
68 keyHandler_ = nullptr;
69 vtkWrapper_ = nullptr;
70 isUp_ = false;
71 repeat_ = false;
72 transparency_ = false;
73 fullscreen_ = false;
74
81
82 pngReader_->SetFileName(
84 "/textures/png/scalarFieldTexturePaleInterleavedRules.png");
85 pngReader_->Update();
86 hasTexture_ = !((pngReader_->GetOutput()->GetNumberOfPoints() == 1)
87 && (pngReader_->GetOutput()->GetNumberOfCells() == 1));
88}
89
91
92int ttkUserInterfaceBase::exportScene(const string &fileName) const {
93
94 vtkVRMLExporter *exporter = vtkVRMLExporter::New();
95
96#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 6, 1)
97 exporter->SetRenderWindow(renderWindow_);
98#else
99 exporter->SetInput(renderWindow_);
100#endif
101 exporter->SetFileName(fileName.data());
102 exporter->Write();
103
104 exporter->Delete();
105
106 return 0;
107}
108
109int ttkUserInterfaceBase::init(int &argc, char **argv) {
110
111 parser_.setOption("R", &repeat_, "Repeat the program when hitting `Return'");
112 parser_.setOption(
113 "fullscreen", &fullscreen_, "Maximize the window at launch");
114
115 return ProgramBase::init(argc, argv);
116}
117
119
120 // collect the output and update the rendering
121 int const outputPortNumber = vtkWrapper_->GetNumberOfOutputPorts();
122
123 if((int)visibleOutputs_.size() != outputPortNumber) {
124 visibleOutputs_.resize(outputPortNumber, true);
125
126 for(int i = 0; i < (int)hiddenOutputs_.size(); i++) {
127 if((hiddenOutputs_[i] >= 0)
128 && (hiddenOutputs_[i] < (int)visibleOutputs_.size())) {
130 }
131 }
132 }
133
134 if((int)surfaces_.size() != outputPortNumber) {
135 surfaces_.resize(outputPortNumber, nullptr);
136 mainActors_.resize(outputPortNumber);
137 boundaryFilters_.resize(outputPortNumber);
138 boundaryMappers_.resize(outputPortNumber);
139 textureMapFromFields_.resize(outputPortNumber);
140
141 for(int i = 0; i < outputPortNumber; i++) {
146 }
147 }
148
149 for(int i = 0; i < outputPortNumber; i++) {
150
151 if(visibleOutputs_[i]) {
152
153 if(hasTexture_) {
154 vtkWrapper_->GetOutput(i)->GetPointData()->SetActiveScalars(nullptr);
155 }
156
157 if((repeat_) && (i < vtkWrapper_->GetNumberOfInputPorts())) {
158 inputs_[i]->DeepCopy(vtkWrapper_->GetOutput(i));
159 vtkWrapper_->SetInputData(i, inputs_[i]);
160 }
161
162 // extract the boundary surface of the tet-mesh
163 boundaryFilters_[i]->SetInputData(vtkWrapper_->GetOutput(i));
164 boundaryFilters_[i]->Update();
165 }
166 }
167
168 // update the scalar field texture
170
171 for(int i = 0; i < (int)mainActors_.size(); i++) {
172 if(visibleOutputs_[i]) {
173 mainActors_[i]->SetMapper(boundaryMappers_[i]);
174 } else {
175 mainActors_[i]->SetMapper(nullptr);
176 }
177 if(transparency_) {
178 mainActors_[i]->GetProperty()->SetOpacity(0.3);
179 } else {
180 mainActors_[i]->GetProperty()->SetOpacity(1);
181 }
182 renderer_->AddActor(mainActors_[i]);
183 }
184
185 if(isUp_)
186 renderWindow_->Render();
187
188 return 0;
189}
190
192
193 execute();
194
195 {
196 stringstream msg;
197 msg << "[UserInterface] Initializing user interface..." << endl;
198 printMsg(msg.str());
199 }
200
201 renderWindow_->AddRenderer(renderer_);
202 if(fullscreen_) {
203 renderWindow_->SetFullScreen(fullscreen_);
204 } else {
205 renderWindow_->SetSize(1920, 1080);
206 }
207 renderWindow_->SetWindowName("TTK - The Topology ToolKit");
208
209 interactor_->SetRenderWindow(renderWindow_);
210 interactor_->SetInteractorStyle(customInteractor_);
211 customInteractor_->SetCurrentRenderer(renderer_);
212 customInteractor_->setUserInterface(this);
213
214 refresh();
215
216 renderer_->SetBackground(44 / 255.0, 44 / 255.0, 44 / 255.0);
217
218 interactor_->Initialize();
219
220 {
221 stringstream msg;
222 msg << "[ttkUserInterfaceBase] Running user interface!" << endl;
223 printMsg(msg.str());
224 }
225
226 isUp_ = true;
227
228 interactor_->Start();
229
230 return 0;
231}
232
233int ttkUserInterfaceBase::switchOutput(const int &outputId) {
234
235 if(!vtkWrapper_)
236 return -1;
237
238 if((outputId < 0) || (outputId >= vtkWrapper_->GetNumberOfOutputPorts()))
239 return -2;
240
241 stringstream msg;
242 msg << "[ttkUserInterfaceBase] Turning output #" << outputId << " ";
243
244 if(visibleOutputs_[outputId]) {
245 msg << "off";
246 } else {
247 msg << "on";
248 }
249 msg << endl;
250 printMsg(msg.str());
251
252 visibleOutputs_[outputId] = !visibleOutputs_[outputId];
253
254 return 0;
255}
256
258
259 stringstream msg;
260 msg << "[ttkUserInterfaceBase] Switching transparency ";
261
262 if(transparency_) {
263 msg << "off";
264 } else {
265 msg << "on";
266 }
267 msg << endl;
268 printMsg(msg.str());
269
271
272 return 0;
273}
274
276
277 for(int i = 0; i < (int)boundaryFilters_.size(); i++) {
278
279 // use a texture for the color-value visualization
280 if((boundaryFilters_[i]->GetOutput()->GetPointData())
281 && (boundaryFilters_[i]->GetOutput()->GetPointData()->GetArray(0))) {
282
283 textureMapFromFields_[i]->SetInputDataObject(
284 0, boundaryFilters_[i]->GetOutput());
285 textureMapFromFields_[i]->Update();
286 surfaces_[i] = vtkPolyData::SafeDownCast(
287 textureMapFromFields_[i]->GetOutputDataObject(0));
288
289 texture_->SetInputConnection(pngReader_->GetOutputPort());
290
291 if(hasTexture_) {
292 mainActors_[i]->SetTexture(texture_);
293 }
294 } else {
295 surfaces_[i] = boundaryFilters_[i]->GetOutput();
296 }
297
298 boundaryMappers_[i]->SetInputData(surfaces_[i]);
299 }
300
301 return 0;
302}
ttkUserInterfaceBase * userInterface_
int execute() override
Set the arguments of your ttk module and execute it here.
vtkDataSetAlgorithm * vtkWrapper_
std::vector< vtkDataSet * > inputs_
std::vector< vtkPolyData * > surfaces_
vtkSmartPointer< vtkRenderWindowInteractor > interactor_
vtkSmartPointer< ttkCustomInteractor > customInteractor_
int switchOutput(const int &outputId)
vtkSmartPointer< vtkRenderer > renderer_
vtkSmartPointer< vtkPNGReader > pngReader_
std::vector< vtkSmartPointer< vtkActor > > mainActors_
vtkSmartPointer< vtkRenderWindow > renderWindow_
std::vector< vtkSmartPointer< vtkDataSetSurfaceFilter > > boundaryFilters_
int init(int &argc, char **argv) override
~ttkUserInterfaceBase() override
std::vector< int > hiddenOutputs_
std::vector< bool > visibleOutputs_
std::vector< vtkSmartPointer< ttkTextureMapFromField > > textureMapFromFields_
int exportScene(const std::string &fileName="output.wrl") const
std::vector< vtkSmartPointer< vtkPolyDataMapper > > boundaryMappers_
vtkSmartPointer< vtkTexture > texture_
CommandLineParser parser_
Definition ProgramBase.h:69
virtual int init(int &argc, char **argv)
Definition ProgramBase.h:30
TTK base package defining the standard types.
vtkStandardNewMacro(ttkCustomInteractor)
#define TTK_INSTALL_ASSETS_DIR
printMsg(debug::output::BOLD+" | | | | | . \\ | | (__| | / __/| |_| / __/| (_) |"+debug::output::ENDCOLOR, debug::Priority::PERFORMANCE, debug::LineMode::NEW, stream)