1 // Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/
19 #include "VTKViewer_Trihedron.h"
20 #include "VTKViewer_Actor.h"
24 #include <vtkMapper.h>
25 #include <vtkDataSet.h>
26 #include <vtkRenderer.h>
27 #include <vtkRenderWindow.h>
28 #include <vtkObjectFactory.h>
31 #include <vtkProperty.h>
32 #include <vtkLineSource.h>
33 #include <vtkConeSource.h>
34 #include <vtkPolyDataMapper.h>
36 #include "VTKViewer_VectorText.h"
38 vtkStandardNewMacro(VTKViewer_UnScaledActor);
41 VTKViewer_UnScaledActor::VTKViewer_UnScaledActor()
43 Bounds[0] = Bounds[2] = Bounds[4] = VTK_LARGE_FLOAT;
44 Bounds[1] = Bounds[3] = Bounds[5] = -VTK_LARGE_FLOAT;
48 VTKViewer_UnScaledActor
54 /*! Sets \a mySize= \a theSize variable.
55 * \param theSize - integer size
57 void VTKViewer_UnScaledActor::SetSize(int theSize)
62 /*!This causes the actor to be rendered.
63 * Set new scale for actor.
65 void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer)
68 float P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}};
69 theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]);
70 theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]);
71 float aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+
72 (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+
73 (P[1][2]-P[0][2])*(P[1][2]-P[0][2]));
74 int* aSize = theRenderer->GetRenderWindow()->GetSize();
75 float aWinDiag = sqrt(float(aSize[0]*aSize[0]+aSize[1]*aSize[1]));
76 vtkDataSet* aDataSet = GetMapper()->GetInput();
77 float aLength = aDataSet->GetLength();
78 float aPrecision = 1.0E-3;
79 float anOldScale = GetScale()[0];
80 float aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(float(aSize[0])/float(aSize[1]));
81 if(fabs(aScale - anOldScale)/aScale > aPrecision){
85 vtkFollower::Render(theRenderer);
88 vtkStandardNewMacro(VTKViewer_LineActor);
90 vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor);
91 vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor);
93 /*!Adds Label and Arrow actors to \a theRenderer.*/
94 void VTKViewer_LineActor::Render(vtkRenderer *theRenderer)
96 if(LabelActor && LabelActor->GetVisibility()){
97 LabelActor->Modified();
98 LabelActor->Render(theRenderer);
100 if(ArrowActor && ArrowActor->GetVisibility()){
101 ArrowActor->Modified();
102 ArrowActor->Render(theRenderer);
104 vtkFollower::Render(theRenderer);
107 VTKViewer_Axis::VTKViewer_Axis()
109 /*! \li Initialize the Line pipe-line representation*/
110 myLineSource = vtkLineSource::New();
111 myLineSource->SetPoint1(0.0,0.0,0.0);
113 myMapper[0] = vtkPolyDataMapper::New();
114 myMapper[0]->SetInput(myLineSource->GetOutput());
116 myLineActor = VTKViewer_LineActor::New();
117 myLineActor->SetMapper(myMapper[0]);
118 myLineActor->PickableOff();
120 /*! \li Initialize the Arrow pipe-line representation*/
121 myConeSource = vtkConeSource::New();
122 myConeSource->SetResolution(2);
123 myConeSource->SetAngle(10);
125 myMapper[1] = vtkPolyDataMapper::New();
126 myMapper[1]->SetInput(myConeSource->GetOutput());
128 myArrowActor = VTKViewer_UnScaledActor::New();
129 myArrowActor->SetMapper(myMapper[1]);
130 static int aArrowActorSize = 24;
131 myArrowActor->SetSize(aArrowActorSize);
132 myArrowActor->PickableOff();
134 myLineActor->SetArrowActor(myArrowActor);
136 /*! \li Initialize the Label pipe-line representation */
137 myVectorText = VTKViewer_VectorText::New();
139 myMapper[2] = vtkPolyDataMapper::New();
140 myMapper[2]->SetInput(myVectorText->GetOutput());
142 myLabelActor = VTKViewer_UnScaledActor::New();
143 myLabelActor->SetMapper(myMapper[2]);
144 static int aLabelActorSize = 12;
145 myLabelActor->SetSize(aLabelActorSize);
146 myLabelActor->PickableOff();
147 //myLabelActor->DebugOn();
149 myLineActor->SetLabelActor(myLabelActor);
151 /*! \li Initialise visibility param.*/
152 myVisibility = VTKViewer_Trihedron::eOn;
155 VTKViewer_Axis::~VTKViewer_Axis()
157 /*! \li Destroy of the Label pipe-line representation */
158 myLabelActor->Delete();
160 myMapper[0]->RemoveAllInputs();
161 myMapper[0]->Delete();
163 myVectorText->Delete();
165 /*! \li Destroy of the Arrow pipe-line representation */
166 myArrowActor->Delete();
168 myMapper[1]->RemoveAllInputs();
169 myMapper[1]->Delete();
171 myConeSource->Delete();
173 /*! \li Destroy of the Line pipe-line representation */
174 myLineActor->Delete();
176 myMapper[2]->RemoveAllInputs();
177 myMapper[2]->Delete();
179 myLineSource->Delete();
182 void VTKViewer_Axis::AddToRender(vtkRenderer* theRenderer){
183 /*! \li Order of the calls are important*/
184 theRenderer->AddActor(myLineActor);
185 theRenderer->AddActor(myLabelActor);
186 theRenderer->AddActor(myArrowActor);
189 void VTKViewer_Axis::RemoveFromRender(vtkRenderer* theRenderer){
190 /*! \li Order of the calls are important*/
191 theRenderer->RemoveActor(myLineActor);
192 theRenderer->RemoveActor(myLabelActor);
193 theRenderer->RemoveActor(myArrowActor);
196 void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis)
199 case VTKViewer_Trihedron::eOff:
200 case VTKViewer_Trihedron::eOn:
201 myLabelActor->SetVisibility(theVis);
202 myArrowActor->SetVisibility(theVis);
203 myLineActor->SetVisibility(theVis);
205 case VTKViewer_Trihedron::eOnlyLineOn:
206 myLabelActor->VisibilityOff();
207 myArrowActor->VisibilityOff();
208 myLineActor->VisibilityOn();
213 myVisibility = theVis;
216 //****************************************************************
217 void VTKViewer_Axis::SetCamera(vtkCamera* theCamera){
218 myLabelActor->SetCamera(theCamera);
221 void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){
222 myLabelActor->SetProperty(theProperty);
223 myArrowActor->SetProperty(theProperty);
224 myLineActor->SetProperty(theProperty);
227 void VTKViewer_Axis::SetSize(float theSize)
229 float aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize};
230 myLineSource->SetPoint2(aPosition);
232 myArrowActor->SetPosition(0.0,0.0,0.0);
233 myArrowActor->AddPosition(aPosition);
234 myArrowActor->SetOrientation(myRot);
236 myLabelActor->SetPosition(0.0,0.0,0.0);
237 myLabelActor->AddPosition(aPosition);
240 /*! \class VTKViewer_XAxis
241 * \brief X Axis actor
243 class VTKViewer_XAxis : public VTKViewer_Axis
247 VTKViewer_XAxis(const VTKViewer_XAxis&);
249 vtkTypeMacro(VTKViewer_XAxis,VTKViewer_Axis);
250 static VTKViewer_XAxis *New();
253 vtkStandardNewMacro(VTKViewer_XAxis);
255 /*!Initialize X Axis*/
256 VTKViewer_XAxis::VTKViewer_XAxis(){
257 myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0;
258 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0;
259 myVectorText->SetText("X");
260 vtkProperty* aProperty = vtkProperty::New();
261 aProperty->SetColor(1.0,0.0,0.0);
262 SetProperty(aProperty);
266 /*! \class VTKViewer_YAxis
267 * \brief Y Axis actor
269 class VTKViewer_YAxis : public VTKViewer_Axis{
272 VTKViewer_YAxis(const VTKViewer_YAxis&);
274 vtkTypeMacro(VTKViewer_YAxis,VTKViewer_Axis);
275 static VTKViewer_YAxis *New();
278 vtkStandardNewMacro(VTKViewer_YAxis);
280 /*!Initialize Y Axis*/
281 VTKViewer_YAxis::VTKViewer_YAxis()
283 myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0;
284 myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.;
285 myVectorText->SetText("Y");
286 vtkProperty* aProperty = vtkProperty::New();
287 aProperty->SetColor(0.0,1.0,0.0);
288 SetProperty(aProperty);
292 /*! \class VTKViewer_ZAxis
293 * \brief Z Axis actor
295 class VTKViewer_ZAxis : public VTKViewer_Axis
299 VTKViewer_ZAxis(const VTKViewer_ZAxis&);
301 vtkTypeMacro(VTKViewer_ZAxis,VTKViewer_Axis);
302 static VTKViewer_ZAxis *New();
305 vtkStandardNewMacro(VTKViewer_ZAxis);
307 /*!Initialize Z Axis*/
308 VTKViewer_ZAxis::VTKViewer_ZAxis()
310 myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0;
311 myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0;
312 myVectorText->SetText("Z");
313 vtkProperty* aProperty = vtkProperty::New();
314 aProperty->SetColor(0.0,0.0,1.0);
315 SetProperty(aProperty);
319 vtkStandardNewMacro(VTKViewer_Trihedron);
321 VTKViewer_Trihedron::VTKViewer_Trihedron()
323 myPresent = vtkActorCollection::New();
324 myAxis[0] = VTKViewer_XAxis::New();
325 myAxis[1] = VTKViewer_YAxis::New();
326 myAxis[2] = VTKViewer_ZAxis::New();
327 static float aSize = 100;
331 VTKViewer_Trihedron::~VTKViewer_Trihedron()
333 myPresent->RemoveAllItems();
335 for(int i = 0; i < 3; i++)
339 void VTKViewer_Trihedron::SetSize(float theSize)
342 for(int i = 0; i < 3; i++)
343 myAxis[i]->SetSize(theSize);
346 void VTKViewer_Trihedron::SetVisibility(TVisibility theVis)
348 for(int i = 0; i < 3; i++)
349 myAxis[i]->SetVisibility(theVis);
352 VTKViewer_Trihedron::TVisibility VTKViewer_Trihedron::GetVisibility()
354 return myAxis[0]->GetVisibility();
357 void VTKViewer_Trihedron::AddToRender(vtkRenderer* theRenderer)
359 vtkCamera* aCamera = theRenderer->GetActiveCamera();
360 for(int i = 0; i < 3; i++){
361 myAxis[i]->AddToRender(theRenderer);
362 myAxis[i]->SetCamera(aCamera);
366 void VTKViewer_Trihedron::RemoveFromRender(vtkRenderer* theRenderer)
368 myPresent->InitTraversal();
369 while(vtkActor* anActor = myPresent->GetNextActor())
370 theRenderer->RemoveActor(anActor);
371 for(int i = 0; i < 3; i++)
372 myAxis[i]->RemoveFromRender(theRenderer);
375 int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer)
377 //TVisibility aVis = GetVisibility();
378 //SetVisibility(eOff);
379 vtkActorCollection* aCollection = theRenderer->GetActors();
380 aCollection->InitTraversal();
382 while(vtkActor* prop = aCollection->GetNextActor()) {
383 if( prop->GetVisibility())
384 if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop))
385 if(!anActor->IsInfinitive())
387 //int aCount = theRenderer->VisibleActorCount();
388 //SetVisibility(aVis);