3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : VTKViewer_Trihedron.cxx
25 // Author : Alexey PETROV
29 #include "VTKViewer_Trihedron.h"
30 #include "utilities.h"
31 #include "SALOME_Actor.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>
43 #include <vtkProperty.h>
44 #include <vtkLineSource.h>
45 #include <vtkConeSource.h>
46 #include <vtkPolyDataMapper.h>
48 #include "VTKViewer_VectorText.h"
52 //==============================================================================
54 vtkStandardNewMacro(VTKViewer_UnScaledActor);
56 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor(){}
58 void VTKViewer_UnScaledActor::Render(vtkRenderer *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){
77 vtkFollower::Render(theRenderer);
80 void VTKViewer_UnScaledActor::SetSize(int theSize){
84 //==============================================================================
86 vtkStandardNewMacro(VTKViewer_LineActor);
88 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
89 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor);
91 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer){
92 if(LabelActor && LabelActor->GetVisibility()){
93 LabelActor->Modified();
94 LabelActor->Render(theRenderer);
96 if(ArrowActor && ArrowActor->GetVisibility()){
97 ArrowActor->Modified();
98 ArrowActor->Render(theRenderer);
100 vtkFollower::Render(theRenderer);
103 //==============================================================================
104 // The base class for concreate Axis
105 // Its only duty is to give correct initialization and destruction
108 VTKViewer_Axis::VTKViewer_Axis(){
110 // Initialize the Line pipe-line representation
111 myLineSource = vtkLineSource::New();
112 myLineSource->SetPoint1( 0, 0, 0 );
114 myMapper[0] = vtkPolyDataMapper::New();
115 myMapper[0]->SetInput(myLineSource->GetOutput());
117 myLineActor = VTKViewer_LineActor::New();
118 myLineActor->SetMapper(myMapper[0]);
119 myLineActor->PickableOff();
121 // Initialize the Arrow pipe-line representation
122 myConeSource = vtkConeSource::New();
123 myConeSource->SetResolution(2);
124 myConeSource->SetAngle(10);
126 myMapper[1] = vtkPolyDataMapper::New();
127 myMapper[1]->SetInput(myConeSource->GetOutput());
129 myArrowActor = VTKViewer_UnScaledActor::New();
130 myArrowActor->SetMapper(myMapper[1]);
131 static int aArrowActorSize = 24;
132 myArrowActor->SetSize(aArrowActorSize);
133 myArrowActor->PickableOff();
135 myLineActor->SetArrowActor(myArrowActor);
137 // Initialize the Label pipe-line representation
138 myVectorText = VTKViewer_VectorText::New();
140 myMapper[2] = vtkPolyDataMapper::New();
141 myMapper[2]->SetInput(myVectorText->GetOutput());
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();
150 myLineActor->SetLabelActor(myLabelActor);
152 // Initialise visibility param.
153 myVisibility = VTKViewer_Trihedron::eOn;
156 VTKViewer_Axis::~VTKViewer_Axis(){
157 // Destroy of the Label pipe-line representation
158 myLabelActor->Delete();
160 myMapper[2]->RemoveAllInputs();
161 myMapper[2]->Delete();
163 myVectorText->Delete();
165 // Destroy of the Arrow pipe-line representation
166 myArrowActor->Delete();
168 myMapper[1]->RemoveAllInputs();
169 myMapper[1]->Delete();
171 myConeSource->Delete();
173 // Destroy of the Arrow pipe-line representation
174 myLineActor->Delete();
176 myMapper[0]->RemoveAllInputs();
177 myMapper[0]->Delete();
179 myLineSource->Delete();
182 void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis){
184 case VTKViewer_Trihedron::eOff:
185 case VTKViewer_Trihedron::eOn:
186 myLabelActor->SetVisibility(theVis);
187 myArrowActor->SetVisibility(theVis);
188 myLineActor->SetVisibility(theVis);
190 case VTKViewer_Trihedron::eOnlyLineOn:
191 myLabelActor->VisibilityOff();
192 myArrowActor->VisibilityOff();
193 myLineActor->VisibilityOn();
198 myVisibility = theVis;
201 void VTKViewer_Axis::SetSize(float theSize){
202 float aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
203 myLineSource->SetPoint2(aPosition);
205 myArrowActor->SetPosition(0.0,0.0,0.0);
206 myArrowActor->AddPosition(aPosition);
207 myArrowActor->SetOrientation(myRot);
209 myLabelActor->SetPosition(0.0,0.0,0.0);
210 myLabelActor->AddPosition(aPosition);
213 void VTKViewer_Axis::AddToRender( vtkRenderer* theRenderer )
215 //Order of the calls are important
216 theRenderer->AddActor( myLineActor );
217 theRenderer->AddActor( myLabelActor );
218 theRenderer->AddActor( myArrowActor );
221 void VTKViewer_Axis::SetCamera( vtkCamera* theCamera )
223 myLabelActor->SetCamera(theCamera);
226 void VTKViewer_Axis::SetProperty( vtkProperty* theProperty )
228 myLabelActor->SetProperty(theProperty);
229 myArrowActor->SetProperty(theProperty);
230 myLineActor->SetProperty(theProperty);
233 //==============================================================================
234 class VTKViewer_XAxis : public VTKViewer_Axis{
237 VTKViewer_XAxis(const VTKViewer_XAxis&);
239 vtkTypeMacro(VTKViewer_XAxis,VTKViewer_Axis);
240 static VTKViewer_XAxis *New();
243 vtkStandardNewMacro(VTKViewer_XAxis);
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);
255 //==============================================================================
256 class VTKViewer_YAxis : public VTKViewer_Axis{
259 VTKViewer_YAxis(const VTKViewer_YAxis&);
261 vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
262 static VTKViewer_YAxis *New();
265 vtkStandardNewMacro(VTKViewer_YAxis);
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);
277 //==============================================================================
278 class VTKViewer_ZAxis : public VTKViewer_Axis{
281 VTKViewer_ZAxis(const VTKViewer_ZAxis&);
283 vtkTypeMacro(VTKViewer_ZAxis,VTKViewer_Axis);
284 static VTKViewer_ZAxis *New();
287 vtkStandardNewMacro(VTKViewer_ZAxis);
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);
299 //==============================================================================
301 vtkStandardNewMacro(VTKViewer_Trihedron);
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;
312 VTKViewer_Trihedron::~VTKViewer_Trihedron(){
313 myPresent->RemoveAllItems();
315 for(int i = 0; i < 3; i++)
319 void VTKViewer_Trihedron::SetSize(float theSize){
321 for(int i = 0; i < 3; i++)
322 myAxis[i]->SetSize(theSize);
325 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis){
326 for(int i = 0; i < 3; i++)
327 myAxis[i]->SetVisibility(theVis);
330 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility(){
331 return myAxis[0]->GetVisibility();
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);
342 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer){
343 myPresent->InitTraversal();
344 while(vtkActor* anActor = myPresent->GetNextActor())
345 theRenderer->RemoveActor(anActor);
348 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer){
349 //TVisibility aVis = GetVisibility();
350 //SetVisibility(eOff);
351 vtkActorCollection* aCollection = theRenderer->GetActors();
352 aCollection->InitTraversal();
354 while(vtkActor* prop = aCollection->GetNextActor())
355 if( prop->GetVisibility())
356 if(SALOME_Actor* anActor = SALOME_Actor::SafeDownCast(prop))
357 if(!anActor->IsInfinitive())
359 //int aCount = theRenderer->VisibleActorCount();
360 //SetVisibility(aVis);