Salome HOME
Initial version
[modules/gui.git] / src / VTKViewer / VTKViewer_Trihedron.cxx
1 #include "VTKViewer_Trihedron.h"
2 #include "VTKViewer_Actor.h"
3
4 // VTK Includes
5 #include <vtkMath.h>
6 #include <vtkMapper.h>
7 #include <vtkDataSet.h>
8 #include <vtkRenderer.h>
9 #include <vtkRenderWindow.h>
10 #include <vtkObjectFactory.h>
11
12 #include <vtkActor.h>
13 #include <vtkProperty.h>
14 #include <vtkLineSource.h>
15 #include <vtkConeSource.h>
16 #include <vtkPolyDataMapper.h>
17
18 #include "VTKViewer_VectorText.h"
19
20 vtkStandardNewMacro(VTKViewer_UnScaledActor);
21
22 //****************************************************************
23 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor() {}
24
25 //****************************************************************
26 void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer)
27 {
28   if(theRenderer){
29     float P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}};
30     theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]);
31     theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]);
32     float aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+
33                             (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+
34                             (P[1][2]-P[0][2])*(P[1][2]-P[0][2]));
35     int* aSize = theRenderer->GetRenderWindow()->GetSize();
36     float aWinDiag = sqrt(float(aSize[0]*aSize[0]+aSize[1]*aSize[1]));
37     vtkDataSet* aDataSet = GetMapper()->GetInput();
38     float aLength = aDataSet->GetLength();
39     float aPrecision = 1.0E-3;
40     float anOldScale = GetScale()[0];
41     float aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(float(aSize[0])/float(aSize[1]));
42     if(fabs(aScale - anOldScale)/aScale > aPrecision){
43       SetScale(aScale);
44     }
45   }
46   vtkFollower::Render(theRenderer);
47 }
48
49 //****************************************************************
50 void VTKViewer_UnScaledActor::SetSize(int theSize){
51   mySize = theSize;
52 }
53
54 vtkStandardNewMacro(VTKViewer_LineActor);
55
56 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
57 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor);
58
59 //****************************************************************
60 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer)
61 {
62   if(LabelActor && LabelActor->GetVisibility()){
63     LabelActor->Modified();
64     LabelActor->Render(theRenderer);
65   }
66   if(ArrowActor && ArrowActor->GetVisibility()){
67     ArrowActor->Modified();
68     ArrowActor->Render(theRenderer);
69   }
70   vtkFollower::Render(theRenderer);
71 }
72
73 //****************************************************************
74 VTKViewer_Axis::VTKViewer_Axis()
75 {
76   // Initialize the Line pipe-line representation
77   myLineSource = vtkLineSource::New();
78   myLineSource->SetPoint1(0.0,0.0,0.0);
79   
80   myMapper[0] = vtkPolyDataMapper::New();
81   myMapper[0]->SetInput(myLineSource->GetOutput());
82   
83   myLineActor = VTKViewer_LineActor::New();
84   myLineActor->SetMapper(myMapper[0]);
85   myLineActor->PickableOff();
86   
87   // Initialize the Arrow pipe-line representation
88   myConeSource =  vtkConeSource::New();
89   myConeSource->SetResolution(2);
90   myConeSource->SetAngle(10);
91   
92   myMapper[1] = vtkPolyDataMapper::New();
93   myMapper[1]->SetInput(myConeSource->GetOutput());
94   
95   myArrowActor = VTKViewer_UnScaledActor::New();
96   myArrowActor->SetMapper(myMapper[1]);
97   static int aArrowActorSize = 24;
98   myArrowActor->SetSize(aArrowActorSize);
99   myArrowActor->PickableOff();
100   
101   myLineActor->SetArrowActor(myArrowActor);
102   
103   // Initialize the Label pipe-line representation
104   myVectorText = VTKViewer_VectorText::New();
105   
106   myMapper[2] = vtkPolyDataMapper::New();
107   myMapper[2]->SetInput(myVectorText->GetOutput());
108   
109   myLabelActor = VTKViewer_UnScaledActor::New();
110   myLabelActor->SetMapper(myMapper[2]);
111   static int aLabelActorSize = 12;
112   myLabelActor->SetSize(aLabelActorSize);
113   myLabelActor->PickableOff();
114   //myLabelActor->DebugOn();
115   
116   myLineActor->SetLabelActor(myLabelActor);
117   
118   // Initialise visibility param.
119   myVisibility = VTKViewer_Trihedron::eOn;
120 }
121
122 //****************************************************************
123 VTKViewer_Axis::~VTKViewer_Axis()
124 {
125   // Destroy of the Label pipe-line representation
126   myLabelActor->Delete();
127   
128   myMapper[2]->RemoveAllInputs();
129   myMapper[2]->Delete();
130   
131   myVectorText->Delete();
132   
133   // Destroy of the Arrow pipe-line representation
134   myArrowActor->Delete();
135   
136   myMapper[1]->RemoveAllInputs();
137   myMapper[1]->Delete();
138   
139   myConeSource->Delete();
140   
141   // Destroy of the Arrow pipe-line representation
142   myLineActor->Delete();
143   
144   myMapper[2]->RemoveAllInputs();
145   myMapper[2]->Delete();
146   
147   myLineSource->Delete();
148 }
149
150 //****************************************************************
151 void VTKViewer_Axis::AddToRender(vtkRenderer* theRenderer){
152   //Order of the calls are important
153   theRenderer->AddActor(myLineActor);
154   theRenderer->AddActor(myLabelActor);
155   theRenderer->AddActor(myArrowActor);
156 }
157
158 //****************************************************************
159 void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis)
160 {
161   switch(theVis){
162   case VTKViewer_Trihedron::eOff:
163   case VTKViewer_Trihedron::eOn:
164     myLabelActor->SetVisibility(theVis);
165     myArrowActor->SetVisibility(theVis);
166     myLineActor->SetVisibility(theVis);
167     break;
168   case VTKViewer_Trihedron::eOnlyLineOn:
169     myLabelActor->VisibilityOff();
170     myArrowActor->VisibilityOff();
171     myLineActor->VisibilityOn();
172     break;
173   default:
174     return;
175   }
176   myVisibility = theVis;
177 }
178
179 //****************************************************************
180 void VTKViewer_Axis::SetCamera(vtkCamera* theCamera){
181   myLabelActor->SetCamera(theCamera);
182 }
183
184 //****************************************************************  
185 void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){
186   myLabelActor->SetProperty(theProperty);
187   myArrowActor->SetProperty(theProperty);
188   myLineActor->SetProperty(theProperty);
189 }
190
191 //****************************************************************
192 void VTKViewer_Axis::SetSize(float theSize)
193 {
194   float aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
195   myLineSource->SetPoint2(aPosition);
196   
197   myArrowActor->SetPosition(0.0,0.0,0.0);
198   myArrowActor->AddPosition(aPosition);
199   myArrowActor->SetOrientation(myRot);
200   
201   myLabelActor->SetPosition(0.0,0.0,0.0);
202   myLabelActor->AddPosition(aPosition);
203 }
204
205 //****************************************************************
206 class VTKViewer_XAxis : public VTKViewer_Axis
207 {
208 protected:
209   VTKViewer_XAxis();
210   VTKViewer_XAxis(const VTKViewer_XAxis&);
211 public:
212   vtkTypeMacro(VTKViewer_XAxis,VTKViewer_Axis);
213   static VTKViewer_XAxis *New();
214 };
215
216 vtkStandardNewMacro(VTKViewer_XAxis);
217
218 VTKViewer_XAxis::VTKViewer_XAxis(){ 
219   myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0;
220   myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0;
221   myVectorText->SetText("X");
222   vtkProperty* aProperty = vtkProperty::New();
223   aProperty->SetColor(1.0,0.0,0.0);
224   SetProperty(aProperty);
225   aProperty->Delete();
226 }
227
228 //==============================================================================
229 class VTKViewer_YAxis : public VTKViewer_Axis{
230 protected:
231   VTKViewer_YAxis();
232   VTKViewer_YAxis(const VTKViewer_YAxis&);
233 public:
234   vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
235   static VTKViewer_YAxis *New();
236 };
237
238 vtkStandardNewMacro(VTKViewer_YAxis);
239
240 //****************************************************************
241 VTKViewer_YAxis::VTKViewer_YAxis()
242
243   myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0;
244   myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.;
245   myVectorText->SetText("Y");
246   vtkProperty* aProperty = vtkProperty::New();
247   aProperty->SetColor(0.0,1.0,0.0);
248   SetProperty(aProperty);
249   aProperty->Delete();
250 }
251
252 //****************************************************************
253 class VTKViewer_ZAxis : public VTKViewer_Axis
254 {
255 protected:
256   VTKViewer_ZAxis();
257   VTKViewer_ZAxis(const VTKViewer_ZAxis&);
258 public:
259   vtkTypeMacro(VTKViewer_ZAxis,VTKViewer_Axis);
260   static VTKViewer_ZAxis *New();
261 };
262
263 vtkStandardNewMacro(VTKViewer_ZAxis);
264
265 //****************************************************************
266 VTKViewer_ZAxis::VTKViewer_ZAxis()
267 {
268   myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0;
269   myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0;
270   myVectorText->SetText("Z");
271   vtkProperty* aProperty = vtkProperty::New();
272   aProperty->SetColor(0.0,0.0,1.0);
273   SetProperty(aProperty);
274   aProperty->Delete();
275 }
276
277 vtkStandardNewMacro(VTKViewer_Trihedron);
278
279 //****************************************************************
280 VTKViewer_Trihedron::VTKViewer_Trihedron()
281 {
282   myPresent = vtkActorCollection::New();
283   myAxis[0] = VTKViewer_XAxis::New();
284   myAxis[1] = VTKViewer_YAxis::New();
285   myAxis[2] = VTKViewer_ZAxis::New();
286   static float aSize = 100;
287   SetSize(aSize);
288 }
289
290 //****************************************************************
291 VTKViewer_Trihedron::~VTKViewer_Trihedron()
292 {
293   myPresent->RemoveAllItems();
294   myPresent->Delete();
295   for(int i = 0; i < 3; i++)
296     myAxis[i]->Delete();
297 }
298
299 //****************************************************************
300 void VTKViewer_Trihedron::SetSize(float theSize)
301 {
302   mySize = theSize;
303   for(int i = 0; i < 3; i++)
304     myAxis[i]->SetSize(theSize);
305 }
306
307 //****************************************************************
308 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis)
309 {
310   for(int i = 0; i < 3; i++)
311     myAxis[i]->SetVisibility(theVis);
312 }
313
314 //****************************************************************
315 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility()
316 {
317   return myAxis[0]->GetVisibility();
318 }
319
320 //****************************************************************
321 void VTKViewer_Trihedron::AddToRender(vtkRenderer* theRenderer)
322 {
323   vtkCamera* aCamera = theRenderer->GetActiveCamera();
324   for(int i = 0; i < 3; i++){
325     myAxis[i]->AddToRender(theRenderer);
326     myAxis[i]->SetCamera(aCamera);
327   }
328 }
329
330 //****************************************************************
331 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer)
332 {
333   myPresent->InitTraversal();
334   while(vtkActor* anActor = myPresent->GetNextActor())
335     theRenderer->RemoveActor(anActor);
336 }
337
338 //****************************************************************
339 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
340 {
341   //TVisibility aVis = GetVisibility();
342   //SetVisibility(eOff);
343   vtkActorCollection* aCollection = theRenderer->GetActors();
344   aCollection->InitTraversal();
345   int aCount = 0;
346   while(vtkActor* prop = aCollection->GetNextActor()) {
347     if( prop->GetVisibility())
348       if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop))
349         if(!anActor->IsInfinitive()) 
350           aCount++;
351         //int aCount = theRenderer->VisibleActorCount();
352         //SetVisibility(aVis);
353   }
354   return aCount;
355 }