1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #include "VTKViewer_Trihedron.h"
23 #include "VTKViewer_Actor.h"
27 #include <vtkMapper.h>
28 #include <vtkDataSet.h>
29 #include <vtkRenderer.h>
30 #include <vtkRenderWindow.h>
31 #include <vtkObjectFactory.h>
34 #include <vtkProperty.h>
35 #include <vtkLineSource.h>
36 #include <vtkConeSource.h>
37 #include <vtkPolyDataMapper.h>
38 #include <vtkVectorText.h>
40 vtkStandardNewMacro(VTKViewer_UnScaledActor);
43 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor()
45 Bounds[0] = Bounds[2] = Bounds[4] = VTK_LARGE_FLOAT;
46 Bounds[1] = Bounds[3] = Bounds[5] = -VTK_LARGE_FLOAT;
53 VTKViewer_UnScaledActor
59 /*! Sets \a mySize= \a theSize variable.
60 * \param theSize - integer size
62 void VTKViewer_UnScaledActor::SetSize(int theSize)
67 /*!This causes the actor to be rendered.
68 * Set new scale for actor.
70 void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer)
73 vtkFloatingPointType P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}};
74 theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]);
75 theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]);
76 vtkFloatingPointType aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+
77 (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+
78 (P[1][2]-P[0][2])*(P[1][2]-P[0][2]));
79 int* aSize = theRenderer->GetRenderWindow()->GetSize();
80 vtkFloatingPointType aWinDiag = sqrt(vtkFloatingPointType(aSize[0]*aSize[0]+aSize[1]*aSize[1]));
81 vtkDataSet* aDataSet = GetMapper()->GetInput();
83 vtkFloatingPointType aLength = aDataSet->GetLength();
84 vtkFloatingPointType aPrecision = 1.0E-3;
85 vtkFloatingPointType anOldScale = GetScale()[0];
86 vtkFloatingPointType aScale;
87 if (aSize[1] > aSize[0])
88 aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(vtkFloatingPointType(aSize[0])/vtkFloatingPointType(aSize[1]));
90 aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(vtkFloatingPointType(aSize[1])/vtkFloatingPointType(aSize[0]));
91 if(aScale != 0.0&& fabs(aScale - anOldScale)/aScale > aPrecision){
95 vtkFollower::Render(theRenderer);
98 vtkStandardNewMacro(VTKViewer_LineActor);
100 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
101 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,vtkFollower);
103 /*!Adds Label and Arrow actors to \a theRenderer.*/
104 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer)
106 if(LabelActor && LabelActor->GetVisibility()){
107 LabelActor->Modified();
108 LabelActor->Render(theRenderer);
110 if(ArrowActor && ArrowActor->GetVisibility()){
111 ArrowActor->Modified();
112 ArrowActor->Render(theRenderer);
114 vtkFollower::Render(theRenderer);
120 VTKViewer_Axis::VTKViewer_Axis()
122 /*! \li Initialize the Line pipe-line representation*/
123 myLineSource = vtkLineSource::New();
124 myLineSource->SetPoint1(0.0,0.0,0.0);
126 myMapper[0] = vtkPolyDataMapper::New();
127 myMapper[0]->SetInput(myLineSource->GetOutput());
129 myLineActor = VTKViewer_LineActor::New();
130 myLineActor->SetMapper(myMapper[0]);
131 myLineActor->PickableOff();
133 /*! \li Initialize the Arrow pipe-line representation*/
134 myConeSource = vtkConeSource::New();
135 myConeSource->SetResolution(16);
136 myConeSource->SetAngle(10);
137 myConeSource->SetCenter(-0.5,0.0,0.0);
139 myMapper[1] = vtkPolyDataMapper::New();
140 myMapper[1]->SetInput(myConeSource->GetOutput());
142 myArrowActor = vtkFollower::New();
143 myArrowActor->SetMapper(myMapper[1]);
144 static int aArrowActorSize = 16;
145 myArrowActor->SetScale(aArrowActorSize);
146 myArrowActor->PickableOff();
148 myLineActor->SetArrowActor(myArrowActor);
150 /*! \li Initialize the Label pipe-line representation */
151 myVectorText = vtkVectorText::New();
153 myMapper[2] = vtkPolyDataMapper::New();
154 myMapper[2]->SetInput(myVectorText->GetOutput());
156 myLabelActor = VTKViewer_UnScaledActor::New();
157 myLabelActor->SetMapper(myMapper[2]);
158 static int aLabelActorSize = 12;
159 myLabelActor->SetSize(aLabelActorSize);
160 myLabelActor->PickableOff();
161 //myLabelActor->DebugOn();
163 myLineActor->SetLabelActor(myLabelActor);
165 /*! \li Initialise visibility param.*/
166 myVisibility = VTKViewer_Trihedron::eOn;
172 VTKViewer_Axis::~VTKViewer_Axis()
174 /*! \li Destroy of the Label pipe-line representation */
175 myLabelActor->Delete();
177 myMapper[0]->RemoveAllInputs();
178 myMapper[0]->Delete();
180 myVectorText->Delete();
182 /*! \li Destroy of the Arrow pipe-line representation */
183 myArrowActor->Delete();
185 myMapper[1]->RemoveAllInputs();
186 myMapper[1]->Delete();
188 myConeSource->Delete();
190 /*! \li Destroy of the Line pipe-line representation */
191 myLineActor->Delete();
193 myMapper[2]->RemoveAllInputs();
194 myMapper[2]->Delete();
196 myLineSource->Delete();
200 * \param theRenderer - vtkRenderer pointer
202 void VTKViewer_Axis::AddToRender(vtkRenderer* theRenderer){
203 /*! \li Order of the calls are important*/
204 theRenderer->AddActor(myLineActor);
205 theRenderer->AddActor(myLabelActor);
206 theRenderer->AddActor(myArrowActor);
209 /*! Remove actor of acis from \a theRenderer which are in myPresent.
210 * \param theRenderer - vtkRenderer pointer
212 void VTKViewer_Axis::RemoveFromRender(vtkRenderer* theRenderer){
213 /*! \li Order of the calls are important*/
214 theRenderer->RemoveActor(myLineActor);
215 theRenderer->RemoveActor(myLabelActor);
216 theRenderer->RemoveActor(myArrowActor);
219 /*! Sets visibility for all Axis to \a theVis*/
220 void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis)
223 case VTKViewer_Trihedron::eOff:
224 case VTKViewer_Trihedron::eOn:
225 myLabelActor->SetVisibility(theVis);
226 myArrowActor->SetVisibility(theVis);
227 myLineActor->SetVisibility(theVis);
229 case VTKViewer_Trihedron::eOnlyLineOn:
230 myLabelActor->VisibilityOff();
231 myArrowActor->VisibilityOff();
232 myLineActor->VisibilityOn();
237 myVisibility = theVis;
240 /*! Set camera for myLabelActor
242 void VTKViewer_Axis::SetCamera(vtkCamera* theCamera){
243 myLabelActor->SetCamera(theCamera);
246 /*! Sets \a theProperty for actors: myLineActor,myLabelActor,myArrowActor
248 void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){
249 myLabelActor->SetProperty(theProperty);
250 myArrowActor->SetProperty(theProperty);
251 myLineActor->SetProperty(theProperty);
254 /*! Set size of VTKViewer_Axis
256 void VTKViewer_Axis::SetSize(vtkFloatingPointType theSize)
258 vtkFloatingPointType aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
260 vtkFloatingPointType aCoef = 0.99;
261 vtkFloatingPointType aLinePosition[3] = {aPosition[0]*aCoef, aPosition[1]*aCoef, aPosition[2]*aCoef};
262 myLineSource->SetPoint2(aLinePosition);
264 myArrowActor->SetPosition(0.0,0.0,0.0);
265 myArrowActor->AddPosition(aPosition);
266 myArrowActor->SetOrientation(myRot);
267 myArrowActor->SetScale(theSize / 10.);
269 myLabelActor->SetPosition(0.0,0.0,0.0);
270 myLabelActor->AddPosition(aPosition);
273 /*! Check if actor belongs to the axis object
274 * \param theActor - vtkActor pointer
275 * \retval Return true if the actor belongs to the axis object
277 bool VTKViewer_Axis::OwnActor(const vtkActor* theActor)
279 return theActor == myLineActor ||
280 theActor == myArrowActor ||
281 theActor == myLabelActor;
284 /*! \class VTKViewer_XAxis
285 * \brief X Axis actor
287 class VTKViewer_XAxis : public VTKViewer_Axis
291 VTKViewer_XAxis(const VTKViewer_XAxis&);
293 vtkTypeMacro(VTKViewer_XAxis,VTKViewer_Axis);
294 static VTKViewer_XAxis *New();
297 vtkStandardNewMacro(VTKViewer_XAxis);
299 /*!Initialize X Axis*/
300 VTKViewer_XAxis::VTKViewer_XAxis(){
301 myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0;
302 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0;
303 myVectorText->SetText("X");
304 vtkProperty* aProperty = vtkProperty::New();
305 aProperty->SetColor(1.0,0.0,0.0);
306 SetProperty(aProperty);
310 /*! \class VTKViewer_YAxis
311 * \brief Y Axis actor
313 class VTKViewer_YAxis : public VTKViewer_Axis{
316 VTKViewer_YAxis(const VTKViewer_YAxis&);
318 vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
319 static VTKViewer_YAxis *New();
322 vtkStandardNewMacro(VTKViewer_YAxis);
324 /*!Initialize Y Axis*/
325 VTKViewer_YAxis::VTKViewer_YAxis()
327 myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0;
328 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.;
329 myVectorText->SetText("Y");
330 vtkProperty* aProperty = vtkProperty::New();
331 aProperty->SetColor(0.0,1.0,0.0);
332 SetProperty(aProperty);
336 /*! \class VTKViewer_ZAxis
337 * \brief Z Axis actor
339 class VTKViewer_ZAxis : public VTKViewer_Axis
343 VTKViewer_ZAxis(const VTKViewer_ZAxis&);
345 vtkTypeMacro(VTKViewer_ZAxis,VTKViewer_Axis);
346 static VTKViewer_ZAxis *New();
349 vtkStandardNewMacro(VTKViewer_ZAxis);
351 /*!Initialize Z Axis*/
352 VTKViewer_ZAxis::VTKViewer_ZAxis()
354 myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0;
355 myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0;
356 myVectorText->SetText("Z");
357 vtkProperty* aProperty = vtkProperty::New();
358 aProperty->SetColor(0.0,0.0,1.0);
359 SetProperty(aProperty);
363 vtkStandardNewMacro(VTKViewer_Trihedron);
368 VTKViewer_Trihedron::VTKViewer_Trihedron()
370 myPresent = vtkActorCollection::New();
371 myAxis[0] = VTKViewer_XAxis::New();
372 myAxis[1] = VTKViewer_YAxis::New();
373 myAxis[2] = VTKViewer_ZAxis::New();
374 static vtkFloatingPointType aSize = 100;
381 VTKViewer_Trihedron::~VTKViewer_Trihedron()
383 myPresent->RemoveAllItems();
385 for(int i = 0; i < 3; i++)
391 void VTKViewer_Trihedron::SetSize(vtkFloatingPointType theSize)
394 for(int i = 0; i < 3; i++)
395 myAxis[i]->SetSize(theSize);
398 /*! Set visibility of axes
400 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis)
402 for(int i = 0; i < 3; i++)
403 myAxis[i]->SetVisibility(theVis);
407 \return visibility of first axis
409 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility()
411 return myAxis[0]->GetVisibility();
414 /*! Add to render all Axis
415 * \param theRenderer - vtkRenderer pointer
417 void VTKViewer_Trihedron::AddToRender(vtkRenderer* theRenderer)
419 vtkCamera* aCamera = theRenderer->GetActiveCamera();
420 for(int i = 0; i < 3; i++){
421 myAxis[i]->AddToRender(theRenderer);
422 myAxis[i]->SetCamera(aCamera);
426 /*! Remove all actors from \a theRenderer which are in myPresent.
427 * \param theRenderer - vtkRenderer pointer
429 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer)
431 myPresent->InitTraversal();
432 while(vtkActor* anActor = myPresent->GetNextActor())
433 theRenderer->RemoveActor(anActor);
434 for(int i = 0; i < 3; i++)
435 myAxis[i]->RemoveFromRender(theRenderer);
438 /*! Return count of visible actors.
439 * \param theRenderer - vtkRenderer pointer
441 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
443 //TVisibility aVis = GetVisibility();
444 //SetVisibility(eOff);
445 vtkActorCollection* aCollection = theRenderer->GetActors();
446 aCollection->InitTraversal();
448 while(vtkActor* prop = aCollection->GetNextActor()) {
449 if( prop->GetVisibility())
450 if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop)) {
451 if(!anActor->IsInfinitive())
454 else if ( !OwnActor( anActor ) ) {
457 //int aCount = theRenderer->VisibleActorCount();
458 //SetVisibility(aVis);
463 /*! Check if actor belongs to the axis object
464 * \param theActor - vtkActor pointer
465 * \retval Return true if the actor belongs to the axis object
467 bool VTKViewer_Trihedron::OwnActor(const vtkActor* theActor)
469 myPresent->InitTraversal();
470 while(vtkActor* anActor = myPresent->GetNextActor()) {
471 if ( anActor == theActor ) return true;
473 for(int i = 0; i < 3; i++) {
474 if ( myAxis[i]->OwnActor(theActor) ) return true;