ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/vtkdisplay/src/vtkdisplay.cpp
Revision: 1061
Committed: Thu May 27 18:50:20 2021 UTC (4 years, 2 months ago) by francois
File size: 23921 byte(s)
Log Message:
reorganisation des repertoires de magic avec import de la visu vtk

File Contents

# User Rev Content
1 francois 1061 // nUtil - An utility Library for gnurbs
2     // Copyright (C) 2008-2019 Eric Bechet
3     //
4     // See the LICENSE file for contributions and license information.
5     // Please report all bugs and problems to <bechet@cadxfem.org>.
6     //
7    
8     #include "vtkdisplay.h"
9     #include "keyboardCallback.h"
10     #include "mousewheelforwardCallback.h"
11     #include "mousewheelbackwardCallback.h"
12    
13     #include <vtkCellArray.h>
14     #include <vtkCellData.h>
15     #include <vtkDoubleArray.h>
16     #include <vtkPoints.h>
17     #include <vtkVertex.h>
18     #include <vtkLine.h>
19     #include <vtkTriangle.h>
20     #include <vtkQuad.h>
21     #include <vtkPolyData.h>
22     #include <vtkPolyDataMapper.h>
23     #include <vtkActor.h>
24     #include <vtkRenderWindow.h>
25     #include <vtkRenderer.h>
26     #include <vtkRenderWindowInteractor.h>
27     #include <vtkProperty.h>
28     #include <vtkCamera.h>
29     #include <vtkVectorText.h>
30     #include <vtkFollower.h>
31    
32    
33     #include "vtkLinearExtrusionFilter.h"
34     #include "vtkTextActor3D.h"
35     #include "vtkTextActor.h"
36     #include "vtkTextProperty.h"
37    
38     void vtkdisplay::test(void)
39     {
40    
41     double world_coord[3]={0.,0.,0.};
42     renderer->SetWorldPoint(world_coord[0], world_coord[1], world_coord[2], 1.0);
43     renderer->WorldToDisplay();
44     double *screen_coord = renderer->GetDisplayPoint();
45     vtkTextActor* text = vtkTextActor::New();
46     text->SetInput ( "VTK tutorial\nvtkTextActor!" );
47     vtkTextProperty* tprop = text->GetTextProperty();
48     tprop->SetFontFamilyToArial ();
49     // tprop->BoldOn();
50     // tprop->ShadowOn();
51     tprop->SetLineSpacing ( 1.0 );
52     tprop->SetFontSize ( 12 );
53     tprop->SetColor ( 1.0,0.0,0.0 );
54     // tprop->SetShadowOffset ( 2,2 );
55     text->SetDisplayPosition (screen_coord[0], screen_coord[1] );
56     renderer->AddActor2D ( text );
57     /* 3D text
58     // Create a vector text
59     vtkVectorText* vecText = vtkVectorText::New();
60     vecText->SetText ( "vtkVectorText" );
61    
62     vtkLinearExtrusionFilter* extrude = vtkLinearExtrusionFilter::New();
63     extrude->SetInputConnection ( vecText->GetOutputPort() );
64     extrude->SetExtrusionTypeToNormalExtrusion();
65     extrude->SetVector ( 0, 0, 1 );
66     extrude->SetScaleFactor ( 0.5 );
67    
68     vtkPolyDataMapper* txtMapper = vtkPolyDataMapper::New();
69     txtMapper->SetInputConnection ( extrude->GetOutputPort() );
70     vtkActor* txtActor = vtkActor::New();
71     txtActor->SetMapper ( txtMapper );
72     ren->AddActor ( txtActor );
73    
74     */
75     }
76    
77    
78     vtkdisplay::vtkdisplay(color c,const char *nom):line(true),quad(true),triangle(true),vertice(true)
79     {
80     numero[0]=true;
81     numero[1]=true;
82     numero[2]=true;
83     renderer = vtkSmartPointer<vtkRenderer>::New();
84     renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
85     renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
86     interactorObserver = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
87    
88     renderWindow->AddRenderer(renderer);
89     if (nom!=NULL) renderWindow->SetWindowName(nom);
90     renderWindowInteractor->SetRenderWindow(renderWindow);
91     renderWindowInteractor->SetInteractorStyle(interactorObserver);
92     renderWindow->SetSize(600, 600);
93     renderWindow->SetAAFrames(4); // soft antialiasing
94     renderWindow->SetMultiSamples(4); // hardware antialiasing
95     renderWindow->PointSmoothingOn(); // points as circles
96     double r=c.R/255.;
97     double g=c.G/255.;
98     double b=c.B/255.;
99     renderer->SetBackground(r, g, b);
100     }
101    
102    
103     void vtkdisplay::display()
104     {
105     /* if (ncb)
106     {
107     ncb->draw();
108     init_data(*(ncb->get_data()));
109     }*/
110     renderer->ResetCamera();
111     // if (perspectiveon==true) renderer->GetActiveCamera()->ParallelProjectionOn();
112     renderWindow->Render();
113     keyboardCallback *keybcall = keyboardCallback::New(this);
114     renderWindowInteractor->AddObserver(vtkCommand::KeyPressEvent, keybcall);
115     mousewheelforwardCallback *mousewheelforwardcall=mousewheelforwardCallback::New(this);
116     renderWindowInteractor->AddObserver(vtkCommand::MouseWheelForwardEvent, mousewheelforwardcall);
117     mousewheelbackwardCallback *mousewheelbackwardcall=mousewheelbackwardCallback::New(this);
118     renderWindowInteractor->AddObserver(vtkCommand::MouseWheelBackwardEvent, mousewheelbackwardcall);
119    
120     saveCameraDefault();
121     scaleactif=renderer->GetActiveCamera()->GetParallelScale();
122     renderWindowInteractor->Start();
123     }
124    
125     void vtkdisplay::init_data_vertices(const data_container & data)
126     {
127     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
128    
129     for (int blk=0;blk<data.getnumproppoints();++blk)
130     {
131     color c=data.getcolorpoints(blk);
132     int last=(blk+1<data.getnumproppoints()) ? data.getindexpoints(blk+1) : data.nb_points();
133     // std::cout << blk << " " << data.getindexpoints(blk) << " " << last << std::endl ;
134     vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
135     for (int i=data.getindexpoints(blk);i!=last;++i)
136     {
137     points->InsertNextPoint(data.get_point(i).pts.array());
138     vtkSmartPointer<vtkVertex> vertex = vtkSmartPointer<vtkVertex>::New();
139     vertex->GetPointIds()->InsertId(0,i);
140     vertices->InsertNextCell(vertex);
141     }
142     //Create a polydata to store everything in
143     vtkSmartPointer<vtkPolyData> verticesPolyData = vtkSmartPointer<vtkPolyData>::New();
144     //add the points to the dataset
145     verticesPolyData->SetPoints(points);
146     //add the lines to the dataset
147     verticesPolyData->SetVerts(vertices);
148     //setup actor and mapper
149     vtkSmartPointer<vtkPolyDataMapper> mapper_vertices = vtkSmartPointer<vtkPolyDataMapper>::New();
150     #if (VTK_MAJOR_VERSION>=6)
151     mapper_vertices->SetInputData(verticesPolyData);
152     #else
153     mapper_vertices->SetInput(verticesPolyData);
154     #endif
155     vtkSmartPointer<vtkActor> actor_vertices = vtkSmartPointer<vtkActor>::New();
156     double r=data.getcolorpoints(blk).R/255.;
157     double g=data.getcolorpoints(blk).G/255.;
158     double b=data.getcolorpoints(blk).B/255.;
159     actor_vertices->GetProperty()->SetColor(r,g,b);
160     actor_vertices->GetProperty()->SetOpacity(data.getcolorpoints(blk).A/255.);
161     actor_vertices->GetProperty()->SetPointSize(data.getproppoints(blk).pointsize);
162     actor_vertices->SetMapper(mapper_vertices);
163     renderer->AddActor(actor_vertices);
164     list_vertice.push_back(actor_vertices);
165     }
166    
167    
168    
169     }
170     void vtkdisplay::init_data_texts(const data_container & data)
171     {
172     if (data.nb_texts(0)+data.nb_texts(1)+data.nb_texts(2)==0) return;
173     double xmin=1e308,ymin=1e308,zmin=1e308;
174     double xmax=-1e308,ymax=-1e308,zmax=-1e308;
175     for (int dim=0;dim<3;dim++)
176     {
177     int nb=data.nb_texts(dim);
178     for (int i=0;i<nb;i++)
179     {
180     if (data.get_text(dim,i).pts.x()<xmin) xmin=data.get_text(dim,i).pts.x();
181     if (data.get_text(dim,i).pts.y()<ymin) ymin=data.get_text(dim,i).pts.y();
182     if (data.get_text(dim,i).pts.z()<zmin) zmin=data.get_text(dim,i).pts.z();
183     if (data.get_text(dim,i).pts.x()>xmax) xmax=data.get_text(dim,i).pts.x();
184     if (data.get_text(dim,i).pts.y()>ymax) ymax=data.get_text(dim,i).pts.y();
185     if (data.get_text(dim,i).pts.z()>zmax) zmax=data.get_text(dim,i).pts.z();
186     }
187     }
188     int nb2=data.nb_points();
189     for (int i=0;i<nb2;i++)
190     {
191     if (data.get_point(i).pts.x()<xmin) xmin=data.get_point(i).pts.x();
192     if (data.get_point(i).pts.y()<xmin) ymin=data.get_point(i).pts.y();
193     if (data.get_point(i).pts.z()<xmin) zmin=data.get_point(i).pts.z();
194     if (data.get_point(i).pts.x()>xmax) xmax=data.get_point(i).pts.x();
195     if (data.get_point(i).pts.y()>ymax) ymax=data.get_point(i).pts.y();
196     if (data.get_point(i).pts.z()>zmax) zmax=data.get_point(i).pts.z();
197     }
198     int nb3=data.nb_lines();
199     for (int i=0;i<nb3;i++)
200     {
201     for (int dim=0;dim<2;dim++)
202     {
203     if (data.get_line(i).pts[dim].x()<xmin) xmin=data.get_line(i).pts[dim].x();
204     if (data.get_line(i).pts[dim].y()<ymin) ymin=data.get_line(i).pts[dim].y();
205     if (data.get_line(i).pts[dim].z()<zmin) zmin=data.get_line(i).pts[dim].z();
206     if (data.get_line(i).pts[dim].x()>xmax) xmax=data.get_line(i).pts[dim].x();
207     if (data.get_line(i).pts[dim].y()>ymax) ymax=data.get_line(i).pts[dim].y();
208     if (data.get_line(i).pts[dim].z()>zmax) zmax=data.get_line(i).pts[dim].z();
209     }
210     }
211     int nb4=data.nb_triangles();
212     for (int i=0;i<nb4;i++)
213     {
214     for (int dim=0;dim<3;dim++)
215     {
216     if (data.get_triangle(i).pts[dim].x()<xmin) xmin=data.get_triangle(i).pts[dim].x();
217     if (data.get_triangle(i).pts[dim].y()<ymin) ymin=data.get_triangle(i).pts[dim].y();
218     if (data.get_triangle(i).pts[dim].z()<zmin) zmin=data.get_triangle(i).pts[dim].z();
219     if (data.get_triangle(i).pts[dim].x()>xmax) xmax=data.get_triangle(i).pts[dim].x();
220     if (data.get_triangle(i).pts[dim].y()>ymax) ymax=data.get_triangle(i).pts[dim].y();
221     if (data.get_triangle(i).pts[dim].z()>zmax) zmax=data.get_triangle(i).pts[dim].z();
222     }
223     }
224     int nb5=data.nb_quads();
225     for (int i=0;i<nb5;i++)
226     {
227     for (int dim=0;dim<4;dim++)
228     {
229     if (data.get_quad(i).pts[dim].x()<xmin) xmin=data.get_quad(i).pts[dim].x();
230     if (data.get_quad(i).pts[dim].y()<ymin) ymin=data.get_quad(i).pts[dim].y();
231     if (data.get_quad(i).pts[dim].z()<zmin) zmin=data.get_quad(i).pts[dim].z();
232     if (data.get_quad(i).pts[dim].x()>xmax) xmax=data.get_quad(i).pts[dim].x();
233     if (data.get_quad(i).pts[dim].y()>ymax) ymax=data.get_quad(i).pts[dim].y();
234     if (data.get_quad(i).pts[dim].z()>zmax) zmax=data.get_quad(i).pts[dim].z();
235     }
236     }
237     double xec=xmax-xmin;
238     double yec=ymax-ymin;
239     double zec=zmax-zmin;
240     double scale=xec;
241    
242     if (yec>scale) scale=yec;
243     if (zec>scale) scale=zec;
244    
245     for (int dim=0;dim<3;dim++)
246     {
247     int nb=data.nb_texts(dim);
248     for (int i=0;i<nb;i++)
249     {
250     vtkSmartPointer<vtkVectorText> textSource =
251     vtkSmartPointer<vtkVectorText>::New();
252     textSource->SetText( data.get_text(dim,i).info.c_str() );
253    
254    
255     // Create a mapper
256     vtkSmartPointer<vtkPolyDataMapper> mapper =
257     vtkSmartPointer<vtkPolyDataMapper>::New();
258     mapper->SetInputConnection( textSource->GetOutputPort() );
259    
260    
261    
262     // Create a subclass of vtkActor: a vtkFollower that remains facing the camera
263     vtkSmartPointer<vtkFollower> follower =
264     vtkSmartPointer<vtkFollower>::New();
265     follower->SetMapper( mapper );
266     follower->GetProperty()->SetColor( data.get_text_color(dim,i).R/255.,data.get_text_color(dim,i).G/255.,data.get_text_color(dim,i).B/255.); // red
267     follower->SetPosition(data.get_text(dim,i).pts.x(),data.get_text(dim,i).pts.y(),data.get_text(dim,i).pts.z()); // red
268     follower->SetScale(0.008333333*3.*scale); // red
269     renderer->AddActor( follower );
270     follower->SetCamera( renderer->GetActiveCamera() );
271     list_numero[dim].push_back(follower);
272     }
273     }
274     }
275    
276     void vtkdisplay::init_data_lines(const data_container & data)
277     {
278     vtkSmartPointer<vtkPoints> linespoints = vtkSmartPointer<vtkPoints>::New();
279     for (int blk=0;blk<data.getnumproplines();++blk)
280     {
281     color c=data.getcolorlines(blk);
282     int last=(blk+1<data.getnumproplines()) ? data.getindexlines(blk+1) : data.nb_lines();
283     // std::cout << blk << " " << data.getindexlines(blk) << " " << last << std::endl ;
284     vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
285     for (int i=data.getindexlines(blk);i!=last;++i)
286     {
287     linespoints->InsertNextPoint(data.get_line(i).pts[0].array());
288     linespoints->InsertNextPoint(data.get_line(i).pts[1].array());
289     vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
290     line->GetPointIds()->InsertId(0,i*2);
291     line->GetPointIds()->InsertId(1,i*2+1);
292     lines->InsertNextCell(line);
293     }
294     //Create a polydata to store everything in
295     vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
296     //add the points to the dataset
297     linesPolyData->SetPoints(linespoints);
298     //add the lines to the dataset
299     linesPolyData->SetLines(lines);
300     //setup actor and mapper
301     vtkSmartPointer<vtkPolyDataMapper> mapper_lines = vtkSmartPointer<vtkPolyDataMapper>::New();
302     #if (VTK_MAJOR_VERSION>=6)
303     mapper_lines->SetInputData(linesPolyData);
304     #else
305     mapper_lines->SetInput(linesPolyData);
306     #endif
307     vtkSmartPointer<vtkActor> actor_lines = vtkSmartPointer<vtkActor>::New();
308     double r=data.getcolorlines(blk).R/255.;
309     double g=data.getcolorlines(blk).G/255.;
310     double b=data.getcolorlines(blk).B/255.;
311     double a=data.getcolorlines(blk).A/255.;
312     actor_lines->GetProperty()->SetColor(r,g,b);
313     actor_lines->GetProperty()->SetOpacity(a);
314     actor_lines->GetProperty()->SetLineWidth(data.getproplines(blk).thickness);
315     actor_lines->SetMapper(mapper_lines);
316     renderer->AddActor(actor_lines);
317     list_line.push_back(actor_lines);
318     // renderer->ResetCamera();
319     }
320     }
321    
322     void vtkdisplay::init_data_triangles(const data_container & data)
323     {
324     vtkSmartPointer<vtkPoints> trianglespoints = vtkSmartPointer<vtkPoints>::New();
325     for (int blk=0;blk<data.getnumproptriangles();++blk)
326     {
327     color c=data.getcolortriangles(blk);
328     int last=(blk+1<data.getnumproptriangles()) ? data.getindextriangles(blk+1) : data.nb_triangles();
329     // std::cout << blk << " " << data.getindextriangles(blk) << " " << last << std::endl ;
330     vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
331     for (int i=data.getindextriangles(blk);i!=last;++i)
332     {
333     trianglespoints->InsertNextPoint(data.get_triangle(i).pts[0].array());
334     trianglespoints->InsertNextPoint(data.get_triangle(i).pts[1].array());
335     trianglespoints->InsertNextPoint(data.get_triangle(i).pts[2].array());
336     vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
337     triangle->GetPointIds()->InsertId(0,i*3);
338     triangle->GetPointIds()->InsertId(1,i*3+1);
339     triangle->GetPointIds()->InsertId(2,i*3+2);
340     triangles->InsertNextCell(triangle);
341     }
342     //Create a polydata to store everything in
343     vtkSmartPointer<vtkPolyData> trianglesPolyData = vtkSmartPointer<vtkPolyData>::New();
344     //add the points to the dataset
345     trianglesPolyData->SetPoints(trianglespoints);
346     //add the triangles to the dataset
347     trianglesPolyData->SetPolys(triangles);
348     //setup actor and mapper
349     vtkSmartPointer<vtkPolyDataMapper> mapper_triangles = vtkSmartPointer<vtkPolyDataMapper>::New();
350     vtkSmartPointer<vtkActor> actor_triangles = vtkSmartPointer<vtkActor>::New();
351     double r=data.getcolortriangles(blk).R/255.;
352     double g=data.getcolortriangles(blk).G/255.;
353     double b=data.getcolortriangles(blk).B/255.;
354     double a=data.getcolortriangles(blk).A/255.;
355     actor_triangles->GetProperty()->SetColor(r,g,b);
356     actor_triangles->GetProperty()->SetOpacity(a);
357     #if (VTK_MAJOR_VERSION>=6)
358     mapper_triangles->SetInputData(trianglesPolyData);
359     #else
360     mapper_triangles->SetInput(trianglesPolyData);
361     #endif
362    
363     actor_triangles->SetMapper(mapper_triangles);
364     if (data.getproptriangles(blk).edgeon)
365     {
366     actor_triangles->GetProperty()->EdgeVisibilityOn();
367     actor_triangles->GetProperty()->SetEdgeColor(data.getproptriangles(blk).edgecolor.R/255.,data.getproptriangles(blk).edgecolor.G/255.,data.getproptriangles(blk).edgecolor.B/255.);
368     actor_triangles->GetProperty()->SetLineWidth(data.getproptriangles(blk).edgethickness);
369     }
370     renderer->AddActor(actor_triangles);
371     list_triangle.push_back(actor_triangles);
372     }
373     }
374    
375     void vtkdisplay::init_data_quads(const data_container & data)
376     {
377     vtkSmartPointer<vtkPoints> quadspoints = vtkSmartPointer<vtkPoints>::New();
378     for (int blk=0;blk<data.getnumpropquads();++blk)
379     {
380     color c=data.getcolorquads(blk);
381     int last=(blk+1<data.getnumpropquads()) ? data.getindexquads(blk+1) : data.nb_quads();
382     // std::cout << blk << " " << data.getindexquads(blk) << " " << last << std::endl ;
383     vtkSmartPointer<vtkCellArray> quads = vtkSmartPointer<vtkCellArray>::New();
384     for (int i=data.getindexquads(blk);i!=last;++i)
385     {
386     quadspoints->InsertNextPoint(data.get_quad(i).pts[0].array());
387     quadspoints->InsertNextPoint(data.get_quad(i).pts[1].array());
388     quadspoints->InsertNextPoint(data.get_quad(i).pts[2].array());
389     quadspoints->InsertNextPoint(data.get_quad(i).pts[3].array());
390     vtkSmartPointer<vtkQuad> quad = vtkSmartPointer<vtkQuad>::New();
391     quad->GetPointIds()->InsertId(0,i*4);
392     quad->GetPointIds()->InsertId(1,i*4+1);
393     quad->GetPointIds()->InsertId(2,i*4+2);
394     quad->GetPointIds()->InsertId(3,i*4+3);
395     quads->InsertNextCell(quad);
396     }
397     //Create a polydata to store everything in
398     vtkSmartPointer<vtkPolyData> quadsPolyData = vtkSmartPointer<vtkPolyData>::New();
399     //add the points to the dataset
400     quadsPolyData->SetPoints(quadspoints);
401     //add the quads to the dataset
402     quadsPolyData->SetPolys(quads);
403     //setup actor and mapper
404     vtkSmartPointer<vtkPolyDataMapper> mapper_quads = vtkSmartPointer<vtkPolyDataMapper>::New();
405     vtkSmartPointer<vtkActor> actor_quads = vtkSmartPointer<vtkActor>::New();
406     double r=data.getcolorquads(blk).R/255.;
407     double g=data.getcolorquads(blk).G/255.;
408     double b=data.getcolorquads(blk).B/255.;
409     double a=data.getcolorquads(blk).A/255.;
410     actor_quads->GetProperty()->SetColor(r,g,b);
411     actor_quads->GetProperty()->SetOpacity(a);
412    
413     #if (VTK_MAJOR_VERSION>=6)
414     mapper_quads->SetInputData(quadsPolyData);
415     #else
416     mapper_quads->SetInput(quadsPolyData);
417     #endif
418     actor_quads->SetMapper(mapper_quads);
419     if (data.getpropquads(blk).edgeon)
420     {
421     actor_quads->GetProperty()->EdgeVisibilityOn();
422     actor_quads->GetProperty()->SetEdgeColor(data.getpropquads(blk).edgecolor.R/255.,data.getpropquads(blk).edgecolor.G/255.,data.getpropquads(blk).edgecolor.B/255.);
423     actor_quads->GetProperty()->SetLineWidth(data.getpropquads(blk).edgethickness);
424     }
425    
426     renderer->AddActor(actor_quads);
427     list_quad.push_back(actor_quads);
428     }
429     }
430    
431     void vtkdisplay::init_data(const data_container & data)
432     {
433     init_data_vertices(data);
434     init_data_lines(data);
435     init_data_triangles(data);
436     init_data_quads(data);
437     init_data_texts(data);
438     }
439    
440     void vtkdisplay::init_data(const std::vector<data_container> &data)
441     {
442     for (int i=0;i<data.size();++i)
443     init_data(data[i]);
444     }
445    
446    
447    
448     void vtkdisplay::mousewheelforwardCall(int x,int y)
449     {
450     double scale=renderer->GetActiveCamera()->GetParallelScale();
451     double facteur=scaleactif/scale;
452     scaleactif=scale;
453     for (int dim=0;dim<3;dim++)
454     {
455     for (int i=0;i<list_numero[dim].size();i++)
456     {
457     double *scaleactor=list_numero[dim][i]->GetScale();
458     list_numero[dim][i]->SetScale(*scaleactor/facteur);
459     }
460    
461     }
462     renderWindow->Render();
463     }
464    
465     void vtkdisplay::mousewheelbackwardCall(int x,int y)
466     {
467     double scale=renderer->GetActiveCamera()->GetParallelScale();
468     double facteur=scaleactif/scale;
469     scaleactif=scale;
470     for (int dim=0;dim<3;dim++)
471     {
472     for (int i=0;i<list_numero[dim].size();i++)
473     {
474     double *scaleactor=list_numero[dim][i]->GetScale();
475     list_numero[dim][i]->SetScale(*scaleactor/facteur);
476     }
477    
478     }
479     renderWindow->Render();
480     }
481    
482    
483     void vtkdisplay::kbCallback(int key)
484     {
485     switch (key)
486     {
487     case 114: //r
488     {
489     resetCamera();
490     break;
491     }
492     case 43:
493     {
494     for (int dim=0;dim<3;dim++)
495     {
496     for (int i=0;i<list_numero[dim].size();i++)
497     {
498     double *scaleactor=list_numero[dim][i]->GetScale();
499     list_numero[dim][i]->SetScale(*scaleactor*1.1);
500     }
501    
502     }
503     renderWindow->Render();break;
504     }
505     case 45:
506     {
507     for (int dim=0;dim<3;dim++)
508     {
509     for (int i=0;i<list_numero[dim].size();i++)
510     {
511     double *scaleactor=list_numero[dim][i]->GetScale();
512     list_numero[dim][i]->SetScale(*scaleactor/1.1);
513     }
514    
515     }
516     renderWindow->Render();break;
517     }
518     case 49:
519     {
520     for (int i=0;i<list_numero[0].size();i++)
521     {
522     if (numero[0]==true)
523     renderer->RemoveActor(list_numero[0][i]);
524     else
525     renderer->AddActor(list_numero[0][i]);
526    
527     }
528     if (numero[0]==true) numero[0]=false; else numero[0]=true;
529     renderWindow->Render();
530     break;
531     }
532     case 52:
533     {
534     for (int i=0;i<list_numero[1].size();i++)
535     {
536     if (numero[1]==true)
537     renderer->RemoveActor(list_numero[1][i]);
538     else
539     renderer->AddActor(list_numero[1][i]);
540    
541     }
542     if (numero[1]==true) numero[1]=false; else numero[1]=true;
543     renderWindow->Render();
544     break;
545     }
546     case 55:
547     {
548     for (int i=0;i<list_numero[2].size();i++)
549     {
550     if (numero[2]==true)
551     renderer->RemoveActor(list_numero[2][i]);
552     else
553     renderer->AddActor(list_numero[2][i]);
554    
555     }
556     if (numero[2]==true) numero[2]=false; else numero[2]=true;
557     renderWindow->Render();
558     break;
559     }
560     case 118:
561     {
562     for (int i=0;i<list_vertice.size();i++)
563     {
564     if (vertice==true)
565     renderer->RemoveActor(list_vertice[i]);
566     else
567     renderer->AddActor(list_vertice[i]);
568    
569     }
570     if (vertice==true) vertice=false; else vertice=true;
571     renderWindow->Render();
572     break;
573     }
574     case 116:
575     {
576     for (int i=0;i<list_triangle.size();i++)
577     {
578     if (triangle==true)
579     renderer->RemoveActor(list_triangle[i]);
580     else
581     renderer->AddActor(list_triangle[i]);
582    
583     }
584     if (triangle==true) triangle=false; else triangle=true;
585     for (int i=0;i<list_quad.size();i++)
586     {
587     if (quad==true)
588     renderer->RemoveActor(list_quad[i]);
589     else
590     renderer->AddActor(list_quad[i]);
591    
592     }
593     if (quad==true) quad=false; else quad=true;
594     renderWindow->Render();
595     break;
596     }
597     case 108:
598     {
599     for (int i=0;i<list_line.size();i++)
600     {
601     if (line==true)
602     renderer->RemoveActor(list_line[i]);
603     else
604     renderer->AddActor(list_line[i]);
605    
606     }
607     if (line==true) line=false; else line=true;
608     renderWindow->Render();
609     break;
610     }
611     case 106:
612     {
613     double pos[3],focal[3],view[3];
614     vtkCamera * cam = renderer->GetActiveCamera();
615     cam->GetPosition(pos);
616     cam->GetFocalPoint(focal);
617     cam->GetViewUp(view);
618     double scale=cam->GetParallelScale();
619     FILE* out=fopen(".vtkdisplay","wt");
620     if (out==NULL) break;
621     fprintf(out,"%lf %lf %lf\n",pos[0],pos[1],pos[2]);
622     fprintf(out,"%lf %lf %lf\n",focal[0],focal[1],focal[2]);
623     fprintf(out,"%lf %lf %lf\n",view[0],view[1],view[2]);
624     fprintf(out,"%lf\n",scale);
625     fclose(out);
626     break;
627     }
628     case 107:
629     {
630     double pos[3],focal[3],view[3],scale;
631     FILE* in=fopen(".vtkdisplay","rt");
632     if (in==NULL) break;
633     char mess[255];
634     if (fgets(mess,255,in)==NULL) break;
635     if (sscanf(mess,"%lf %lf %lf",pos,pos+1,pos+2)!=3) break;
636     if (fgets(mess,255,in)==NULL) break;
637     if (sscanf(mess,"%lf %lf %lf",focal,focal+1,focal+2)!=3) break;
638     if (fgets(mess,255,in)==NULL) break;
639     if (sscanf(mess,"%lf %lf %lf",view,view+1,view+2)!=3) break;
640     if (fgets(mess,255,in)==NULL) break;
641     if (sscanf(mess,"%lf",&scale)!=1) break;
642     fclose(in);
643     vtkCamera * cam = renderer->GetActiveCamera();
644     cam->SetPosition(pos);
645     cam->SetFocalPoint(focal);
646     cam->SetViewUp(view);
647     cam->SetParallelScale(scale);
648     renderWindow->Render();
649     break;
650    
651     }
652     }
653     }
654    
655     void vtkdisplay::saveCameraDefault()
656     {
657     vtkCamera * cam = renderer->GetActiveCamera();
658     cam->GetPosition(cameraDefPosition);
659     cam->GetFocalPoint(cameraDefFocalPoint);
660     cam->GetViewUp(cameraDefViewUp);
661     }
662     void vtkdisplay::resetCamera()
663     {
664     vtkCamera * cam = renderer->GetActiveCamera();
665     cam->SetPosition(cameraDefPosition);
666     cam->SetFocalPoint(cameraDefFocalPoint);
667     cam->SetViewUp(cameraDefViewUp);
668     }
669