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