ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/vtkdisplay/src/vtkdisplay.cc
Revision: 1156
Committed: Thu Jun 13 22:02:48 2024 UTC (14 months ago) by francois
File size: 24963 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

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 francois 1156 #include "vtkdisplay.hxx"
9     #include "keyboardCallback.hxx"
10     #include "mousewheelforwardCallback.hxx"
11     #include "mousewheelbackwardCallback.hxx"
12 francois 1061
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 francois 1116 renderWindow->SetSize(800, 600);
93 francois 1156 //renderWindow->SetAAFrames(4); // soft antialiasing
94 francois 1061 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 francois 1116
101    
102    
103 francois 1061 }
104    
105     void vtkdisplay::display()
106     {
107     /* if (ncb)
108     {
109     ncb->draw();
110     init_data(*(ncb->get_data()));
111     }*/
112     renderer->ResetCamera();
113 francois 1116 renderer->GetActiveCamera()->ParallelProjectionOn();
114 francois 1061 renderWindow->Render();
115     keyboardCallback *keybcall = keyboardCallback::New(this);
116     renderWindowInteractor->AddObserver(vtkCommand::KeyPressEvent, keybcall);
117     mousewheelforwardCallback *mousewheelforwardcall=mousewheelforwardCallback::New(this);
118     renderWindowInteractor->AddObserver(vtkCommand::MouseWheelForwardEvent, mousewheelforwardcall);
119     mousewheelbackwardCallback *mousewheelbackwardcall=mousewheelbackwardCallback::New(this);
120     renderWindowInteractor->AddObserver(vtkCommand::MouseWheelBackwardEvent, mousewheelbackwardcall);
121    
122     saveCameraDefault();
123     scaleactif=renderer->GetActiveCamera()->GetParallelScale();
124 francois 1116 double *ptr = renderer->GetActiveCamera()->GetClippingRange();
125     plan1=ptr[0];
126     plan2=ptr[1];
127 francois 1061 renderWindowInteractor->Start();
128     }
129    
130     void vtkdisplay::init_data_vertices(const data_container & data)
131     {
132     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
133    
134     for (int blk=0;blk<data.getnumproppoints();++blk)
135     {
136     color c=data.getcolorpoints(blk);
137     int last=(blk+1<data.getnumproppoints()) ? data.getindexpoints(blk+1) : data.nb_points();
138     // std::cout << blk << " " << data.getindexpoints(blk) << " " << last << std::endl ;
139     vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
140     for (int i=data.getindexpoints(blk);i!=last;++i)
141     {
142     points->InsertNextPoint(data.get_point(i).pts.array());
143     vtkSmartPointer<vtkVertex> vertex = vtkSmartPointer<vtkVertex>::New();
144     vertex->GetPointIds()->InsertId(0,i);
145     vertices->InsertNextCell(vertex);
146     }
147     //Create a polydata to store everything in
148     vtkSmartPointer<vtkPolyData> verticesPolyData = vtkSmartPointer<vtkPolyData>::New();
149     //add the points to the dataset
150     verticesPolyData->SetPoints(points);
151     //add the lines to the dataset
152     verticesPolyData->SetVerts(vertices);
153     //setup actor and mapper
154     vtkSmartPointer<vtkPolyDataMapper> mapper_vertices = vtkSmartPointer<vtkPolyDataMapper>::New();
155     #if (VTK_MAJOR_VERSION>=6)
156     mapper_vertices->SetInputData(verticesPolyData);
157     #else
158     mapper_vertices->SetInput(verticesPolyData);
159     #endif
160     vtkSmartPointer<vtkActor> actor_vertices = vtkSmartPointer<vtkActor>::New();
161     double r=data.getcolorpoints(blk).R/255.;
162     double g=data.getcolorpoints(blk).G/255.;
163     double b=data.getcolorpoints(blk).B/255.;
164     actor_vertices->GetProperty()->SetColor(r,g,b);
165     actor_vertices->GetProperty()->SetOpacity(data.getcolorpoints(blk).A/255.);
166     actor_vertices->GetProperty()->SetPointSize(data.getproppoints(blk).pointsize);
167     actor_vertices->SetMapper(mapper_vertices);
168     renderer->AddActor(actor_vertices);
169     list_vertice.push_back(actor_vertices);
170     }
171    
172    
173    
174     }
175     void vtkdisplay::init_data_texts(const data_container & data)
176     {
177     if (data.nb_texts(0)+data.nb_texts(1)+data.nb_texts(2)==0) return;
178     double xmin=1e308,ymin=1e308,zmin=1e308;
179     double xmax=-1e308,ymax=-1e308,zmax=-1e308;
180     for (int dim=0;dim<3;dim++)
181     {
182     int nb=data.nb_texts(dim);
183     for (int i=0;i<nb;i++)
184     {
185     if (data.get_text(dim,i).pts.x()<xmin) xmin=data.get_text(dim,i).pts.x();
186     if (data.get_text(dim,i).pts.y()<ymin) ymin=data.get_text(dim,i).pts.y();
187     if (data.get_text(dim,i).pts.z()<zmin) zmin=data.get_text(dim,i).pts.z();
188     if (data.get_text(dim,i).pts.x()>xmax) xmax=data.get_text(dim,i).pts.x();
189     if (data.get_text(dim,i).pts.y()>ymax) ymax=data.get_text(dim,i).pts.y();
190     if (data.get_text(dim,i).pts.z()>zmax) zmax=data.get_text(dim,i).pts.z();
191     }
192     }
193     int nb2=data.nb_points();
194     for (int i=0;i<nb2;i++)
195     {
196     if (data.get_point(i).pts.x()<xmin) xmin=data.get_point(i).pts.x();
197     if (data.get_point(i).pts.y()<xmin) ymin=data.get_point(i).pts.y();
198     if (data.get_point(i).pts.z()<xmin) zmin=data.get_point(i).pts.z();
199     if (data.get_point(i).pts.x()>xmax) xmax=data.get_point(i).pts.x();
200     if (data.get_point(i).pts.y()>ymax) ymax=data.get_point(i).pts.y();
201     if (data.get_point(i).pts.z()>zmax) zmax=data.get_point(i).pts.z();
202     }
203     int nb3=data.nb_lines();
204     for (int i=0;i<nb3;i++)
205     {
206     for (int dim=0;dim<2;dim++)
207     {
208     if (data.get_line(i).pts[dim].x()<xmin) xmin=data.get_line(i).pts[dim].x();
209     if (data.get_line(i).pts[dim].y()<ymin) ymin=data.get_line(i).pts[dim].y();
210     if (data.get_line(i).pts[dim].z()<zmin) zmin=data.get_line(i).pts[dim].z();
211     if (data.get_line(i).pts[dim].x()>xmax) xmax=data.get_line(i).pts[dim].x();
212     if (data.get_line(i).pts[dim].y()>ymax) ymax=data.get_line(i).pts[dim].y();
213     if (data.get_line(i).pts[dim].z()>zmax) zmax=data.get_line(i).pts[dim].z();
214     }
215     }
216     int nb4=data.nb_triangles();
217     for (int i=0;i<nb4;i++)
218     {
219     for (int dim=0;dim<3;dim++)
220     {
221     if (data.get_triangle(i).pts[dim].x()<xmin) xmin=data.get_triangle(i).pts[dim].x();
222     if (data.get_triangle(i).pts[dim].y()<ymin) ymin=data.get_triangle(i).pts[dim].y();
223     if (data.get_triangle(i).pts[dim].z()<zmin) zmin=data.get_triangle(i).pts[dim].z();
224     if (data.get_triangle(i).pts[dim].x()>xmax) xmax=data.get_triangle(i).pts[dim].x();
225     if (data.get_triangle(i).pts[dim].y()>ymax) ymax=data.get_triangle(i).pts[dim].y();
226     if (data.get_triangle(i).pts[dim].z()>zmax) zmax=data.get_triangle(i).pts[dim].z();
227     }
228     }
229     int nb5=data.nb_quads();
230     for (int i=0;i<nb5;i++)
231     {
232     for (int dim=0;dim<4;dim++)
233     {
234     if (data.get_quad(i).pts[dim].x()<xmin) xmin=data.get_quad(i).pts[dim].x();
235     if (data.get_quad(i).pts[dim].y()<ymin) ymin=data.get_quad(i).pts[dim].y();
236     if (data.get_quad(i).pts[dim].z()<zmin) zmin=data.get_quad(i).pts[dim].z();
237     if (data.get_quad(i).pts[dim].x()>xmax) xmax=data.get_quad(i).pts[dim].x();
238     if (data.get_quad(i).pts[dim].y()>ymax) ymax=data.get_quad(i).pts[dim].y();
239     if (data.get_quad(i).pts[dim].z()>zmax) zmax=data.get_quad(i).pts[dim].z();
240     }
241     }
242     double xec=xmax-xmin;
243     double yec=ymax-ymin;
244     double zec=zmax-zmin;
245     double scale=xec;
246    
247     if (yec>scale) scale=yec;
248     if (zec>scale) scale=zec;
249    
250     for (int dim=0;dim<3;dim++)
251     {
252     int nb=data.nb_texts(dim);
253     for (int i=0;i<nb;i++)
254     {
255     vtkSmartPointer<vtkVectorText> textSource =
256     vtkSmartPointer<vtkVectorText>::New();
257     textSource->SetText( data.get_text(dim,i).info.c_str() );
258    
259    
260     // Create a mapper
261     vtkSmartPointer<vtkPolyDataMapper> mapper =
262     vtkSmartPointer<vtkPolyDataMapper>::New();
263     mapper->SetInputConnection( textSource->GetOutputPort() );
264    
265    
266    
267     // Create a subclass of vtkActor: a vtkFollower that remains facing the camera
268     vtkSmartPointer<vtkFollower> follower =
269     vtkSmartPointer<vtkFollower>::New();
270     follower->SetMapper( mapper );
271     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
272     follower->SetPosition(data.get_text(dim,i).pts.x(),data.get_text(dim,i).pts.y(),data.get_text(dim,i).pts.z()); // red
273     follower->SetScale(0.008333333*3.*scale); // red
274     renderer->AddActor( follower );
275     follower->SetCamera( renderer->GetActiveCamera() );
276     list_numero[dim].push_back(follower);
277     }
278     }
279     }
280    
281     void vtkdisplay::init_data_lines(const data_container & data)
282     {
283     vtkSmartPointer<vtkPoints> linespoints = vtkSmartPointer<vtkPoints>::New();
284     for (int blk=0;blk<data.getnumproplines();++blk)
285     {
286     color c=data.getcolorlines(blk);
287     int last=(blk+1<data.getnumproplines()) ? data.getindexlines(blk+1) : data.nb_lines();
288     // std::cout << blk << " " << data.getindexlines(blk) << " " << last << std::endl ;
289     vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
290     for (int i=data.getindexlines(blk);i!=last;++i)
291     {
292     linespoints->InsertNextPoint(data.get_line(i).pts[0].array());
293     linespoints->InsertNextPoint(data.get_line(i).pts[1].array());
294     vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
295     line->GetPointIds()->InsertId(0,i*2);
296     line->GetPointIds()->InsertId(1,i*2+1);
297     lines->InsertNextCell(line);
298     }
299     //Create a polydata to store everything in
300     vtkSmartPointer<vtkPolyData> linesPolyData = vtkSmartPointer<vtkPolyData>::New();
301     //add the points to the dataset
302     linesPolyData->SetPoints(linespoints);
303     //add the lines to the dataset
304     linesPolyData->SetLines(lines);
305     //setup actor and mapper
306     vtkSmartPointer<vtkPolyDataMapper> mapper_lines = vtkSmartPointer<vtkPolyDataMapper>::New();
307     #if (VTK_MAJOR_VERSION>=6)
308     mapper_lines->SetInputData(linesPolyData);
309     #else
310     mapper_lines->SetInput(linesPolyData);
311     #endif
312     vtkSmartPointer<vtkActor> actor_lines = vtkSmartPointer<vtkActor>::New();
313     double r=data.getcolorlines(blk).R/255.;
314     double g=data.getcolorlines(blk).G/255.;
315     double b=data.getcolorlines(blk).B/255.;
316     double a=data.getcolorlines(blk).A/255.;
317     actor_lines->GetProperty()->SetColor(r,g,b);
318     actor_lines->GetProperty()->SetOpacity(a);
319     actor_lines->GetProperty()->SetLineWidth(data.getproplines(blk).thickness);
320     actor_lines->SetMapper(mapper_lines);
321     renderer->AddActor(actor_lines);
322     list_line.push_back(actor_lines);
323     // renderer->ResetCamera();
324     }
325     }
326    
327     void vtkdisplay::init_data_triangles(const data_container & data)
328     {
329     vtkSmartPointer<vtkPoints> trianglespoints = vtkSmartPointer<vtkPoints>::New();
330     for (int blk=0;blk<data.getnumproptriangles();++blk)
331     {
332     color c=data.getcolortriangles(blk);
333     int last=(blk+1<data.getnumproptriangles()) ? data.getindextriangles(blk+1) : data.nb_triangles();
334     // std::cout << blk << " " << data.getindextriangles(blk) << " " << last << std::endl ;
335     vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
336     for (int i=data.getindextriangles(blk);i!=last;++i)
337     {
338     trianglespoints->InsertNextPoint(data.get_triangle(i).pts[0].array());
339     trianglespoints->InsertNextPoint(data.get_triangle(i).pts[1].array());
340     trianglespoints->InsertNextPoint(data.get_triangle(i).pts[2].array());
341     vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
342     triangle->GetPointIds()->InsertId(0,i*3);
343     triangle->GetPointIds()->InsertId(1,i*3+1);
344     triangle->GetPointIds()->InsertId(2,i*3+2);
345     triangles->InsertNextCell(triangle);
346     }
347     //Create a polydata to store everything in
348     vtkSmartPointer<vtkPolyData> trianglesPolyData = vtkSmartPointer<vtkPolyData>::New();
349     //add the points to the dataset
350     trianglesPolyData->SetPoints(trianglespoints);
351     //add the triangles to the dataset
352     trianglesPolyData->SetPolys(triangles);
353     //setup actor and mapper
354     vtkSmartPointer<vtkPolyDataMapper> mapper_triangles = vtkSmartPointer<vtkPolyDataMapper>::New();
355     vtkSmartPointer<vtkActor> actor_triangles = vtkSmartPointer<vtkActor>::New();
356     double r=data.getcolortriangles(blk).R/255.;
357     double g=data.getcolortriangles(blk).G/255.;
358     double b=data.getcolortriangles(blk).B/255.;
359     double a=data.getcolortriangles(blk).A/255.;
360     actor_triangles->GetProperty()->SetColor(r,g,b);
361     actor_triangles->GetProperty()->SetOpacity(a);
362     #if (VTK_MAJOR_VERSION>=6)
363     mapper_triangles->SetInputData(trianglesPolyData);
364     #else
365     mapper_triangles->SetInput(trianglesPolyData);
366     #endif
367    
368     actor_triangles->SetMapper(mapper_triangles);
369     if (data.getproptriangles(blk).edgeon)
370     {
371     actor_triangles->GetProperty()->EdgeVisibilityOn();
372     actor_triangles->GetProperty()->SetEdgeColor(data.getproptriangles(blk).edgecolor.R/255.,data.getproptriangles(blk).edgecolor.G/255.,data.getproptriangles(blk).edgecolor.B/255.);
373     actor_triangles->GetProperty()->SetLineWidth(data.getproptriangles(blk).edgethickness);
374     }
375     renderer->AddActor(actor_triangles);
376     list_triangle.push_back(actor_triangles);
377     }
378     }
379    
380     void vtkdisplay::init_data_quads(const data_container & data)
381     {
382     vtkSmartPointer<vtkPoints> quadspoints = vtkSmartPointer<vtkPoints>::New();
383     for (int blk=0;blk<data.getnumpropquads();++blk)
384     {
385     color c=data.getcolorquads(blk);
386     int last=(blk+1<data.getnumpropquads()) ? data.getindexquads(blk+1) : data.nb_quads();
387     // std::cout << blk << " " << data.getindexquads(blk) << " " << last << std::endl ;
388     vtkSmartPointer<vtkCellArray> quads = vtkSmartPointer<vtkCellArray>::New();
389     for (int i=data.getindexquads(blk);i!=last;++i)
390     {
391     quadspoints->InsertNextPoint(data.get_quad(i).pts[0].array());
392     quadspoints->InsertNextPoint(data.get_quad(i).pts[1].array());
393     quadspoints->InsertNextPoint(data.get_quad(i).pts[2].array());
394     quadspoints->InsertNextPoint(data.get_quad(i).pts[3].array());
395     vtkSmartPointer<vtkQuad> quad = vtkSmartPointer<vtkQuad>::New();
396     quad->GetPointIds()->InsertId(0,i*4);
397     quad->GetPointIds()->InsertId(1,i*4+1);
398     quad->GetPointIds()->InsertId(2,i*4+2);
399     quad->GetPointIds()->InsertId(3,i*4+3);
400     quads->InsertNextCell(quad);
401     }
402     //Create a polydata to store everything in
403     vtkSmartPointer<vtkPolyData> quadsPolyData = vtkSmartPointer<vtkPolyData>::New();
404     //add the points to the dataset
405     quadsPolyData->SetPoints(quadspoints);
406     //add the quads to the dataset
407     quadsPolyData->SetPolys(quads);
408     //setup actor and mapper
409     vtkSmartPointer<vtkPolyDataMapper> mapper_quads = vtkSmartPointer<vtkPolyDataMapper>::New();
410     vtkSmartPointer<vtkActor> actor_quads = vtkSmartPointer<vtkActor>::New();
411     double r=data.getcolorquads(blk).R/255.;
412     double g=data.getcolorquads(blk).G/255.;
413     double b=data.getcolorquads(blk).B/255.;
414     double a=data.getcolorquads(blk).A/255.;
415     actor_quads->GetProperty()->SetColor(r,g,b);
416     actor_quads->GetProperty()->SetOpacity(a);
417    
418     #if (VTK_MAJOR_VERSION>=6)
419     mapper_quads->SetInputData(quadsPolyData);
420     #else
421     mapper_quads->SetInput(quadsPolyData);
422     #endif
423     actor_quads->SetMapper(mapper_quads);
424     if (data.getpropquads(blk).edgeon)
425     {
426     actor_quads->GetProperty()->EdgeVisibilityOn();
427     actor_quads->GetProperty()->SetEdgeColor(data.getpropquads(blk).edgecolor.R/255.,data.getpropquads(blk).edgecolor.G/255.,data.getpropquads(blk).edgecolor.B/255.);
428     actor_quads->GetProperty()->SetLineWidth(data.getpropquads(blk).edgethickness);
429     }
430    
431     renderer->AddActor(actor_quads);
432     list_quad.push_back(actor_quads);
433     }
434     }
435    
436     void vtkdisplay::init_data(const data_container & data)
437     {
438     init_data_vertices(data);
439     init_data_lines(data);
440     init_data_triangles(data);
441     init_data_quads(data);
442     init_data_texts(data);
443     }
444    
445     void vtkdisplay::init_data(const std::vector<data_container> &data)
446     {
447     for (int i=0;i<data.size();++i)
448     init_data(data[i]);
449     }
450    
451    
452    
453     void vtkdisplay::mousewheelforwardCall(int x,int y)
454     {
455     double scale=renderer->GetActiveCamera()->GetParallelScale();
456     double facteur=scaleactif/scale;
457     scaleactif=scale;
458     for (int dim=0;dim<3;dim++)
459     {
460     for (int i=0;i<list_numero[dim].size();i++)
461     {
462     double *scaleactor=list_numero[dim][i]->GetScale();
463     list_numero[dim][i]->SetScale(*scaleactor/facteur);
464     }
465    
466     }
467     renderWindow->Render();
468     }
469    
470     void vtkdisplay::mousewheelbackwardCall(int x,int y)
471     {
472     double scale=renderer->GetActiveCamera()->GetParallelScale();
473     double facteur=scaleactif/scale;
474     scaleactif=scale;
475     for (int dim=0;dim<3;dim++)
476     {
477     for (int i=0;i<list_numero[dim].size();i++)
478     {
479     double *scaleactor=list_numero[dim][i]->GetScale();
480     list_numero[dim][i]->SetScale(*scaleactor/facteur);
481     }
482    
483     }
484     renderWindow->Render();
485     }
486    
487    
488     void vtkdisplay::kbCallback(int key)
489     {
490 francois 1116 //std::cout << key << std::endl;
491 francois 1061 switch (key)
492     {
493 francois 1116 case 53:
494     {
495    
496     vtkCamera * cam = renderer->GetActiveCamera();
497     cam->SetClippingRange( plan1, plan2 );
498     renderWindow->Render();
499    
500     break;
501     }
502     case 56:
503     {
504     interactorObserver->AutoAdjustCameraClippingRangeOff();
505     vtkCamera * cam = renderer->GetActiveCamera();
506     double *ptr = cam->GetClippingRange();
507     double v1 = ptr[0]*1.1 - ptr[1]*0.1;
508     double v2 = ptr[1];
509     cam->SetClippingRange( v1, v2 );
510     renderWindow->Render();
511    
512     break;
513     }
514     case 57:
515     {
516     interactorObserver->AutoAdjustCameraClippingRangeOff();
517     vtkCamera * cam = renderer->GetActiveCamera();
518     double *ptr = cam->GetClippingRange();
519     double v1 = ptr[0]*0.9 + ptr[1]*0.1;
520     double v2 = ptr[1];
521     cam->SetClippingRange( v1, v2 );
522     renderWindow->Render();
523    
524     break;
525     }
526 francois 1061 case 114: //r
527     {
528     resetCamera();
529     break;
530     }
531     case 43:
532     {
533     for (int dim=0;dim<3;dim++)
534     {
535     for (int i=0;i<list_numero[dim].size();i++)
536     {
537     double *scaleactor=list_numero[dim][i]->GetScale();
538     list_numero[dim][i]->SetScale(*scaleactor*1.1);
539     }
540    
541     }
542     renderWindow->Render();break;
543     }
544     case 45:
545     {
546     for (int dim=0;dim<3;dim++)
547     {
548     for (int i=0;i<list_numero[dim].size();i++)
549     {
550     double *scaleactor=list_numero[dim][i]->GetScale();
551     list_numero[dim][i]->SetScale(*scaleactor/1.1);
552     }
553    
554     }
555     renderWindow->Render();break;
556     }
557     case 49:
558     {
559     for (int i=0;i<list_numero[0].size();i++)
560     {
561     if (numero[0]==true)
562     renderer->RemoveActor(list_numero[0][i]);
563     else
564     renderer->AddActor(list_numero[0][i]);
565    
566     }
567     if (numero[0]==true) numero[0]=false; else numero[0]=true;
568     renderWindow->Render();
569     break;
570     }
571     case 52:
572     {
573     for (int i=0;i<list_numero[1].size();i++)
574     {
575     if (numero[1]==true)
576     renderer->RemoveActor(list_numero[1][i]);
577     else
578     renderer->AddActor(list_numero[1][i]);
579    
580     }
581     if (numero[1]==true) numero[1]=false; else numero[1]=true;
582     renderWindow->Render();
583     break;
584     }
585     case 55:
586     {
587     for (int i=0;i<list_numero[2].size();i++)
588     {
589     if (numero[2]==true)
590     renderer->RemoveActor(list_numero[2][i]);
591     else
592     renderer->AddActor(list_numero[2][i]);
593    
594     }
595     if (numero[2]==true) numero[2]=false; else numero[2]=true;
596     renderWindow->Render();
597     break;
598     }
599     case 118:
600     {
601     for (int i=0;i<list_vertice.size();i++)
602     {
603     if (vertice==true)
604     renderer->RemoveActor(list_vertice[i]);
605     else
606     renderer->AddActor(list_vertice[i]);
607    
608     }
609     if (vertice==true) vertice=false; else vertice=true;
610     renderWindow->Render();
611     break;
612     }
613     case 116:
614     {
615     for (int i=0;i<list_triangle.size();i++)
616     {
617     if (triangle==true)
618     renderer->RemoveActor(list_triangle[i]);
619     else
620     renderer->AddActor(list_triangle[i]);
621    
622     }
623     if (triangle==true) triangle=false; else triangle=true;
624     for (int i=0;i<list_quad.size();i++)
625     {
626     if (quad==true)
627     renderer->RemoveActor(list_quad[i]);
628     else
629     renderer->AddActor(list_quad[i]);
630    
631     }
632     if (quad==true) quad=false; else quad=true;
633     renderWindow->Render();
634     break;
635     }
636     case 108:
637     {
638     for (int i=0;i<list_line.size();i++)
639     {
640     if (line==true)
641     renderer->RemoveActor(list_line[i]);
642     else
643     renderer->AddActor(list_line[i]);
644    
645     }
646     if (line==true) line=false; else line=true;
647     renderWindow->Render();
648     break;
649     }
650     case 106:
651     {
652     double pos[3],focal[3],view[3];
653     vtkCamera * cam = renderer->GetActiveCamera();
654     cam->GetPosition(pos);
655     cam->GetFocalPoint(focal);
656     cam->GetViewUp(view);
657     double scale=cam->GetParallelScale();
658     FILE* out=fopen(".vtkdisplay","wt");
659     if (out==NULL) break;
660     fprintf(out,"%lf %lf %lf\n",pos[0],pos[1],pos[2]);
661     fprintf(out,"%lf %lf %lf\n",focal[0],focal[1],focal[2]);
662     fprintf(out,"%lf %lf %lf\n",view[0],view[1],view[2]);
663     fprintf(out,"%lf\n",scale);
664     fclose(out);
665     break;
666     }
667     case 107:
668     {
669     double pos[3],focal[3],view[3],scale;
670     FILE* in=fopen(".vtkdisplay","rt");
671     if (in==NULL) break;
672     char mess[255];
673     if (fgets(mess,255,in)==NULL) break;
674     if (sscanf(mess,"%lf %lf %lf",pos,pos+1,pos+2)!=3) break;
675     if (fgets(mess,255,in)==NULL) break;
676     if (sscanf(mess,"%lf %lf %lf",focal,focal+1,focal+2)!=3) break;
677     if (fgets(mess,255,in)==NULL) break;
678     if (sscanf(mess,"%lf %lf %lf",view,view+1,view+2)!=3) break;
679     if (fgets(mess,255,in)==NULL) break;
680     if (sscanf(mess,"%lf",&scale)!=1) break;
681     fclose(in);
682     vtkCamera * cam = renderer->GetActiveCamera();
683     cam->SetPosition(pos);
684     cam->SetFocalPoint(focal);
685     cam->SetViewUp(view);
686     cam->SetParallelScale(scale);
687     renderWindow->Render();
688     break;
689    
690     }
691     }
692     }
693    
694     void vtkdisplay::saveCameraDefault()
695     {
696     vtkCamera * cam = renderer->GetActiveCamera();
697     cam->GetPosition(cameraDefPosition);
698     cam->GetFocalPoint(cameraDefFocalPoint);
699     cam->GetViewUp(cameraDefViewUp);
700     }
701     void vtkdisplay::resetCamera()
702     {
703     vtkCamera * cam = renderer->GetActiveCamera();
704     cam->SetPosition(cameraDefPosition);
705     cam->SetFocalPoint(cameraDefFocalPoint);
706     cam->SetViewUp(cameraDefViewUp);
707     }
708